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