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 FPDFSDK_PWL_CPWL_SCROLL_BAR_H_ 8*3ac0a46fSAndroid Build Coastguard Worker #define FPDFSDK_PWL_CPWL_SCROLL_BAR_H_ 9*3ac0a46fSAndroid Build Coastguard Worker 10*3ac0a46fSAndroid Build Coastguard Worker #include <memory> 11*3ac0a46fSAndroid Build Coastguard Worker 12*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxcrt/cfx_timer.h" 13*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxcrt/unowned_ptr.h" 14*3ac0a46fSAndroid Build Coastguard Worker #include "fpdfsdk/pwl/cpwl_sbbutton.h" 15*3ac0a46fSAndroid Build Coastguard Worker #include "fpdfsdk/pwl/cpwl_wnd.h" 16*3ac0a46fSAndroid Build Coastguard Worker 17*3ac0a46fSAndroid Build Coastguard Worker struct PWL_SCROLL_INFO { 18*3ac0a46fSAndroid Build Coastguard Worker public: PWL_SCROLL_INFOPWL_SCROLL_INFO19*3ac0a46fSAndroid Build Coastguard Worker PWL_SCROLL_INFO() 20*3ac0a46fSAndroid Build Coastguard Worker : fContentMin(0.0f), 21*3ac0a46fSAndroid Build Coastguard Worker fContentMax(0.0f), 22*3ac0a46fSAndroid Build Coastguard Worker fPlateWidth(0.0f), 23*3ac0a46fSAndroid Build Coastguard Worker fBigStep(0.0f), 24*3ac0a46fSAndroid Build Coastguard Worker fSmallStep(0.0f) {} 25*3ac0a46fSAndroid Build Coastguard Worker 26*3ac0a46fSAndroid Build Coastguard Worker bool operator==(const PWL_SCROLL_INFO& that) const { 27*3ac0a46fSAndroid Build Coastguard Worker return fContentMin == that.fContentMin && fContentMax == that.fContentMax && 28*3ac0a46fSAndroid Build Coastguard Worker fPlateWidth == that.fPlateWidth && fBigStep == that.fBigStep && 29*3ac0a46fSAndroid Build Coastguard Worker fSmallStep == that.fSmallStep; 30*3ac0a46fSAndroid Build Coastguard Worker } 31*3ac0a46fSAndroid Build Coastguard Worker bool operator!=(const PWL_SCROLL_INFO& that) const { 32*3ac0a46fSAndroid Build Coastguard Worker return !(*this == that); 33*3ac0a46fSAndroid Build Coastguard Worker } 34*3ac0a46fSAndroid Build Coastguard Worker 35*3ac0a46fSAndroid Build Coastguard Worker float fContentMin; 36*3ac0a46fSAndroid Build Coastguard Worker float fContentMax; 37*3ac0a46fSAndroid Build Coastguard Worker float fPlateWidth; 38*3ac0a46fSAndroid Build Coastguard Worker float fBigStep; 39*3ac0a46fSAndroid Build Coastguard Worker float fSmallStep; 40*3ac0a46fSAndroid Build Coastguard Worker }; 41*3ac0a46fSAndroid Build Coastguard Worker 42*3ac0a46fSAndroid Build Coastguard Worker struct PWL_FLOATRANGE { 43*3ac0a46fSAndroid Build Coastguard Worker public: 44*3ac0a46fSAndroid Build Coastguard Worker PWL_FLOATRANGE() = default; 45*3ac0a46fSAndroid Build Coastguard Worker 46*3ac0a46fSAndroid Build Coastguard Worker bool operator==(const PWL_FLOATRANGE& that) const { 47*3ac0a46fSAndroid Build Coastguard Worker return fMin == that.fMin && fMax == that.fMax; 48*3ac0a46fSAndroid Build Coastguard Worker } 49*3ac0a46fSAndroid Build Coastguard Worker bool operator!=(const PWL_FLOATRANGE& that) const { return !(*this == that); } 50*3ac0a46fSAndroid Build Coastguard Worker 51*3ac0a46fSAndroid Build Coastguard Worker void Reset(); 52*3ac0a46fSAndroid Build Coastguard Worker void Set(float min, float max); 53*3ac0a46fSAndroid Build Coastguard Worker bool In(float x) const; 54*3ac0a46fSAndroid Build Coastguard Worker float GetWidth() const; 55*3ac0a46fSAndroid Build Coastguard Worker 56*3ac0a46fSAndroid Build Coastguard Worker float fMin = 0.0f; 57*3ac0a46fSAndroid Build Coastguard Worker float fMax = 0.0f; 58*3ac0a46fSAndroid Build Coastguard Worker }; 59*3ac0a46fSAndroid Build Coastguard Worker 60*3ac0a46fSAndroid Build Coastguard Worker struct PWL_SCROLL_PRIVATEDATA { 61*3ac0a46fSAndroid Build Coastguard Worker public: 62*3ac0a46fSAndroid Build Coastguard Worker PWL_SCROLL_PRIVATEDATA(); 63*3ac0a46fSAndroid Build Coastguard Worker 64*3ac0a46fSAndroid Build Coastguard Worker bool operator==(const PWL_SCROLL_PRIVATEDATA& that) const { 65*3ac0a46fSAndroid Build Coastguard Worker return ScrollRange == that.ScrollRange && 66*3ac0a46fSAndroid Build Coastguard Worker fClientWidth == that.fClientWidth && fScrollPos == that.fScrollPos && 67*3ac0a46fSAndroid Build Coastguard Worker fBigStep == that.fBigStep && fSmallStep == that.fSmallStep; 68*3ac0a46fSAndroid Build Coastguard Worker } 69*3ac0a46fSAndroid Build Coastguard Worker bool operator!=(const PWL_SCROLL_PRIVATEDATA& that) const { 70*3ac0a46fSAndroid Build Coastguard Worker return !(*this == that); 71*3ac0a46fSAndroid Build Coastguard Worker } 72*3ac0a46fSAndroid Build Coastguard Worker 73*3ac0a46fSAndroid Build Coastguard Worker void Default(); 74*3ac0a46fSAndroid Build Coastguard Worker void SetScrollRange(float min, float max); 75*3ac0a46fSAndroid Build Coastguard Worker void SetClientWidth(float width); 76*3ac0a46fSAndroid Build Coastguard Worker void SetSmallStep(float step); 77*3ac0a46fSAndroid Build Coastguard Worker void SetBigStep(float step); 78*3ac0a46fSAndroid Build Coastguard Worker bool SetPos(float pos); 79*3ac0a46fSAndroid Build Coastguard Worker 80*3ac0a46fSAndroid Build Coastguard Worker void AddSmall(); 81*3ac0a46fSAndroid Build Coastguard Worker void SubSmall(); 82*3ac0a46fSAndroid Build Coastguard Worker void AddBig(); 83*3ac0a46fSAndroid Build Coastguard Worker void SubBig(); 84*3ac0a46fSAndroid Build Coastguard Worker 85*3ac0a46fSAndroid Build Coastguard Worker PWL_FLOATRANGE ScrollRange; 86*3ac0a46fSAndroid Build Coastguard Worker float fClientWidth; 87*3ac0a46fSAndroid Build Coastguard Worker float fScrollPos; 88*3ac0a46fSAndroid Build Coastguard Worker float fBigStep; 89*3ac0a46fSAndroid Build Coastguard Worker float fSmallStep; 90*3ac0a46fSAndroid Build Coastguard Worker }; 91*3ac0a46fSAndroid Build Coastguard Worker 92*3ac0a46fSAndroid Build Coastguard Worker class CPWL_ScrollBar final : public CPWL_Wnd, public CFX_Timer::CallbackIface { 93*3ac0a46fSAndroid Build Coastguard Worker public: 94*3ac0a46fSAndroid Build Coastguard Worker static constexpr float kWidth = 12.0f; 95*3ac0a46fSAndroid Build Coastguard Worker static constexpr uint8_t kTransparency = 150; 96*3ac0a46fSAndroid Build Coastguard Worker 97*3ac0a46fSAndroid Build Coastguard Worker CPWL_ScrollBar( 98*3ac0a46fSAndroid Build Coastguard Worker const CreateParams& cp, 99*3ac0a46fSAndroid Build Coastguard Worker std::unique_ptr<IPWL_FillerNotify::PerWindowData> pAttachedData); 100*3ac0a46fSAndroid Build Coastguard Worker ~CPWL_ScrollBar() override; 101*3ac0a46fSAndroid Build Coastguard Worker 102*3ac0a46fSAndroid Build Coastguard Worker // CPWL_Wnd: 103*3ac0a46fSAndroid Build Coastguard Worker void OnDestroy() override; 104*3ac0a46fSAndroid Build Coastguard Worker bool RepositionChildWnd() override; 105*3ac0a46fSAndroid Build Coastguard Worker void DrawThisAppearance(CFX_RenderDevice* pDevice, 106*3ac0a46fSAndroid Build Coastguard Worker const CFX_Matrix& mtUser2Device) override; 107*3ac0a46fSAndroid Build Coastguard Worker bool OnLButtonDown(Mask<FWL_EVENTFLAG> nFlag, 108*3ac0a46fSAndroid Build Coastguard Worker const CFX_PointF& point) override; 109*3ac0a46fSAndroid Build Coastguard Worker bool OnLButtonUp(Mask<FWL_EVENTFLAG> nFlag, const CFX_PointF& point) override; 110*3ac0a46fSAndroid Build Coastguard Worker void SetScrollInfo(const PWL_SCROLL_INFO& info) override; 111*3ac0a46fSAndroid Build Coastguard Worker void SetScrollPosition(float pos) override; 112*3ac0a46fSAndroid Build Coastguard Worker void NotifyLButtonDown(CPWL_Wnd* child, const CFX_PointF& pos) override; 113*3ac0a46fSAndroid Build Coastguard Worker void NotifyLButtonUp(CPWL_Wnd* child, const CFX_PointF& pos) override; 114*3ac0a46fSAndroid Build Coastguard Worker void NotifyMouseMove(CPWL_Wnd* child, const CFX_PointF& pos) override; 115*3ac0a46fSAndroid Build Coastguard Worker void CreateChildWnd(const CreateParams& cp) override; 116*3ac0a46fSAndroid Build Coastguard Worker 117*3ac0a46fSAndroid Build Coastguard Worker // CFX_Timer::CallbackIface: 118*3ac0a46fSAndroid Build Coastguard Worker void OnTimerFired() override; 119*3ac0a46fSAndroid Build Coastguard Worker 120*3ac0a46fSAndroid Build Coastguard Worker float GetScrollBarWidth() const; 121*3ac0a46fSAndroid Build Coastguard Worker 122*3ac0a46fSAndroid Build Coastguard Worker private: 123*3ac0a46fSAndroid Build Coastguard Worker void SetScrollRange(float fMin, float fMax, float fClientWidth); 124*3ac0a46fSAndroid Build Coastguard Worker void SetScrollPos(float fPos); 125*3ac0a46fSAndroid Build Coastguard Worker 126*3ac0a46fSAndroid Build Coastguard Worker // Returns |true| iff this instance is still allocated. 127*3ac0a46fSAndroid Build Coastguard Worker [[nodiscard]] bool MovePosButton(bool bRefresh); 128*3ac0a46fSAndroid Build Coastguard Worker void SetScrollStep(float fBigStep, float fSmallStep); 129*3ac0a46fSAndroid Build Coastguard Worker void NotifyScrollWindow(); 130*3ac0a46fSAndroid Build Coastguard Worker CFX_FloatRect GetScrollArea() const; 131*3ac0a46fSAndroid Build Coastguard Worker 132*3ac0a46fSAndroid Build Coastguard Worker void CreateButtons(const CreateParams& cp); 133*3ac0a46fSAndroid Build Coastguard Worker 134*3ac0a46fSAndroid Build Coastguard Worker void OnMinButtonLBDown(const CFX_PointF& point); 135*3ac0a46fSAndroid Build Coastguard Worker void OnMinButtonLBUp(const CFX_PointF& point); 136*3ac0a46fSAndroid Build Coastguard Worker void OnMinButtonMouseMove(const CFX_PointF& point); 137*3ac0a46fSAndroid Build Coastguard Worker 138*3ac0a46fSAndroid Build Coastguard Worker void OnMaxButtonLBDown(const CFX_PointF& point); 139*3ac0a46fSAndroid Build Coastguard Worker void OnMaxButtonLBUp(const CFX_PointF& point); 140*3ac0a46fSAndroid Build Coastguard Worker void OnMaxButtonMouseMove(const CFX_PointF& point); 141*3ac0a46fSAndroid Build Coastguard Worker 142*3ac0a46fSAndroid Build Coastguard Worker void OnPosButtonLBDown(const CFX_PointF& point); 143*3ac0a46fSAndroid Build Coastguard Worker void OnPosButtonLBUp(const CFX_PointF& point); 144*3ac0a46fSAndroid Build Coastguard Worker void OnPosButtonMouseMove(const CFX_PointF& point); 145*3ac0a46fSAndroid Build Coastguard Worker 146*3ac0a46fSAndroid Build Coastguard Worker float TrueToFace(float); 147*3ac0a46fSAndroid Build Coastguard Worker float FaceToTrue(float); 148*3ac0a46fSAndroid Build Coastguard Worker 149*3ac0a46fSAndroid Build Coastguard Worker PWL_SCROLL_INFO m_OriginInfo; 150*3ac0a46fSAndroid Build Coastguard Worker UnownedPtr<CPWL_SBButton> m_pMinButton; 151*3ac0a46fSAndroid Build Coastguard Worker UnownedPtr<CPWL_SBButton> m_pMaxButton; 152*3ac0a46fSAndroid Build Coastguard Worker UnownedPtr<CPWL_SBButton> m_pPosButton; 153*3ac0a46fSAndroid Build Coastguard Worker std::unique_ptr<CFX_Timer> m_pTimer; 154*3ac0a46fSAndroid Build Coastguard Worker PWL_SCROLL_PRIVATEDATA m_sData; 155*3ac0a46fSAndroid Build Coastguard Worker bool m_bMouseDown = false; 156*3ac0a46fSAndroid Build Coastguard Worker bool m_bMinOrMax = false; 157*3ac0a46fSAndroid Build Coastguard Worker float m_nOldPos = 0.0f; 158*3ac0a46fSAndroid Build Coastguard Worker float m_fOldPosButton = 0.0f; 159*3ac0a46fSAndroid Build Coastguard Worker }; 160*3ac0a46fSAndroid Build Coastguard Worker 161*3ac0a46fSAndroid Build Coastguard Worker #endif // FPDFSDK_PWL_CPWL_SCROLL_BAR_H_ 162