xref: /haiku/src/apps/deskbar/PreferencesWindow.cpp (revision 481a903a81b32b77e6cc60c31c6b0e13b065c3fc)
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,
28 		B_NOT_RESIZABLE | 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 	int32 docCount = appSettings->recentDocsCount;
91 	int32 appCount = appSettings->recentAppsCount;
92 	int32 folderCount = appSettings->recentFoldersCount;
93 
94 	fMenuRecentDocuments->SetValue(appSettings->recentDocsEnabled);
95 	fMenuRecentDocumentCount->SetEnabled(appSettings->recentDocsEnabled);
96 
97 	fMenuRecentApplications->SetValue(appSettings->recentAppsEnabled);
98 	fMenuRecentApplicationCount->SetEnabled(appSettings->recentAppsEnabled);
99 
100 	fMenuRecentFolders->SetValue(appSettings->recentFoldersEnabled);
101 	fMenuRecentFolderCount->SetEnabled(appSettings->recentFoldersEnabled);
102 
103 	BString docString;
104 	BString appString;
105 	BString folderString;
106 
107 	docString << docCount;
108 	appString << appCount;
109 	folderString << folderCount;
110 
111 	fMenuRecentDocumentCount->SetText(docString.String());
112 	fMenuRecentApplicationCount->SetText(appString.String());
113 	fMenuRecentFolderCount->SetText(folderString.String());
114 
115 	TReplicantTray* replicantTray = barApp->BarView()->fReplicantTray;
116 
117 	fClock24Hours->SetValue(replicantTray->ShowingMiltime());
118 	fClockSeconds->SetValue(replicantTray->ShowingSeconds());
119 	fClockEuropeanDate->SetValue(replicantTray->ShowingEuroDate());
120 	fClockFullDate->SetValue(replicantTray->ShowingFullDate());
121 
122 	bool showingClock = barApp->BarView()->ShowingClock();
123 	fClock24Hours->SetEnabled(showingClock);
124 	fClockSeconds->SetEnabled(showingClock);
125 	fClockEuropeanDate->SetEnabled(showingClock);
126 	fClockFullDate->SetEnabled(replicantTray->CanShowFullDate());
127 
128 	fWindowAlwaysOnTop->SetValue(appSettings->alwaysOnTop);
129 	fWindowAutoRaise->SetValue(appSettings->autoRaise);
130 
131 	_EnableDisableDependentItems();
132 
133 	// Targets
134 	fAppsSort->SetTarget(be_app);
135 	fAppsSortTrackerFirst->SetTarget(be_app);
136 	fAppsExpandNew->SetTarget(be_app);
137 
138 	fClock24Hours->SetTarget(replicantTray);
139 	fClockSeconds->SetTarget(replicantTray);
140 	fClockEuropeanDate->SetTarget(replicantTray);
141 	fClockFullDate->SetTarget(replicantTray);
142 
143 	fWindowAlwaysOnTop->SetTarget(be_app);
144 	fWindowAutoRaise->SetTarget(be_app);
145 
146 	// Layout
147 	fMenuBox = new BBox("fMenuBox");
148 	fAppsBox = new BBox("fAppsBox");
149 	fClockBox = new BBox("fClockBox");
150 	fWindowBox = new BBox("fWindowBox");
151 
152 	fMenuBox->SetLabel("Menu");
153 	fAppsBox->SetLabel("Applications");
154 	fClockBox->SetLabel("Clock");
155 	fWindowBox->SetLabel("Window");
156 
157 	BView* view;
158 	view = BLayoutBuilder::Group<>()
159 		.AddGroup(B_VERTICAL, 10)
160 			.AddGroup(B_HORIZONTAL, 0)
161 				.AddGroup(B_VERTICAL, 0)
162 					.Add(fMenuRecentDocuments)
163 					.Add(fMenuRecentFolders)
164 					.Add(fMenuRecentApplications)
165 					.End()
166 				.AddGroup(B_VERTICAL, 0)
167 					.Add(fMenuRecentDocumentCount)
168 					.Add(fMenuRecentFolderCount)
169 					.Add(fMenuRecentApplicationCount)
170 					.End()
171 				.End()
172 			.Add(new BButton("Edit menu" B_UTF8_ELLIPSIS,
173 				new BMessage(kEditMenuInTracker)))
174 			.SetInsets(10, 10, 10, 10)
175 			.End()
176 		.View();
177 	fMenuBox->AddChild(view);
178 
179 	view = BLayoutBuilder::Group<>()
180 		.AddGroup(B_VERTICAL, 1)
181 			.Add(fAppsSort)
182 			.Add(fAppsSortTrackerFirst)
183 			.Add(fAppsShowExpanders)
184 			.AddGroup(B_HORIZONTAL, 0)
185 				.SetInsets(20, 0, 0, 0)
186 				.Add(fAppsExpandNew)
187 				.End()
188 			.AddGlue()
189 			.SetInsets(10, 10, 10, 10)
190 			.End()
191 		.View();
192 	fAppsBox->AddChild(view);
193 
194 	view = BLayoutBuilder::Group<>()
195 		.AddGroup(B_VERTICAL, 1)
196 			.Add(fClock24Hours)
197 			.Add(fClockSeconds)
198 			.Add(fClockEuropeanDate)
199 			.Add(fClockFullDate)
200 			.AddGlue()
201 			.SetInsets(10, 10, 10, 10)
202 			.End()
203 		.View();
204 	fClockBox->AddChild(view);
205 
206 	view = BLayoutBuilder::Group<>()
207 		.AddGroup(B_VERTICAL, 1)
208 			.Add(fWindowAlwaysOnTop)
209 			.Add(fWindowAutoRaise)
210 			.AddGlue()
211 			.SetInsets(10, 10, 10, 10)
212 			.End()
213 		.View();
214 	fWindowBox->AddChild(view);
215 
216 	BLayoutBuilder::Group<>(this)
217 		.AddGrid(5, 5)
218 			.Add(fMenuBox, 0, 0)
219 			.Add(fWindowBox, 1, 0)
220 			.Add(fAppsBox, 0, 1)
221 			.Add(fClockBox, 1, 1)
222 			.SetInsets(10, 10, 10, 10)
223 			.End()
224 		.End();
225 
226 	CenterOnScreen();
227 }
228 
229 
230 PreferencesWindow::~PreferencesWindow()
231 {
232 	_UpdateRecentCounts();
233 	be_app->PostMessage(kConfigClose);
234 }
235 
236 
237 void
238 PreferencesWindow::MessageReceived(BMessage* message)
239 {
240 	switch (message->what) {
241 		case kEditMenuInTracker:
242 			OpenWithTracker(B_USER_DESKBAR_DIRECTORY);
243 			break;
244 
245 		case kUpdateRecentCounts:
246 			_UpdateRecentCounts();
247 			break;
248 
249 		case kSuperExpando:
250 			_EnableDisableDependentItems();
251 			be_app->PostMessage(message);
252 			break;
253 
254 		default:
255 			BWindow::MessageReceived(message);
256 			break;
257 	}
258 }
259 
260 
261 void
262 PreferencesWindow::_UpdateRecentCounts()
263 {
264 	BMessage message(kUpdateRecentCounts);
265 
266 	int32 docCount = atoi(fMenuRecentDocumentCount->Text());
267 	int32 appCount = atoi(fMenuRecentApplicationCount->Text());
268 	int32 folderCount = atoi(fMenuRecentFolderCount->Text());
269 
270 	message.AddInt32("documents", max_c(0, docCount));
271 	message.AddInt32("applications", max_c(0, appCount));
272 	message.AddInt32("folders", max_c(0, folderCount));
273 
274 	message.AddBool("documentsEnabled", fMenuRecentDocuments->Value());
275 	message.AddBool("applicationsEnabled", fMenuRecentApplications->Value());
276 	message.AddBool("foldersEnabled", fMenuRecentFolders->Value());
277 
278 	be_app->PostMessage(&message);
279 
280 	_EnableDisableDependentItems();
281 }
282 
283 
284 void
285 PreferencesWindow::_EnableDisableDependentItems()
286 {
287 	if (fAppsShowExpanders->Value())
288 		fAppsExpandNew->SetEnabled(true);
289 	else
290 		fAppsExpandNew->SetEnabled(false);
291 
292 	if (fMenuRecentDocuments->Value())
293 		fMenuRecentDocumentCount->SetEnabled(true);
294 	else
295 		fMenuRecentDocumentCount->SetEnabled(false);
296 
297 	if (fMenuRecentApplications->Value())
298 		fMenuRecentApplicationCount->SetEnabled(true);
299 	else
300 		fMenuRecentApplicationCount->SetEnabled(false);
301 
302 	if (fMenuRecentFolders->Value())
303 		fMenuRecentFolderCount->SetEnabled(true);
304 	else
305 		fMenuRecentFolderCount->SetEnabled(false);
306 }
307 
308 
309 void
310 PreferencesWindow::WindowActivated(bool active)
311 {
312 	if (!active && IsMinimized())
313 		PostMessage(B_QUIT_REQUESTED);
314 }
315 
316