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 FPDFSDK_INCLUDE_PDFWINDOW_PWL_SCROLLBAR_H_ 8#define FPDFSDK_INCLUDE_PDFWINDOW_PWL_SCROLLBAR_H_ 9 10#include "PWL_Wnd.h" 11 12class CPWL_SBButton; 13class CPWL_ScrollBar; 14 15struct PWL_SCROLL_INFO { 16 public: 17 PWL_SCROLL_INFO() 18 : fContentMin(0.0f), 19 fContentMax(0.0f), 20 fPlateWidth(0.0f), 21 fBigStep(0.0f), 22 fSmallStep(0.0f) {} 23 FX_FLOAT fContentMin; 24 FX_FLOAT fContentMax; 25 FX_FLOAT fPlateWidth; 26 FX_FLOAT fBigStep; 27 FX_FLOAT fSmallStep; 28}; 29 30enum PWL_SCROLLBAR_TYPE { SBT_HSCROLL, SBT_VSCROLL }; 31 32enum PWL_SBBUTTON_TYPE { PSBT_MIN, PSBT_MAX, PSBT_POS }; 33 34class CPWL_SBButton : public CPWL_Wnd { 35 public: 36 CPWL_SBButton(PWL_SCROLLBAR_TYPE eScrollBarType, 37 PWL_SBBUTTON_TYPE eButtonType); 38 ~CPWL_SBButton() override; 39 40 // CPWL_Wnd 41 CFX_ByteString GetClassName() const override; 42 void OnCreate(PWL_CREATEPARAM& cp) override; 43 void GetThisAppearanceStream(CFX_ByteTextBuf& sAppStream) override; 44 void DrawThisAppearance(CFX_RenderDevice* pDevice, 45 CFX_Matrix* pUser2Device) override; 46 FX_BOOL OnLButtonDown(const CPDF_Point& point, FX_DWORD nFlag) override; 47 FX_BOOL OnLButtonUp(const CPDF_Point& point, FX_DWORD nFlag) override; 48 FX_BOOL OnMouseMove(const CPDF_Point& point, FX_DWORD nFlag) override; 49 50 protected: 51 PWL_SCROLLBAR_TYPE m_eScrollBarType; 52 PWL_SBBUTTON_TYPE m_eSBButtonType; 53 54 FX_BOOL m_bMouseDown; 55}; 56 57struct PWL_FLOATRANGE { 58 public: 59 PWL_FLOATRANGE(); 60 PWL_FLOATRANGE(FX_FLOAT min, FX_FLOAT max); 61 void Default(); 62 void Set(FX_FLOAT min, FX_FLOAT max); 63 FX_BOOL In(FX_FLOAT x) const; 64 FX_FLOAT GetWidth() const; 65 66 FX_FLOAT fMin, fMax; 67}; 68 69struct PWL_SCROLL_PRIVATEDATA { 70 public: 71 PWL_SCROLL_PRIVATEDATA(); 72 73 void Default(); 74 void SetScrollRange(FX_FLOAT min, FX_FLOAT max); 75 void SetClientWidth(FX_FLOAT width); 76 void SetSmallStep(FX_FLOAT step); 77 void SetBigStep(FX_FLOAT step); 78 FX_BOOL SetPos(FX_FLOAT pos); 79 80 void AddSmall(); 81 void SubSmall(); 82 void AddBig(); 83 void SubBig(); 84 85 PWL_FLOATRANGE ScrollRange; 86 FX_FLOAT fClientWidth; 87 FX_FLOAT fScrollPos; 88 FX_FLOAT fBigStep; 89 FX_FLOAT fSmallStep; 90}; 91 92class CPWL_ScrollBar : public CPWL_Wnd { 93 public: 94 CPWL_ScrollBar(PWL_SCROLLBAR_TYPE sbType = SBT_HSCROLL); 95 ~CPWL_ScrollBar() override; 96 97 // CPWL_Wnd 98 CFX_ByteString GetClassName() const override; 99 void OnCreate(PWL_CREATEPARAM& cp) override; 100 void RePosChildWnd() override; 101 void GetThisAppearanceStream(CFX_ByteTextBuf& sAppStream) override; 102 void DrawThisAppearance(CFX_RenderDevice* pDevice, 103 CFX_Matrix* pUser2Device) override; 104 FX_BOOL OnLButtonDown(const CPDF_Point& point, FX_DWORD nFlag) override; 105 FX_BOOL OnLButtonUp(const CPDF_Point& point, FX_DWORD nFlag) override; 106 void OnNotify(CPWL_Wnd* pWnd, 107 FX_DWORD msg, 108 intptr_t wParam = 0, 109 intptr_t lParam = 0) override; 110 void CreateChildWnd(const PWL_CREATEPARAM& cp) override; 111 void TimerProc() override; 112 113 FX_FLOAT GetScrollBarWidth() const; 114 PWL_SCROLLBAR_TYPE GetScrollBarType() const { return m_sbType; } 115 116 void SetNotifyForever(FX_BOOL bForever) { m_bNotifyForever = bForever; } 117 118 protected: 119 void SetScrollRange(FX_FLOAT fMin, FX_FLOAT fMax, FX_FLOAT fClientWidth); 120 void SetScrollPos(FX_FLOAT fPos); 121 void MovePosButton(FX_BOOL bRefresh); 122 void SetScrollStep(FX_FLOAT fBigStep, FX_FLOAT fSmallStep); 123 void NotifyScrollWindow(); 124 CPDF_Rect GetScrollArea() const; 125 126 private: 127 void CreateButtons(const PWL_CREATEPARAM& cp); 128 129 void OnMinButtonLBDown(const CPDF_Point& point); 130 void OnMinButtonLBUp(const CPDF_Point& point); 131 void OnMinButtonMouseMove(const CPDF_Point& point); 132 133 void OnMaxButtonLBDown(const CPDF_Point& point); 134 void OnMaxButtonLBUp(const CPDF_Point& point); 135 void OnMaxButtonMouseMove(const CPDF_Point& point); 136 137 void OnPosButtonLBDown(const CPDF_Point& point); 138 void OnPosButtonLBUp(const CPDF_Point& point); 139 void OnPosButtonMouseMove(const CPDF_Point& point); 140 141 FX_FLOAT TrueToFace(FX_FLOAT); 142 FX_FLOAT FaceToTrue(FX_FLOAT); 143 144 PWL_SCROLLBAR_TYPE m_sbType; 145 PWL_SCROLL_INFO m_OriginInfo; 146 CPWL_SBButton* m_pMinButton; 147 CPWL_SBButton* m_pMaxButton; 148 CPWL_SBButton* m_pPosButton; 149 PWL_SCROLL_PRIVATEDATA m_sData; 150 FX_BOOL m_bMouseDown; 151 FX_BOOL m_bMinOrMax; 152 FX_BOOL m_bNotifyForever; 153 FX_FLOAT m_nOldPos; 154 FX_FLOAT m_fOldPosButton; 155}; 156 157#endif // FPDFSDK_INCLUDE_PDFWINDOW_PWL_SCROLLBAR_H_ 158