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