|  | // Copyright 2014 The PDFium Authors | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 
|  |  | 
|  | #ifndef FPDFSDK_PWL_CPWL_SCROLL_BAR_H_ | 
|  | #define FPDFSDK_PWL_CPWL_SCROLL_BAR_H_ | 
|  |  | 
|  | #include <memory> | 
|  |  | 
|  | #include "core/fxcrt/cfx_timer.h" | 
|  | #include "core/fxcrt/unowned_ptr.h" | 
|  | #include "fpdfsdk/pwl/cpwl_sbbutton.h" | 
|  | #include "fpdfsdk/pwl/cpwl_wnd.h" | 
|  |  | 
|  | struct PWL_SCROLL_INFO { | 
|  | public: | 
|  | PWL_SCROLL_INFO() | 
|  | : fContentMin(0.0f), | 
|  | fContentMax(0.0f), | 
|  | fPlateWidth(0.0f), | 
|  | fBigStep(0.0f), | 
|  | fSmallStep(0.0f) {} | 
|  |  | 
|  | bool operator==(const PWL_SCROLL_INFO& that) const { | 
|  | return fContentMin == that.fContentMin && fContentMax == that.fContentMax && | 
|  | fPlateWidth == that.fPlateWidth && fBigStep == that.fBigStep && | 
|  | fSmallStep == that.fSmallStep; | 
|  | } | 
|  | bool operator!=(const PWL_SCROLL_INFO& that) const { | 
|  | return !(*this == that); | 
|  | } | 
|  |  | 
|  | float fContentMin; | 
|  | float fContentMax; | 
|  | float fPlateWidth; | 
|  | float fBigStep; | 
|  | float fSmallStep; | 
|  | }; | 
|  |  | 
|  | struct PWL_FLOATRANGE { | 
|  | public: | 
|  | PWL_FLOATRANGE() = default; | 
|  |  | 
|  | bool operator==(const PWL_FLOATRANGE& that) const { | 
|  | return fMin == that.fMin && fMax == that.fMax; | 
|  | } | 
|  | bool operator!=(const PWL_FLOATRANGE& that) const { return !(*this == that); } | 
|  |  | 
|  | void Reset(); | 
|  | void Set(float min, float max); | 
|  | bool In(float x) const; | 
|  | float GetWidth() const; | 
|  |  | 
|  | float fMin = 0.0f; | 
|  | float fMax = 0.0f; | 
|  | }; | 
|  |  | 
|  | struct PWL_SCROLL_PRIVATEDATA { | 
|  | public: | 
|  | PWL_SCROLL_PRIVATEDATA(); | 
|  |  | 
|  | bool operator==(const PWL_SCROLL_PRIVATEDATA& that) const { | 
|  | return ScrollRange == that.ScrollRange && | 
|  | fClientWidth == that.fClientWidth && fScrollPos == that.fScrollPos && | 
|  | fBigStep == that.fBigStep && fSmallStep == that.fSmallStep; | 
|  | } | 
|  | bool operator!=(const PWL_SCROLL_PRIVATEDATA& that) const { | 
|  | return !(*this == that); | 
|  | } | 
|  |  | 
|  | void Default(); | 
|  | void SetScrollRange(float min, float max); | 
|  | void SetClientWidth(float width); | 
|  | void SetSmallStep(float step); | 
|  | void SetBigStep(float step); | 
|  | bool SetPos(float pos); | 
|  |  | 
|  | void AddSmall(); | 
|  | void SubSmall(); | 
|  | void AddBig(); | 
|  | void SubBig(); | 
|  |  | 
|  | PWL_FLOATRANGE ScrollRange; | 
|  | float fClientWidth; | 
|  | float fScrollPos; | 
|  | float fBigStep; | 
|  | float fSmallStep; | 
|  | }; | 
|  |  | 
|  | class CPWL_ScrollBar final : public CPWL_Wnd, public CFX_Timer::CallbackIface { | 
|  | public: | 
|  | static constexpr float kWidth = 12.0f; | 
|  | static constexpr uint8_t kTransparency = 150; | 
|  |  | 
|  | CPWL_ScrollBar( | 
|  | const CreateParams& cp, | 
|  | std::unique_ptr<IPWL_FillerNotify::PerWindowData> pAttachedData); | 
|  | ~CPWL_ScrollBar() override; | 
|  |  | 
|  | // CPWL_Wnd: | 
|  | void OnDestroy() override; | 
|  | bool RepositionChildWnd() override; | 
|  | void DrawThisAppearance(CFX_RenderDevice* pDevice, | 
|  | const CFX_Matrix& mtUser2Device) override; | 
|  | bool OnLButtonDown(Mask<FWL_EVENTFLAG> nFlag, | 
|  | const CFX_PointF& point) override; | 
|  | bool OnLButtonUp(Mask<FWL_EVENTFLAG> nFlag, const CFX_PointF& point) override; | 
|  | void SetScrollInfo(const PWL_SCROLL_INFO& info) override; | 
|  | void SetScrollPosition(float pos) override; | 
|  | void NotifyLButtonDown(CPWL_Wnd* child, const CFX_PointF& pos) override; | 
|  | void NotifyLButtonUp(CPWL_Wnd* child, const CFX_PointF& pos) override; | 
|  | void NotifyMouseMove(CPWL_Wnd* child, const CFX_PointF& pos) override; | 
|  | void CreateChildWnd(const CreateParams& cp) override; | 
|  |  | 
|  | // CFX_Timer::CallbackIface: | 
|  | void OnTimerFired() override; | 
|  |  | 
|  | float GetScrollBarWidth() const; | 
|  |  | 
|  | private: | 
|  | void SetScrollRange(float fMin, float fMax, float fClientWidth); | 
|  | void SetScrollPos(float fPos); | 
|  |  | 
|  | // Returns |true| iff this instance is still allocated. | 
|  | [[nodiscard]] bool MovePosButton(bool bRefresh); | 
|  | void SetScrollStep(float fBigStep, float fSmallStep); | 
|  | void NotifyScrollWindow(); | 
|  | CFX_FloatRect GetScrollArea() const; | 
|  |  | 
|  | void CreateButtons(const CreateParams& cp); | 
|  |  | 
|  | void OnMinButtonLBDown(const CFX_PointF& point); | 
|  | void OnMinButtonLBUp(const CFX_PointF& point); | 
|  | void OnMinButtonMouseMove(const CFX_PointF& point); | 
|  |  | 
|  | void OnMaxButtonLBDown(const CFX_PointF& point); | 
|  | void OnMaxButtonLBUp(const CFX_PointF& point); | 
|  | void OnMaxButtonMouseMove(const CFX_PointF& point); | 
|  |  | 
|  | void OnPosButtonLBDown(const CFX_PointF& point); | 
|  | void OnPosButtonLBUp(const CFX_PointF& point); | 
|  | void OnPosButtonMouseMove(const CFX_PointF& point); | 
|  |  | 
|  | float TrueToFace(float); | 
|  | float FaceToTrue(float); | 
|  |  | 
|  | PWL_SCROLL_INFO m_OriginInfo; | 
|  | UnownedPtr<CPWL_SBButton> m_pMinButton; | 
|  | UnownedPtr<CPWL_SBButton> m_pMaxButton; | 
|  | UnownedPtr<CPWL_SBButton> m_pPosButton; | 
|  | std::unique_ptr<CFX_Timer> m_pTimer; | 
|  | PWL_SCROLL_PRIVATEDATA m_sData; | 
|  | bool m_bMouseDown = false; | 
|  | bool m_bMinOrMax = false; | 
|  | float m_nOldPos = 0.0f; | 
|  | float m_fOldPosButton = 0.0f; | 
|  | }; | 
|  |  | 
|  | #endif  // FPDFSDK_PWL_CPWL_SCROLL_BAR_H_ |