Add new public APIs to find the z-order for links and widgets.
[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_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
361 class CPDF_LinkList {
362  public:
363   CPDF_LinkList();
364   ~CPDF_LinkList();
365
366   CPDF_Link GetLinkAtPoint(CPDF_Page* pPage,
367                            FX_FLOAT pdf_x,
368                            FX_FLOAT pdf_y,
369                            int* z_order);
370
371  private:
372   const std::vector<CPDF_Dictionary*>* GetPageLinks(CPDF_Page* pPage);
373
374   void LoadPageLinks(CPDF_Page* pPage, std::vector<CPDF_Dictionary*>* pList);
375
376   std::map<FX_DWORD, std::vector<CPDF_Dictionary*>> m_PageMap;
377 };
378
379 class CPDF_Link {
380  public:
381   CPDF_Link() : m_pDict(nullptr) {}
382   explicit CPDF_Link(CPDF_Dictionary* pDict) : m_pDict(pDict) {}
383
384   CPDF_Dictionary* GetDict() const { return m_pDict; }
385
386   CFX_FloatRect GetRect();
387   CPDF_Dest GetDest(CPDF_Document* pDoc);
388   CPDF_Action GetAction();
389
390  protected:
391   CPDF_Dictionary* m_pDict;
392 };
393
394 #define ANNOTFLAG_INVISIBLE 0x0001
395 #define ANNOTFLAG_HIDDEN 0x0002
396 #define ANNOTFLAG_PRINT 0x0004
397 #define ANNOTFLAG_NOZOOM 0x0008
398 #define ANNOTFLAG_NOROTATE 0x0010
399 #define ANNOTFLAG_NOVIEW 0x0020
400 #define ANNOTFLAG_READONLY 0x0040
401 #define ANNOTFLAG_LOCKED 0x0080
402 #define ANNOTFLAG_TOGGLENOVIEW 0x0100
403
404 class CPDF_Annot : public CFX_PrivateData {
405  public:
406   enum AppearanceMode { Normal, Rollover, Down };
407
408   CPDF_Annot(CPDF_Dictionary* pDict, CPDF_AnnotList* pList);
409   ~CPDF_Annot();
410
411   CFX_ByteString GetSubType() const;
412
413   FX_DWORD GetFlags() const;
414
415   void GetRect(CFX_FloatRect& rect) const;
416
417   CPDF_Dictionary* GetAnnotDict();
418
419   FX_BOOL DrawAppearance(const CPDF_Page* pPage,
420                          CFX_RenderDevice* pDevice,
421                          const CFX_AffineMatrix* pUser2Device,
422                          AppearanceMode mode,
423                          const CPDF_RenderOptions* pOptions);
424
425   FX_BOOL DrawInContext(const CPDF_Page* pPage,
426                         const CPDF_RenderContext* pContext,
427                         const CFX_AffineMatrix* pUser2Device,
428                         AppearanceMode mode);
429
430   void ClearCachedAP();
431
432   void DrawBorder(CFX_RenderDevice* pDevice,
433                   const CFX_AffineMatrix* pUser2Device,
434                   const CPDF_RenderOptions* pOptions);
435
436   CPDF_Form* GetAPForm(const CPDF_Page* pPage, AppearanceMode mode);
437
438  private:
439   CPDF_Dictionary* const m_pAnnotDict;
440
441   CPDF_AnnotList* const m_pList;
442
443   const CFX_ByteString m_sSubtype;
444
445   CFX_MapPtrToPtr m_APMap;
446 };
447
448 class CPDF_AnnotList {
449  public:
450   CPDF_AnnotList(CPDF_Page* pPage);
451
452   ~CPDF_AnnotList();
453
454   void GetAnnotMatrix(const CPDF_Dictionary* pAnnotDict,
455                       const CFX_Matrix* pUser2Device,
456                       CFX_Matrix& matrix) const;
457
458   void GetAnnotRect(const CPDF_Dictionary* pAnnotDict,
459                     const CFX_Matrix* pUser2Device,
460                     CPDF_Rect& rtAnnot) const;
461
462   void DisplayAnnots(const CPDF_Page* pPage,
463                      CFX_RenderDevice* pDevice,
464                      CFX_AffineMatrix* pMatrix,
465                      FX_BOOL bShowWidget,
466                      CPDF_RenderOptions* pOptions);
467
468   void DisplayAnnots(const CPDF_Page* pPage,
469                      CPDF_RenderContext* pContext,
470                      FX_BOOL bPrinting,
471                      CFX_AffineMatrix* pMatrix,
472                      FX_BOOL bShowWidget,
473                      CPDF_RenderOptions* pOptions) {
474     DisplayAnnots(pPage, NULL, pContext, bPrinting, pMatrix,
475                   bShowWidget ? 3 : 1, pOptions, NULL);
476   }
477
478   void DisplayAnnots(const CPDF_Page* pPage,
479                      CPDF_RenderContext* pContext,
480                      FX_BOOL bPrinting,
481                      CFX_AffineMatrix* pMatrix,
482                      FX_BOOL bShowWidget,
483                      CPDF_RenderOptions* pOptions,
484                      FX_RECT* pClipRect) {
485     DisplayAnnots(pPage, NULL, pContext, bPrinting, pMatrix,
486                   bShowWidget ? 3 : 1, pOptions, pClipRect);
487   }
488
489   void DisplayAnnots(const CPDF_Page* pPage,
490                      CFX_RenderDevice* pDevice,
491                      CPDF_RenderContext* pContext,
492                      FX_BOOL bPrinting,
493                      CFX_AffineMatrix* pMatrix,
494                      FX_DWORD dwAnnotFlags,
495                      CPDF_RenderOptions* pOptions,
496                      FX_RECT* pClipRect);
497
498   CPDF_Annot* GetAt(int index) { return (CPDF_Annot*)m_AnnotList.GetAt(index); }
499
500   int Count() { return m_AnnotList.GetSize(); }
501
502   int GetIndex(CPDF_Annot* pAnnot);
503
504   CPDF_Document* GetDocument() const { return m_pDocument; }
505
506  protected:
507   CFX_PtrArray m_AnnotList;
508
509   CPDF_Dictionary* m_pPageDict;
510
511   CPDF_Document* m_pDocument;
512
513   CFX_PtrArray m_Borders;
514
515   void DisplayPass(const CPDF_Page* pPage,
516                    CFX_RenderDevice* pDevice,
517                    CPDF_RenderContext* pContext,
518                    FX_BOOL bPrinting,
519                    CFX_AffineMatrix* pMatrix,
520                    FX_BOOL bWidget,
521                    CPDF_RenderOptions* pOptions,
522                    FX_RECT* clip_rect);
523   friend class CPDF_Annot;
524 };
525 #define COLORTYPE_TRANSPARENT 0
526 #define COLORTYPE_GRAY 1
527 #define COLORTYPE_RGB 2
528 #define COLORTYPE_CMYK 3
529 class CPDF_DefaultAppearance {
530  public:
531   CPDF_DefaultAppearance(const CFX_ByteString& csDA = "") { m_csDA = csDA; }
532
533   CPDF_DefaultAppearance(const CPDF_DefaultAppearance& cDA) {
534     m_csDA = (CFX_ByteString)(CPDF_DefaultAppearance&)cDA;
535   }
536
537   operator CFX_ByteString() const { return m_csDA; }
538
539   const CPDF_DefaultAppearance& operator=(const CFX_ByteString& csDA) {
540     m_csDA = csDA;
541     return *this;
542   }
543
544   const CPDF_DefaultAppearance& operator=(const CPDF_DefaultAppearance& cDA) {
545     m_csDA = (CFX_ByteString)(CPDF_DefaultAppearance&)cDA;
546     return *this;
547   }
548
549   FX_BOOL HasFont();
550
551   CFX_ByteString GetFontString();
552
553   void GetFont(CFX_ByteString& csFontNameTag, FX_FLOAT& fFontSize);
554
555   FX_BOOL HasColor(FX_BOOL bStrokingOperation = FALSE);
556
557   CFX_ByteString GetColorString(FX_BOOL bStrokingOperation = FALSE);
558
559   void GetColor(int& iColorType,
560                 FX_FLOAT fc[4],
561                 FX_BOOL bStrokingOperation = FALSE);
562
563   void GetColor(FX_ARGB& color,
564                 int& iColorType,
565                 FX_BOOL bStrokingOperation = FALSE);
566
567   FX_BOOL HasTextMatrix();
568
569   CFX_ByteString GetTextMatrixString();
570
571   CFX_AffineMatrix GetTextMatrix();
572
573  protected:
574   CFX_ByteString m_csDA;
575 };
576 #define FIELDTYPE_UNKNOWN 0
577 #define FIELDTYPE_PUSHBUTTON 1
578 #define FIELDTYPE_CHECKBOX 2
579 #define FIELDTYPE_RADIOBUTTON 3
580 #define FIELDTYPE_COMBOBOX 4
581 #define FIELDTYPE_LISTBOX 5
582 #define FIELDTYPE_TEXTFIELD 6
583 #define FIELDTYPE_SIGNATURE 7
584 class CPDF_InterForm : public CFX_PrivateData {
585  public:
586   CPDF_InterForm(CPDF_Document* pDocument, FX_BOOL bUpdateAP);
587   ~CPDF_InterForm();
588
589   static void EnableUpdateAP(FX_BOOL bUpdateAP);
590
591   static FX_BOOL UpdatingAPEnabled();
592
593   static CFX_ByteString GenerateNewResourceName(const CPDF_Dictionary* pResDict,
594                                                 const FX_CHAR* csType,
595                                                 int iMinLen = 2,
596                                                 const FX_CHAR* csPrefix = "");
597
598   static CPDF_Font* AddSystemDefaultFont(const CPDF_Document* pDocument);
599
600   static CPDF_Font* AddSystemFont(const CPDF_Document* pDocument,
601                                   CFX_ByteString csFontName,
602                                   uint8_t iCharSet = 1);
603
604   static CPDF_Font* AddSystemFont(const CPDF_Document* pDocument,
605                                   CFX_WideString csFontName,
606                                   uint8_t iCharSet = 1);
607
608   static CPDF_Font* AddStandardFont(const CPDF_Document* pDocument,
609                                     CFX_ByteString csFontName);
610
611   static CFX_ByteString GetNativeFont(uint8_t iCharSet, void* pLogFont = NULL);
612
613   static CFX_ByteString GetNativeFont(void* pLogFont = NULL);
614
615   static uint8_t GetNativeCharSet();
616
617   static CPDF_Font* AddNativeFont(uint8_t iCharSet,
618                                   const CPDF_Document* pDocument);
619
620   static CPDF_Font* AddNativeFont(const CPDF_Document* pDocument);
621
622   FX_BOOL ValidateFieldName(CFX_WideString& csNewFieldName, int iType);
623
624   FX_BOOL ValidateFieldName(const CPDF_FormField* pField,
625                             CFX_WideString& csNewFieldName);
626
627   FX_BOOL ValidateFieldName(const CPDF_FormControl* pControl,
628                             CFX_WideString& csNewFieldName);
629
630   FX_DWORD CountFields(const CFX_WideString& csFieldName = L"");
631
632   CPDF_FormField* GetField(FX_DWORD index,
633                            const CFX_WideString& csFieldName = L"");
634
635   void GetAllFieldNames(CFX_WideStringArray& allFieldNames);
636
637   FX_BOOL IsValidFormField(const void* pField);
638
639   CPDF_FormField* GetFieldByDict(CPDF_Dictionary* pFieldDict) const;
640
641   CPDF_FormControl* GetControlAtPoint(CPDF_Page* pPage,
642                                       FX_FLOAT pdf_x,
643                                       FX_FLOAT pdf_y,
644                                       int* z_order) const;
645
646   CPDF_FormControl* GetControlByDict(CPDF_Dictionary* pWidgetDict) const;
647
648   CPDF_Document* GetDocument() const { return m_pDocument; }
649
650   CPDF_Dictionary* GetFormDict() const { return m_pFormDict; }
651
652   FX_BOOL NeedConstructAP();
653
654   void NeedConstructAP(FX_BOOL bNeedAP);
655
656   int CountFieldsInCalculationOrder();
657
658   CPDF_FormField* GetFieldInCalculationOrder(int index);
659
660   int FindFieldInCalculationOrder(const CPDF_FormField* pField);
661
662   FX_DWORD CountFormFonts();
663
664   CPDF_Font* GetFormFont(FX_DWORD index, CFX_ByteString& csNameTag);
665
666   CPDF_Font* GetFormFont(CFX_ByteString csNameTag);
667
668   CPDF_Font* GetFormFont(CFX_ByteString csFontName, CFX_ByteString& csNameTag);
669
670   CPDF_Font* GetNativeFormFont(uint8_t iCharSet, CFX_ByteString& csNameTag);
671
672   CPDF_Font* GetNativeFormFont(CFX_ByteString& csNameTag);
673
674   FX_BOOL FindFormFont(const CPDF_Font* pFont, CFX_ByteString& csNameTag);
675
676   FX_BOOL FindFormFont(CFX_ByteString csFontName,
677                        CPDF_Font*& pFont,
678                        CFX_ByteString& csNameTag);
679
680   inline FX_BOOL FindFormFont(CFX_WideString csFontName,
681                               CPDF_Font*& pFont,
682                               CFX_ByteString& csNameTag) {
683     return FindFormFont(PDF_EncodeText(csFontName), pFont, csNameTag);
684   }
685
686   void AddFormFont(const CPDF_Font* pFont, CFX_ByteString& csNameTag);
687
688   CPDF_Font* AddNativeFormFont(uint8_t iCharSet, CFX_ByteString& csNameTag);
689
690   CPDF_Font* AddNativeFormFont(CFX_ByteString& csNameTag);
691
692   void RemoveFormFont(const CPDF_Font* pFont);
693
694   void RemoveFormFont(CFX_ByteString csNameTag);
695
696   CPDF_DefaultAppearance GetDefaultAppearance();
697
698   CPDF_Font* GetDefaultFormFont();
699
700   int GetFormAlignment();
701
702   CPDF_FormField* CheckRequiredFields(const CFX_PtrArray* fields = NULL,
703                                       FX_BOOL bIncludeOrExclude = TRUE) const;
704
705   CFDF_Document* ExportToFDF(const CFX_WideStringC& pdf_path,
706                              FX_BOOL bSimpleFileSpec = FALSE) const;
707
708   CFDF_Document* ExportToFDF(const CFX_WideStringC& pdf_path,
709                              CFX_PtrArray& fields,
710                              FX_BOOL bIncludeOrExclude = TRUE,
711                              FX_BOOL bSimpleFileSpec = FALSE) const;
712
713   FX_BOOL ImportFromFDF(const CFDF_Document* pFDFDoc, FX_BOOL bNotify = FALSE);
714
715   FX_BOOL ResetForm(const CFX_PtrArray& fields,
716                     FX_BOOL bIncludeOrExclude = TRUE,
717                     FX_BOOL bNotify = FALSE);
718
719   FX_BOOL ResetForm(FX_BOOL bNotify = FALSE);
720
721   CPDF_FormNotify* GetFormNotify() const { return m_pFormNotify; }
722
723   void SetFormNotify(const CPDF_FormNotify* pNotify);
724
725   FX_BOOL IsUpdated() { return m_bUpdated; }
726
727   void ClearUpdatedFlag() { m_bUpdated = FALSE; }
728
729   FX_BOOL HasXFAForm() const;
730
731   void FixPageFields(const CPDF_Page* pPage);
732
733  protected:
734   static FX_BOOL m_bUpdateAP;
735
736   void LoadField(CPDF_Dictionary* pFieldDict, int nLevel = 0);
737
738   CPDF_Object* GetFieldAttr(CPDF_Dictionary* pFieldDict, const FX_CHAR* name);
739
740   CPDF_FormField* AddTerminalField(const CPDF_Dictionary* pFieldDict);
741
742   CPDF_FormControl* AddControl(const CPDF_FormField* pField,
743                                const CPDF_Dictionary* pWidgetDict);
744
745   void FDF_ImportField(CPDF_Dictionary* pField,
746                        const CFX_WideString& parent_name,
747                        FX_BOOL bNotify = FALSE,
748                        int nLevel = 0);
749
750   FX_BOOL ValidateFieldName(CFX_WideString& csNewFieldName,
751                             int iType,
752                             const CPDF_FormField* pExcludedField,
753                             const CPDF_FormControl* pExcludedControl);
754
755   int CompareFieldName(const CFX_WideString& name1,
756                        const CFX_WideString& name2);
757
758   int CompareFieldName(const CFX_ByteString& name1,
759                        const CFX_ByteString& name2);
760
761   CPDF_Document* m_pDocument;
762
763   FX_BOOL m_bGenerateAP;
764
765   CPDF_Dictionary* m_pFormDict;
766
767   std::map<const CPDF_Dictionary*, CPDF_FormControl*> m_ControlMap;
768
769   CFieldTree* m_pFieldTree;
770
771   CFX_ByteString m_bsEncoding;
772
773   CPDF_FormNotify* m_pFormNotify;
774
775   FX_BOOL m_bUpdated;
776   friend class CPDF_FormControl;
777   friend class CPDF_FormField;
778 };
779 #define FORMFIELD_READONLY 0x01
780 #define FORMFIELD_REQUIRED 0x02
781 #define FORMFIELD_NOEXPORT 0x04
782 #define FORMRADIO_NOTOGGLEOFF 0x100
783 #define FORMRADIO_UNISON 0x200
784 #define FORMTEXT_MULTILINE 0x100
785 #define FORMTEXT_PASSWORD 0x200
786 #define FORMTEXT_NOSCROLL 0x400
787 #define FORMTEXT_COMB 0x800
788 #define FORMCOMBO_EDIT 0x100
789 #define FORMLIST_MULTISELECT 0x100
790 class CPDF_FormField {
791  public:
792   enum Type {
793     Unknown,
794     PushButton,
795     RadioButton,
796     CheckBox,
797     Text,
798     RichText,
799     File,
800     ListBox,
801     ComboBox,
802     Sign
803   };
804
805   CFX_WideString GetFullName();
806
807   Type GetType() { return m_Type; }
808
809   FX_DWORD GetFlags() { return m_Flags; }
810
811   CPDF_Dictionary* GetFieldDict() const { return m_pDict; }
812
813   void SetFieldDict(CPDF_Dictionary* pDict) { m_pDict = pDict; }
814
815   FX_BOOL ResetField(FX_BOOL bNotify = FALSE);
816
817   int CountControls() { return m_ControlList.GetSize(); }
818
819   CPDF_FormControl* GetControl(int index) {
820     return (CPDF_FormControl*)m_ControlList.GetAt(index);
821   }
822
823   int GetControlIndex(const CPDF_FormControl* pControl);
824
825   int GetFieldType();
826
827   CPDF_AAction GetAdditionalAction();
828
829   CFX_WideString GetAlternateName();
830
831   CFX_WideString GetMappingName();
832
833   FX_DWORD GetFieldFlags();
834
835   CFX_ByteString GetDefaultStyle();
836
837   CFX_WideString GetRichTextString();
838
839   CFX_WideString GetValue();
840
841   CFX_WideString GetDefaultValue();
842
843   FX_BOOL SetValue(const CFX_WideString& value, FX_BOOL bNotify = FALSE);
844
845   int GetMaxLen();
846
847   int CountSelectedItems();
848
849   int GetSelectedIndex(int index);
850
851   FX_BOOL ClearSelection(FX_BOOL bNotify = FALSE);
852
853   FX_BOOL IsItemSelected(int index);
854
855   FX_BOOL SetItemSelection(int index,
856                            FX_BOOL bSelected,
857                            FX_BOOL bNotify = FALSE);
858
859   FX_BOOL IsItemDefaultSelected(int index);
860
861   int GetDefaultSelectedItem();
862
863   int CountOptions();
864
865   CFX_WideString GetOptionLabel(int index);
866
867   CFX_WideString GetOptionValue(int index);
868
869   int FindOption(CFX_WideString csOptLabel);
870
871   int FindOptionValue(const CFX_WideString& csOptValue, int iStartIndex = 0);
872
873   FX_BOOL CheckControl(int iControlIndex,
874                        FX_BOOL bChecked,
875                        FX_BOOL bNotify = FALSE);
876
877   int GetTopVisibleIndex();
878
879   int CountSelectedOptions();
880
881   int GetSelectedOptionIndex(int index);
882
883   FX_BOOL IsOptionSelected(int iOptIndex);
884
885   FX_BOOL SelectOption(int iOptIndex,
886                        FX_BOOL bSelected,
887                        FX_BOOL bNotify = FALSE);
888
889   FX_BOOL ClearSelectedOptions(FX_BOOL bNotify = FALSE);
890
891   FX_FLOAT GetFontSize() { return m_FontSize; }
892
893   CPDF_Font* GetFont() { return m_pFont; }
894
895  protected:
896   CPDF_FormField(CPDF_InterForm* pForm, CPDF_Dictionary* pDict);
897
898   ~CPDF_FormField();
899
900   CPDF_FormField::Type m_Type;
901
902   FX_DWORD m_Flags;
903
904   CPDF_InterForm* m_pForm;
905
906   CPDF_Dictionary* m_pDict;
907
908   CFX_PtrArray m_ControlList;
909   friend class CPDF_InterForm;
910   friend class CPDF_FormControl;
911
912   CFX_WideString GetValue(FX_BOOL bDefault);
913
914   FX_BOOL SetValue(const CFX_WideString& value,
915                    FX_BOOL bDefault,
916                    FX_BOOL bNotify);
917
918   void SyncFieldFlags();
919
920   int FindListSel(CPDF_String* str);
921
922   CFX_WideString GetOptionText(int index, int sub_index);
923
924   void LoadDA();
925
926   void UpdateAP(CPDF_FormControl* pControl);
927
928   CFX_WideString GetCheckValue(FX_BOOL bDefault);
929
930   FX_BOOL SetCheckValue(const CFX_WideString& value,
931                         FX_BOOL bDefault,
932                         FX_BOOL bNotify);
933
934   FX_FLOAT m_FontSize;
935
936   CPDF_Font* m_pFont;
937 };
938 CPDF_Object* FPDF_GetFieldAttr(CPDF_Dictionary* pFieldDict,
939                                const FX_CHAR* name,
940                                int nLevel = 0);
941 class CPDF_IconFit {
942  public:
943   CPDF_IconFit(CPDF_Dictionary* pDict = NULL) { m_pDict = pDict; }
944
945   operator CPDF_Dictionary*() const { return m_pDict; }
946
947   enum ScaleMethod { Always = 0, Bigger, Smaller, Never };
948
949   ScaleMethod GetScaleMethod();
950
951   FX_BOOL IsProportionalScale();
952
953   void GetIconPosition(FX_FLOAT& fLeft, FX_FLOAT& fBottom);
954
955   FX_BOOL GetFittingBounds();
956
957   CPDF_Dictionary* m_pDict;
958 };
959
960 #define TEXTPOS_CAPTION 0
961 #define TEXTPOS_ICON 1
962 #define TEXTPOS_BELOW 2
963 #define TEXTPOS_ABOVE 3
964 #define TEXTPOS_RIGHT 4
965 #define TEXTPOS_LEFT 5
966 #define TEXTPOS_OVERLAID 6
967 class CPDF_FormControl {
968  public:
969   CPDF_FormField::Type GetType() { return m_pField->GetType(); }
970
971   CPDF_InterForm* GetInterForm() const { return m_pForm; }
972
973   CPDF_FormField* GetField() const { return m_pField; }
974
975   CPDF_Dictionary* GetWidget() const { return m_pWidgetDict; }
976
977   CFX_FloatRect GetRect() const;
978
979   void DrawControl(CFX_RenderDevice* pDevice,
980                    CFX_AffineMatrix* pMatrix,
981                    CPDF_Page* pPage,
982                    CPDF_Annot::AppearanceMode mode,
983                    const CPDF_RenderOptions* pOptions = NULL);
984
985   CFX_ByteString GetCheckedAPState();
986
987   CFX_WideString GetExportValue();
988
989   FX_BOOL IsChecked();
990
991   FX_BOOL IsDefaultChecked();
992
993   enum HighlightingMode { None = 0, Invert, Outline, Push, Toggle };
994
995   HighlightingMode GetHighlightingMode();
996
997   FX_BOOL HasMKEntry(CFX_ByteString csEntry);
998
999   int GetRotation();
1000
1001   inline FX_ARGB GetBorderColor(int& iColorType) {
1002     return GetColor(iColorType, "BC");
1003   }
1004
1005   inline FX_FLOAT GetOriginalBorderColor(int index) {
1006     return GetOriginalColor(index, "BC");
1007   }
1008
1009   inline void GetOriginalBorderColor(int& iColorType, FX_FLOAT fc[4]) {
1010     GetOriginalColor(iColorType, fc, "BC");
1011   }
1012
1013   inline FX_ARGB GetBackgroundColor(int& iColorType) {
1014     return GetColor(iColorType, "BG");
1015   }
1016
1017   inline FX_FLOAT GetOriginalBackgroundColor(int index) {
1018     return GetOriginalColor(index, "BG");
1019   }
1020
1021   inline void GetOriginalBackgroundColor(int& iColorType, FX_FLOAT fc[4]) {
1022     GetOriginalColor(iColorType, fc, "BG");
1023   }
1024
1025   inline CFX_WideString GetNormalCaption() { return GetCaption("CA"); }
1026
1027   inline CFX_WideString GetRolloverCaption() { return GetCaption("RC"); }
1028
1029   inline CFX_WideString GetDownCaption() { return GetCaption("AC"); }
1030
1031   inline CPDF_Stream* GetNormalIcon() { return GetIcon("I"); }
1032
1033   inline CPDF_Stream* GetRolloverIcon() { return GetIcon("RI"); }
1034
1035   inline CPDF_Stream* GetDownIcon() { return GetIcon("IX"); }
1036
1037   CPDF_IconFit GetIconFit();
1038
1039   int GetTextPosition();
1040
1041   CPDF_Action GetAction();
1042
1043   CPDF_AAction GetAdditionalAction();
1044
1045   CPDF_DefaultAppearance GetDefaultAppearance();
1046
1047   CPDF_Font* GetDefaultControlFont();
1048
1049   int GetControlAlignment();
1050
1051  protected:
1052   CPDF_FormControl(CPDF_FormField* pField, CPDF_Dictionary* pWidgetDict);
1053
1054   CFX_ByteString GetOnStateName();
1055
1056   void SetOnStateName(const CFX_ByteString& csOn);
1057
1058   void CheckControl(FX_BOOL bChecked);
1059
1060   FX_ARGB GetColor(int& iColorType, CFX_ByteString csEntry);
1061
1062   FX_FLOAT GetOriginalColor(int index, CFX_ByteString csEntry);
1063
1064   void GetOriginalColor(int& iColorType,
1065                         FX_FLOAT fc[4],
1066                         CFX_ByteString csEntry);
1067
1068   CFX_WideString GetCaption(CFX_ByteString csEntry);
1069
1070   CPDF_Stream* GetIcon(CFX_ByteString csEntry);
1071
1072   CPDF_ApSettings GetMK(FX_BOOL bCreate);
1073
1074   CPDF_InterForm* m_pForm;
1075
1076   CPDF_FormField* m_pField;
1077
1078   CPDF_Dictionary* m_pWidgetDict;
1079   friend class CPDF_InterForm;
1080   friend class CPDF_FormField;
1081 };
1082 class CPDF_FormNotify {
1083  public:
1084   virtual ~CPDF_FormNotify() {}
1085
1086   virtual int BeforeValueChange(const CPDF_FormField* pField,
1087                                 CFX_WideString& csValue) {
1088     return 0;
1089   }
1090
1091   virtual int AfterValueChange(const CPDF_FormField* pField) { return 0; }
1092
1093   virtual int BeforeSelectionChange(const CPDF_FormField* pField,
1094                                     CFX_WideString& csValue) {
1095     return 0;
1096   }
1097
1098   virtual int AfterSelectionChange(const CPDF_FormField* pField) { return 0; }
1099
1100   virtual int AfterCheckedStatusChange(const CPDF_FormField* pField,
1101                                        const CFX_ByteArray& statusArray) {
1102     return 0;
1103   }
1104
1105   virtual int BeforeFormReset(const CPDF_InterForm* pForm) { return 0; }
1106
1107   virtual int AfterFormReset(const CPDF_InterForm* pForm) { return 0; }
1108
1109   virtual int BeforeFormImportData(const CPDF_InterForm* pForm) { return 0; }
1110
1111   virtual int AfterFormImportData(const CPDF_InterForm* pForm) { return 0; }
1112 };
1113 FX_BOOL FPDF_GenerateAP(CPDF_Document* pDoc, CPDF_Dictionary* pAnnotDict);
1114 class CPDF_PageLabel {
1115  public:
1116   CPDF_PageLabel(CPDF_Document* pDocument) { m_pDocument = pDocument; }
1117
1118   CFX_WideString GetLabel(int nPage) const;
1119
1120   int32_t GetPageByLabel(const CFX_ByteStringC& bsLabel) const;
1121
1122   int32_t GetPageByLabel(const CFX_WideStringC& wsLabel) const;
1123
1124  protected:
1125   CPDF_Document* m_pDocument;
1126 };
1127
1128 class CPDF_Metadata {
1129  public:
1130   explicit CPDF_Metadata(CPDF_Document* pDoc);
1131   ~CPDF_Metadata();
1132
1133   const CXML_Element* GetRoot() const;
1134
1135  private:
1136   nonstd::unique_ptr<CXML_Element> m_pXmlElement;
1137 };
1138
1139 class CPDF_ViewerPreferences {
1140  public:
1141   CPDF_ViewerPreferences(CPDF_Document* pDoc);
1142
1143   ~CPDF_ViewerPreferences();
1144
1145   FX_BOOL IsDirectionR2L() const;
1146
1147   FX_BOOL PrintScaling() const;
1148
1149   int32_t NumCopies() const;
1150
1151   CPDF_Array* PrintPageRange() const;
1152
1153   CFX_ByteString Duplex() const;
1154
1155  protected:
1156   CPDF_Document* m_pDoc;
1157 };
1158 class CPDF_ApSettings {
1159  public:
1160   CPDF_ApSettings(CPDF_Dictionary* pDict = NULL) { m_pDict = pDict; }
1161
1162   operator CPDF_Dictionary*() const { return m_pDict; }
1163
1164   FX_BOOL HasMKEntry(const CFX_ByteStringC& csEntry);
1165
1166   int GetRotation();
1167
1168   inline FX_ARGB GetBorderColor(int& iColorType) {
1169     return GetColor(iColorType, FX_BSTRC("BC"));
1170   }
1171
1172   inline FX_FLOAT GetOriginalBorderColor(int index) {
1173     return GetOriginalColor(index, FX_BSTRC("BC"));
1174   }
1175
1176   inline void GetOriginalBorderColor(int& iColorType, FX_FLOAT fc[4]) {
1177     GetOriginalColor(iColorType, fc, FX_BSTRC("BC"));
1178   }
1179
1180   inline FX_ARGB GetBackgroundColor(int& iColorType) {
1181     return GetColor(iColorType, FX_BSTRC("BG"));
1182   }
1183
1184   inline FX_FLOAT GetOriginalBackgroundColor(int index) {
1185     return GetOriginalColor(index, FX_BSTRC("BG"));
1186   }
1187
1188   inline void GetOriginalBackgroundColor(int& iColorType, FX_FLOAT fc[4]) {
1189     GetOriginalColor(iColorType, fc, FX_BSTRC("BG"));
1190   }
1191
1192   inline CFX_WideString GetNormalCaption() {
1193     return GetCaption(FX_BSTRC("CA"));
1194   }
1195
1196   inline CFX_WideString GetRolloverCaption() {
1197     return GetCaption(FX_BSTRC("RC"));
1198   }
1199
1200   inline CFX_WideString GetDownCaption() { return GetCaption(FX_BSTRC("AC")); }
1201
1202   inline CPDF_Stream* GetNormalIcon() { return GetIcon(FX_BSTRC("I")); }
1203
1204   inline CPDF_Stream* GetRolloverIcon() { return GetIcon(FX_BSTRC("RI")); }
1205
1206   inline CPDF_Stream* GetDownIcon() { return GetIcon(FX_BSTRC("IX")); }
1207
1208   CPDF_IconFit GetIconFit();
1209
1210   int GetTextPosition();
1211
1212   CPDF_Dictionary* m_pDict;
1213
1214  protected:
1215   FX_ARGB GetColor(int& iColorType, const CFX_ByteStringC& csEntry);
1216
1217   FX_FLOAT GetOriginalColor(int index, const CFX_ByteStringC& csEntry);
1218
1219   void GetOriginalColor(int& iColorType,
1220                         FX_FLOAT fc[4],
1221                         const CFX_ByteStringC& csEntry);
1222
1223   CFX_WideString GetCaption(const CFX_ByteStringC& csEntry);
1224
1225   CPDF_Stream* GetIcon(const CFX_ByteStringC& csEntry);
1226   friend class CPDF_FormControl;
1227 };
1228
1229 #endif  // CORE_INCLUDE_FPDFDOC_FPDF_DOC_H_