1// Copyright 2014 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#ifndef XFA_FWL_CFWL_SCROLLBAR_H_
8#define XFA_FWL_CFWL_SCROLLBAR_H_
9
10#include <memory>
11
12#include "core/fxcrt/fx_system.h"
13#include "xfa/fwl/cfwl_eventscroll.h"
14#include "xfa/fwl/cfwl_timer.h"
15#include "xfa/fwl/cfwl_widget.h"
16#include "xfa/fwl/cfwl_widgetproperties.h"
17
18class CFWL_Widget;
19
20#define FWL_STYLEEXT_SCB_Horz (0L << 0)
21#define FWL_STYLEEXT_SCB_Vert (1L << 0)
22
23class CFWL_ScrollBar : public CFWL_Widget {
24 public:
25  CFWL_ScrollBar(const CFWL_App* app,
26                 std::unique_ptr<CFWL_WidgetProperties> properties,
27                 CFWL_Widget* pOuter);
28  ~CFWL_ScrollBar() override;
29
30  // CFWL_Widget
31  FWL_Type GetClassID() const override;
32  void Update() override;
33  void DrawWidget(CFX_Graphics* pGraphics, const CFX_Matrix* pMatrix) override;
34  void OnProcessMessage(CFWL_Message* pMessage) override;
35  void OnDrawWidget(CFX_Graphics* pGraphics,
36                    const CFX_Matrix* pMatrix) override;
37
38  void GetRange(FX_FLOAT* fMin, FX_FLOAT* fMax) const {
39    ASSERT(fMin);
40    ASSERT(fMax);
41    *fMin = m_fRangeMin;
42    *fMax = m_fRangeMax;
43  }
44  void SetRange(FX_FLOAT fMin, FX_FLOAT fMax) {
45    m_fRangeMin = fMin;
46    m_fRangeMax = fMax;
47  }
48  FX_FLOAT GetPageSize() const { return m_fPageSize; }
49  void SetPageSize(FX_FLOAT fPageSize) { m_fPageSize = fPageSize; }
50  FX_FLOAT GetStepSize() const { return m_fStepSize; }
51  void SetStepSize(FX_FLOAT fStepSize) { m_fStepSize = fStepSize; }
52  FX_FLOAT GetPos() const { return m_fPos; }
53  void SetPos(FX_FLOAT fPos) { m_fPos = fPos; }
54  void SetTrackPos(FX_FLOAT fTrackPos);
55
56 private:
57  class Timer : public CFWL_Timer {
58   public:
59    explicit Timer(CFWL_ScrollBar* pToolTip);
60    ~Timer() override {}
61
62    void Run(CFWL_TimerInfo* pTimerInfo) override;
63  };
64  friend class CFWL_ScrollBar::Timer;
65
66  bool IsVertical() const {
67    return !!(m_pProperties->m_dwStyleExes & FWL_STYLEEXT_SCB_Vert);
68  }
69  void DrawTrack(CFX_Graphics* pGraphics,
70                 IFWL_ThemeProvider* pTheme,
71                 bool bLower,
72                 const CFX_Matrix* pMatrix);
73  void DrawArrowBtn(CFX_Graphics* pGraphics,
74                    IFWL_ThemeProvider* pTheme,
75                    bool bMinBtn,
76                    const CFX_Matrix* pMatrix);
77  void DrawThumb(CFX_Graphics* pGraphics,
78                 IFWL_ThemeProvider* pTheme,
79                 const CFX_Matrix* pMatrix);
80  void Layout();
81  void CalcButtonLen();
82  CFX_RectF CalcMinButtonRect();
83  CFX_RectF CalcMaxButtonRect();
84  CFX_RectF CalcThumbButtonRect(const CFX_RectF& rtThumbRect);
85  CFX_RectF CalcMinTrackRect(const CFX_RectF& rtMinRect);
86  CFX_RectF CalcMaxTrackRect(const CFX_RectF& rtMaxRect);
87  FX_FLOAT GetTrackPointPos(const CFX_PointF& point);
88
89  bool SendEvent();
90  bool OnScroll(CFWL_EventScroll::Code dwCode, FX_FLOAT fPos);
91  void OnLButtonDown(const CFX_PointF& point);
92  void OnLButtonUp(const CFX_PointF& point);
93  void OnMouseMove(const CFX_PointF& point);
94  void OnMouseLeave();
95  void OnMouseWheel(const CFX_PointF& delta);
96  bool DoScroll(CFWL_EventScroll::Code dwCode, FX_FLOAT fPos);
97  void DoMouseDown(int32_t iItem,
98                   const CFX_RectF& rtItem,
99                   int32_t& iState,
100                   const CFX_PointF& point);
101  void DoMouseUp(int32_t iItem,
102                 const CFX_RectF& rtItem,
103                 int32_t& iState,
104                 const CFX_PointF& point);
105  void DoMouseMove(int32_t iItem,
106                   const CFX_RectF& rtItem,
107                   int32_t& iState,
108                   const CFX_PointF& point);
109  void DoMouseLeave(int32_t iItem, const CFX_RectF& rtItem, int32_t& iState);
110  void DoMouseHover(int32_t iItem, const CFX_RectF& rtItem, int32_t& iState);
111
112  CFWL_TimerInfo* m_pTimerInfo;
113  FX_FLOAT m_fRangeMin;
114  FX_FLOAT m_fRangeMax;
115  FX_FLOAT m_fPageSize;
116  FX_FLOAT m_fStepSize;
117  FX_FLOAT m_fPos;
118  FX_FLOAT m_fTrackPos;
119  int32_t m_iMinButtonState;
120  int32_t m_iMaxButtonState;
121  int32_t m_iThumbButtonState;
122  int32_t m_iMinTrackState;
123  int32_t m_iMaxTrackState;
124  FX_FLOAT m_fLastTrackPos;
125  CFX_PointF m_cpTrackPoint;
126  int32_t m_iMouseWheel;
127  bool m_bMouseDown;
128  FX_FLOAT m_fButtonLen;
129  bool m_bMinSize;
130  CFX_RectF m_rtClient;
131  CFX_RectF m_rtThumb;
132  CFX_RectF m_rtMinBtn;
133  CFX_RectF m_rtMaxBtn;
134  CFX_RectF m_rtMinTrack;
135  CFX_RectF m_rtMaxTrack;
136  CFWL_ScrollBar::Timer m_Timer;
137};
138
139#endif  // XFA_FWL_CFWL_SCROLLBAR_H_
140