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