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
9 #include "core/fpdfdoc/cpdf_formcontrol.h"
10
CFFL_Button(CPDFSDK_FormFillEnvironment * pFormFillEnv,CPDFSDK_Widget * pWidget)11 CFFL_Button::CFFL_Button(CPDFSDK_FormFillEnvironment* pFormFillEnv,
12 CPDFSDK_Widget* pWidget)
13 : CFFL_FormFiller(pFormFillEnv, pWidget),
14 m_bMouseIn(false),
15 m_bMouseDown(false) {}
16
~CFFL_Button()17 CFFL_Button::~CFFL_Button() {}
18
OnMouseEnter(CPDFSDK_PageView * pPageView)19 void CFFL_Button::OnMouseEnter(CPDFSDK_PageView* pPageView) {
20 m_bMouseIn = true;
21 InvalidateRect(GetViewBBox(pPageView));
22 }
23
OnMouseExit(CPDFSDK_PageView * pPageView)24 void CFFL_Button::OnMouseExit(CPDFSDK_PageView* pPageView) {
25 m_bMouseIn = false;
26 InvalidateRect(GetViewBBox(pPageView));
27 m_pTimer.reset();
28 ASSERT(m_pWidget);
29 }
30
OnLButtonDown(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,uint32_t nFlags,const CFX_PointF & point)31 bool CFFL_Button::OnLButtonDown(CPDFSDK_PageView* pPageView,
32 CPDFSDK_Annot* pAnnot,
33 uint32_t nFlags,
34 const CFX_PointF& point) {
35 if (!pAnnot->GetRect().Contains(point))
36 return false;
37
38 m_bMouseDown = true;
39 m_bValid = true;
40 InvalidateRect(GetViewBBox(pPageView));
41 return true;
42 }
43
OnLButtonUp(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,uint32_t nFlags,const CFX_PointF & point)44 bool CFFL_Button::OnLButtonUp(CPDFSDK_PageView* pPageView,
45 CPDFSDK_Annot* pAnnot,
46 uint32_t nFlags,
47 const CFX_PointF& point) {
48 if (!pAnnot->GetRect().Contains(point))
49 return false;
50
51 m_bMouseDown = false;
52 InvalidateRect(GetViewBBox(pPageView));
53 return true;
54 }
55
OnMouseMove(CPDFSDK_PageView * pPageView,uint32_t nFlags,const CFX_PointF & point)56 bool CFFL_Button::OnMouseMove(CPDFSDK_PageView* pPageView,
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 = ToCPDFSDKWidget(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