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