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
8 #include "../../include/formfiller/FFL_FormFiller.h"
9 #include "../../include/formfiller/FFL_Notify.h"
10 #include "../../include/formfiller/FFL_CBA_Fontmap.h"
11
12 #define GetRed(rgb) ((FX_BYTE)(rgb))
13 #define GetGreen(rgb) ((FX_BYTE)(((FX_WORD)(rgb)) >> 8))
14 #define GetBlue(rgb) ((FX_BYTE)((rgb)>>16))
15
16 #define FFL_HINT_ELAPSE 800
17
18 /* ------------------------- CFFL_FormFiller ------------------------- */
19
CFFL_FormFiller(CPDFDoc_Environment * pApp,CPDFSDK_Annot * pAnnot)20 CFFL_FormFiller::CFFL_FormFiller(CPDFDoc_Environment* pApp, CPDFSDK_Annot* pAnnot)
21 :m_pApp(pApp),
22 m_pAnnot(pAnnot),
23 m_bValid(FALSE),
24 m_ptOldPos(0,0)
25 {
26 m_pWidget = (CPDFSDK_Widget*) pAnnot;
27 }
28
~CFFL_FormFiller()29 CFFL_FormFiller::~CFFL_FormFiller()
30 {
31 FX_POSITION pos = m_Maps.GetStartPosition();
32 while (pos)
33 {
34 CPDFSDK_PageView * pPageView = NULL;
35 CPWL_Wnd* pWnd = NULL;
36 m_Maps.GetNextAssoc(pos, pPageView, pWnd);
37
38 if (pWnd)
39 {
40 CFFL_PrivateData* pData = (CFFL_PrivateData*)pWnd->GetAttachedData();
41 pWnd->Destroy();
42 delete pWnd;
43 delete pData;
44 }
45 }
46 m_Maps.RemoveAll();
47
48 }
49
SetWindowRect(CPDFSDK_PageView * pPageView,const CPDF_Rect & rcWindow)50 void CFFL_FormFiller::SetWindowRect(CPDFSDK_PageView* pPageView, const CPDF_Rect& rcWindow)
51 {
52 if (CPWL_Wnd* pWnd = this->GetPDFWindow(pPageView, FALSE))
53 {
54 pWnd->Move(CPDF_Rect(rcWindow), TRUE, FALSE);
55 }
56 }
57
GetWindowRect(CPDFSDK_PageView * pPageView)58 CPDF_Rect CFFL_FormFiller::GetWindowRect(CPDFSDK_PageView* pPageView)
59 {
60 if (CPWL_Wnd* pWnd = this->GetPDFWindow(pPageView, FALSE))
61 {
62 return pWnd->GetWindowRect();
63 }
64
65 return CPDF_Rect(0,0,0,0);
66 }
67
GetViewBBox(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot)68 FX_RECT CFFL_FormFiller::GetViewBBox(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot)
69 {
70 ASSERT(pPageView != NULL);
71 ASSERT(pAnnot != NULL);
72
73 CPDF_Rect rcAnnot = m_pWidget->GetRect();
74
75 if (CPWL_Wnd* pWnd = this->GetPDFWindow(pPageView, FALSE))
76 {
77 CPDF_Rect rcWindow = pWnd->GetWindowRect();
78 rcAnnot = PWLtoFFL(rcWindow);
79 }
80
81 CPDF_Rect rcWin = rcAnnot;
82 // pPageView->DocToWindow(rcAnnot, rcWin);
83
84 CPDF_Rect rcFocus = this->GetFocusBox(pPageView);
85 if (!rcFocus.IsEmpty())
86 rcWin.Union(rcFocus);
87
88 CPDF_Rect rect = CPWL_Utils::InflateRect(rcWin,1);
89
90 return rect.GetOutterRect();
91 }
92
OnDraw(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,CFX_RenderDevice * pDevice,CPDF_Matrix * pUser2Device,FX_DWORD dwFlags)93 void CFFL_FormFiller::OnDraw(CPDFSDK_PageView *pPageView, /*HDC hDC,*/ CPDFSDK_Annot* pAnnot,
94 CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,
95 /*const CRect& rcWindow,*/ FX_DWORD dwFlags)
96 {
97 ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
98
99 if (CPWL_Wnd * pWnd = GetPDFWindow(pPageView, FALSE))
100 {
101 CPDF_Matrix mt = this->GetCurMatrix();
102 mt.Concat(*pUser2Device);
103 pWnd->DrawAppearance(pDevice,&mt);
104 }
105 else
106 {
107 CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;
108 if (CFFL_IFormFiller::IsVisible(pWidget))
109 pWidget->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Normal, NULL);
110 }
111 }
112
OnDrawDeactive(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,CFX_RenderDevice * pDevice,CPDF_Matrix * pUser2Device,FX_DWORD dwFlags)113 void CFFL_FormFiller::OnDrawDeactive(CPDFSDK_PageView *pPageView, /*HDC hDC,*/ CPDFSDK_Annot* pAnnot,
114 CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,
115 /*const CRect& rcWindow,*/ FX_DWORD dwFlags)
116 {
117 ASSERT(pAnnot != NULL);
118
119 CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;
120
121 pWidget->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Normal, NULL);
122 }
123
124
OnCreate(CPDFSDK_Annot * pAnnot)125 void CFFL_FormFiller::OnCreate(CPDFSDK_Annot* pAnnot)
126 {
127 }
128
OnLoad(CPDFSDK_Annot * pAnnot)129 void CFFL_FormFiller::OnLoad(CPDFSDK_Annot* pAnnot)
130 {
131 }
132
OnDelete(CPDFSDK_Annot * pAnnot)133 void CFFL_FormFiller::OnDelete(CPDFSDK_Annot* pAnnot)
134 {
135 }
136
OnMouseEnter(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot)137 void CFFL_FormFiller::OnMouseEnter(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot)
138 {
139 }
140
OnMouseExit(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot)141 void CFFL_FormFiller::OnMouseExit(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot)
142 {
143 EndTimer();
144 ASSERT(m_pWidget != NULL);
145 }
146
OnLButtonDown(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,FX_UINT nFlags,const CPDF_Point & point)147 FX_BOOL CFFL_FormFiller::OnLButtonDown(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)
148 {
149 if (CPWL_Wnd * pWnd = GetPDFWindow(pPageView, TRUE))
150 {
151 m_bValid = TRUE;
152 FX_RECT rect = this->GetViewBBox(pPageView,pAnnot);
153 this->InvalidateRect(rect.left, rect.top, rect.right, rect.bottom);
154
155 if(!rect.Contains((int)point.x, (int)point.y))
156 return FALSE;
157
158 return pWnd->OnLButtonDown(WndtoPWL(pPageView, point),nFlags);
159 }
160
161 return FALSE;
162 }
163
OnLButtonUp(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,FX_UINT nFlags,const CPDF_Point & point)164 FX_BOOL CFFL_FormFiller::OnLButtonUp(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)
165 {
166 if (CPWL_Wnd * pWnd = GetPDFWindow(pPageView, FALSE))
167 {
168 FX_RECT rcFFL = this->GetViewBBox(pPageView, pAnnot);
169 this->InvalidateRect(rcFFL.left, rcFFL.top, rcFFL.right, rcFFL.bottom);
170 pWnd->OnLButtonUp(WndtoPWL(pPageView, point),nFlags);
171 return TRUE;
172 }
173
174 return FALSE;
175 }
176
OnLButtonDblClk(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,FX_UINT nFlags,const CPDF_Point & point)177 FX_BOOL CFFL_FormFiller::OnLButtonDblClk(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)
178 {
179 if (CPWL_Wnd * pWnd = GetPDFWindow(pPageView, FALSE))
180 {
181 pWnd->OnLButtonDblClk(WndtoPWL(pPageView, point),nFlags);
182 return TRUE;
183 }
184
185 return FALSE;
186 }
187
OnMouseMove(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,FX_UINT nFlags,const CPDF_Point & point)188 FX_BOOL CFFL_FormFiller::OnMouseMove(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)
189 {
190 if ((m_ptOldPos.x != point.x) || (m_ptOldPos.y != point.y))
191 {
192 m_ptOldPos = point;
193 }
194
195 if (CPWL_Wnd * pWnd = GetPDFWindow(pPageView, FALSE))
196 {
197 pWnd->OnMouseMove(WndtoPWL(pPageView, point),nFlags);
198 return TRUE;
199 }
200
201 return FALSE;
202 }
203
OnMouseWheel(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,FX_UINT nFlags,short zDelta,const CPDF_Point & point)204 FX_BOOL CFFL_FormFiller::OnMouseWheel(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, short zDelta, const CPDF_Point& point)
205 {
206 if (!IsValid()) return FALSE;
207
208 if (CPWL_Wnd * pWnd = GetPDFWindow(pPageView, TRUE))
209 {
210 return pWnd->OnMouseWheel(zDelta, WndtoPWL(pPageView, point),nFlags);
211 }
212
213 return FALSE;
214 }
215
OnRButtonDown(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,FX_UINT nFlags,const CPDF_Point & point)216 FX_BOOL CFFL_FormFiller::OnRButtonDown(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)
217 {
218 if (CPWL_Wnd * pWnd = GetPDFWindow(pPageView, TRUE))
219 {
220 pWnd->OnRButtonDown(WndtoPWL(pPageView, point),nFlags);
221 return TRUE;
222 }
223
224 return FALSE;
225 }
226
OnRButtonUp(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,FX_UINT nFlags,const CPDF_Point & point)227 FX_BOOL CFFL_FormFiller::OnRButtonUp(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)
228 {
229 if (CPWL_Wnd * pWnd = GetPDFWindow(pPageView, FALSE))
230 {
231 pWnd->OnRButtonUp(WndtoPWL(pPageView, point),nFlags);
232 return TRUE;
233 }
234
235 return FALSE;
236 }
237
OnRButtonDblClk(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,FX_UINT nFlags,const CPDF_Point & point)238 FX_BOOL CFFL_FormFiller::OnRButtonDblClk(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)
239 {
240 if (CPWL_Wnd * pWnd = GetPDFWindow(pPageView, FALSE))
241 {
242 pWnd->OnRButtonDblClk(WndtoPWL(pPageView, point),nFlags);
243 return TRUE;
244 }
245
246 return FALSE;
247 }
248
OnKeyDown(CPDFSDK_Annot * pAnnot,FX_UINT nKeyCode,FX_UINT nFlags)249 FX_BOOL CFFL_FormFiller::OnKeyDown(CPDFSDK_Annot* pAnnot, FX_UINT nKeyCode, FX_UINT nFlags)
250 {
251 if (IsValid())
252 {
253 CPDFSDK_PageView* pPageView = this->GetCurPageView();
254 ASSERT(pPageView != NULL);
255
256 if (CPWL_Wnd * pWnd = GetPDFWindow(pPageView, FALSE))
257 {
258 return pWnd->OnKeyDown(nKeyCode,nFlags);
259 }
260 }
261
262 return FALSE;
263 }
264
OnChar(CPDFSDK_Annot * pAnnot,FX_UINT nChar,FX_UINT nFlags)265 FX_BOOL CFFL_FormFiller::OnChar(CPDFSDK_Annot* pAnnot, FX_UINT nChar, FX_UINT nFlags)
266 {
267 if (IsValid())
268 {
269 CPDFSDK_PageView* pPageView = this->GetCurPageView();
270 ASSERT(pPageView != NULL);
271
272 if (CPWL_Wnd * pWnd = GetPDFWindow(pPageView, FALSE))
273 {
274 return pWnd->OnChar(nChar,nFlags);
275 }
276 }
277
278 return FALSE;
279 }
280
OnDeSelected(CPDFSDK_Annot * pAnnot)281 void CFFL_FormFiller::OnDeSelected(CPDFSDK_Annot* pAnnot)
282 {
283 ASSERT(FALSE);
284 }
285
OnSelected(CPDFSDK_Annot * pAnnot)286 void CFFL_FormFiller::OnSelected(CPDFSDK_Annot* pAnnot)
287 {
288 ASSERT(FALSE);
289 }
290
OnSetFocus(CPDFSDK_Annot * pAnnot,FX_UINT nFlag)291 FX_BOOL CFFL_FormFiller::OnSetFocus(CPDFSDK_Annot* pAnnot, FX_UINT nFlag)
292 {
293 CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;
294
295 CPDF_Page * pPage = pWidget->GetPDFPage();
296 CPDFSDK_Document * pDoc = m_pApp->GetCurrentDoc();
297 CPDFSDK_PageView* pPageView = pDoc->GetPageView(pPage);
298 ASSERT(pPageView != NULL);
299
300
301
302 CPWL_Wnd * pWnd = NULL;
303 if ( (pWnd = GetPDFWindow(pPageView, TRUE)))
304 {
305 pWnd->SetFocus();
306 }
307
308 m_bValid = TRUE;
309
310
311
312
313 m_bValid = TRUE;
314 FX_RECT rcRect = this->GetViewBBox(pPageView,pAnnot);
315 this->InvalidateRect(rcRect.left, rcRect.top, rcRect.right, rcRect.bottom);
316
317 return TRUE;
318 }
319
OnKillFocus(CPDFSDK_Annot * pAnnot,FX_UINT nFlag)320 FX_BOOL CFFL_FormFiller::OnKillFocus(CPDFSDK_Annot* pAnnot, FX_UINT nFlag)
321 {
322 if (IsValid())
323 {
324 CPDFSDK_PageView* pPageView = this->GetCurPageView();
325 ASSERT(pPageView != NULL);
326
327 CommitData(pPageView, nFlag);
328
329 if (CPWL_Wnd* pWnd = GetPDFWindow(pPageView, FALSE))
330 {
331 pWnd->KillFocus();
332 }
333
334 switch (m_pWidget->GetFieldType())
335 {
336 case FIELDTYPE_PUSHBUTTON:
337 case FIELDTYPE_CHECKBOX:
338 case FIELDTYPE_RADIOBUTTON:
339 EscapeFiller(pPageView, TRUE);
340 break;
341 default:
342 EscapeFiller(pPageView, FALSE);
343 break;
344 }
345 }
346
347 return TRUE;
348 }
349
IsValid() const350 FX_BOOL CFFL_FormFiller::IsValid() const
351 {
352 return m_bValid;
353 }
354
GetCreateParam()355 PWL_CREATEPARAM CFFL_FormFiller::GetCreateParam()
356 {
357 ASSERT(m_pApp != NULL);
358
359 PWL_CREATEPARAM cp;
360
361 cp.pParentWnd = NULL;
362 cp.pProvider = this;
363 cp.rcRectWnd = GetPDFWindowRect();
364
365 FX_DWORD dwCreateFlags = PWS_BORDER | PWS_BACKGROUND | PWS_VISIBLE;
366
367 ASSERT(m_pWidget != NULL);
368
369
370 FX_DWORD dwFieldFlag = m_pWidget->GetFieldFlags();
371
372 if (dwFieldFlag & FIELDFLAG_READONLY)
373 {
374 dwCreateFlags |= PWS_READONLY;
375 }
376
377 FX_COLORREF color;
378 if (m_pWidget->GetFillColor(color))
379 {
380 cp.sBackgroundColor = CPWL_Color(GetRed(color), GetGreen(color), GetBlue(color));
381 }
382
383 if (m_pWidget->GetBorderColor(color))
384 {
385 cp.sBorderColor = CPWL_Color(GetRed(color), GetGreen(color), GetBlue(color));
386 }
387
388 cp.sTextColor = CPWL_Color(COLORTYPE_GRAY,0);
389
390 if (m_pWidget->GetTextColor(color))
391 {
392 cp.sTextColor = CPWL_Color(GetRed(color), GetGreen(color), GetBlue(color));
393 }
394
395 cp.fFontSize = m_pWidget->GetFontSize();
396 cp.dwBorderWidth = m_pWidget->GetBorderWidth();
397
398 int nBorderStyle = m_pWidget->GetBorderStyle();
399
400 switch (nBorderStyle)
401 {
402 case BBS_SOLID:
403 cp.nBorderStyle = PBS_SOLID;
404 break;
405 case BBS_DASH:
406 cp.nBorderStyle = PBS_DASH;
407 cp.sDash = CPWL_Dash(3,3,0);
408 break;
409 case BBS_BEVELED:
410 cp.nBorderStyle = PBS_BEVELED;
411 cp.dwBorderWidth *= 2;
412 break;
413 case BBS_INSET:
414 cp.nBorderStyle = PBS_INSET;
415 cp.dwBorderWidth *= 2;
416 break;
417 case BBS_UNDERLINE:
418 cp.nBorderStyle = PBS_UNDERLINED;
419 break;
420 }
421
422 if (cp.fFontSize <= 0)
423 {
424 dwCreateFlags |= PWS_AUTOFONTSIZE;
425 }
426
427 cp.dwFlags = dwCreateFlags;
428 cp.pSystemHandler = m_pApp->GetSysHandler();
429 return cp;
430 }
431
GetPDFWindow(CPDFSDK_PageView * pPageView,FX_BOOL bNew)432 CPWL_Wnd* CFFL_FormFiller::GetPDFWindow(CPDFSDK_PageView* pPageView, FX_BOOL bNew)
433 {
434 ASSERT(pPageView != NULL);
435 ASSERT(m_pWidget != NULL);
436
437 CPWL_Wnd* pWnd = NULL;
438 m_Maps.Lookup(pPageView, pWnd);
439
440 if (bNew)
441 {
442 if (pWnd)
443 {
444 CFFL_PrivateData* pPrivateData = (CFFL_PrivateData*)pWnd->GetAttachedData();
445 ASSERT(pPrivateData != NULL);
446
447 if (pPrivateData->nWidgetAge != m_pWidget->GetAppearanceAge())
448 {
449 return this->ResetPDFWindow(pPageView, m_pWidget->GetValueAge() == pPrivateData->nValueAge);
450 }
451 }
452 else
453 {
454 PWL_CREATEPARAM cp = GetCreateParam();
455 cp.hAttachedWnd = (FX_HWND)m_pWidget;
456
457 CFFL_PrivateData* pPrivateData = new CFFL_PrivateData;
458 pPrivateData->pWidget = m_pWidget;
459 pPrivateData->pPageView = pPageView;
460 pPrivateData->nWidgetAge = m_pWidget->GetAppearanceAge();
461 pPrivateData->nValueAge = 0;
462
463 cp.pAttachedData = pPrivateData;
464
465 pWnd = NewPDFWindow(cp, pPageView);
466
467 if (pWnd)
468 {
469 m_Maps.SetAt(pPageView, pWnd);
470 }
471 }
472 }
473
474 return pWnd;
475 }
476
DestroyPDFWindow(CPDFSDK_PageView * pPageView)477 void CFFL_FormFiller::DestroyPDFWindow(CPDFSDK_PageView* pPageView)
478 {
479 CPWL_Wnd* pWnd = NULL;
480 m_Maps.Lookup(pPageView, pWnd);
481
482 if (pWnd)
483 {
484 CFFL_PrivateData* pData = (CFFL_PrivateData*)pWnd->GetAttachedData();
485 pData->pPageView = NULL;
486 pWnd->Destroy();
487 delete pWnd;
488 delete pData;
489 }
490
491 m_Maps.RemoveKey(pPageView);
492 }
493
GetWindowMatrix(void * pAttachedData)494 CPDF_Matrix CFFL_FormFiller::GetWindowMatrix(void* pAttachedData)
495 {
496 if (CFFL_PrivateData* pPrivateData = (CFFL_PrivateData*)pAttachedData)
497 {
498 if (pPrivateData->pPageView)
499 {
500 CPDF_Matrix mtPageView;
501 pPrivateData->pPageView->GetCurrentMatrix(mtPageView);
502 CPDF_Matrix mt = GetCurMatrix();
503 mt.Concat(mtPageView);
504
505 return mt;
506 }
507 }
508 return CPDF_Matrix(1,0,0,1,0,0);
509 }
510
GetCurMatrix()511 CPDF_Matrix CFFL_FormFiller::GetCurMatrix()
512 {
513 CPDF_Matrix mt;
514
515 ASSERT(m_pWidget != NULL);
516
517 CPDF_Rect rcDA ;
518 m_pWidget->GetPDFAnnot()->GetRect(rcDA);
519
520
521 switch (m_pWidget->GetRotate())
522 {
523 default:
524 case 0:
525 mt = CPDF_Matrix(1,0,0,1,0,0);
526 break;
527 case 90:
528 mt = CPDF_Matrix(0,1,-1,0,rcDA.right - rcDA.left,0);
529 break;
530 case 180:
531 mt = CPDF_Matrix(-1,0,0,-1,rcDA.right - rcDA.left,rcDA.top - rcDA.bottom);
532 break;
533 case 270:
534 mt = CPDF_Matrix(0,-1,1,0,0,rcDA.top - rcDA.bottom);
535 break;
536 }
537 mt.e += rcDA.left;
538 mt.f += rcDA.bottom;
539
540 return mt;
541 }
542
LoadPopupMenuString(int nIndex)543 CFX_WideString CFFL_FormFiller::LoadPopupMenuString(int nIndex)
544 {
545 ASSERT(m_pApp != NULL);
546
547 return L"";
548 }
549
GetPDFWindowRect() const550 CPDF_Rect CFFL_FormFiller::GetPDFWindowRect() const
551 {
552 ASSERT(m_pWidget != NULL);
553
554 CPDF_Rect rectAnnot;
555 m_pWidget->GetPDFAnnot()->GetRect(rectAnnot);
556
557 FX_FLOAT fWidth = rectAnnot.right - rectAnnot.left;
558 FX_FLOAT fHeight = rectAnnot.top - rectAnnot.bottom;
559
560
561 if ((m_pWidget->GetRotate() / 90) & 0x01)
562 return CPDF_Rect(0,0,fHeight,fWidth);
563 else
564 return CPDF_Rect(0,0,fWidth,fHeight);
565 }
566
GetCurPageView()567 CPDFSDK_PageView* CFFL_FormFiller::GetCurPageView()
568 {
569
570 CPDF_Page* pPage = m_pAnnot->GetPDFPage();
571 CPDFSDK_Document* pSDKDoc = m_pApp->GetCurrentDoc();
572 if(pSDKDoc)
573 {
574 return pSDKDoc->GetPageView(pPage);
575 }
576 return NULL;
577 }
578
GetFocusBox(CPDFSDK_PageView * pPageView)579 CPDF_Rect CFFL_FormFiller::GetFocusBox(CPDFSDK_PageView* pPageView)
580 {
581 if (CPWL_Wnd * pWnd = GetPDFWindow(pPageView, FALSE))
582 {
583 CPDF_Rect rcFocus = FFLtoWnd(pPageView, PWLtoFFL(pWnd->GetFocusRect()));
584 ASSERT(pPageView);
585 CPDF_Rect rcPage = pPageView->GetPDFPage()->GetPageBBox();
586 if(rcPage.Contains(rcFocus))
587 return rcFocus;
588 else
589 return CPDF_Rect(0,0,0,0);
590 }
591 return CPDF_Rect(0,0,0,0);
592 }
593
FFLtoPWL(const CPDF_Rect & rect)594 CPDF_Rect CFFL_FormFiller::FFLtoPWL(const CPDF_Rect& rect)
595 {
596 CPDF_Matrix mt;
597 mt.SetReverse(GetCurMatrix());
598
599 CPDF_Rect temp = rect;
600 mt.TransformRect(temp);
601
602 return temp;
603 }
604
PWLtoFFL(const CPDF_Rect & rect)605 CPDF_Rect CFFL_FormFiller::PWLtoFFL(const CPDF_Rect& rect)
606 {
607 CPDF_Matrix mt = GetCurMatrix();
608
609 CPDF_Rect temp = rect;
610 mt.TransformRect(temp);
611
612 return temp;
613 }
614
FFLtoPWL(const CPDF_Point & point)615 CPDF_Point CFFL_FormFiller::FFLtoPWL(const CPDF_Point& point)
616 {
617 CPDF_Matrix mt;
618 mt.SetReverse(GetCurMatrix());
619
620 CPDF_Point pt = point;
621 mt.Transform(pt.x,pt.y);
622
623 return pt;
624 }
625
PWLtoFFL(const CPDF_Point & point)626 CPDF_Point CFFL_FormFiller::PWLtoFFL(const CPDF_Point & point)
627 {
628 CPDF_Matrix mt = GetCurMatrix();
629
630 CPDF_Point pt = point;
631 mt.Transform(pt.x,pt.y);
632
633 return pt;
634 }
635
WndtoPWL(CPDFSDK_PageView * pPageView,const CPDF_Point & pt)636 CPDF_Point CFFL_FormFiller::WndtoPWL(CPDFSDK_PageView* pPageView, const CPDF_Point& pt)
637 {
638 // ASSERT(pPageView != NULL);
639 //
640 // CPDF_Point point(0.0f, 0.0f);
641 // pPageView->WindowToDoc(pt.x, pt.y, point.x, point.y);
642 //
643 return FFLtoPWL(pt);
644 // return CPDF_Point(0, 0);
645 }
646
FFLtoWnd(CPDFSDK_PageView * pPageView,const CPDF_Rect & rect)647 CPDF_Rect CFFL_FormFiller::FFLtoWnd(CPDFSDK_PageView* pPageView, const CPDF_Rect & rect)
648 {
649 // FX_RECT rcRet(0,0,0,0);
650 //
651 // ASSERT(pPageView != NULL);
652 // pPageView->DocToWindow(rect, rcRet);
653 //
654 return rect;
655
656 }
657
FFL_FreeData(void * pData)658 void CFFL_FormFiller::FFL_FreeData(void* pData)
659 {
660 ASSERT(pData != NULL);
661
662 delete (CFFL_PrivateData*)pData;
663 }
664
CommitData(CPDFSDK_PageView * pPageView,FX_UINT nFlag)665 FX_BOOL CFFL_FormFiller::CommitData(CPDFSDK_PageView* pPageView, FX_UINT nFlag)
666 {
667 if (IsDataChanged(pPageView))
668 {
669 //CFFL_IFormFiller* pIFormFiller = CFFL_Module::GetFormFiller(m_pApp);
670 CFFL_IFormFiller* pIFormFiller = m_pApp->GetIFormFiller();//NULL;
671 ASSERT(pIFormFiller != NULL);
672
673 FX_BOOL bRC = TRUE;
674 FX_BOOL bExit = FALSE;
675
676 pIFormFiller->OnKeyStrokeCommit(m_pWidget, pPageView, bRC, bExit, nFlag);
677 if (bExit) return TRUE;
678 if (!bRC)
679 {
680 this->ResetPDFWindow(pPageView, FALSE);
681 return TRUE;
682 }
683
684 pIFormFiller->OnValidate(m_pWidget, pPageView, bRC, bExit, nFlag);
685 if (bExit) return TRUE;
686 if (!bRC)
687 {
688 this->ResetPDFWindow(pPageView, FALSE);
689 return TRUE;
690 }
691
692 SaveData(pPageView);
693
694 pIFormFiller->OnCalculate(m_pWidget, pPageView, bExit,nFlag);
695 if (bExit) return TRUE;
696
697 pIFormFiller->OnFormat(m_pWidget, pPageView, bExit,nFlag);
698 }
699
700 return TRUE;
701 }
702
IsDataChanged(CPDFSDK_PageView * pPageView)703 FX_BOOL CFFL_FormFiller::IsDataChanged(CPDFSDK_PageView* pPageView)
704 {
705 return FALSE;
706 }
707
SaveData(CPDFSDK_PageView * pPageView)708 void CFFL_FormFiller::SaveData(CPDFSDK_PageView* pPageView)
709 {
710 }
711
GetKeyStrokeData(CPDFSDK_PageView * pPageView,FFL_KeyStrokeData & data)712 void CFFL_FormFiller::GetKeyStrokeData(CPDFSDK_PageView* pPageView, FFL_KeyStrokeData& data)
713 {
714 }
715
SetChangeMark()716 void CFFL_FormFiller::SetChangeMark()
717 {
718 m_pApp->FFI_OnChange();
719 }
720
GetActionData(CPDFSDK_PageView * pPageView,CPDF_AAction::AActionType type,PDFSDK_FieldAction & fa)721 void CFFL_FormFiller::GetActionData(CPDFSDK_PageView* pPageView, CPDF_AAction::AActionType type,
722 PDFSDK_FieldAction& fa)
723 {
724 fa.sValue = m_pWidget->GetValue();
725 }
726
SetActionData(CPDFSDK_PageView * pPageView,CPDF_AAction::AActionType type,const PDFSDK_FieldAction & fa)727 void CFFL_FormFiller::SetActionData(CPDFSDK_PageView* pPageView, CPDF_AAction::AActionType type,
728 const PDFSDK_FieldAction& fa)
729 {
730 }
731
IsActionDataChanged(CPDF_AAction::AActionType type,const PDFSDK_FieldAction & faOld,const PDFSDK_FieldAction & faNew)732 FX_BOOL CFFL_FormFiller::IsActionDataChanged(CPDF_AAction::AActionType type, const PDFSDK_FieldAction& faOld,
733 const PDFSDK_FieldAction& faNew)
734 {
735 return FALSE;
736 }
737
SaveState(CPDFSDK_PageView * pPageView)738 void CFFL_FormFiller::SaveState(CPDFSDK_PageView* pPageView)
739 {
740 }
741
RestoreState(CPDFSDK_PageView * pPageView)742 void CFFL_FormFiller::RestoreState(CPDFSDK_PageView* pPageView)
743 {
744 }
745
ResetPDFWindow(CPDFSDK_PageView * pPageView,FX_BOOL bRestoreValue)746 CPWL_Wnd* CFFL_FormFiller::ResetPDFWindow(CPDFSDK_PageView* pPageView, FX_BOOL bRestoreValue)
747 {
748 return GetPDFWindow(pPageView, FALSE);
749 }
750
TimerProc()751 void CFFL_FormFiller::TimerProc()
752 {
753
754 }
755
GetSystemHandler() const756 IFX_SystemHandler* CFFL_FormFiller::GetSystemHandler() const
757 {
758 return m_pApp->GetSysHandler();
759 // return NULL;
760 }
761
OnKeyStroke(FX_BOOL bKeyDown)762 void CFFL_FormFiller::OnKeyStroke(FX_BOOL bKeyDown)
763 {
764 }
765
EscapeFiller(CPDFSDK_PageView * pPageView,FX_BOOL bDestroyPDFWindow)766 void CFFL_FormFiller::EscapeFiller(CPDFSDK_PageView* pPageView, FX_BOOL bDestroyPDFWindow)
767 {
768 m_bValid = FALSE;
769
770 FX_RECT rcRect = this->GetViewBBox(pPageView, m_pWidget);
771 this->InvalidateRect(rcRect.left, rcRect.top, rcRect.right, rcRect.bottom);
772
773 if(bDestroyPDFWindow)
774 DestroyPDFWindow(pPageView);
775 }
776
CanCopy(CPDFSDK_Document * pDocument)777 FX_BOOL CFFL_FormFiller::CanCopy(CPDFSDK_Document* pDocument)
778 {
779 return FALSE;
780 }
781
CanCut(CPDFSDK_Document * pDocument)782 FX_BOOL CFFL_FormFiller::CanCut(CPDFSDK_Document* pDocument)
783 {
784 return FALSE;
785 }
786
CanPaste(CPDFSDK_Document * pDocument)787 FX_BOOL CFFL_FormFiller::CanPaste(CPDFSDK_Document* pDocument)
788 {
789 return FALSE;
790 }
791
DoCopy(CPDFSDK_Document * pDocument)792 void CFFL_FormFiller::DoCopy(CPDFSDK_Document* pDocument)
793 {
794 }
795
DoCut(CPDFSDK_Document * pDocument)796 void CFFL_FormFiller::DoCut(CPDFSDK_Document* pDocument)
797 {
798 }
799
DoPaste(CPDFSDK_Document * pDocument)800 void CFFL_FormFiller::DoPaste(CPDFSDK_Document* pDocument)
801 {
802 }
803
InvalidateRect(double left,double top,double right,double bottom)804 void CFFL_FormFiller::InvalidateRect(double left, double top, double right, double bottom)
805 {
806 CPDF_Page * pPage = m_pWidget->GetPDFPage();
807 m_pApp->FFI_Invalidate(pPage, left, top, right, bottom);
808 }
809
810 /* ------------------------- CFFL_Button ------------------------- */
811
CFFL_Button(CPDFDoc_Environment * pApp,CPDFSDK_Annot * pWidget)812 CFFL_Button::CFFL_Button(CPDFDoc_Environment* pApp, CPDFSDK_Annot* pWidget) :
813 CFFL_FormFiller(pApp, pWidget),
814 m_bMouseIn(FALSE),
815 m_bMouseDown(FALSE)
816 {
817 }
818
~CFFL_Button()819 CFFL_Button::~CFFL_Button()
820 {
821 }
822
OnMouseEnter(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot)823 void CFFL_Button::OnMouseEnter(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot)
824 {
825 m_bMouseIn = TRUE;
826 FX_RECT rect = this->GetViewBBox(pPageView,pAnnot);
827 this->InvalidateRect(rect.left, rect.top, rect.right, rect.bottom);
828 // ::InvalidateRect(pPageView->GetPageViewWnd(), &this->GetViewBBox(pPageView, pAnnot), TRUE);
829 }
830
OnMouseExit(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot)831 void CFFL_Button::OnMouseExit(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot)
832 {
833 m_bMouseIn = FALSE;
834
835 FX_RECT rect = this->GetViewBBox(pPageView,pAnnot);
836 this->InvalidateRect(rect.left, rect.top, rect.right, rect.bottom);
837 // ::InvalidateRect(pPageView->GetPageViewWnd(), &this->GetViewBBox(pPageView, pAnnot), TRUE);
838 EndTimer();
839 ASSERT(m_pWidget != NULL);
840 // m_pWidget->HideHint();
841 }
842
OnLButtonDown(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,FX_UINT nFlags,const CPDF_Point & point)843 FX_BOOL CFFL_Button::OnLButtonDown(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)
844 {
845 CPDF_Rect rcAnnot = pAnnot->GetRect();
846 if(!rcAnnot.Contains(point.x, point.y))
847 return FALSE;
848
849 m_bMouseDown = TRUE;
850 m_bValid = TRUE;
851 FX_RECT rect = this->GetViewBBox(pPageView, pAnnot);
852 this->InvalidateRect(rect.left, rect.top, rect.right, rect.bottom);
853 // ::InvalidateRect(pPageView->GetPageViewWnd(), &this->GetViewBBox(pPageView, pAnnot), TRUE);
854 return TRUE;
855 }
856
OnLButtonUp(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,FX_UINT nFlags,const CPDF_Point & point)857 FX_BOOL CFFL_Button::OnLButtonUp(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)
858 {
859 CPDF_Rect rcAnnot = pAnnot->GetRect();
860 if(!rcAnnot.Contains(point.x, point.y))
861 return FALSE;
862
863 m_bMouseDown = FALSE;
864 m_pWidget->GetPDFPage();
865
866
867 FX_RECT rect = this->GetViewBBox(pPageView, pAnnot);
868 this->InvalidateRect(rect.left, rect.top, rect.right, rect.bottom);
869 // ::InvalidateRect(pPageView->GetPageViewWnd(), &this->GetViewBBox(pPageView, pAnnot), TRUE);
870 return TRUE;
871 }
872
OnMouseMove(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,FX_UINT nFlags,const CPDF_Point & point)873 FX_BOOL CFFL_Button::OnMouseMove(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)
874 {
875 ASSERT(m_pApp != NULL);
876
877 return TRUE;
878 }
879
OnDraw(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,CFX_RenderDevice * pDevice,CPDF_Matrix * pUser2Device,FX_DWORD dwFlags)880 void CFFL_Button::OnDraw(CPDFSDK_PageView *pPageView, /*HDC hDC,*/ CPDFSDK_Annot* pAnnot,
881 CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,
882 /*const CRect& rcWindow,*/ FX_DWORD dwFlags)
883 {
884 ASSERT(pPageView != NULL);
885 ASSERT(pAnnot != NULL);
886
887 CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;
888
889 CPDF_FormControl* pCtrl = pWidget->GetFormControl();
890 ASSERT(pCtrl != NULL);
891
892 CPDF_FormControl::HighlightingMode eHM = pCtrl->GetHighlightingMode();
893
894 if (eHM == CPDF_FormControl::Push)
895 {
896 if (m_bMouseDown)
897 {
898 if (pWidget->IsWidgetAppearanceValid(CPDF_Annot::Down))
899 pWidget->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Down, NULL);
900 else
901 pWidget->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Normal, NULL);
902 }
903 else if (m_bMouseIn)
904 {
905 if (pWidget->IsWidgetAppearanceValid(CPDF_Annot::Rollover))
906 pWidget->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Rollover, NULL);
907 else
908 pWidget->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Normal, NULL);
909 }
910 else
911 {
912 pWidget->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Normal, NULL);
913 }
914 }
915 else
916 pWidget->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Normal, NULL);
917 }
918
919
OnDrawDeactive(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,CFX_RenderDevice * pDevice,CPDF_Matrix * pUser2Device,FX_DWORD dwFlags)920 void CFFL_Button::OnDrawDeactive(CPDFSDK_PageView *pPageView, /*HDC hDC,*/ CPDFSDK_Annot* pAnnot,
921 CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,
922 /*const CRect& rcWindow, */FX_DWORD dwFlags)
923 {
924 OnDraw(pPageView, pAnnot, pDevice, pUser2Device, dwFlags);
925 }
926