xref: /haiku/src/apps/deskbar/PreferencesWindow.cpp (revision 820dca4df6c7bf955c46e8f6521b9408f50b2900)
1 /*
2  * Copyright 2009-2011 Haiku, Inc.
3  * All Rights Reserved. Distributed under the terms of the MIT License.
4  *
5  * Authors:
6  *		John Scipione, jscipione@gmail.com
7  *		Jonas Sundström, jonas@kirilla.com
8  */
9 
10 
11 #include "PreferencesWindow.h"
12 
13 #include <ctype.h>
14 
15 #include <Button.h>
16 #include <Catalog.h>
17 #include <CheckBox.h>
18 #include <ControlLook.h>
19 #include <FormattingConventions.h>
20 #include <GroupLayout.h>
21 #include <ListView.h>
22 #include <Locale.h>
23 #include <LayoutBuilder.h>
24 #include <OpenWithTracker.h>
25 #include <RadioButton.h>
26 #include <Roster.h>
27 #include <SeparatorView.h>
28 #include <Slider.h>
29 #include <TabView.h>
30 #include <TextControl.h>
31 #include <View.h>
32 
33 #include "BarApp.h"
34 #include "StatusView.h"
35 
36 
37 static const float kIndentSpacing
38 	= be_control_look->DefaultItemSpacing() * 2.3;
39 static const uint32 kSettingsViewChanged = 'Svch';
40 
41 
42 #undef B_TRANSLATION_CONTEXT
43 #define B_TRANSLATION_CONTEXT "PreferencesWindow"
44 
45 
46 PreferencesWindow::PreferencesWindow(BRect frame)
47 	:
48 	BWindow(frame, B_TRANSLATE("Deskbar preferences"), B_TITLED_WINDOW,
49 		B_NOT_RESIZABLE | B_AUTO_UPDATE_SIZE_LIMITS | B_NOT_ZOOMABLE)
50 {
51 	// Menu controls
52 	fMenuRecentDocuments = new BCheckBox(B_TRANSLATE("Recent documents:"),
53 		new BMessage(kUpdateRecentCounts));
54 	fMenuRecentApplications = new BCheckBox(B_TRANSLATE("Recent applications:"),
55 		new BMessage(kUpdateRecentCounts));
56 	fMenuRecentFolders = new BCheckBox(B_TRANSLATE("Recent folders:"),
57 		new BMessage(kUpdateRecentCounts));
58 
59 	fMenuRecentDocumentCount = new BTextControl(NULL, NULL,
60 		new BMessage(kUpdateRecentCounts));
61 	fMenuRecentApplicationCount = new BTextControl(NULL, NULL,
62 		new BMessage(kUpdateRecentCounts));
63 	fMenuRecentFolderCount = new BTextControl(NULL, NULL,
64 		new BMessage(kUpdateRecentCounts));
65 
66 	// Applications controls
67 	fAppsSort = new BCheckBox(B_TRANSLATE("Sort running applications"),
68 		new BMessage(kSortRunningApps));
69 	fAppsSortTrackerFirst = new BCheckBox(B_TRANSLATE("Tracker always first"),
70 		new BMessage(kTrackerFirst));
71 	fAppsShowExpanders = new BCheckBox(B_TRANSLATE("Show application expander"),
72 		new BMessage(kSuperExpando));
73 	fAppsExpandNew = new BCheckBox(B_TRANSLATE("Expand new applications"),
74 		new BMessage(kExpandNewTeams));
75 	fAppsHideLabels = new BCheckBox(B_TRANSLATE("Hide application names"),
76 		new BMessage(kHideLabels));
77 	fAppsIconSizeSlider = new BSlider("icon_size", B_TRANSLATE("Icon size"),
78 		NULL, kMinimumIconSize / kIconSizeInterval,
79 		kMaximumIconSize / kIconSizeInterval, B_HORIZONTAL);
80 	fAppsIconSizeSlider->SetHashMarks(B_HASH_MARKS_BOTTOM);
81 	fAppsIconSizeSlider->SetHashMarkCount((kMaximumIconSize - kMinimumIconSize)
82 		/ kIconSizeInterval + 1);
83 	fAppsIconSizeSlider->SetLimitLabels(B_TRANSLATE("Small"),
84 		B_TRANSLATE("Large"));
85 	fAppsIconSizeSlider->SetModificationMessage(new BMessage(kResizeTeamIcons));
86 
87 	// Window controls
88 	fWindowAlwaysOnTop = new BCheckBox(B_TRANSLATE("Always on top"),
89 		new BMessage(kAlwaysTop));
90 	fWindowAutoRaise = new BCheckBox(B_TRANSLATE("Auto-raise"),
91 		new BMessage(kAutoRaise));
92 	fWindowAutoHide = new BCheckBox(B_TRANSLATE("Auto-hide"),
93 		new BMessage(kAutoHide));
94 
95 	// Get settings from BarApp
96 	TBarApp* barApp = static_cast<TBarApp*>(be_app);
97 	desk_settings* settings = barApp->Settings();
98 
99 	// Menu settings
100 	BTextView* docTextView = fMenuRecentDocumentCount->TextView();
101 	BTextView* appTextView = fMenuRecentApplicationCount->TextView();
102 	BTextView* folderTextView = fMenuRecentFolderCount->TextView();
103 
104 	for (int32 i = 0; i < 256; i++) {
105 		if (!isdigit(i)) {
106 			docTextView->DisallowChar(i);
107 			appTextView->DisallowChar(i);
108 			folderTextView->DisallowChar(i);
109 		}
110 	}
111 
112 	docTextView->SetMaxBytes(4);
113 	appTextView->SetMaxBytes(4);
114 	folderTextView->SetMaxBytes(4);
115 
116 	int32 docCount = settings->recentDocsCount;
117 	int32 appCount = settings->recentAppsCount;
118 	int32 folderCount = settings->recentFoldersCount;
119 
120 	fMenuRecentDocuments->SetValue(settings->recentDocsEnabled);
121 	fMenuRecentDocumentCount->SetEnabled(settings->recentDocsEnabled);
122 
123 	fMenuRecentApplications->SetValue(settings->recentAppsEnabled);
124 	fMenuRecentApplicationCount->SetEnabled(settings->recentAppsEnabled);
125 
126 	fMenuRecentFolders->SetValue(settings->recentFoldersEnabled);
127 	fMenuRecentFolderCount->SetEnabled(settings->recentFoldersEnabled);
128 
129 	BString docString;
130 	BString appString;
131 	BString folderString;
132 
133 	docString << docCount;
134 	appString << appCount;
135 	folderString << folderCount;
136 
137 	fMenuRecentDocumentCount->SetText(docString.String());
138 	fMenuRecentApplicationCount->SetText(appString.String());
139 	fMenuRecentFolderCount->SetText(folderString.String());
140 
141 	// Applications settings
142 	fAppsSort->SetValue(settings->sortRunningApps);
143 	fAppsSortTrackerFirst->SetValue(settings->trackerAlwaysFirst);
144 	fAppsShowExpanders->SetValue(settings->superExpando);
145 	fAppsExpandNew->SetValue(settings->expandNewTeams);
146 	fAppsHideLabels->SetValue(settings->hideLabels);
147 	fAppsIconSizeSlider->SetValue(settings->iconSize / kIconSizeInterval);
148 
149 	// Window settings
150 	fWindowAlwaysOnTop->SetValue(settings->alwaysOnTop);
151 	fWindowAutoRaise->SetValue(settings->autoRaise);
152 	fWindowAutoHide->SetValue(settings->autoHide);
153 
154 	EnableDisableDependentItems();
155 
156 	// Targets
157 	fAppsSort->SetTarget(be_app);
158 	fAppsSortTrackerFirst->SetTarget(be_app);
159 	fAppsExpandNew->SetTarget(be_app);
160 	fAppsHideLabels->SetTarget(be_app);
161 	fAppsIconSizeSlider->SetTarget(be_app);
162 
163 	fWindowAlwaysOnTop->SetTarget(be_app);
164 	fWindowAutoRaise->SetTarget(be_app);
165 	fWindowAutoHide->SetTarget(be_app);
166 
167 	// Layout
168 	BView* menuSettingsView = BLayoutBuilder::Group<>()
169 		.AddGroup(B_VERTICAL, 0)
170 			.AddGroup(B_HORIZONTAL, 0)
171 				.AddGroup(B_VERTICAL, 0)
172 					.Add(fMenuRecentDocuments)
173 					.Add(fMenuRecentFolders)
174 					.Add(fMenuRecentApplications)
175 					.End()
176 				.AddGroup(B_VERTICAL, 0)
177 					.Add(fMenuRecentDocumentCount)
178 					.Add(fMenuRecentFolderCount)
179 					.Add(fMenuRecentApplicationCount)
180 					.End()
181 				.End()
182 			.AddGroup(B_VERTICAL, 0)
183 				.SetInsets(0, B_USE_DEFAULT_SPACING, 0, 0)
184 				.Add(new BButton(B_TRANSLATE("Edit menu" B_UTF8_ELLIPSIS),
185 					new BMessage(kEditMenuInTracker)))
186 				.End()
187 			.AddGlue()
188 			.SetInsets(B_USE_DEFAULT_SPACING, B_USE_DEFAULT_SPACING,
189 				B_USE_DEFAULT_SPACING, B_USE_DEFAULT_SPACING)
190 			.End()
191 		.View();
192 	menuSettingsView->SetName(B_TRANSLATE("Menu"));
193 
194 	BView* applicationsSettingsView = BLayoutBuilder::Group<>()
195 		.AddGroup(B_VERTICAL, 0)
196 			.Add(fAppsSort)
197 			.Add(fAppsSortTrackerFirst)
198 			.Add(fAppsShowExpanders)
199 			.AddGroup(B_HORIZONTAL, 0)
200 				.SetInsets(kIndentSpacing, 0, 0, 0)
201 				.Add(fAppsExpandNew)
202 				.End()
203 			.Add(fAppsHideLabels)
204 			.AddGroup(B_HORIZONTAL, 0)
205 				.SetInsets(0, B_USE_DEFAULT_SPACING, 0, 0)
206 				.Add(fAppsIconSizeSlider)
207 				.End()
208 			.AddGlue()
209 			.SetInsets(B_USE_DEFAULT_SPACING, B_USE_DEFAULT_SPACING,
210 				B_USE_DEFAULT_SPACING, B_USE_DEFAULT_SPACING)
211 			.End()
212 		.View();
213 	applicationsSettingsView->SetName(B_TRANSLATE("Applications"));
214 
215 	BView* windowSettingsView = BLayoutBuilder::Group<>()
216 		.AddGroup(B_VERTICAL, 0)
217 			.Add(fWindowAlwaysOnTop)
218 			.Add(fWindowAutoRaise)
219 			.Add(fWindowAutoHide)
220 			.AddGlue()
221 			.SetInsets(B_USE_DEFAULT_SPACING, B_USE_DEFAULT_SPACING,
222 				B_USE_DEFAULT_SPACING, B_USE_DEFAULT_SPACING)
223 			.End()
224 		.View();
225 	windowSettingsView->SetName(B_TRANSLATE("Window"));
226 
227 	BTabView* tabView = new BTabView("tabview", B_WIDTH_FROM_LABEL);
228 	tabView->AddTab(menuSettingsView);
229 	tabView->AddTab(applicationsSettingsView);
230 	tabView->AddTab(windowSettingsView);
231 
232 	BLayoutBuilder::Group<>(this)
233 		.Add(tabView)
234 		.SetInsets(B_USE_DEFAULT_SPACING)
235 		.End();
236 
237 	CenterOnScreen();
238 }
239 
240 
241 PreferencesWindow::~PreferencesWindow()
242 {
243 	UpdateRecentCounts();
244 }
245 
246 
247 void
248 PreferencesWindow::MessageReceived(BMessage* message)
249 {
250 	switch (message->what) {
251 		case kEditMenuInTracker:
252 			OpenWithTracker(B_USER_DESKBAR_DIRECTORY);
253 			break;
254 
255 		case kUpdateRecentCounts:
256 			UpdateRecentCounts();
257 			break;
258 
259 		case kSuperExpando:
260 			EnableDisableDependentItems();
261 			be_app->PostMessage(message);
262 			break;
263 
264 		case kStateChanged:
265 			EnableDisableDependentItems();
266 			break;
267 
268 		default:
269 			BWindow::MessageReceived(message);
270 			break;
271 	}
272 }
273 
274 
275 bool
276 PreferencesWindow::QuitRequested()
277 {
278 	if (IsHidden())
279 		return true;
280 
281 	Hide();
282 	return false;
283 }
284 
285 
286 void
287 PreferencesWindow::WindowActivated(bool active)
288 {
289 	if (!active && IsMinimized())
290 		PostMessage(B_QUIT_REQUESTED);
291 }
292 
293 
294 void
295 PreferencesWindow::UpdateRecentCounts()
296 {
297 	BMessage message(kUpdateRecentCounts);
298 
299 	int32 docCount = atoi(fMenuRecentDocumentCount->Text());
300 	int32 appCount = atoi(fMenuRecentApplicationCount->Text());
301 	int32 folderCount = atoi(fMenuRecentFolderCount->Text());
302 
303 	message.AddInt32("documents", max_c(0, docCount));
304 	message.AddInt32("applications", max_c(0, appCount));
305 	message.AddInt32("folders", max_c(0, folderCount));
306 
307 	message.AddBool("documentsEnabled", fMenuRecentDocuments->Value());
308 	message.AddBool("applicationsEnabled", fMenuRecentApplications->Value());
309 	message.AddBool("foldersEnabled", fMenuRecentFolders->Value());
310 
311 	be_app->PostMessage(&message);
312 
313 	EnableDisableDependentItems();
314 }
315 
316 
317 void
318 PreferencesWindow::EnableDisableDependentItems()
319 {
320 	TBarApp* barApp = static_cast<TBarApp*>(be_app);
321 	if (barApp->BarView()->Vertical()
322 		&& barApp->BarView()->ExpandoState()) {
323 		fAppsShowExpanders->SetEnabled(true);
324 		fAppsExpandNew->SetEnabled(fAppsShowExpanders->Value());
325 	} else {
326 		fAppsShowExpanders->SetEnabled(false);
327 		fAppsExpandNew->SetEnabled(false);
328 	}
329 
330 	fMenuRecentDocumentCount->SetEnabled(
331 		fMenuRecentDocuments->Value() != B_CONTROL_OFF);
332 	fMenuRecentApplicationCount->SetEnabled(
333 		fMenuRecentApplications->Value() != B_CONTROL_OFF);
334 	fMenuRecentFolderCount->SetEnabled(
335 		fMenuRecentFolders->Value() != B_CONTROL_OFF);
336 
337 	fWindowAutoRaise->SetEnabled(
338 		fWindowAlwaysOnTop->Value() == B_CONTROL_OFF);
339 }
340