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 18 class CFWL_Widget; 19 20 #define FWL_STYLEEXT_SCB_Horz (0L << 0) 21 #define FWL_STYLEEXT_SCB_Vert (1L << 0) 22 23 class 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