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