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