1 // Copyright 2016 PDFium Authors. All rights reserved. 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_INTERFORM_H_ 8 #define FPDFSDK_CPDFSDK_INTERFORM_H_ 9 10 #include <map> 11 #include <memory> 12 #include <vector> 13 14 #include "core/fpdfdoc/cpdf_action.h" 15 #include "core/fpdfdoc/ipdf_formnotify.h" 16 #include "core/fxcrt/fx_basic.h" 17 #include "core/fxge/fx_dib.h" 18 #include "fpdfsdk/cpdfsdk_widget.h" 19 20 class CPDF_Dictionary; 21 class CPDF_FormControl; 22 class CPDF_FormField; 23 class CPDF_InterForm; 24 class CPDF_Object; 25 class CPDFSDK_FormFillEnvironment; 26 27 #ifdef PDF_ENABLE_XFA 28 class CPDFSDK_XFAWidget; 29 class CXFA_FFWidget; 30 #endif // PDF_ENABLE_XFA 31 32 class CPDFSDK_InterForm : public IPDF_FormNotify { 33 public: 34 explicit CPDFSDK_InterForm(CPDFSDK_FormFillEnvironment* pFormFillEnv); 35 ~CPDFSDK_InterForm() override; 36 GetInterForm()37 CPDF_InterForm* GetInterForm() const { return m_pInterForm.get(); } GetFormFillEnv()38 CPDFSDK_FormFillEnvironment* GetFormFillEnv() const { return m_pFormFillEnv; } 39 40 bool HighlightWidgets(); 41 42 CPDFSDK_Widget* GetSibling(CPDFSDK_Widget* pWidget, bool bNext) const; 43 CPDFSDK_Widget* GetWidget(CPDF_FormControl* pControl) const; 44 void GetWidgets(const CFX_WideString& sFieldName, 45 std::vector<CPDFSDK_Annot::ObservedPtr>* widgets) const; 46 void GetWidgets(CPDF_FormField* pField, 47 std::vector<CPDFSDK_Annot::ObservedPtr>* widgets) const; 48 49 void AddMap(CPDF_FormControl* pControl, CPDFSDK_Widget* pWidget); 50 void RemoveMap(CPDF_FormControl* pControl); 51 52 void EnableCalculate(bool bEnabled); 53 bool IsCalculateEnabled() const; 54 55 #ifdef PDF_ENABLE_XFA 56 void AddXFAMap(CXFA_FFWidget* hWidget, CPDFSDK_XFAWidget* pWidget); 57 void RemoveXFAMap(CXFA_FFWidget* hWidget); 58 CPDFSDK_XFAWidget* GetXFAWidget(CXFA_FFWidget* hWidget); 59 void XfaEnableCalculate(bool bEnabled); 60 bool IsXfaCalculateEnabled() const; 61 bool IsXfaValidationsEnabled(); 62 void XfaSetValidationsEnabled(bool bEnabled); 63 void SynchronizeField(CPDF_FormField* pFormField, bool bSynchronizeElse); 64 #endif // PDF_ENABLE_XFA 65 66 bool OnKeyStrokeCommit(CPDF_FormField* pFormField, 67 const CFX_WideString& csValue); 68 bool OnValidate(CPDF_FormField* pFormField, const CFX_WideString& csValue); 69 void OnCalculate(CPDF_FormField* pFormField = nullptr); 70 CFX_WideString OnFormat(CPDF_FormField* pFormField, bool& bFormatted); 71 72 void ResetFieldAppearance(CPDF_FormField* pFormField, 73 const CFX_WideString* sValue, 74 bool bValueChanged); 75 void UpdateField(CPDF_FormField* pFormField); 76 77 bool DoAction_Hide(const CPDF_Action& action); 78 bool DoAction_SubmitForm(const CPDF_Action& action); 79 bool DoAction_ResetForm(const CPDF_Action& action); 80 bool DoAction_ImportData(const CPDF_Action& action); 81 82 std::vector<CPDF_FormField*> GetFieldFromObjects( 83 const std::vector<CPDF_Object*>& objects) const; 84 bool IsValidField(CPDF_Dictionary* pFieldDict); 85 bool SubmitFields(const CFX_WideString& csDestination, 86 const std::vector<CPDF_FormField*>& fields, 87 bool bIncludeOrExclude, 88 bool bUrlEncoded); 89 bool SubmitForm(const CFX_WideString& sDestination, bool bUrlEncoded); 90 bool ExportFormToFDFTextBuf(CFX_ByteTextBuf& textBuf); 91 bool ExportFieldsToFDFTextBuf(const std::vector<CPDF_FormField*>& fields, 92 bool bIncludeOrExclude, 93 CFX_ByteTextBuf& textBuf); 94 CFX_WideString GetTemporaryFileName(const CFX_WideString& sFileExt); 95 96 bool IsNeedHighLight(int nFieldType); 97 void RemoveAllHighLight(); SetHighlightAlpha(uint8_t alpha)98 void SetHighlightAlpha(uint8_t alpha) { m_iHighlightAlpha = alpha; } GetHighlightAlpha()99 uint8_t GetHighlightAlpha() { return m_iHighlightAlpha; } 100 void SetHighlightColor(FX_COLORREF clr, int nFieldType); 101 FX_COLORREF GetHighlightColor(int nFieldType); 102 103 private: 104 // IPDF_FormNotify: 105 int BeforeValueChange(CPDF_FormField* pField, 106 const CFX_WideString& csValue) override; 107 void AfterValueChange(CPDF_FormField* pField) override; 108 int BeforeSelectionChange(CPDF_FormField* pField, 109 const CFX_WideString& csValue) override; 110 void AfterSelectionChange(CPDF_FormField* pField) override; 111 void AfterCheckedStatusChange(CPDF_FormField* pField) override; 112 int BeforeFormReset(CPDF_InterForm* pForm) override; 113 void AfterFormReset(CPDF_InterForm* pForm) override; 114 int BeforeFormImportData(CPDF_InterForm* pForm) override; 115 void AfterFormImportData(CPDF_InterForm* pForm) override; 116 117 bool FDFToURLEncodedData(CFX_WideString csFDFFile, CFX_WideString csTxtFile); 118 bool FDFToURLEncodedData(uint8_t*& pBuf, FX_STRSIZE& nBufSize); 119 int GetPageIndexByAnnotDict(CPDF_Document* pDocument, 120 CPDF_Dictionary* pAnnotDict) const; 121 122 using CPDFSDK_WidgetMap = std::map<CPDF_FormControl*, CPDFSDK_Widget*>; 123 124 CPDFSDK_FormFillEnvironment* m_pFormFillEnv; // Not owned. 125 std::unique_ptr<CPDF_InterForm> m_pInterForm; 126 CPDFSDK_WidgetMap m_Map; 127 #ifdef PDF_ENABLE_XFA 128 std::map<CXFA_FFWidget*, CPDFSDK_XFAWidget*> m_XFAMap; 129 bool m_bXfaCalculate; 130 bool m_bXfaValidationsEnabled; 131 static const int kNumFieldTypes = 7; 132 #else // PDF_ENABLE_XFA 133 static const int kNumFieldTypes = 6; 134 #endif // PDF_ENABLE_XFA 135 bool m_bCalculate; 136 bool m_bBusy; 137 138 FX_COLORREF m_aHighlightColor[kNumFieldTypes]; 139 uint8_t m_iHighlightAlpha; 140 bool m_bNeedHightlight[kNumFieldTypes]; 141 }; 142 143 #endif // FPDFSDK_CPDFSDK_INTERFORM_H_ 144