xref: /haiku/src/apps/deskbar/PreferencesWindow.cpp (revision 290c903985a449fa86c501366b6fcddf7f55b46a)
1 /*
2  * Copyright 2009 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 <CheckBox.h>
13 #include <GroupLayout.h>
14 #include <LayoutBuilder.h>
15 #include <OpenWithTracker.h>
16 #include <RadioButton.h>
17 #include <SeparatorView.h>
18 
19 #include <ctype.h>
20 
21 #include "BarApp.h"
22 #include "StatusView.h"
23 
24 
25 PreferencesWindow::PreferencesWindow(BRect frame)
26 	:
27 	BWindow(frame, "Deskbar Preferences", B_TITLED_WINDOW, B_NOT_RESIZABLE
28 		| B_AUTO_UPDATE_SIZE_LIMITS | B_NOT_ZOOMABLE)
29 {
30 	// Controls
31 	fMenuRecentDocuments = new BCheckBox("Recent Documents:",
32 		new BMessage(kUpdateRecentCounts));
33 	fMenuRecentApplications = new BCheckBox("Recent Applications:",
34 		new BMessage(kUpdateRecentCounts));
35 	fMenuRecentFolders = new BCheckBox("Recent Folders:",
36 		new BMessage(kUpdateRecentCounts));
37 
38 	fMenuRecentDocumentCount = new BTextControl(NULL, NULL,
39 		new BMessage(kUpdateRecentCounts));
40 	fMenuRecentApplicationCount = new BTextControl(NULL, NULL,
41 		new BMessage(kUpdateRecentCounts));
42 	fMenuRecentFolderCount = new BTextControl(NULL, NULL,
43 		new BMessage(kUpdateRecentCounts));
44 
45 	fAppsSort = new BCheckBox("Sort Running Applications",
46 		new BMessage(kSortRunningApps));
47 	fAppsSortTrackerFirst = new BCheckBox("Tracker Always First",
48 		new BMessage(kTrackerFirst));
49 	fAppsShowExpanders = new BCheckBox("Show Application Expander",
50 		new BMessage(kSuperExpando));
51 	fAppsExpandNew = new BCheckBox("Expand New Applications",
52 		new BMessage(kExpandNewTeams));
53 
54 	fClock24Hours = new BCheckBox("24 Hour Clock", new BMessage(kMsgMilTime));
55 	fClockSeconds = new BCheckBox("Show Seconds",
56 		new BMessage(kMsgShowSeconds));
57 	fClockEuropeanDate = new BCheckBox("European Date",
58 		new BMessage(kMsgEuroDate));
59 	fClockFullDate = new BCheckBox("Full Date", new BMessage(kMsgFullDate));
60 
61 	fWindowAlwaysOnTop = new BCheckBox("Always On Top",
62 		new BMessage(kAlwaysTop));
63 	fWindowAutoRaise = new BCheckBox("Auto-raise", new BMessage(kAutoRaise));
64 
65 	BTextView* docTextView = fMenuRecentDocumentCount->TextView();
66 	BTextView* appTextView = fMenuRecentApplicationCount->TextView();
67 	BTextView* folderTextView = fMenuRecentFolderCount->TextView();
68 
69 	for (int32 i = 0; i < 256; i++) {
70 		if (!isdigit(i)) {
71 			docTextView->DisallowChar(i);
72 			appTextView->DisallowChar(i);
73 			folderTextView->DisallowChar(i);
74 		}
75 	}
76 
77 	docTextView->SetMaxBytes(4);
78 	appTextView->SetMaxBytes(4);
79 	folderTextView->SetMaxBytes(4);
80 
81 	// Values
82 	TBarApp* barApp = static_cast<TBarApp*>(be_app);
83 	desk_settings* appSettings = barApp->Settings();;
84 
85 	fAppsSort->SetValue(appSettings->sortRunningApps);
86 	fAppsSortTrackerFirst->SetValue(appSettings->trackerAlwaysFirst);
87 	fAppsShowExpanders->SetValue(appSettings->superExpando);
88 	fAppsExpandNew->SetValue(appSettings->expandNewTeams);
89 
90 	fMenuRecentDocuments->SetValue(false);
91 	fMenuRecentApplications->SetValue(false);
92 	fMenuRecentFolders->SetValue(false);
93 
94 	fMenuRecentDocumentCount->SetEnabled(false);
95 	fMenuRecentApplicationCount->SetEnabled(false);
96 	fMenuRecentFolderCount->SetEnabled(false);
97 
98 	int32 docCount = appSettings->recentDocsCount;
99 	int32 appCount = appSettings->recentAppsCount;
100 	int32 folderCount = appSettings->recentFoldersCount;
101 
102 	if (docCount > 0) {
103 		fMenuRecentDocuments->SetValue(true);
104 		fMenuRecentDocumentCount->SetEnabled(true);
105 	}
106 
107 	if (appCount > 0) {
108 		fMenuRecentApplications->SetValue(true);
109 		fMenuRecentApplicationCount->SetEnabled(true);
110 	}
111 
112 	if (folderCount > 0) {
113 		fMenuRecentFolders->SetValue(true);
114 		fMenuRecentFolderCount->SetEnabled(true);
115 	}
116 
117 	BString docString;
118 	BString appString;
119 	BString folderString;
120 
121 	docString << docCount;
122 	appString << appCount;
123 	folderString << folderCount;
124 
125 	fMenuRecentDocumentCount->SetText(docString.String());
126 	fMenuRecentApplicationCount->SetText(appString.String());
127 	fMenuRecentFolderCount->SetText(folderString.String());
128 
129 	TReplicantTray* replicantTray = barApp->BarView()->fReplicantTray;
130 
131 	fClock24Hours->SetValue(replicantTray->ShowingMiltime());
132 	fClockSeconds->SetValue(replicantTray->ShowingSeconds());
133 	fClockEuropeanDate->SetValue(replicantTray->ShowingEuroDate());
134 	fClockFullDate->SetValue(replicantTray->ShowingFullDate());
135 
136 	bool showingClock = barApp->BarView()->ShowingClock();
137 	fClock24Hours->SetEnabled(showingClock);
138 	fClockSeconds->SetEnabled(showingClock);
139 	fClockEuropeanDate->SetEnabled(showingClock);
140 	fClockFullDate->SetEnabled(replicantTray->CanShowFullDate());
141 
142 	fWindowAlwaysOnTop->SetValue(appSettings->alwaysOnTop);
143 	fWindowAutoRaise->SetValue(appSettings->autoRaise);
144 
145 	_EnableDisableDependentItems();
146 
147 	// Targets
148 	fAppsSort->SetTarget(be_app);
149 	fAppsSortTrackerFirst->SetTarget(be_app);
150 	fAppsExpandNew->SetTarget(be_app);
151 
152 	fClock24Hours->SetTarget(replicantTray);
153 	fClockSeconds->SetTarget(replicantTray);
154 	fClockEuropeanDate->SetTarget(replicantTray);
155 	fClockFullDate->SetTarget(replicantTray);
156 
157 	fWindowAlwaysOnTop->SetTarget(be_app);
158 	fWindowAutoRaise->SetTarget(be_app);
159 
160 	// Layout
161 	fMenuBox = new BBox("fMenuBox");
162 	fAppsBox = new BBox("fAppsBox");
163 	fClockBox = new BBox("fClockBox");
164 	fWindowBox = new BBox("fWindowBox");
165 
166 	BStringView* menuString = new BStringView(NULL, "Menu");
167 	BStringView* appsString = new BStringView(NULL, "Applications");
168 	BStringView* clockString = new BStringView(NULL, "Clock");
169 	BStringView* windowString = new BStringView(NULL, "Window");
170 
171 	BFont font;
172 	menuString->GetFont(&font);
173 	font.SetFace(B_BOLD_FACE);
174 
175 	menuString->SetFont(&font, B_FONT_FACE);
176 	appsString->SetFont(&font, B_FONT_FACE);
177 	clockString->SetFont(&font, B_FONT_FACE);
178 	windowString->SetFont(&font, B_FONT_FACE);
179 
180 	fMenuBox->SetLabel(menuString);
181 	fAppsBox->SetLabel(appsString);
182 	fClockBox->SetLabel(clockString);
183 	fWindowBox->SetLabel(windowString);
184 
185 	BView* view;
186 	view = BLayoutBuilder::Group<>()
187 		.AddGroup(B_VERTICAL, 10)
188 			.AddGroup(B_HORIZONTAL, 10)
189 				.AddGroup(B_VERTICAL, 10)
190 					.Add(fMenuRecentDocuments)
191 					.Add(fMenuRecentFolders)
192 					.Add(fMenuRecentApplications)
193 					.End()
194 				.AddGroup(B_VERTICAL, 10)
195 					.Add(fMenuRecentDocumentCount)
196 					.Add(fMenuRecentApplicationCount)
197 					.Add(fMenuRecentFolderCount)
198 					.End()
199 				.End()
200 			.Add(new BButton("Edit Menu" B_UTF8_ELLIPSIS,
201 				new BMessage(kEditMenuInTracker)))
202 			.SetInsets(14, 14, 14, 14)
203 			.End()
204 		.View();
205 	fMenuBox->AddChild(view);
206 
207 	view = BLayoutBuilder::Group<>()
208 		.AddGroup(B_VERTICAL, 10)
209 			.Add(fAppsSort)
210 			.Add(fAppsSortTrackerFirst)
211 			.Add(fAppsShowExpanders)
212 			.AddGroup(B_HORIZONTAL, 0)
213 				.SetInsets(20, 0, 0, 0)
214 				.Add(fAppsExpandNew)
215 				.End()
216 			.SetInsets(14, 14, 14, 14)
217 			.End()
218 		.View();
219 	fAppsBox->AddChild(view);
220 
221 	view = BLayoutBuilder::Group<>()
222 		.AddGroup(B_VERTICAL, 10)
223 			.Add(fClock24Hours)
224 			.Add(fClockSeconds)
225 			.Add(fClockEuropeanDate)
226 			.Add(fClockFullDate)
227 			.SetInsets(14, 14, 14, 14)
228 			.End()
229 		.View();
230 	fClockBox->AddChild(view);
231 
232 	view = BLayoutBuilder::Group<>()
233 		.AddGroup(B_VERTICAL, 10)
234 			.Add(fWindowAlwaysOnTop)
235 			.Add(fWindowAutoRaise)
236 			.SetInsets(14, 14, 14, 14)
237 			.End()
238 		.View();
239 	fWindowBox->AddChild(view);
240 
241 	BLayoutBuilder::Group<>(this)
242 		.AddGroup(B_VERTICAL, 10)
243 			.Add(fMenuBox)
244 			.Add(fWindowBox)
245 			.Add(fAppsBox)
246 			.Add(fClockBox)
247 			.SetInsets(14, 14, 14, 14)
248 			.End()
249 		.End();
250 
251 	CenterOnScreen();
252 }
253 
254 
255 PreferencesWindow::~PreferencesWindow()
256 {
257 	_UpdateRecentCounts();
258 	be_app->PostMessage(kConfigClose);
259 }
260 
261 
262 void
263 PreferencesWindow::MessageReceived(BMessage* message)
264 {
265 	switch (message->what) {
266 
267 		case kEditMenuInTracker:
268 			OpenWithTracker(B_USER_DESKBAR_DIRECTORY);
269 			break;
270 
271 		case kUpdateRecentCounts:
272 			_UpdateRecentCounts();
273 			break;
274 
275 		case kSuperExpando:
276 			_EnableDisableDependentItems();
277 			be_app->PostMessage(message);
278 			break;
279 
280 		default:
281 			BWindow::MessageReceived(message);
282 			break;
283 	}
284 }
285 
286 
287 void
288 PreferencesWindow::_UpdateRecentCounts()
289 {
290 	BMessage message(kUpdateRecentCounts);
291 
292 	int32 docCount = atoi(fMenuRecentDocumentCount->Text());
293 	int32 appCount = atoi(fMenuRecentApplicationCount->Text());
294 	int32 folderCount = atoi(fMenuRecentFolderCount->Text());
295 
296 	if (docCount <= 0 || fMenuRecentDocuments->Value() == false)
297 		message.AddInt32("documents", 0);
298 	else
299 		message.AddInt32("documents", docCount);
300 
301 	if (appCount <= 0 || fMenuRecentApplications->Value() == false)
302 		message.AddInt32("applications", 0);
303 	else
304 		message.AddInt32("applications", appCount);
305 
306 	if (folderCount <= 0 || fMenuRecentFolders->Value() == false)
307 		message.AddInt32("folders", 0);
308 	else
309 		message.AddInt32("folders", folderCount);
310 
311 	be_app->PostMessage(&message);
312 
313 	_EnableDisableDependentItems();
314 }
315 
316 
317 void
318 PreferencesWindow::_EnableDisableDependentItems()
319 {
320 	if (fAppsShowExpanders->Value())
321 		fAppsExpandNew->SetEnabled(true);
322 	else
323 		fAppsExpandNew->SetEnabled(false);
324 
325 	if (fMenuRecentDocuments->Value())
326 		fMenuRecentDocumentCount->SetEnabled(true);
327 	else
328 		fMenuRecentDocumentCount->SetEnabled(false);
329 
330 	if (fMenuRecentApplications->Value())
331 		fMenuRecentApplicationCount->SetEnabled(true);
332 	else
333 		fMenuRecentApplicationCount->SetEnabled(false);
334 
335 	if (fMenuRecentFolders->Value())
336 		fMenuRecentFolderCount->SetEnabled(true);
337 	else
338 		fMenuRecentFolderCount->SetEnabled(false);
339 }
340 
341 
342 void
343 PreferencesWindow::WindowActivated(bool active)
344 {
345 	if (!active && IsMinimized())
346 		PostMessage(B_QUIT_REQUESTED);
347 }
348 
349