Home | History | Annotate | Download | only in include
      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 {
     26 	_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.
     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 
    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();
    246 	void    SetHighlightAlpha(FX_BYTE alpha) {m_iHighlightAlpha = alpha;}
    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 
    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