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