xref: /aosp_15_r20/external/pdfium/fpdfsdk/pwl/cpwl_scroll_bar.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 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