xref: /haiku/src/apps/deskbar/PreferencesWindow.cpp (revision 026fe75255ff6ac8500e6473b56612b6f92207e8)
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(kMilTime));
55 	fClockSeconds = new BCheckBox("Show Seconds",
56 		new BMessage(kShowSeconds));
57 	fClockEuropeanDate = new BCheckBox("European Date",
58 		new BMessage(kEuroDate));
59 	fClockFullDate = new BCheckBox("Full Date", new BMessage(kFullDate));
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, 0)
188 			.AddGroup(B_HORIZONTAL, 0)
189 				.AddGroup(B_VERTICAL, 0)
190 					.Add(fMenuRecentDocuments)
191 					.Add(fMenuRecentFolders)
192 					.Add(fMenuRecentApplications)
193 					.End()
194 				.AddGroup(B_VERTICAL, 0)
195 					.Add(fMenuRecentDocumentCount)
196 					.Add(fMenuRecentFolderCount)
197 					.Add(fMenuRecentApplicationCount)
198 					.End()
199 				.End()
200 			.Add(new BButton("Edit Menu" B_UTF8_ELLIPSIS,
201 				new BMessage(kEditMenuInTracker)))
202 			.AddGlue()
203 			.SetInsets(10, 10, 10, 10)
204 			.End()
205 		.View();
206 	fMenuBox->AddChild(view);
207 
208 	view = BLayoutBuilder::Group<>()
209 		.AddGroup(B_VERTICAL, 1)
210 			.Add(fAppsSort)
211 			.Add(fAppsSortTrackerFirst)
212 			.Add(fAppsShowExpanders)
213 			.AddGroup(B_HORIZONTAL, 0)
214 				.SetInsets(20, 0, 0, 0)
215 				.Add(fAppsExpandNew)
216 				.End()
217 			.AddGlue()
218 			.SetInsets(10, 10, 10, 10)
219 			.End()
220 		.View();
221 	fAppsBox->AddChild(view);
222 
223 	view = BLayoutBuilder::Group<>()
224 		.AddGroup(B_VERTICAL, 1)
225 			.Add(fClock24Hours)
226 			.Add(fClockSeconds)
227 			.Add(fClockEuropeanDate)
228 			.Add(fClockFullDate)
229 			.AddGlue()
230 			.SetInsets(10, 10, 10, 10)
231 			.End()
232 		.View();
233 	fClockBox->AddChild(view);
234 
235 	view = BLayoutBuilder::Group<>()
236 		.AddGroup(B_VERTICAL, 1)
237 			.Add(fWindowAlwaysOnTop)
238 			.Add(fWindowAutoRaise)
239 			.AddGlue()
240 			.SetInsets(10, 10, 10, 10)
241 			.End()
242 		.View();
243 	fWindowBox->AddChild(view);
244 
245 	BLayoutBuilder::Group<>(this)
246 		.AddGrid(5, 5)
247 			.Add(fMenuBox, 0, 0)
248 			.Add(fWindowBox, 1, 0)
249 			.Add(fAppsBox, 0, 1)
250 			.Add(fClockBox, 1, 1)
251 			.SetInsets(10, 10, 10, 10)
252 			.End()
253 		.End();
254 
255 	CenterOnScreen();
256 }
257 
258 
259 PreferencesWindow::~PreferencesWindow()
260 {
261 	_UpdateRecentCounts();
262 	be_app->PostMessage(kConfigClose);
263 }
264 
265 
266 void
267 PreferencesWindow::MessageReceived(BMessage* message)
268 {
269 	switch (message->what) {
270 
271 		case kEditMenuInTracker:
272 			OpenWithTracker(B_USER_DESKBAR_DIRECTORY);
273 			break;
274 
275 		case kUpdateRecentCounts:
276 			_UpdateRecentCounts();
277 			break;
278 
279 		case kSuperExpando:
280 			_EnableDisableDependentItems();
281 			be_app->PostMessage(message);
282 			break;
283 
284 		default:
285 			BWindow::MessageReceived(message);
286 			break;
287 	}
288 }
289 
290 
291 void
292 PreferencesWindow::_UpdateRecentCounts()
293 {
294 	BMessage message(kUpdateRecentCounts);
295 
296 	int32 docCount = atoi(fMenuRecentDocumentCount->Text());
297 	int32 appCount = atoi(fMenuRecentApplicationCount->Text());
298 	int32 folderCount = atoi(fMenuRecentFolderCount->Text());
299 
300 	if (docCount <= 0 || fMenuRecentDocuments->Value() == false)
301 		message.AddInt32("documents", 0);
302 	else
303 		message.AddInt32("documents", docCount);
304 
305 	if (appCount <= 0 || fMenuRecentApplications->Value() == false)
306 		message.AddInt32("applications", 0);
307 	else
308 		message.AddInt32("applications", appCount);
309 
310 	if (folderCount <= 0 || fMenuRecentFolders->Value() == false)
311 		message.AddInt32("folders", 0);
312 	else
313 		message.AddInt32("folders", folderCount);
314 
315 	be_app->PostMessage(&message);
316 
317 	_EnableDisableDependentItems();
318 }
319 
320 
321 void
322 PreferencesWindow::_EnableDisableDependentItems()
323 {
324 	if (fAppsShowExpanders->Value())
325 		fAppsExpandNew->SetEnabled(true);
326 	else
327 		fAppsExpandNew->SetEnabled(false);
328 
329 	if (fMenuRecentDocuments->Value())
330 		fMenuRecentDocumentCount->SetEnabled(true);
331 	else
332 		fMenuRecentDocumentCount->SetEnabled(false);
333 
334 	if (fMenuRecentApplications->Value())
335 		fMenuRecentApplicationCount->SetEnabled(true);
336 	else
337 		fMenuRecentApplicationCount->SetEnabled(false);
338 
339 	if (fMenuRecentFolders->Value())
340 		fMenuRecentFolderCount->SetEnabled(true);
341 	else
342 		fMenuRecentFolderCount->SetEnabled(false);
343 }
344 
345 
346 void
347 PreferencesWindow::WindowActivated(bool active)
348 {
349 	if (!active && IsMinimized())
350 		PostMessage(B_QUIT_REQUESTED);
351 }
352 
353