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