Cleanup: Make CPDF_Annot::m_pAnnotDict private.
[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
1136
1137
1138     FX_FLOAT                            GetFontSize()
1139     {
1140         return m_FontSize;
1141     }
1142
1143     CPDF_Font*                          GetFont()
1144     {
1145         return m_pFont;
1146     }
1147
1148 protected:
1149
1150     CPDF_FormField(CPDF_InterForm* pForm, CPDF_Dictionary* pDict);
1151
1152     ~CPDF_FormField();
1153
1154     CPDF_FormField::Type        m_Type;
1155
1156     FX_DWORD                            m_Flags;
1157
1158     CPDF_InterForm*                     m_pForm;
1159
1160     CPDF_Dictionary*            m_pDict;
1161
1162     CFX_PtrArray                        m_ControlList;
1163     friend class                        CPDF_InterForm;
1164     friend class                        CPDF_FormControl;
1165
1166
1167
1168     CFX_WideString                      GetValue(FX_BOOL bDefault);
1169
1170     FX_BOOL                                     SetValue(const CFX_WideString& value, FX_BOOL bDefault, FX_BOOL bNotify);
1171
1172
1173     void                                        SyncFieldFlags();
1174
1175     int                                         FindListSel(CPDF_String* str);
1176
1177     CFX_WideString                      GetOptionText(int index, int sub_index);
1178
1179     void                                        LoadDA();
1180
1181     void                                        UpdateAP(CPDF_FormControl* pControl);
1182
1183
1184
1185     CFX_WideString                      GetCheckValue(FX_BOOL bDefault);
1186
1187     FX_BOOL                                     SetCheckValue(const CFX_WideString& value, FX_BOOL bDefault, FX_BOOL bNotify);
1188
1189
1190     FX_FLOAT                            m_FontSize;
1191
1192     CPDF_Font*                          m_pFont;
1193 };
1194 CPDF_Object*    FPDF_GetFieldAttr(CPDF_Dictionary* pFieldDict, const FX_CHAR* name, int nLevel = 0);
1195 class CPDF_IconFit
1196 {
1197 public:
1198
1199     CPDF_IconFit(CPDF_Dictionary* pDict = NULL)
1200     {
1201         m_pDict = pDict;
1202     }
1203
1204     operator CPDF_Dictionary*() const
1205     {
1206         return m_pDict;
1207     }
1208
1209
1210
1211
1212     enum ScaleMethod {
1213         Always = 0,
1214         Bigger,
1215         Smaller,
1216         Never
1217     };
1218
1219     ScaleMethod                         GetScaleMethod();
1220
1221
1222
1223
1224     FX_BOOL                                     IsProportionalScale();
1225
1226
1227
1228
1229     void                                        GetIconPosition(FX_FLOAT& fLeft, FX_FLOAT& fBottom);
1230
1231
1232
1233
1234     FX_BOOL                                     GetFittingBounds();
1235
1236
1237     CPDF_Dictionary*            m_pDict;
1238 };
1239
1240 #define TEXTPOS_CAPTION         0
1241 #define TEXTPOS_ICON            1
1242 #define TEXTPOS_BELOW           2
1243 #define TEXTPOS_ABOVE           3
1244 #define TEXTPOS_RIGHT           4
1245 #define TEXTPOS_LEFT            5
1246 #define TEXTPOS_OVERLAID        6
1247 class CPDF_FormControl
1248 {
1249 public:
1250
1251     CPDF_FormField::Type        GetType()
1252     {
1253         return m_pField->GetType();
1254     }
1255
1256     CPDF_InterForm*                     GetInterForm() const
1257     {
1258         return m_pForm;
1259     }
1260
1261     CPDF_FormField*                     GetField() const
1262     {
1263         return m_pField;
1264     }
1265
1266     CPDF_Dictionary*            GetWidget() const
1267     {
1268         return m_pWidgetDict;
1269     }
1270
1271     CFX_FloatRect                       GetRect();
1272
1273     void                                        DrawControl(CFX_RenderDevice* pDevice, CFX_AffineMatrix* pMatrix,
1274                                         CPDF_Page* pPage, CPDF_Annot::AppearanceMode mode, const CPDF_RenderOptions* pOptions = NULL);
1275
1276
1277
1278     CFX_ByteString                      GetCheckedAPState();
1279
1280     CFX_WideString                      GetExportValue();
1281
1282     FX_BOOL                                     IsChecked();
1283
1284     FX_BOOL                                     IsDefaultChecked();
1285
1286
1287
1288
1289     enum HighlightingMode       {
1290         None = 0,
1291         Invert,
1292         Outline,
1293         Push,
1294         Toggle
1295     };
1296
1297     HighlightingMode            GetHighlightingMode();
1298
1299
1300
1301
1302     FX_BOOL                                     HasMKEntry(CFX_ByteString csEntry);
1303
1304
1305
1306
1307     int                                         GetRotation();
1308
1309
1310
1311
1312     inline FX_ARGB                      GetBorderColor(int& iColorType)
1313     {
1314         return GetColor(iColorType, "BC");
1315     }
1316
1317     inline FX_FLOAT                     GetOriginalBorderColor(int index)
1318     {
1319         return GetOriginalColor(index, "BC");
1320     }
1321
1322     inline void                         GetOriginalBorderColor(int& iColorType, FX_FLOAT fc[4])
1323     {
1324         GetOriginalColor(iColorType, fc, "BC");
1325     }
1326
1327
1328
1329
1330     inline FX_ARGB                      GetBackgroundColor(int& iColorType)
1331     {
1332         return GetColor(iColorType, "BG");
1333     }
1334
1335     inline FX_FLOAT                     GetOriginalBackgroundColor(int index)
1336     {
1337         return GetOriginalColor(index, "BG");
1338     }
1339
1340     inline void                         GetOriginalBackgroundColor(int& iColorType, FX_FLOAT fc[4])
1341     {
1342         GetOriginalColor(iColorType, fc, "BG");
1343     }
1344
1345
1346
1347
1348     inline CFX_WideString       GetNormalCaption()
1349     {
1350         return GetCaption("CA");
1351     }
1352
1353
1354
1355
1356     inline CFX_WideString       GetRolloverCaption()
1357     {
1358         return GetCaption("RC");
1359     }
1360
1361
1362
1363
1364     inline CFX_WideString       GetDownCaption()
1365     {
1366         return GetCaption("AC");
1367     }
1368
1369
1370
1371
1372     inline CPDF_Stream*         GetNormalIcon()
1373     {
1374         return GetIcon("I");
1375     }
1376
1377
1378
1379
1380     inline CPDF_Stream*         GetRolloverIcon()
1381     {
1382         return GetIcon("RI");
1383     }
1384
1385
1386
1387
1388     inline CPDF_Stream*         GetDownIcon()
1389     {
1390         return GetIcon("IX");
1391     }
1392
1393
1394
1395
1396     CPDF_IconFit                        GetIconFit();
1397
1398
1399
1400
1401     int                                         GetTextPosition();
1402
1403
1404
1405
1406     CPDF_Action                         GetAction();
1407
1408
1409
1410
1411     CPDF_AAction                        GetAdditionalAction();
1412
1413
1414
1415
1416     CPDF_DefaultAppearance      GetDefaultAppearance();
1417
1418     CPDF_Font*                          GetDefaultControlFont();
1419
1420
1421
1422
1423     int                                         GetControlAlignment();
1424
1425 protected:
1426
1427     CPDF_FormControl(CPDF_FormField* pField, CPDF_Dictionary* pWidgetDict);
1428
1429     CFX_ByteString                      GetOnStateName();
1430
1431     void                                        SetOnStateName(const CFX_ByteString& csOn);
1432
1433     void                                        CheckControl(FX_BOOL bChecked);
1434
1435     FX_ARGB                                     GetColor(int& iColorType, CFX_ByteString csEntry);
1436
1437     FX_FLOAT                            GetOriginalColor(int index, CFX_ByteString csEntry);
1438
1439     void                                        GetOriginalColor(int& iColorType, FX_FLOAT fc[4], CFX_ByteString csEntry);
1440
1441     CFX_WideString                      GetCaption(CFX_ByteString csEntry);
1442
1443     CPDF_Stream*                        GetIcon(CFX_ByteString csEntry);
1444
1445     CPDF_ApSettings                     GetMK(FX_BOOL bCreate);
1446
1447     CPDF_InterForm*                     m_pForm;
1448
1449     CPDF_FormField*                     m_pField;
1450
1451     CPDF_Dictionary*            m_pWidgetDict;
1452     friend class                        CPDF_InterForm;
1453     friend class                        CPDF_FormField;
1454 };
1455 class CPDF_FormNotify
1456 {
1457 public:
1458
1459     virtual ~CPDF_FormNotify() {}
1460
1461     virtual int         BeforeValueChange(const CPDF_FormField* pField, CFX_WideString& csValue)
1462     {
1463         return 0;
1464     }
1465
1466     virtual int         AfterValueChange(const CPDF_FormField* pField)
1467     {
1468         return 0;
1469     }
1470
1471     virtual int         BeforeSelectionChange(const CPDF_FormField* pField, CFX_WideString& csValue)
1472     {
1473         return 0;
1474     }
1475
1476     virtual int         AfterSelectionChange(const CPDF_FormField* pField)
1477     {
1478         return 0;
1479     }
1480
1481     virtual int         AfterCheckedStatusChange(const CPDF_FormField* pField, const CFX_ByteArray& statusArray)
1482     {
1483         return 0;
1484     }
1485
1486     virtual int         BeforeFormReset(const CPDF_InterForm* pForm)
1487     {
1488         return 0;
1489     }
1490
1491     virtual int         AfterFormReset(const CPDF_InterForm* pForm)
1492     {
1493         return 0;
1494     }
1495
1496     virtual int         BeforeFormImportData(const CPDF_InterForm* pForm)
1497     {
1498         return 0;
1499     }
1500
1501     virtual int         AfterFormImportData(const CPDF_InterForm* pForm)
1502     {
1503         return 0;
1504     }
1505 };
1506 FX_BOOL         FPDF_GenerateAP(CPDF_Document* pDoc, CPDF_Dictionary* pAnnotDict);
1507 class CPDF_PageLabel
1508 {
1509 public:
1510
1511     CPDF_PageLabel(CPDF_Document* pDocument)
1512     {
1513         m_pDocument = pDocument;
1514     }
1515
1516
1517     CFX_WideString                                      GetLabel(int nPage) const;
1518
1519     FX_INT32                                            GetPageByLabel(FX_BSTR bsLabel) const;
1520
1521
1522     FX_INT32                                            GetPageByLabel(FX_WSTR wsLabel) const;
1523
1524 protected:
1525     CPDF_Document*                                      m_pDocument;
1526 };
1527 class CPDF_Metadata
1528 {
1529 public:
1530
1531     CPDF_Metadata();
1532
1533
1534     ~CPDF_Metadata();
1535
1536     void                                LoadDoc(CPDF_Document *pDoc);
1537
1538
1539     FX_INT32                    GetString(FX_BSTR bsItem, CFX_WideString &wsStr);
1540
1541     CXML_Element*               GetRoot() const;
1542
1543     CXML_Element*               GetRDF() const;
1544
1545 protected:
1546     FX_LPVOID   m_pData;
1547 };
1548 class CPDF_ViewerPreferences
1549 {
1550 public:
1551
1552     CPDF_ViewerPreferences(CPDF_Document *pDoc);
1553
1554
1555     ~CPDF_ViewerPreferences();
1556
1557
1558     FX_BOOL IsDirectionR2L() const;
1559
1560     FX_BOOL PrintScaling() const;
1561
1562     FX_INT32 NumCopies() const;
1563
1564     CPDF_Array* PrintPageRange() const;
1565
1566     CFX_ByteString Duplex() const;
1567
1568 protected:
1569     CPDF_Document*      m_pDoc;
1570 };
1571 class CPDF_ApSettings
1572 {
1573 public:
1574
1575     CPDF_ApSettings(CPDF_Dictionary* pDict = NULL)
1576     {
1577         m_pDict = pDict;
1578     }
1579
1580     operator CPDF_Dictionary* () const
1581     {
1582         return m_pDict;
1583     }
1584
1585     FX_BOOL                                     HasMKEntry(FX_BSTR csEntry);
1586
1587
1588
1589     int                                         GetRotation();
1590
1591
1592
1593
1594     inline FX_ARGB                      GetBorderColor(int& iColorType)
1595     {
1596         return GetColor(iColorType, FX_BSTRC("BC"));
1597     }
1598
1599     inline FX_FLOAT                     GetOriginalBorderColor(int index)
1600     {
1601         return GetOriginalColor(index, FX_BSTRC("BC"));
1602     }
1603
1604     inline void                         GetOriginalBorderColor(int& iColorType, FX_FLOAT fc[4])
1605     {
1606         GetOriginalColor(iColorType, fc, FX_BSTRC("BC"));
1607     }
1608
1609
1610
1611
1612     inline FX_ARGB                      GetBackgroundColor(int& iColorType)
1613     {
1614         return GetColor(iColorType, FX_BSTRC("BG"));
1615     }
1616
1617     inline FX_FLOAT                     GetOriginalBackgroundColor(int index)
1618     {
1619         return GetOriginalColor(index, FX_BSTRC("BG"));
1620     }
1621
1622     inline void                         GetOriginalBackgroundColor(int& iColorType, FX_FLOAT fc[4])
1623     {
1624         GetOriginalColor(iColorType, fc, FX_BSTRC("BG"));
1625     }
1626
1627
1628
1629
1630     inline CFX_WideString       GetNormalCaption()
1631     {
1632         return GetCaption(FX_BSTRC("CA"));
1633     }
1634
1635
1636
1637
1638     inline CFX_WideString       GetRolloverCaption()
1639     {
1640         return GetCaption(FX_BSTRC("RC"));
1641     }
1642
1643
1644
1645
1646     inline CFX_WideString       GetDownCaption()
1647     {
1648         return GetCaption(FX_BSTRC("AC"));
1649     }
1650
1651
1652
1653
1654     inline CPDF_Stream*         GetNormalIcon()
1655     {
1656         return GetIcon(FX_BSTRC("I"));
1657     }
1658
1659
1660
1661
1662     inline CPDF_Stream*         GetRolloverIcon()
1663     {
1664         return GetIcon(FX_BSTRC("RI"));
1665     }
1666
1667
1668
1669
1670     inline CPDF_Stream*         GetDownIcon()
1671     {
1672         return GetIcon(FX_BSTRC("IX"));
1673     }
1674
1675
1676
1677
1678     CPDF_IconFit                        GetIconFit();
1679
1680
1681
1682
1683     int                                         GetTextPosition();
1684
1685     CPDF_Dictionary*            m_pDict;
1686 protected:
1687
1688     FX_ARGB                                     GetColor(int& iColorType, FX_BSTR csEntry);
1689
1690     FX_FLOAT                            GetOriginalColor(int index, FX_BSTR csEntry);
1691
1692     void                                        GetOriginalColor(int& iColorType, FX_FLOAT fc[4], FX_BSTR csEntry);
1693
1694     CFX_WideString                      GetCaption(FX_BSTR csEntry);
1695
1696     CPDF_Stream*                        GetIcon(FX_BSTR csEntry);
1697     friend class                        CPDF_FormControl;
1698 };
1699
1700 #endif  // CORE_INCLUDE_FPDFDOC_FPDF_DOC_H_