• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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