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