xref: /aosp_15_r20/external/pdfium/fpdfsdk/cpdfsdk_interactiveform.h (revision 3ac0a46f773bac49fa9476ec2b1cf3f8da5ec3a4)
1*3ac0a46fSAndroid Build Coastguard Worker // Copyright 2016 The PDFium Authors
2*3ac0a46fSAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*3ac0a46fSAndroid Build Coastguard Worker // found in the LICENSE file.
4*3ac0a46fSAndroid Build Coastguard Worker 
5*3ac0a46fSAndroid Build Coastguard Worker // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6*3ac0a46fSAndroid Build Coastguard Worker 
7*3ac0a46fSAndroid Build Coastguard Worker #ifndef FPDFSDK_CPDFSDK_INTERACTIVEFORM_H_
8*3ac0a46fSAndroid Build Coastguard Worker #define FPDFSDK_CPDFSDK_INTERACTIVEFORM_H_
9*3ac0a46fSAndroid Build Coastguard Worker 
10*3ac0a46fSAndroid Build Coastguard Worker #include <functional>
11*3ac0a46fSAndroid Build Coastguard Worker #include <map>
12*3ac0a46fSAndroid Build Coastguard Worker #include <memory>
13*3ac0a46fSAndroid Build Coastguard Worker #include <vector>
14*3ac0a46fSAndroid Build Coastguard Worker 
15*3ac0a46fSAndroid Build Coastguard Worker #include "core/fpdfdoc/cpdf_action.h"
16*3ac0a46fSAndroid Build Coastguard Worker #include "core/fpdfdoc/cpdf_interactiveform.h"
17*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxcrt/unowned_ptr.h"
18*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxge/dib/fx_dib.h"
19*3ac0a46fSAndroid Build Coastguard Worker #include "fpdfsdk/cpdfsdk_widget.h"
20*3ac0a46fSAndroid Build Coastguard Worker #include "third_party/abseil-cpp/absl/types/optional.h"
21*3ac0a46fSAndroid Build Coastguard Worker 
22*3ac0a46fSAndroid Build Coastguard Worker class CPDF_Dictionary;
23*3ac0a46fSAndroid Build Coastguard Worker class CPDF_FormControl;
24*3ac0a46fSAndroid Build Coastguard Worker class CPDF_FormField;
25*3ac0a46fSAndroid Build Coastguard Worker class CPDF_Object;
26*3ac0a46fSAndroid Build Coastguard Worker class CPDFSDK_FormFillEnvironment;
27*3ac0a46fSAndroid Build Coastguard Worker 
28*3ac0a46fSAndroid Build Coastguard Worker class CPDFSDK_InteractiveForm final
29*3ac0a46fSAndroid Build Coastguard Worker     : public CPDF_InteractiveForm::NotifierIface {
30*3ac0a46fSAndroid Build Coastguard Worker  public:
31*3ac0a46fSAndroid Build Coastguard Worker   explicit CPDFSDK_InteractiveForm(CPDFSDK_FormFillEnvironment* pFormFillEnv);
32*3ac0a46fSAndroid Build Coastguard Worker   ~CPDFSDK_InteractiveForm() override;
33*3ac0a46fSAndroid Build Coastguard Worker 
GetInteractiveForm()34*3ac0a46fSAndroid Build Coastguard Worker   CPDF_InteractiveForm* GetInteractiveForm() const {
35*3ac0a46fSAndroid Build Coastguard Worker     return m_pInteractiveForm.get();
36*3ac0a46fSAndroid Build Coastguard Worker   }
37*3ac0a46fSAndroid Build Coastguard Worker 
38*3ac0a46fSAndroid Build Coastguard Worker   CPDFSDK_Widget* GetWidget(CPDF_FormControl* pControl) const;
39*3ac0a46fSAndroid Build Coastguard Worker   void GetWidgets(const WideString& sFieldName,
40*3ac0a46fSAndroid Build Coastguard Worker                   std::vector<ObservedPtr<CPDFSDK_Widget>>* widgets) const;
41*3ac0a46fSAndroid Build Coastguard Worker   void GetWidgets(CPDF_FormField* pField,
42*3ac0a46fSAndroid Build Coastguard Worker                   std::vector<ObservedPtr<CPDFSDK_Widget>>* widgets) const;
43*3ac0a46fSAndroid Build Coastguard Worker 
44*3ac0a46fSAndroid Build Coastguard Worker   void AddMap(CPDF_FormControl* pControl, CPDFSDK_Widget* pWidget);
45*3ac0a46fSAndroid Build Coastguard Worker   void RemoveMap(CPDF_FormControl* pControl);
46*3ac0a46fSAndroid Build Coastguard Worker 
47*3ac0a46fSAndroid Build Coastguard Worker   void EnableCalculate(bool bEnabled);
48*3ac0a46fSAndroid Build Coastguard Worker   bool IsCalculateEnabled() const;
49*3ac0a46fSAndroid Build Coastguard Worker 
50*3ac0a46fSAndroid Build Coastguard Worker #ifdef PDF_ENABLE_XFA
51*3ac0a46fSAndroid Build Coastguard Worker   void XfaEnableCalculate(bool bEnabled);
52*3ac0a46fSAndroid Build Coastguard Worker   bool IsXfaCalculateEnabled() const;
53*3ac0a46fSAndroid Build Coastguard Worker   bool IsXfaValidationsEnabled();
54*3ac0a46fSAndroid Build Coastguard Worker   void XfaSetValidationsEnabled(bool bEnabled);
55*3ac0a46fSAndroid Build Coastguard Worker   void SynchronizeField(CPDF_FormField* pFormField);
56*3ac0a46fSAndroid Build Coastguard Worker #endif  // PDF_ENABLE_XFA
57*3ac0a46fSAndroid Build Coastguard Worker 
58*3ac0a46fSAndroid Build Coastguard Worker   bool OnKeyStrokeCommit(CPDF_FormField* pFormField, const WideString& csValue);
59*3ac0a46fSAndroid Build Coastguard Worker   bool OnValidate(CPDF_FormField* pFormField, const WideString& csValue);
60*3ac0a46fSAndroid Build Coastguard Worker   void OnCalculate(CPDF_FormField* pFormField);
61*3ac0a46fSAndroid Build Coastguard Worker   absl::optional<WideString> OnFormat(CPDF_FormField* pFormField);
62*3ac0a46fSAndroid Build Coastguard Worker 
63*3ac0a46fSAndroid Build Coastguard Worker   void ResetFieldAppearance(CPDF_FormField* pFormField,
64*3ac0a46fSAndroid Build Coastguard Worker                             absl::optional<WideString> sValue);
65*3ac0a46fSAndroid Build Coastguard Worker   void UpdateField(CPDF_FormField* pFormField);
66*3ac0a46fSAndroid Build Coastguard Worker 
67*3ac0a46fSAndroid Build Coastguard Worker   bool DoAction_Hide(const CPDF_Action& action);
68*3ac0a46fSAndroid Build Coastguard Worker   bool DoAction_SubmitForm(const CPDF_Action& action);
69*3ac0a46fSAndroid Build Coastguard Worker   void DoAction_ResetForm(const CPDF_Action& action);
70*3ac0a46fSAndroid Build Coastguard Worker 
71*3ac0a46fSAndroid Build Coastguard Worker   std::vector<CPDF_FormField*> GetFieldFromObjects(
72*3ac0a46fSAndroid Build Coastguard Worker       const std::vector<RetainPtr<const CPDF_Object>>& objects) const;
73*3ac0a46fSAndroid Build Coastguard Worker   bool SubmitFields(const WideString& csDestination,
74*3ac0a46fSAndroid Build Coastguard Worker                     const std::vector<CPDF_FormField*>& fields,
75*3ac0a46fSAndroid Build Coastguard Worker                     bool bIncludeOrExclude,
76*3ac0a46fSAndroid Build Coastguard Worker                     bool bUrlEncoded);
77*3ac0a46fSAndroid Build Coastguard Worker   bool SubmitForm(const WideString& sDestination);
78*3ac0a46fSAndroid Build Coastguard Worker   ByteString ExportFormToFDFTextBuf();
79*3ac0a46fSAndroid Build Coastguard Worker   ByteString ExportFieldsToFDFTextBuf(
80*3ac0a46fSAndroid Build Coastguard Worker       const std::vector<CPDF_FormField*>& fields,
81*3ac0a46fSAndroid Build Coastguard Worker       bool bIncludeOrExclude);
82*3ac0a46fSAndroid Build Coastguard Worker 
83*3ac0a46fSAndroid Build Coastguard Worker   bool IsNeedHighLight(FormFieldType fieldType) const;
84*3ac0a46fSAndroid Build Coastguard Worker   void RemoveAllHighLights();
SetHighlightAlpha(uint8_t alpha)85*3ac0a46fSAndroid Build Coastguard Worker   void SetHighlightAlpha(uint8_t alpha) { m_HighlightAlpha = alpha; }
GetHighlightAlpha()86*3ac0a46fSAndroid Build Coastguard Worker   uint8_t GetHighlightAlpha() { return m_HighlightAlpha; }
87*3ac0a46fSAndroid Build Coastguard Worker   void SetHighlightColor(FX_COLORREF clr, FormFieldType fieldType);
88*3ac0a46fSAndroid Build Coastguard Worker   void SetAllHighlightColors(FX_COLORREF clr);
89*3ac0a46fSAndroid Build Coastguard Worker   FX_COLORREF GetHighlightColor(FormFieldType fieldType);
90*3ac0a46fSAndroid Build Coastguard Worker 
91*3ac0a46fSAndroid Build Coastguard Worker  private:
92*3ac0a46fSAndroid Build Coastguard Worker   // CPDF_InteractiveForm::NotifierIface:
93*3ac0a46fSAndroid Build Coastguard Worker   bool BeforeValueChange(CPDF_FormField* pField,
94*3ac0a46fSAndroid Build Coastguard Worker                          const WideString& csValue) override;
95*3ac0a46fSAndroid Build Coastguard Worker   void AfterValueChange(CPDF_FormField* pField) override;
96*3ac0a46fSAndroid Build Coastguard Worker   bool BeforeSelectionChange(CPDF_FormField* pField,
97*3ac0a46fSAndroid Build Coastguard Worker                              const WideString& csValue) override;
98*3ac0a46fSAndroid Build Coastguard Worker   void AfterSelectionChange(CPDF_FormField* pField) override;
99*3ac0a46fSAndroid Build Coastguard Worker   void AfterCheckedStatusChange(CPDF_FormField* pField) override;
100*3ac0a46fSAndroid Build Coastguard Worker   void AfterFormReset(CPDF_InteractiveForm* pForm) override;
101*3ac0a46fSAndroid Build Coastguard Worker 
102*3ac0a46fSAndroid Build Coastguard Worker   int GetPageIndexByAnnotDict(CPDF_Document* pDocument,
103*3ac0a46fSAndroid Build Coastguard Worker                               const CPDF_Dictionary* pAnnotDict) const;
104*3ac0a46fSAndroid Build Coastguard Worker 
105*3ac0a46fSAndroid Build Coastguard Worker   UnownedPtr<CPDFSDK_FormFillEnvironment> const m_pFormFillEnv;
106*3ac0a46fSAndroid Build Coastguard Worker   std::unique_ptr<CPDF_InteractiveForm> const m_pInteractiveForm;
107*3ac0a46fSAndroid Build Coastguard Worker   std::map<UnownedPtr<const CPDF_FormControl>,
108*3ac0a46fSAndroid Build Coastguard Worker            UnownedPtr<CPDFSDK_Widget>,
109*3ac0a46fSAndroid Build Coastguard Worker            std::less<>>
110*3ac0a46fSAndroid Build Coastguard Worker       m_Map;
111*3ac0a46fSAndroid Build Coastguard Worker #ifdef PDF_ENABLE_XFA
112*3ac0a46fSAndroid Build Coastguard Worker   bool m_bXfaCalculate = true;
113*3ac0a46fSAndroid Build Coastguard Worker   bool m_bXfaValidationsEnabled = true;
114*3ac0a46fSAndroid Build Coastguard Worker #endif  // PDF_ENABLE_XFA
115*3ac0a46fSAndroid Build Coastguard Worker   bool m_bCalculate = true;
116*3ac0a46fSAndroid Build Coastguard Worker   bool m_bBusy = false;
117*3ac0a46fSAndroid Build Coastguard Worker   uint8_t m_HighlightAlpha = 0;
118*3ac0a46fSAndroid Build Coastguard Worker   FX_COLORREF m_HighlightColor[kFormFieldTypeCount];
119*3ac0a46fSAndroid Build Coastguard Worker   bool m_NeedsHighlight[kFormFieldTypeCount];
120*3ac0a46fSAndroid Build Coastguard Worker };
121*3ac0a46fSAndroid Build Coastguard Worker 
122*3ac0a46fSAndroid Build Coastguard Worker #endif  // FPDFSDK_CPDFSDK_INTERACTIVEFORM_H_
123