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