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