• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
CFFL_EditUndoItem(CPWL_Edit * pEdit)13 CFFL_EditUndoItem::CFFL_EditUndoItem(CPWL_Edit* pEdit) : m_pEdit(pEdit)
14 {
15 }
16 
~CFFL_EditUndoItem()17 CFFL_EditUndoItem::~CFFL_EditUndoItem()
18 {
19 }
20 
Undo()21 void CFFL_EditUndoItem::Undo()
22 {
23 }
24 
Redo()25 void CFFL_EditUndoItem::Redo()
26 {
27 }
28 
GetDescr()29 CFX_WideString CFFL_EditUndoItem::GetDescr()
30 {
31 	return L"Input";
32 }
33 
Release()34 void CFFL_EditUndoItem::Release()
35 {
36 	delete this;
37 }
38 
39 /* ------------------------------- CFFL_TextField ------------------------------- */
40 
CFFL_TextField(CPDFDoc_Environment * pApp,CPDFSDK_Annot * pAnnot)41 CFFL_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 
~CFFL_TextField()49 CFFL_TextField::~CFFL_TextField()
50 {
51 	if (m_pFontMap)
52 	{
53 		delete m_pFontMap;
54 		m_pFontMap = NULL;
55 	}
56 
57 }
58 
GetCreateParam()59 PWL_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 
NewPDFWindow(const PWL_CREATEPARAM & cp,CPDFSDK_PageView * pPageView)133 CPWL_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 
OnChar(CPDFSDK_Annot * pAnnot,FX_UINT nChar,FX_UINT nFlags)168 FX_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 
IsDataChanged(CPDFSDK_PageView * pPageView)212 FX_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 
SaveData(CPDFSDK_PageView * pPageView)222 void 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 
GetActionData(CPDFSDK_PageView * pPageView,CPDF_AAction::AActionType type,PDFSDK_FieldAction & fa)238 void 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 
SetActionData(CPDFSDK_PageView * pPageView,CPDF_AAction::AActionType type,const PDFSDK_FieldAction & fa)273 void 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 
IsActionDataChanged(CPDF_AAction::AActionType type,const PDFSDK_FieldAction & faOld,const PDFSDK_FieldAction & faNew)292 FX_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 
SaveState(CPDFSDK_PageView * pPageView)307 void 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 
RestoreState(CPDFSDK_PageView * pPageView)318 void 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 
ResetPDFWindow(CPDFSDK_PageView * pPageView,FX_BOOL bRestoreValue)329 CPWL_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 
OnSetFocus(CPWL_Wnd * pWnd)351 void 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 
OnKillFocus(CPWL_Wnd * pWnd)375 void CFFL_TextField::OnKillFocus(CPWL_Wnd* pWnd)
376 {
377 
378 }
379 
CanCopy(CPDFSDK_Document * pDocument)380 FX_BOOL	CFFL_TextField::CanCopy(CPDFSDK_Document* pDocument)
381 {
382 	return FALSE;
383 }
384 
CanCut(CPDFSDK_Document * pDocument)385 FX_BOOL CFFL_TextField::CanCut(CPDFSDK_Document* pDocument)
386 {
387 	return FALSE;
388 }
389 
CanPaste(CPDFSDK_Document * pDocument)390 FX_BOOL	CFFL_TextField::CanPaste(CPDFSDK_Document* pDocument)
391 {
392 	return FALSE;
393 }
394 
DoCopy(CPDFSDK_Document * pDocument)395 void CFFL_TextField::DoCopy(CPDFSDK_Document* pDocument)
396 {
397 
398 }
399 
DoCut(CPDFSDK_Document * pDocument)400 void CFFL_TextField::DoCut(CPDFSDK_Document* pDocument)
401 {
402 }
403 
DoPaste(CPDFSDK_Document * pDocument)404 void CFFL_TextField::DoPaste(CPDFSDK_Document* pDocument)
405 {
406 
407 }
408 
OnAddUndo(CPWL_Edit * pEdit)409 void CFFL_TextField::OnAddUndo(CPWL_Edit* pEdit)
410 {
411 }
412 
413