xref: /haiku/src/kits/interface/Spinner.cpp (revision 0464fca49a7a811c0352ecff49ebe918660221f9)
1adba4ce9SJohn Scipione /*
2a0ba79fbSJohn Scipione  * Copyright 2015 Haiku, Inc. All rights reserved.
3adba4ce9SJohn Scipione  * Distributed under the terms of the MIT license.
4adba4ce9SJohn Scipione  *
5adba4ce9SJohn Scipione  * Authors:
6adba4ce9SJohn Scipione  *		John Scipione, jscipione@gmail.com
7adba4ce9SJohn Scipione  */
8adba4ce9SJohn Scipione 
9adba4ce9SJohn Scipione 
10a0ba79fbSJohn Scipione #include <Spinner.h>
11adba4ce9SJohn Scipione 
12a0ba79fbSJohn Scipione #include <stdint.h>
13adba4ce9SJohn Scipione #include <stdlib.h>
14adba4ce9SJohn Scipione 
15adba4ce9SJohn Scipione #include <PropertyInfo.h>
16a0ba79fbSJohn Scipione #include <String.h>
17adba4ce9SJohn Scipione #include <TextView.h>
18adba4ce9SJohn Scipione 
19adba4ce9SJohn Scipione 
20adba4ce9SJohn Scipione static property_info sProperties[] = {
21adba4ce9SJohn Scipione 	{
22adba4ce9SJohn Scipione 		"MaxValue",
23adba4ce9SJohn Scipione 		{ B_GET_PROPERTY, 0 },
24adba4ce9SJohn Scipione 		{ B_DIRECT_SPECIFIER, 0 },
25adba4ce9SJohn Scipione 		"Returns the maximum value of the spinner.",
26adba4ce9SJohn Scipione 		0,
27a0ba79fbSJohn Scipione 		{ B_INT32_TYPE }
28adba4ce9SJohn Scipione 	},
29adba4ce9SJohn Scipione 	{
30adba4ce9SJohn Scipione 		"MaxValue",
31adba4ce9SJohn Scipione 		{ B_SET_PROPERTY, 0 },
32adba4ce9SJohn Scipione 		{ B_DIRECT_SPECIFIER, 0},
33adba4ce9SJohn Scipione 		"Sets the maximum value of the spinner.",
34adba4ce9SJohn Scipione 		0,
35a0ba79fbSJohn Scipione 		{ B_INT32_TYPE }
36adba4ce9SJohn Scipione 	},
37adba4ce9SJohn Scipione 
38adba4ce9SJohn Scipione 	{
39adba4ce9SJohn Scipione 		"MinValue",
40adba4ce9SJohn Scipione 		{ B_GET_PROPERTY, 0 },
41adba4ce9SJohn Scipione 		{ B_DIRECT_SPECIFIER, 0 },
42adba4ce9SJohn Scipione 		"Returns the minimum value of the spinner.",
43adba4ce9SJohn Scipione 		0,
44a0ba79fbSJohn Scipione 		{ B_INT32_TYPE }
45adba4ce9SJohn Scipione 	},
46adba4ce9SJohn Scipione 	{
47adba4ce9SJohn Scipione 		"MinValue",
48adba4ce9SJohn Scipione 		{ B_SET_PROPERTY, 0 },
49adba4ce9SJohn Scipione 		{ B_DIRECT_SPECIFIER, 0},
50adba4ce9SJohn Scipione 		"Sets the minimum value of the spinner.",
51adba4ce9SJohn Scipione 		0,
52a0ba79fbSJohn Scipione 		{ B_INT32_TYPE }
53adba4ce9SJohn Scipione 	},
54adba4ce9SJohn Scipione 
55adba4ce9SJohn Scipione 	{
56adba4ce9SJohn Scipione 		"Value",
57adba4ce9SJohn Scipione 		{ B_GET_PROPERTY, 0 },
58adba4ce9SJohn Scipione 		{ B_DIRECT_SPECIFIER, 0 },
59adba4ce9SJohn Scipione 		"Returns the value of the spinner.",
60adba4ce9SJohn Scipione 		0,
61a0ba79fbSJohn Scipione 		{ B_INT32_TYPE }
62adba4ce9SJohn Scipione 	},
63adba4ce9SJohn Scipione 	{
64adba4ce9SJohn Scipione 		"Value",
65adba4ce9SJohn Scipione 		{ B_SET_PROPERTY, 0 },
66adba4ce9SJohn Scipione 		{ B_DIRECT_SPECIFIER, 0},
67adba4ce9SJohn Scipione 		"Sets the value of the spinner.",
68adba4ce9SJohn Scipione 		0,
69a0ba79fbSJohn Scipione 		{ B_INT32_TYPE }
70adba4ce9SJohn Scipione 	},
71adba4ce9SJohn Scipione 
72adba4ce9SJohn Scipione 	{ 0 }
73adba4ce9SJohn Scipione };
74adba4ce9SJohn Scipione 
75adba4ce9SJohn Scipione 
76adba4ce9SJohn Scipione //	#pragma mark - BSpinner
77adba4ce9SJohn Scipione 
78adba4ce9SJohn Scipione 
BSpinner(BRect frame,const char * name,const char * label,BMessage * message,uint32 resizingMode,uint32 flags)79adba4ce9SJohn Scipione BSpinner::BSpinner(BRect frame, const char* name, const char* label,
80adba4ce9SJohn Scipione 	BMessage* message, uint32 resizingMode, uint32 flags)
81adba4ce9SJohn Scipione 	:
82a0ba79fbSJohn Scipione 	BAbstractSpinner(frame, name, label, message, resizingMode, flags)
83adba4ce9SJohn Scipione {
84adba4ce9SJohn Scipione 	_InitObject();
85adba4ce9SJohn Scipione }
86adba4ce9SJohn Scipione 
87adba4ce9SJohn Scipione 
BSpinner(const char * name,const char * label,BMessage * message,uint32 flags)88a0ba79fbSJohn Scipione BSpinner::BSpinner(const char* name, const char* label,
89a0ba79fbSJohn Scipione 	BMessage* message, uint32 flags)
90adba4ce9SJohn Scipione 	:
91a0ba79fbSJohn Scipione 	BAbstractSpinner(name, label, message, flags)
92adba4ce9SJohn Scipione {
93adba4ce9SJohn Scipione 	_InitObject();
94adba4ce9SJohn Scipione }
95adba4ce9SJohn Scipione 
96adba4ce9SJohn Scipione 
BSpinner(BMessage * data)97adba4ce9SJohn Scipione BSpinner::BSpinner(BMessage* data)
98adba4ce9SJohn Scipione 	:
99a0ba79fbSJohn Scipione 	BAbstractSpinner(data)
100adba4ce9SJohn Scipione {
101adba4ce9SJohn Scipione 	_InitObject();
102adba4ce9SJohn Scipione 
103a0ba79fbSJohn Scipione 	if (data->FindInt32("_min", &fMinValue) != B_OK)
104a0ba79fbSJohn Scipione 		fMinValue = INT32_MIN;
105adba4ce9SJohn Scipione 
1065973288eSJohn Scipione 	if (data->FindInt32("_max", &fMaxValue) != B_OK)
1075973288eSJohn Scipione 		fMaxValue = INT32_MAX;
108adba4ce9SJohn Scipione }
109adba4ce9SJohn Scipione 
110adba4ce9SJohn Scipione 
~BSpinner()111adba4ce9SJohn Scipione BSpinner::~BSpinner()
112adba4ce9SJohn Scipione {
113adba4ce9SJohn Scipione }
114adba4ce9SJohn Scipione 
115adba4ce9SJohn Scipione 
116adba4ce9SJohn Scipione BArchivable*
Instantiate(BMessage * data)117adba4ce9SJohn Scipione BSpinner::Instantiate(BMessage* data)
118adba4ce9SJohn Scipione {
119adba4ce9SJohn Scipione 	if (validate_instantiation(data, "Spinner"))
120adba4ce9SJohn Scipione 		return new BSpinner(data);
121adba4ce9SJohn Scipione 
122adba4ce9SJohn Scipione 	return NULL;
123adba4ce9SJohn Scipione }
124adba4ce9SJohn Scipione 
125adba4ce9SJohn Scipione 
126adba4ce9SJohn Scipione status_t
Archive(BMessage * data,bool deep) const127adba4ce9SJohn Scipione BSpinner::Archive(BMessage* data, bool deep) const
128adba4ce9SJohn Scipione {
129a0ba79fbSJohn Scipione 	status_t status = BAbstractSpinner::Archive(data, deep);
130adba4ce9SJohn Scipione 	data->AddString("class", "Spinner");
131adba4ce9SJohn Scipione 
132adba4ce9SJohn Scipione 	if (status == B_OK)
1333705d40cSJohn Scipione 		status = data->AddInt32("_min", fMinValue);
134adba4ce9SJohn Scipione 
135adba4ce9SJohn Scipione 	if (status == B_OK)
1363705d40cSJohn Scipione 		status = data->AddInt32("_max", fMaxValue);
137adba4ce9SJohn Scipione 
138adba4ce9SJohn Scipione 	return status;
139adba4ce9SJohn Scipione }
140adba4ce9SJohn Scipione 
141adba4ce9SJohn Scipione 
142adba4ce9SJohn Scipione status_t
GetSupportedSuites(BMessage * message)143adba4ce9SJohn Scipione BSpinner::GetSupportedSuites(BMessage* message)
144adba4ce9SJohn Scipione {
145a0ba79fbSJohn Scipione 	message->AddString("suites", "suite/vnd.Haiku-intenger-spinner");
146adba4ce9SJohn Scipione 
147adba4ce9SJohn Scipione 	BPropertyInfo prop_info(sProperties);
148adba4ce9SJohn Scipione 	message->AddFlat("messages", &prop_info);
149adba4ce9SJohn Scipione 
150adba4ce9SJohn Scipione 	return BView::GetSupportedSuites(message);
151adba4ce9SJohn Scipione }
152adba4ce9SJohn Scipione 
153adba4ce9SJohn Scipione 
154adba4ce9SJohn Scipione void
AttachedToWindow()155adba4ce9SJohn Scipione BSpinner::AttachedToWindow()
156adba4ce9SJohn Scipione {
1578cc8ec9eSPulkoMandy 	SetValue(Value());
158adba4ce9SJohn Scipione 
159a0ba79fbSJohn Scipione 	BAbstractSpinner::AttachedToWindow();
160a9385e8eSJohn Scipione }
161a9385e8eSJohn Scipione 
162a9385e8eSJohn Scipione 
163d1229383SJohn Scipione void
Decrement()164d1229383SJohn Scipione BSpinner::Decrement()
165d1229383SJohn Scipione {
166a0ba79fbSJohn Scipione 	SetValue(Value() - 1);
167d1229383SJohn Scipione }
168d1229383SJohn Scipione 
169d1229383SJohn Scipione 
170d1229383SJohn Scipione void
Increment()171d1229383SJohn Scipione BSpinner::Increment()
172d1229383SJohn Scipione {
173a0ba79fbSJohn Scipione 	SetValue(Value() + 1);
174adba4ce9SJohn Scipione }
175adba4ce9SJohn Scipione 
176adba4ce9SJohn Scipione 
177adba4ce9SJohn Scipione void
SetEnabled(bool enable)178adba4ce9SJohn Scipione BSpinner::SetEnabled(bool enable)
179adba4ce9SJohn Scipione {
180adba4ce9SJohn Scipione 	if (IsEnabled() == enable)
181adba4ce9SJohn Scipione 		return;
182adba4ce9SJohn Scipione 
183a0ba79fbSJohn Scipione 	SetIncrementEnabled(enable && Value() < fMaxValue);
184a0ba79fbSJohn Scipione 	SetDecrementEnabled(enable && Value() > fMinValue);
185adba4ce9SJohn Scipione 
186a0ba79fbSJohn Scipione 	BAbstractSpinner::SetEnabled(enable);
187adba4ce9SJohn Scipione }
188adba4ce9SJohn Scipione 
189adba4ce9SJohn Scipione 
190adba4ce9SJohn Scipione void
SetMinValue(int32 min)191a0ba79fbSJohn Scipione BSpinner::SetMinValue(int32 min)
192adba4ce9SJohn Scipione {
193adba4ce9SJohn Scipione 	fMinValue = min;
194de1e2d92SHumdinger 	SetValue(Value());
195adba4ce9SJohn Scipione }
196adba4ce9SJohn Scipione 
197adba4ce9SJohn Scipione 
198adba4ce9SJohn Scipione void
SetMaxValue(int32 max)1993705d40cSJohn Scipione BSpinner::SetMaxValue(int32 max)
2003705d40cSJohn Scipione {
2013705d40cSJohn Scipione 	fMaxValue = max;
202de1e2d92SHumdinger 	SetValue(Value());
2033705d40cSJohn Scipione }
2043705d40cSJohn Scipione 
2053705d40cSJohn Scipione 
2063705d40cSJohn Scipione void
Range(int32 * min,int32 * max)207a0ba79fbSJohn Scipione BSpinner::Range(int32* min, int32* max)
208adba4ce9SJohn Scipione {
209adba4ce9SJohn Scipione 	*min = fMinValue;
210adba4ce9SJohn Scipione 	*max = fMaxValue;
211adba4ce9SJohn Scipione }
212adba4ce9SJohn Scipione 
213adba4ce9SJohn Scipione 
214adba4ce9SJohn Scipione void
SetRange(int32 min,int32 max)215a0ba79fbSJohn Scipione BSpinner::SetRange(int32 min, int32 max)
216adba4ce9SJohn Scipione {
217adba4ce9SJohn Scipione 	SetMinValue(min);
218adba4ce9SJohn Scipione 	SetMaxValue(max);
219adba4ce9SJohn Scipione }
220adba4ce9SJohn Scipione 
221adba4ce9SJohn Scipione 
222adba4ce9SJohn Scipione void
SetValue(int32 value)223a0ba79fbSJohn Scipione BSpinner::SetValue(int32 value)
224adba4ce9SJohn Scipione {
225adba4ce9SJohn Scipione 	// clip to range
226adba4ce9SJohn Scipione 	if (value < fMinValue)
227adba4ce9SJohn Scipione 		value = fMinValue;
228adba4ce9SJohn Scipione 	else if (value > fMaxValue)
229adba4ce9SJohn Scipione 		value = fMaxValue;
230adba4ce9SJohn Scipione 
231adba4ce9SJohn Scipione 	// update the text view
232a0ba79fbSJohn Scipione 	BString valueString;
233a0ba79fbSJohn Scipione 	valueString << value;
234a0ba79fbSJohn Scipione 	TextView()->SetText(valueString.String());
235adba4ce9SJohn Scipione 
236adba4ce9SJohn Scipione 	// update the up and down arrows
237adba4ce9SJohn Scipione 	SetIncrementEnabled(IsEnabled() && value < fMaxValue);
238adba4ce9SJohn Scipione 	SetDecrementEnabled(IsEnabled() && value > fMinValue);
239adba4ce9SJohn Scipione 
2408cc8ec9eSPulkoMandy 	if (value == Value())
241adba4ce9SJohn Scipione 		return;
242adba4ce9SJohn Scipione 
2438cc8ec9eSPulkoMandy 	BControl::SetValue(value);
244*0464fca4SMáximo Castañeda 	((int32*)_reserved)[0] = Value();
245*0464fca4SMáximo Castañeda 
246adba4ce9SJohn Scipione 	ValueChanged();
247d1229383SJohn Scipione 
248d1229383SJohn Scipione 	Invoke();
249d1229383SJohn Scipione 	Invalidate();
250adba4ce9SJohn Scipione }
251adba4ce9SJohn Scipione 
252adba4ce9SJohn Scipione 
253d1229383SJohn Scipione void
SetValueFromText()254d1229383SJohn Scipione BSpinner::SetValueFromText()
255d1229383SJohn Scipione {
256a0ba79fbSJohn Scipione 	SetValue(atol(TextView()->Text()));
257adba4ce9SJohn Scipione }
258adba4ce9SJohn Scipione 
259adba4ce9SJohn Scipione 
260adba4ce9SJohn Scipione //	#pragma mark - BSpinner private methods
261adba4ce9SJohn Scipione 
262adba4ce9SJohn Scipione 
263adba4ce9SJohn Scipione void
_InitObject()264adba4ce9SJohn Scipione BSpinner::_InitObject()
265adba4ce9SJohn Scipione {
2665973288eSJohn Scipione 	fMinValue = INT32_MIN;
2675973288eSJohn Scipione 	fMaxValue = INT32_MAX;
268adba4ce9SJohn Scipione 
269a0ba79fbSJohn Scipione 	TextView()->SetAlignment(B_ALIGN_RIGHT);
270a0ba79fbSJohn Scipione 	for (uint32 c = 0; c <= 42; c++)
271a0ba79fbSJohn Scipione 		TextView()->DisallowChar(c);
272adba4ce9SJohn Scipione 
273a0ba79fbSJohn Scipione 	TextView()->DisallowChar(',');
274adba4ce9SJohn Scipione 
275a0ba79fbSJohn Scipione 	for (uint32 c = 46; c <= 47; c++)
276a0ba79fbSJohn Scipione 		TextView()->DisallowChar(c);
277adba4ce9SJohn Scipione 
278a0ba79fbSJohn Scipione 	for (uint32 c = 58; c <= 127; c++)
279a0ba79fbSJohn Scipione 		TextView()->DisallowChar(c);
280adba4ce9SJohn Scipione }
281adba4ce9SJohn Scipione 
282adba4ce9SJohn Scipione 
283adba4ce9SJohn Scipione // FBC padding
284adba4ce9SJohn Scipione 
_ReservedSpinner20()285adba4ce9SJohn Scipione void BSpinner::_ReservedSpinner20() {}
_ReservedSpinner19()286adba4ce9SJohn Scipione void BSpinner::_ReservedSpinner19() {}
_ReservedSpinner18()287adba4ce9SJohn Scipione void BSpinner::_ReservedSpinner18() {}
_ReservedSpinner17()288adba4ce9SJohn Scipione void BSpinner::_ReservedSpinner17() {}
_ReservedSpinner16()289adba4ce9SJohn Scipione void BSpinner::_ReservedSpinner16() {}
_ReservedSpinner15()290adba4ce9SJohn Scipione void BSpinner::_ReservedSpinner15() {}
_ReservedSpinner14()291adba4ce9SJohn Scipione void BSpinner::_ReservedSpinner14() {}
_ReservedSpinner13()292adba4ce9SJohn Scipione void BSpinner::_ReservedSpinner13() {}
_ReservedSpinner12()293adba4ce9SJohn Scipione void BSpinner::_ReservedSpinner12() {}
_ReservedSpinner11()294adba4ce9SJohn Scipione void BSpinner::_ReservedSpinner11() {}
_ReservedSpinner10()295adba4ce9SJohn Scipione void BSpinner::_ReservedSpinner10() {}
_ReservedSpinner9()296adba4ce9SJohn Scipione void BSpinner::_ReservedSpinner9() {}
_ReservedSpinner8()297adba4ce9SJohn Scipione void BSpinner::_ReservedSpinner8() {}
_ReservedSpinner7()298adba4ce9SJohn Scipione void BSpinner::_ReservedSpinner7() {}
_ReservedSpinner6()299adba4ce9SJohn Scipione void BSpinner::_ReservedSpinner6() {}
_ReservedSpinner5()300adba4ce9SJohn Scipione void BSpinner::_ReservedSpinner5() {}
_ReservedSpinner4()301adba4ce9SJohn Scipione void BSpinner::_ReservedSpinner4() {}
_ReservedSpinner3()302adba4ce9SJohn Scipione void BSpinner::_ReservedSpinner3() {}
_ReservedSpinner2()303adba4ce9SJohn Scipione void BSpinner::_ReservedSpinner2() {}
_ReservedSpinner1()304adba4ce9SJohn Scipione void BSpinner::_ReservedSpinner1() {}
305