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