1 /* 2 Open Tracker License 3 4 Terms and Conditions 5 6 Copyright (c) 1991-2000, Be Incorporated. All rights reserved. 7 8 Permission is hereby granted, free of charge, to any person obtaining a copy of 9 this software and associated documentation files (the "Software"), to deal in 10 the Software without restriction, including without limitation the rights to 11 use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies 12 of the Software, and to permit persons to whom the Software is furnished to do 13 so, subject to the following conditions: 14 15 The above copyright notice and this permission notice applies to all licensees 16 and shall be included in all copies or substantial portions of the Software. 17 18 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 19 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF TITLE, MERCHANTABILITY, 20 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 21 BE INCORPORATED BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 22 AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF, OR IN CONNECTION 23 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 24 25 Except as contained in this notice, the name of Be Incorporated shall not be 26 used in advertising or otherwise to promote the sale, use or other dealings in 27 this Software without prior written authorization from Be Incorporated. 28 29 Tracker(TM), Be(R), BeOS(R), and BeIA(TM) are trademarks or registered trademarks 30 of Be Incorporated in the United States and other countries. Other brand product 31 names are registered trademarks or trademarks of their respective holders. 32 All rights reserved. 33 */ 34 35 36 #include <Catalog.h> 37 #include <ControlLook.h> 38 #include <InterfaceDefs.h> 39 #include <LayoutBuilder.h> 40 #include <Locale.h> 41 #include <ScrollView.h> 42 43 #include "SettingsViews.h" 44 #include "TrackerSettings.h" 45 #include "TrackerSettingsWindow.h" 46 47 48 namespace BPrivate { 49 50 class SettingsItem : public BStringItem { 51 public: 52 SettingsItem(const char* label, SettingsView* view); 53 54 void DrawItem(BView* owner, BRect rect, bool drawEverything); 55 56 SettingsView* View(); 57 58 private: 59 SettingsView* fSettingsView; 60 }; 61 62 } // namespace BPrivate 63 64 65 const uint32 kSettingsViewChanged = 'Svch'; 66 const uint32 kDefaultsButtonPressed = 'Apbp'; 67 const uint32 kRevertButtonPressed = 'Rebp'; 68 69 70 #undef B_TRANSLATION_CONTEXT 71 #define B_TRANSLATION_CONTEXT "TrackerSettingsWindow" 72 73 74 // #pragma mark - TrackerSettingsWindow 75 76 77 TrackerSettingsWindow::TrackerSettingsWindow() 78 : 79 BWindow(BRect(80, 80, 450, 350), B_TRANSLATE("Tracker preferences"), 80 B_TITLED_WINDOW, B_NOT_MINIMIZABLE | B_NOT_RESIZABLE 81 | B_ASYNCHRONOUS_CONTROLS | B_NOT_ZOOMABLE 82 | B_AUTO_UPDATE_SIZE_LIMITS) 83 { 84 fSettingsTypeListView = new BListView("List View", 85 B_SINGLE_SELECTION_LIST); 86 87 BScrollView* scrollView = new BScrollView("scrollview", 88 fSettingsTypeListView, B_FRAME_EVENTS | B_WILL_DRAW, false, true); 89 90 fDefaultsButton = new BButton("Defaults", B_TRANSLATE("Defaults"), 91 new BMessage(kDefaultsButtonPressed)); 92 fDefaultsButton->SetEnabled(false); 93 94 fRevertButton = new BButton("Revert", B_TRANSLATE("Revert"), 95 new BMessage(kRevertButtonPressed)); 96 fRevertButton->SetEnabled(false); 97 98 fSettingsContainerBox = new BBox("SettingsContainerBox"); 99 100 const float spacing = be_control_look->DefaultItemSpacing(); 101 102 BLayoutBuilder::Group<>(this) 103 .AddGroup(B_HORIZONTAL, spacing) 104 .Add(scrollView) 105 .AddGroup(B_VERTICAL, spacing) 106 .Add(fSettingsContainerBox) 107 .AddGroup(B_HORIZONTAL, spacing) 108 .Add(fDefaultsButton) 109 .Add(fRevertButton) 110 .AddGlue() 111 .End() 112 .End() 113 .SetInsets(spacing, spacing, spacing, spacing) 114 .End(); 115 116 fSettingsTypeListView->AddItem(new SettingsItem(B_TRANSLATE("Desktop"), 117 new DesktopSettingsView()), kDesktopSettings); 118 fSettingsTypeListView->AddItem(new SettingsItem(B_TRANSLATE("Windows"), 119 new WindowsSettingsView()), kWindowsSettings); 120 fSettingsTypeListView->AddItem(new SettingsItem( 121 B_TRANSLATE("Volume icons"), new SpaceBarSettingsView()), 122 kSpaceBarSettings); 123 fSettingsTypeListView->AddItem(new SettingsItem( 124 B_TRANSLATE("Disk mount"), new AutomountSettingsPanel()), 125 kAutomountSettings); 126 127 // constraint the listview width so that the longest item fits 128 float width = 0; 129 fSettingsTypeListView->GetPreferredSize(&width, NULL); 130 width += B_V_SCROLL_BAR_WIDTH; 131 fSettingsTypeListView->SetExplicitMinSize(BSize(width, 0)); 132 fSettingsTypeListView->SetExplicitMaxSize(BSize(width, B_SIZE_UNLIMITED)); 133 134 fSettingsTypeListView->SetSelectionMessage( 135 new BMessage(kSettingsViewChanged)); 136 fSettingsTypeListView->Select(0); 137 } 138 139 140 bool 141 TrackerSettingsWindow::QuitRequested() 142 { 143 if (IsHidden()) 144 return true; 145 146 Hide(); 147 return false; 148 } 149 150 151 void 152 TrackerSettingsWindow::MessageReceived(BMessage* message) 153 { 154 switch (message->what) { 155 case kSettingsContentsModified: 156 _HandleChangedContents(); 157 break; 158 159 case kDefaultsButtonPressed: 160 _HandlePressedDefaultsButton(); 161 break; 162 163 case kRevertButtonPressed: 164 _HandlePressedRevertButton(); 165 break; 166 167 case kSettingsViewChanged: 168 _HandleChangedSettingsView(); 169 break; 170 171 default: 172 _inherited::MessageReceived(message); 173 break; 174 } 175 } 176 177 178 void 179 TrackerSettingsWindow::Show() 180 { 181 if (Lock()) { 182 int32 itemCount = fSettingsTypeListView->CountItems(); 183 184 for (int32 i = 0; i < itemCount; i++) { 185 _ViewAt(i)->RecordRevertSettings(); 186 _ViewAt(i)->ShowCurrentSettings(); 187 } 188 189 fSettingsTypeListView->Invalidate(); 190 191 _UpdateButtons(); 192 193 Unlock(); 194 } 195 196 if (IsHidden()) { 197 // move to current workspace 198 SetWorkspaces(B_CURRENT_WORKSPACE); 199 } 200 201 _inherited::Show(); 202 } 203 204 205 void 206 TrackerSettingsWindow::ShowPage(SettingsPage page) 207 { 208 fSettingsTypeListView->Select(page); 209 } 210 211 212 SettingsView* 213 TrackerSettingsWindow::_ViewAt(int32 i) 214 { 215 if (!Lock()) 216 return NULL; 217 218 SettingsItem* item = dynamic_cast<SettingsItem*> 219 (fSettingsTypeListView->ItemAt(i)); 220 221 Unlock(); 222 223 return item->View(); 224 } 225 226 227 void 228 TrackerSettingsWindow::_HandleChangedContents() 229 { 230 fSettingsTypeListView->Invalidate(); 231 _UpdateButtons(); 232 233 TrackerSettings().SaveSettings(false); 234 } 235 236 237 void 238 TrackerSettingsWindow::_UpdateButtons() 239 { 240 int32 itemCount = fSettingsTypeListView->CountItems(); 241 242 bool defaultable = false; 243 bool revertable = false; 244 245 for (int32 i = 0; i < itemCount; i++) { 246 defaultable |= _ViewAt(i)->IsDefaultable(); 247 revertable |= _ViewAt(i)->IsRevertable(); 248 } 249 250 fDefaultsButton->SetEnabled(defaultable); 251 fRevertButton->SetEnabled(revertable); 252 } 253 254 255 void 256 TrackerSettingsWindow::_HandlePressedDefaultsButton() 257 { 258 int32 itemCount = fSettingsTypeListView->CountItems(); 259 260 for (int32 i = 0; i < itemCount; i++) { 261 if (_ViewAt(i)->IsDefaultable()) 262 _ViewAt(i)->SetDefaults(); 263 } 264 265 _HandleChangedContents(); 266 } 267 268 269 void 270 TrackerSettingsWindow::_HandlePressedRevertButton() 271 { 272 int32 itemCount = fSettingsTypeListView->CountItems(); 273 274 for (int32 i = 0; i < itemCount; i++) { 275 if (_ViewAt(i)->IsRevertable()) 276 _ViewAt(i)->Revert(); 277 } 278 279 _HandleChangedContents(); 280 } 281 282 283 void 284 TrackerSettingsWindow::_HandleChangedSettingsView() 285 { 286 int32 currentSelection = fSettingsTypeListView->CurrentSelection(); 287 if (currentSelection < 0) 288 return; 289 290 BView* oldView = fSettingsContainerBox->ChildAt(0); 291 292 if (oldView != NULL) 293 oldView->RemoveSelf(); 294 295 SettingsItem* selectedItem = 296 dynamic_cast<SettingsItem*> 297 (fSettingsTypeListView->ItemAt(currentSelection)); 298 299 if (selectedItem != NULL) { 300 fSettingsContainerBox->SetLabel(selectedItem->Text()); 301 302 BView* view = selectedItem->View(); 303 view->SetViewColor(fSettingsContainerBox->ViewColor()); 304 view->Hide(); 305 fSettingsContainerBox->AddChild(view); 306 307 view->Show(); 308 } 309 } 310 311 312 // #pragma mark - SettingsItem 313 314 315 SettingsItem::SettingsItem(const char* label, SettingsView* view) 316 : 317 BStringItem(label), 318 fSettingsView(view) 319 { 320 } 321 322 323 void 324 SettingsItem::DrawItem(BView* owner, BRect rect, bool drawEverything) 325 { 326 if (fSettingsView) { 327 bool isRevertable = fSettingsView->IsRevertable(); 328 bool isSelected = IsSelected(); 329 330 if (isSelected || drawEverything) { 331 rgb_color color; 332 if (isSelected) 333 color = ui_color(B_LIST_SELECTED_BACKGROUND_COLOR); 334 else 335 color = owner->ViewColor(); 336 337 owner->SetHighColor(color); 338 owner->SetLowColor(color); 339 owner->FillRect(rect); 340 } 341 342 if (isRevertable) 343 owner->SetFont(be_bold_font); 344 else 345 owner->SetFont(be_plain_font); 346 347 if (isSelected) 348 owner->SetHighColor(ui_color(B_LIST_SELECTED_ITEM_TEXT_COLOR)); 349 else 350 owner->SetHighColor(ui_color(B_LIST_ITEM_TEXT_COLOR)); 351 352 font_height fheight; 353 owner->GetFontHeight(&fheight); 354 355 owner->DrawString(Text(), 356 BPoint(rect.left + be_control_look->DefaultLabelSpacing(), 357 rect.top + fheight.ascent + 2 + floorf(fheight.leading / 2))); 358 359 owner->SetHighColor(ui_color(B_LIST_ITEM_TEXT_COLOR)); 360 owner->SetLowColor(owner->ViewColor()); 361 } 362 } 363 364 365 SettingsView* 366 SettingsItem::View() 367 { 368 return fSettingsView; 369 } 370