• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2016 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_FPDFDOC_CPDF_FORMFIELD_H_
8 #define CORE_FPDFDOC_CPDF_FORMFIELD_H_
9 
10 #include <memory>
11 #include <utility>
12 #include <vector>
13 
14 #include "core/fpdfdoc/cpdf_aaction.h"
15 #include "core/fpdfdoc/cpdf_formfield.h"
16 #include "core/fxcrt/fx_string.h"
17 #include "core/fxcrt/fx_system.h"
18 #include "core/fxcrt/unowned_ptr.h"
19 #include "third_party/base/stl_util.h"
20 
21 enum class FormFieldType : uint8_t {
22   kUnknown = 0,
23   kPushButton = 1,
24   kCheckBox = 2,
25   kRadioButton = 3,
26   kComboBox = 4,
27   kListBox = 5,
28   kTextField = 6,
29   kSignature = 7,
30 #ifdef PDF_ENABLE_XFA
31   kXFA = 8,  // Generic XFA field, should use value below if possible.
32   kXFA_CheckBox = 9,
33   kXFA_ComboBox = 10,
34   kXFA_ImageField = 11,
35   kXFA_ListBox = 12,
36   kXFA_PushButton = 13,
37   kXFA_Signature = 14,
38   kXFA_TextField = 15
39 #endif  // PDF_ENABLE_XFA
40 };
41 
42 Optional<FormFieldType> IntToFormFieldType(int value);
43 
44 // If values are added to FormFieldType, these will need to be updated.
45 #ifdef PDF_ENABLE_XFA
46 constexpr size_t kFormFieldTypeCount = 16;
47 #else
48 constexpr size_t kFormFieldTypeCount = 8;
49 #endif  // PDF_ENABLE_XFA
50 
51 constexpr FormFieldType kFormFieldTypes[kFormFieldTypeCount] = {
52     FormFieldType::kUnknown,
53     FormFieldType::kPushButton,
54     FormFieldType::kCheckBox,
55     FormFieldType::kRadioButton,
56     FormFieldType::kComboBox,
57     FormFieldType::kListBox,
58     FormFieldType::kTextField,
59     FormFieldType::kSignature,
60 #ifdef PDF_ENABLE_XFA
61     FormFieldType::kXFA,
62     FormFieldType::kXFA_CheckBox,
63     FormFieldType::kXFA_ComboBox,
64     FormFieldType::kXFA_ImageField,
65     FormFieldType::kXFA_ListBox,
66     FormFieldType::kXFA_PushButton,
67     FormFieldType::kXFA_Signature,
68     FormFieldType::kXFA_TextField
69 #endif  // PDF_ENABLE_XFA
70 };
71 
72 #define FORMFLAG_READONLY 0x01
73 #define FORMFLAG_REQUIRED 0x02
74 #define FORMFLAG_NOEXPORT 0x04
75 
76 class CPDF_Dictionary;
77 class CPDF_Font;
78 class CPDF_FormControl;
79 class CPDF_InterForm;
80 class CPDF_String;
81 
82 CPDF_Object* FPDF_GetFieldAttr(const CPDF_Dictionary* pFieldDict,
83                                const char* name,
84                                int nLevel = 0);
85 WideString FPDF_GetFullName(CPDF_Dictionary* pFieldDict);
86 
87 class CPDF_FormField {
88  public:
89   enum Type {
90     Unknown,
91     PushButton,
92     RadioButton,
93     CheckBox,
94     Text,
95     RichText,
96     File,
97     ListBox,
98     ComboBox,
99     Sign
100   };
101 
102   CPDF_FormField(CPDF_InterForm* pForm, CPDF_Dictionary* pDict);
103   ~CPDF_FormField();
104 
105   WideString GetFullName() const;
106 
GetType()107   Type GetType() const { return m_Type; }
GetFlags()108   uint32_t GetFlags() const { return m_Flags; }
109 
GetFieldDict()110   CPDF_Dictionary* GetFieldDict() const { return m_pDict.Get(); }
SetFieldDict(CPDF_Dictionary * pDict)111   void SetFieldDict(CPDF_Dictionary* pDict) { m_pDict = pDict; }
112 
113   bool ResetField(bool bNotify = false);
114 
CountControls()115   int CountControls() const {
116     return pdfium::CollectionSize<int>(m_ControlList);
117   }
118 
GetControl(int index)119   CPDF_FormControl* GetControl(int index) const {
120     return m_ControlList[index].Get();
121   }
122 
123   int GetControlIndex(const CPDF_FormControl* pControl) const;
124   FormFieldType GetFieldType() const;
125 
126   CPDF_AAction GetAdditionalAction() const;
127   WideString GetAlternateName() const;
128   WideString GetMappingName() const;
129 
130   uint32_t GetFieldFlags() const;
131   ByteString GetDefaultStyle() const;
132   WideString GetRichTextString() const;
133 
134   WideString GetValue() const;
135   WideString GetDefaultValue() const;
136   bool SetValue(const WideString& value, bool bNotify = false);
137 
138   int GetMaxLen() const;
139   int CountSelectedItems() const;
140   int GetSelectedIndex(int index) const;
141 
142   bool ClearSelection(bool bNotify = false);
143   bool IsItemSelected(int index) const;
144   bool SetItemSelection(int index, bool bSelected, bool bNotify = false);
145 
146   bool IsItemDefaultSelected(int index) const;
147 
148   int GetDefaultSelectedItem() const;
149   int CountOptions() const;
150 
151   WideString GetOptionLabel(int index) const;
152   WideString GetOptionValue(int index) const;
153 
154   int FindOption(WideString csOptLabel) const;
155   int FindOptionValue(const WideString& csOptValue) const;
156 
157   bool CheckControl(int iControlIndex, bool bChecked, bool bNotify = false);
158 
159   int GetTopVisibleIndex() const;
160   int CountSelectedOptions() const;
161 
162   int GetSelectedOptionIndex(int index) const;
163   bool IsOptionSelected(int iOptIndex) const;
164 
165   bool SelectOption(int iOptIndex, bool bSelected, bool bNotify = false);
166 
167   bool ClearSelectedOptions(bool bNotify = false);
168 
169 #ifdef PDF_ENABLE_XFA
170   bool ClearOptions(bool bNotify = false);
171 
172   int InsertOption(WideString csOptLabel, int index = -1, bool bNotify = false);
173 #endif  // PDF_ENABLE_XFA
174 
GetFontSize()175   float GetFontSize() const { return m_FontSize; }
GetFont()176   CPDF_Font* GetFont() const { return m_pFont.Get(); }
177 
GetDict()178   const CPDF_Dictionary* GetDict() const { return m_pDict.Get(); }
GetForm()179   const CPDF_InterForm* GetForm() const { return m_pForm.Get(); }
180 
181   WideString GetCheckValue(bool bDefault) const;
182 
AddFormControl(CPDF_FormControl * pFormControl)183   void AddFormControl(CPDF_FormControl* pFormControl) {
184     m_ControlList.emplace_back(pFormControl);
185   }
186 
SetOpt(std::unique_ptr<CPDF_Object> pOpt)187   void SetOpt(std::unique_ptr<CPDF_Object> pOpt) {
188     m_pDict->SetFor("Opt", std::move(pOpt));
189   }
190 
191  private:
192   WideString GetValue(bool bDefault) const;
193   bool SetValue(const WideString& value, bool bDefault, bool bNotify);
194 
195   void SyncFieldFlags();
196   int FindListSel(CPDF_String* str);
197   WideString GetOptionText(int index, int sub_index) const;
198 
199   void LoadDA();
200   bool SetCheckValue(const WideString& value, bool bDefault, bool bNotify);
201 
202   bool NotifyBeforeSelectionChange(const WideString& value);
203   void NotifyAfterSelectionChange();
204 
205   bool NotifyBeforeValueChange(const WideString& value);
206   void NotifyAfterValueChange();
207 
208   bool NotifyListOrComboBoxBeforeChange(const WideString& value);
209   void NotifyListOrComboBoxAfterChange();
210 
211   CPDF_FormField::Type m_Type;
212   uint32_t m_Flags;
213   UnownedPtr<CPDF_InterForm> const m_pForm;
214   UnownedPtr<CPDF_Dictionary> m_pDict;
215   // Owned by InterForm parent.
216   std::vector<UnownedPtr<CPDF_FormControl>> m_ControlList;
217   float m_FontSize;
218   UnownedPtr<CPDF_Font> m_pFont;
219 };
220 
221 #endif  // CORE_FPDFDOC_CPDF_FORMFIELD_H_
222