xref: /aosp_15_r20/external/pdfium/xfa/fwl/cfwl_scrollbar.h (revision 3ac0a46f773bac49fa9476ec2b1cf3f8da5ec3a4)
1*3ac0a46fSAndroid Build Coastguard Worker // Copyright 2014 The PDFium Authors
2*3ac0a46fSAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*3ac0a46fSAndroid Build Coastguard Worker // found in the LICENSE file.
4*3ac0a46fSAndroid Build Coastguard Worker 
5*3ac0a46fSAndroid Build Coastguard Worker // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6*3ac0a46fSAndroid Build Coastguard Worker 
7*3ac0a46fSAndroid Build Coastguard Worker #ifndef XFA_FWL_CFWL_SCROLLBAR_H_
8*3ac0a46fSAndroid Build Coastguard Worker #define XFA_FWL_CFWL_SCROLLBAR_H_
9*3ac0a46fSAndroid Build Coastguard Worker 
10*3ac0a46fSAndroid Build Coastguard Worker #include <stdint.h>
11*3ac0a46fSAndroid Build Coastguard Worker 
12*3ac0a46fSAndroid Build Coastguard Worker #include <memory>
13*3ac0a46fSAndroid Build Coastguard Worker 
14*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxcrt/cfx_timer.h"
15*3ac0a46fSAndroid Build Coastguard Worker #include "third_party/base/check.h"
16*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fwl/cfwl_eventscroll.h"
17*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fwl/cfwl_themepart.h"
18*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fwl/cfwl_widget.h"
19*3ac0a46fSAndroid Build Coastguard Worker 
20*3ac0a46fSAndroid Build Coastguard Worker #define FWL_STYLEEXT_SCB_Horz (0L << 0)
21*3ac0a46fSAndroid Build Coastguard Worker #define FWL_STYLEEXT_SCB_Vert (1L << 0)
22*3ac0a46fSAndroid Build Coastguard Worker 
23*3ac0a46fSAndroid Build Coastguard Worker class CFWL_ScrollBar final : public CFWL_Widget,
24*3ac0a46fSAndroid Build Coastguard Worker                              public CFX_Timer::CallbackIface {
25*3ac0a46fSAndroid Build Coastguard Worker  public:
26*3ac0a46fSAndroid Build Coastguard Worker   CONSTRUCT_VIA_MAKE_GARBAGE_COLLECTED;
27*3ac0a46fSAndroid Build Coastguard Worker   ~CFWL_ScrollBar() override;
28*3ac0a46fSAndroid Build Coastguard Worker 
29*3ac0a46fSAndroid Build Coastguard Worker   // CFWL_Widget:
30*3ac0a46fSAndroid Build Coastguard Worker   FWL_Type GetClassID() const override;
31*3ac0a46fSAndroid Build Coastguard Worker   void Update() override;
32*3ac0a46fSAndroid Build Coastguard Worker   void DrawWidget(CFGAS_GEGraphics* pGraphics,
33*3ac0a46fSAndroid Build Coastguard Worker                   const CFX_Matrix& matrix) override;
34*3ac0a46fSAndroid Build Coastguard Worker   void OnProcessMessage(CFWL_Message* pMessage) override;
35*3ac0a46fSAndroid Build Coastguard Worker   void OnDrawWidget(CFGAS_GEGraphics* pGraphics,
36*3ac0a46fSAndroid Build Coastguard Worker                     const CFX_Matrix& matrix) override;
37*3ac0a46fSAndroid Build Coastguard Worker 
38*3ac0a46fSAndroid Build Coastguard Worker   // CFX_Timer::CallbackIface:
39*3ac0a46fSAndroid Build Coastguard Worker   void OnTimerFired() override;
40*3ac0a46fSAndroid Build Coastguard Worker 
GetRange(float * fMin,float * fMax)41*3ac0a46fSAndroid Build Coastguard Worker   void GetRange(float* fMin, float* fMax) const {
42*3ac0a46fSAndroid Build Coastguard Worker     *fMin = m_fRangeMin;
43*3ac0a46fSAndroid Build Coastguard Worker     *fMax = m_fRangeMax;
44*3ac0a46fSAndroid Build Coastguard Worker   }
SetRange(float fMin,float fMax)45*3ac0a46fSAndroid Build Coastguard Worker   void SetRange(float fMin, float fMax) {
46*3ac0a46fSAndroid Build Coastguard Worker     m_fRangeMin = fMin;
47*3ac0a46fSAndroid Build Coastguard Worker     m_fRangeMax = fMax;
48*3ac0a46fSAndroid Build Coastguard Worker   }
GetPageSize()49*3ac0a46fSAndroid Build Coastguard Worker   float GetPageSize() const { return m_fPageSize; }
SetPageSize(float fPageSize)50*3ac0a46fSAndroid Build Coastguard Worker   void SetPageSize(float fPageSize) { m_fPageSize = fPageSize; }
GetStepSize()51*3ac0a46fSAndroid Build Coastguard Worker   float GetStepSize() const { return m_fStepSize; }
SetStepSize(float fStepSize)52*3ac0a46fSAndroid Build Coastguard Worker   void SetStepSize(float fStepSize) { m_fStepSize = fStepSize; }
GetPos()53*3ac0a46fSAndroid Build Coastguard Worker   float GetPos() const { return m_fPos; }
SetPos(float fPos)54*3ac0a46fSAndroid Build Coastguard Worker   void SetPos(float fPos) { m_fPos = fPos; }
55*3ac0a46fSAndroid Build Coastguard Worker   void SetTrackPos(float fTrackPos);
56*3ac0a46fSAndroid Build Coastguard Worker 
57*3ac0a46fSAndroid Build Coastguard Worker  private:
58*3ac0a46fSAndroid Build Coastguard Worker   CFWL_ScrollBar(CFWL_App* app,
59*3ac0a46fSAndroid Build Coastguard Worker                  const Properties& properties,
60*3ac0a46fSAndroid Build Coastguard Worker                  CFWL_Widget* pOuter);
61*3ac0a46fSAndroid Build Coastguard Worker 
IsVertical()62*3ac0a46fSAndroid Build Coastguard Worker   bool IsVertical() const { return !!(GetStyleExts() & FWL_STYLEEXT_SCB_Vert); }
63*3ac0a46fSAndroid Build Coastguard Worker   void DrawUpperTrack(CFGAS_GEGraphics* pGraphics, const CFX_Matrix& mtMatrix);
64*3ac0a46fSAndroid Build Coastguard Worker   void DrawLowerTrack(CFGAS_GEGraphics* pGraphics, const CFX_Matrix& mtMatrix);
65*3ac0a46fSAndroid Build Coastguard Worker   void DrawMaxArrowBtn(CFGAS_GEGraphics* pGraphics, const CFX_Matrix& mtMatrix);
66*3ac0a46fSAndroid Build Coastguard Worker   void DrawMinArrowBtn(CFGAS_GEGraphics* pGraphics, const CFX_Matrix& mtMatrix);
67*3ac0a46fSAndroid Build Coastguard Worker   void DrawThumb(CFGAS_GEGraphics* pGraphics, const CFX_Matrix& mtMatrix);
68*3ac0a46fSAndroid Build Coastguard Worker   void Layout();
69*3ac0a46fSAndroid Build Coastguard Worker   void CalcButtonLen();
70*3ac0a46fSAndroid Build Coastguard Worker   CFX_RectF CalcMinButtonRect();
71*3ac0a46fSAndroid Build Coastguard Worker   CFX_RectF CalcMaxButtonRect();
72*3ac0a46fSAndroid Build Coastguard Worker   CFX_RectF CalcThumbButtonRect(const CFX_RectF& rtThumbRect);
73*3ac0a46fSAndroid Build Coastguard Worker   CFX_RectF CalcMinTrackRect(const CFX_RectF& rtMinRect);
74*3ac0a46fSAndroid Build Coastguard Worker   CFX_RectF CalcMaxTrackRect(const CFX_RectF& rtMaxRect);
75*3ac0a46fSAndroid Build Coastguard Worker   float GetTrackPointPos(const CFX_PointF& point);
76*3ac0a46fSAndroid Build Coastguard Worker 
77*3ac0a46fSAndroid Build Coastguard Worker   bool SendEvent();
78*3ac0a46fSAndroid Build Coastguard Worker   bool OnScroll(CFWL_EventScroll::Code dwCode, float fPos);
79*3ac0a46fSAndroid Build Coastguard Worker   void OnLButtonDown(const CFX_PointF& point);
80*3ac0a46fSAndroid Build Coastguard Worker   void OnLButtonUp(const CFX_PointF& point);
81*3ac0a46fSAndroid Build Coastguard Worker   void OnMouseMove(const CFX_PointF& point);
82*3ac0a46fSAndroid Build Coastguard Worker   void OnMouseLeave();
83*3ac0a46fSAndroid Build Coastguard Worker   void OnMouseWheel(const CFX_Vector& delta);
84*3ac0a46fSAndroid Build Coastguard Worker   bool DoScroll(CFWL_EventScroll::Code dwCode, float fPos);
85*3ac0a46fSAndroid Build Coastguard Worker   void DoMouseDown(int32_t iItem,
86*3ac0a46fSAndroid Build Coastguard Worker                    const CFX_RectF& rtItem,
87*3ac0a46fSAndroid Build Coastguard Worker                    CFWL_PartState* pState,
88*3ac0a46fSAndroid Build Coastguard Worker                    const CFX_PointF& point);
89*3ac0a46fSAndroid Build Coastguard Worker   void DoMouseUp(int32_t iItem,
90*3ac0a46fSAndroid Build Coastguard Worker                  const CFX_RectF& rtItem,
91*3ac0a46fSAndroid Build Coastguard Worker                  CFWL_PartState* pState,
92*3ac0a46fSAndroid Build Coastguard Worker                  const CFX_PointF& point);
93*3ac0a46fSAndroid Build Coastguard Worker   void DoMouseMove(int32_t iItem,
94*3ac0a46fSAndroid Build Coastguard Worker                    const CFX_RectF& rtItem,
95*3ac0a46fSAndroid Build Coastguard Worker                    CFWL_PartState* pState,
96*3ac0a46fSAndroid Build Coastguard Worker                    const CFX_PointF& point);
97*3ac0a46fSAndroid Build Coastguard Worker   void DoMouseLeave(int32_t iItem,
98*3ac0a46fSAndroid Build Coastguard Worker                     const CFX_RectF& rtItem,
99*3ac0a46fSAndroid Build Coastguard Worker                     CFWL_PartState* pState);
100*3ac0a46fSAndroid Build Coastguard Worker   void DoMouseHover(int32_t iItem,
101*3ac0a46fSAndroid Build Coastguard Worker                     const CFX_RectF& rtItem,
102*3ac0a46fSAndroid Build Coastguard Worker                     CFWL_PartState* pState);
103*3ac0a46fSAndroid Build Coastguard Worker 
104*3ac0a46fSAndroid Build Coastguard Worker   float m_fRangeMin = 0.0f;
105*3ac0a46fSAndroid Build Coastguard Worker   float m_fRangeMax = -1.0f;
106*3ac0a46fSAndroid Build Coastguard Worker   float m_fPageSize = 0.0f;
107*3ac0a46fSAndroid Build Coastguard Worker   float m_fStepSize = 0.0f;
108*3ac0a46fSAndroid Build Coastguard Worker   float m_fPos = 0.0f;
109*3ac0a46fSAndroid Build Coastguard Worker   float m_fTrackPos = 0.0f;
110*3ac0a46fSAndroid Build Coastguard Worker   CFWL_PartState m_iMinButtonState = CFWL_PartState::kNormal;
111*3ac0a46fSAndroid Build Coastguard Worker   CFWL_PartState m_iMaxButtonState = CFWL_PartState::kNormal;
112*3ac0a46fSAndroid Build Coastguard Worker   CFWL_PartState m_iThumbButtonState = CFWL_PartState::kNormal;
113*3ac0a46fSAndroid Build Coastguard Worker   CFWL_PartState m_iMinTrackState = CFWL_PartState::kNormal;
114*3ac0a46fSAndroid Build Coastguard Worker   CFWL_PartState m_iMaxTrackState = CFWL_PartState::kNormal;
115*3ac0a46fSAndroid Build Coastguard Worker   float m_fLastTrackPos = 0.0f;
116*3ac0a46fSAndroid Build Coastguard Worker   CFX_PointF m_cpTrackPoint;
117*3ac0a46fSAndroid Build Coastguard Worker   int32_t m_iMouseWheel = 0;
118*3ac0a46fSAndroid Build Coastguard Worker   float m_fButtonLen = 0.0f;
119*3ac0a46fSAndroid Build Coastguard Worker   bool m_bMouseDown = false;
120*3ac0a46fSAndroid Build Coastguard Worker   bool m_bMinSize = false;
121*3ac0a46fSAndroid Build Coastguard Worker   CFX_RectF m_ClientRect;
122*3ac0a46fSAndroid Build Coastguard Worker   CFX_RectF m_ThumbRect;
123*3ac0a46fSAndroid Build Coastguard Worker   CFX_RectF m_MinBtnRect;
124*3ac0a46fSAndroid Build Coastguard Worker   CFX_RectF m_MaxBtnRect;
125*3ac0a46fSAndroid Build Coastguard Worker   CFX_RectF m_MinTrackRect;
126*3ac0a46fSAndroid Build Coastguard Worker   CFX_RectF m_MaxTrackRect;
127*3ac0a46fSAndroid Build Coastguard Worker   std::unique_ptr<CFX_Timer> m_pTimer;
128*3ac0a46fSAndroid Build Coastguard Worker };
129*3ac0a46fSAndroid Build Coastguard Worker 
130*3ac0a46fSAndroid Build Coastguard Worker #endif  // XFA_FWL_CFWL_SCROLLBAR_H_
131