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