Use override in more classes in core/
[pdfium.git] / core / include / fpdfdoc / fpdf_doc.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 CORE_INCLUDE_FPDFDOC_FPDF_DOC_H_
8 #define CORE_INCLUDE_FPDFDOC_FPDF_DOC_H_
9
10 #include <map>
11
12 #include "../../../third_party/base/nonstd_unique_ptr.h"
13 #include "../fpdfapi/fpdf_parser.h"
14 #include "../fpdfapi/fpdf_render.h"
15
16 class CFieldTree;
17 class CPDF_AAction;
18 class CPDF_Action;
19 class CPDF_ActionFields;
20 class CPDF_Annot;
21 class CPDF_AnnotList;
22 class CPDF_ApSettings;
23 class CPDF_Bookmark;
24 class CPDF_BookmarkTree;
25 class CPDF_DefaultAppearance;
26 class CPDF_Dest;
27 class CPDF_DocJSActions;
28 class CPDF_FileSpec;
29 class CPDF_FormControl;
30 class CPDF_FormField;
31 class CPDF_FormNotify;
32 class CPDF_IconFit;
33 class CPDF_InterForm;
34 class CPDF_Link;
35 class CPDF_LinkList;
36 class CPDF_LWinParam;
37 class CPDF_Metadata;
38 class CPDF_NumberTree;
39 class CPDF_OCContext;
40 class CPDF_Page;
41 class CPDF_RenderOptions;
42 class CPDF_TextObject;
43 class CPDF_ViewerPreferences;
44 class CXML_Element;
45
46 class CPDF_NameTree {
47  public:
48   CPDF_NameTree(CPDF_Dictionary* pRoot) { m_pRoot = pRoot; }
49
50   CPDF_NameTree(CPDF_Document* pDoc, const CFX_ByteStringC& category);
51
52   CPDF_Object* LookupValue(int nIndex, CFX_ByteString& csName) const;
53
54   CPDF_Object* LookupValue(const CFX_ByteString& csName) const;
55
56   CPDF_Array* LookupNamedDest(CPDF_Document* pDoc,
57                               const CFX_ByteStringC& sName);
58
59   int GetIndex(const CFX_ByteString& csName) const;
60
61   int GetCount() const;
62
63   CPDF_Dictionary* GetRoot() const { return m_pRoot; }
64
65  protected:
66   CPDF_Dictionary* m_pRoot;
67 };
68 class CPDF_BookmarkTree {
69  public:
70   CPDF_BookmarkTree(CPDF_Document* pDoc) : m_pDocument(pDoc) {}
71
72   CPDF_Bookmark GetFirstChild(const CPDF_Bookmark& parent) const;
73
74   CPDF_Bookmark GetNextSibling(const CPDF_Bookmark& bookmark) const;
75
76   CPDF_Document* GetDocument() const { return m_pDocument; }
77
78  protected:
79   CPDF_Document* m_pDocument;
80 };
81 #define PDFBOOKMARK_ITALIC 1
82 #define PDFBOOKMARK_BOLD 2
83 class CPDF_Bookmark {
84  public:
85   CPDF_Bookmark() : m_pDict(NULL) {}
86
87   explicit CPDF_Bookmark(CPDF_Dictionary* pDict) : m_pDict(pDict) {}
88
89   CPDF_Dictionary* GetDict() const { return m_pDict; }
90
91   operator bool() const { return m_pDict != NULL; }
92
93   FX_DWORD GetColorRef() const;
94
95   FX_DWORD GetFontStyle() const;
96
97   CFX_WideString GetTitle() const;
98
99   CPDF_Dest GetDest(CPDF_Document* pDocument) const;
100
101   CPDF_Action GetAction() const;
102
103   CPDF_Dictionary* m_pDict;
104 };
105 #define PDFZOOM_XYZ 1
106 #define PDFZOOM_FITPAGE 2
107 #define PDFZOOM_FITHORZ 3
108 #define PDFZOOM_FITVERT 4
109 #define PDFZOOM_FITRECT 5
110 #define PDFZOOM_FITBBOX 6
111 #define PDFZOOM_FITBHORZ 7
112 #define PDFZOOM_FITBVERT 8
113 class CPDF_Dest {
114  public:
115   CPDF_Dest() : m_pObj(nullptr) {}
116   explicit CPDF_Dest(CPDF_Object* pObj) : m_pObj(pObj) {}
117
118   operator bool() const { return m_pObj != NULL; }
119   CPDF_Object* GetObject() const { return m_pObj; }
120
121   CFX_ByteString GetRemoteName();
122   int GetPageIndex(CPDF_Document* pDoc);
123   FX_DWORD GetPageObjNum();
124   int GetZoomMode();
125   FX_FLOAT GetParam(int index);
126
127  protected:
128   CPDF_Object* m_pObj;
129 };
130 class CPDF_OCContext : public IPDF_OCContext {
131  public:
132   enum UsageType { View = 0, Design, Print, Export };
133
134   CPDF_OCContext(CPDF_Document* pDoc, UsageType eUsageType = View);
135   ~CPDF_OCContext() override;
136
137   CPDF_Document* GetDocument() const { return m_pDocument; }
138
139   UsageType GetUsageType() const { return m_eUsageType; }
140
141   FX_BOOL CheckOCGVisible(const CPDF_Dictionary* pOCGDict) override;
142
143   void ResetOCContext();
144
145  protected:
146   FX_BOOL LoadOCGStateFromConfig(const CFX_ByteStringC& csConfig,
147                                  const CPDF_Dictionary* pOCGDict,
148                                  FX_BOOL& bValidConfig) const;
149
150   FX_BOOL LoadOCGState(const CPDF_Dictionary* pOCGDict) const;
151
152   FX_BOOL GetOCGVisible(const CPDF_Dictionary* pOCGDict);
153
154   FX_BOOL GetOCGVE(CPDF_Array* pExpression,
155                    FX_BOOL bFromConfig,
156                    int nLevel = 0);
157
158   FX_BOOL LoadOCMDState(const CPDF_Dictionary* pOCMDDict, FX_BOOL bFromConfig);
159
160   CPDF_Document* m_pDocument;
161
162   UsageType m_eUsageType;
163
164   std::map<const CPDF_Dictionary*, FX_BOOL> m_OCGStates;
165 };
166 class CPDF_LWinParam {
167  public:
168   CPDF_LWinParam(CPDF_Dictionary* pDict) { m_pDict = pDict; }
169
170   operator CPDF_Dictionary*() const { return m_pDict; }
171
172   inline CFX_ByteString GetFileName() { return m_pDict->GetString("F"); }
173
174   inline CFX_ByteString GetDefaultDirectory() {
175     return m_pDict->GetString("D");
176   }
177
178   inline CFX_ByteString GetOperation() { return m_pDict->GetString("O"); }
179
180   inline CFX_ByteString GetParameter() { return m_pDict->GetString("P"); }
181
182   CPDF_Dictionary* m_pDict;
183 };
184 class CPDF_ActionFields {
185  public:
186   CPDF_ActionFields(const CPDF_Action* pAction) {
187     m_pAction = (CPDF_Action*)pAction;
188   }
189
190   operator CPDF_Action*() const { return m_pAction; }
191
192   FX_DWORD GetFieldsCount() const;
193
194   void GetAllFields(CFX_PtrArray& fieldObjects) const;
195
196   CPDF_Object* GetField(FX_DWORD iIndex) const;
197
198   CPDF_Action* m_pAction;
199 };
200
201 #define PDFNAMED_NEXTPAGE 1
202 #define PDFNAMED_PREVPAGE 2
203 #define PDFNAMED_FIRSTPAGE 3
204 #define PDFNAMED_LASTPAGE 4
205 #define PDFJS_MAXLENGTH 64
206 class CPDF_Action {
207  public:
208   enum ActionType {
209     Unknown = 0,
210     GoTo,
211     GoToR,
212     GoToE,
213     Launch,
214     Thread,
215     URI,
216     Sound,
217     Movie,
218     Hide,
219     Named,
220     SubmitForm,
221     ResetForm,
222     ImportData,
223     JavaScript,
224     SetOCGState,
225     Rendition,
226     Trans,
227     GoTo3DView
228   };
229
230   CPDF_Action() : m_pDict(nullptr) {}
231   explicit CPDF_Action(CPDF_Dictionary* pDict) : m_pDict(pDict) {}
232
233   operator bool() const { return m_pDict != NULL; }
234
235   CPDF_Dictionary* GetDict() const { return m_pDict; }
236
237   CFX_ByteString GetTypeName() const { return m_pDict->GetString("S"); }
238
239   ActionType GetType() const;
240
241   CPDF_Dest GetDest(CPDF_Document* pDoc) const;
242
243   CFX_WideString GetFilePath() const;
244
245   FX_BOOL GetNewWindow() const { return m_pDict->GetBoolean("NewWindow"); }
246
247   CPDF_LWinParam GetWinParam() const;
248
249   CFX_ByteString GetURI(CPDF_Document* pDoc) const;
250
251   FX_BOOL GetMouseMap() const { return m_pDict->GetBoolean("IsMap"); }
252
253   CPDF_ActionFields GetWidgets() const { return this; }
254
255   FX_BOOL GetHideStatus() const { return m_pDict->GetBoolean("H", TRUE); }
256
257   CFX_ByteString GetNamedAction() const { return m_pDict->GetString("N"); }
258
259   FX_DWORD GetFlags() const { return m_pDict->GetInteger("Flags"); }
260
261   CFX_WideString GetJavaScript() const;
262
263   CPDF_Dictionary* GetAnnot() const;
264
265   int32_t GetOperationType() const;
266
267   CPDF_Stream* GetSoundStream() const { return m_pDict->GetStream("Sound"); }
268
269   FX_FLOAT GetVolume() const { return m_pDict->GetNumber("Volume"); }
270
271   FX_BOOL IsSynchronous() const { return m_pDict->GetBoolean("Synchronous"); }
272
273   FX_BOOL IsRepeat() const { return m_pDict->GetBoolean("Repeat"); }
274
275   FX_BOOL IsMixPlay() const { return m_pDict->GetBoolean("Mix"); }
276
277   FX_DWORD GetSubActionsCount() const;
278
279   CPDF_Action GetSubAction(FX_DWORD iIndex) const;
280
281  protected:
282   CPDF_Dictionary* m_pDict;
283 };
284 class CPDF_AAction {
285  public:
286   CPDF_AAction(CPDF_Dictionary* pDict = NULL) { m_pDict = pDict; }
287
288   operator CPDF_Dictionary*() const { return m_pDict; }
289
290   enum AActionType {
291     CursorEnter = 0,
292     CursorExit,
293     ButtonDown,
294     ButtonUp,
295     GetFocus,
296     LoseFocus,
297     PageOpen,
298     PageClose,
299     PageVisible,
300     PageInvisible,
301     OpenPage,
302     ClosePage,
303     KeyStroke,
304     Format,
305     Validate,
306     Calculate,
307     CloseDocument,
308     SaveDocument,
309     DocumentSaved,
310     PrintDocument,
311     DocumentPrinted
312   };
313
314   FX_BOOL ActionExist(AActionType eType) const;
315
316   CPDF_Action GetAction(AActionType eType) const;
317
318   FX_POSITION GetStartPos() const;
319
320   CPDF_Action GetNextAction(FX_POSITION& pos, AActionType& eType) const;
321
322   CPDF_Dictionary* m_pDict;
323 };
324 class CPDF_DocJSActions {
325  public:
326   CPDF_DocJSActions(CPDF_Document* pDoc);
327
328   int CountJSActions() const;
329
330   CPDF_Action GetJSAction(int index, CFX_ByteString& csName) const;
331
332   CPDF_Action GetJSAction(const CFX_ByteString& csName) const;
333
334   int FindJSAction(const CFX_ByteString& csName) const;
335
336   CPDF_Document* GetDocument() const { return m_pDocument; }
337
338  protected:
339   CPDF_Document* m_pDocument;
340 };
341 class CPDF_FileSpec {
342  public:
343   CPDF_FileSpec();
344
345   CPDF_FileSpec(CPDF_Object* pObj) { m_pObj = pObj; }
346
347   operator CPDF_Object*() const { return m_pObj; }
348
349   FX_BOOL IsURL() const;
350
351   FX_BOOL GetFileName(CFX_WideString& wsFileName) const;
352
353   CPDF_Stream* GetFileStream() const;
354
355   void SetFileName(const CFX_WideStringC& wsFileName, FX_BOOL bURL = FALSE);
356
357  protected:
358   CPDF_Object* m_pObj;
359 };
360 class CPDF_LinkList {
361  public:
362   CPDF_LinkList(CPDF_Document* pDoc) { m_pDocument = pDoc; }
363
364   ~CPDF_LinkList();
365
366   CPDF_Link GetLinkAtPoint(CPDF_Page* pPage, FX_FLOAT pdf_x, FX_FLOAT pdf_y);
367
368   int CountLinks(CPDF_Page* pPage);
369
370   CPDF_Link GetLink(CPDF_Page* pPage, int index);
371
372   CPDF_Document* GetDocument() const { return m_pDocument; }
373
374  protected:
375   CPDF_Document* m_pDocument;
376
377   CFX_MapPtrToPtr m_PageMap;
378
379   CFX_PtrArray* GetPageLinks(CPDF_Page* pPage);
380
381   void LoadPageLinks(CPDF_Page* pPage, CFX_PtrArray* pList);
382 };
383 class CPDF_Link {
384  public:
385   CPDF_Link() : m_pDict(nullptr) {}
386   explicit CPDF_Link(CPDF_Dictionary* pDict) : m_pDict(pDict) {}
387
388   CPDF_Dictionary* GetDict() const { return m_pDict; }
389
390   CFX_FloatRect GetRect();
391   CPDF_Dest GetDest(CPDF_Document* pDoc);
392   CPDF_Action GetAction();
393
394  protected:
395   CPDF_Dictionary* m_pDict;
396 };
397
398 #define ANNOTFLAG_INVISIBLE 0x0001
399 #define ANNOTFLAG_HIDDEN 0x0002
400 #define ANNOTFLAG_PRINT 0x0004
401 #define ANNOTFLAG_NOZOOM 0x0008
402 #define ANNOTFLAG_NOROTATE 0x0010
403 #define ANNOTFLAG_NOVIEW 0x0020
404 #define ANNOTFLAG_READONLY 0x0040
405 #define ANNOTFLAG_LOCKED 0x0080
406 #define ANNOTFLAG_TOGGLENOVIEW 0x0100
407
408 class CPDF_Annot : public CFX_PrivateData {
409  public:
410   enum AppearanceMode { Normal, Rollover, Down };
411
412   CPDF_Annot(CPDF_Dictionary* pDict, CPDF_AnnotList* pList);
413   ~CPDF_Annot();
414
415   CFX_ByteString GetSubType() const;
416
417   FX_DWORD GetFlags() const;
418
419   void GetRect(CFX_FloatRect& rect) const;
420
421   CPDF_Dictionary* GetAnnotDict();
422
423   FX_BOOL DrawAppearance(const CPDF_Page* pPage,
424                          CFX_RenderDevice* pDevice,
425                          const CFX_AffineMatrix* pUser2Device,
426                          AppearanceMode mode,
427                          const CPDF_RenderOptions* pOptions);
428
429   FX_BOOL DrawInContext(const CPDF_Page* pPage,
430                         const CPDF_RenderContext* pContext,
431                         const CFX_AffineMatrix* pUser2Device,
432                         AppearanceMode mode);
433
434   void ClearCachedAP();
435
436   void DrawBorder(CFX_RenderDevice* pDevice,
437                   const CFX_AffineMatrix* pUser2Device,
438                   const CPDF_RenderOptions* pOptions);
439
440   CPDF_Form* GetAPForm(const CPDF_Page* pPage, AppearanceMode mode);
441
442  private:
443   CPDF_Dictionary* const m_pAnnotDict;
444
445   CPDF_AnnotList* const m_pList;
446
447   const CFX_ByteString m_sSubtype;
448
449   CFX_MapPtrToPtr m_APMap;
450 };
451
452 class CPDF_AnnotList {
453  public:
454   CPDF_AnnotList(CPDF_Page* pPage);
455
456   ~CPDF_AnnotList();
457
458   void GetAnnotMatrix(const CPDF_Dictionary* pAnnotDict,
459                       const CFX_Matrix* pUser2Device,
460                       CFX_Matrix& matrix) const;
461
462   void GetAnnotRect(const CPDF_Dictionary* pAnnotDict,
463                     const CFX_Matrix* pUser2Device,
464                     CPDF_Rect& rtAnnot) const;
465
466   void DisplayAnnots(const CPDF_Page* pPage,
467                      CFX_RenderDevice* pDevice,
468                      CFX_AffineMatrix* pMatrix,
469                      FX_BOOL bShowWidget,
470                      CPDF_RenderOptions* pOptions);
471
472   void DisplayAnnots(const CPDF_Page* pPage,
473                      CPDF_RenderContext* pContext,
474                      FX_BOOL bPrinting,
475                      CFX_AffineMatrix* pMatrix,
476                      FX_BOOL bShowWidget,
477                      CPDF_RenderOptions* pOptions) {
478     DisplayAnnots(pPage, NULL, pContext, bPrinting, pMatrix,
479                   bShowWidget ? 3 : 1, pOptions, NULL);
480   }
481
482   void DisplayAnnots(const CPDF_Page* pPage,
483                      CPDF_RenderContext* pContext,
484                      FX_BOOL bPrinting,
485                      CFX_AffineMatrix* pMatrix,
486                      FX_BOOL bShowWidget,
487                      CPDF_RenderOptions* pOptions,
488                      FX_RECT* pClipRect) {
489     DisplayAnnots(pPage, NULL, pContext, bPrinting, pMatrix,
490                   bShowWidget ? 3 : 1, pOptions, pClipRect);
491   }
492
493   void DisplayAnnots(const CPDF_Page* pPage,
494                      CFX_RenderDevice* pDevice,
495                      CPDF_RenderContext* pContext,
496                      FX_BOOL bPrinting,
497                      CFX_AffineMatrix* pMatrix,
498                      FX_DWORD dwAnnotFlags,
499                      CPDF_RenderOptions* pOptions,
500                      FX_RECT* pClipRect);
501
502   CPDF_Annot* GetAt(int index) { return (CPDF_Annot*)m_AnnotList.GetAt(index); }
503
504   int Count() { return m_AnnotList.GetSize(); }
505
506   int GetIndex(CPDF_Annot* pAnnot);
507
508   CPDF_Document* GetDocument() const { return m_pDocument; }
509
510  protected:
511   CFX_PtrArray m_AnnotList;
512
513   CPDF_Dictionary* m_pPageDict;
514
515   CPDF_Document* m_pDocument;
516
517   CFX_PtrArray m_Borders;
518
519   void DisplayPass(const CPDF_Page* pPage,
520                    CFX_RenderDevice* pDevice,
521                    CPDF_RenderContext* pContext,
522                    FX_BOOL bPrinting,
523                    CFX_AffineMatrix* pMatrix,
524                    FX_BOOL bWidget,
525                    CPDF_RenderOptions* pOptions,
526                    FX_RECT* clip_rect);
527   friend class CPDF_Annot;
528 };
529 #define COLORTYPE_TRANSPARENT 0
530 #define COLORTYPE_GRAY 1
531 #define COLORTYPE_RGB 2
532 #define COLORTYPE_CMYK 3
533 class CPDF_DefaultAppearance {
534  public:
535   CPDF_DefaultAppearance(const CFX_ByteString& csDA = "") { m_csDA = csDA; }
536
537   CPDF_DefaultAppearance(const CPDF_DefaultAppearance& cDA) {
538     m_csDA = (CFX_ByteString)(CPDF_DefaultAppearance&)cDA;
539   }
540
541   operator CFX_ByteString() const { return m_csDA; }
542
543   const CPDF_DefaultAppearance& operator=(const CFX_ByteString& csDA) {
544     m_csDA = csDA;
545     return *this;
546   }
547
548   const CPDF_DefaultAppearance& operator=(const CPDF_DefaultAppearance& cDA) {
549     m_csDA = (CFX_ByteString)(CPDF_DefaultAppearance&)cDA;
550     return *this;
551   }
552
553   FX_BOOL HasFont();
554
555   CFX_ByteString GetFontString();
556
557   void GetFont(CFX_ByteString& csFontNameTag, FX_FLOAT& fFontSize);
558
559   FX_BOOL HasColor(FX_BOOL bStrokingOperation = FALSE);
560
561   CFX_ByteString GetColorString(FX_BOOL bStrokingOperation = FALSE);
562
563   void GetColor(int& iColorType,
564                 FX_FLOAT fc[4],
565                 FX_BOOL bStrokingOperation = FALSE);
566
567   void GetColor(FX_ARGB& color,
568                 int& iColorType,
569                 FX_BOOL bStrokingOperation = FALSE);
570
571   FX_BOOL HasTextMatrix();
572
573   CFX_ByteString GetTextMatrixString();
574
575   CFX_AffineMatrix GetTextMatrix();
576
577  protected:
578   CFX_ByteString m_csDA;
579 };
580 #define FIELDTYPE_UNKNOWN 0
581 #define FIELDTYPE_PUSHBUTTON 1
582 #define FIELDTYPE_CHECKBOX 2
583 #define FIELDTYPE_RADIOBUTTON 3
584 #define FIELDTYPE_COMBOBOX 4
585 #define FIELDTYPE_LISTBOX 5
586 #define FIELDTYPE_TEXTFIELD 6
587 #define FIELDTYPE_SIGNATURE 7
588 class CPDF_InterForm : public CFX_PrivateData {
589  public:
590   CPDF_InterForm(CPDF_Document* pDocument, FX_BOOL bUpdateAP);
591   ~CPDF_InterForm();
592
593   static void EnableUpdateAP(FX_BOOL bUpdateAP);
594
595   static FX_BOOL UpdatingAPEnabled();
596
597   static CFX_ByteString GenerateNewResourceName(const CPDF_Dictionary* pResDict,
598                                                 const FX_CHAR* csType,
599                                                 int iMinLen = 2,
600                                                 const FX_CHAR* csPrefix = "");
601
602   static CPDF_Font* AddSystemDefaultFont(const CPDF_Document* pDocument);
603
604   static CPDF_Font* AddSystemFont(const CPDF_Document* pDocument,
605                                   CFX_ByteString csFontName,
606                                   uint8_t iCharSet = 1);
607
608   static CPDF_Font* AddSystemFont(const CPDF_Document* pDocument,
609                                   CFX_WideString csFontName,
610                                   uint8_t iCharSet = 1);
611
612   static CPDF_Font* AddStandardFont(const CPDF_Document* pDocument,
613                                     CFX_ByteString csFontName);
614
615   static CFX_ByteString GetNativeFont(uint8_t iCharSet, void* pLogFont = NULL);
616
617   static CFX_ByteString GetNativeFont(void* pLogFont = NULL);
618
619   static uint8_t GetNativeCharSet();
620
621   static CPDF_Font* AddNativeFont(uint8_t iCharSet,
622                                   const CPDF_Document* pDocument);
623
624   static CPDF_Font* AddNativeFont(const CPDF_Document* pDocument);
625
626   FX_BOOL ValidateFieldName(CFX_WideString& csNewFieldName, int iType);
627
628   FX_BOOL ValidateFieldName(const CPDF_FormField* pField,
629                             CFX_WideString& csNewFieldName);
630
631   FX_BOOL ValidateFieldName(const CPDF_FormControl* pControl,
632                             CFX_WideString& csNewFieldName);
633
634   FX_DWORD CountFields(const CFX_WideString& csFieldName = L"");
635
636   CPDF_FormField* GetField(FX_DWORD index,
637                            const CFX_WideString& csFieldName = L"");
638
639   void GetAllFieldNames(CFX_WideStringArray& allFieldNames);
640
641   FX_BOOL IsValidFormField(const void* pField);
642
643   CPDF_FormField* GetFieldByDict(CPDF_Dictionary* pFieldDict) const;
644
645   FX_DWORD CountControls(CFX_WideString csFieldName = L"");
646
647   CPDF_FormControl* GetControl(FX_DWORD index,
648                                CFX_WideString csFieldName = L"");
649
650   FX_BOOL IsValidFormControl(const void* pControl);
651
652   int CountPageControls(CPDF_Page* pPage) const;
653
654   CPDF_FormControl* GetPageControl(CPDF_Page* pPage, int index) const;
655
656   CPDF_FormControl* GetControlAtPoint(CPDF_Page* pPage,
657                                       FX_FLOAT pdf_x,
658                                       FX_FLOAT pdf_y) const;
659
660   CPDF_FormControl* GetControlByDict(CPDF_Dictionary* pWidgetDict) const;
661
662   FX_DWORD CountInternalFields(const CFX_WideString& csFieldName = L"") const;
663
664   CPDF_Dictionary* GetInternalField(
665       FX_DWORD index,
666       const CFX_WideString& csFieldName = L"") const;
667
668   CPDF_Document* GetDocument() const { return m_pDocument; }
669
670   CPDF_Dictionary* GetFormDict() const { return m_pFormDict; }
671
672   FX_BOOL NeedConstructAP();
673
674   void NeedConstructAP(FX_BOOL bNeedAP);
675
676   int CountFieldsInCalculationOrder();
677
678   CPDF_FormField* GetFieldInCalculationOrder(int index);
679
680   int FindFieldInCalculationOrder(const CPDF_FormField* pField);
681
682   FX_DWORD CountFormFonts();
683
684   CPDF_Font* GetFormFont(FX_DWORD index, CFX_ByteString& csNameTag);
685
686   CPDF_Font* GetFormFont(CFX_ByteString csNameTag);
687
688   CPDF_Font* GetFormFont(CFX_ByteString csFontName, CFX_ByteString& csNameTag);
689
690   CPDF_Font* GetNativeFormFont(uint8_t iCharSet, CFX_ByteString& csNameTag);
691
692   CPDF_Font* GetNativeFormFont(CFX_ByteString& csNameTag);
693
694   FX_BOOL FindFormFont(const CPDF_Font* pFont, CFX_ByteString& csNameTag);
695
696   FX_BOOL FindFormFont(CFX_ByteString csFontName,
697                        CPDF_Font*& pFont,
698                        CFX_ByteString& csNameTag);
699
700   inline FX_BOOL FindFormFont(CFX_WideString csFontName,
701                               CPDF_Font*& pFont,
702                               CFX_ByteString& csNameTag) {
703     return FindFormFont(PDF_EncodeText(csFontName), pFont, csNameTag);
704   }
705
706   void AddFormFont(const CPDF_Font* pFont, CFX_ByteString& csNameTag);
707
708   CPDF_Font* AddNativeFormFont(uint8_t iCharSet, CFX_ByteString& csNameTag);
709
710   CPDF_Font* AddNativeFormFont(CFX_ByteString& csNameTag);
711
712   void RemoveFormFont(const CPDF_Font* pFont);
713
714   void RemoveFormFont(CFX_ByteString csNameTag);
715
716   CPDF_DefaultAppearance GetDefaultAppearance();
717
718   CPDF_Font* GetDefaultFormFont();
719
720   int GetFormAlignment();
721
722   CPDF_FormField* CheckRequiredFields(const CFX_PtrArray* fields = NULL,
723                                       FX_BOOL bIncludeOrExclude = TRUE) const;
724
725   CFDF_Document* ExportToFDF(const CFX_WideStringC& pdf_path,
726                              FX_BOOL bSimpleFileSpec = FALSE) const;
727
728   CFDF_Document* ExportToFDF(const CFX_WideStringC& pdf_path,
729                              CFX_PtrArray& fields,
730                              FX_BOOL bIncludeOrExclude = TRUE,
731                              FX_BOOL bSimpleFileSpec = FALSE) const;
732
733   FX_BOOL ImportFromFDF(const CFDF_Document* pFDFDoc, FX_BOOL bNotify = FALSE);
734
735   FX_BOOL ResetForm(const CFX_PtrArray& fields,
736                     FX_BOOL bIncludeOrExclude = TRUE,
737                     FX_BOOL bNotify = FALSE);
738
739   FX_BOOL ResetForm(FX_BOOL bNotify = FALSE);
740
741   void ReloadForm();
742
743   CPDF_FormNotify* GetFormNotify() const { return m_pFormNotify; }
744
745   void SetFormNotify(const CPDF_FormNotify* pNotify);
746
747   int GetPageWithWidget(int iCurPage, FX_BOOL bNext);
748
749   FX_BOOL IsUpdated() { return m_bUpdated; }
750
751   void ClearUpdatedFlag() { m_bUpdated = FALSE; }
752
753   FX_BOOL HasXFAForm() const;
754
755   void FixPageFields(const CPDF_Page* pPage);
756
757  protected:
758   static FX_BOOL m_bUpdateAP;
759
760   void LoadField(CPDF_Dictionary* pFieldDict, int nLevel = 0);
761
762   CPDF_Object* GetFieldAttr(CPDF_Dictionary* pFieldDict, const FX_CHAR* name);
763
764   CPDF_FormField* AddTerminalField(const CPDF_Dictionary* pFieldDict);
765
766   CPDF_FormControl* AddControl(const CPDF_FormField* pField,
767                                const CPDF_Dictionary* pWidgetDict);
768
769   void FDF_ImportField(CPDF_Dictionary* pField,
770                        const CFX_WideString& parent_name,
771                        FX_BOOL bNotify = FALSE,
772                        int nLevel = 0);
773
774   FX_BOOL ValidateFieldName(CFX_WideString& csNewFieldName,
775                             int iType,
776                             const CPDF_FormField* pExcludedField,
777                             const CPDF_FormControl* pExcludedControl);
778
779   int CompareFieldName(const CFX_WideString& name1,
780                        const CFX_WideString& name2);
781
782   int CompareFieldName(const CFX_ByteString& name1,
783                        const CFX_ByteString& name2);
784
785   CPDF_Document* m_pDocument;
786
787   FX_BOOL m_bGenerateAP;
788
789   CPDF_Dictionary* m_pFormDict;
790
791   CFX_MapPtrToPtr m_ControlMap;
792
793   CFieldTree* m_pFieldTree;
794
795   CFX_ByteString m_bsEncoding;
796
797   CPDF_FormNotify* m_pFormNotify;
798
799   FX_BOOL m_bUpdated;
800   friend class CPDF_FormControl;
801   friend class CPDF_FormField;
802 };
803 #define FORMFIELD_READONLY 0x01
804 #define FORMFIELD_REQUIRED 0x02
805 #define FORMFIELD_NOEXPORT 0x04
806 #define FORMRADIO_NOTOGGLEOFF 0x100
807 #define FORMRADIO_UNISON 0x200
808 #define FORMTEXT_MULTILINE 0x100
809 #define FORMTEXT_PASSWORD 0x200
810 #define FORMTEXT_NOSCROLL 0x400
811 #define FORMTEXT_COMB 0x800
812 #define FORMCOMBO_EDIT 0x100
813 #define FORMLIST_MULTISELECT 0x100
814 class CPDF_FormField {
815  public:
816   enum Type {
817     Unknown,
818     PushButton,
819     RadioButton,
820     CheckBox,
821     Text,
822     RichText,
823     File,
824     ListBox,
825     ComboBox,
826     Sign
827   };
828
829   CFX_WideString GetFullName();
830
831   Type GetType() { return m_Type; }
832
833   FX_DWORD GetFlags() { return m_Flags; }
834
835   CPDF_InterForm* GetInterForm() const { return m_pForm; }
836
837   CPDF_Dictionary* GetFieldDict() const { return m_pDict; }
838
839   void SetFieldDict(CPDF_Dictionary* pDict) { m_pDict = pDict; }
840
841   FX_BOOL ResetField(FX_BOOL bNotify = FALSE);
842
843   int CountControls() { return m_ControlList.GetSize(); }
844
845   CPDF_FormControl* GetControl(int index) {
846     return (CPDF_FormControl*)m_ControlList.GetAt(index);
847   }
848
849   int GetControlIndex(const CPDF_FormControl* pControl);
850
851   int GetFieldType();
852
853   CPDF_AAction GetAdditionalAction();
854
855   CFX_WideString GetAlternateName();
856
857   CFX_WideString GetMappingName();
858
859   FX_DWORD GetFieldFlags();
860
861   CFX_ByteString GetDefaultStyle();
862
863   CFX_WideString GetRichTextString();
864
865   CFX_WideString GetValue();
866
867   CFX_WideString GetDefaultValue();
868
869   FX_BOOL SetValue(const CFX_WideString& value, FX_BOOL bNotify = FALSE);
870
871   int GetMaxLen();
872
873   int CountSelectedItems();
874
875   int GetSelectedIndex(int index);
876
877   FX_BOOL ClearSelection(FX_BOOL bNotify = FALSE);
878
879   FX_BOOL IsItemSelected(int index);
880
881   FX_BOOL SetItemSelection(int index,
882                            FX_BOOL bSelected,
883                            FX_BOOL bNotify = FALSE);
884
885   FX_BOOL IsItemDefaultSelected(int index);
886
887   int GetDefaultSelectedItem();
888
889   int CountOptions();
890
891   CFX_WideString GetOptionLabel(int index);
892
893   CFX_WideString GetOptionValue(int index);
894
895   int FindOption(CFX_WideString csOptLabel);
896
897   int FindOptionValue(const CFX_WideString& csOptValue, int iStartIndex = 0);
898
899   FX_BOOL CheckControl(int iControlIndex,
900                        FX_BOOL bChecked,
901                        FX_BOOL bNotify = FALSE);
902
903   int GetTopVisibleIndex();
904
905   int CountSelectedOptions();
906
907   int GetSelectedOptionIndex(int index);
908
909   FX_BOOL IsOptionSelected(int iOptIndex);
910
911   FX_BOOL SelectOption(int iOptIndex,
912                        FX_BOOL bSelected,
913                        FX_BOOL bNotify = FALSE);
914
915   FX_BOOL ClearSelectedOptions(FX_BOOL bNotify = FALSE);
916
917   FX_FLOAT GetFontSize() { return m_FontSize; }
918
919   CPDF_Font* GetFont() { return m_pFont; }
920
921  protected:
922   CPDF_FormField(CPDF_InterForm* pForm, CPDF_Dictionary* pDict);
923
924   ~CPDF_FormField();
925
926   CPDF_FormField::Type m_Type;
927
928   FX_DWORD m_Flags;
929
930   CPDF_InterForm* m_pForm;
931
932   CPDF_Dictionary* m_pDict;
933
934   CFX_PtrArray m_ControlList;
935   friend class CPDF_InterForm;
936   friend class CPDF_FormControl;
937
938   CFX_WideString GetValue(FX_BOOL bDefault);
939
940   FX_BOOL SetValue(const CFX_WideString& value,
941                    FX_BOOL bDefault,
942                    FX_BOOL bNotify);
943
944   void SyncFieldFlags();
945
946   int FindListSel(CPDF_String* str);
947
948   CFX_WideString GetOptionText(int index, int sub_index);
949
950   void LoadDA();
951
952   void UpdateAP(CPDF_FormControl* pControl);
953
954   CFX_WideString GetCheckValue(FX_BOOL bDefault);
955
956   FX_BOOL SetCheckValue(const CFX_WideString& value,
957                         FX_BOOL bDefault,
958                         FX_BOOL bNotify);
959
960   FX_FLOAT m_FontSize;
961
962   CPDF_Font* m_pFont;
963 };
964 CPDF_Object* FPDF_GetFieldAttr(CPDF_Dictionary* pFieldDict,
965                                const FX_CHAR* name,
966                                int nLevel = 0);
967 class CPDF_IconFit {
968  public:
969   CPDF_IconFit(CPDF_Dictionary* pDict = NULL) { m_pDict = pDict; }
970
971   operator CPDF_Dictionary*() const { return m_pDict; }
972
973   enum ScaleMethod { Always = 0, Bigger, Smaller, Never };
974
975   ScaleMethod GetScaleMethod();
976
977   FX_BOOL IsProportionalScale();
978
979   void GetIconPosition(FX_FLOAT& fLeft, FX_FLOAT& fBottom);
980
981   FX_BOOL GetFittingBounds();
982
983   CPDF_Dictionary* m_pDict;
984 };
985
986 #define TEXTPOS_CAPTION 0
987 #define TEXTPOS_ICON 1
988 #define TEXTPOS_BELOW 2
989 #define TEXTPOS_ABOVE 3
990 #define TEXTPOS_RIGHT 4
991 #define TEXTPOS_LEFT 5
992 #define TEXTPOS_OVERLAID 6
993 class CPDF_FormControl {
994  public:
995   CPDF_FormField::Type GetType() { return m_pField->GetType(); }
996
997   CPDF_InterForm* GetInterForm() const { return m_pForm; }
998
999   CPDF_FormField* GetField() const { return m_pField; }
1000
1001   CPDF_Dictionary* GetWidget() const { return m_pWidgetDict; }
1002
1003   CFX_FloatRect GetRect();
1004
1005   void DrawControl(CFX_RenderDevice* pDevice,
1006                    CFX_AffineMatrix* pMatrix,
1007                    CPDF_Page* pPage,
1008                    CPDF_Annot::AppearanceMode mode,
1009                    const CPDF_RenderOptions* pOptions = NULL);
1010
1011   CFX_ByteString GetCheckedAPState();
1012
1013   CFX_WideString GetExportValue();
1014
1015   FX_BOOL IsChecked();
1016
1017   FX_BOOL IsDefaultChecked();
1018
1019   enum HighlightingMode { None = 0, Invert, Outline, Push, Toggle };
1020
1021   HighlightingMode GetHighlightingMode();
1022
1023   FX_BOOL HasMKEntry(CFX_ByteString csEntry);
1024
1025   int GetRotation();
1026
1027   inline FX_ARGB GetBorderColor(int& iColorType) {
1028     return GetColor(iColorType, "BC");
1029   }
1030
1031   inline FX_FLOAT GetOriginalBorderColor(int index) {
1032     return GetOriginalColor(index, "BC");
1033   }
1034
1035   inline void GetOriginalBorderColor(int& iColorType, FX_FLOAT fc[4]) {
1036     GetOriginalColor(iColorType, fc, "BC");
1037   }
1038
1039   inline FX_ARGB GetBackgroundColor(int& iColorType) {
1040     return GetColor(iColorType, "BG");
1041   }
1042
1043   inline FX_FLOAT GetOriginalBackgroundColor(int index) {
1044     return GetOriginalColor(index, "BG");
1045   }
1046
1047   inline void GetOriginalBackgroundColor(int& iColorType, FX_FLOAT fc[4]) {
1048     GetOriginalColor(iColorType, fc, "BG");
1049   }
1050
1051   inline CFX_WideString GetNormalCaption() { return GetCaption("CA"); }
1052
1053   inline CFX_WideString GetRolloverCaption() { return GetCaption("RC"); }
1054
1055   inline CFX_WideString GetDownCaption() { return GetCaption("AC"); }
1056
1057   inline CPDF_Stream* GetNormalIcon() { return GetIcon("I"); }
1058
1059   inline CPDF_Stream* GetRolloverIcon() { return GetIcon("RI"); }
1060
1061   inline CPDF_Stream* GetDownIcon() { return GetIcon("IX"); }
1062
1063   CPDF_IconFit GetIconFit();
1064
1065   int GetTextPosition();
1066
1067   CPDF_Action GetAction();
1068
1069   CPDF_AAction GetAdditionalAction();
1070
1071   CPDF_DefaultAppearance GetDefaultAppearance();
1072
1073   CPDF_Font* GetDefaultControlFont();
1074
1075   int GetControlAlignment();
1076
1077  protected:
1078   CPDF_FormControl(CPDF_FormField* pField, CPDF_Dictionary* pWidgetDict);
1079
1080   CFX_ByteString GetOnStateName();
1081
1082   void SetOnStateName(const CFX_ByteString& csOn);
1083
1084   void CheckControl(FX_BOOL bChecked);
1085
1086   FX_ARGB GetColor(int& iColorType, CFX_ByteString csEntry);
1087
1088   FX_FLOAT GetOriginalColor(int index, CFX_ByteString csEntry);
1089
1090   void GetOriginalColor(int& iColorType,
1091                         FX_FLOAT fc[4],
1092                         CFX_ByteString csEntry);
1093
1094   CFX_WideString GetCaption(CFX_ByteString csEntry);
1095
1096   CPDF_Stream* GetIcon(CFX_ByteString csEntry);
1097
1098   CPDF_ApSettings GetMK(FX_BOOL bCreate);
1099
1100   CPDF_InterForm* m_pForm;
1101
1102   CPDF_FormField* m_pField;
1103
1104   CPDF_Dictionary* m_pWidgetDict;
1105   friend class CPDF_InterForm;
1106   friend class CPDF_FormField;
1107 };
1108 class CPDF_FormNotify {
1109  public:
1110   virtual ~CPDF_FormNotify() {}
1111
1112   virtual int BeforeValueChange(const CPDF_FormField* pField,
1113                                 CFX_WideString& csValue) {
1114     return 0;
1115   }
1116
1117   virtual int AfterValueChange(const CPDF_FormField* pField) { return 0; }
1118
1119   virtual int BeforeSelectionChange(const CPDF_FormField* pField,
1120                                     CFX_WideString& csValue) {
1121     return 0;
1122   }
1123
1124   virtual int AfterSelectionChange(const CPDF_FormField* pField) { return 0; }
1125
1126   virtual int AfterCheckedStatusChange(const CPDF_FormField* pField,
1127                                        const CFX_ByteArray& statusArray) {
1128     return 0;
1129   }
1130
1131   virtual int BeforeFormReset(const CPDF_InterForm* pForm) { return 0; }
1132
1133   virtual int AfterFormReset(const CPDF_InterForm* pForm) { return 0; }
1134
1135   virtual int BeforeFormImportData(const CPDF_InterForm* pForm) { return 0; }
1136
1137   virtual int AfterFormImportData(const CPDF_InterForm* pForm) { return 0; }
1138 };
1139 FX_BOOL FPDF_GenerateAP(CPDF_Document* pDoc, CPDF_Dictionary* pAnnotDict);
1140 class CPDF_PageLabel {
1141  public:
1142   CPDF_PageLabel(CPDF_Document* pDocument) { m_pDocument = pDocument; }
1143
1144   CFX_WideString GetLabel(int nPage) const;
1145
1146   int32_t GetPageByLabel(const CFX_ByteStringC& bsLabel) const;
1147
1148   int32_t GetPageByLabel(const CFX_WideStringC& wsLabel) const;
1149
1150  protected:
1151   CPDF_Document* m_pDocument;
1152 };
1153
1154 class CPDF_Metadata {
1155  public:
1156   explicit CPDF_Metadata(CPDF_Document* pDoc);
1157   ~CPDF_Metadata();
1158
1159   const CXML_Element* GetRoot() const;
1160
1161  private:
1162   nonstd::unique_ptr<CXML_Element> m_pXmlElement;
1163 };
1164
1165 class CPDF_ViewerPreferences {
1166  public:
1167   CPDF_ViewerPreferences(CPDF_Document* pDoc);
1168
1169   ~CPDF_ViewerPreferences();
1170
1171   FX_BOOL IsDirectionR2L() const;
1172
1173   FX_BOOL PrintScaling() const;
1174
1175   int32_t NumCopies() const;
1176
1177   CPDF_Array* PrintPageRange() const;
1178
1179   CFX_ByteString Duplex() const;
1180
1181  protected:
1182   CPDF_Document* m_pDoc;
1183 };
1184 class CPDF_ApSettings {
1185  public:
1186   CPDF_ApSettings(CPDF_Dictionary* pDict = NULL) { m_pDict = pDict; }
1187
1188   operator CPDF_Dictionary*() const { return m_pDict; }
1189
1190   FX_BOOL HasMKEntry(const CFX_ByteStringC& csEntry);
1191
1192   int GetRotation();
1193
1194   inline FX_ARGB GetBorderColor(int& iColorType) {
1195     return GetColor(iColorType, FX_BSTRC("BC"));
1196   }
1197
1198   inline FX_FLOAT GetOriginalBorderColor(int index) {
1199     return GetOriginalColor(index, FX_BSTRC("BC"));
1200   }
1201
1202   inline void GetOriginalBorderColor(int& iColorType, FX_FLOAT fc[4]) {
1203     GetOriginalColor(iColorType, fc, FX_BSTRC("BC"));
1204   }
1205
1206   inline FX_ARGB GetBackgroundColor(int& iColorType) {
1207     return GetColor(iColorType, FX_BSTRC("BG"));
1208   }
1209
1210   inline FX_FLOAT GetOriginalBackgroundColor(int index) {
1211     return GetOriginalColor(index, FX_BSTRC("BG"));
1212   }
1213
1214   inline void GetOriginalBackgroundColor(int& iColorType, FX_FLOAT fc[4]) {
1215     GetOriginalColor(iColorType, fc, FX_BSTRC("BG"));
1216   }
1217
1218   inline CFX_WideString GetNormalCaption() {
1219     return GetCaption(FX_BSTRC("CA"));
1220   }
1221
1222   inline CFX_WideString GetRolloverCaption() {
1223     return GetCaption(FX_BSTRC("RC"));
1224   }
1225
1226   inline CFX_WideString GetDownCaption() { return GetCaption(FX_BSTRC("AC")); }
1227
1228   inline CPDF_Stream* GetNormalIcon() { return GetIcon(FX_BSTRC("I")); }
1229
1230   inline CPDF_Stream* GetRolloverIcon() { return GetIcon(FX_BSTRC("RI")); }
1231
1232   inline CPDF_Stream* GetDownIcon() { return GetIcon(FX_BSTRC("IX")); }
1233
1234   CPDF_IconFit GetIconFit();
1235
1236   int GetTextPosition();
1237
1238   CPDF_Dictionary* m_pDict;
1239
1240  protected:
1241   FX_ARGB GetColor(int& iColorType, const CFX_ByteStringC& csEntry);
1242
1243   FX_FLOAT GetOriginalColor(int index, const CFX_ByteStringC& csEntry);
1244
1245   void GetOriginalColor(int& iColorType,
1246                         FX_FLOAT fc[4],
1247                         const CFX_ByteStringC& csEntry);
1248
1249   CFX_WideString GetCaption(const CFX_ByteStringC& csEntry);
1250
1251   CPDF_Stream* GetIcon(const CFX_ByteStringC& csEntry);
1252   friend class CPDF_FormControl;
1253 };
1254
1255 #endif  // CORE_INCLUDE_FPDFDOC_FPDF_DOC_H_