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_FormFiller.h"
8 #include "../../include/formfiller/FFL_IFormFiller.h"
9 #include "../../include/formfiller/FFL_CheckBox.h"
10 #include "../../include/formfiller/FFL_ComboBox.h"
11 #include "../../include/formfiller/FFL_ListBox.h"
12 #include "../../include/formfiller/FFL_PushButton.h"
13 #include "../../include/formfiller/FFL_RadioButton.h"
14 #include "../../include/formfiller/FFL_TextField.h"
15
16 #define FFL_MAXLISTBOXHEIGHT 140.0f
17
18 // HHOOK CFFL_IFormFiller::m_hookSheet = NULL;
19 // MSG CFFL_IFormFiller::g_Msg;
20
21 /* ----------------------------- CFFL_IFormFiller ----------------------------- */
22
CFFL_IFormFiller(CPDFDoc_Environment * pApp)23 CFFL_IFormFiller::CFFL_IFormFiller(CPDFDoc_Environment* pApp) :
24 m_pApp(pApp),
25 m_bNotifying(FALSE)
26 {
27 }
28
~CFFL_IFormFiller()29 CFFL_IFormFiller::~CFFL_IFormFiller()
30 {
31 FX_POSITION pos = m_Maps.GetStartPosition();
32 while (pos)
33 {
34 CPDFSDK_Annot * pAnnot = NULL;
35 CFFL_FormFiller * pFormFiller = NULL;
36 m_Maps.GetNextAssoc(pos,pAnnot,pFormFiller);
37 delete pFormFiller;
38 }
39 m_Maps.RemoveAll();
40 }
41
Annot_HitTest(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,CPDF_Point point)42 FX_BOOL CFFL_IFormFiller::Annot_HitTest(CPDFSDK_PageView* pPageView,CPDFSDK_Annot* pAnnot, CPDF_Point point)
43 {
44 CPDF_Rect rc = pAnnot->GetRect();
45 if(rc.Contains(point.x, point.y))
46 return TRUE;
47 return FALSE;
48 }
49
GetViewBBox(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot)50 FX_RECT CFFL_IFormFiller::GetViewBBox(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot)
51 {
52 if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
53 {
54 return pFormFiller->GetViewBBox(pPageView, pAnnot);
55 }
56 else
57 {
58 ASSERT(pPageView != NULL);
59 ASSERT(pAnnot != NULL);
60
61 CPDF_Annot* pPDFAnnot = pAnnot->GetPDFAnnot();
62 ASSERT(pPDFAnnot != NULL);
63
64 CPDF_Rect rcAnnot;
65 pPDFAnnot->GetRect(rcAnnot);
66
67 // CRect rcWin;
68 // pPageView->DocToWindow(rcAnnot, rcWin);
69 CPDF_Rect rcWin = CPWL_Utils::InflateRect(rcAnnot,1);
70 // rcWin.InflateRect(1, 1);
71
72 return rcWin.GetOutterRect();
73 }
74 }
75
OnDraw(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,CFX_RenderDevice * pDevice,CPDF_Matrix * pUser2Device,FX_DWORD dwFlags)76 void CFFL_IFormFiller::OnDraw(CPDFSDK_PageView* pPageView, /*HDC hDC,*/ CPDFSDK_Annot* pAnnot,
77 CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,
78 /*const CRect& rcWindow,*/ FX_DWORD dwFlags)
79 {
80 ASSERT(pPageView != NULL);
81 CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;
82
83 if (IsVisible(pWidget))
84 {
85 if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
86 {
87 if (pFormFiller->IsValid())
88 {
89 pFormFiller->OnDraw(pPageView, pAnnot, pDevice, pUser2Device, dwFlags);
90
91 pAnnot->GetPDFPage();
92
93
94 CPDFSDK_Document* pDocument = m_pApp->GetCurrentDoc();
95 ASSERT(pDocument != NULL);
96
97 if (pDocument->GetFocusAnnot() == pAnnot)
98 {
99 CPDF_Rect rcFocus = pFormFiller->GetFocusBox(pPageView);
100 if (!rcFocus.IsEmpty())
101 {
102 CFX_PathData path;
103
104 path.SetPointCount(5);
105 path.SetPoint(0, rcFocus.left, rcFocus.top, FXPT_MOVETO);
106 path.SetPoint(1, rcFocus.left, rcFocus.bottom, FXPT_LINETO);
107 path.SetPoint(2, rcFocus.right, rcFocus.bottom, FXPT_LINETO);
108 path.SetPoint(3, rcFocus.right, rcFocus.top, FXPT_LINETO);
109 path.SetPoint(4, rcFocus.left, rcFocus.top, FXPT_LINETO);
110
111 CFX_GraphStateData gsd;
112 gsd.SetDashCount(1);
113 gsd.m_DashArray[0] = 1.0f;
114 gsd.m_DashPhase = 0;
115
116 gsd.m_LineWidth = 1.0f;
117 pDevice->DrawPath(&path, pUser2Device, &gsd, 0, ArgbEncode(255,0,0,0), FXFILL_ALTERNATE);
118
119 // ::DrawFocusRect(hDC, &rcFocus);
120 }
121 }
122
123 return;
124 }
125 }
126
127 if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
128 pFormFiller->OnDrawDeactive(pPageView, pAnnot, pDevice, pUser2Device, dwFlags);
129 else
130 pWidget->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Normal, NULL);
131
132 if (!IsReadOnly(pWidget) && IsFillingAllowed(pWidget))
133 {
134 pWidget->DrawShadow(pDevice, pPageView);
135 }
136
137 }
138 }
139
OnCreate(CPDFSDK_Annot * pAnnot)140 void CFFL_IFormFiller::OnCreate(CPDFSDK_Annot* pAnnot)
141 {
142 if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
143 {
144 pFormFiller->OnCreate(pAnnot);
145 }
146 }
147
OnLoad(CPDFSDK_Annot * pAnnot)148 void CFFL_IFormFiller::OnLoad(CPDFSDK_Annot* pAnnot)
149 {
150 if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
151 {
152 pFormFiller->OnLoad(pAnnot);
153 }
154 }
155
OnDelete(CPDFSDK_Annot * pAnnot)156 void CFFL_IFormFiller::OnDelete(CPDFSDK_Annot* pAnnot)
157 {
158 if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
159 {
160 pFormFiller->OnDelete(pAnnot);
161 }
162
163 UnRegisterFormFiller(pAnnot);
164 }
165
OnMouseEnter(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,FX_UINT nFlag)166 void CFFL_IFormFiller::OnMouseEnter(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlag)
167 {
168 ASSERT(pAnnot != NULL);
169 ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
170
171 if (!m_bNotifying)
172 {
173 CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;
174 if (pWidget->GetAAction(CPDF_AAction::CursorEnter))
175 {
176 m_bNotifying = TRUE;
177
178 int nValueAge = pWidget->GetValueAge();
179
180 pWidget->ClearAppModified();
181
182 ASSERT(pPageView != NULL);
183
184
185
186 PDFSDK_FieldAction fa;
187 fa.bModifier = m_pApp->FFI_IsCTRLKeyDown(nFlag);
188 fa.bShift = m_pApp->FFI_IsSHIFTKeyDown(nFlag);
189 pWidget->OnAAction(CPDF_AAction::CursorEnter, fa, pPageView );
190 m_bNotifying = FALSE;
191
192 //if ( !IsValidAnnot(pPageView, pAnnot) ) return;
193
194 if (pWidget->IsAppModified())
195 {
196 if (CFFL_FormFiller* pFormFiller = GetFormFiller(pWidget, FALSE))
197 {
198 pFormFiller->ResetPDFWindow(pPageView, pWidget->GetValueAge() == nValueAge);
199 }
200 }
201 }
202 }
203
204 if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, TRUE))
205 {
206 pFormFiller->OnMouseEnter(pPageView, pAnnot);
207 }
208 }
209
OnMouseExit(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,FX_UINT nFlag)210 void CFFL_IFormFiller::OnMouseExit(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlag)
211 {
212 ASSERT(pAnnot != NULL);
213 ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
214
215 if (!m_bNotifying)
216 {
217 CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;
218 if (pWidget->GetAAction(CPDF_AAction::CursorExit))
219 {
220 m_bNotifying = TRUE;
221 pWidget->GetAppearanceAge();
222 int nValueAge = pWidget->GetValueAge();
223 pWidget->ClearAppModified();
224
225 ASSERT(pPageView != NULL);
226
227
228
229 PDFSDK_FieldAction fa;
230 fa.bModifier = m_pApp->FFI_IsCTRLKeyDown(nFlag);
231 fa.bShift = m_pApp->FFI_IsSHIFTKeyDown(nFlag);
232
233 pWidget->OnAAction(CPDF_AAction::CursorExit, fa, pPageView);
234 m_bNotifying = FALSE;
235
236 //if (!IsValidAnnot(pPageView, pAnnot)) return;
237
238 if (pWidget->IsAppModified())
239 {
240 if (CFFL_FormFiller* pFormFiller = GetFormFiller(pWidget, FALSE))
241 {
242 pFormFiller->ResetPDFWindow(pPageView, nValueAge == pWidget->GetValueAge());
243 }
244 }
245 }
246 }
247
248 if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
249 {
250 pFormFiller->OnMouseExit(pPageView, pAnnot);
251 }
252 }
253
OnLButtonDown(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,FX_UINT nFlags,const CPDF_Point & point)254 FX_BOOL CFFL_IFormFiller::OnLButtonDown(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)
255 {
256 ASSERT(pAnnot != NULL);
257 ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
258
259 if (!m_bNotifying)
260 {
261 CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;
262 if (Annot_HitTest(pPageView, pAnnot, point) && pWidget->GetAAction(CPDF_AAction::ButtonDown))
263 {
264 m_bNotifying = TRUE;
265 pWidget->GetAppearanceAge();
266 int nValueAge = pWidget->GetValueAge();
267 pWidget->ClearAppModified();
268
269 ASSERT(pPageView != NULL);
270
271
272
273 PDFSDK_FieldAction fa;
274 fa.bModifier = m_pApp->FFI_IsCTRLKeyDown(nFlags);
275 fa.bShift = m_pApp->FFI_IsSHIFTKeyDown(nFlags);
276 pWidget->OnAAction(CPDF_AAction::ButtonDown, fa, pPageView);
277 m_bNotifying = FALSE;
278
279 if (!IsValidAnnot(pPageView, pAnnot)) return TRUE;
280
281 if (pWidget->IsAppModified())
282 {
283 if (CFFL_FormFiller* pFormFiller = GetFormFiller(pWidget, FALSE))
284 {
285 pFormFiller->ResetPDFWindow(pPageView, nValueAge == pWidget->GetValueAge());
286 }
287 }
288 }
289 }
290
291 if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
292 {
293 return pFormFiller->OnLButtonDown(pPageView, pAnnot, nFlags, point);
294 }
295
296 return FALSE;
297 }
298
OnLButtonUp(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,FX_UINT nFlags,const CPDF_Point & point)299 FX_BOOL CFFL_IFormFiller::OnLButtonUp(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)
300 {
301 ASSERT(pAnnot != NULL);
302 ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
303
304 CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;
305 // CReader_Page* pPage = pAnnot->GetPage();
306 // ASSERT(pPage != NULL);
307 CPDFSDK_Document* pDocument = m_pApp->GetCurrentDoc();
308 ASSERT(pDocument != NULL);
309
310 switch (pWidget->GetFieldType())
311 {
312 case FIELDTYPE_PUSHBUTTON:
313 case FIELDTYPE_CHECKBOX:
314 case FIELDTYPE_RADIOBUTTON:
315 if (GetViewBBox(pPageView, pAnnot).Contains((int)point.x, (int)point.y))
316 {
317 pDocument->SetFocusAnnot(pAnnot);
318 }
319 break;
320 default:
321 pDocument->SetFocusAnnot(pAnnot);
322 break;
323 }
324
325 FX_BOOL bRet = FALSE;
326
327 if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
328 {
329 bRet = pFormFiller->OnLButtonUp(pPageView, pAnnot, nFlags, point);
330 }
331
332 if (pDocument->GetFocusAnnot() == pAnnot)
333 {
334 FX_BOOL bExit = FALSE;
335 FX_BOOL bReset = FALSE;
336 OnButtonUp(pWidget, pPageView, bReset, bExit,nFlags);
337 if (bExit) return TRUE;
338 }
339 return bRet;
340 }
341
OnButtonUp(CPDFSDK_Widget * pWidget,CPDFSDK_PageView * pPageView,FX_BOOL & bReset,FX_BOOL & bExit,FX_UINT nFlag)342 void CFFL_IFormFiller::OnButtonUp(CPDFSDK_Widget* pWidget, CPDFSDK_PageView* pPageView, FX_BOOL& bReset, FX_BOOL& bExit,FX_UINT nFlag)
343 {
344 ASSERT(pWidget != NULL);
345
346 if (!m_bNotifying)
347 {
348 if (pWidget->GetAAction(CPDF_AAction::ButtonUp))
349 {
350 m_bNotifying = TRUE;
351 int nAge = pWidget->GetAppearanceAge();
352 int nValueAge = pWidget->GetValueAge();
353
354 ASSERT(pPageView != NULL);
355 // CReader_DocView* pDocView = pPageView->GetDocView();
356 // ASSERT(pDocView != NULL);
357
358
359
360 PDFSDK_FieldAction fa;
361 fa.bModifier = m_pApp->FFI_IsCTRLKeyDown(nFlag);
362 fa.bShift = m_pApp->FFI_IsSHIFTKeyDown(nFlag);
363
364 pWidget->OnAAction(CPDF_AAction::ButtonUp, fa, pPageView);
365 m_bNotifying = FALSE;
366
367 if (!IsValidAnnot(pPageView, pWidget))
368 {
369 bExit = TRUE;
370 return;
371 }
372
373 if (nAge != pWidget->GetAppearanceAge())
374 {
375 if (CFFL_FormFiller* pFormFiller = GetFormFiller(pWidget, FALSE))
376 {
377 pFormFiller->ResetPDFWindow(pPageView, nValueAge == pWidget->GetValueAge());
378 }
379
380 bReset = TRUE;
381 }
382 }
383 }
384 }
385
OnLButtonDblClk(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,FX_UINT nFlags,const CPDF_Point & point)386 FX_BOOL CFFL_IFormFiller::OnLButtonDblClk(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)
387 {
388 ASSERT(pAnnot != NULL);
389 ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
390
391 if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
392 {
393 return pFormFiller->OnLButtonDblClk(pPageView, pAnnot, nFlags, point);
394 }
395
396 return FALSE;
397 }
398
OnMouseMove(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,FX_UINT nFlags,const CPDF_Point & point)399 FX_BOOL CFFL_IFormFiller::OnMouseMove(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)
400 {
401 ASSERT(pAnnot != NULL);
402 ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
403
404 //change cursor
405 if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, TRUE))
406 {
407 return pFormFiller->OnMouseMove(pPageView, pAnnot, nFlags, point);
408 }
409
410 return FALSE;
411 }
412
OnMouseWheel(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,FX_UINT nFlags,short zDelta,const CPDF_Point & point)413 FX_BOOL CFFL_IFormFiller::OnMouseWheel(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, short zDelta, const CPDF_Point& point)
414 {
415 ASSERT(pAnnot != NULL);
416 ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
417
418 if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
419 {
420 return pFormFiller->OnMouseWheel(pPageView, pAnnot, nFlags, zDelta, point);
421 }
422
423 return FALSE;
424 }
425
OnRButtonDown(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,FX_UINT nFlags,const CPDF_Point & point)426 FX_BOOL CFFL_IFormFiller::OnRButtonDown(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)
427 {
428 ASSERT(pAnnot != NULL);
429 ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
430
431 if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
432 {
433 return pFormFiller->OnRButtonDown(pPageView, pAnnot, nFlags, point);
434 }
435
436 return FALSE;
437 }
438
OnRButtonUp(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,FX_UINT nFlags,const CPDF_Point & point)439 FX_BOOL CFFL_IFormFiller::OnRButtonUp(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)
440 {
441 ASSERT(pAnnot != NULL);
442 ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
443
444 if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
445 {
446 return pFormFiller->OnRButtonUp(pPageView, pAnnot, nFlags, point);
447 }
448
449 return FALSE;
450 }
451
OnRButtonDblClk(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,FX_UINT nFlags,const CPDF_Point & point)452 FX_BOOL CFFL_IFormFiller::OnRButtonDblClk(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)
453 {
454 ASSERT(pAnnot != NULL);
455 ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
456
457 if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
458 {
459 return pFormFiller->OnRButtonDblClk(pPageView, pAnnot, nFlags, point);
460 }
461
462 return FALSE;
463 }
464
OnKeyDown(CPDFSDK_Annot * pAnnot,FX_UINT nKeyCode,FX_UINT nFlags)465 FX_BOOL CFFL_IFormFiller::OnKeyDown(CPDFSDK_Annot* pAnnot, FX_UINT nKeyCode, FX_UINT nFlags)
466 {
467 ASSERT(pAnnot != NULL);
468 ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
469
470 if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
471 {
472 return pFormFiller->OnKeyDown(pAnnot, nKeyCode, nFlags);
473 }
474
475 return FALSE;
476 }
477
OnChar(CPDFSDK_Annot * pAnnot,FX_UINT nChar,FX_UINT nFlags)478 FX_BOOL CFFL_IFormFiller::OnChar(CPDFSDK_Annot* pAnnot, FX_UINT nChar, FX_UINT nFlags)
479 {
480 ASSERT(pAnnot != NULL);
481 ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
482
483 if (nChar == FWL_VKEY_Tab) return TRUE;
484
485 if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
486 {
487 return pFormFiller->OnChar(pAnnot, nChar, nFlags);
488 }
489
490 return FALSE;
491 }
492
OnDeSelected(CPDFSDK_Annot * pAnnot)493 void CFFL_IFormFiller::OnDeSelected(CPDFSDK_Annot* pAnnot)
494 {
495 ASSERT(pAnnot != NULL);
496 ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
497
498 if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
499 {
500 pFormFiller->OnDeSelected(pAnnot);
501 }
502 }
503
OnSelected(CPDFSDK_Annot * pAnnot)504 void CFFL_IFormFiller::OnSelected(CPDFSDK_Annot* pAnnot)
505 {
506 ASSERT(pAnnot != NULL);
507 ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
508
509 if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
510 {
511 pFormFiller->OnSelected(pAnnot);
512 }
513 }
514
OnSetFocus(CPDFSDK_Annot * pAnnot,FX_UINT nFlag)515 FX_BOOL CFFL_IFormFiller::OnSetFocus(CPDFSDK_Annot* pAnnot,FX_UINT nFlag)
516 {
517 if(!pAnnot) return FALSE;
518 ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
519
520 if (!m_bNotifying)
521 {
522 CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;
523 if (pWidget->GetAAction(CPDF_AAction::GetFocus))
524 {
525 m_bNotifying = TRUE;
526 pWidget->GetAppearanceAge();
527 int nValueAge = pWidget->GetValueAge();
528 pWidget->ClearAppModified();
529
530
531 CPDFSDK_PageView* pPageView = pAnnot->GetPageView();
532 ASSERT(pPageView != NULL);
533
534 PDFSDK_FieldAction fa;
535 fa.bModifier = m_pApp->FFI_IsCTRLKeyDown(nFlag);
536 fa.bShift = m_pApp->FFI_IsSHIFTKeyDown(nFlag);
537
538
539 CFFL_FormFiller* pFormFiller = GetFormFiller(pWidget, TRUE);
540 if(!pFormFiller) return FALSE;
541 pFormFiller->GetActionData(pPageView, CPDF_AAction::GetFocus, fa);
542
543 pWidget->OnAAction(CPDF_AAction::GetFocus, fa, pPageView);
544 m_bNotifying = FALSE;
545
546 // if (!IsValidAnnot(m_pApp, pDocument, pDocView, pPageView, pAnnot)) return FALSE;
547
548 if (pWidget->IsAppModified())
549 {
550 if (CFFL_FormFiller* pFormFiller = GetFormFiller(pWidget, FALSE))
551 {
552 pFormFiller->ResetPDFWindow(pPageView, nValueAge == pWidget->GetValueAge());
553 }
554 }
555 }
556 }
557
558 if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, TRUE))
559 {
560 if (pFormFiller->OnSetFocus(pAnnot, nFlag))
561 {
562 return TRUE;
563 }
564 else
565 return FALSE;
566 }
567
568 return TRUE;
569 }
570
OnKillFocus(CPDFSDK_Annot * pAnnot,FX_UINT nFlag)571 FX_BOOL CFFL_IFormFiller::OnKillFocus(CPDFSDK_Annot* pAnnot,FX_UINT nFlag)
572 {
573 if(!pAnnot) return FALSE;
574 ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
575
576 if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
577 {
578 if (pFormFiller->OnKillFocus(pAnnot, nFlag))
579 {
580 if (!m_bNotifying)
581 {
582 CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;
583 if (pWidget->GetAAction(CPDF_AAction::LoseFocus))
584 {
585 m_bNotifying = TRUE;
586 pWidget->ClearAppModified();
587
588 CPDFSDK_PageView* pPageView = pWidget->GetPageView();
589 ASSERT(pPageView != NULL);
590
591 PDFSDK_FieldAction fa;
592 fa.bModifier = m_pApp->FFI_IsCTRLKeyDown(nFlag);
593 fa.bShift = m_pApp->FFI_IsSHIFTKeyDown(nFlag);
594
595 pFormFiller->GetActionData(pPageView, CPDF_AAction::LoseFocus, fa);
596
597 pWidget->OnAAction(CPDF_AAction::LoseFocus, fa, pPageView);
598 m_bNotifying = FALSE;
599
600 }
601 }
602 }
603 else
604 return FALSE;
605 }
606
607 return TRUE;
608 }
609
IsVisible(CPDFSDK_Widget * pWidget)610 FX_BOOL CFFL_IFormFiller::IsVisible(CPDFSDK_Widget* pWidget)
611 {
612 return pWidget->IsVisible();
613 }
614
IsReadOnly(CPDFSDK_Widget * pWidget)615 FX_BOOL CFFL_IFormFiller::IsReadOnly(CPDFSDK_Widget* pWidget)
616 {
617 ASSERT(pWidget != NULL);
618
619 int nFieldFlags = pWidget->GetFieldFlags();
620
621 return (nFieldFlags & FIELDFLAG_READONLY) == FIELDFLAG_READONLY;
622 }
623
IsFillingAllowed(CPDFSDK_Widget * pWidget)624 FX_BOOL CFFL_IFormFiller::IsFillingAllowed(CPDFSDK_Widget* pWidget)
625 {
626 ASSERT(pWidget != NULL);
627
628 if (pWidget->GetFieldType() == FIELDTYPE_PUSHBUTTON)
629 return TRUE;
630 else
631 {
632 CPDF_Page* pPage = pWidget->GetPDFPage();
633 ASSERT(pPage != NULL);
634
635 CPDF_Document* pDocument = pPage->m_pDocument;
636 ASSERT(pDocument != NULL);
637
638 FX_DWORD dwPermissions = pDocument->GetUserPermissions();
639 return (dwPermissions&FPDFPERM_FILL_FORM) ||
640 (dwPermissions&FPDFPERM_ANNOT_FORM) ||
641 (dwPermissions&FPDFPERM_MODIFY);
642 }
643 return TRUE;
644 }
645
GetFormFiller(CPDFSDK_Annot * pAnnot,FX_BOOL bRegister)646 CFFL_FormFiller* CFFL_IFormFiller::GetFormFiller(CPDFSDK_Annot* pAnnot, FX_BOOL bRegister)
647 {
648 // ASSERT(pAnnot != NULL);
649 // ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
650
651 CFFL_FormFiller * pFormFiller = NULL;
652 m_Maps.Lookup(pAnnot, pFormFiller);
653
654 if (pFormFiller)
655 return pFormFiller;
656
657 if (bRegister)
658 {
659 CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;
660
661 int nFieldType = pWidget->GetFieldType();
662 switch(nFieldType)
663 {
664 case FIELDTYPE_PUSHBUTTON:
665 pFormFiller = new CFFL_PushButton(m_pApp, pWidget);
666 break;
667 case FIELDTYPE_CHECKBOX:
668 pFormFiller = new CFFL_CheckBox(m_pApp, pWidget);
669 break;
670 case FIELDTYPE_RADIOBUTTON:
671 pFormFiller = new CFFL_RadioButton(m_pApp, pWidget);
672 break;
673 case FIELDTYPE_TEXTFIELD:
674 pFormFiller = new CFFL_TextField(m_pApp, pWidget);
675 break;
676 case FIELDTYPE_LISTBOX:
677 pFormFiller = new CFFL_ListBox(m_pApp, pWidget);
678 break;
679 case FIELDTYPE_COMBOBOX:
680 pFormFiller = new CFFL_ComboBox(m_pApp, pWidget);
681 break;
682 case FIELDTYPE_UNKNOWN:
683 default:
684 pFormFiller = NULL;
685 break;
686 }
687
688 if (pFormFiller)
689 {
690 m_Maps.SetAt(pAnnot, pFormFiller);
691 }
692 }
693
694 return pFormFiller;
695 }
696
RemoveFormFiller(CPDFSDK_Annot * pAnnot)697 void CFFL_IFormFiller::RemoveFormFiller(CPDFSDK_Annot* pAnnot)
698 {
699 if ( pAnnot != NULL )
700 {
701 UnRegisterFormFiller( pAnnot );
702 }
703 }
704
UnRegisterFormFiller(CPDFSDK_Annot * pAnnot)705 void CFFL_IFormFiller::UnRegisterFormFiller(CPDFSDK_Annot* pAnnot)
706 {
707 CFFL_FormFiller * pFormFiller = NULL;
708
709 if (m_Maps.Lookup(pAnnot,pFormFiller))
710 {
711 if (pFormFiller)
712 delete pFormFiller;
713 m_Maps.RemoveKey(pAnnot);
714 }
715 }
716
SetFocusAnnotTab(CPDFSDK_Annot * pWidget,FX_BOOL bSameField,FX_BOOL bNext)717 void CFFL_IFormFiller::SetFocusAnnotTab(CPDFSDK_Annot* pWidget, FX_BOOL bSameField, FX_BOOL bNext)
718 {
719
720 }
721
QueryWherePopup(void * pPrivateData,FX_FLOAT fPopupMin,FX_FLOAT fPopupMax,FX_INT32 & nRet,FX_FLOAT & fPopupRet)722 void CFFL_IFormFiller::QueryWherePopup(void* pPrivateData, FX_FLOAT fPopupMin,FX_FLOAT fPopupMax, FX_INT32 & nRet, FX_FLOAT & fPopupRet)
723 {
724 ASSERT(pPrivateData != NULL);
725
726 CFFL_PrivateData* pData = (CFFL_PrivateData*)pPrivateData;
727
728
729
730
731 CPDF_Rect rcPageView(0,0,0,0);
732 rcPageView.right = pData->pWidget->GetPDFPage()->GetPageWidth();
733 rcPageView.bottom = pData->pWidget->GetPDFPage()->GetPageHeight();
734 rcPageView.Normalize();
735
736
737 ASSERT(pData->pWidget != NULL);
738 CPDF_Rect rcAnnot = pData->pWidget->GetRect();
739
740 FX_FLOAT fTop = 0.0f;
741 FX_FLOAT fBottom = 0.0f;
742
743 CPDFSDK_Widget * pWidget = (CPDFSDK_Widget*)pData->pWidget;
744 switch (pWidget->GetRotate() / 90)
745 {
746 default:
747 case 0:
748 fTop = rcPageView.top - rcAnnot.top;
749 fBottom = rcAnnot.bottom - rcPageView.bottom;
750 break;
751 case 1:
752 fTop = rcAnnot.left - rcPageView.left;
753 fBottom = rcPageView.right - rcAnnot.right;
754 break;
755 case 2:
756 fTop = rcAnnot.bottom - rcPageView.bottom;
757 fBottom = rcPageView.top - rcAnnot.top;
758 break;
759 case 3:
760 fTop = rcPageView.right - rcAnnot.right;
761 fBottom = rcAnnot.left - rcPageView.left;
762 break;
763 }
764
765 FX_FLOAT fFactHeight = 0;
766 FX_BOOL bBottom = TRUE;
767 FX_FLOAT fMaxListBoxHeight = 0;
768 if (fPopupMax > FFL_MAXLISTBOXHEIGHT)
769 {
770 if (fPopupMin > FFL_MAXLISTBOXHEIGHT)
771 {
772 fMaxListBoxHeight = fPopupMin;
773 }
774 else
775 {
776 fMaxListBoxHeight = FFL_MAXLISTBOXHEIGHT;
777 }
778 }
779 else
780 fMaxListBoxHeight = fPopupMax;
781
782 if (fBottom > fMaxListBoxHeight)
783 {
784 fFactHeight = fMaxListBoxHeight;
785 bBottom = TRUE;
786 }
787 else
788 {
789 if (fTop > fMaxListBoxHeight)
790 {
791 fFactHeight = fMaxListBoxHeight;
792 bBottom = FALSE;
793 }
794 else
795 {
796 if (fTop > fBottom)
797 {
798 fFactHeight = fTop;
799 bBottom = FALSE;
800 }
801 else
802 {
803 fFactHeight = fBottom;
804 bBottom = TRUE;
805 }
806 }
807 }
808
809 nRet = bBottom ? 0 : 1;
810 fPopupRet = fFactHeight;
811 }
812
OnSetWindowRect(void * pPrivateData,const CPDF_Rect & rcWindow)813 void CFFL_IFormFiller::OnSetWindowRect(void* pPrivateData, const CPDF_Rect & rcWindow)
814 {
815 ASSERT(pPrivateData != NULL);
816
817 CFFL_PrivateData* pData = (CFFL_PrivateData*)pPrivateData;
818
819 if (CFFL_FormFiller* pFormFiller = GetFormFiller(pData->pWidget, TRUE))
820 {
821
822 CPDF_Rect rcOld = pFormFiller->PWLtoFFL(pFormFiller->GetWindowRect(pData->pPageView));
823 CPDF_Rect rcNew = pFormFiller->PWLtoFFL(rcWindow);
824 pFormFiller->SetWindowRect(pData->pPageView, rcWindow);
825
826 CPDF_Rect unRect = rcOld;
827 unRect.Union(rcNew);
828 //FX_RECT rcRect = unRect.GetOutterRect();
829 unRect.left = (FX_FLOAT)(unRect.left - 0.5);
830 unRect.right = (FX_FLOAT)(unRect.right + 0.5);
831 unRect.top = (FX_FLOAT)(unRect.top + 0.5);
832 unRect.bottom = (FX_FLOAT)(unRect.bottom -0.5);
833 m_pApp->FFI_Invalidate(pData->pWidget->GetPDFPage(), unRect.left, unRect.top, unRect.right, unRect.bottom);
834 }
835 }
836
OnKeyStroke(FX_BOOL bEditOrList,void * pPrivateData,FX_INT32 nKeyCode,CFX_WideString & strChange,const CFX_WideString & strChangeEx,FX_BOOL bKeyDown,FX_BOOL & bRC,FX_BOOL & bExit)837 void CFFL_IFormFiller::OnKeyStroke(FX_BOOL bEditOrList, void* pPrivateData, FX_INT32 nKeyCode, CFX_WideString& strChange,
838 const CFX_WideString& strChangeEx, FX_BOOL bKeyDown,
839 FX_BOOL & bRC, FX_BOOL & bExit)
840 {
841 ASSERT(pPrivateData != NULL);
842 CFFL_PrivateData* pData = (CFFL_PrivateData*)pPrivateData;
843 ASSERT(pData->pWidget != NULL);
844
845 CFFL_FormFiller* pFormFiller = GetFormFiller(pData->pWidget, FALSE);
846 ASSERT(pFormFiller != NULL);
847
848 pFormFiller->OnKeyStroke(bKeyDown);
849 }
850
OnKeyStrokeCommit(CPDFSDK_Widget * pWidget,CPDFSDK_PageView * pPageView,FX_BOOL & bRC,FX_BOOL & bExit,FX_DWORD nFlag)851 void CFFL_IFormFiller::OnKeyStrokeCommit(CPDFSDK_Widget* pWidget, CPDFSDK_PageView* pPageView, FX_BOOL& bRC, FX_BOOL& bExit, FX_DWORD nFlag)
852 {
853 if (!m_bNotifying)
854 {
855 ASSERT(pWidget != NULL);
856 if (pWidget->GetAAction(CPDF_AAction::KeyStroke))
857 {
858 m_bNotifying = TRUE;
859 pWidget->ClearAppModified();
860
861 ASSERT(pPageView != NULL);
862 // CReader_DocView* pDocView = pPageView->GetDocView();
863 // ASSERT(pDocView != NULL);
864
865
866
867 PDFSDK_FieldAction fa;
868 fa.bModifier = m_pApp->FFI_IsCTRLKeyDown(nFlag);
869 fa.bShift = m_pApp->FFI_IsSHIFTKeyDown(nFlag);
870 fa.bWillCommit = TRUE;
871 fa.nCommitKey = GetCommitKey();
872 fa.bKeyDown = GetKeyDown();
873 fa.bRC = TRUE;
874
875 CFFL_FormFiller* pFormFiller = GetFormFiller(pWidget, FALSE);
876 ASSERT(pFormFiller != NULL);
877
878 pFormFiller->GetActionData(pPageView, CPDF_AAction::KeyStroke, fa);
879 pFormFiller->SaveState(pPageView);
880
881 PDFSDK_FieldAction faOld = fa;
882 pWidget->OnAAction(CPDF_AAction::KeyStroke, fa, pPageView);
883
884 bRC = fa.bRC;
885 // bExit = !IsValidAnnot(m_pApp, pDocument, pDocView, pPageView, pWidget);
886
887 m_bNotifying = FALSE;
888 }
889 }
890 }
891
OnValidate(CPDFSDK_Widget * pWidget,CPDFSDK_PageView * pPageView,FX_BOOL & bRC,FX_BOOL & bExit,FX_DWORD nFlag)892 void CFFL_IFormFiller::OnValidate(CPDFSDK_Widget* pWidget, CPDFSDK_PageView* pPageView, FX_BOOL& bRC, FX_BOOL& bExit, FX_DWORD nFlag)
893 {
894 if (!m_bNotifying)
895 {
896 ASSERT(pWidget != NULL);
897 if (pWidget->GetAAction(CPDF_AAction::Validate))
898 {
899 m_bNotifying = TRUE;
900 pWidget->ClearAppModified();
901
902 ASSERT(pPageView != NULL);
903 // CReader_DocView* pDocView = pPageView->GetDocView();
904 // ASSERT(pDocView != NULL);
905
906
907
908 PDFSDK_FieldAction fa;
909 fa.bModifier = m_pApp->FFI_IsCTRLKeyDown(nFlag);
910 fa.bShift = m_pApp->FFI_IsSHIFTKeyDown(nFlag);
911 fa.bKeyDown = GetKeyDown();
912 fa.bRC = TRUE;
913
914 CFFL_FormFiller* pFormFiller = GetFormFiller(pWidget, FALSE);
915 ASSERT(pFormFiller != NULL);
916
917 pFormFiller->GetActionData(pPageView, CPDF_AAction::Validate, fa);
918 pFormFiller->SaveState(pPageView);
919
920 PDFSDK_FieldAction faOld = fa;
921 pWidget->OnAAction(CPDF_AAction::Validate, fa, pPageView);
922
923 bRC = fa.bRC;
924 // bExit = !IsValidAnnot(m_pApp, pDocument, pDocView, pPageView, pWidget);
925
926 m_bNotifying = FALSE;
927 }
928 }
929 }
930
OnCalculate(CPDFSDK_Widget * pWidget,CPDFSDK_PageView * pPageView,FX_BOOL & bExit,FX_DWORD nFlag)931 void CFFL_IFormFiller::OnCalculate(CPDFSDK_Widget* pWidget, CPDFSDK_PageView* pPageView, FX_BOOL& bExit, FX_DWORD nFlag)
932 {
933 if (!m_bNotifying)
934 {
935 ASSERT(pWidget != NULL);
936 ASSERT(pPageView != NULL);
937 // CReader_DocView* pDocView = pPageView->GetDocView();
938 // ASSERT(pDocView != NULL);
939 CPDFSDK_Document* pDocument = pPageView->GetSDKDocument();
940 ASSERT(pDocument != NULL);
941
942 CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm();
943 ASSERT(pInterForm != NULL);
944
945 pInterForm->OnCalculate(pWidget->GetFormField());
946
947 // bExit = !IsValidAnnot(m_pApp, pDocument, pDocView, pPageView, pWidget);
948
949 m_bNotifying = FALSE;
950 }
951 }
952
OnFormat(CPDFSDK_Widget * pWidget,CPDFSDK_PageView * pPageView,FX_BOOL & bExit,FX_DWORD nFlag)953 void CFFL_IFormFiller::OnFormat(CPDFSDK_Widget* pWidget, CPDFSDK_PageView* pPageView, FX_BOOL& bExit, FX_DWORD nFlag)
954 {
955 if (!m_bNotifying)
956 {
957 ASSERT(pWidget != NULL);
958 ASSERT(pPageView != NULL);
959 // CReader_DocView* pDocView = pPageView->GetDocView();
960 // ASSERT(pDocView != NULL);
961 CPDFSDK_Document* pDocument = pPageView->GetSDKDocument();
962 ASSERT(pDocument != NULL);
963
964 CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm();
965 ASSERT(pInterForm != NULL);
966
967 FX_BOOL bFormated = FALSE;
968 CFX_WideString sValue = pInterForm->OnFormat(pWidget->GetFormField(), GetCommitKey(), bFormated);
969
970 // bExit = !IsValidAnnot(m_pApp, pDocument, pDocView, pPageView, pWidget);
971
972 if (bExit) return;
973
974 if (bFormated)
975 {
976 pInterForm->ResetFieldAppearance(pWidget->GetFormField(), sValue.c_str(), TRUE);
977 pInterForm->UpdateField(pWidget->GetFormField());
978 }
979
980 m_bNotifying = FALSE;
981 }
982 }
983
984 // LRESULT CALLBACK CFFL_IFormFiller::FFL_WndProc(
985 // int code, // hook code
986 // WPARAM wParam, // virtual-key code
987 // LPARAM lParam // keystroke-message information
988 // )
989 // {
990 // if (code != HC_ACTION)
991 // {
992 // return CallNextHookEx (m_hookSheet, code, wParam, lParam);
993 // }
994 //
995 // FXSYS_memcpy(&g_Msg, (void*)lParam, sizeof(MSG));
996 //
997 // return 0;
998 // }
999
1000 // MSG CFFL_IFormFiller::GetLastMessage()
1001 // {
1002 // return g_Msg;
1003 // }
1004
GetCommitKey()1005 int CFFL_IFormFiller::GetCommitKey()
1006 {
1007 // MSG msg = CFFL_IFormFiller::GetLastMessage();
1008
1009 int nCommitKey = 0;
1010 // switch (msg.message)
1011 // {
1012 // case WM_LBUTTONDOWN:
1013 // case WM_LBUTTONUP:
1014 // nCommitKey = 1;
1015 // break;
1016 // case WM_KEYDOWN:
1017 // switch (msg.wParam)
1018 // {
1019 // case VK_RETURN:
1020 // nCommitKey = 2;
1021 // break;
1022 // case VK_TAB:
1023 // nCommitKey = 3;
1024 // break;
1025 // }
1026 // break;
1027 // }
1028
1029 return nCommitKey;
1030 }
1031
GetKeyDown()1032 FX_BOOL CFFL_IFormFiller::GetKeyDown()
1033 {
1034 return TRUE;
1035 // MSG msg = CFFL_IFormFiller::GetLastMessage();
1036 //
1037 // return msg.message == WM_KEYDOWN || msg.message == WM_CHAR;
1038 }
1039
IsValidAnnot(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot)1040 FX_BOOL CFFL_IFormFiller::IsValidAnnot(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot)
1041 {
1042
1043 ASSERT(pPageView != NULL);
1044 ASSERT(pAnnot != NULL);
1045
1046 if(pPageView)
1047 return pPageView->IsValidAnnot(pAnnot->GetPDFAnnot());
1048 else
1049 return FALSE;
1050 }
1051
BeforeUndo(CPDFSDK_Document * pDocument)1052 void CFFL_IFormFiller::BeforeUndo(CPDFSDK_Document* pDocument)
1053 {
1054
1055 }
1056
BeforeRedo(CPDFSDK_Document * pDocument)1057 void CFFL_IFormFiller::BeforeRedo(CPDFSDK_Document* pDocument)
1058 {
1059 BeforeUndo(pDocument);
1060 }
1061
AfterUndo(CPDFSDK_Document * pDocument)1062 void CFFL_IFormFiller::AfterUndo(CPDFSDK_Document* pDocument)
1063 {
1064 }
1065
AfterRedo(CPDFSDK_Document * pDocument)1066 void CFFL_IFormFiller::AfterRedo(CPDFSDK_Document* pDocument)
1067 {
1068 }
1069
CanCopy(CPDFSDK_Document * pDocument)1070 FX_BOOL CFFL_IFormFiller::CanCopy(CPDFSDK_Document* pDocument)
1071 {
1072
1073 return FALSE;
1074 }
1075
CanCut(CPDFSDK_Document * pDocument)1076 FX_BOOL CFFL_IFormFiller::CanCut(CPDFSDK_Document* pDocument)
1077 {
1078
1079 return FALSE;
1080 }
1081
CanPaste(CPDFSDK_Document * pDocument)1082 FX_BOOL CFFL_IFormFiller::CanPaste(CPDFSDK_Document* pDocument)
1083 {
1084
1085 return FALSE;
1086 }
1087
DoCopy(CPDFSDK_Document * pDocument)1088 void CFFL_IFormFiller::DoCopy(CPDFSDK_Document* pDocument)
1089 {
1090 }
1091
DoCut(CPDFSDK_Document * pDocument)1092 void CFFL_IFormFiller::DoCut(CPDFSDK_Document* pDocument)
1093 {
1094 }
1095
DoPaste(CPDFSDK_Document * pDocument)1096 void CFFL_IFormFiller::DoPaste(CPDFSDK_Document* pDocument)
1097 {
1098
1099 }
OnBeforeKeyStroke(FX_BOOL bEditOrList,void * pPrivateData,FX_INT32 nKeyCode,CFX_WideString & strChange,const CFX_WideString & strChangeEx,int nSelStart,int nSelEnd,FX_BOOL bKeyDown,FX_BOOL & bRC,FX_BOOL & bExit,FX_DWORD nFlag)1100 void CFFL_IFormFiller::OnBeforeKeyStroke(FX_BOOL bEditOrList, void* pPrivateData, FX_INT32 nKeyCode,
1101 CFX_WideString & strChange, const CFX_WideString& strChangeEx,
1102 int nSelStart, int nSelEnd,
1103 FX_BOOL bKeyDown, FX_BOOL & bRC, FX_BOOL & bExit, FX_DWORD nFlag)
1104 {
1105 ASSERT(pPrivateData != NULL);
1106 CFFL_PrivateData* pData = (CFFL_PrivateData*)pPrivateData;
1107 ASSERT(pData->pWidget != NULL);
1108
1109 CFFL_FormFiller* pFormFiller = GetFormFiller(pData->pWidget, FALSE);
1110 ASSERT(pFormFiller != NULL);
1111
1112 if (!m_bNotifying)
1113 {
1114 if (pData->pWidget->GetAAction(CPDF_AAction::KeyStroke))
1115 {
1116 m_bNotifying = TRUE;
1117 int nAge = pData->pWidget->GetAppearanceAge();
1118 int nValueAge = pData->pWidget->GetValueAge();
1119
1120 ASSERT(pData->pPageView != NULL);
1121 CPDFSDK_Document* pDocument = pData->pPageView->GetSDKDocument();
1122
1123 PDFSDK_FieldAction fa;
1124 fa.bModifier = m_pApp->FFI_IsCTRLKeyDown(nFlag);
1125 fa.bShift = m_pApp->FFI_IsSHIFTKeyDown(nFlag);
1126 fa.sChange = strChange;
1127 fa.sChangeEx = strChangeEx;
1128 fa.bKeyDown = bKeyDown;
1129 fa.bWillCommit = FALSE;
1130 fa.bRC = TRUE;
1131 fa.nSelStart = nSelStart;
1132 fa.nSelEnd = nSelEnd;
1133
1134
1135 pFormFiller->GetActionData(pData->pPageView, CPDF_AAction::KeyStroke, fa);
1136 pFormFiller->SaveState(pData->pPageView);
1137
1138 if (pData->pWidget->OnAAction(CPDF_AAction::KeyStroke, fa, pData->pPageView))
1139 {
1140 if (!IsValidAnnot(pData->pPageView, pData->pWidget))
1141 {
1142 bExit = TRUE;
1143 m_bNotifying = FALSE;
1144 return;
1145 }
1146
1147 if (nAge != pData->pWidget->GetAppearanceAge())
1148 {
1149 CPWL_Wnd* pWnd = pFormFiller->ResetPDFWindow(pData->pPageView, nValueAge == pData->pWidget->GetValueAge());
1150 pData = (CFFL_PrivateData*)pWnd->GetAttachedData();
1151 bExit = TRUE;
1152 }
1153
1154 if (fa.bRC)
1155 {
1156 pFormFiller->SetActionData(pData->pPageView, CPDF_AAction::KeyStroke, fa);
1157 bRC = FALSE;
1158 }
1159 else
1160 {
1161 pFormFiller->RestoreState(pData->pPageView);
1162 bRC = FALSE;
1163 }
1164
1165 if (pDocument->GetFocusAnnot() != pData->pWidget)
1166 {
1167 pFormFiller->CommitData(pData->pPageView,nFlag);
1168 bExit = TRUE;
1169 }
1170 }
1171 else
1172 {
1173 if (!IsValidAnnot(pData->pPageView, pData->pWidget))
1174 {
1175 bExit = TRUE;
1176 m_bNotifying = FALSE;
1177 return;
1178 }
1179 }
1180
1181 m_bNotifying = FALSE;
1182 }
1183 }
1184 }
1185
OnAfterKeyStroke(FX_BOOL bEditOrList,void * pPrivateData,FX_BOOL & bExit,FX_DWORD nFlag)1186 void CFFL_IFormFiller::OnAfterKeyStroke(FX_BOOL bEditOrList, void* pPrivateData, FX_BOOL & bExit,FX_DWORD nFlag)
1187 {
1188 ASSERT(pPrivateData != NULL);
1189 CFFL_PrivateData* pData = (CFFL_PrivateData*)pPrivateData;
1190 ASSERT(pData->pWidget != NULL);
1191
1192 CFFL_FormFiller* pFormFiller = GetFormFiller(pData->pWidget, FALSE);
1193 ASSERT(pFormFiller != NULL);
1194
1195 if (!bEditOrList)
1196 pFormFiller->OnKeyStroke(bExit);
1197 }
1198