xref: /haiku/headers/private/interface/Spinner.h (revision adba4ce988febe32e061aac861f9c489af2798c4)
1*adba4ce9SJohn Scipione /*
2*adba4ce9SJohn Scipione  * Copyright 2004 DarkWyrm <darkwyrm@earthlink.net>
3*adba4ce9SJohn Scipione  * Copyright 2013 FeemanLou
4*adba4ce9SJohn Scipione  * Copyright 2014 Haiku, Inc. All rights reserved.
5*adba4ce9SJohn Scipione  *
6*adba4ce9SJohn Scipione  * Distributed under the terms of the MIT license.
7*adba4ce9SJohn Scipione  *
8*adba4ce9SJohn Scipione  * Originally written by DarkWyrm <darkwyrm@earthlink.net>
9*adba4ce9SJohn Scipione  * Updated by FreemanLou as part of Google GCI 2013
10*adba4ce9SJohn Scipione  *
11*adba4ce9SJohn Scipione  * Authors:
12*adba4ce9SJohn Scipione  *		DarkWyrm, darkwyrm@earthlink.net
13*adba4ce9SJohn Scipione  *		FeemanLou
14*adba4ce9SJohn Scipione  *		John Scipione, jscipione@gmail.com
15*adba4ce9SJohn Scipione  */
16*adba4ce9SJohn Scipione #ifndef SPINNER_H
17*adba4ce9SJohn Scipione #define SPINNER_H
18*adba4ce9SJohn Scipione 
19*adba4ce9SJohn Scipione 
20*adba4ce9SJohn Scipione #include <Invoker.h>
21*adba4ce9SJohn Scipione #include <View.h>
22*adba4ce9SJohn Scipione 
23*adba4ce9SJohn Scipione 
24*adba4ce9SJohn Scipione class BTextView;
25*adba4ce9SJohn Scipione class SpinnerArrow;
26*adba4ce9SJohn Scipione class SpinnerTextView;
27*adba4ce9SJohn Scipione 
28*adba4ce9SJohn Scipione 
29*adba4ce9SJohn Scipione /*!	BSpinner provides a numeric input whose value can be nudged up or down
30*adba4ce9SJohn Scipione 	by way of two small buttons on the right.
31*adba4ce9SJohn Scipione */
32*adba4ce9SJohn Scipione class BSpinner : public BView, public BInvoker {
33*adba4ce9SJohn Scipione public:
34*adba4ce9SJohn Scipione 								BSpinner(BRect frame, const char* name,
35*adba4ce9SJohn Scipione 									const char* label, BMessage* message,
36*adba4ce9SJohn Scipione 									uint32 resizingMode = B_FOLLOW_LEFT | B_FOLLOW_TOP,
37*adba4ce9SJohn Scipione 									uint32 flags = B_WILL_DRAW | B_NAVIGABLE);
38*adba4ce9SJohn Scipione 								BSpinner(const char* name, const char* label,
39*adba4ce9SJohn Scipione 									BMessage* message,
40*adba4ce9SJohn Scipione 									uint32 flags = B_WILL_DRAW | B_NAVIGABLE);
41*adba4ce9SJohn Scipione 								BSpinner(BMessage* data);
42*adba4ce9SJohn Scipione 	virtual						~BSpinner();
43*adba4ce9SJohn Scipione 
44*adba4ce9SJohn Scipione 	static	BArchivable*		Instantiate(BMessage* data);
45*adba4ce9SJohn Scipione 	virtual	status_t			Archive(BMessage* data, bool deep = true) const;
46*adba4ce9SJohn Scipione 
47*adba4ce9SJohn Scipione 	virtual	status_t			GetSupportedSuites(BMessage* message);
48*adba4ce9SJohn Scipione 	virtual	BHandler*			ResolveSpecifier(BMessage* message, int32 index,
49*adba4ce9SJohn Scipione 									BMessage* specifier, int32 form,
50*adba4ce9SJohn Scipione 									const char* property);
51*adba4ce9SJohn Scipione 
52*adba4ce9SJohn Scipione 	virtual	void				AttachedToWindow();
53*adba4ce9SJohn Scipione 	virtual	void				Draw(BRect updateRect);
54*adba4ce9SJohn Scipione 	virtual	void				FrameResized(float width, float height);
55*adba4ce9SJohn Scipione 	virtual	void				MakeFocus(bool focus = true);
56*adba4ce9SJohn Scipione 	virtual	void				ResizeToPreferred();
57*adba4ce9SJohn Scipione 	virtual	void				SetFlags(uint32 flags);
58*adba4ce9SJohn Scipione 	virtual	void				ValueChanged();
59*adba4ce9SJohn Scipione 	virtual	void				WindowActivated(bool active);
60*adba4ce9SJohn Scipione 
61*adba4ce9SJohn Scipione 			alignment			Alignment() const { return fAlignment; };
62*adba4ce9SJohn Scipione 	virtual	void				SetAlignment(alignment align);
63*adba4ce9SJohn Scipione 
64*adba4ce9SJohn Scipione 			float				Divider() const { return fDivider; };
65*adba4ce9SJohn Scipione 	virtual	void				SetDivider(float position);
66*adba4ce9SJohn Scipione 
67*adba4ce9SJohn Scipione 			bool				IsEnabled() const { return fIsEnabled; };
68*adba4ce9SJohn Scipione 	virtual	void				SetEnabled(bool enable);
69*adba4ce9SJohn Scipione 
70*adba4ce9SJohn Scipione 			const char*			Label() const { return fLabel; };
71*adba4ce9SJohn Scipione 	virtual	void				SetLabel(const char* text);
72*adba4ce9SJohn Scipione 
73*adba4ce9SJohn Scipione 			uint32				Precision() const { return fPrecision; };
74*adba4ce9SJohn Scipione 	virtual	void				SetPrecision(uint32 precision) { fPrecision = precision; };
75*adba4ce9SJohn Scipione 
76*adba4ce9SJohn Scipione 			double				MaxValue() const { return fMaxValue; }
77*adba4ce9SJohn Scipione 	virtual	void				SetMaxValue(double max);
78*adba4ce9SJohn Scipione 
79*adba4ce9SJohn Scipione 			double				MinValue() const { return fMinValue; }
80*adba4ce9SJohn Scipione 	virtual	void				SetMinValue(double min);
81*adba4ce9SJohn Scipione 
82*adba4ce9SJohn Scipione 			void				Range(double* min, double* max);
83*adba4ce9SJohn Scipione 	virtual	void				SetRange(double min, double max);
84*adba4ce9SJohn Scipione 
85*adba4ce9SJohn Scipione 			double				Step() const { return fStep; }
86*adba4ce9SJohn Scipione 	virtual	void				SetStep(double step) { fStep = step; };
87*adba4ce9SJohn Scipione 
88*adba4ce9SJohn Scipione 			double				Value() const { return fValue; };
89*adba4ce9SJohn Scipione 	virtual	void				SetValue(double value);
90*adba4ce9SJohn Scipione 
91*adba4ce9SJohn Scipione 			bool				IsDecrementEnabled() const;
92*adba4ce9SJohn Scipione 	virtual	void				SetDecrementEnabled(bool enable);
93*adba4ce9SJohn Scipione 
94*adba4ce9SJohn Scipione 			bool				IsIncrementEnabled() const;
95*adba4ce9SJohn Scipione 	virtual	void				SetIncrementEnabled(bool enable);
96*adba4ce9SJohn Scipione 
97*adba4ce9SJohn Scipione 	virtual	BSize				MinSize();
98*adba4ce9SJohn Scipione 	virtual	BSize				MaxSize();
99*adba4ce9SJohn Scipione 	virtual	BSize				PreferredSize();
100*adba4ce9SJohn Scipione 	virtual	BAlignment			LayoutAlignment();
101*adba4ce9SJohn Scipione 
102*adba4ce9SJohn Scipione 			BLayoutItem*		CreateLabelLayoutItem();
103*adba4ce9SJohn Scipione 			BLayoutItem*		CreateTextViewLayoutItem();
104*adba4ce9SJohn Scipione 
105*adba4ce9SJohn Scipione 			BTextView*			TextView() const;
106*adba4ce9SJohn Scipione 
107*adba4ce9SJohn Scipione private:
108*adba4ce9SJohn Scipione 	// FBC padding
109*adba4ce9SJohn Scipione 	virtual	void				_ReservedSpinner20();
110*adba4ce9SJohn Scipione 	virtual	void				_ReservedSpinner19();
111*adba4ce9SJohn Scipione 	virtual	void				_ReservedSpinner18();
112*adba4ce9SJohn Scipione 	virtual	void				_ReservedSpinner17();
113*adba4ce9SJohn Scipione 	virtual	void				_ReservedSpinner16();
114*adba4ce9SJohn Scipione 	virtual	void				_ReservedSpinner15();
115*adba4ce9SJohn Scipione 	virtual	void				_ReservedSpinner14();
116*adba4ce9SJohn Scipione 	virtual	void				_ReservedSpinner13();
117*adba4ce9SJohn Scipione 	virtual	void				_ReservedSpinner12();
118*adba4ce9SJohn Scipione 	virtual	void				_ReservedSpinner11();
119*adba4ce9SJohn Scipione 	virtual	void				_ReservedSpinner10();
120*adba4ce9SJohn Scipione 	virtual	void				_ReservedSpinner9();
121*adba4ce9SJohn Scipione 	virtual	void				_ReservedSpinner8();
122*adba4ce9SJohn Scipione 	virtual	void				_ReservedSpinner7();
123*adba4ce9SJohn Scipione 	virtual	void				_ReservedSpinner6();
124*adba4ce9SJohn Scipione 	virtual	void				_ReservedSpinner5();
125*adba4ce9SJohn Scipione 	virtual	void				_ReservedSpinner4();
126*adba4ce9SJohn Scipione 	virtual	void				_ReservedSpinner3();
127*adba4ce9SJohn Scipione 	virtual	void				_ReservedSpinner2();
128*adba4ce9SJohn Scipione 	virtual	void				_ReservedSpinner1();
129*adba4ce9SJohn Scipione 
130*adba4ce9SJohn Scipione protected:
131*adba4ce9SJohn Scipione 	virtual	status_t			AllArchived(BMessage* into) const;
132*adba4ce9SJohn Scipione 	virtual	status_t			AllUnarchived(const BMessage* from);
133*adba4ce9SJohn Scipione 
134*adba4ce9SJohn Scipione 	virtual	void				LayoutInvalidated(bool descendants);
135*adba4ce9SJohn Scipione 	virtual	void				DoLayout();
136*adba4ce9SJohn Scipione 
137*adba4ce9SJohn Scipione private:
138*adba4ce9SJohn Scipione 	class LabelLayoutItem;
139*adba4ce9SJohn Scipione 	class TextViewLayoutItem;
140*adba4ce9SJohn Scipione 	struct LayoutData;
141*adba4ce9SJohn Scipione 
142*adba4ce9SJohn Scipione 	friend class SpinnerArrow;
143*adba4ce9SJohn Scipione 	friend class SpinnerTextView;
144*adba4ce9SJohn Scipione 
145*adba4ce9SJohn Scipione 	friend class LabelLayoutItem;
146*adba4ce9SJohn Scipione 	friend class TextViewLayoutItem;
147*adba4ce9SJohn Scipione 	friend struct LayoutData;
148*adba4ce9SJohn Scipione 
149*adba4ce9SJohn Scipione 			void				_DrawLabel(BRect updateRect);
150*adba4ce9SJohn Scipione 			void				_DrawTextView(BRect updateRect);
151*adba4ce9SJohn Scipione 			void				_InitObject();
152*adba4ce9SJohn Scipione 			void				_LayoutTextView();
153*adba4ce9SJohn Scipione 			void				_UpdateFrame();
154*adba4ce9SJohn Scipione 			void				_UpdateTextViewColors(bool enable);
155*adba4ce9SJohn Scipione 			void				_ValidateLayoutData();
156*adba4ce9SJohn Scipione 
157*adba4ce9SJohn Scipione 			BSpinner&			operator=(const BSpinner& other);
158*adba4ce9SJohn Scipione 
159*adba4ce9SJohn Scipione 			alignment			fAlignment;
160*adba4ce9SJohn Scipione 			float				fDivider;
161*adba4ce9SJohn Scipione 			bool				fIsEnabled;
162*adba4ce9SJohn Scipione 			const char*			fLabel;
163*adba4ce9SJohn Scipione 			double				fMinValue;
164*adba4ce9SJohn Scipione 			double				fMaxValue;
165*adba4ce9SJohn Scipione 			double				fStep;
166*adba4ce9SJohn Scipione 			double				fValue;
167*adba4ce9SJohn Scipione 			uint32				fPrecision;
168*adba4ce9SJohn Scipione 
169*adba4ce9SJohn Scipione 			LayoutData*			fLayoutData;
170*adba4ce9SJohn Scipione 
171*adba4ce9SJohn Scipione 			SpinnerTextView*	fTextView;
172*adba4ce9SJohn Scipione 			SpinnerArrow*		fIncrement;
173*adba4ce9SJohn Scipione 			SpinnerArrow*		fDecrement;
174*adba4ce9SJohn Scipione 
175*adba4ce9SJohn Scipione 	// FBC padding
176*adba4ce9SJohn Scipione 			uint32				_reserved[20];
177*adba4ce9SJohn Scipione };
178*adba4ce9SJohn Scipione 
179*adba4ce9SJohn Scipione 
180*adba4ce9SJohn Scipione #endif	// SPINNER_H
181