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//#include "../include/FormFiller.h"
8//#include "../include/FFL_FormFiller.h"
9#include "../../include/formfiller/FFL_TextField.h"
10#include "../../include/formfiller/FFL_CBA_Fontmap.h"
11//#include "../include/FFL_Notify.h"
12
13CFFL_EditUndoItem::CFFL_EditUndoItem(CPWL_Edit* pEdit) : m_pEdit(pEdit)
14{
15}
16
17CFFL_EditUndoItem::~CFFL_EditUndoItem()
18{
19}
20
21void CFFL_EditUndoItem::Undo()
22{
23}
24
25void CFFL_EditUndoItem::Redo()
26{
27}
28
29CFX_WideString CFFL_EditUndoItem::GetDescr()
30{
31	return L"Input";
32}
33
34void CFFL_EditUndoItem::Release()
35{
36	delete this;
37}
38
39/* ------------------------------- CFFL_TextField ------------------------------- */
40
41CFFL_TextField::CFFL_TextField(CPDFDoc_Environment* pApp, CPDFSDK_Annot* pAnnot) :
42	CFFL_FormFiller(pApp, pAnnot),
43	m_pFontMap(NULL)//,
44	//m_pSpellCheck(NULL)
45{
46	m_State.nStart = m_State.nEnd = 0;
47}
48
49CFFL_TextField::~CFFL_TextField()
50{
51	if (m_pFontMap)
52	{
53		delete m_pFontMap;
54		m_pFontMap = NULL;
55	}
56
57}
58
59PWL_CREATEPARAM CFFL_TextField::GetCreateParam()
60{
61	PWL_CREATEPARAM cp = CFFL_FormFiller::GetCreateParam();
62
63	ASSERT(m_pWidget != NULL);
64	int nFlags = m_pWidget->GetFieldFlags();
65
66
67	if (nFlags & FIELDFLAG_PASSWORD)
68	{
69		cp.dwFlags |= PES_PASSWORD;
70	}
71
72	if (!(nFlags & FIELDFLAG_DONOTSPELLCHECK))
73	{
74	}
75
76	if (nFlags & FIELDFLAG_MULTILINE)
77	{
78		cp.dwFlags |= PES_MULTILINE | PES_AUTORETURN | PES_TOP;
79
80		if (!(nFlags & FIELDFLAG_DONOTSCROLL))
81		{
82			cp.dwFlags |= PWS_VSCROLL | PES_AUTOSCROLL;
83		}
84	}
85	else
86	{
87		cp.dwFlags |= PES_CENTER;
88
89		if (!(nFlags & FIELDFLAG_DONOTSCROLL))
90		{
91			cp.dwFlags |= PES_AUTOSCROLL;
92		}
93	}
94
95	if (nFlags & FIELDFLAG_COMB)
96	{
97		cp.dwFlags |= PES_CHARARRAY;
98	}
99
100	if (nFlags & FIELDFLAG_RICHTEXT)
101	{
102		cp.dwFlags |= PES_RICH;
103	}
104
105	cp.dwFlags |= PES_UNDO;
106
107 	switch (m_pWidget->GetAlignment())
108 	{
109 	default:
110 	case BF_ALIGN_LEFT:
111 		cp.dwFlags |= PES_LEFT;
112 		break;
113 	case BF_ALIGN_MIDDLE:
114 		cp.dwFlags |= PES_MIDDLE;
115 		break;
116 	case BF_ALIGN_RIGHT:
117 		cp.dwFlags |= PES_RIGHT;
118 		break;
119 	}
120
121	if (!m_pFontMap)
122	{
123		ASSERT(this->m_pApp != NULL);
124		m_pFontMap = new CBA_FontMap(m_pWidget, /*ISystemHandle::GetSystemHandler(m_pApp)*/m_pApp->GetSysHandler());
125		m_pFontMap->Initial();
126	}
127	cp.pFontMap = m_pFontMap;
128	cp.pFocusHandler = this;
129
130	return cp;
131}
132
133CPWL_Wnd* CFFL_TextField::NewPDFWindow(const PWL_CREATEPARAM& cp, CPDFSDK_PageView* pPageView)
134{
135	CPWL_Edit * pWnd = new CPWL_Edit();
136		pWnd->AttachFFLData(this);
137	pWnd->Create(cp);
138
139
140
141	ASSERT(m_pApp != NULL);
142	CFFL_IFormFiller* pIFormFiller = m_pApp->GetIFormFiller();
143	pWnd->SetFillerNotify(pIFormFiller);
144
145	ASSERT(m_pWidget != NULL);
146	FX_INT32 nMaxLen = m_pWidget->GetMaxLen();
147	CFX_WideString swValue = m_pWidget->GetValue();
148
149	if (nMaxLen > 0)
150	{
151		if (pWnd->HasFlag(PES_CHARARRAY))
152		{
153			pWnd->SetCharArray(nMaxLen);
154			pWnd->SetAlignFormatV(PEAV_CENTER);
155		}
156		else
157		{
158			pWnd->SetLimitChar(nMaxLen);
159		}
160	}
161
162	pWnd->SetText(swValue);
163
164	return pWnd;
165}
166
167
168FX_BOOL	CFFL_TextField::OnChar(CPDFSDK_Annot* pAnnot, FX_UINT nChar, FX_UINT nFlags)
169{
170	switch (nChar)
171	{
172	case FWL_VKEY_Return:
173 		if (!(m_pWidget->GetFieldFlags() & FIELDFLAG_MULTILINE))
174 		{
175 			CPDFSDK_PageView* pPageView = this->GetCurPageView();
176 			ASSERT(pPageView != NULL);
177 			m_bValid = !m_bValid;
178			CPDF_Rect rcAnnot = pAnnot->GetRect();
179			m_pApp->FFI_Invalidate(pAnnot->GetPDFPage(), rcAnnot.left, rcAnnot.top, rcAnnot.right, rcAnnot.bottom);
180
181 			if (m_bValid)
182 			{
183 				if (CPWL_Wnd* pWnd = GetPDFWindow(pPageView, TRUE))
184 					pWnd->SetFocus();
185 			}
186 			else
187 			{
188 				if (CommitData(pPageView, nFlags))
189 				{
190 					DestroyPDFWindow(pPageView);
191 					return TRUE;
192 				}
193 				else
194 				{
195 					return FALSE;
196 				}
197 			}
198 		}
199		break;
200	case FWL_VKEY_Escape:
201		{
202			CPDFSDK_PageView* pPageView = this->GetCurPageView();
203			ASSERT(pPageView != NULL);
204			EscapeFiller(pPageView,TRUE);
205			return TRUE;
206		}
207	}
208
209	return CFFL_FormFiller::OnChar(pAnnot, nChar, nFlags);
210}
211
212FX_BOOL	CFFL_TextField::IsDataChanged(CPDFSDK_PageView* pPageView)
213{
214	ASSERT(m_pWidget != NULL);
215
216 	if (CPWL_Edit * pEdit = (CPWL_Edit*)GetPDFWindow(pPageView, FALSE))
217 		return pEdit->GetText() != m_pWidget->GetValue();
218
219	return FALSE;
220}
221
222void CFFL_TextField::SaveData(CPDFSDK_PageView* pPageView)
223{
224	ASSERT(m_pWidget != NULL);
225
226	if (CPWL_Edit* pWnd = (CPWL_Edit*)GetPDFWindow(pPageView, FALSE))
227	{
228		CFX_WideString sOldValue = m_pWidget->GetValue();
229		CFX_WideString sNewValue = pWnd->GetText();
230
231		m_pWidget->SetValue(sNewValue, FALSE);
232		m_pWidget->ResetFieldAppearance(TRUE);
233		m_pWidget->UpdateField();
234		SetChangeMark();
235	}
236}
237
238void CFFL_TextField::GetActionData(CPDFSDK_PageView* pPageView, CPDF_AAction::AActionType type,
239									PDFSDK_FieldAction& fa)
240{
241	switch (type)
242	{
243	case CPDF_AAction::KeyStroke:
244		if (CPWL_Edit* pWnd = (CPWL_Edit*)GetPDFWindow(pPageView, FALSE))
245		{
246			fa.bFieldFull = pWnd->IsTextFull();
247
248			fa.sValue = pWnd->GetText();
249
250			if (fa.bFieldFull)
251			{
252				fa.sChange = L"";
253				fa.sChangeEx = L"";
254			}
255		}
256		break;
257	case CPDF_AAction::Validate:
258		if (CPWL_Edit* pWnd = (CPWL_Edit*)GetPDFWindow(pPageView, FALSE))
259		{
260			fa.sValue = pWnd->GetText();
261		}
262		break;
263	case CPDF_AAction::LoseFocus:
264	case CPDF_AAction::GetFocus:
265		ASSERT(m_pWidget != NULL);
266		fa.sValue = m_pWidget->GetValue();
267		break;
268	default:
269		break;
270	}
271}
272
273void CFFL_TextField::SetActionData(CPDFSDK_PageView* pPageView, CPDF_AAction::AActionType type,
274 									const PDFSDK_FieldAction& fa)
275{
276	switch (type)
277	{
278	case CPDF_AAction::KeyStroke:
279		if (CPWL_Edit * pEdit = (CPWL_Edit*)GetPDFWindow(pPageView, FALSE))
280		{
281			pEdit->SetFocus();
282			pEdit->SetSel(fa.nSelStart, fa.nSelEnd);
283			pEdit->ReplaceSel(fa.sChange);
284		}
285		break;
286	default:
287		break;
288	}
289}
290
291
292FX_BOOL	CFFL_TextField::IsActionDataChanged(CPDF_AAction::AActionType type, const PDFSDK_FieldAction& faOld,
293									const PDFSDK_FieldAction& faNew)
294{
295	switch (type)
296	{
297	case CPDF_AAction::KeyStroke:
298		return (!faOld.bFieldFull && faOld.nSelEnd != faNew.nSelEnd) || faOld.nSelStart != faNew.nSelStart ||
299			faOld.sChange != faNew.sChange;
300	default:
301		break;
302	}
303
304	return FALSE;
305}
306
307void CFFL_TextField::SaveState(CPDFSDK_PageView* pPageView)
308{
309	ASSERT(pPageView != NULL);
310
311	if (CPWL_Edit* pWnd = (CPWL_Edit*)GetPDFWindow(pPageView, FALSE))
312	{
313		pWnd->GetSel(m_State.nStart, m_State.nEnd);
314		m_State.sValue = pWnd->GetText();
315	}
316}
317
318void CFFL_TextField::RestoreState(CPDFSDK_PageView* pPageView)
319{
320	ASSERT(pPageView != NULL);
321
322	if (CPWL_Edit* pWnd = (CPWL_Edit*)GetPDFWindow(pPageView, TRUE))
323	{
324		pWnd->SetText(m_State.sValue);
325		pWnd->SetSel(m_State.nStart, m_State.nEnd);
326	}
327}
328
329CPWL_Wnd* CFFL_TextField::ResetPDFWindow(CPDFSDK_PageView* pPageView, FX_BOOL bRestoreValue)
330{
331	if (bRestoreValue)
332		SaveState(pPageView);
333
334	DestroyPDFWindow(pPageView);
335
336	CPWL_Wnd* pRet = NULL;
337
338	if (bRestoreValue)
339	{
340		RestoreState(pPageView);
341		pRet = this->GetPDFWindow(pPageView, FALSE);
342	}
343	else
344		pRet = this->GetPDFWindow(pPageView, TRUE);
345
346	m_pWidget->UpdateField();
347
348	return pRet;
349}
350
351void CFFL_TextField::OnSetFocus(CPWL_Wnd* pWnd)
352{
353	ASSERT(m_pApp != NULL);
354
355 	ASSERT(pWnd != NULL);
356
357 	if (pWnd->GetClassName() == PWL_CLASSNAME_EDIT)
358 	{
359 		CPWL_Edit* pEdit = (CPWL_Edit*)pWnd;
360		pEdit->SetCharSet(134);
361		pEdit->SetCodePage(936);
362
363		pEdit->SetReadyToInput();
364		CFX_WideString wsText = pEdit->GetText();
365		int nCharacters = wsText.GetLength();
366		CFX_ByteString bsUTFText = wsText.UTF16LE_Encode();
367		unsigned short* pBuffer = (unsigned short*)(FX_LPCSTR)bsUTFText;
368		m_pApp->FFI_OnSetFieldInputFocus(m_pWidget->GetFormField(), pBuffer, nCharacters, TRUE);
369
370 		pEdit->SetEditNotify(this);
371 		//pUndo->BeginEdit(pDocument);
372 	}
373}
374
375void CFFL_TextField::OnKillFocus(CPWL_Wnd* pWnd)
376{
377
378}
379
380FX_BOOL	CFFL_TextField::CanCopy(CPDFSDK_Document* pDocument)
381{
382	return FALSE;
383}
384
385FX_BOOL CFFL_TextField::CanCut(CPDFSDK_Document* pDocument)
386{
387	return FALSE;
388}
389
390FX_BOOL	CFFL_TextField::CanPaste(CPDFSDK_Document* pDocument)
391{
392	return FALSE;
393}
394
395void CFFL_TextField::DoCopy(CPDFSDK_Document* pDocument)
396{
397
398}
399
400void CFFL_TextField::DoCut(CPDFSDK_Document* pDocument)
401{
402}
403
404void CFFL_TextField::DoPaste(CPDFSDK_Document* pDocument)
405{
406
407}
408
409void CFFL_TextField::OnAddUndo(CPWL_Edit* pEdit)
410{
411}
412
413