1/* 2Open Tracker License 3 4Terms and Conditions 5 6Copyright (c) 1991-2000, Be Incorporated. All rights reserved. 7 8Permission is hereby granted, free of charge, to any person obtaining a copy of 9this software and associated documentation files (the "Software"), to deal in 10the Software without restriction, including without limitation the rights to 11use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies 12of the Software, and to permit persons to whom the Software is furnished to do 13so, subject to the following conditions: 14 15The above copyright notice and this permission notice applies to all licensees 16and shall be included in all copies or substantial portions of the Software. 17 18THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 19IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF TITLE, MERCHANTABILITY, 20FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 21BE INCORPORATED BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 22AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF, OR IN CONNECTION 23WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 24 25Except as contained in this notice, the name of Be Incorporated shall not be 26used in advertising or otherwise to promote the sale, use or other dealings in 27this Software without prior written authorization from Be Incorporated. 28 29Tracker(TM), Be(R), BeOS(R), and BeIA(TM) are trademarks or registered trademarks 30of Be Incorporated in the United States and other countries. Other brand product 31names are registered trademarks or trademarks of their respective holders. 32All rights reserved. 33*/ 34 35 36#include "TrackerSettings.h" 37 38#include <Debug.h> 39 40#include "Tracker.h" 41#include "WidgetAttributeText.h" 42 43 44class TTrackerState : public Settings { 45 public: 46 static TTrackerState* Get(); 47 void Release(); 48 49 void LoadSettingsIfNeeded(); 50 void SaveSettings(bool onlyIfNonDefault = true); 51 52 TTrackerState(); 53 ~TTrackerState(); 54 55 private: 56 friend class BPrivate::TrackerSettings; 57 58 static void InitIfNeeded(); 59 TTrackerState(const TTrackerState&); 60 61 BooleanValueSetting* fShowDisksIcon; 62 BooleanValueSetting* fMountVolumesOntoDesktop; 63 BooleanValueSetting* fDesktopFilePanelRoot; 64 BooleanValueSetting* fMountSharedVolumesOntoDesktop; 65 BooleanValueSetting* fEjectWhenUnmounting; 66 67 BooleanValueSetting* fShowFullPathInTitleBar; 68 BooleanValueSetting* fSingleWindowBrowse; 69 BooleanValueSetting* fShowNavigator; 70 BooleanValueSetting* fShowSelectionWhenInactive; 71 BooleanValueSetting* fTransparentSelection; 72 BooleanValueSetting* fSortFolderNamesFirst; 73 BooleanValueSetting* fHideDotFiles; 74 BooleanValueSetting* fTypeAheadFiltering; 75 76 ScalarValueSetting* fRecentApplicationsCount; 77 ScalarValueSetting* fRecentDocumentsCount; 78 ScalarValueSetting* fRecentFoldersCount; 79 80 BooleanValueSetting* fShowVolumeSpaceBar; 81 HexScalarValueSetting* fUsedSpaceColor; 82 HexScalarValueSetting* fFreeSpaceColor; 83 HexScalarValueSetting* fWarningSpaceColor; 84 85 BooleanValueSetting* fMoveFilesToTrash; 86 BooleanValueSetting* fAskBeforeDeleteFile; 87 88 Benaphore fInitLock; 89 bool fInited; 90 bool fSettingsLoaded; 91 92 int32 fUseCounter; 93 94 typedef Settings _inherited; 95}; 96 97static TTrackerState gTrackerState; 98 99 100rgb_color ValueToColor(int32 value) 101{ 102 rgb_color color; 103 color.alpha = static_cast<uchar>((value >> 24L) & 0xff); 104 color.red = static_cast<uchar>((value >> 16L) & 0xff); 105 color.green = static_cast<uchar>((value >> 8L) & 0xff); 106 color.blue = static_cast<uchar>(value & 0xff); 107 108 return color; 109} 110 111 112int32 ColorToValue(rgb_color color) 113{ 114 return color.alpha << 24L 115 | color.red << 16L 116 | color.green << 8L 117 | color.blue; 118} 119 120 121// #pragma mark - 122 123 124TTrackerState::TTrackerState() 125 : Settings("TrackerSettings", "Tracker"), 126 fInited(false), 127 fSettingsLoaded(false) 128{ 129} 130 131 132TTrackerState::TTrackerState(const TTrackerState&) 133 : Settings("", "") 134{ 135 // Placeholder copy constructor to prevent others from accidentally using 136 // the default copy constructor. Note, the DEBUGGER call is for the off 137 // chance that a TTrackerState method (or friend) tries to make a copy. 138 DEBUGGER("Don't make a copy of this!"); 139} 140 141 142TTrackerState::~TTrackerState() 143{ 144} 145 146 147void 148TTrackerState::SaveSettings(bool onlyIfNonDefault) 149{ 150 if (fSettingsLoaded) 151 _inherited::SaveSettings(onlyIfNonDefault); 152} 153 154 155void 156TTrackerState::LoadSettingsIfNeeded() 157{ 158 if (fSettingsLoaded) 159 return; 160 161 // Set default settings before reading from disk 162 163 Add(fShowDisksIcon = new BooleanValueSetting("ShowDisksIcon", false)); 164 Add(fMountVolumesOntoDesktop 165 = new BooleanValueSetting("MountVolumesOntoDesktop", true)); 166 Add(fMountSharedVolumesOntoDesktop = 167 new BooleanValueSetting("MountSharedVolumesOntoDesktop", true)); 168 Add(fEjectWhenUnmounting 169 = new BooleanValueSetting("EjectWhenUnmounting", true)); 170 171 Add(fDesktopFilePanelRoot 172 = new BooleanValueSetting("DesktopFilePanelRoot", true)); 173 Add(fShowFullPathInTitleBar 174 = new BooleanValueSetting("ShowFullPathInTitleBar", false)); 175 Add(fShowSelectionWhenInactive 176 = new BooleanValueSetting("ShowSelectionWhenInactive", true)); 177 Add(fTransparentSelection 178 = new BooleanValueSetting("TransparentSelection", true)); 179 Add(fSortFolderNamesFirst 180 = new BooleanValueSetting("SortFolderNamesFirst", true)); 181 Add(fHideDotFiles = new BooleanValueSetting("HideDotFiles", false)); 182 Add(fTypeAheadFiltering 183 = new BooleanValueSetting("TypeAheadFiltering", false)); 184 Add(fSingleWindowBrowse 185 = new BooleanValueSetting("SingleWindowBrowse", false)); 186 Add(fShowNavigator = new BooleanValueSetting("ShowNavigator", false)); 187 188 Add(fRecentApplicationsCount 189 = new ScalarValueSetting("RecentApplications", 10, "", "")); 190 Add(fRecentDocumentsCount 191 = new ScalarValueSetting("RecentDocuments", 10, "", "")); 192 Add(fRecentFoldersCount 193 = new ScalarValueSetting("RecentFolders", 10, "", "")); 194 195 Add(fShowVolumeSpaceBar 196 = new BooleanValueSetting("ShowVolumeSpaceBar", true)); 197 198 Add(fUsedSpaceColor 199 = new HexScalarValueSetting("UsedSpaceColor", 0xc000cb00, "", "")); 200 Add(fFreeSpaceColor 201 = new HexScalarValueSetting("FreeSpaceColor", 0xc0ffffff, "", "")); 202 Add(fWarningSpaceColor 203 = new HexScalarValueSetting("WarningSpaceColor", 0xc0cb0000, "", "")); 204 205 Add(fMoveFilesToTrash 206 = new BooleanValueSetting("MoveFilesToTrash", true)); 207 Add(fAskBeforeDeleteFile 208 = new BooleanValueSetting("AskBeforeDeleteFile", true)); 209 210 TryReadingSettings(); 211 212 NameAttributeText::SetSortFolderNamesFirst( 213 fSortFolderNamesFirst->Value()); 214 RealNameAttributeText::SetSortFolderNamesFirst( 215 fSortFolderNamesFirst->Value()); 216 217 fSettingsLoaded = true; 218} 219 220 221// #pragma mark - 222 223 224TrackerSettings::TrackerSettings() 225{ 226 gTrackerState.LoadSettingsIfNeeded(); 227} 228 229 230void 231TrackerSettings::SaveSettings(bool onlyIfNonDefault) 232{ 233 gTrackerState.SaveSettings(onlyIfNonDefault); 234} 235 236 237bool 238TrackerSettings::ShowDisksIcon() 239{ 240 return gTrackerState.fShowDisksIcon->Value(); 241} 242 243 244void 245TrackerSettings::SetShowDisksIcon(bool enabled) 246{ 247 gTrackerState.fShowDisksIcon->SetValue(enabled); 248} 249 250 251bool 252TrackerSettings::DesktopFilePanelRoot() 253{ 254 return gTrackerState.fDesktopFilePanelRoot->Value(); 255} 256 257 258void 259TrackerSettings::SetDesktopFilePanelRoot(bool enabled) 260{ 261 gTrackerState.fDesktopFilePanelRoot->SetValue(enabled); 262} 263 264 265bool 266TrackerSettings::MountVolumesOntoDesktop() 267{ 268 return gTrackerState.fMountVolumesOntoDesktop->Value(); 269} 270 271 272void 273TrackerSettings::SetMountVolumesOntoDesktop(bool enabled) 274{ 275 gTrackerState.fMountVolumesOntoDesktop->SetValue(enabled); 276} 277 278 279bool 280TrackerSettings::MountSharedVolumesOntoDesktop() 281{ 282 return gTrackerState.fMountSharedVolumesOntoDesktop->Value(); 283} 284 285 286void 287TrackerSettings::SetMountSharedVolumesOntoDesktop(bool enabled) 288{ 289 gTrackerState.fMountSharedVolumesOntoDesktop->SetValue(enabled); 290} 291 292 293bool 294TrackerSettings::EjectWhenUnmounting() 295{ 296 return gTrackerState.fEjectWhenUnmounting->Value(); 297} 298 299 300void 301TrackerSettings::SetEjectWhenUnmounting(bool enabled) 302{ 303 gTrackerState.fEjectWhenUnmounting->SetValue(enabled); 304} 305 306 307bool 308TrackerSettings::ShowVolumeSpaceBar() 309{ 310 return gTrackerState.fShowVolumeSpaceBar->Value(); 311} 312 313 314void 315TrackerSettings::SetShowVolumeSpaceBar(bool enabled) 316{ 317 gTrackerState.fShowVolumeSpaceBar->SetValue(enabled); 318} 319 320 321rgb_color 322TrackerSettings::UsedSpaceColor() 323{ 324 return ValueToColor(gTrackerState.fUsedSpaceColor->Value()); 325} 326 327 328void 329TrackerSettings::SetUsedSpaceColor(rgb_color color) 330{ 331 gTrackerState.fUsedSpaceColor->ValueChanged(ColorToValue(color)); 332} 333 334 335rgb_color 336TrackerSettings::FreeSpaceColor() 337{ 338 return ValueToColor(gTrackerState.fFreeSpaceColor->Value()); 339} 340 341 342void 343TrackerSettings::SetFreeSpaceColor(rgb_color color) 344{ 345 gTrackerState.fFreeSpaceColor->ValueChanged(ColorToValue(color)); 346} 347 348 349rgb_color 350TrackerSettings::WarningSpaceColor() 351{ 352 return ValueToColor(gTrackerState.fWarningSpaceColor->Value()); 353} 354 355 356void 357TrackerSettings::SetWarningSpaceColor(rgb_color color) 358{ 359 gTrackerState.fWarningSpaceColor->ValueChanged(ColorToValue(color)); 360} 361 362 363bool 364TrackerSettings::ShowFullPathInTitleBar() 365{ 366 return gTrackerState.fShowFullPathInTitleBar->Value(); 367} 368 369 370void 371TrackerSettings::SetShowFullPathInTitleBar(bool enabled) 372{ 373 gTrackerState.fShowFullPathInTitleBar->SetValue(enabled); 374} 375 376 377bool 378TrackerSettings::SortFolderNamesFirst() 379{ 380 return gTrackerState.fSortFolderNamesFirst->Value(); 381} 382 383 384void 385TrackerSettings::SetSortFolderNamesFirst(bool enabled) 386{ 387 gTrackerState.fSortFolderNamesFirst->SetValue(enabled); 388 NameAttributeText::SetSortFolderNamesFirst(enabled); 389 RealNameAttributeText::SetSortFolderNamesFirst(enabled); 390} 391 392 393bool 394TrackerSettings::HideDotFiles() 395{ 396 return gTrackerState.fHideDotFiles->Value(); 397} 398 399 400void 401TrackerSettings::SetHideDotFiles(bool hide) 402{ 403 gTrackerState.fHideDotFiles->SetValue(hide); 404} 405 406 407bool 408TrackerSettings::TypeAheadFiltering() 409{ 410 return gTrackerState.fTypeAheadFiltering->Value(); 411} 412 413 414void 415TrackerSettings::SetTypeAheadFiltering(bool enabled) 416{ 417 gTrackerState.fTypeAheadFiltering->SetValue(enabled); 418} 419 420 421bool 422TrackerSettings::ShowSelectionWhenInactive() 423{ 424 return gTrackerState.fShowSelectionWhenInactive->Value(); 425} 426 427 428void 429TrackerSettings::SetShowSelectionWhenInactive(bool enabled) 430{ 431 gTrackerState.fShowSelectionWhenInactive->SetValue(enabled); 432} 433 434 435bool 436TrackerSettings::TransparentSelection() 437{ 438 return gTrackerState.fTransparentSelection->Value(); 439} 440 441 442void 443TrackerSettings::SetTransparentSelection(bool enabled) 444{ 445 gTrackerState.fTransparentSelection->SetValue(enabled); 446} 447 448 449bool 450TrackerSettings::SingleWindowBrowse() 451{ 452 return gTrackerState.fSingleWindowBrowse->Value(); 453} 454 455 456void 457TrackerSettings::SetSingleWindowBrowse(bool enabled) 458{ 459 gTrackerState.fSingleWindowBrowse->SetValue(enabled); 460} 461 462 463bool 464TrackerSettings::ShowNavigator() 465{ 466 return gTrackerState.fShowNavigator->Value(); 467} 468 469 470void 471TrackerSettings::SetShowNavigator(bool enabled) 472{ 473 gTrackerState.fShowNavigator->SetValue(enabled); 474} 475 476 477void 478TrackerSettings::RecentCounts(int32* applications, int32* documents, 479 int32* folders) 480{ 481 if (applications) 482 *applications = gTrackerState.fRecentApplicationsCount->Value(); 483 if (documents) 484 *documents = gTrackerState.fRecentDocumentsCount->Value(); 485 if (folders) 486 *folders = gTrackerState.fRecentFoldersCount->Value(); 487} 488 489 490void 491TrackerSettings::SetRecentApplicationsCount(int32 count) 492{ 493 gTrackerState.fRecentApplicationsCount->ValueChanged(count); 494} 495 496 497void 498TrackerSettings::SetRecentDocumentsCount(int32 count) 499{ 500 gTrackerState.fRecentDocumentsCount->ValueChanged(count); 501} 502 503 504void 505TrackerSettings::SetRecentFoldersCount(int32 count) 506{ 507 gTrackerState.fRecentFoldersCount->ValueChanged(count); 508} 509 510 511bool 512TrackerSettings::MoveFilesToTrash() 513{ 514 return gTrackerState.fMoveFilesToTrash->Value(); 515} 516 517 518void 519TrackerSettings::SetMoveFilesToTrash(bool enabled) 520{ 521 gTrackerState.fMoveFilesToTrash->SetValue(enabled); 522} 523 524 525bool 526TrackerSettings::AskBeforeDeleteFile() 527{ 528 return gTrackerState.fAskBeforeDeleteFile->Value(); 529} 530 531 532void 533TrackerSettings::SetAskBeforeDeleteFile(bool enabled) 534{ 535 gTrackerState.fAskBeforeDeleteFile->SetValue(enabled); 536} 537