Enable C linkage in fpdfppo.h
[pdfium.git] / fpdfsdk / include / fsdk_annothandler.h
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
11 class CPDFDoc_Environment;
12 class CFFL_IFormFiller;
13 class CPDFSDK_PageView;
14 class IPDFSDK_AnnotHandler
15 {
16
17 public:
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
85 class CPDFSDK_BFAnnotHandler:public IPDFSDK_AnnotHandler
86 {
87 public:
88         CPDFSDK_BFAnnotHandler(CPDFDoc_Environment* pApp) : m_pApp(pApp), m_pFormFiller(NULL) {}
89         virtual ~CPDFSDK_BFAnnotHandler() {}
90 public:
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;}
154 private:
155
156         CPDFDoc_Environment*            m_pApp;
157         CFFL_IFormFiller*                       m_pFormFiller;
158 };
159
160 #define CBA_AnnotHandlerArray CFX_ArrayTemplate<IPDFSDK_AnnotHandler*>
161 class CPDFSDK_AnnotHandlerMgr
162 {
163 public:
164         // Destroy the handler
165         CPDFSDK_AnnotHandlerMgr(CPDFDoc_Environment* pApp);
166         virtual ~CPDFSDK_AnnotHandlerMgr() ;
167
168 public:
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);
177 public:
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
205 private:
206         IPDFSDK_AnnotHandler*                   GetAnnotHandler(const CFX_ByteString& sType) const;
207         CPDFSDK_Annot*                          GetNextAnnot(CPDFSDK_Annot* pSDKAnnot,FX_BOOL bNext);
208 private:
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
216 typedef int (*AI_COMPARE) (CPDFSDK_Annot* p1, CPDFSDK_Annot* p2);
217
218 class CPDFSDK_AnnotIterator
219 {
220 protected:
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 ) ;
225 public:
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);
237 protected:
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