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
22class CFFL_FormFiller;
23class CPDFSDK_Annot;
24class CPDFSDK_DateTime;
25class CPDFSDK_Document;
26class CPDFSDK_InterForm;
27class CPDFSDK_PageView;
28class CPDF_Action;
29class CPDF_FormField;
30struct CPWL_Color;
31
32typedef 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;
59class CPDFSDK_Widget:public CPDFSDK_Annot
60{
61public:
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
134private:
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);
155public:
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);
159public:
160	FX_BOOL							HitTest(FX_FLOAT pageX, FX_FLOAT pageY);
161private:
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
170class CPDFSDK_InterForm : public CPDF_FormNotify
171{
172public:
173	CPDFSDK_InterForm(CPDFSDK_Document* pDocument);
174	virtual ~CPDFSDK_InterForm();
175
176public:
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
206public:
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
221private:
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
232private:
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
238private:
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
245public:
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);
252private:
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*>
264class CBA_AnnotIterator
265{
266public:
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
275private:
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