1 // Copyright 2017 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 "fpdfsdk/formfiller/cffl_button.h"
8
CFFL_Button(CPDFSDK_FormFillEnvironment * pApp,CPDFSDK_Widget * pWidget)9 CFFL_Button::CFFL_Button(CPDFSDK_FormFillEnvironment* pApp,
10 CPDFSDK_Widget* pWidget)
11 : CFFL_FormFiller(pApp, pWidget), m_bMouseIn(false), m_bMouseDown(false) {}
12
~CFFL_Button()13 CFFL_Button::~CFFL_Button() {}
14
OnMouseEnter(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot)15 void CFFL_Button::OnMouseEnter(CPDFSDK_PageView* pPageView,
16 CPDFSDK_Annot* pAnnot) {
17 m_bMouseIn = true;
18 InvalidateRect(GetViewBBox(pPageView, pAnnot));
19 }
20
OnMouseExit(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot)21 void CFFL_Button::OnMouseExit(CPDFSDK_PageView* pPageView,
22 CPDFSDK_Annot* pAnnot) {
23 m_bMouseIn = false;
24 InvalidateRect(GetViewBBox(pPageView, pAnnot));
25 EndTimer();
26 ASSERT(m_pWidget);
27 }
28
OnLButtonDown(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,uint32_t nFlags,const CFX_PointF & point)29 bool CFFL_Button::OnLButtonDown(CPDFSDK_PageView* pPageView,
30 CPDFSDK_Annot* pAnnot,
31 uint32_t nFlags,
32 const CFX_PointF& point) {
33 if (!pAnnot->GetRect().Contains(point))
34 return false;
35
36 m_bMouseDown = true;
37 m_bValid = true;
38 InvalidateRect(GetViewBBox(pPageView, pAnnot));
39 return true;
40 }
41
OnLButtonUp(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,uint32_t nFlags,const CFX_PointF & point)42 bool CFFL_Button::OnLButtonUp(CPDFSDK_PageView* pPageView,
43 CPDFSDK_Annot* pAnnot,
44 uint32_t nFlags,
45 const CFX_PointF& point) {
46 if (!pAnnot->GetRect().Contains(point))
47 return false;
48
49 m_bMouseDown = false;
50 m_pWidget->GetPDFPage();
51 InvalidateRect(GetViewBBox(pPageView, pAnnot));
52 return true;
53 }
54
OnMouseMove(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,uint32_t nFlags,const CFX_PointF & point)55 bool CFFL_Button::OnMouseMove(CPDFSDK_PageView* pPageView,
56 CPDFSDK_Annot* pAnnot,
57 uint32_t nFlags,
58 const CFX_PointF& point) {
59 return true;
60 }
61
OnDraw(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,CFX_RenderDevice * pDevice,const CFX_Matrix & mtUser2Device)62 void CFFL_Button::OnDraw(CPDFSDK_PageView* pPageView,
63 CPDFSDK_Annot* pAnnot,
64 CFX_RenderDevice* pDevice,
65 const CFX_Matrix& mtUser2Device) {
66 ASSERT(pPageView);
67 CPDFSDK_Widget* pWidget = static_cast<CPDFSDK_Widget*>(pAnnot);
68 CPDF_FormControl* pCtrl = pWidget->GetFormControl();
69 if (pCtrl->GetHighlightingMode() != CPDF_FormControl::Push) {
70 pWidget->DrawAppearance(pDevice, mtUser2Device, CPDF_Annot::Normal,
71 nullptr);
72 return;
73 }
74 if (m_bMouseDown) {
75 if (pWidget->IsWidgetAppearanceValid(CPDF_Annot::Down)) {
76 pWidget->DrawAppearance(pDevice, mtUser2Device, CPDF_Annot::Down,
77 nullptr);
78 } else {
79 pWidget->DrawAppearance(pDevice, mtUser2Device, CPDF_Annot::Normal,
80 nullptr);
81 }
82 return;
83 }
84 if (m_bMouseIn) {
85 if (pWidget->IsWidgetAppearanceValid(CPDF_Annot::Rollover)) {
86 pWidget->DrawAppearance(pDevice, mtUser2Device, CPDF_Annot::Rollover,
87 nullptr);
88 } else {
89 pWidget->DrawAppearance(pDevice, mtUser2Device, CPDF_Annot::Normal,
90 nullptr);
91 }
92 return;
93 }
94
95 pWidget->DrawAppearance(pDevice, mtUser2Device, CPDF_Annot::Normal, nullptr);
96 }
97
OnDrawDeactive(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,CFX_RenderDevice * pDevice,const CFX_Matrix & mtUser2Device)98 void CFFL_Button::OnDrawDeactive(CPDFSDK_PageView* pPageView,
99 CPDFSDK_Annot* pAnnot,
100 CFX_RenderDevice* pDevice,
101 const CFX_Matrix& mtUser2Device) {
102 OnDraw(pPageView, pAnnot, pDevice, mtUser2Device);
103 }
104