2 * Copyright 2002-2009, Haiku, Inc. All rights reserved.
3 * Distributed under the terms of the MIT license.
5 * Copyright 1999, Be Incorporated. All Rights Reserved.
6 * This file may be used under the terms of the Be Sample Code License.
8 * Written by: Daniel Switkin
12 #include "ConfigView.h"
15 #include "PrefsWindow.h"
19 #include <RadioButton.h>
20 #include <TextControl.h>
27 #undef B_TRANSLATION_CONTEXT
28 #define B_TRANSLATION_CONTEXT "ConfigView"
31 RTColorControl::RTColorControl(BPoint point
, BMessage
*message
)
32 : BColorControl(point
, B_CELLS_32x8
, 6, "ColorControl", message
, false)
38 Send a message every time the color changes, not just
39 when the mouse button is released
42 RTColorControl::SetValue(int32 color
)
44 BColorControl::SetValue(color
);
53 A single class for all three prefs views, needs to be
54 customized below to give each control the right message
56 ConfigView::ConfigView(BRect rect
, const char *name
, uint32 mode
, BMessenger
& target
,
58 : BBox(rect
, name
, B_FOLLOW_NONE
, B_WILL_DRAW
),
62 fFirstTimeAttached(true)
65 fActiveButton
= fIdleButton
= fFrameButton
= NULL
;
66 fIconWidthControl
= NULL
;
68 SetLabel(B_TRANSLATE("Bar colors"));
70 font_height fontHeight
;
71 be_bold_font
->GetHeight(&fontHeight
);
73 fColorControl
= new RTColorControl(BPoint(10, 5.0f
+ fontHeight
.ascent
74 + fontHeight
.descent
), new BMessage(fMode
));
75 fColorControl
->ResizeToPreferred();
76 AddChild(fColorControl
);
78 rect
= fColorControl
->Frame();
79 rect
.top
= rect
.bottom
+ 10.0f
;
80 rect
.bottom
= rect
.top
+ 15.0f
;
82 if (mode
== PRV_NORMAL_CHANGE_COLOR
) {
85 fFadeCheckBox
= new BCheckBox(rect
, "FadeColors",
86 B_TRANSLATE("Fade colors"), new BMessage(PRV_NORMAL_FADE_COLORS
));
87 fFadeCheckBox
->ResizeToPreferred();
88 AddChild(fFadeCheckBox
);
90 fColorControl
->SetValue(fPrefs
->normal_bar_color
);
91 fFadeCheckBox
->SetValue(fPrefs
->normal_fade_colors
);
92 } else if (mode
== PRV_MINI_CHANGE_COLOR
) {
95 fActiveButton
= new BRadioButton(rect
, "ActiveColor",
96 B_TRANSLATE("Active color"), new BMessage(PRV_MINI_ACTIVE
));
97 fActiveButton
->ResizeToPreferred();
98 fActiveButton
->SetValue(B_CONTROL_ON
);
99 AddChild(fActiveButton
);
101 rect
.left
= fActiveButton
->Frame().right
+ 5.0f
;
102 fIdleButton
= new BRadioButton(rect
, "IdleColor",
103 B_TRANSLATE("Idle color"), new BMessage(PRV_MINI_IDLE
));
104 fIdleButton
->ResizeToPreferred();
105 AddChild(fIdleButton
);
107 rect
.left
= fIdleButton
->Frame().right
+ 5.0f
;
108 fFrameButton
= new BRadioButton(rect
, "FrameColor",
109 B_TRANSLATE("Frame color"), new BMessage(PRV_MINI_FRAME
));
110 fFrameButton
->ResizeToPreferred();
111 AddChild(fFrameButton
);
113 fColorControl
->SetValue(fPrefs
->mini_active_color
);
116 fActiveButton
= new BRadioButton(rect
, "ActiveColor",
117 B_TRANSLATE("Active color"), new BMessage(PRV_DESKBAR_ACTIVE
));
118 fActiveButton
->ResizeToPreferred();
119 fActiveButton
->SetValue(B_CONTROL_ON
);
120 AddChild(fActiveButton
);
122 rect
.left
= fActiveButton
->Frame().right
+ 5.0f
;
123 fIdleButton
= new BRadioButton(rect
, "IdleColor",
124 B_TRANSLATE("Idle color"), new BMessage(PRV_DESKBAR_IDLE
));
125 fIdleButton
->ResizeToPreferred();
126 AddChild(fIdleButton
);
128 rect
.left
= fIdleButton
->Frame().right
+ 5.0f
;
129 fFrameButton
= new BRadioButton(rect
, "FrameColor",
130 B_TRANSLATE("Frame color"), new BMessage(PRV_DESKBAR_FRAME
));
131 fFrameButton
->ResizeToPreferred();
132 AddChild(fFrameButton
);
134 rect
.left
= fColorControl
->Frame().left
;
135 rect
.top
= fActiveButton
->Frame().bottom
+ 5.0f
;
138 snprintf(temp
, sizeof(temp
), "%d", fPrefs
->deskbar_icon_width
);
139 fIconWidthControl
= new BTextControl(rect
, "Width",
140 B_TRANSLATE("Width of icon:"), temp
,
141 new BMessage(PRV_DESKBAR_ICON_WIDTH
));
142 AddChild(fIconWidthControl
);
143 fIconWidthControl
->SetDivider(be_plain_font
->StringWidth(
144 fIconWidthControl
->Label()) + 5.0f
);
146 for (int c
= 0; c
< 256; c
++) {
148 fIconWidthControl
->TextView()->DisallowChar(c
);
150 fIconWidthControl
->TextView()->SetMaxBytes(2);
153 fIconWidthControl
->GetPreferredSize(&width
, &height
);
154 fIconWidthControl
->ResizeTo(fIconWidthControl
->Divider() + 32.0f
155 + fIconWidthControl
->StringWidth("999"), height
);
157 fColorControl
->SetValue(fPrefs
->deskbar_active_color
);
163 ConfigView::GetPreferredSize(float* _width
, float* _height
)
167 if (fMode
== PRV_NORMAL_CHANGE_COLOR
) {
169 bottom
= fFadeCheckBox
->Frame().bottom
;
170 right
= fFadeCheckBox
->Frame().right
;
171 } else if (fMode
== PRV_MINI_CHANGE_COLOR
) {
173 bottom
= fIdleButton
->Frame().bottom
;
174 right
= fFrameButton
->Frame().right
;
177 bottom
= fIconWidthControl
->Frame().bottom
;
178 right
= fFrameButton
->Frame().right
;
181 if (right
< fColorControl
->Frame().right
)
182 right
= fColorControl
->Frame().right
;
187 *_width
= right
+ 10.0f
;
189 *_height
= bottom
+ 8.0f
;
194 ConfigView::AttachedToWindow()
196 BView::AttachedToWindow();
198 // AttachedToWindow() gets called every time this tab is brought
199 // to the front, but we only want this initialization to happen once
200 if (fFirstTimeAttached
) {
203 if (Parent() == NULL
)
204 SetViewUIColor(B_PANEL_BACKGROUND_COLOR
);
206 BMessenger
messenger(this);
207 fColorControl
->SetTarget(messenger
);
208 if (fFadeCheckBox
!= NULL
)
209 fFadeCheckBox
->SetTarget(messenger
);
210 if (fActiveButton
!= NULL
)
211 fActiveButton
->SetTarget(messenger
);
212 if (fIdleButton
!= NULL
)
213 fIdleButton
->SetTarget(messenger
);
214 if (fFrameButton
!= NULL
)
215 fFrameButton
->SetTarget(messenger
);
216 if (fIconWidthControl
!= NULL
)
217 fIconWidthControl
->SetTarget(messenger
);
219 fFirstTimeAttached
= false;
225 ConfigView::MessageReceived(BMessage
*message
)
227 switch (message
->what
) {
228 // These two send the color and the status of the fade checkbox together
229 case PRV_NORMAL_FADE_COLORS
:
230 case PRV_NORMAL_CHANGE_COLOR
:
232 bool fade_colors
= (bool)fFadeCheckBox
->Value();
233 int32 bar_color
= fColorControl
->Value();
234 message
->AddInt32("color", bar_color
);
235 message
->AddBool("fade", fade_colors
);
236 fPrefs
->normal_fade_colors
= fade_colors
;
237 fPrefs
->normal_bar_color
= bar_color
;
239 fTarget
.SendMessage(message
);
242 // Share the single color control among three values
243 case PRV_MINI_ACTIVE
:
244 fColorControl
->SetValue(fPrefs
->mini_active_color
);
247 fColorControl
->SetValue(fPrefs
->mini_idle_color
);
250 fColorControl
->SetValue(fPrefs
->mini_frame_color
);
252 case PRV_MINI_CHANGE_COLOR
: {
253 int32 color
= fColorControl
->Value();
254 if (fActiveButton
->Value())
255 fPrefs
->mini_active_color
= color
;
256 else if (fIdleButton
->Value())
257 fPrefs
->mini_idle_color
= color
;
259 fPrefs
->mini_frame_color
= color
;
261 message
->AddInt32("active_color", fPrefs
->mini_active_color
);
262 message
->AddInt32("idle_color", fPrefs
->mini_idle_color
);
263 message
->AddInt32("frame_color", fPrefs
->mini_frame_color
);
264 fTarget
.SendMessage(message
);
267 case PRV_DESKBAR_ACTIVE
:
268 fColorControl
->SetValue(fPrefs
->deskbar_active_color
);
270 case PRV_DESKBAR_IDLE
:
271 fColorControl
->SetValue(fPrefs
->deskbar_idle_color
);
273 case PRV_DESKBAR_FRAME
:
274 fColorControl
->SetValue(fPrefs
->deskbar_frame_color
);
276 case PRV_DESKBAR_ICON_WIDTH
:
277 UpdateDeskbarIconWidth();
279 case PRV_DESKBAR_CHANGE_COLOR
: {
280 int32 color
= fColorControl
->Value();
281 if (fActiveButton
->Value())
282 fPrefs
->deskbar_active_color
= color
;
283 else if (fIdleButton
->Value())
284 fPrefs
->deskbar_idle_color
= color
;
286 fPrefs
->deskbar_frame_color
= color
;
288 message
->AddInt32("active_color", fPrefs
->deskbar_active_color
);
289 message
->AddInt32("idle_color", fPrefs
->deskbar_idle_color
);
290 message
->AddInt32("frame_color", fPrefs
->deskbar_frame_color
);
291 fTarget
.SendMessage(message
);
294 case PRV_BOTTOM_DEFAULTS
:
298 BView::MessageReceived(message
);
305 ConfigView::UpdateDeskbarIconWidth()
307 // Make sure the width shows at least one pixel per CPU and
308 // that it will fit in the tray in any Deskbar orientation
309 int width
= atoi(fIconWidthControl
->Text());
310 int min_width
= GetMinimumViewWidth();
311 if (width
< min_width
|| width
> 50) {
313 if (width
< min_width
) {
314 sprintf(temp
, "%d", min_width
);
320 fIconWidthControl
->SetText(temp
);
323 fPrefs
->deskbar_icon_width
= width
;
325 BMessage
message(PRV_DESKBAR_ICON_WIDTH
);
326 message
.AddInt32("width", width
);
327 fTarget
.SendMessage(&message
);
332 ConfigView::_ResetDefaults()
334 if (fMode
== PRV_NORMAL_CHANGE_COLOR
) {
335 fColorControl
->SetValue(DEFAULT_NORMAL_BAR_COLOR
);
336 fFadeCheckBox
->SetValue(DEFAULT_NORMAL_FADE_COLORS
);
337 } else if (fMode
== PRV_MINI_CHANGE_COLOR
) {
338 fPrefs
->mini_active_color
= DEFAULT_MINI_ACTIVE_COLOR
;
339 fPrefs
->mini_idle_color
= DEFAULT_MINI_IDLE_COLOR
;
340 fPrefs
->mini_frame_color
= DEFAULT_MINI_FRAME_COLOR
;
341 if (fActiveButton
->Value())
342 fColorControl
->SetValue(DEFAULT_MINI_ACTIVE_COLOR
);
343 else if (fIdleButton
->Value())
344 fColorControl
->SetValue(DEFAULT_MINI_IDLE_COLOR
);
346 fColorControl
->SetValue(DEFAULT_MINI_FRAME_COLOR
);
348 BMessage
*message
= new BMessage(PRV_MINI_CHANGE_COLOR
);
349 message
->AddInt32("active_color", DEFAULT_MINI_ACTIVE_COLOR
);
350 message
->AddInt32("idle_color", DEFAULT_MINI_IDLE_COLOR
);
351 message
->AddInt32("frame_color", DEFAULT_MINI_FRAME_COLOR
);
352 fTarget
.SendMessage(message
);
354 fPrefs
->deskbar_active_color
= DEFAULT_DESKBAR_ACTIVE_COLOR
;
355 fPrefs
->deskbar_idle_color
= DEFAULT_DESKBAR_IDLE_COLOR
;
356 fPrefs
->deskbar_frame_color
= DEFAULT_DESKBAR_FRAME_COLOR
;
357 if (fActiveButton
->Value())
358 fColorControl
->SetValue(DEFAULT_DESKBAR_ACTIVE_COLOR
);
359 else if (fIdleButton
->Value())
360 fColorControl
->SetValue(DEFAULT_DESKBAR_IDLE_COLOR
);
362 fColorControl
->SetValue(DEFAULT_DESKBAR_FRAME_COLOR
);
364 BMessage
*message
= new BMessage(PRV_DESKBAR_CHANGE_COLOR
);
365 message
->AddInt32("active_color", DEFAULT_DESKBAR_ACTIVE_COLOR
);
366 message
->AddInt32("idle_color", DEFAULT_DESKBAR_IDLE_COLOR
);
367 message
->AddInt32("frame_color", DEFAULT_DESKBAR_FRAME_COLOR
);
368 fTarget
.SendMessage(message
);
371 sprintf(temp
, "%d", DEFAULT_DESKBAR_ICON_WIDTH
);
372 fIconWidthControl
->SetText(temp
);
373 // Need to force the model message to be sent
374 fIconWidthControl
->Invoke();