Tidy up CPDFDOC_Environment.
[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 FX_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 FX_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 FX_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 FX_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 FX_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 FX_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 FX_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 FX_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 FX_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 FX_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 FX_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 FX_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, FX_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 FX_BOOL CFFL_FormFiller::CommitData(CPDFSDK_PageView* pPageView, FX_UINT nFlag)
565 {
566     if (IsDataChanged(pPageView))
567     {
568         FX_BOOL bRC = TRUE;
569         FX_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 FX_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::GetKeyStrokeData(CPDFSDK_PageView* pPageView, FFL_KeyStrokeData& data)
609 {
610 }
611
612 void CFFL_FormFiller::SetChangeMark()
613 {
614     m_pApp->FFI_OnChange();
615 }
616
617 void CFFL_FormFiller::GetActionData(CPDFSDK_PageView* pPageView, CPDF_AAction::AActionType type,
618                             PDFSDK_FieldAction& fa)
619 {
620     fa.sValue = m_pWidget->GetValue();
621 }
622
623 void CFFL_FormFiller::SetActionData(CPDFSDK_PageView* pPageView, CPDF_AAction::AActionType type,
624                                     const PDFSDK_FieldAction& fa)
625 {
626 }
627
628 FX_BOOL CFFL_FormFiller::IsActionDataChanged(CPDF_AAction::AActionType type, const PDFSDK_FieldAction& faOld,
629                                     const PDFSDK_FieldAction& faNew)
630 {
631     return FALSE;
632 }
633
634 void CFFL_FormFiller::SaveState(CPDFSDK_PageView* pPageView)
635 {
636 }
637
638 void CFFL_FormFiller::RestoreState(CPDFSDK_PageView* pPageView)
639 {
640 }
641
642 CPWL_Wnd*  CFFL_FormFiller::ResetPDFWindow(CPDFSDK_PageView* pPageView, FX_BOOL bRestoreValue)
643 {
644     return GetPDFWindow(pPageView, FALSE);
645 }
646
647 void CFFL_FormFiller::TimerProc()
648 {
649
650 }
651
652 IFX_SystemHandler* CFFL_FormFiller::GetSystemHandler() const
653 {
654     return m_pApp->GetSysHandler();
655 }
656
657 void CFFL_FormFiller::OnKeyStroke(FX_BOOL bKeyDown)
658 {
659 }
660
661 void CFFL_FormFiller::EscapeFiller(CPDFSDK_PageView* pPageView, FX_BOOL bDestroyPDFWindow)
662 {
663     m_bValid = FALSE;
664
665     FX_RECT rcRect = GetViewBBox(pPageView, m_pWidget);
666     InvalidateRect(rcRect.left, rcRect.top, rcRect.right, rcRect.bottom);
667
668     if(bDestroyPDFWindow)
669         DestroyPDFWindow(pPageView);
670 }
671
672 FX_BOOL CFFL_FormFiller::CanCopy(CPDFSDK_Document* pDocument)
673 {
674     return FALSE;
675 }
676
677 FX_BOOL CFFL_FormFiller::CanCut(CPDFSDK_Document* pDocument)
678 {
679     return FALSE;
680 }
681
682 FX_BOOL CFFL_FormFiller::CanPaste(CPDFSDK_Document* pDocument)
683 {
684     return FALSE;
685 }
686
687 void CFFL_FormFiller::DoCopy(CPDFSDK_Document* pDocument)
688 {
689 }
690
691 void CFFL_FormFiller::DoCut(CPDFSDK_Document* pDocument)
692 {
693 }
694
695 void CFFL_FormFiller::DoPaste(CPDFSDK_Document* pDocument)
696 {
697 }
698
699 void CFFL_FormFiller::InvalidateRect(double left, double top, double right, double bottom)
700 {
701     CPDF_Page * pPage = m_pWidget->GetPDFPage();
702     m_pApp->FFI_Invalidate(pPage, left, top, right, bottom);
703 }
704
705 /* ------------------------- CFFL_Button ------------------------- */
706
707 CFFL_Button::CFFL_Button(CPDFDoc_Environment* pApp, CPDFSDK_Annot* pWidget) :
708     CFFL_FormFiller(pApp, pWidget),
709     m_bMouseIn(FALSE),
710     m_bMouseDown(FALSE)
711 {
712 }
713
714 CFFL_Button::~CFFL_Button()
715 {
716 }
717
718 void CFFL_Button::OnMouseEnter(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot)
719 {
720     m_bMouseIn = TRUE;
721     FX_RECT rect = GetViewBBox(pPageView,pAnnot);
722     InvalidateRect(rect.left, rect.top, rect.right, rect.bottom);
723 }
724
725 void CFFL_Button::OnMouseExit(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot)
726 {
727     m_bMouseIn = FALSE;
728
729     FX_RECT rect = GetViewBBox(pPageView,pAnnot);
730     InvalidateRect(rect.left, rect.top, rect.right, rect.bottom);
731     EndTimer();
732     ASSERT(m_pWidget != NULL);
733 }
734
735 FX_BOOL CFFL_Button::OnLButtonDown(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)
736 {
737     CPDF_Rect rcAnnot = pAnnot->GetRect();
738     if(!rcAnnot.Contains(point.x, point.y))
739         return FALSE;
740
741     m_bMouseDown = TRUE;
742     m_bValid = TRUE;
743     FX_RECT rect = GetViewBBox(pPageView, pAnnot);
744     InvalidateRect(rect.left, rect.top, rect.right, rect.bottom);
745     return TRUE;
746 }
747
748 FX_BOOL CFFL_Button::OnLButtonUp(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)
749 {
750     CPDF_Rect rcAnnot = pAnnot->GetRect();
751     if(!rcAnnot.Contains(point.x, point.y))
752         return FALSE;
753
754     m_bMouseDown = FALSE;
755     m_pWidget->GetPDFPage();
756
757
758     FX_RECT rect = GetViewBBox(pPageView, pAnnot);
759     InvalidateRect(rect.left, rect.top, rect.right, rect.bottom);
760     return TRUE;
761 }
762
763 FX_BOOL CFFL_Button::OnMouseMove(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)
764 {
765     ASSERT(m_pApp != NULL);
766
767     return TRUE;
768 }
769
770 void CFFL_Button::OnDraw(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot,
771                          CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,
772                          FX_DWORD dwFlags)
773 {
774     ASSERT(pPageView != NULL);
775     CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;
776     CPDF_FormControl* pCtrl = pWidget->GetFormControl();
777     CPDF_FormControl::HighlightingMode eHM = pCtrl->GetHighlightingMode();
778
779     if (eHM == CPDF_FormControl::Push)
780     {
781         if (m_bMouseDown)
782         {
783             if (pWidget->IsWidgetAppearanceValid(CPDF_Annot::Down))
784                 pWidget->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Down, NULL);
785             else
786                 pWidget->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Normal, NULL);
787         }
788         else if (m_bMouseIn)
789         {
790             if (pWidget->IsWidgetAppearanceValid(CPDF_Annot::Rollover))
791                 pWidget->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Rollover, NULL);
792             else
793                 pWidget->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Normal, NULL);
794         }
795         else
796         {
797             pWidget->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Normal, NULL);
798         }
799     }
800     else
801         pWidget->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Normal, NULL);
802 }
803
804
805 void CFFL_Button::OnDrawDeactive(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot,
806                                  CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,
807                                  FX_DWORD dwFlags)
808 {
809     OnDraw(pPageView, pAnnot, pDevice, pUser2Device, dwFlags);
810 }