1// Copyright 2014 PDFium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6
7#ifndef _FSDK_ANNOTHANDLER_H_
8#define _FSDK_ANNOTHANDLER_H_
9
10
11class CPDFDoc_Environment;
12class CFFL_IFormFiller;
13class CPDFSDK_PageView;
14class IPDFSDK_AnnotHandler
15{
16
17public:
18	virtual ~IPDFSDK_AnnotHandler() {};
19
20	virtual CFX_ByteString		GetType() = 0;
21
22	virtual CFX_ByteString		GetName() = 0;
23
24	virtual FX_BOOL				CanAnswer(CPDFSDK_Annot* pAnnot) = 0;
25
26
27	virtual CPDFSDK_Annot*		NewAnnot(CPDF_Annot* pAnnot, CPDFSDK_PageView* pPage) = 0;
28
29	virtual void				ReleaseAnnot(CPDFSDK_Annot* pAnnot) = 0;
30
31	virtual void				DeleteAnnot(CPDFSDK_Annot* pAnnot) = 0;
32
33
34	virtual CPDF_Rect				GetViewBBox(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot) = 0;
35
36	virtual FX_BOOL				HitTest(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, const CPDF_Point& point) = 0;
37
38
39	virtual void				OnDraw(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot,
40		CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,
41		FX_DWORD dwFlags) = 0;
42
43	virtual void				OnDrawSleep(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot,
44		CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,
45		const CPDF_Rect& rcWindow, FX_DWORD dwFlags) = 0;
46
47
48
49
50	virtual void				OnCreate(CPDFSDK_Annot* pAnnot) = 0;
51
52	virtual void				OnLoad(CPDFSDK_Annot* pAnnot) = 0;
53
54	virtual void				OnDelete(CPDFSDK_Annot* pAnnot) = 0;
55
56	virtual void				OnRelease(CPDFSDK_Annot* pAnnot) = 0;
57
58
59	virtual void				OnMouseEnter(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlag) = 0;
60	virtual void				OnMouseExit(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlag) = 0;
61
62
63	virtual FX_BOOL				OnLButtonDown(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point) = 0;
64	virtual FX_BOOL				OnLButtonUp(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point) = 0;
65	virtual FX_BOOL				OnLButtonDblClk(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point) = 0;
66	virtual FX_BOOL				OnMouseMove(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point) = 0;
67	virtual FX_BOOL				OnMouseWheel(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, short zDelta, const CPDF_Point& point) = 0;
68	virtual FX_BOOL				OnRButtonDown(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point) = 0;
69	virtual FX_BOOL				OnRButtonUp(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point) = 0;
70	virtual FX_BOOL				OnRButtonDblClk(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point) = 0;
71//by wjm.
72	virtual FX_BOOL				OnChar(CPDFSDK_Annot* pAnnot, FX_DWORD nChar, FX_DWORD nFlags) = 0;
73	virtual FX_BOOL				OnKeyDown(CPDFSDK_Annot* pAnnot, int nKeyCode, int nFlag) = 0;
74	virtual FX_BOOL				OnKeyUp(CPDFSDK_Annot* pAnnot, int nKeyCode, int nFlag) =0 ;
75
76	virtual	void				OnDeSelected(CPDFSDK_Annot* pAnnot) = 0;
77	virtual	void				OnSelected(CPDFSDK_Annot* pAnnot) = 0;
78
79	virtual FX_BOOL				OnSetFocus(CPDFSDK_Annot* pAnnot, FX_DWORD nFlag) = 0;
80	virtual FX_BOOL				OnKillFocus(CPDFSDK_Annot* pAnnot, FX_DWORD nFlag) = 0;
81
82};
83
84
85class CPDFSDK_BFAnnotHandler:public IPDFSDK_AnnotHandler
86{
87public:
88	CPDFSDK_BFAnnotHandler(CPDFDoc_Environment*	pApp):m_pFormFiller(NULL),m_pApp(pApp) {}
89	virtual	~CPDFSDK_BFAnnotHandler() {}
90public:
91
92	virtual CFX_ByteString		GetType()  {return CFX_ByteString("Widget");}
93
94	virtual CFX_ByteString		GetName()  {return CFX_ByteString("WidgetHandler");}
95
96	virtual FX_BOOL				CanAnswer(CPDFSDK_Annot* pAnnot);
97
98	virtual CPDFSDK_Annot*		NewAnnot(CPDF_Annot* pAnnot, CPDFSDK_PageView* pPage);
99
100	virtual void				ReleaseAnnot(CPDFSDK_Annot* pAnnot)  ;
101
102	virtual void				DeleteAnnot(CPDFSDK_Annot* pAnnot) {}
103
104
105	virtual CPDF_Rect				GetViewBBox(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot) ;
106
107	virtual FX_BOOL				HitTest(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, const CPDF_Point& point);
108
109
110	virtual void				OnDraw(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot,
111		CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,
112		 FX_DWORD dwFlags) ;
113
114	virtual void				OnDrawSleep(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot,
115		CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,
116		const CPDF_Rect& rcWindow, FX_DWORD dwFlags) {}
117
118
119	virtual void				OnCreate(CPDFSDK_Annot* pAnnot) ;
120
121	virtual void				OnLoad(CPDFSDK_Annot* pAnnot) ;
122
123	virtual void				OnDelete(CPDFSDK_Annot* pAnnot) {}
124
125	virtual void				OnRelease(CPDFSDK_Annot* pAnnot) {}
126
127
128	virtual void				OnMouseEnter(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlag) ;
129	virtual void				OnMouseExit(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlag) ;
130
131
132	virtual FX_BOOL				OnLButtonDown(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point) ;
133	virtual FX_BOOL				OnLButtonUp(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point) ;
134	virtual FX_BOOL				OnLButtonDblClk(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point) ;
135	virtual FX_BOOL				OnMouseMove(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point) ;
136	virtual FX_BOOL				OnMouseWheel(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, short zDelta, const CPDF_Point& point) ;
137	virtual FX_BOOL				OnRButtonDown(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point) ;
138	virtual FX_BOOL				OnRButtonUp(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point) ;
139	virtual FX_BOOL				OnRButtonDblClk(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point) {return FALSE;}
140
141//by wjm.
142	virtual FX_BOOL				OnChar(CPDFSDK_Annot* pAnnot, FX_DWORD nChar, FX_DWORD nFlags);
143	virtual FX_BOOL				OnKeyDown(CPDFSDK_Annot* pAnnot, int nKeyCode, int nFlag);
144	virtual FX_BOOL				OnKeyUp(CPDFSDK_Annot* pAnnot, int nKeyCode, int nFlag);
145
146	virtual	void				OnDeSelected(CPDFSDK_Annot* pAnnot) {}
147	virtual	void				OnSelected(CPDFSDK_Annot* pAnnot) {}
148
149	virtual FX_BOOL				OnSetFocus(CPDFSDK_Annot* pAnnot, FX_DWORD nFlag);
150	virtual FX_BOOL				OnKillFocus(CPDFSDK_Annot* pAnnot, FX_DWORD nFlag);
151
152	void						SetFormFiller(CFFL_IFormFiller* pFiller){m_pFormFiller = pFiller;}
153	CFFL_IFormFiller*			GetFormFiller() {return m_pFormFiller;}
154private:
155
156	CPDFDoc_Environment*		m_pApp;
157	CFFL_IFormFiller*			m_pFormFiller;
158};
159
160#define CBA_AnnotHandlerArray CFX_ArrayTemplate<IPDFSDK_AnnotHandler*>
161class CPDFSDK_AnnotHandlerMgr
162{
163public:
164	// Destroy the handler
165	CPDFSDK_AnnotHandlerMgr(CPDFDoc_Environment* pApp);
166	virtual ~CPDFSDK_AnnotHandlerMgr() ;
167
168public:
169	void						RegisterAnnotHandler(IPDFSDK_AnnotHandler* pAnnotHandler);
170	void						UnRegisterAnnotHandler(IPDFSDK_AnnotHandler* pAnnotHandler);
171
172	virtual CPDFSDK_Annot*		NewAnnot(CPDF_Annot * pAnnot, CPDFSDK_PageView *pPageView);
173	virtual void				ReleaseAnnot(CPDFSDK_Annot * pAnnot);
174
175	virtual void				Annot_OnCreate(CPDFSDK_Annot* pAnnot);
176	virtual void				Annot_OnLoad(CPDFSDK_Annot* pAnnot);
177public:
178	IPDFSDK_AnnotHandler*		GetAnnotHandler(CPDFSDK_Annot* pAnnot) const;
179	virtual void				Annot_OnDraw(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot,
180		CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,FX_DWORD dwFlags);
181
182	virtual void				Annot_OnMouseEnter(CPDFSDK_PageView * pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags);
183	virtual void				Annot_OnMouseExit(CPDFSDK_PageView * pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags);
184
185	virtual FX_BOOL				Annot_OnLButtonDown(CPDFSDK_PageView * pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point);
186	virtual FX_BOOL				Annot_OnLButtonUp(CPDFSDK_PageView * pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point);
187	virtual FX_BOOL				Annot_OnLButtonDblClk(CPDFSDK_PageView * pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point);
188
189	virtual FX_BOOL				Annot_OnMouseMove(CPDFSDK_PageView * pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point);
190	virtual FX_BOOL				Annot_OnMouseWheel(CPDFSDK_PageView * pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, short zDelta, const CPDF_Point& point);
191	virtual FX_BOOL				Annot_OnRButtonDown(CPDFSDK_PageView * pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point);
192	virtual FX_BOOL				Annot_OnRButtonUp(CPDFSDK_PageView * pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point);
193
194
195	virtual FX_BOOL				Annot_OnChar(CPDFSDK_Annot* pAnnot, FX_DWORD nChar, FX_DWORD nFlags);
196	virtual FX_BOOL				Annot_OnKeyDown(CPDFSDK_Annot* pAnnot, int nKeyCode, int nFlag);
197	virtual FX_BOOL				Annot_OnKeyUp(CPDFSDK_Annot* pAnnot, int nKeyCode, int nFlag);
198
199	virtual FX_BOOL				Annot_OnSetFocus(CPDFSDK_Annot* pAnnot, FX_DWORD nFlag);
200	virtual FX_BOOL				Annot_OnKillFocus(CPDFSDK_Annot* pAnnot, FX_DWORD nFlag);
201
202	virtual CPDF_Rect			Annot_OnGetViewBBox(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot);
203	virtual FX_BOOL				Annot_OnHitTest(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, const CPDF_Point& point);
204
205private:
206	IPDFSDK_AnnotHandler*			GetAnnotHandler(const CFX_ByteString& sType) const;
207	CPDFSDK_Annot*				GetNextAnnot(CPDFSDK_Annot* pSDKAnnot,FX_BOOL bNext);
208private:
209	CBA_AnnotHandlerArray		m_Handlers;
210	CFX_MapByteStringToPtr		m_mapType2Handler;
211	CPDFDoc_Environment*		m_pApp;
212};
213
214//#define CBF_Page2Accessible	 CFX_MapPtrTemplate<CPDFSDK_PageView*, IAccessible*>
215
216typedef int (*AI_COMPARE) (CPDFSDK_Annot* p1, CPDFSDK_Annot* p2);
217
218class CPDFSDK_AnnotIterator
219{
220protected:
221	CPDFSDK_Annot*	NextAnnot (const CPDFSDK_Annot* pCurrent) ;
222	CPDFSDK_Annot*	PrevAnnot (const CPDFSDK_Annot* pCurrent) ;
223	CPDFSDK_Annot*	NextAnnot(int& index ) ;
224	CPDFSDK_Annot*	PrevAnnot(int& index ) ;
225public:
226    CPDFSDK_AnnotIterator(CPDFSDK_PageView * pPageView, FX_BOOL bReverse,
227		FX_BOOL bIgnoreTopmost=FALSE,FX_BOOL bCircle=FALSE,CFX_PtrArray* pList=NULL);
228	virtual CPDFSDK_Annot*	Next (const CPDFSDK_Annot* pCurrent) ;
229	virtual CPDFSDK_Annot*	Prev (const CPDFSDK_Annot* pCurrent) ;
230	virtual CPDFSDK_Annot*	Next(int& index ) ;
231	virtual CPDFSDK_Annot*	Prev(int& index ) ;
232	virtual int             Count(){return m_pIteratorAnnotList.GetSize();}
233
234	virtual FX_BOOL         InitIteratorAnnotList(CPDFSDK_PageView * pPageView,CFX_PtrArray* pList=NULL);
235
236	void					InsertSort(CFX_PtrArray &arrayList, AI_COMPARE pCompare);
237protected:
238	//	CFX_PtrList			 m_pIteratorAnnotList;
239	CFX_PtrArray	     m_pIteratorAnnotList;
240	FX_BOOL			     m_bReverse;
241	FX_BOOL              m_bIgnoreTopmost;
242	FX_BOOL              m_bCircle;
243};
244
245
246
247#endif
248
249