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