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