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