801ed2a1a91cd968ddef195a162b915155902154
[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 CPDF_Action;
14 class CPDF_Annot;
15 class CPDF_AnnotList;
16 class CPDF_Bookmark;
17 class CPDF_BookmarkTree;
18 class CPDF_Dest;
19 class CPDF_Link;
20 class CPDF_LinkList;
21 class CPDF_Metadata;
22 class CPDF_NameTree;
23 class CPDF_NumberTree;
24 class CPDF_TextObject;
25 class CPDF_ViewerPreferences;
26 class CPDF_Page;
27 class CPDF_RenderOptions;
28 class CXML_Element;
29 class CPDF_OCContext;
30 class CPDF_DocJSActions;
31 class CPDF_ActionFields;
32 class CPDF_AAction;
33 class CPDF_FileSpec;
34 class CPDF_IconFit;
35 class CPDF_DefaultAppearance;
36 class CPDF_InterForm;
37 class CPDF_FormField;
38 class CPDF_FormNotify;
39 class CPDF_FormControl;
40 class CPDF_LWinParam;
41 class CFieldTree;
42 class CPDF_ApSettings;
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
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
410 protected:
411     CPDF_Dictionary*    m_pDict;
412 };
413 class CPDF_AAction 
414 {
415 public:
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 };
461 class CPDF_DocJSActions 
462 {
463 public:
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
481 protected:
482
483     CPDF_Document*              m_pDocument;
484 };
485 class CPDF_FileSpec 
486 {
487 public:
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);
508 protected:
509
510     CPDF_Object         *m_pObj;
511 };
512 class CPDF_LinkList 
513 {
514 public:
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     }
533 protected:
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 };
543 class CPDF_Link 
544 {
545 public:
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
555 protected:
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
567 class CPDF_Annot : public CFX_PrivateData
568 {
569 public:
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);
614 private:
615
616     CFX_MapPtrToPtr             m_APMap;
617 protected:
618     friend class                CPDF_AnnotList;
619
620     CPDF_AnnotList*             m_pList;
621
622     CPDF_Reference*             NewAnnotRef();
623 };
624 class CPDF_AnnotList 
625 {
626 public:
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     }
677 protected:
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
696 class CPDF_DefaultAppearance 
697 {
698 public:
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
756 protected:
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
768 class CPDF_InterForm : public CFX_PrivateData
769 {
770 public:
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);
977 protected:
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
1026 class CPDF_FormField 
1027 {
1028 public:
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     FX_BOOL                                     ClearOptions(FX_BOOL bNotify = FALSE);\r
1189
1190     int                                         InsertOption(CFX_WideString csOptLabel, int index = -1, FX_BOOL bNotify = FALSE);\r
1191
1192     FX_FLOAT                            GetFontSize()
1193     {
1194         return m_FontSize;
1195     }
1196
1197     CPDF_Font*                          GetFont()
1198     {
1199         return m_pFont;
1200     }
1201
1202 protected:
1203
1204     CPDF_FormField(CPDF_InterForm* pForm, CPDF_Dictionary* pDict);
1205
1206     ~CPDF_FormField();
1207
1208     CPDF_FormField::Type        m_Type;
1209
1210     FX_DWORD                            m_Flags;
1211
1212     CPDF_InterForm*                     m_pForm;
1213
1214     CPDF_Dictionary*            m_pDict;
1215
1216     CFX_PtrArray                        m_ControlList;
1217     friend class                        CPDF_InterForm;
1218     friend class                        CPDF_FormControl;
1219
1220
1221
1222     CFX_WideString                      GetValue(FX_BOOL bDefault);
1223
1224     FX_BOOL                                     SetValue(const CFX_WideString& value, FX_BOOL bDefault, FX_BOOL bNotify);
1225
1226
1227     void                                        SyncFieldFlags();
1228
1229     int                                         FindListSel(CPDF_String* str);
1230
1231     CFX_WideString                      GetOptionText(int index, int sub_index);
1232
1233     void                                        LoadDA();
1234
1235     void                                        UpdateAP(CPDF_FormControl* pControl);
1236
1237
1238
1239     CFX_WideString                      GetCheckValue(FX_BOOL bDefault);
1240
1241     FX_BOOL                                     SetCheckValue(const CFX_WideString& value, FX_BOOL bDefault, FX_BOOL bNotify);
1242
1243
1244     FX_FLOAT                            m_FontSize;
1245
1246     CPDF_Font*                          m_pFont;
1247 };
1248 CPDF_Object*    FPDF_GetFieldAttr(CPDF_Dictionary* pFieldDict, const FX_CHAR* name, int nLevel = 0);
1249 class CPDF_IconFit 
1250 {
1251 public:
1252
1253     CPDF_IconFit(CPDF_Dictionary* pDict = NULL)
1254     {
1255         m_pDict = pDict;
1256     }
1257
1258     operator CPDF_Dictionary*() const
1259     {
1260         return m_pDict;
1261     }
1262
1263
1264
1265
1266     enum ScaleMethod {
1267         Always = 0,
1268         Bigger,
1269         Smaller,
1270         Never
1271     };
1272
1273     ScaleMethod                         GetScaleMethod();
1274
1275
1276
1277
1278     FX_BOOL                                     IsProportionalScale();
1279
1280
1281
1282
1283     void                                        GetIconPosition(FX_FLOAT& fLeft, FX_FLOAT& fBottom);
1284
1285
1286
1287
1288     FX_BOOL                                     GetFittingBounds();
1289
1290
1291     CPDF_Dictionary*            m_pDict;
1292 };
1293
1294 #define TEXTPOS_CAPTION         0
1295 #define TEXTPOS_ICON            1
1296 #define TEXTPOS_BELOW           2
1297 #define TEXTPOS_ABOVE           3
1298 #define TEXTPOS_RIGHT           4
1299 #define TEXTPOS_LEFT            5
1300 #define TEXTPOS_OVERLAID        6
1301 class CPDF_FormControl 
1302 {
1303 public:
1304
1305     CPDF_FormField::Type        GetType()
1306     {
1307         return m_pField->GetType();
1308     }
1309
1310     CPDF_InterForm*                     GetInterForm() const
1311     {
1312         return m_pForm;
1313     }
1314
1315     CPDF_FormField*                     GetField() const
1316     {
1317         return m_pField;
1318     }
1319
1320     CPDF_Dictionary*            GetWidget() const
1321     {
1322         return m_pWidgetDict;
1323     }
1324
1325     CFX_FloatRect                       GetRect();
1326
1327     void                                        DrawControl(CFX_RenderDevice* pDevice, CFX_AffineMatrix* pMatrix,
1328                                         CPDF_Page* pPage, CPDF_Annot::AppearanceMode mode, const CPDF_RenderOptions* pOptions = NULL);
1329
1330
1331
1332     CFX_ByteString                      GetCheckedAPState();
1333
1334     CFX_WideString                      GetExportValue();
1335
1336     FX_BOOL                                     IsChecked();
1337
1338     FX_BOOL                                     IsDefaultChecked();
1339
1340
1341
1342
1343     enum HighlightingMode       {
1344         None = 0,
1345         Invert,
1346         Outline,
1347         Push,
1348         Toggle
1349     };
1350
1351     HighlightingMode            GetHighlightingMode();
1352
1353
1354
1355
1356     FX_BOOL                                     HasMKEntry(CFX_ByteString csEntry);
1357
1358
1359
1360
1361     int                                         GetRotation();
1362
1363
1364
1365
1366     inline FX_ARGB                      GetBorderColor(int& iColorType)
1367     {
1368         return GetColor(iColorType, "BC");
1369     }
1370
1371     inline FX_FLOAT                     GetOriginalBorderColor(int index)
1372     {
1373         return GetOriginalColor(index, "BC");
1374     }
1375
1376     inline void                         GetOriginalBorderColor(int& iColorType, FX_FLOAT fc[4])
1377     {
1378         GetOriginalColor(iColorType, fc, "BC");
1379     }
1380
1381
1382
1383
1384     inline FX_ARGB                      GetBackgroundColor(int& iColorType)
1385     {
1386         return GetColor(iColorType, "BG");
1387     }
1388
1389     inline FX_FLOAT                     GetOriginalBackgroundColor(int index)
1390     {
1391         return GetOriginalColor(index, "BG");
1392     }
1393
1394     inline void                         GetOriginalBackgroundColor(int& iColorType, FX_FLOAT fc[4])
1395     {
1396         GetOriginalColor(iColorType, fc, "BG");
1397     }
1398
1399
1400
1401
1402     inline CFX_WideString       GetNormalCaption()
1403     {
1404         return GetCaption("CA");
1405     }
1406
1407
1408
1409
1410     inline CFX_WideString       GetRolloverCaption()
1411     {
1412         return GetCaption("RC");
1413     }
1414
1415
1416
1417
1418     inline CFX_WideString       GetDownCaption()
1419     {
1420         return GetCaption("AC");
1421     }
1422
1423
1424
1425
1426     inline CPDF_Stream*         GetNormalIcon()
1427     {
1428         return GetIcon("I");
1429     }
1430
1431
1432
1433
1434     inline CPDF_Stream*         GetRolloverIcon()
1435     {
1436         return GetIcon("RI");
1437     }
1438
1439
1440
1441
1442     inline CPDF_Stream*         GetDownIcon()
1443     {
1444         return GetIcon("IX");
1445     }
1446
1447
1448
1449
1450     CPDF_IconFit                        GetIconFit();
1451
1452
1453
1454
1455     int                                         GetTextPosition();
1456
1457
1458
1459
1460     CPDF_Action                         GetAction();
1461
1462
1463
1464
1465     CPDF_AAction                        GetAdditionalAction();
1466
1467
1468
1469
1470     CPDF_DefaultAppearance      GetDefaultAppearance();
1471
1472     CPDF_Font*                          GetDefaultControlFont();
1473
1474
1475
1476
1477     int                                         GetControlAlignment();
1478
1479 protected:
1480
1481     CPDF_FormControl(CPDF_FormField* pField, CPDF_Dictionary* pWidgetDict);
1482
1483     CFX_ByteString                      GetOnStateName();
1484
1485     void                                        SetOnStateName(const CFX_ByteString& csOn);
1486
1487     void                                        CheckControl(FX_BOOL bChecked);
1488
1489     FX_ARGB                                     GetColor(int& iColorType, CFX_ByteString csEntry);
1490
1491     FX_FLOAT                            GetOriginalColor(int index, CFX_ByteString csEntry);
1492
1493     void                                        GetOriginalColor(int& iColorType, FX_FLOAT fc[4], CFX_ByteString csEntry);
1494
1495     CFX_WideString                      GetCaption(CFX_ByteString csEntry);
1496
1497     CPDF_Stream*                        GetIcon(CFX_ByteString csEntry);
1498
1499     CPDF_ApSettings                     GetMK(FX_BOOL bCreate);
1500
1501     CPDF_InterForm*                     m_pForm;
1502
1503     CPDF_FormField*                     m_pField;
1504
1505     CPDF_Dictionary*            m_pWidgetDict;
1506     friend class                        CPDF_InterForm;
1507     friend class                        CPDF_FormField;
1508 };
1509 class CPDF_FormNotify 
1510 {
1511 public:
1512
1513     virtual ~CPDF_FormNotify() {}
1514
1515     virtual int         BeforeValueChange(const CPDF_FormField* pField, CFX_WideString& csValue)
1516     {
1517         return 0;
1518     }
1519
1520     virtual int         AfterValueChange(const CPDF_FormField* pField)
1521     {
1522         return 0;
1523     }
1524
1525     virtual int         BeforeSelectionChange(const CPDF_FormField* pField, CFX_WideString& csValue)
1526     {
1527         return 0;
1528     }
1529
1530     virtual int         AfterSelectionChange(const CPDF_FormField* pField)
1531     {
1532         return 0;
1533     }
1534
1535     virtual int         AfterCheckedStatusChange(const CPDF_FormField* pField, const CFX_ByteArray& statusArray)
1536     {
1537         return 0;
1538     }
1539
1540     virtual int         BeforeFormReset(const CPDF_InterForm* pForm)
1541     {
1542         return 0;
1543     }
1544
1545     virtual int         AfterFormReset(const CPDF_InterForm* pForm)
1546     {
1547         return 0;
1548     }
1549
1550     virtual int         BeforeFormImportData(const CPDF_InterForm* pForm)
1551     {
1552         return 0;
1553     }
1554
1555     virtual int         AfterFormImportData(const CPDF_InterForm* pForm)
1556     {
1557         return 0;
1558     }
1559 };
1560 FX_BOOL         FPDF_GenerateAP(CPDF_Document* pDoc, CPDF_Dictionary* pAnnotDict);
1561 class CPDF_PageLabel 
1562 {
1563 public:
1564
1565     CPDF_PageLabel(CPDF_Document* pDocument)
1566     {
1567         m_pDocument = pDocument;
1568     }
1569
1570
1571     CFX_WideString                                      GetLabel(int nPage) const;
1572
1573     FX_INT32                                            GetPageByLabel(FX_BSTR bsLabel) const;
1574
1575
1576     FX_INT32                                            GetPageByLabel(FX_WSTR wsLabel) const;
1577
1578 protected:
1579     CPDF_Document*                                      m_pDocument;
1580 };
1581 class CPDF_Metadata
1582 {
1583 public:
1584
1585     CPDF_Metadata();
1586
1587
1588     ~CPDF_Metadata();
1589
1590     void                                LoadDoc(CPDF_Document *pDoc);
1591
1592
1593     FX_INT32                    GetString(FX_BSTR bsItem, CFX_WideString &wsStr);
1594
1595     CXML_Element*               GetRoot() const;
1596
1597     CXML_Element*               GetRDF() const;
1598
1599 protected:
1600     FX_LPVOID   m_pData;
1601 };
1602 class CPDF_ViewerPreferences
1603 {
1604 public:
1605
1606     CPDF_ViewerPreferences(CPDF_Document *pDoc);
1607
1608
1609     ~CPDF_ViewerPreferences();
1610
1611
1612     FX_BOOL IsDirectionR2L() const;
1613
1614     FX_BOOL PrintScaling() const;
1615
1616     FX_INT32 NumCopies() const;
1617
1618     CPDF_Array* PrintPageRange() const;
1619
1620     CFX_ByteString Duplex() const;
1621
1622 protected:
1623     CPDF_Document*      m_pDoc;
1624 };
1625 class CPDF_ApSettings 
1626 {
1627 public:
1628
1629     CPDF_ApSettings(CPDF_Dictionary* pDict = NULL)
1630     {
1631         m_pDict = pDict;
1632     }
1633
1634     operator CPDF_Dictionary* () const
1635     {
1636         return m_pDict;
1637     }
1638
1639     FX_BOOL                                     HasMKEntry(FX_BSTR csEntry);
1640
1641
1642
1643     int                                         GetRotation();
1644
1645
1646
1647
1648     inline FX_ARGB                      GetBorderColor(int& iColorType)
1649     {
1650         return GetColor(iColorType, FX_BSTRC("BC"));
1651     }
1652
1653     inline FX_FLOAT                     GetOriginalBorderColor(int index)
1654     {
1655         return GetOriginalColor(index, FX_BSTRC("BC"));
1656     }
1657
1658     inline void                         GetOriginalBorderColor(int& iColorType, FX_FLOAT fc[4])
1659     {
1660         GetOriginalColor(iColorType, fc, FX_BSTRC("BC"));
1661     }
1662
1663
1664
1665
1666     inline FX_ARGB                      GetBackgroundColor(int& iColorType)
1667     {
1668         return GetColor(iColorType, FX_BSTRC("BG"));
1669     }
1670
1671     inline FX_FLOAT                     GetOriginalBackgroundColor(int index)
1672     {
1673         return GetOriginalColor(index, FX_BSTRC("BG"));
1674     }
1675
1676     inline void                         GetOriginalBackgroundColor(int& iColorType, FX_FLOAT fc[4])
1677     {
1678         GetOriginalColor(iColorType, fc, FX_BSTRC("BG"));
1679     }
1680
1681
1682
1683
1684     inline CFX_WideString       GetNormalCaption()
1685     {
1686         return GetCaption(FX_BSTRC("CA"));
1687     }
1688
1689
1690
1691
1692     inline CFX_WideString       GetRolloverCaption()
1693     {
1694         return GetCaption(FX_BSTRC("RC"));
1695     }
1696
1697
1698
1699
1700     inline CFX_WideString       GetDownCaption()
1701     {
1702         return GetCaption(FX_BSTRC("AC"));
1703     }
1704
1705
1706
1707
1708     inline CPDF_Stream*         GetNormalIcon()
1709     {
1710         return GetIcon(FX_BSTRC("I"));
1711     }
1712
1713
1714
1715
1716     inline CPDF_Stream*         GetRolloverIcon()
1717     {
1718         return GetIcon(FX_BSTRC("RI"));
1719     }
1720
1721
1722
1723
1724     inline CPDF_Stream*         GetDownIcon()
1725     {
1726         return GetIcon(FX_BSTRC("IX"));
1727     }
1728
1729
1730
1731
1732     CPDF_IconFit                        GetIconFit();
1733
1734
1735
1736
1737     int                                         GetTextPosition();
1738
1739     CPDF_Dictionary*            m_pDict;
1740 protected:
1741
1742     FX_ARGB                                     GetColor(int& iColorType, FX_BSTR csEntry);
1743
1744     FX_FLOAT                            GetOriginalColor(int index, FX_BSTR csEntry);
1745
1746     void                                        GetOriginalColor(int& iColorType, FX_FLOAT fc[4], FX_BSTR csEntry);
1747
1748     CFX_WideString                      GetCaption(FX_BSTR csEntry);
1749
1750     CPDF_Stream*                        GetIcon(FX_BSTR csEntry);
1751     friend class                        CPDF_FormControl;
1752 };
1753
1754 #endif  // CORE_INCLUDE_FPDFDOC_FPDF_DOC_H_