14d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Copyright 2016 PDFium Authors. All rights reserved.
24d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Use of this source code is governed by a BSD-style license that can be
34d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// found in the LICENSE file.
44d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
54d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
64d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
74d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#ifndef CORE_FPDFDOC_CPDF_FORMFIELD_H_
84d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#define CORE_FPDFDOC_CPDF_FORMFIELD_H_
94d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include <vector>
114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfdoc/cpdf_aaction.h"
134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfdoc/cpdf_formfield.h"
144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fxcrt/fx_basic.h"
154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fxcrt/fx_string.h"
164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fxcrt/fx_system.h"
174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "third_party/base/stl_util.h"
184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#define FIELDTYPE_UNKNOWN 0
204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#define FIELDTYPE_PUSHBUTTON 1
214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#define FIELDTYPE_CHECKBOX 2
224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#define FIELDTYPE_RADIOBUTTON 3
234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#define FIELDTYPE_COMBOBOX 4
244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#define FIELDTYPE_LISTBOX 5
254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#define FIELDTYPE_TEXTFIELD 6
264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#define FIELDTYPE_SIGNATURE 7
274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2833357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann#define FORMFLAG_READONLY 0x01
2933357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann#define FORMFLAG_REQUIRED 0x02
3033357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann#define FORMFLAG_NOEXPORT 0x04
3133357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann
324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannclass CPDF_Dictionary;
334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannclass CPDF_Font;
344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannclass CPDF_FormControl;
354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannclass CPDF_InterForm;
364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannclass CPDF_String;
374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCPDF_Object* FPDF_GetFieldAttr(CPDF_Dictionary* pFieldDict,
394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                               const FX_CHAR* name,
404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                               int nLevel = 0);
414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCFX_WideString FPDF_GetFullName(CPDF_Dictionary* pFieldDict);
424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannclass CPDF_FormField {
444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann public:
454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  enum Type {
464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    Unknown,
474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    PushButton,
484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    RadioButton,
494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CheckBox,
504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    Text,
514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    RichText,
524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    File,
534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    ListBox,
544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    ComboBox,
554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    Sign
564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  };
574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_WideString GetFullName() const;
594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  Type GetType() const { return m_Type; }
614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  uint32_t GetFlags() const { return m_Flags; }
624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_Dictionary* GetFieldDict() const { return m_pDict; }
644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  void SetFieldDict(CPDF_Dictionary* pDict) { m_pDict = pDict; }
654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool ResetField(bool bNotify = false);
674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int CountControls() const {
694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return pdfium::CollectionSize<int>(m_ControlList);
704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_FormControl* GetControl(int index) const { return m_ControlList[index]; }
734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int GetControlIndex(const CPDF_FormControl* pControl) const;
754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int GetFieldType() const;
764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_AAction GetAdditionalAction() const;
784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_WideString GetAlternateName() const;
794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_WideString GetMappingName() const;
804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  uint32_t GetFieldFlags() const;
824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_ByteString GetDefaultStyle() const;
834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_WideString GetRichTextString() const;
844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_WideString GetValue() const;
864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_WideString GetDefaultValue() const;
874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool SetValue(const CFX_WideString& value, bool bNotify = false);
884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int GetMaxLen() const;
904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int CountSelectedItems() const;
914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int GetSelectedIndex(int index) const;
924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool ClearSelection(bool bNotify = false);
944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool IsItemSelected(int index) const;
954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool SetItemSelection(int index, bool bSelected, bool bNotify = false);
964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool IsItemDefaultSelected(int index) const;
984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int GetDefaultSelectedItem() const;
1004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int CountOptions() const;
1014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_WideString GetOptionLabel(int index) const;
1034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_WideString GetOptionValue(int index) const;
1044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int FindOption(CFX_WideString csOptLabel) const;
1064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int FindOptionValue(const CFX_WideString& csOptValue) const;
1074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool CheckControl(int iControlIndex, bool bChecked, bool bNotify = false);
1094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int GetTopVisibleIndex() const;
1114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int CountSelectedOptions() const;
1124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int GetSelectedOptionIndex(int index) const;
1144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool IsOptionSelected(int iOptIndex) const;
1154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool SelectOption(int iOptIndex, bool bSelected, bool bNotify = false);
1174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool ClearSelectedOptions(bool bNotify = false);
1194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#ifdef PDF_ENABLE_XFA
1214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool ClearOptions(bool bNotify = false);
1224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int InsertOption(CFX_WideString csOptLabel,
1244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                   int index = -1,
1254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                   bool bNotify = false);
1264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#endif  // PDF_ENABLE_XFA
1274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  FX_FLOAT GetFontSize() const { return m_FontSize; }
1294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_Font* GetFont() const { return m_pFont; }
1304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann private:
1324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  friend class CPDF_InterForm;
1334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  friend class CPDF_FormControl;
1344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_FormField(CPDF_InterForm* pForm, CPDF_Dictionary* pDict);
1364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  ~CPDF_FormField();
1374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_WideString GetValue(bool bDefault) const;
1394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool SetValue(const CFX_WideString& value, bool bDefault, bool bNotify);
1404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  void SyncFieldFlags();
1424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int FindListSel(CPDF_String* str);
1434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_WideString GetOptionText(int index, int sub_index) const;
1444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  void LoadDA();
1464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_WideString GetCheckValue(bool bDefault) const;
1474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool SetCheckValue(const CFX_WideString& value, bool bDefault, bool bNotify);
1484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool NotifyBeforeSelectionChange(const CFX_WideString& value);
1504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  void NotifyAfterSelectionChange();
1514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool NotifyBeforeValueChange(const CFX_WideString& value);
1534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  void NotifyAfterValueChange();
1544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool NotifyListOrComboBoxBeforeChange(const CFX_WideString& value);
1564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  void NotifyListOrComboBoxAfterChange();
1574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_FormField::Type m_Type;
1594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  uint32_t m_Flags;
1604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_InterForm* const m_pForm;
1614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_Dictionary* m_pDict;
1624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  std::vector<CPDF_FormControl*> m_ControlList;  // Owned by InterForm parent.
1634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  FX_FLOAT m_FontSize;
1644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_Font* m_pFont;
1654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann};
1664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#endif  // CORE_FPDFDOC_CPDF_FORMFIELD_H_
168