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