Home | History | Annotate | Download | only in fpdfdoc
      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 <vector>
     11 
     12 #include "core/fpdfdoc/cpdf_aaction.h"
     13 #include "core/fpdfdoc/cpdf_formfield.h"
     14 #include "core/fxcrt/fx_basic.h"
     15 #include "core/fxcrt/fx_string.h"
     16 #include "core/fxcrt/fx_system.h"
     17 #include "third_party/base/stl_util.h"
     18 
     19 #define FIELDTYPE_UNKNOWN 0
     20 #define FIELDTYPE_PUSHBUTTON 1
     21 #define FIELDTYPE_CHECKBOX 2
     22 #define FIELDTYPE_RADIOBUTTON 3
     23 #define FIELDTYPE_COMBOBOX 4
     24 #define FIELDTYPE_LISTBOX 5
     25 #define FIELDTYPE_TEXTFIELD 6
     26 #define FIELDTYPE_SIGNATURE 7
     27 
     28 #define FORMFLAG_READONLY 0x01
     29 #define FORMFLAG_REQUIRED 0x02
     30 #define FORMFLAG_NOEXPORT 0x04
     31 
     32 class CPDF_Dictionary;
     33 class CPDF_Font;
     34 class CPDF_FormControl;
     35 class CPDF_InterForm;
     36 class CPDF_String;
     37 
     38 CPDF_Object* FPDF_GetFieldAttr(CPDF_Dictionary* pFieldDict,
     39                                const FX_CHAR* name,
     40                                int nLevel = 0);
     41 CFX_WideString FPDF_GetFullName(CPDF_Dictionary* pFieldDict);
     42 
     43 class CPDF_FormField {
     44  public:
     45   enum Type {
     46     Unknown,
     47     PushButton,
     48     RadioButton,
     49     CheckBox,
     50     Text,
     51     RichText,
     52     File,
     53     ListBox,
     54     ComboBox,
     55     Sign
     56   };
     57 
     58   CFX_WideString GetFullName() const;
     59 
     60   Type GetType() const { return m_Type; }
     61   uint32_t GetFlags() const { return m_Flags; }
     62 
     63   CPDF_Dictionary* GetFieldDict() const { return m_pDict; }
     64   void SetFieldDict(CPDF_Dictionary* pDict) { m_pDict = pDict; }
     65 
     66   bool ResetField(bool bNotify = false);
     67 
     68   int CountControls() const {
     69     return pdfium::CollectionSize<int>(m_ControlList);
     70   }
     71 
     72   CPDF_FormControl* GetControl(int index) const { return m_ControlList[index]; }
     73 
     74   int GetControlIndex(const CPDF_FormControl* pControl) const;
     75   int GetFieldType() const;
     76 
     77   CPDF_AAction GetAdditionalAction() const;
     78   CFX_WideString GetAlternateName() const;
     79   CFX_WideString GetMappingName() const;
     80 
     81   uint32_t GetFieldFlags() const;
     82   CFX_ByteString GetDefaultStyle() const;
     83   CFX_WideString GetRichTextString() const;
     84 
     85   CFX_WideString GetValue() const;
     86   CFX_WideString GetDefaultValue() const;
     87   bool SetValue(const CFX_WideString& value, bool bNotify = false);
     88 
     89   int GetMaxLen() const;
     90   int CountSelectedItems() const;
     91   int GetSelectedIndex(int index) const;
     92 
     93   bool ClearSelection(bool bNotify = false);
     94   bool IsItemSelected(int index) const;
     95   bool SetItemSelection(int index, bool bSelected, bool bNotify = false);
     96 
     97   bool IsItemDefaultSelected(int index) const;
     98 
     99   int GetDefaultSelectedItem() const;
    100   int CountOptions() const;
    101 
    102   CFX_WideString GetOptionLabel(int index) const;
    103   CFX_WideString GetOptionValue(int index) const;
    104 
    105   int FindOption(CFX_WideString csOptLabel) const;
    106   int FindOptionValue(const CFX_WideString& csOptValue) const;
    107 
    108   bool CheckControl(int iControlIndex, bool bChecked, bool bNotify = false);
    109 
    110   int GetTopVisibleIndex() const;
    111   int CountSelectedOptions() const;
    112 
    113   int GetSelectedOptionIndex(int index) const;
    114   bool IsOptionSelected(int iOptIndex) const;
    115 
    116   bool SelectOption(int iOptIndex, bool bSelected, bool bNotify = false);
    117 
    118   bool ClearSelectedOptions(bool bNotify = false);
    119 
    120 #ifdef PDF_ENABLE_XFA
    121   bool ClearOptions(bool bNotify = false);
    122 
    123   int InsertOption(CFX_WideString csOptLabel,
    124                    int index = -1,
    125                    bool bNotify = false);
    126 #endif  // PDF_ENABLE_XFA
    127 
    128   FX_FLOAT GetFontSize() const { return m_FontSize; }
    129   CPDF_Font* GetFont() const { return m_pFont; }
    130 
    131  private:
    132   friend class CPDF_InterForm;
    133   friend class CPDF_FormControl;
    134 
    135   CPDF_FormField(CPDF_InterForm* pForm, CPDF_Dictionary* pDict);
    136   ~CPDF_FormField();
    137 
    138   CFX_WideString GetValue(bool bDefault) const;
    139   bool SetValue(const CFX_WideString& value, bool bDefault, bool bNotify);
    140 
    141   void SyncFieldFlags();
    142   int FindListSel(CPDF_String* str);
    143   CFX_WideString GetOptionText(int index, int sub_index) const;
    144 
    145   void LoadDA();
    146   CFX_WideString GetCheckValue(bool bDefault) const;
    147   bool SetCheckValue(const CFX_WideString& value, bool bDefault, bool bNotify);
    148 
    149   bool NotifyBeforeSelectionChange(const CFX_WideString& value);
    150   void NotifyAfterSelectionChange();
    151 
    152   bool NotifyBeforeValueChange(const CFX_WideString& value);
    153   void NotifyAfterValueChange();
    154 
    155   bool NotifyListOrComboBoxBeforeChange(const CFX_WideString& value);
    156   void NotifyListOrComboBoxAfterChange();
    157 
    158   CPDF_FormField::Type m_Type;
    159   uint32_t m_Flags;
    160   CPDF_InterForm* const m_pForm;
    161   CPDF_Dictionary* m_pDict;
    162   std::vector<CPDF_FormControl*> m_ControlList;  // Owned by InterForm parent.
    163   FX_FLOAT m_FontSize;
    164   CPDF_Font* m_pFont;
    165 };
    166 
    167 #endif  // CORE_FPDFDOC_CPDF_FORMFIELD_H_
    168