FX Bool considered harmful, part 3
[pdfium.git] / fpdfsdk / include / fsdk_mgr.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 FPDFSDK_INCLUDE_FSDK_MGR_H_
8 #define FPDFSDK_INCLUDE_FSDK_MGR_H_
9
10 #include <map>
11
12 #include "../../core/include/fpdftext/fpdf_text.h"
13 #include "../../public/fpdf_formfill.h"
14 #include "../../public/fpdf_fwlevent.h" // cross platform keycode and events define.
15 #include "fsdk_common.h"
16 #include "fsdk_define.h"
17 #include "fx_systemhandler.h"
18 #include "fsdk_baseannot.h"
19 #include "fsdk_baseform.h"
20 #include "fsdk_annothandler.h"
21 #include "fsdk_actionhandler.h"
22 #include "javascript/IJavaScript.h"
23
24 class CFFL_IFormFiller;
25 class CJS_RuntimeFactory;
26 class CPDFSDK_ActionHandler;
27 class CPDFSDK_Annot;
28 class CPDFSDK_Document;
29 class CPDFSDK_InterForm;
30 class CPDFSDK_PageView;
31 class CPDFSDK_Widget;
32 class IFX_SystemHandler;
33
34 class CPDFDoc_Environment final
35 {
36 public:
37     CPDFDoc_Environment(CPDF_Document* pDoc, FPDF_FORMFILLINFO* pFFinfo);
38     ~CPDFDoc_Environment();
39
40     void FFI_Invalidate(FPDF_PAGE page, double left, double top, double right, double bottom)
41     {
42         if (m_pInfo && m_pInfo->FFI_Invalidate)
43             m_pInfo->FFI_Invalidate(m_pInfo, page, left, top, right, bottom);
44     }
45
46     void FFI_OutputSelectedRect(FPDF_PAGE page, double left, double top, double right, double bottom)
47     {
48         if (m_pInfo && m_pInfo->FFI_OutputSelectedRect)
49             m_pInfo->FFI_OutputSelectedRect(m_pInfo, page, left, top, right, bottom);
50     }
51
52     void FFI_SetCursor(int nCursorType)
53     {
54         if (m_pInfo && m_pInfo->FFI_SetCursor)
55             m_pInfo->FFI_SetCursor(m_pInfo, nCursorType);
56     }
57
58     int  FFI_SetTimer(int uElapse, TimerCallback lpTimerFunc)
59     {
60         if (m_pInfo && m_pInfo->FFI_SetTimer)
61             return m_pInfo->FFI_SetTimer(m_pInfo, uElapse, lpTimerFunc);
62         return -1;
63     }
64
65     void FFI_KillTimer(int nTimerID)
66     {
67         if (m_pInfo && m_pInfo->FFI_KillTimer)
68             m_pInfo->FFI_KillTimer(m_pInfo, nTimerID);
69     }
70
71     FX_SYSTEMTIME FFI_GetLocalTime() const
72     {
73         FX_SYSTEMTIME fxtime;
74         if (m_pInfo && m_pInfo->FFI_GetLocalTime)
75         {
76             FPDF_SYSTEMTIME systime = m_pInfo->FFI_GetLocalTime(m_pInfo);
77             fxtime.wDay = systime.wDay;
78             fxtime.wDayOfWeek = systime.wDayOfWeek;
79             fxtime.wHour = systime.wHour;
80             fxtime.wMilliseconds = systime.wMilliseconds;
81             fxtime.wMinute = systime.wMinute;
82             fxtime.wMonth = systime.wMonth;
83             fxtime.wSecond = systime.wSecond;
84             fxtime.wYear = systime.wYear;
85         }
86         return fxtime;
87     }
88
89     void FFI_OnChange()
90     {
91         if (m_pInfo && m_pInfo->FFI_OnChange)
92             m_pInfo->FFI_OnChange(m_pInfo);
93     }
94
95     bool FFI_IsSHIFTKeyDown(FX_DWORD nFlag) const
96     {
97         return (nFlag & FWL_EVENTFLAG_ShiftKey) != 0;
98     }
99
100     bool FFI_IsCTRLKeyDown(FX_DWORD nFlag) const
101     {
102         return (nFlag & FWL_EVENTFLAG_ControlKey) != 0;
103     }
104
105     bool FFI_IsALTKeyDown(FX_DWORD nFlag) const
106     {
107         return (nFlag & FWL_EVENTFLAG_AltKey) != 0;
108     }
109
110     bool FFI_IsINSERTKeyDown(FX_DWORD nFlag) const
111     {
112         return false;
113     }
114
115     int JS_appAlert(const FX_WCHAR* Msg, const FX_WCHAR* Title, FX_UINT Type, FX_UINT Icon);
116     int JS_appResponse(const FX_WCHAR* Question, const FX_WCHAR* Title, const FX_WCHAR* Default,
117                        const FX_WCHAR* cLabel, FPDF_BOOL bPassword, void* response, int length);
118
119     void JS_appBeep(int nType)
120     {
121         if (m_pInfo && m_pInfo->m_pJsPlatform && m_pInfo->m_pJsPlatform->app_beep)
122             m_pInfo->m_pJsPlatform->app_beep(m_pInfo->m_pJsPlatform, nType);
123     }
124
125     CFX_WideString JS_fieldBrowse();
126     CFX_WideString JS_docGetFilePath();
127
128     void JS_docSubmitForm(void* formData, int length, const FX_WCHAR* URL);
129     void JS_docmailForm(void* mailData, int length, FPDF_BOOL bUI,
130                         const FX_WCHAR* To, const FX_WCHAR* Subject,
131                         const FX_WCHAR* CC, const FX_WCHAR* BCC,
132                         const FX_WCHAR* Msg);
133
134     void JS_docprint(FPDF_BOOL bUI, int nStart, int nEnd, FPDF_BOOL bSilent,
135                      FPDF_BOOL bShrinkToFit, FPDF_BOOL bPrintAsImage,
136                      FPDF_BOOL bReverse ,FPDF_BOOL bAnnotations)
137     {
138         if (m_pInfo && m_pInfo->m_pJsPlatform && m_pInfo->m_pJsPlatform->Doc_print)
139             m_pInfo->m_pJsPlatform->Doc_print(
140                 m_pInfo->m_pJsPlatform, bUI, nStart, nEnd, bSilent, bShrinkToFit,
141                 bPrintAsImage, bReverse, bAnnotations);
142     }
143
144     void JS_docgotoPage(int nPageNum)
145     {
146         if (m_pInfo && m_pInfo->m_pJsPlatform && m_pInfo->m_pJsPlatform->Doc_gotoPage)
147             m_pInfo->m_pJsPlatform->Doc_gotoPage(m_pInfo->m_pJsPlatform, nPageNum);
148     }
149
150     FPDF_PAGE FFI_GetPage(FPDF_DOCUMENT document, int nPageIndex)
151     {
152         if (m_pInfo && m_pInfo->FFI_GetPage)
153             return m_pInfo->FFI_GetPage(m_pInfo, document, nPageIndex);
154         return NULL;
155     }
156
157     FPDF_PAGE FFI_GetCurrentPage(FPDF_DOCUMENT document)
158     {
159         if (m_pInfo && m_pInfo->FFI_GetCurrentPage)
160             return m_pInfo->FFI_GetCurrentPage(m_pInfo, document);
161         return NULL;
162     }
163
164     int FFI_GetRotation(FPDF_PAGE page)
165     {
166         if (m_pInfo && m_pInfo->FFI_GetRotation)
167             return m_pInfo->FFI_GetRotation(m_pInfo, page);
168         return 0;
169     }
170
171     void FFI_ExecuteNamedAction(const FX_CHAR* namedAction)
172     {
173         if (m_pInfo && m_pInfo->FFI_ExecuteNamedAction)
174             m_pInfo->FFI_ExecuteNamedAction(m_pInfo, namedAction);
175     }
176
177     void FFI_OnSetFieldInputFocus(void* field,FPDF_WIDESTRING focusText, FPDF_DWORD nTextLen, bool bFocus)
178     {
179         if (m_pInfo && m_pInfo->FFI_SetTextFieldFocus)
180             m_pInfo->FFI_SetTextFieldFocus(m_pInfo, focusText, nTextLen, bFocus);
181     }
182
183     void FFI_DoURIAction(const FX_CHAR* bsURI)
184     {
185         if (m_pInfo && m_pInfo->FFI_DoURIAction)
186             m_pInfo->FFI_DoURIAction(m_pInfo, bsURI);
187     }
188
189     void FFI_DoGoToAction(int nPageIndex, int zoomMode, float* fPosArray, int sizeOfArray)
190     {
191         if (m_pInfo && m_pInfo->FFI_DoGoToAction)
192             m_pInfo->FFI_DoGoToAction(m_pInfo, nPageIndex, zoomMode, fPosArray, sizeOfArray);
193     }
194
195     bool IsJSInitiated() const { return m_pInfo && m_pInfo->m_pJsPlatform; }
196     void SetSDKDocument(CPDFSDK_Document* pFXDoc) { m_pSDKDoc = pFXDoc; }
197     CPDFSDK_Document* GetSDKDocument() const { return m_pSDKDoc; }
198     CPDF_Document* GetPDFDocument() const { return m_pPDFDoc; }
199     CFX_ByteString GetAppName() const { return ""; }
200     IFX_SystemHandler* GetSysHandler() const { return m_pSysHandler; }
201     FPDF_FORMFILLINFO* GetFormFillInfo() const { return m_pInfo;}
202     CJS_RuntimeFactory* GetRuntimeFactory() const { return m_pJSRuntimeFactory; }
203
204     CFFL_IFormFiller* GetIFormFiller();             // Creates if not present.
205     CPDFSDK_AnnotHandlerMgr* GetAnnotHandlerMgr();  // Creates if not present.
206     IFXJS_Runtime*  GetJSRuntime();                 // Creates if not present.
207     CPDFSDK_ActionHandler* GetActionHander();       // Creates if not present.
208
209 private:
210     CPDFSDK_AnnotHandlerMgr* m_pAnnotHandlerMgr;
211     CPDFSDK_ActionHandler* m_pActionHandler;
212     IFXJS_Runtime* m_pJSRuntime;
213     FPDF_FORMFILLINFO* const m_pInfo;
214     CPDFSDK_Document* m_pSDKDoc;
215     CPDF_Document* const m_pPDFDoc;
216     CFFL_IFormFiller* m_pIFormFiller;
217     IFX_SystemHandler* m_pSysHandler;
218     CJS_RuntimeFactory* m_pJSRuntimeFactory;
219 };
220
221 class CPDFSDK_Document
222 {
223 public:
224     CPDFSDK_Document(CPDF_Document* pDoc, CPDFDoc_Environment* pEnv);
225     ~CPDFSDK_Document();
226
227     CPDFSDK_InterForm*      GetInterForm() ;
228     CPDF_Document*          GetDocument() {return m_pDoc;}
229
230     CPDFSDK_PageView*       GetPageView(CPDF_Page* pPDFPage, bool ReNew = true);
231     CPDFSDK_PageView*       GetPageView(int nIndex);
232     CPDFSDK_PageView*       GetCurrentView();
233     void                    ReMovePageView(CPDF_Page* pPDFPage);
234     void                    UpdateAllViews(CPDFSDK_PageView* pSender, CPDFSDK_Annot* pAnnot);
235
236     CPDFSDK_Annot*          GetFocusAnnot();
237
238     IFXJS_Runtime *         GetJsRuntime();
239
240     bool                 SetFocusAnnot(CPDFSDK_Annot* pAnnot, FX_UINT nFlag = 0);
241     bool                 KillFocusAnnot(FX_UINT nFlag = 0);
242
243     bool                 ExtractPages(const CFX_WordArray &arrExtraPages, CPDF_Document* pDstDoc);
244     bool                 InsertPages(int nInsertAt, const CPDF_Document* pSrcDoc, const CFX_WordArray &arrSrcPages);
245     bool                 ReplacePages(int nPage, const CPDF_Document* pSrcDoc, const CFX_WordArray &arrSrcPages);
246
247     void                    OnCloseDocument();
248
249     int                     GetPageCount() {return m_pDoc->GetPageCount();}
250     bool                 GetPermissions(int nFlag);
251     bool                 GetChangeMark() {return m_bChangeMask;}
252     void                    SetChangeMark() {m_bChangeMask = true;}
253     void                    ClearChangeMark() {m_bChangeMask= false;}
254     CFX_WideString          GetPath() ;
255     CPDF_Page*              GetPage(int nIndex);
256     CPDFDoc_Environment *   GetEnv() {return m_pEnv; }
257     void                    ProcJavascriptFun();
258     bool                 ProcOpenAction();
259     CPDF_OCContext*         GetOCContext();
260 private:
261     std::map<CPDF_Page*, CPDFSDK_PageView*> m_pageMap;
262     CPDF_Document* m_pDoc;
263     CPDFSDK_InterForm* m_pInterForm;
264     CPDFSDK_Annot* m_pFocusAnnot;
265     CPDFDoc_Environment* m_pEnv;
266     CPDF_OCContext* m_pOccontent;
267     bool m_bChangeMask;
268 };
269 class CPDFSDK_PageView final
270 {
271 public:
272     CPDFSDK_PageView(CPDFSDK_Document* pSDKDoc,CPDF_Page* page);
273     ~CPDFSDK_PageView();
274     void PageView_OnDraw(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,CPDF_RenderOptions* pOptions) ;
275     CPDF_Annot*                     GetPDFAnnotAtPoint(FX_FLOAT pageX, FX_FLOAT pageY);
276     CPDFSDK_Annot*                  GetFXAnnotAtPoint(FX_FLOAT pageX, FX_FLOAT pageY);
277     CPDF_Annot*                     GetPDFWidgetAtPoint(FX_FLOAT pageX, FX_FLOAT pageY);
278     CPDFSDK_Annot*                  GetFXWidgetAtPoint(FX_FLOAT pageX, FX_FLOAT pageY);
279     CPDFSDK_Annot*                  GetFocusAnnot() ;
280     void                            SetFocusAnnot(CPDFSDK_Annot* pSDKAnnot,FX_UINT nFlag = 0) {m_pSDKDoc->SetFocusAnnot(pSDKAnnot, nFlag);}
281     bool                         KillFocusAnnot(FX_UINT nFlag = 0) {return m_pSDKDoc->KillFocusAnnot(nFlag);}
282     bool                         Annot_HasAppearance(CPDF_Annot* pAnnot);
283
284     CPDFSDK_Annot*                  AddAnnot(CPDF_Dictionary * pDict);
285     CPDFSDK_Annot*                  AddAnnot(const FX_CHAR* lpSubType,CPDF_Dictionary * pDict);
286     CPDFSDK_Annot*                  AddAnnot(CPDF_Annot * pPDFAnnot);
287         bool                     DeleteAnnot(CPDFSDK_Annot* pAnnot);
288     int                             CountAnnots();
289     CPDFSDK_Annot*                  GetAnnot(int nIndex);
290     CPDFSDK_Annot*                  GetAnnotByDict(CPDF_Dictionary * pDict);
291     CPDF_Page*                      GetPDFPage(){return m_page;}
292     CPDF_Document*                  GetPDFDocument();
293     CPDFSDK_Document*               GetSDKDocument() {return m_pSDKDoc;}
294     bool                 OnLButtonDown(const CPDF_Point & point, FX_UINT nFlag);
295     bool                 OnLButtonUp(const CPDF_Point & point, FX_UINT nFlag);
296     bool                 OnChar(int nChar, FX_UINT nFlag);
297     bool                 OnKeyDown(int nKeyCode, int nFlag);
298     bool                 OnKeyUp(int nKeyCode, int nFlag);
299
300     bool                 OnMouseMove(const CPDF_Point & point, int nFlag);
301     bool                 OnMouseWheel(double deltaX, double deltaY,const CPDF_Point& point, int nFlag);
302     bool                 IsValidAnnot(void* p);
303     void                    GetCurrentMatrix(CPDF_Matrix& matrix) {matrix = m_curMatrix;}
304     void                    UpdateRects(CFX_RectArray& rects);
305     void                            UpdateView(CPDFSDK_Annot* pAnnot);
306     CFX_PtrArray*                   GetAnnotList(){ return &m_fxAnnotArray; }
307
308     int                     GetPageIndex();
309     void                            LoadFXAnnots();
310
311         void SetValid(bool bValid) {m_bValid = bValid;}
312         bool IsValid() {return m_bValid;}
313         void SetLock(bool bLocked) {m_bLocked= bLocked;}
314         bool IsLocked() {return m_bLocked;}
315         void TakeOverPage() {m_bTakeOverPage = true;}
316 private:
317     void PageView_OnHighlightFormFields(CFX_RenderDevice* pDevice, CPDFSDK_Widget* pWidget);
318         CPDF_Matrix m_curMatrix;
319     CPDF_Page* m_page;
320     CPDF_AnnotList* m_pAnnotList;
321     //CPDFSDK_Annot* m_pFocusAnnot;
322     CFX_PtrArray  m_fxAnnotArray;
323     CPDFSDK_Document* m_pSDKDoc;
324     CPDFSDK_Widget* m_CaptureWidget;
325     bool m_bEnterWidget;
326     bool m_bExitWidget;
327     bool m_bOnWidget;
328     bool m_bValid;
329         bool m_bLocked;
330         bool m_bTakeOverPage;
331 };
332
333
334 template<class TYPE>
335 class CGW_ArrayTemplate : public CFX_ArrayTemplate<TYPE>
336 {
337 public:
338     CGW_ArrayTemplate(){}
339     virtual ~CGW_ArrayTemplate(){}
340
341     typedef int (*LP_COMPARE)(TYPE p1, TYPE p2);
342
343     void Sort(LP_COMPARE pCompare, bool bAscent = true)
344     {
345         int nSize = this->GetSize();
346         QuickSort(0, nSize -1, bAscent, pCompare);
347     }
348
349 private:
350     void QuickSort(FX_UINT nStartPos, FX_UINT nStopPos, bool bAscend, LP_COMPARE pCompare)
351     {
352         if (nStartPos >= nStopPos) return;
353
354         if ((nStopPos - nStartPos) == 1)
355         {
356             TYPE Value1 = this->GetAt(nStartPos);
357             TYPE Value2 = this->GetAt(nStopPos);
358
359             int iGreate = (*pCompare)(Value1, Value2);
360             if ((bAscend && iGreate > 0) || (!bAscend && iGreate < 0))
361             {
362                 this->SetAt(nStartPos, Value2);
363                 this->SetAt(nStopPos, Value1);
364             }
365             return;
366         }
367
368         FX_UINT m = nStartPos + (nStopPos - nStartPos) / 2;
369         FX_UINT i = nStartPos;
370
371         TYPE Value = this->GetAt(m);
372
373         while (i < m)
374         {
375             TYPE temp = this->GetAt(i);
376
377             int iGreate = (*pCompare)(temp, Value);
378             if ((bAscend && iGreate > 0) || (!bAscend && iGreate < 0))
379             {
380                 this->InsertAt(m+1, temp);
381                 this->RemoveAt(i);
382                 m--;
383             }
384             else
385             {
386                 i++;
387             }
388         }
389
390         FX_UINT j = nStopPos;
391
392         while (j > m)
393         {
394             TYPE temp = this->GetAt(j);
395
396             int iGreate = (*pCompare)(temp, Value);
397             if ((bAscend && iGreate < 0) || (!bAscend && iGreate > 0))
398             {
399                 this->RemoveAt(j);
400                 this->InsertAt(m, temp);
401                 m++;
402             }
403             else
404             {
405                 j--;
406             }
407         }
408
409         if (nStartPos < m) QuickSort(nStartPos, m, bAscend, pCompare);
410         if (nStopPos > m) QuickSort(m, nStopPos, bAscend, pCompare);
411     }
412 };
413
414 #endif  // FPDFSDK_INCLUDE_FSDK_MGR_H_