1 // Copyright 2014 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 _FSDK_BASEFORM_H_ 8 #define _FSDK_BASEFORM_H_ 9 10 #if _FX_OS_ == _FX_ANDROID_ 11 #include "time.h" 12 #else 13 #include <ctime> 14 #endif 15 16 class CPDFSDK_Document; 17 class CPDFSDK_DateTime; 18 struct CPWL_Color; 19 class CFFL_FormFiller; 20 class CPDFSDK_PageView; 21 class CPDFSDK_InterForm; 22 23 24 typedef struct _PDFSDK_FieldAction 25 { _PDFSDK_FieldAction_PDFSDK_FieldAction26 _PDFSDK_FieldAction() 27 { 28 bModifier = FALSE; 29 bShift = FALSE; 30 nCommitKey = 0; 31 bKeyDown = FALSE; 32 nSelEnd = nSelStart = 0; 33 bWillCommit = FALSE; 34 bFieldFull = FALSE; 35 bRC = TRUE; 36 } 37 38 FX_BOOL bModifier; //in 39 FX_BOOL bShift; //in 40 int nCommitKey; //in 41 CFX_WideString sChange; //in[out] 42 CFX_WideString sChangeEx; //in 43 FX_BOOL bKeyDown; //in 44 int nSelEnd; //in[out] 45 int nSelStart; //in[out] 46 CFX_WideString sValue; //in[out] 47 FX_BOOL bWillCommit; //in 48 FX_BOOL bFieldFull; //in 49 FX_BOOL bRC; //in[out] 50 }PDFSDK_FieldAction; 51 class CPDFSDK_Widget:public CPDFSDK_Annot 52 { 53 public: 54 CPDFSDK_Widget(CPDF_Annot* pAnnot, CPDFSDK_PageView* pPageView, CPDFSDK_InterForm* pInterForm); 55 virtual ~CPDFSDK_Widget(); 56 57 virtual CFX_ByteString GetSubType() const; 58 59 virtual CPDF_Action GetAAction(CPDF_AAction::AActionType eAAT); 60 61 int GetFieldType() const; 62 //define layout order to 2. GetLayoutOrder()63 virtual int GetLayoutOrder() {return 2;} 64 /* 65 FIELDFLAG_READONLY 66 FIELDFLAG_REQUIRED 67 FIELDFLAG_NOEXPORT 68 */ 69 70 int GetFieldFlags() const; 71 int GetRotate() const; 72 73 FX_BOOL GetFillColor(FX_COLORREF& color) const; 74 FX_BOOL GetBorderColor(FX_COLORREF& color) const; 75 FX_BOOL GetTextColor(FX_COLORREF& color) const; 76 FX_FLOAT GetFontSize() const; 77 78 int GetSelectedIndex(int nIndex) const; 79 CFX_WideString GetValue() const; 80 CFX_WideString GetDefaultValue() const; 81 CFX_WideString GetOptionLabel(int nIndex) const; 82 int CountOptions() const; 83 FX_BOOL IsOptionSelected(int nIndex) const; 84 int GetTopVisibleIndex() const; 85 FX_BOOL IsChecked() const; 86 /* 87 BF_ALIGN_LEFT 88 BF_ALIGN_MIDDL 89 BF_ALIGN_RIGHT 90 */ 91 int GetAlignment() const; 92 int GetMaxLen() const; 93 CFX_WideString GetAlternateName() const; 94 95 //Set Properties. 96 void SetCheck(FX_BOOL bChecked, FX_BOOL bNotify); 97 void SetValue(const CFX_WideString& sValue, FX_BOOL bNotify); 98 void SetDefaultValue(const CFX_WideString& sValue); 99 void SetOptionSelection(int index, FX_BOOL bSelected, FX_BOOL bNotify); 100 void ClearSelection(FX_BOOL bNotify); 101 void SetTopVisibleIndex(int index); 102 103 void ResetAppearance(FX_LPCWSTR sValue, FX_BOOL bValueChanged); 104 void ResetFieldAppearance(FX_BOOL bValueChanged); 105 void UpdateField(); 106 CFX_WideString OnFormat(int nCommitKey, FX_BOOL& bFormated); 107 108 //Message. 109 FX_BOOL OnAAction(CPDF_AAction::AActionType type, PDFSDK_FieldAction& data, 110 CPDFSDK_PageView* pPageView); 111 GetInterForm()112 CPDFSDK_InterForm* GetInterForm() const {return m_pInterForm;} 113 CPDF_FormField* GetFormField() const; 114 CPDF_FormControl* GetFormControl() const; 115 static CPDF_FormControl* GetFormControl(CPDF_InterForm* pInterForm, CPDF_Dictionary* pAnnotDict); 116 117 void DrawShadow(CFX_RenderDevice* pDevice, CPDFSDK_PageView* pPageView); 118 119 void SetAppModified(); 120 void ClearAppModified(); 121 FX_BOOL IsAppModified() const; 122 123 FX_INT32 GetAppearanceAge() const; 124 FX_INT32 GetValueAge() const; 125 126 private: 127 void ResetAppearance_PushButton(); 128 void ResetAppearance_CheckBox(); 129 void ResetAppearance_RadioButton(); 130 void ResetAppearance_ComboBox(FX_LPCWSTR sValue); 131 void ResetAppearance_ListBox(); 132 void ResetAppearance_TextField(FX_LPCWSTR sValue); 133 134 CPDF_Rect GetClientRect() const; 135 CPDF_Rect GetRotatedRect() const; 136 137 CFX_ByteString GetBackgroundAppStream() const; 138 CFX_ByteString GetBorderAppStream() const; 139 CPDF_Matrix GetMatrix() const; 140 141 CPWL_Color GetTextPWLColor() const; 142 CPWL_Color GetBorderPWLColor() const; 143 CPWL_Color GetFillPWLColor() const; 144 145 void AddImageToAppearance(const CFX_ByteString& sAPType, CPDF_Stream* pImage); 146 void RemoveAppearance(const CFX_ByteString& sAPType); 147 public: 148 FX_BOOL IsWidgetAppearanceValid(CPDF_Annot::AppearanceMode mode); 149 void DrawAppearance(CFX_RenderDevice* pDevice, const CPDF_Matrix* pUser2Device, 150 CPDF_Annot::AppearanceMode mode, const CPDF_RenderOptions* pOptions); 151 public: 152 FX_BOOL HitTest(FX_FLOAT pageX, FX_FLOAT pageY); 153 private: 154 CPDFSDK_InterForm* m_pInterForm; 155 FX_BOOL m_bAppModified; 156 FX_INT32 m_nAppAge; 157 FX_INT32 m_nValueAge; 158 }; 159 160 #define CPDFSDK_WidgetMap CFX_MapPtrTemplate<CPDF_FormControl*, CPDFSDK_Widget*> 161 162 class CPDFSDK_InterForm : public CPDF_FormNotify 163 { 164 public: 165 CPDFSDK_InterForm(CPDFSDK_Document* pDocument); 166 virtual ~CPDFSDK_InterForm(); 167 168 public: 169 virtual void Destroy(); 170 virtual CPDF_InterForm* GetInterForm(); 171 172 CPDFSDK_Document* GetDocument(); 173 FX_BOOL HighlightWidgets(); 174 175 CPDFSDK_Widget* GetSibling(CPDFSDK_Widget* pWidget, FX_BOOL bNext) const; 176 CPDFSDK_Widget* GetWidget(CPDF_FormControl* pControl) const; 177 void GetWidgets(const CFX_WideString& sFieldName, CFX_PtrArray& widgets); 178 void GetWidgets(CPDF_FormField* pField, CFX_PtrArray& widgets); 179 180 void AddMap(CPDF_FormControl* pControl, CPDFSDK_Widget* pWidget); 181 void RemoveMap(CPDF_FormControl* pControl); 182 183 void EnableCalculate(FX_BOOL bEnabled); 184 FX_BOOL IsCalculateEnabled() const; 185 186 #ifdef _WIN32 187 CPDF_Stream* LoadImageFromFile(const CFX_WideString& sFile); 188 #endif 189 190 void OnKeyStrokeCommit(CPDF_FormField* pFormField, CFX_WideString& csValue, FX_BOOL& bRC); 191 void OnValidate(CPDF_FormField* pFormField, CFX_WideString& csValue, FX_BOOL& bRC); 192 void OnCalculate(CPDF_FormField* pFormField = NULL); 193 CFX_WideString OnFormat(CPDF_FormField* pFormField, int nCommitKey, FX_BOOL& bFormated); 194 195 void ResetFieldAppearance(CPDF_FormField* pFormField, FX_LPCWSTR sValue, FX_BOOL bValueChanged); 196 void UpdateField(CPDF_FormField* pFormField); 197 198 public: 199 FX_BOOL DoAction_Hide(const CPDF_Action& action); 200 FX_BOOL DoAction_SubmitForm(const CPDF_Action& action); 201 FX_BOOL DoAction_ResetForm(const CPDF_Action& action); 202 FX_BOOL DoAction_ImportData(const CPDF_Action& action); 203 204 void GetFieldFromObjects(const CFX_PtrArray& objects, CFX_PtrArray& fields); 205 FX_BOOL IsValidField(CPDF_Dictionary* pFieldDict); 206 FX_BOOL SubmitFields(const CFX_WideString& csDestination, const CFX_PtrArray& fields, 207 FX_BOOL bIncludeOrExclude, FX_BOOL bUrlEncoded); 208 FX_BOOL SubmitForm(const CFX_WideString& sDestination, FX_BOOL bUrlEncoded); 209 FX_BOOL ImportFormFromFDFFile(const CFX_WideString& csFDFFileName, FX_BOOL bNotify); 210 FX_BOOL ExportFormToFDFFile(const CFX_WideString& sFDFFileName); 211 FX_BOOL ExportFormToFDFTextBuf(CFX_ByteTextBuf& textBuf); 212 FX_BOOL ExportFieldsToFDFFile(const CFX_WideString& sFDFFileName, const CFX_PtrArray& fields, 213 FX_BOOL bIncludeOrExclude); 214 FX_BOOL ExportFieldsToFDFTextBuf(const CFX_PtrArray& fields,FX_BOOL bIncludeOrExclude, CFX_ByteTextBuf& textBuf); 215 FX_BOOL ExportFormToTxtFile(const CFX_WideString& sTxtFileName); 216 FX_BOOL ImportFormFromTxtFile(const CFX_WideString& sTxtFileName); 217 CFX_WideString GetTemporaryFileName(const CFX_WideString& sFileExt); 218 219 private: 220 virtual int BeforeValueChange(const CPDF_FormField* pField, CFX_WideString& csValue); 221 virtual int AfterValueChange(const CPDF_FormField* pField); 222 virtual int BeforeSelectionChange(const CPDF_FormField* pField, CFX_WideString& csValue); 223 virtual int AfterSelectionChange(const CPDF_FormField* pField); 224 virtual int AfterCheckedStatusChange(const CPDF_FormField* pField, const CFX_ByteArray& statusArray); 225 virtual int BeforeFormReset(const CPDF_InterForm* pForm); 226 virtual int AfterFormReset(const CPDF_InterForm* pForm); 227 virtual int BeforeFormImportData(const CPDF_InterForm* pForm); 228 virtual int AfterFormImportData(const CPDF_InterForm* pForm); 229 230 private: 231 FX_BOOL FDFToURLEncodedData(CFX_WideString csFDFFile, CFX_WideString csTxtFile); 232 FX_BOOL FDFToURLEncodedData(FX_LPBYTE& pBuf, FX_STRSIZE& nBufSize); 233 int GetPageIndexByAnnotDict(CPDF_Document* pDocument, CPDF_Dictionary* pAnnotDict) const; 234 void DoFDFBuffer(CFX_ByteString sBuffer); 235 236 private: 237 CPDFSDK_Document* m_pDocument; 238 CPDF_InterForm* m_pInterForm; 239 CPDFSDK_WidgetMap m_Map; 240 FX_BOOL m_bCalculate; 241 FX_BOOL m_bBusy; 242 243 public: 244 FX_BOOL IsNeedHighLight(int nFieldType); 245 void RemoveAllHighLight(); SetHighlightAlpha(FX_BYTE alpha)246 void SetHighlightAlpha(FX_BYTE alpha) {m_iHighlightAlpha = alpha;} GetHighlightAlpha()247 FX_BYTE GetHighlightAlpha() {return m_iHighlightAlpha;} 248 void SetHighlightColor(FX_COLORREF clr, int nFieldType); 249 FX_COLORREF GetHighlightColor(int nFieldType); 250 private: 251 FX_COLORREF m_aHighlightColor[6]; 252 FX_BYTE m_iHighlightAlpha; 253 FX_BOOL m_bNeedHightlight[6]; 254 }; 255 256 #define BAI_STRUCTURE 0 257 #define BAI_ROW 1 258 #define BAI_COLUMN 2 259 260 #define CPDFSDK_Annots CFX_ArrayTemplate<CPDFSDK_Annot*> 261 #define CPDFSDK_SortAnnots CGW_ArrayTemplate<CPDFSDK_Annot*> 262 class CBA_AnnotIterator 263 { 264 public: 265 CBA_AnnotIterator(CPDFSDK_PageView* pPageView, const CFX_ByteString& sType, const CFX_ByteString& sSubType); 266 virtual ~CBA_AnnotIterator(); 267 268 virtual CPDFSDK_Annot* GetFirstAnnot(); 269 virtual CPDFSDK_Annot* GetLastAnnot(); 270 virtual CPDFSDK_Annot* GetNextAnnot(CPDFSDK_Annot* pAnnot); 271 virtual CPDFSDK_Annot* GetPrevAnnot(CPDFSDK_Annot* pAnnot); 272 Release()273 virtual void Release(){delete this;} 274 275 private: 276 void GenerateResults(); 277 static int CompareByLeft(CPDFSDK_Annot* p1, CPDFSDK_Annot* p2); 278 static int CompareByTop(CPDFSDK_Annot* p1, CPDFSDK_Annot* p2); 279 280 static CPDF_Rect GetAnnotRect(CPDFSDK_Annot* pAnnot); 281 282 private: 283 CPDFSDK_PageView* m_pPageView; 284 CFX_ByteString m_sType; 285 CFX_ByteString m_sSubType; 286 int m_nTabs; 287 288 CPDFSDK_Annots m_Annots; 289 }; 290 291 #endif //#define _FSDK_BASEFORM_H_ 292 293