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