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