1/*
2 * Copyright 2001-2020 Haiku, Inc. All rights reserved.
3 * Distributed under the terms of the MIT License.
4 */
5#ifndef	_SCROLL_BAR_H
6#define	_SCROLL_BAR_H
7
8
9#include <View.h>
10
11
12#define B_V_SCROLL_BAR_WIDTH	14.0f
13#define B_H_SCROLL_BAR_HEIGHT	14.0f
14
15
16class BScrollBar : public BView {
17public:
18								BScrollBar(BRect frame, const char* name,
19									BView* target, float min, float max,
20									orientation direction);
21								BScrollBar(const char* name, BView* target,
22									float min, float max,
23									orientation orientation);
24								BScrollBar(BMessage* archive);
25	virtual						~BScrollBar();
26	static	BArchivable*		Instantiate(BMessage* archive);
27	virtual	status_t			Archive(BMessage* archive,
28									bool deep = true) const;
29
30	virtual void				AllAttached();
31	virtual void				AllDetached();
32
33	virtual	void				AttachedToWindow();
34	virtual	void				DetachedFromWindow();
35
36	virtual	void				Draw(BRect updateRect);
37	virtual	void				FrameMoved(BPoint new_position);
38	virtual	void				FrameResized(float newWidth, float newHeight);
39
40	virtual void				MessageReceived(BMessage* message);
41
42	virtual	void				MouseDown(BPoint where);
43	virtual	void				MouseUp(BPoint where);
44	virtual	void				MouseMoved(BPoint where, uint32 code,
45									const BMessage* dragMessage);
46
47	virtual	void				WindowActivated(bool active);
48
49			void				SetValue(float value);
50			float				Value() const;
51
52			void				SetProportion(float);
53			float				Proportion() const;
54
55	virtual	void				ValueChanged(float newValue);
56
57			void				SetRange(float min, float max);
58			void				GetRange(float* _min, float* _max) const;
59			void				SetSteps(float smallStep, float largeStep);
60			void				GetSteps(float* _smallStep,
61									float* _largeStep) const;
62
63			void				SetTarget(BView *target);
64			void				SetTarget(const char* targetName);
65			BView*				Target() const;
66
67			void				SetOrientation(orientation direction);
68			orientation			Orientation() const;
69
70			// TODO: Make this a virtual method, it should be one,
71			// but it's not important right now. This is supposed
72			// to be used in case the BScrollBar should draw part of
73			// the focus indication of the target view for aesthetical
74			// reasons. BScrollView will forward this method.
75			status_t			SetBorderHighlighted(bool highlight);
76
77	virtual void				GetPreferredSize(float* _width,
78									float* _height);
79	virtual void				ResizeToPreferred();
80	virtual void				MakeFocus(bool focus = true);
81
82	virtual	BSize				MinSize();
83	virtual	BSize				MaxSize();
84	virtual	BSize				PreferredSize();
85
86	virtual status_t			GetSupportedSuites(BMessage* message);
87	virtual BHandler*			ResolveSpecifier(BMessage* message,
88									int32 index, BMessage* specifier,
89									int32 what, const char* property);
90
91	virtual status_t			Perform(perform_code d, void* arg);
92
93private:
94	class Private;
95	friend class Private;
96
97	friend status_t control_scrollbar(scroll_bar_info* info,
98		BScrollBar *bar);
99		// for use within the preflet
100
101	virtual	void				_ReservedScrollBar1();
102	virtual	void				_ReservedScrollBar2();
103	virtual	void				_ReservedScrollBar3();
104	virtual	void				_ReservedScrollBar4();
105
106	// disabled
107			BScrollBar&			operator=(const BScrollBar& other);
108
109			bool				_DoubleArrows() const;
110			void				_UpdateThumbFrame();
111			float				_ValueFor(BPoint where) const;
112			int32				_ButtonFor(BPoint where) const;
113			BRect				_ButtonRectFor(int32 button) const;
114			void				_UpdateTargetValue(BPoint where);
115			void				_UpdateArrowButtons();
116
117			BSize				_MinSize() const;
118
119private:
120			float				fMin;
121			float				fMax;
122			float				fSmallStep;
123			float				fLargeStep;
124			float				fValue;
125			float				fProportion;
126			BView*				fTarget;
127			orientation			fOrientation;
128
129			Private*			fPrivateData;
130
131			uint32				_reserved[4];
132};
133
134#endif	// _SCROLL_BAR_H
135