307a31cd203305fce2a6a4291f550c0c8ea458d9
[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 "../fpdfapi/fpdf_parser.h"
11 #include "../fpdfapi/fpdf_render.h"
12
13 class CFieldTree;
14 class CPDF_AAction;
15 class CPDF_Action;
16 class CPDF_ActionFields;
17 class CPDF_Annot;
18 class CPDF_AnnotList;
19 class CPDF_ApSettings;
20 class CPDF_Bookmark;
21 class CPDF_BookmarkTree;
22 class CPDF_DefaultAppearance;
23 class CPDF_Dest;
24 class CPDF_DocJSActions;
25 class CPDF_FileSpec;
26 class CPDF_FormControl;
27 class CPDF_FormField;
28 class CPDF_FormNotify;
29 class CPDF_IconFit;
30 class CPDF_InterForm;
31 class CPDF_Link;
32 class CPDF_LinkList;
33 class CPDF_LWinParam;
34 class CPDF_Metadata;
35 class CPDF_NumberTree;
36 class CPDF_OCContext;
37 class CPDF_Page;
38 class CPDF_RenderOptions;
39 class CPDF_TextObject;
40 class CPDF_ViewerPreferences;
41 class CXML_Element;
42
43 class CPDF_NameTree
44 {
45 public:
46
47     CPDF_NameTree(CPDF_Dictionary* pRoot)
48     {
49         m_pRoot = pRoot;
50     }
51
52     CPDF_NameTree(CPDF_Document* pDoc, FX_BSTR category);
53
54     CPDF_Object*                LookupValue(int nIndex, CFX_ByteString& csName) const;
55
56     CPDF_Object*                LookupValue(const CFX_ByteString& csName) const;
57
58     CPDF_Array*                 LookupNamedDest(CPDF_Document* pDoc, FX_BSTR sName);
59
60     int                                 GetIndex(const CFX_ByteString& csName) const;
61
62     int                                 GetCount() const;
63
64
65     CPDF_Dictionary*    GetRoot() const
66     {
67         return m_pRoot;
68     }
69
70 protected:
71
72     CPDF_Dictionary*            m_pRoot;
73 };
74 class CPDF_BookmarkTree
75 {
76 public:
77     CPDF_BookmarkTree(CPDF_Document* pDoc) : m_pDocument(pDoc) {}
78
79     CPDF_Bookmark               GetFirstChild(const CPDF_Bookmark& parent) const;
80
81     CPDF_Bookmark               GetNextSibling(const CPDF_Bookmark& bookmark) const;
82
83     CPDF_Document*              GetDocument() const { return m_pDocument; }
84
85 protected:
86     CPDF_Document*              m_pDocument;
87 };
88 #define PDFBOOKMARK_ITALIC                      1
89 #define PDFBOOKMARK_BOLD                        2
90 class CPDF_Bookmark
91 {
92 public:
93
94     CPDF_Bookmark() : m_pDict(NULL) {}
95
96     explicit CPDF_Bookmark(CPDF_Dictionary* pDict) : m_pDict(pDict) {}
97
98     CPDF_Dictionary* GetDict() const { return m_pDict; }
99
100     operator bool() const { return m_pDict != NULL; }
101
102     FX_DWORD                    GetColorRef() const;
103
104     FX_DWORD                    GetFontStyle() const;
105
106     CFX_WideString              GetTitle() const;
107
108     CPDF_Dest                   GetDest(CPDF_Document* pDocument) const;
109
110     CPDF_Action                 GetAction() const;
111
112     CPDF_Dictionary*    m_pDict;
113 };
114 #define PDFZOOM_XYZ                                     1
115 #define PDFZOOM_FITPAGE                         2
116 #define PDFZOOM_FITHORZ                         3
117 #define PDFZOOM_FITVERT                         4
118 #define PDFZOOM_FITRECT                         5
119 #define PDFZOOM_FITBBOX                         6
120 #define PDFZOOM_FITBHORZ                        7
121 #define PDFZOOM_FITBVERT                        8
122 class CPDF_Dest
123 {
124 public:
125     CPDF_Dest() : m_pObj(nullptr) { }
126     explicit CPDF_Dest(CPDF_Object* pObj) : m_pObj(pObj) { }
127
128     operator bool () const { return m_pObj != NULL; }
129     CPDF_Object* GetObject() const { return m_pObj; }
130
131     CFX_ByteString              GetRemoteName();
132     int                                 GetPageIndex(CPDF_Document* pDoc);
133     FX_DWORD                    GetPageObjNum();
134     int                                 GetZoomMode();
135     FX_FLOAT                    GetParam(int index);
136
137 protected:
138     CPDF_Object*                m_pObj;
139 };
140 class CPDF_OCContext : public IPDF_OCContext
141 {
142 public:
143
144     enum UsageType {
145         View = 0,
146         Design,
147         Print,
148         Export
149     };
150
151     CPDF_OCContext(CPDF_Document *pDoc, UsageType eUsageType = View);
152
153     virtual ~CPDF_OCContext();
154
155     CPDF_Document*      GetDocument() const
156     {
157         return m_pDocument;
158     }
159
160     UsageType           GetUsageType() const
161     {
162         return m_eUsageType;
163     }
164
165     FX_BOOL                     CheckOCGVisible(const CPDF_Dictionary *pOCGDict);
166
167     void                        ResetOCContext();
168 protected:
169
170     FX_BOOL                     LoadOCGStateFromConfig(FX_BSTR csConfig, const CPDF_Dictionary *pOCGDict, FX_BOOL &bValidConfig) const;
171
172     FX_BOOL                     LoadOCGState(const CPDF_Dictionary *pOCGDict) const;
173
174     FX_BOOL                     GetOCGVisible(const CPDF_Dictionary *pOCGDict);
175
176     FX_BOOL                     GetOCGVE(CPDF_Array *pExpression, FX_BOOL bFromConfig, int nLevel = 0);
177
178     FX_BOOL                     LoadOCMDState(const CPDF_Dictionary *pOCMDDict, FX_BOOL bFromConfig);
179
180     CPDF_Document               *m_pDocument;
181
182     UsageType                   m_eUsageType;
183
184     CFX_MapPtrTemplate<const CPDF_Dictionary*, void*>   m_OCGStates;
185 };
186 class CPDF_LWinParam
187 {
188 public:
189
190     CPDF_LWinParam(CPDF_Dictionary* pDict)
191     {
192         m_pDict = pDict;
193     }
194
195     operator CPDF_Dictionary* () const
196     {
197         return m_pDict;
198     }
199
200     inline CFX_ByteString       GetFileName()
201     {
202         return m_pDict->GetString("F");
203     }
204
205
206     inline CFX_ByteString       GetDefaultDirectory()
207     {
208         return m_pDict->GetString("D");
209     }
210
211
212     inline CFX_ByteString       GetOperation()
213     {
214         return m_pDict->GetString("O");
215     }
216
217
218     inline CFX_ByteString       GetParameter()
219     {
220         return m_pDict->GetString("P");
221     }
222
223     CPDF_Dictionary*            m_pDict;
224 };
225 class CPDF_ActionFields
226 {
227 public:
228
229     CPDF_ActionFields(const CPDF_Action* pAction)
230     {
231         m_pAction = (CPDF_Action*)pAction;
232     }
233
234     operator CPDF_Action*() const
235     {
236         return m_pAction;
237     }
238
239     FX_DWORD                            GetFieldsCount() const;
240
241     void                                        GetAllFields(CFX_PtrArray& fieldObjects) const;
242
243     CPDF_Object*                        GetField(FX_DWORD iIndex) const;
244
245     CPDF_Action*                        m_pAction;
246 };
247
248 #define PDFNAMED_NEXTPAGE               1
249 #define PDFNAMED_PREVPAGE               2
250 #define PDFNAMED_FIRSTPAGE              3
251 #define PDFNAMED_LASTPAGE               4
252 #define PDFJS_MAXLENGTH                 64
253 class CPDF_Action
254 {
255 public:
256     enum ActionType {
257         Unknown = 0,
258         GoTo,
259         GoToR,
260         GoToE,
261         Launch,
262         Thread,
263         URI,
264         Sound,
265         Movie,
266         Hide,
267         Named,
268         SubmitForm,
269         ResetForm,
270         ImportData,
271         JavaScript,
272         SetOCGState,
273         Rendition,
274         Trans,
275         GoTo3DView
276     };
277
278     CPDF_Action() : m_pDict(nullptr) { }
279     explicit CPDF_Action(CPDF_Dictionary* pDict) : m_pDict(pDict) { }
280
281     operator bool () const { return m_pDict != NULL; }
282
283     CPDF_Dictionary* GetDict() const { return m_pDict; }
284
285     CFX_ByteString              GetTypeName() const
286     {
287         return m_pDict->GetString("S");
288     }
289
290     ActionType                  GetType() const;
291
292     CPDF_Dest                   GetDest(CPDF_Document* pDoc) const;
293
294     CFX_WideString              GetFilePath() const;
295
296     FX_BOOL                             GetNewWindow() const
297     {
298         return m_pDict->GetBoolean("NewWindow");
299     }
300
301     CPDF_LWinParam              GetWinParam() const;
302
303     CFX_ByteString              GetURI(CPDF_Document* pDoc) const;
304
305     FX_BOOL                             GetMouseMap() const
306     {
307         return m_pDict->GetBoolean("IsMap");
308     }
309
310     CPDF_ActionFields   GetWidgets() const
311     {
312         return this;
313     }
314
315     FX_BOOL                             GetHideStatus() const
316     {
317         return m_pDict->GetBoolean("H", TRUE);
318     }
319
320     CFX_ByteString              GetNamedAction() const
321     {
322         return m_pDict->GetString("N");
323     }
324
325     FX_DWORD                    GetFlags() const
326     {
327         return m_pDict->GetInteger("Flags");
328     }
329
330     CFX_WideString              GetJavaScript() const;
331
332     CPDF_Dictionary*    GetAnnot() const;
333
334     FX_INT32                    GetOperationType() const;
335
336     CPDF_Stream*                GetSoundStream() const
337     {
338         return m_pDict->GetStream("Sound");
339     }
340
341     FX_FLOAT                    GetVolume() const
342     {
343         return m_pDict->GetNumber("Volume");
344     }
345
346     FX_BOOL                             IsSynchronous() const
347     {
348         return m_pDict->GetBoolean("Synchronous");
349     }
350
351     FX_BOOL                             IsRepeat() const
352     {
353         return m_pDict->GetBoolean("Repeat");
354     }
355
356     FX_BOOL                             IsMixPlay() const
357     {
358         return m_pDict->GetBoolean("Mix");
359     }
360
361     FX_DWORD                    GetSubActionsCount() const;
362
363     CPDF_Action                 GetSubAction(FX_DWORD iIndex) const;
364
365 protected:
366     CPDF_Dictionary*    m_pDict;
367 };
368 class CPDF_AAction
369 {
370 public:
371
372     CPDF_AAction(CPDF_Dictionary* pDict = NULL)
373     {
374         m_pDict = pDict;
375     }
376
377     operator CPDF_Dictionary*() const
378     {
379         return m_pDict;
380     }
381
382     enum AActionType {
383         CursorEnter = 0,
384         CursorExit,
385         ButtonDown,
386         ButtonUp,
387         GetFocus,
388         LoseFocus,
389         PageOpen,
390         PageClose,
391         PageVisible,
392         PageInvisible,
393         OpenPage,
394         ClosePage,
395         KeyStroke,
396         Format,
397         Validate,
398         Calculate,
399         CloseDocument,
400         SaveDocument,
401         DocumentSaved,
402         PrintDocument,
403         DocumentPrinted
404     };
405
406     FX_BOOL                             ActionExist(AActionType eType) const;
407
408     CPDF_Action                 GetAction(AActionType eType) const;
409
410     FX_POSITION                 GetStartPos() const;
411
412     CPDF_Action                 GetNextAction(FX_POSITION& pos, AActionType& eType) const;
413
414     CPDF_Dictionary*    m_pDict;
415 };
416 class CPDF_DocJSActions
417 {
418 public:
419     CPDF_DocJSActions(CPDF_Document* pDoc);
420
421
422     int                                 CountJSActions() const;
423
424     CPDF_Action                 GetJSAction(int index, CFX_ByteString& csName) const;
425
426     CPDF_Action                 GetJSAction(const CFX_ByteString& csName) const;
427
428     int                                 FindJSAction(const CFX_ByteString& csName) const;
429
430
431     CPDF_Document*              GetDocument() const
432     {
433         return m_pDocument;
434     }
435
436 protected:
437
438     CPDF_Document*              m_pDocument;
439 };
440 class CPDF_FileSpec
441 {
442 public:
443
444     CPDF_FileSpec();
445
446     CPDF_FileSpec(CPDF_Object *pObj)
447     {
448         m_pObj = pObj;
449     }
450
451     operator CPDF_Object*() const
452     {
453         return m_pObj;
454     }
455
456     FX_BOOL                     IsURL() const;
457
458     FX_BOOL                     GetFileName(CFX_WideString &wsFileName) const;
459
460     CPDF_Stream*        GetFileStream() const;
461
462     void                        SetFileName(FX_WSTR wsFileName, FX_BOOL bURL = FALSE);
463 protected:
464
465     CPDF_Object         *m_pObj;
466 };
467 class CPDF_LinkList
468 {
469 public:
470
471     CPDF_LinkList(CPDF_Document* pDoc)
472     {
473         m_pDocument = pDoc;
474     }
475
476     ~CPDF_LinkList();
477
478     CPDF_Link                   GetLinkAtPoint(CPDF_Page* pPage, FX_FLOAT pdf_x, FX_FLOAT pdf_y);
479
480     int                                 CountLinks(CPDF_Page* pPage);
481
482     CPDF_Link                   GetLink(CPDF_Page* pPage, int index);
483
484     CPDF_Document*              GetDocument() const
485     {
486         return m_pDocument;
487     }
488 protected:
489
490     CPDF_Document*              m_pDocument;
491
492     CFX_MapPtrToPtr             m_PageMap;
493
494     CFX_PtrArray*               GetPageLinks(CPDF_Page* pPage);
495
496     void                                LoadPageLinks(CPDF_Page* pPage, CFX_PtrArray* pList);
497 };
498 class CPDF_Link
499 {
500 public:
501     CPDF_Link() : m_pDict(nullptr) { }
502     explicit CPDF_Link(CPDF_Dictionary* pDict) : m_pDict(pDict) { }
503
504     CPDF_Dictionary* GetDict() const { return m_pDict; }
505
506     CFX_FloatRect               GetRect();
507     CPDF_Dest                   GetDest(CPDF_Document* pDoc);
508     CPDF_Action                 GetAction();
509
510 protected:
511     CPDF_Dictionary*    m_pDict;
512 };
513
514 #define ANNOTFLAG_INVISIBLE     0x0001
515 #define ANNOTFLAG_HIDDEN        0x0002
516 #define ANNOTFLAG_PRINT         0x0004
517 #define ANNOTFLAG_NOZOOM        0x0008
518 #define ANNOTFLAG_NOROTATE      0x0010
519 #define ANNOTFLAG_NOVIEW        0x0020
520 #define ANNOTFLAG_READONLY      0x0040
521 #define ANNOTFLAG_LOCKED        0x0080
522 #define ANNOTFLAG_TOGGLENOVIEW  0x0100
523
524 class CPDF_Annot : public CFX_PrivateData
525 {
526   public:
527     enum AppearanceMode {
528         Normal,
529         Rollover,
530         Down
531     };
532
533     CPDF_Annot(CPDF_Dictionary* pDict, CPDF_AnnotList* pList);
534     ~CPDF_Annot();
535
536     CFX_ByteString GetSubType() const;
537
538     FX_DWORD GetFlags() const;
539
540     void GetRect(CFX_FloatRect& rect) const;
541
542     CPDF_Dictionary* GetAnnotDict();
543
544     FX_BOOL DrawAppearance(const CPDF_Page* pPage,
545                            CFX_RenderDevice* pDevice,
546                            const CFX_AffineMatrix* pUser2Device,
547                            AppearanceMode mode,
548                            const CPDF_RenderOptions* pOptions);
549
550     FX_BOOL DrawInContext(const CPDF_Page* pPage,
551                           const CPDF_RenderContext* pContext,
552                           const CFX_AffineMatrix* pUser2Device,
553                           AppearanceMode mode);
554
555     void ClearCachedAP();
556
557     void DrawBorder(CFX_RenderDevice* pDevice,
558                     const CFX_AffineMatrix* pUser2Device,
559                     const CPDF_RenderOptions* pOptions);
560
561     CPDF_Form* GetAPForm(const CPDF_Page* pPage, AppearanceMode mode);
562
563   private:
564     CPDF_Dictionary* const m_pAnnotDict;
565
566     CPDF_AnnotList* const m_pList;
567
568     CFX_MapPtrToPtr m_APMap;
569 };
570
571 class CPDF_AnnotList
572 {
573 public:
574
575     CPDF_AnnotList(CPDF_Page* pPage);
576
577     ~CPDF_AnnotList();
578
579     void        GetAnnotMatrix(const CPDF_Dictionary* pAnnotDict, const CFX_Matrix* pUser2Device, CFX_Matrix &matrix) const;
580
581     void        GetAnnotRect(const CPDF_Dictionary* pAnnotDict, const CFX_Matrix* pUser2Device, CPDF_Rect &rtAnnot) const;
582
583     void                                DisplayAnnots(const CPDF_Page* pPage, CFX_RenderDevice* pDevice,
584                                       CFX_AffineMatrix* pMatrix, FX_BOOL bShowWidget,
585                                       CPDF_RenderOptions* pOptions);
586
587     void                                DisplayAnnots(const CPDF_Page* pPage, CPDF_RenderContext* pContext,
588                                       FX_BOOL bPrinting, CFX_AffineMatrix* pMatrix, FX_BOOL bShowWidget,
589                                       CPDF_RenderOptions* pOptions)
590     {
591         DisplayAnnots(pPage, NULL, pContext, bPrinting, pMatrix, bShowWidget ? 3 : 1, pOptions, NULL);
592     }
593
594     void                                DisplayAnnots(const CPDF_Page* pPage, CPDF_RenderContext* pContext,
595                                       FX_BOOL bPrinting, CFX_AffineMatrix* pMatrix, FX_BOOL bShowWidget,
596                                       CPDF_RenderOptions* pOptions, FX_RECT *pClipRect)
597     {
598         DisplayAnnots(pPage, NULL, pContext, bPrinting, pMatrix, bShowWidget ? 3 : 1, pOptions, pClipRect);
599     }
600
601     void                                DisplayAnnots(const CPDF_Page* pPage, CFX_RenderDevice* pDevice, CPDF_RenderContext* pContext,
602                                       FX_BOOL bPrinting, CFX_AffineMatrix* pMatrix, FX_DWORD dwAnnotFlags,
603                                       CPDF_RenderOptions* pOptions, FX_RECT* pClipRect);
604
605
606
607     CPDF_Annot*                 GetAt(int index)
608     {
609         return (CPDF_Annot*)m_AnnotList.GetAt(index);
610     }
611
612     int                                 Count()
613     {
614         return m_AnnotList.GetSize();
615     }
616
617     int                                 GetIndex(CPDF_Annot* pAnnot);
618
619
620     CPDF_Document*              GetDocument() const
621     {
622         return m_pDocument;
623     }
624 protected:
625
626     CFX_PtrArray                m_AnnotList;
627
628     CPDF_Dictionary*    m_pPageDict;
629
630     CPDF_Document*              m_pDocument;
631
632     CFX_PtrArray                m_Borders;
633
634     void                                DisplayPass(const CPDF_Page* pPage, CFX_RenderDevice* pDevice,
635                                     CPDF_RenderContext* pContext, FX_BOOL bPrinting, CFX_AffineMatrix* pMatrix,
636                                     FX_BOOL bWidget, CPDF_RenderOptions* pOptions, FX_RECT* clip_rect);
637     friend class                CPDF_Annot;
638 };
639 #define COLORTYPE_TRANSPARENT   0
640 #define COLORTYPE_GRAY                  1
641 #define COLORTYPE_RGB                   2
642 #define COLORTYPE_CMYK                  3
643 class CPDF_DefaultAppearance
644 {
645 public:
646
647     CPDF_DefaultAppearance(const CFX_ByteString& csDA = "")
648     {
649         m_csDA = csDA;
650     }
651
652     CPDF_DefaultAppearance(const CPDF_DefaultAppearance& cDA)
653     {
654         m_csDA = (CFX_ByteString)(CPDF_DefaultAppearance&)cDA;
655     }
656
657
658     operator CFX_ByteString() const
659     {
660         return m_csDA;
661     }
662
663     const CPDF_DefaultAppearance& operator =(const CFX_ByteString& csDA)
664     {
665         m_csDA = csDA;
666         return *this;
667     }
668
669     const CPDF_DefaultAppearance& operator =(const CPDF_DefaultAppearance& cDA)
670     {
671         m_csDA = (CFX_ByteString)(CPDF_DefaultAppearance&)cDA;
672         return *this;
673     }
674
675
676
677     FX_BOOL                             HasFont();
678
679     CFX_ByteString              GetFontString();
680
681     void                                GetFont(CFX_ByteString& csFontNameTag, FX_FLOAT& fFontSize);
682
683
684
685
686     FX_BOOL                             HasColor(FX_BOOL bStrokingOperation = FALSE);
687
688     CFX_ByteString              GetColorString(FX_BOOL bStrokingOperation = FALSE);
689
690     void                                GetColor(int& iColorType, FX_FLOAT fc[4], FX_BOOL bStrokingOperation = FALSE);
691
692     void                                GetColor(FX_ARGB& color, int& iColorType, FX_BOOL bStrokingOperation = FALSE);
693
694
695
696
697     FX_BOOL                             HasTextMatrix();
698
699     CFX_ByteString              GetTextMatrixString();
700
701     CFX_AffineMatrix    GetTextMatrix();
702
703 protected:
704
705     CFX_ByteString              m_csDA;
706 };
707 #define FIELDTYPE_UNKNOWN                       0
708 #define FIELDTYPE_PUSHBUTTON            1
709 #define FIELDTYPE_CHECKBOX                      2
710 #define FIELDTYPE_RADIOBUTTON           3
711 #define FIELDTYPE_COMBOBOX                      4
712 #define FIELDTYPE_LISTBOX                       5
713 #define FIELDTYPE_TEXTFIELD                     6
714 #define FIELDTYPE_SIGNATURE                     7
715 class CPDF_InterForm : public CFX_PrivateData
716 {
717 public:
718
719     CPDF_InterForm(CPDF_Document* pDocument, FX_BOOL bUpdateAP);
720
721     ~CPDF_InterForm();
722
723
724
725     static void                         EnableUpdateAP(FX_BOOL bUpdateAP);
726
727     static FX_BOOL                      UpdatingAPEnabled();
728
729
730     static CFX_ByteString       GenerateNewResourceName(const CPDF_Dictionary* pResDict, FX_LPCSTR csType, int iMinLen = 2, FX_LPCSTR csPrefix = "");
731
732
733
734     static CPDF_Font*           AddSystemDefaultFont(const CPDF_Document* pDocument);
735
736     static CPDF_Font*           AddSystemFont(const CPDF_Document* pDocument, CFX_ByteString csFontName, FX_BYTE iCharSet = 1);
737
738     static CPDF_Font*           AddSystemFont(const CPDF_Document* pDocument, CFX_WideString csFontName, FX_BYTE iCharSet = 1);
739
740     static CPDF_Font*           AddStandardFont(const CPDF_Document* pDocument, CFX_ByteString csFontName);
741
742     static CFX_ByteString       GetNativeFont(FX_BYTE iCharSet, FX_LPVOID pLogFont = NULL);
743
744     static CFX_ByteString       GetNativeFont(FX_LPVOID pLogFont = NULL);
745
746     static FX_BYTE                      GetNativeCharSet();
747
748     static CPDF_Font*           AddNativeFont(FX_BYTE iCharSet, const CPDF_Document* pDocument);
749
750     static CPDF_Font*           AddNativeFont(const CPDF_Document* pDocument);
751
752
753
754
755     FX_BOOL                                     ValidateFieldName(CFX_WideString& csNewFieldName, int iType);
756
757     FX_BOOL                                     ValidateFieldName(const CPDF_FormField* pField, CFX_WideString& csNewFieldName);
758
759     FX_BOOL                                     ValidateFieldName(const CPDF_FormControl* pControl, CFX_WideString& csNewFieldName);
760
761
762
763
764     FX_DWORD                            CountFields(const CFX_WideString &csFieldName = L"");
765
766     CPDF_FormField*                     GetField(FX_DWORD index, const CFX_WideString &csFieldName = L"");
767
768     void                                        GetAllFieldNames(CFX_WideStringArray& allFieldNames);
769
770     FX_BOOL                                     IsValidFormField(const void* pField);
771
772     CPDF_FormField*                     GetFieldByDict(CPDF_Dictionary* pFieldDict) const;
773
774
775
776
777     FX_DWORD                            CountControls(CFX_WideString csFieldName = L"");
778
779     CPDF_FormControl*           GetControl(FX_DWORD index, CFX_WideString csFieldName = L"");
780
781     FX_BOOL                                     IsValidFormControl(const void* pControl);
782
783     int                                         CountPageControls(CPDF_Page* pPage) const;
784
785     CPDF_FormControl*           GetPageControl(CPDF_Page* pPage, int index) const;
786
787
788     CPDF_FormControl*           GetControlAtPoint(CPDF_Page* pPage, FX_FLOAT pdf_x, FX_FLOAT pdf_y) const;
789
790     CPDF_FormControl*           GetControlByDict(CPDF_Dictionary* pWidgetDict) const;
791
792
793
794
795     FX_DWORD                            CountInternalFields(const CFX_WideString& csFieldName = L"") const;
796
797     CPDF_Dictionary*            GetInternalField(FX_DWORD index, const CFX_WideString& csFieldName = L"") const;
798
799
800
801
802
803     CPDF_Document*                      GetDocument() const
804     {
805         return m_pDocument;
806     }
807
808     CPDF_Dictionary*            GetFormDict() const
809     {
810         return m_pFormDict;
811     }
812
813
814
815
816     FX_BOOL                                     NeedConstructAP();
817
818     void                                        NeedConstructAP(FX_BOOL bNeedAP);
819
820
821
822
823     int                                         CountFieldsInCalculationOrder();
824
825     CPDF_FormField*                     GetFieldInCalculationOrder(int index);
826
827     int                                         FindFieldInCalculationOrder(const CPDF_FormField* pField);
828
829
830
831
832     FX_DWORD                            CountFormFonts();
833
834     CPDF_Font*                          GetFormFont(FX_DWORD index, CFX_ByteString& csNameTag);
835
836     CPDF_Font*                          GetFormFont(CFX_ByteString csNameTag);
837
838     CPDF_Font*                          GetFormFont(CFX_ByteString csFontName, CFX_ByteString& csNameTag);
839
840     CPDF_Font*                          GetNativeFormFont(FX_BYTE iCharSet, CFX_ByteString& csNameTag);
841
842     CPDF_Font*                          GetNativeFormFont(CFX_ByteString& csNameTag);
843
844     FX_BOOL                                     FindFormFont(const CPDF_Font* pFont, CFX_ByteString& csNameTag);
845
846     FX_BOOL                                     FindFormFont(CFX_ByteString csFontName, CPDF_Font*& pFont, CFX_ByteString& csNameTag);
847
848     inline FX_BOOL                      FindFormFont(CFX_WideString csFontName, CPDF_Font*& pFont, CFX_ByteString& csNameTag)
849     {
850         return FindFormFont(PDF_EncodeText(csFontName), pFont, csNameTag);
851     }
852
853
854
855
856
857     void                                        AddFormFont(const CPDF_Font* pFont, CFX_ByteString& csNameTag);
858
859     CPDF_Font*                          AddNativeFormFont(FX_BYTE iCharSet, CFX_ByteString& csNameTag);
860
861     CPDF_Font*                          AddNativeFormFont(CFX_ByteString& csNameTag);
862
863     void                                        RemoveFormFont(const CPDF_Font* pFont);
864
865     void                                        RemoveFormFont(CFX_ByteString csNameTag);
866
867
868
869
870     CPDF_DefaultAppearance      GetDefaultAppearance();
871
872     CPDF_Font*                          GetDefaultFormFont();
873
874
875
876     int                                         GetFormAlignment();
877
878
879
880
881     CPDF_FormField*                     CheckRequiredFields(const CFX_PtrArray *fields = NULL, FX_BOOL bIncludeOrExclude = TRUE) const;
882
883     CFDF_Document*                      ExportToFDF(FX_WSTR pdf_path, FX_BOOL bSimpleFileSpec = FALSE) const;
884
885     CFDF_Document*                      ExportToFDF(FX_WSTR pdf_path, CFX_PtrArray& fields, FX_BOOL bIncludeOrExclude = TRUE, FX_BOOL bSimpleFileSpec = FALSE) const;
886
887     FX_BOOL                                     ImportFromFDF(const CFDF_Document* pFDFDoc, FX_BOOL bNotify = FALSE);
888
889
890
891
892     FX_BOOL                                     ResetForm(const CFX_PtrArray& fields, FX_BOOL bIncludeOrExclude = TRUE, FX_BOOL bNotify = FALSE);
893
894     FX_BOOL                                     ResetForm(FX_BOOL bNotify = FALSE);
895
896     void                                        ReloadForm();
897
898     CPDF_FormNotify*            GetFormNotify() const
899     {
900         return m_pFormNotify;
901     }
902
903     void                                        SetFormNotify(const CPDF_FormNotify* pNotify);
904
905
906     int                                         GetPageWithWidget(int iCurPage, FX_BOOL bNext);
907
908
909
910     FX_BOOL                                     IsUpdated()
911     {
912         return m_bUpdated;
913     }
914
915     void                                        ClearUpdatedFlag()
916     {
917         m_bUpdated = FALSE;
918     }
919
920
921     FX_BOOL                                     HasXFAForm() const;
922
923     void                                        FixPageFields(const CPDF_Page* pPage);
924 protected:
925
926     static FX_BOOL                      m_bUpdateAP;
927
928     void                                        LoadField(CPDF_Dictionary* pFieldDict, int nLevel = 0);
929
930     CPDF_Object*                        GetFieldAttr(CPDF_Dictionary* pFieldDict, const FX_CHAR* name);
931
932     CPDF_FormField*                     AddTerminalField(const CPDF_Dictionary* pFieldDict);
933
934     CPDF_FormControl*           AddControl(const CPDF_FormField* pField, const CPDF_Dictionary* pWidgetDict);
935
936     void                                        FDF_ImportField(CPDF_Dictionary* pField, const CFX_WideString& parent_name, FX_BOOL bNotify = FALSE, int nLevel = 0);
937
938     FX_BOOL                                     ValidateFieldName(CFX_WideString& csNewFieldName, int iType, const CPDF_FormField* pExcludedField, const CPDF_FormControl* pExcludedControl);
939
940     int                                         CompareFieldName(const CFX_WideString& name1, const CFX_WideString& name2);
941
942     int                                         CompareFieldName(const CFX_ByteString& name1, const CFX_ByteString& name2);
943
944     CPDF_Document*                      m_pDocument;
945
946     FX_BOOL                                     m_bGenerateAP;
947
948     CPDF_Dictionary*            m_pFormDict;
949
950     CFX_MapPtrToPtr                     m_ControlMap;
951
952     CFieldTree *m_pFieldTree;
953
954     CFX_ByteString                      m_bsEncoding;
955
956     CPDF_FormNotify*            m_pFormNotify;
957
958     FX_BOOL                                     m_bUpdated;
959     friend class CPDF_FormControl;
960     friend class CPDF_FormField;
961 };
962 #define FORMFIELD_READONLY              0x01
963 #define FORMFIELD_REQUIRED              0x02
964 #define FORMFIELD_NOEXPORT              0x04
965 #define FORMRADIO_NOTOGGLEOFF   0x100
966 #define FORMRADIO_UNISON                0x200
967 #define FORMTEXT_MULTILINE              0x100
968 #define FORMTEXT_PASSWORD               0x200
969 #define FORMTEXT_NOSCROLL               0x400
970 #define FORMTEXT_COMB                   0x800
971 #define FORMCOMBO_EDIT                  0x100
972 #define FORMLIST_MULTISELECT    0x100
973 class CPDF_FormField
974 {
975 public:
976
977     enum Type {
978         Unknown,
979         PushButton,
980         RadioButton,
981         CheckBox,
982         Text,
983         RichText,
984         File,
985         ListBox,
986         ComboBox,
987         Sign
988     };
989
990     CFX_WideString                      GetFullName();
991
992     Type                                        GetType()
993     {
994         return m_Type;
995     }
996
997     FX_DWORD                            GetFlags()
998     {
999         return m_Flags;
1000     }
1001
1002     CPDF_InterForm*                     GetInterForm() const
1003     {
1004         return m_pForm;
1005     }
1006
1007     CPDF_Dictionary*            GetFieldDict() const
1008     {
1009         return m_pDict;
1010     }
1011
1012     void                                        SetFieldDict(CPDF_Dictionary* pDict)
1013     {
1014         m_pDict = pDict;
1015     }
1016
1017     FX_BOOL                                     ResetField(FX_BOOL bNotify = FALSE);
1018
1019
1020
1021     int                                         CountControls()
1022     {
1023         return m_ControlList.GetSize();
1024     }
1025
1026     CPDF_FormControl*           GetControl(int index)
1027     {
1028         return (CPDF_FormControl*)m_ControlList.GetAt(index);
1029     }
1030
1031     int                                         GetControlIndex(const CPDF_FormControl* pControl);
1032
1033
1034
1035
1036     int                                         GetFieldType();
1037
1038
1039
1040
1041     CPDF_AAction                        GetAdditionalAction();
1042
1043
1044
1045
1046     CFX_WideString                      GetAlternateName();
1047
1048
1049
1050
1051     CFX_WideString                      GetMappingName();
1052
1053
1054
1055
1056     FX_DWORD                            GetFieldFlags();
1057
1058
1059
1060
1061     CFX_ByteString                      GetDefaultStyle();
1062
1063
1064
1065
1066     CFX_WideString                      GetRichTextString();
1067
1068
1069
1070     CFX_WideString                      GetValue();
1071
1072     CFX_WideString                      GetDefaultValue();
1073
1074     FX_BOOL                                     SetValue(const CFX_WideString& value, FX_BOOL bNotify = FALSE);
1075
1076
1077
1078
1079
1080     int                                         GetMaxLen();
1081
1082
1083
1084
1085     int                                         CountSelectedItems();
1086
1087     int                                         GetSelectedIndex(int index);
1088
1089     FX_BOOL                                     ClearSelection(FX_BOOL bNotify = FALSE);
1090
1091     FX_BOOL                                     IsItemSelected(int index);
1092
1093     FX_BOOL                                     SetItemSelection(int index, FX_BOOL bSelected, FX_BOOL bNotify = FALSE);
1094
1095     FX_BOOL                                     IsItemDefaultSelected(int index);
1096
1097     int                                         GetDefaultSelectedItem();
1098
1099
1100
1101
1102     int                                         CountOptions();
1103
1104     CFX_WideString                      GetOptionLabel(int index);
1105
1106     CFX_WideString                      GetOptionValue(int index);
1107
1108     int                                         FindOption(CFX_WideString csOptLabel);
1109
1110     int                                         FindOptionValue(const CFX_WideString& csOptValue, int iStartIndex = 0);
1111
1112
1113
1114
1115     FX_BOOL                                     CheckControl(int iControlIndex, FX_BOOL bChecked, FX_BOOL bNotify = FALSE);
1116
1117
1118
1119
1120     int                                         GetTopVisibleIndex();
1121
1122
1123
1124
1125     int                                         CountSelectedOptions();
1126
1127     int                                         GetSelectedOptionIndex(int index);
1128
1129     FX_BOOL                                     IsOptionSelected(int iOptIndex);
1130
1131     FX_BOOL                                     SelectOption(int iOptIndex, FX_BOOL bSelected, FX_BOOL bNotify = FALSE);
1132
1133     FX_BOOL                                     ClearSelectedOptions(FX_BOOL bNotify = FALSE);
1134
1135     FX_BOOL                                     ClearOptions(FX_BOOL bNotify = FALSE);\r
1136
1137     int                                         InsertOption(CFX_WideString csOptLabel, int index = -1, FX_BOOL bNotify = FALSE);\r
1138
1139     FX_FLOAT                            GetFontSize()
1140     {
1141         return m_FontSize;
1142     }
1143
1144     CPDF_Font*                          GetFont()
1145     {
1146         return m_pFont;
1147     }
1148
1149 protected:
1150
1151     CPDF_FormField(CPDF_InterForm* pForm, CPDF_Dictionary* pDict);
1152
1153     ~CPDF_FormField();
1154
1155     CPDF_FormField::Type        m_Type;
1156
1157     FX_DWORD                            m_Flags;
1158
1159     CPDF_InterForm*                     m_pForm;
1160
1161     CPDF_Dictionary*            m_pDict;
1162
1163     CFX_PtrArray                        m_ControlList;
1164     friend class                        CPDF_InterForm;
1165     friend class                        CPDF_FormControl;
1166
1167
1168
1169     CFX_WideString                      GetValue(FX_BOOL bDefault);
1170
1171     FX_BOOL                                     SetValue(const CFX_WideString& value, FX_BOOL bDefault, FX_BOOL bNotify);
1172
1173
1174     void                                        SyncFieldFlags();
1175
1176     int                                         FindListSel(CPDF_String* str);
1177
1178     CFX_WideString                      GetOptionText(int index, int sub_index);
1179
1180     void                                        LoadDA();
1181
1182     void                                        UpdateAP(CPDF_FormControl* pControl);
1183
1184
1185
1186     CFX_WideString                      GetCheckValue(FX_BOOL bDefault);
1187
1188     FX_BOOL                                     SetCheckValue(const CFX_WideString& value, FX_BOOL bDefault, FX_BOOL bNotify);
1189
1190
1191     FX_FLOAT                            m_FontSize;
1192
1193     CPDF_Font*                          m_pFont;
1194 };
1195 CPDF_Object*    FPDF_GetFieldAttr(CPDF_Dictionary* pFieldDict, const FX_CHAR* name, int nLevel = 0);
1196 class CPDF_IconFit
1197 {
1198 public:
1199
1200     CPDF_IconFit(CPDF_Dictionary* pDict = NULL)
1201     {
1202         m_pDict = pDict;
1203     }
1204
1205     operator CPDF_Dictionary*() const
1206     {
1207         return m_pDict;
1208     }
1209
1210
1211
1212
1213     enum ScaleMethod {
1214         Always = 0,
1215         Bigger,
1216         Smaller,
1217         Never
1218     };
1219
1220     ScaleMethod                         GetScaleMethod();
1221
1222
1223
1224
1225     FX_BOOL                                     IsProportionalScale();
1226
1227
1228
1229
1230     void                                        GetIconPosition(FX_FLOAT& fLeft, FX_FLOAT& fBottom);
1231
1232
1233
1234
1235     FX_BOOL                                     GetFittingBounds();
1236
1237
1238     CPDF_Dictionary*            m_pDict;
1239 };
1240
1241 #define TEXTPOS_CAPTION         0
1242 #define TEXTPOS_ICON            1
1243 #define TEXTPOS_BELOW           2
1244 #define TEXTPOS_ABOVE           3
1245 #define TEXTPOS_RIGHT           4
1246 #define TEXTPOS_LEFT            5
1247 #define TEXTPOS_OVERLAID        6
1248 class CPDF_FormControl
1249 {
1250 public:
1251
1252     CPDF_FormField::Type        GetType()
1253     {
1254         return m_pField->GetType();
1255     }
1256
1257     CPDF_InterForm*                     GetInterForm() const
1258     {
1259         return m_pForm;
1260     }
1261
1262     CPDF_FormField*                     GetField() const
1263     {
1264         return m_pField;
1265     }
1266
1267     CPDF_Dictionary*            GetWidget() const
1268     {
1269         return m_pWidgetDict;
1270     }
1271
1272     CFX_FloatRect                       GetRect();
1273
1274     void                                        DrawControl(CFX_RenderDevice* pDevice, CFX_AffineMatrix* pMatrix,
1275                                         CPDF_Page* pPage, CPDF_Annot::AppearanceMode mode, const CPDF_RenderOptions* pOptions = NULL);
1276
1277
1278
1279     CFX_ByteString                      GetCheckedAPState();
1280
1281     CFX_WideString                      GetExportValue();
1282
1283     FX_BOOL                                     IsChecked();
1284
1285     FX_BOOL                                     IsDefaultChecked();
1286
1287
1288
1289
1290     enum HighlightingMode       {
1291         None = 0,
1292         Invert,
1293         Outline,
1294         Push,
1295         Toggle
1296     };
1297
1298     HighlightingMode            GetHighlightingMode();
1299
1300
1301
1302
1303     FX_BOOL                                     HasMKEntry(CFX_ByteString csEntry);
1304
1305
1306
1307
1308     int                                         GetRotation();
1309
1310
1311
1312
1313     inline FX_ARGB                      GetBorderColor(int& iColorType)
1314     {
1315         return GetColor(iColorType, "BC");
1316     }
1317
1318     inline FX_FLOAT                     GetOriginalBorderColor(int index)
1319     {
1320         return GetOriginalColor(index, "BC");
1321     }
1322
1323     inline void                         GetOriginalBorderColor(int& iColorType, FX_FLOAT fc[4])
1324     {
1325         GetOriginalColor(iColorType, fc, "BC");
1326     }
1327
1328
1329
1330
1331     inline FX_ARGB                      GetBackgroundColor(int& iColorType)
1332     {
1333         return GetColor(iColorType, "BG");
1334     }
1335
1336     inline FX_FLOAT                     GetOriginalBackgroundColor(int index)
1337     {
1338         return GetOriginalColor(index, "BG");
1339     }
1340
1341     inline void                         GetOriginalBackgroundColor(int& iColorType, FX_FLOAT fc[4])
1342     {
1343         GetOriginalColor(iColorType, fc, "BG");
1344     }
1345
1346
1347
1348
1349     inline CFX_WideString       GetNormalCaption()
1350     {
1351         return GetCaption("CA");
1352     }
1353
1354
1355
1356
1357     inline CFX_WideString       GetRolloverCaption()
1358     {
1359         return GetCaption("RC");
1360     }
1361
1362
1363
1364
1365     inline CFX_WideString       GetDownCaption()
1366     {
1367         return GetCaption("AC");
1368     }
1369
1370
1371
1372
1373     inline CPDF_Stream*         GetNormalIcon()
1374     {
1375         return GetIcon("I");
1376     }
1377
1378
1379
1380
1381     inline CPDF_Stream*         GetRolloverIcon()
1382     {
1383         return GetIcon("RI");
1384     }
1385
1386
1387
1388
1389     inline CPDF_Stream*         GetDownIcon()
1390     {
1391         return GetIcon("IX");
1392     }
1393
1394
1395
1396
1397     CPDF_IconFit                        GetIconFit();
1398
1399
1400
1401
1402     int                                         GetTextPosition();
1403
1404
1405
1406
1407     CPDF_Action                         GetAction();
1408
1409
1410
1411
1412     CPDF_AAction                        GetAdditionalAction();
1413
1414
1415
1416
1417     CPDF_DefaultAppearance      GetDefaultAppearance();
1418
1419     CPDF_Font*                          GetDefaultControlFont();
1420
1421
1422
1423
1424     int                                         GetControlAlignment();
1425
1426 protected:
1427
1428     CPDF_FormControl(CPDF_FormField* pField, CPDF_Dictionary* pWidgetDict);
1429
1430     CFX_ByteString                      GetOnStateName();
1431
1432     void                                        SetOnStateName(const CFX_ByteString& csOn);
1433
1434     void                                        CheckControl(FX_BOOL bChecked);
1435
1436     FX_ARGB                                     GetColor(int& iColorType, CFX_ByteString csEntry);
1437
1438     FX_FLOAT                            GetOriginalColor(int index, CFX_ByteString csEntry);
1439
1440     void                                        GetOriginalColor(int& iColorType, FX_FLOAT fc[4], CFX_ByteString csEntry);
1441
1442     CFX_WideString                      GetCaption(CFX_ByteString csEntry);
1443
1444     CPDF_Stream*                        GetIcon(CFX_ByteString csEntry);
1445
1446     CPDF_ApSettings                     GetMK(FX_BOOL bCreate);
1447
1448     CPDF_InterForm*                     m_pForm;
1449
1450     CPDF_FormField*                     m_pField;
1451
1452     CPDF_Dictionary*            m_pWidgetDict;
1453     friend class                        CPDF_InterForm;
1454     friend class                        CPDF_FormField;
1455 };
1456 class CPDF_FormNotify
1457 {
1458 public:
1459
1460     virtual ~CPDF_FormNotify() {}
1461
1462     virtual int         BeforeValueChange(const CPDF_FormField* pField, CFX_WideString& csValue)
1463     {
1464         return 0;
1465     }
1466
1467     virtual int         AfterValueChange(const CPDF_FormField* pField)
1468     {
1469         return 0;
1470     }
1471
1472     virtual int         BeforeSelectionChange(const CPDF_FormField* pField, CFX_WideString& csValue)
1473     {
1474         return 0;
1475     }
1476
1477     virtual int         AfterSelectionChange(const CPDF_FormField* pField)
1478     {
1479         return 0;
1480     }
1481
1482     virtual int         AfterCheckedStatusChange(const CPDF_FormField* pField, const CFX_ByteArray& statusArray)
1483     {
1484         return 0;
1485     }
1486
1487     virtual int         BeforeFormReset(const CPDF_InterForm* pForm)
1488     {
1489         return 0;
1490     }
1491
1492     virtual int         AfterFormReset(const CPDF_InterForm* pForm)
1493     {
1494         return 0;
1495     }
1496
1497     virtual int         BeforeFormImportData(const CPDF_InterForm* pForm)
1498     {
1499         return 0;
1500     }
1501
1502     virtual int         AfterFormImportData(const CPDF_InterForm* pForm)
1503     {
1504         return 0;
1505     }
1506 };
1507 FX_BOOL         FPDF_GenerateAP(CPDF_Document* pDoc, CPDF_Dictionary* pAnnotDict);
1508 class CPDF_PageLabel
1509 {
1510 public:
1511
1512     CPDF_PageLabel(CPDF_Document* pDocument)
1513     {
1514         m_pDocument = pDocument;
1515     }
1516
1517
1518     CFX_WideString                                      GetLabel(int nPage) const;
1519
1520     FX_INT32                                            GetPageByLabel(FX_BSTR bsLabel) const;
1521
1522
1523     FX_INT32                                            GetPageByLabel(FX_WSTR wsLabel) const;
1524
1525 protected:
1526     CPDF_Document*                                      m_pDocument;
1527 };
1528 class CPDF_Metadata
1529 {
1530 public:
1531
1532     CPDF_Metadata();
1533
1534
1535     ~CPDF_Metadata();
1536
1537     void                                LoadDoc(CPDF_Document *pDoc);
1538
1539
1540     FX_INT32                    GetString(FX_BSTR bsItem, CFX_WideString &wsStr);
1541
1542     CXML_Element*               GetRoot() const;
1543
1544     CXML_Element*               GetRDF() const;
1545
1546 protected:
1547     FX_LPVOID   m_pData;
1548 };
1549 class CPDF_ViewerPreferences
1550 {
1551 public:
1552
1553     CPDF_ViewerPreferences(CPDF_Document *pDoc);
1554
1555
1556     ~CPDF_ViewerPreferences();
1557
1558
1559     FX_BOOL IsDirectionR2L() const;
1560
1561     FX_BOOL PrintScaling() const;
1562
1563     FX_INT32 NumCopies() const;
1564
1565     CPDF_Array* PrintPageRange() const;
1566
1567     CFX_ByteString Duplex() const;
1568
1569 protected:
1570     CPDF_Document*      m_pDoc;
1571 };
1572 class CPDF_ApSettings
1573 {
1574 public:
1575
1576     CPDF_ApSettings(CPDF_Dictionary* pDict = NULL)
1577     {
1578         m_pDict = pDict;
1579     }
1580
1581     operator CPDF_Dictionary* () const
1582     {
1583         return m_pDict;
1584     }
1585
1586     FX_BOOL                                     HasMKEntry(FX_BSTR csEntry);
1587
1588
1589
1590     int                                         GetRotation();
1591
1592
1593
1594
1595     inline FX_ARGB                      GetBorderColor(int& iColorType)
1596     {
1597         return GetColor(iColorType, FX_BSTRC("BC"));
1598     }
1599
1600     inline FX_FLOAT                     GetOriginalBorderColor(int index)
1601     {
1602         return GetOriginalColor(index, FX_BSTRC("BC"));
1603     }
1604
1605     inline void                         GetOriginalBorderColor(int& iColorType, FX_FLOAT fc[4])
1606     {
1607         GetOriginalColor(iColorType, fc, FX_BSTRC("BC"));
1608     }
1609
1610
1611
1612
1613     inline FX_ARGB                      GetBackgroundColor(int& iColorType)
1614     {
1615         return GetColor(iColorType, FX_BSTRC("BG"));
1616     }
1617
1618     inline FX_FLOAT                     GetOriginalBackgroundColor(int index)
1619     {
1620         return GetOriginalColor(index, FX_BSTRC("BG"));
1621     }
1622
1623     inline void                         GetOriginalBackgroundColor(int& iColorType, FX_FLOAT fc[4])
1624     {
1625         GetOriginalColor(iColorType, fc, FX_BSTRC("BG"));
1626     }
1627
1628
1629
1630
1631     inline CFX_WideString       GetNormalCaption()
1632     {
1633         return GetCaption(FX_BSTRC("CA"));
1634     }
1635
1636
1637
1638
1639     inline CFX_WideString       GetRolloverCaption()
1640     {
1641         return GetCaption(FX_BSTRC("RC"));
1642     }
1643
1644
1645
1646
1647     inline CFX_WideString       GetDownCaption()
1648     {
1649         return GetCaption(FX_BSTRC("AC"));
1650     }
1651
1652
1653
1654
1655     inline CPDF_Stream*         GetNormalIcon()
1656     {
1657         return GetIcon(FX_BSTRC("I"));
1658     }
1659
1660
1661
1662
1663     inline CPDF_Stream*         GetRolloverIcon()
1664     {
1665         return GetIcon(FX_BSTRC("RI"));
1666     }
1667
1668
1669
1670
1671     inline CPDF_Stream*         GetDownIcon()
1672     {
1673         return GetIcon(FX_BSTRC("IX"));
1674     }
1675
1676
1677
1678
1679     CPDF_IconFit                        GetIconFit();
1680
1681
1682
1683
1684     int                                         GetTextPosition();
1685
1686     CPDF_Dictionary*            m_pDict;
1687 protected:
1688
1689     FX_ARGB                                     GetColor(int& iColorType, FX_BSTR csEntry);
1690
1691     FX_FLOAT                            GetOriginalColor(int index, FX_BSTR csEntry);
1692
1693     void                                        GetOriginalColor(int& iColorType, FX_FLOAT fc[4], FX_BSTR csEntry);
1694
1695     CFX_WideString                      GetCaption(FX_BSTR csEntry);
1696
1697     CPDF_Stream*                        GetIcon(FX_BSTR csEntry);
1698     friend class                        CPDF_FormControl;
1699 };
1700
1701 #endif  // CORE_INCLUDE_FPDFDOC_FPDF_DOC_H_