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