1/*
2 * Copyright 2004 DarkWyrm <darkwyrm@earthlink.net>
3 * Copyright 2013 FeemanLou
4 * Copyright 2014-2015 Haiku, Inc. All rights reserved.
5 *
6 * Distributed under the terms of the MIT license.
7 *
8 * Originally written by DarkWyrm <darkwyrm@earthlink.net>
9 * Updated by FreemanLou as part of Google GCI 2013
10 *
11 * Authors:
12 *		DarkWyrm, darkwyrm@earthlink.net
13 *		FeemanLou
14 *		John Scipione, jscipione@gmail.com
15 */
16#ifndef _ABSTRACT_SPINNER_H
17#define _ABSTRACT_SPINNER_H
18
19
20#include <Control.h>
21
22
23typedef enum {
24	SPINNER_BUTTON_HORIZONTAL_ARROWS,
25	SPINNER_BUTTON_VERTICAL_ARROWS,
26	SPINNER_BUTTON_PLUS_MINUS
27} spinner_button_style;
28
29
30class BTextView;
31class SpinnerButton;
32class SpinnerTextView;
33
34
35/*!	BAbstractSpinner provides an input whose value can be nudged up or down
36	by way of two small buttons on the right.
37*/
38class BAbstractSpinner : public BControl {
39public:
40								BAbstractSpinner(BRect frame, const char* name,
41									const char* label, BMessage* message,
42									uint32 resizingMode = B_FOLLOW_LEFT_TOP,
43									uint32 flags = B_WILL_DRAW | B_NAVIGABLE);
44								BAbstractSpinner(const char* name, const char* label,
45									BMessage* message,
46									uint32 flags = B_WILL_DRAW | B_NAVIGABLE);
47								BAbstractSpinner(BMessage* data);
48	virtual						~BAbstractSpinner();
49
50	static	BArchivable*		Instantiate(BMessage* data);
51	virtual	status_t			Archive(BMessage* data, bool deep = true) const;
52
53	virtual	status_t			GetSupportedSuites(BMessage* message);
54	virtual	BHandler*			ResolveSpecifier(BMessage* message, int32 index,
55									BMessage* specifier, int32 form,
56									const char* property);
57
58	virtual	void				AttachedToWindow();
59	virtual	void				Draw(BRect updateRect);
60	virtual	void				FrameResized(float width, float height);
61	virtual	void				ValueChanged();
62	virtual void				MessageReceived(BMessage* message);
63
64	virtual	void				Decrement() = 0;
65	virtual	void				Increment() = 0;
66	virtual	void				MakeFocus(bool focus = true);
67	virtual	void				ResizeToPreferred();
68	virtual	void				SetFlags(uint32 flags);
69	virtual	void				WindowActivated(bool active);
70
71			alignment			Alignment() const { return fAlignment; };
72	virtual	void				SetAlignment(alignment align);
73
74	spinner_button_style		ButtonStyle() const { return fButtonStyle; };
75	virtual	void				SetButtonStyle(spinner_button_style buttonStyle);
76
77			float				Divider() const { return fDivider; };
78	virtual	void				SetDivider(float position);
79
80	virtual	void				SetEnabled(bool enable);
81
82	virtual	void				SetLabel(const char* label);
83
84	virtual	void				SetValueFromText() = 0;
85
86			bool				IsDecrementEnabled() const;
87	virtual	void				SetDecrementEnabled(bool enable);
88
89			bool				IsIncrementEnabled() const;
90	virtual	void				SetIncrementEnabled(bool enable);
91
92	virtual	BSize				MinSize();
93	virtual	BSize				MaxSize();
94	virtual	BSize				PreferredSize();
95	virtual	BAlignment			LayoutAlignment();
96
97			BLayoutItem*		CreateLabelLayoutItem();
98			BLayoutItem*		CreateTextViewLayoutItem();
99
100			BTextView*			TextView() const;
101
102private:
103	// FBC padding
104	virtual	void				_ReservedAbstractSpinner20();
105	virtual	void				_ReservedAbstractSpinner19();
106	virtual	void				_ReservedAbstractSpinner18();
107	virtual	void				_ReservedAbstractSpinner17();
108	virtual	void				_ReservedAbstractSpinner16();
109	virtual	void				_ReservedAbstractSpinner15();
110	virtual	void				_ReservedAbstractSpinner14();
111	virtual	void				_ReservedAbstractSpinner13();
112	virtual	void				_ReservedAbstractSpinner12();
113	virtual	void				_ReservedAbstractSpinner11();
114	virtual	void				_ReservedAbstractSpinner10();
115	virtual	void				_ReservedAbstractSpinner9();
116	virtual	void				_ReservedAbstractSpinner8();
117	virtual	void				_ReservedAbstractSpinner7();
118	virtual	void				_ReservedAbstractSpinner6();
119	virtual	void				_ReservedAbstractSpinner5();
120	virtual	void				_ReservedAbstractSpinner4();
121	virtual	void				_ReservedAbstractSpinner3();
122	virtual	void				_ReservedAbstractSpinner2();
123	virtual	void				_ReservedAbstractSpinner1();
124
125protected:
126	virtual	status_t			AllArchived(BMessage* into) const;
127	virtual	status_t			AllUnarchived(const BMessage* from);
128
129	virtual	void				LayoutInvalidated(bool descendants);
130	virtual	void				DoLayout();
131
132private:
133	class LabelLayoutItem;
134	class TextViewLayoutItem;
135	struct LayoutData;
136
137	friend class SpinnerButton;
138	friend class SpinnerTextView;
139
140	friend class LabelLayoutItem;
141	friend class TextViewLayoutItem;
142	friend struct LayoutData;
143
144			void				_DrawLabel(BRect updateRect);
145			void				_DrawTextView(BRect updateRect);
146			void				_InitObject();
147			void				_LayoutTextView();
148			void				_UpdateFrame();
149			void				_UpdateTextViewColors(bool enable);
150			void				_ValidateLayoutData();
151
152			BAbstractSpinner&	operator=(const BAbstractSpinner& other);
153
154			alignment			fAlignment;
155	spinner_button_style		fButtonStyle;
156			float				fDivider;
157
158			LayoutData*			fLayoutData;
159
160			SpinnerTextView*	fTextView;
161			SpinnerButton*		fIncrement;
162			SpinnerButton*		fDecrement;
163
164	// FBC padding
165			uint32				_reserved[20];
166};
167
168
169#endif	// _ABSTRACT_SPINNER_H
170