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 "SettingsViews.h"
37
38#include <Box.h>
39#include <Button.h>
40#include <Catalog.h>
41#include <CheckBox.h>
42#include <ColorControl.h>
43#include <ControlLook.h>
44#include <LayoutBuilder.h>
45#include <Locale.h>
46#include <MenuField.h>
47#include <NodeMonitor.h>
48#include <Point.h>
49#include <RadioButton.h>
50#include <StringView.h>
51
52#include "Commands.h"
53#include "DeskWindow.h"
54#include "Model.h"
55#include "Tracker.h"
56#include "WidgetAttributeText.h"
57
58
59static const uint32 kSpaceBarSwitchColor = 'SBsc';
60
61//TODO: defaults should be set in one place only (TrackerSettings.cpp) while
62//		being accessible from here.
63//		What about adding DefaultValue(), IsDefault() etc... methods to
64//		xxxValueSetting ?
65static const uint8 kSpaceBarAlpha = 192;
66static const rgb_color kDefaultUsedSpaceColor = { 0, 203, 0, kSpaceBarAlpha };
67static const rgb_color kDefaultFreeSpaceColor
68	= { 255, 255, 255, kSpaceBarAlpha };
69static const rgb_color kDefaultWarningSpaceColor
70	= { 203, 0, 0, kSpaceBarAlpha };
71
72
73static void
74send_bool_notices(uint32 what, const char* name, bool value)
75{
76	TTracker* tracker = dynamic_cast<TTracker*>(be_app);
77	if (tracker == NULL)
78		return;
79
80	BMessage message;
81	message.AddBool(name, value);
82	tracker->SendNotices(what, &message);
83}
84
85
86#undef B_TRANSLATION_CONTEXT
87#define B_TRANSLATION_CONTEXT "SettingsView"
88
89
90//	#pragma mark - SettingsView
91
92
93SettingsView::SettingsView(const char* name)
94	:
95	BGroupView(name)
96{
97}
98
99
100SettingsView::~SettingsView()
101{
102}
103
104
105/*!
106	The inherited functions should set the default values
107	and update the UI gadgets. The latter can by done by
108	calling ShowCurrentSettings().
109*/
110void
111SettingsView::SetDefaults()
112{
113}
114
115
116/*!
117	This function is used by the window to tell whether
118	it can ghost the defaults button or not. It doesn't
119	shows the default settings, this function should
120	return true.
121*/
122bool
123SettingsView::IsDefaultable() const
124{
125	return true;
126}
127
128
129/*!
130	The inherited functions should set the values that was
131	active when the settings window opened. It should also
132	update the UI widgets accordingly, preferrable by calling
133	ShowCurrentSettings().
134*/
135void
136SettingsView::Revert()
137{
138}
139
140
141/*!
142	This function is called when the window is shown to let
143	the settings views record the state to revert to.
144*/
145void
146SettingsView::RecordRevertSettings()
147{
148}
149
150
151/*!
152	This function is used by the window to tell the view
153	to display the current settings in the tracker.
154*/
155void
156SettingsView::ShowCurrentSettings()
157{
158}
159
160
161/*!
162	This function is used by the window to tell whether
163	it can ghost the revert button or not. It it shows the
164	reverted settings, this function should return true.
165*/
166bool
167SettingsView::IsRevertable() const
168{
169	return true;
170}
171
172
173// #pragma mark - DesktopSettingsView
174
175
176DesktopSettingsView::DesktopSettingsView()
177	:
178	SettingsView("DesktopSettingsView"),
179	fShowDisksIconRadioButton(NULL),
180	fMountVolumesOntoDesktopRadioButton(NULL),
181	fMountSharedVolumesOntoDesktopCheckBox(NULL),
182	fShowDisksIcon(false),
183	fMountVolumesOntoDesktop(false),
184	fMountSharedVolumesOntoDesktop(false),
185	fIntegrateNonBootBeOSDesktops(false),
186	fEjectWhenUnmounting(false)
187{
188	fShowDisksIconRadioButton = new BRadioButton("",
189		B_TRANSLATE("Show Disks icon"),
190		new BMessage(kShowDisksIconChanged));
191
192	fMountVolumesOntoDesktopRadioButton = new BRadioButton("",
193		B_TRANSLATE("Show volumes on Desktop"),
194		new BMessage(kVolumesOnDesktopChanged));
195
196	fMountSharedVolumesOntoDesktopCheckBox = new BCheckBox("",
197		B_TRANSLATE("Show shared volumes on Desktop"),
198		new BMessage(kVolumesOnDesktopChanged));
199
200	const float spacing = be_control_look->DefaultItemSpacing();
201
202	BLayoutBuilder::Group<>(this, B_VERTICAL, 0)
203		.Add(fShowDisksIconRadioButton)
204		.Add(fMountVolumesOntoDesktopRadioButton)
205		.AddGroup(B_VERTICAL, 0)
206			.Add(fMountSharedVolumesOntoDesktopCheckBox)
207			.SetInsets(spacing * 2, 0, 0, 0)
208			.End()
209		.AddGlue()
210		.SetInsets(spacing);
211}
212
213
214void
215DesktopSettingsView::AttachedToWindow()
216{
217	fShowDisksIconRadioButton->SetTarget(this);
218	fMountVolumesOntoDesktopRadioButton->SetTarget(this);
219	fMountSharedVolumesOntoDesktopCheckBox->SetTarget(this);
220}
221
222
223void
224DesktopSettingsView::MessageReceived(BMessage* message)
225{
226	TTracker* tracker = dynamic_cast<TTracker*>(be_app);
227	if (tracker == NULL)
228		return;
229
230	TrackerSettings settings;
231
232	switch (message->what) {
233		case kShowDisksIconChanged:
234		{
235			// Turn on and off related settings:
236			fMountVolumesOntoDesktopRadioButton->SetValue(
237				!(fShowDisksIconRadioButton->Value() == 1));
238			fMountSharedVolumesOntoDesktopCheckBox->SetEnabled(
239				fMountVolumesOntoDesktopRadioButton->Value() == 1);
240
241			// Set the new settings in the tracker:
242			settings.SetShowDisksIcon(fShowDisksIconRadioButton->Value() == 1);
243			settings.SetMountVolumesOntoDesktop(
244				fMountVolumesOntoDesktopRadioButton->Value() == 1);
245			settings.SetMountSharedVolumesOntoDesktop(
246				fMountSharedVolumesOntoDesktopCheckBox->Value() == 1);
247
248			// Construct the notification message:
249			BMessage notificationMessage;
250			notificationMessage.AddBool("ShowDisksIcon",
251				fShowDisksIconRadioButton->Value() == 1);
252			notificationMessage.AddBool("MountVolumesOntoDesktop",
253				fMountVolumesOntoDesktopRadioButton->Value() == 1);
254			notificationMessage.AddBool("MountSharedVolumesOntoDesktop",
255				fMountSharedVolumesOntoDesktopCheckBox->Value() == 1);
256
257			// Send the notification message:
258			tracker->SendNotices(kVolumesOnDesktopChanged,
259				&notificationMessage);
260
261			// Tell the settings window the contents have changed:
262			Window()->PostMessage(kSettingsContentsModified);
263			break;
264		}
265
266		case kVolumesOnDesktopChanged:
267		{
268			// Turn on and off related settings:
269			fShowDisksIconRadioButton->SetValue(
270				!(fMountVolumesOntoDesktopRadioButton->Value() == 1));
271			fMountSharedVolumesOntoDesktopCheckBox->SetEnabled(
272				fMountVolumesOntoDesktopRadioButton->Value() == 1);
273
274			// Set the new settings in the tracker:
275			settings.SetShowDisksIcon(fShowDisksIconRadioButton->Value() == 1);
276			settings.SetMountVolumesOntoDesktop(
277				fMountVolumesOntoDesktopRadioButton->Value() == 1);
278			settings.SetMountSharedVolumesOntoDesktop(
279				fMountSharedVolumesOntoDesktopCheckBox->Value() == 1);
280
281			// Construct the notification message:
282			BMessage notificationMessage;
283			notificationMessage.AddBool("ShowDisksIcon",
284				fShowDisksIconRadioButton->Value() == 1);
285			notificationMessage.AddBool("MountVolumesOntoDesktop",
286				fMountVolumesOntoDesktopRadioButton->Value() == 1);
287			notificationMessage.AddBool("MountSharedVolumesOntoDesktop",
288				fMountSharedVolumesOntoDesktopCheckBox->Value() == 1);
289
290			// Send the notification message:
291			tracker->SendNotices(kVolumesOnDesktopChanged,\
292				&notificationMessage);
293
294			// Tell the settings window the contents have changed:
295			Window()->PostMessage(kSettingsContentsModified);
296			break;
297		}
298
299		default:
300			_inherited::MessageReceived(message);
301			break;
302	}
303}
304
305
306void
307DesktopSettingsView::SetDefaults()
308{
309	// ToDo: Avoid the duplication of the default values.
310	TrackerSettings settings;
311
312	settings.SetShowDisksIcon(false);
313	settings.SetMountVolumesOntoDesktop(true);
314	settings.SetMountSharedVolumesOntoDesktop(true);
315	settings.SetEjectWhenUnmounting(true);
316
317	ShowCurrentSettings();
318	_SendNotices();
319}
320
321
322bool
323DesktopSettingsView::IsDefaultable() const
324{
325	TrackerSettings settings;
326
327	return settings.ShowDisksIcon() != false
328		|| settings.MountVolumesOntoDesktop() != true
329		|| settings.MountSharedVolumesOntoDesktop() != true
330		|| settings.EjectWhenUnmounting() != true;
331}
332
333
334void
335DesktopSettingsView::Revert()
336{
337	TrackerSettings settings;
338
339	settings.SetShowDisksIcon(fShowDisksIcon);
340	settings.SetMountVolumesOntoDesktop(fMountVolumesOntoDesktop);
341	settings.SetMountSharedVolumesOntoDesktop(fMountSharedVolumesOntoDesktop);
342	settings.SetEjectWhenUnmounting(fEjectWhenUnmounting);
343
344	ShowCurrentSettings();
345	_SendNotices();
346}
347
348
349void
350DesktopSettingsView::_SendNotices()
351{
352	TTracker* tracker = dynamic_cast<TTracker*>(be_app);
353	if (tracker == NULL)
354		return;
355
356	// Construct the notification message:
357	BMessage notificationMessage;
358	notificationMessage.AddBool("ShowDisksIcon",
359		fShowDisksIconRadioButton->Value() == 1);
360	notificationMessage.AddBool("MountVolumesOntoDesktop",
361		fMountVolumesOntoDesktopRadioButton->Value() == 1);
362	notificationMessage.AddBool("MountSharedVolumesOntoDesktop",
363		fMountSharedVolumesOntoDesktopCheckBox->Value() == 1);
364
365	// Send notices to the tracker about the change:
366	tracker->SendNotices(kVolumesOnDesktopChanged, &notificationMessage);
367	tracker->SendNotices(kDesktopIntegrationChanged, &notificationMessage);
368}
369
370
371void
372DesktopSettingsView::ShowCurrentSettings()
373{
374	TrackerSettings settings;
375
376	fShowDisksIconRadioButton->SetValue(settings.ShowDisksIcon());
377	fMountVolumesOntoDesktopRadioButton->SetValue(
378		settings.MountVolumesOntoDesktop());
379
380	fMountSharedVolumesOntoDesktopCheckBox->SetValue(
381		settings.MountSharedVolumesOntoDesktop());
382	fMountSharedVolumesOntoDesktopCheckBox->SetEnabled(
383		settings.MountVolumesOntoDesktop());
384}
385
386
387void
388DesktopSettingsView::RecordRevertSettings()
389{
390	TrackerSettings settings;
391
392	fShowDisksIcon = settings.ShowDisksIcon();
393	fMountVolumesOntoDesktop = settings.MountVolumesOntoDesktop();
394	fMountSharedVolumesOntoDesktop = settings.MountSharedVolumesOntoDesktop();
395	fEjectWhenUnmounting = settings.EjectWhenUnmounting();
396}
397
398
399bool
400DesktopSettingsView::IsRevertable() const
401{
402	return fShowDisksIcon != (fShowDisksIconRadioButton->Value() > 0)
403		|| fMountVolumesOntoDesktop !=
404			(fMountVolumesOntoDesktopRadioButton->Value() > 0)
405		|| fMountSharedVolumesOntoDesktop !=
406			(fMountSharedVolumesOntoDesktopCheckBox->Value() > 0);
407}
408
409
410// #pragma mark - WindowsSettingsView
411
412
413WindowsSettingsView::WindowsSettingsView()
414	:
415	SettingsView("WindowsSettingsView"),
416	fShowFullPathInTitleBarCheckBox(NULL),
417	fSingleWindowBrowseCheckBox(NULL),
418	fShowNavigatorCheckBox(NULL),
419	fOutlineSelectionCheckBox(NULL),
420	fSortFolderNamesFirstCheckBox(NULL),
421	fHideDotFilesCheckBox(NULL),
422	fTypeAheadFilteringCheckBox(NULL),
423	fShowFullPathInTitleBar(false),
424	fSingleWindowBrowse(false),
425	fShowNavigator(false),
426	fTransparentSelection(false),
427	fSortFolderNamesFirst(false),
428	fHideDotFiles(false),
429	fTypeAheadFiltering(false)
430{
431	fShowFullPathInTitleBarCheckBox = new BCheckBox("",
432		B_TRANSLATE("Show folder location in title tab"),
433		new BMessage(kWindowsShowFullPathChanged));
434
435	fSingleWindowBrowseCheckBox = new BCheckBox("",
436		B_TRANSLATE("Single window navigation"),
437		new BMessage(kSingleWindowBrowseChanged));
438
439	fShowNavigatorCheckBox = new BCheckBox("",
440		B_TRANSLATE("Show navigator"),
441		new BMessage(kShowNavigatorChanged));
442
443	fOutlineSelectionCheckBox = new BCheckBox("",
444		B_TRANSLATE("Outline selection rectangle only"),
445		new BMessage(kTransparentSelectionChanged));
446
447	fSortFolderNamesFirstCheckBox = new BCheckBox("",
448		B_TRANSLATE("List folders first"),
449		new BMessage(kSortFolderNamesFirstChanged));
450
451	fHideDotFilesCheckBox = new BCheckBox("",
452		B_TRANSLATE("Hide dotfiles"),
453		new BMessage(kHideDotFilesChanged));
454
455	fTypeAheadFilteringCheckBox = new BCheckBox("",
456		B_TRANSLATE("Enable type-ahead filtering"),
457		new BMessage(kTypeAheadFilteringChanged));
458
459	const float spacing = be_control_look->DefaultItemSpacing();
460
461	BLayoutBuilder::Group<>(this, B_VERTICAL, 0)
462		.AddGroup(B_VERTICAL, 0)
463			.Add(fShowFullPathInTitleBarCheckBox)
464			.Add(fSingleWindowBrowseCheckBox)
465			.End()
466		.AddGroup(B_VERTICAL)
467			.Add(fShowNavigatorCheckBox)
468			.SetInsets(spacing * 2, 0, 0, 0)
469			.End()
470		.AddGroup(B_VERTICAL, 0)
471			.Add(fOutlineSelectionCheckBox)
472			.Add(fSortFolderNamesFirstCheckBox)
473			.Add(fHideDotFilesCheckBox)
474			.Add(fTypeAheadFilteringCheckBox)
475			.End()
476		.AddGlue()
477		.SetInsets(spacing);
478}
479
480
481void
482WindowsSettingsView::AttachedToWindow()
483{
484	fSingleWindowBrowseCheckBox->SetTarget(this);
485	fShowNavigatorCheckBox->SetTarget(this);
486	fShowFullPathInTitleBarCheckBox->SetTarget(this);
487	fOutlineSelectionCheckBox->SetTarget(this);
488	fSortFolderNamesFirstCheckBox->SetTarget(this);
489	fHideDotFilesCheckBox->SetTarget(this);
490	fTypeAheadFilteringCheckBox->SetTarget(this);
491}
492
493
494void
495WindowsSettingsView::MessageReceived(BMessage* message)
496{
497	TTracker* tracker = dynamic_cast<TTracker*>(be_app);
498	if (tracker == NULL)
499		return;
500
501	TrackerSettings settings;
502
503	switch (message->what) {
504		case kWindowsShowFullPathChanged:
505			settings.SetShowFullPathInTitleBar(
506				fShowFullPathInTitleBarCheckBox->Value() == 1);
507			tracker->SendNotices(kWindowsShowFullPathChanged);
508			Window()->PostMessage(kSettingsContentsModified);
509			break;
510
511		case kSingleWindowBrowseChanged:
512			settings.SetSingleWindowBrowse(
513				fSingleWindowBrowseCheckBox->Value() == 1);
514			if (fSingleWindowBrowseCheckBox->Value() == 0) {
515				fShowNavigatorCheckBox->SetEnabled(false);
516				settings.SetShowNavigator(0);
517			} else {
518				fShowNavigatorCheckBox->SetEnabled(true);
519				settings.SetShowNavigator(
520					fShowNavigatorCheckBox->Value() != 0);
521			}
522			tracker->SendNotices(kShowNavigatorChanged);
523			tracker->SendNotices(kSingleWindowBrowseChanged);
524			Window()->PostMessage(kSettingsContentsModified);
525			break;
526
527		case kShowNavigatorChanged:
528			settings.SetShowNavigator(fShowNavigatorCheckBox->Value() == 1);
529			tracker->SendNotices(kShowNavigatorChanged);
530			Window()->PostMessage(kSettingsContentsModified);
531			break;
532
533		case kTransparentSelectionChanged:
534		{
535			settings.SetTransparentSelection(
536				fOutlineSelectionCheckBox->Value() == B_CONTROL_OFF);
537
538			// Make the notification message and send it to the tracker:
539			send_bool_notices(kTransparentSelectionChanged,
540				"TransparentSelection", settings.TransparentSelection());
541
542			Window()->PostMessage(kSettingsContentsModified);
543			break;
544		}
545
546		case kSortFolderNamesFirstChanged:
547		{
548			settings.SetSortFolderNamesFirst(
549				fSortFolderNamesFirstCheckBox->Value() == 1);
550
551			// Make the notification message and send it to the tracker:
552			send_bool_notices(kSortFolderNamesFirstChanged,
553				"SortFolderNamesFirst",
554				fSortFolderNamesFirstCheckBox->Value() == 1);
555
556			Window()->PostMessage(kSettingsContentsModified);
557			break;
558		}
559
560		case kHideDotFilesChanged:
561		{
562			settings.SetHideDotFiles(
563				fHideDotFilesCheckBox->Value() == 1);
564
565			// Make the notification message and send it to the tracker:
566			send_bool_notices(kHideDotFilesChanged,
567				"HideDotFiles",
568				fHideDotFilesCheckBox->Value() == 1);
569
570			Window()->PostMessage(kSettingsContentsModified);
571			break;
572		}
573
574		case kTypeAheadFilteringChanged:
575		{
576			settings.SetTypeAheadFiltering(
577				fTypeAheadFilteringCheckBox->Value() == 1);
578			send_bool_notices(kTypeAheadFilteringChanged,
579				"TypeAheadFiltering",
580				fTypeAheadFilteringCheckBox->Value() == 1);
581			Window()->PostMessage(kSettingsContentsModified);
582			break;
583		}
584
585		default:
586			_inherited::MessageReceived(message);
587			break;
588	}
589}
590
591
592void
593WindowsSettingsView::SetDefaults()
594{
595	TTracker* tracker = dynamic_cast<TTracker*>(be_app);
596	if (tracker == NULL)
597		return;
598
599	TrackerSettings settings;
600
601	if (settings.ShowFullPathInTitleBar()) {
602		settings.SetShowFullPathInTitleBar(false);
603		tracker->SendNotices(kWindowsShowFullPathChanged);
604	}
605
606	if (settings.SingleWindowBrowse()) {
607		settings.SetSingleWindowBrowse(false);
608		tracker->SendNotices(kSingleWindowBrowseChanged);
609	}
610
611	if (settings.ShowNavigator()) {
612		settings.SetShowNavigator(false);
613		tracker->SendNotices(kShowNavigatorChanged);
614	}
615
616	if (!settings.TransparentSelection()) {
617		settings.SetTransparentSelection(true);
618		send_bool_notices(kTransparentSelectionChanged,
619			"TransparentSelection", true);
620	}
621
622	if (!settings.SortFolderNamesFirst()) {
623		settings.SetSortFolderNamesFirst(true);
624		send_bool_notices(kSortFolderNamesFirstChanged,
625			"SortFolderNamesFirst", true);
626	}
627
628	if (!settings.HideDotFiles()) {
629		settings.SetHideDotFiles(true);
630		send_bool_notices(kHideDotFilesChanged,
631			"HideDotFiles", true);
632	}
633
634	if (settings.TypeAheadFiltering()) {
635		settings.SetTypeAheadFiltering(false);
636		send_bool_notices(kTypeAheadFilteringChanged,
637			"TypeAheadFiltering", true);
638	}
639
640	ShowCurrentSettings();
641}
642
643
644bool
645WindowsSettingsView::IsDefaultable() const
646{
647	TrackerSettings settings;
648
649	return settings.ShowFullPathInTitleBar() != false
650		|| settings.SingleWindowBrowse() != false
651		|| settings.ShowNavigator() != false
652		|| settings.TransparentSelection() != true
653		|| settings.SortFolderNamesFirst() != true
654		|| settings.TypeAheadFiltering() != false;
655}
656
657
658void
659WindowsSettingsView::Revert()
660{
661	TTracker* tracker = dynamic_cast<TTracker*>(be_app);
662	if (tracker == NULL)
663		return;
664
665	TrackerSettings settings;
666
667	if (settings.ShowFullPathInTitleBar() != fShowFullPathInTitleBar) {
668		settings.SetShowFullPathInTitleBar(fShowFullPathInTitleBar);
669		tracker->SendNotices(kWindowsShowFullPathChanged);
670	}
671
672	if (settings.SingleWindowBrowse() != fSingleWindowBrowse) {
673		settings.SetSingleWindowBrowse(fSingleWindowBrowse);
674		tracker->SendNotices(kSingleWindowBrowseChanged);
675	}
676
677	if (settings.ShowNavigator() != fShowNavigator) {
678		settings.SetShowNavigator(fShowNavigator);
679		tracker->SendNotices(kShowNavigatorChanged);
680	}
681
682	if (settings.TransparentSelection() != fTransparentSelection) {
683		settings.SetTransparentSelection(fTransparentSelection);
684		send_bool_notices(kTransparentSelectionChanged,
685			"TransparentSelection", fTransparentSelection);
686	}
687
688	if (settings.SortFolderNamesFirst() != fSortFolderNamesFirst) {
689		settings.SetSortFolderNamesFirst(fSortFolderNamesFirst);
690		send_bool_notices(kSortFolderNamesFirstChanged,
691			"SortFolderNamesFirst", fSortFolderNamesFirst);
692	}
693
694	if (settings.HideDotFiles() != fHideDotFiles) {
695		settings.SetSortFolderNamesFirst(fHideDotFiles);
696		send_bool_notices(kHideDotFilesChanged,
697			"HideDotFiles", fHideDotFiles);
698	}
699
700	if (settings.TypeAheadFiltering() != fTypeAheadFiltering) {
701		settings.SetTypeAheadFiltering(fTypeAheadFiltering);
702		send_bool_notices(kTypeAheadFilteringChanged,
703			"TypeAheadFiltering", fTypeAheadFiltering);
704	}
705
706	ShowCurrentSettings();
707}
708
709
710void
711WindowsSettingsView::ShowCurrentSettings()
712{
713	TrackerSettings settings;
714
715	fShowFullPathInTitleBarCheckBox->SetValue(
716		settings.ShowFullPathInTitleBar());
717	fSingleWindowBrowseCheckBox->SetValue(settings.SingleWindowBrowse());
718	fShowNavigatorCheckBox->SetEnabled(settings.SingleWindowBrowse());
719	fShowNavigatorCheckBox->SetValue(settings.ShowNavigator());
720	fOutlineSelectionCheckBox->SetValue(settings.TransparentSelection()
721		? B_CONTROL_OFF : B_CONTROL_ON);
722	fSortFolderNamesFirstCheckBox->SetValue(settings.SortFolderNamesFirst());
723	fHideDotFilesCheckBox->SetValue(settings.HideDotFiles());
724	fTypeAheadFilteringCheckBox->SetValue(settings.TypeAheadFiltering());
725}
726
727
728void
729WindowsSettingsView::RecordRevertSettings()
730{
731	TrackerSettings settings;
732
733	fShowFullPathInTitleBar = settings.ShowFullPathInTitleBar();
734	fSingleWindowBrowse = settings.SingleWindowBrowse();
735	fShowNavigator = settings.ShowNavigator();
736	fTransparentSelection = settings.TransparentSelection();
737	fSortFolderNamesFirst = settings.SortFolderNamesFirst();
738	fHideDotFiles = settings.HideDotFiles();
739	fTypeAheadFiltering = settings.TypeAheadFiltering();
740}
741
742
743bool
744WindowsSettingsView::IsRevertable() const
745{
746	TrackerSettings settings;
747
748	return fShowFullPathInTitleBar != settings.ShowFullPathInTitleBar()
749		|| fSingleWindowBrowse != settings.SingleWindowBrowse()
750		|| fShowNavigator != settings.ShowNavigator()
751		|| fTransparentSelection != settings.TransparentSelection()
752		|| fSortFolderNamesFirst != settings.SortFolderNamesFirst()
753		|| fHideDotFiles != settings.HideDotFiles()
754		|| fTypeAheadFiltering != settings.TypeAheadFiltering();
755}
756
757
758// #pragma mark - SpaceBarSettingsView
759
760
761SpaceBarSettingsView::SpaceBarSettingsView()
762	:
763	SettingsView("SpaceBarSettingsView")
764{
765	fSpaceBarShowCheckBox = new BCheckBox("",
766		B_TRANSLATE("Show space bars on volumes"),
767		new BMessage(kUpdateVolumeSpaceBar));
768
769	BPopUpMenu* menu = new BPopUpMenu(B_EMPTY_STRING);
770	menu->SetFont(be_plain_font);
771
772	BMenuItem* item;
773	menu->AddItem(item = new BMenuItem(
774		B_TRANSLATE("Used space color"),
775		new BMessage(kSpaceBarSwitchColor)));
776	item->SetMarked(true);
777	fCurrentColor = 0;
778	menu->AddItem(new BMenuItem(
779		B_TRANSLATE("Free space color"),
780		new BMessage(kSpaceBarSwitchColor)));
781	menu->AddItem(new BMenuItem(
782		B_TRANSLATE("Warning space color"),
783		new BMessage(kSpaceBarSwitchColor)));
784
785	fColorPicker = new BMenuField("menu", NULL, menu);
786
787	fColorControl = new BColorControl(BPoint(0, 0),
788		B_CELLS_16x16, 1, "SpaceColorControl",
789		new BMessage(kSpaceBarColorChanged));
790	fColorControl->SetValue(TrackerSettings().UsedSpaceColor());
791
792	BBox* box = new BBox("box");
793	box->SetLabel(fColorPicker);
794	box->AddChild(BLayoutBuilder::Group<>(B_HORIZONTAL)
795		.Add(fColorControl)
796		.SetInsets(B_USE_DEFAULT_SPACING)
797		.View());
798
799	BLayoutBuilder::Group<>(this, B_VERTICAL)
800		.Add(fSpaceBarShowCheckBox)
801		.Add(box)
802		.AddGlue()
803		.SetInsets(B_USE_DEFAULT_SPACING);
804}
805
806
807SpaceBarSettingsView::~SpaceBarSettingsView()
808{
809}
810
811
812void
813SpaceBarSettingsView::AttachedToWindow()
814{
815	fSpaceBarShowCheckBox->SetTarget(this);
816	fColorControl->SetTarget(this);
817	fColorPicker->Menu()->SetTargetForItems(this);
818}
819
820
821void
822SpaceBarSettingsView::MessageReceived(BMessage* message)
823{
824	TTracker* tracker = dynamic_cast<TTracker*>(be_app);
825	if (tracker == NULL)
826		return;
827
828	TrackerSettings settings;
829
830	switch (message->what) {
831		case kUpdateVolumeSpaceBar:
832		{
833			settings.SetShowVolumeSpaceBar(
834				fSpaceBarShowCheckBox->Value() == 1);
835			Window()->PostMessage(kSettingsContentsModified);
836			tracker->PostMessage(kShowVolumeSpaceBar);
837			break;
838		}
839
840		case kSpaceBarSwitchColor:
841		{
842			fCurrentColor = message->FindInt32("index");
843			switch (fCurrentColor) {
844				case 0:
845					fColorControl->SetValue(settings.UsedSpaceColor());
846					break;
847
848				case 1:
849					fColorControl->SetValue(settings.FreeSpaceColor());
850					break;
851
852				case 2:
853					fColorControl->SetValue(settings.WarningSpaceColor());
854					break;
855			}
856			break;
857		}
858
859		case kSpaceBarColorChanged:
860		{
861			rgb_color color = fColorControl->ValueAsColor();
862			color.alpha = kSpaceBarAlpha;
863				// alpha is ignored by BColorControl but is checked
864				// in equalities
865
866			switch (fCurrentColor) {
867				case 0:
868					settings.SetUsedSpaceColor(color);
869					break;
870
871				case 1:
872					settings.SetFreeSpaceColor(color);
873					break;
874
875				case 2:
876					settings.SetWarningSpaceColor(color);
877					break;
878			}
879
880			BWindow* window = Window();
881			if (window != NULL)
882				window->PostMessage(kSettingsContentsModified);
883
884			tracker->PostMessage(kSpaceBarColorChanged);
885			break;
886		}
887
888		default:
889			_inherited::MessageReceived(message);
890			break;
891	}
892}
893
894
895void
896SpaceBarSettingsView::SetDefaults()
897{
898	TTracker* tracker = dynamic_cast<TTracker*>(be_app);
899	if (tracker == NULL)
900		return;
901
902	TrackerSettings settings;
903
904	if (!settings.ShowVolumeSpaceBar()) {
905		settings.SetShowVolumeSpaceBar(true);
906		send_bool_notices(kShowVolumeSpaceBar, "ShowVolumeSpaceBar", true);
907	}
908
909	if (settings.UsedSpaceColor() != kDefaultUsedSpaceColor
910		|| settings.FreeSpaceColor() != kDefaultFreeSpaceColor
911		|| settings.WarningSpaceColor() != kDefaultWarningSpaceColor) {
912		settings.SetUsedSpaceColor(kDefaultUsedSpaceColor);
913		settings.SetFreeSpaceColor(kDefaultFreeSpaceColor);
914		settings.SetWarningSpaceColor(kDefaultWarningSpaceColor);
915		tracker->SendNotices(kSpaceBarColorChanged);
916	}
917
918	ShowCurrentSettings();
919}
920
921
922bool
923SpaceBarSettingsView::IsDefaultable() const
924{
925	TrackerSettings settings;
926
927	return settings.ShowVolumeSpaceBar() != true
928		|| settings.UsedSpaceColor() != kDefaultUsedSpaceColor
929		|| settings.FreeSpaceColor() != kDefaultFreeSpaceColor
930		|| settings.WarningSpaceColor() != kDefaultWarningSpaceColor;
931}
932
933
934void
935SpaceBarSettingsView::Revert()
936{
937	TTracker* tracker = dynamic_cast<TTracker*>(be_app);
938	if (tracker == NULL)
939		return;
940
941	TrackerSettings settings;
942
943	if (settings.ShowVolumeSpaceBar() != fSpaceBarShow) {
944		settings.SetShowVolumeSpaceBar(fSpaceBarShow);
945		send_bool_notices(kShowVolumeSpaceBar, "ShowVolumeSpaceBar",
946			fSpaceBarShow);
947	}
948
949	if (settings.UsedSpaceColor() != fUsedSpaceColor
950		|| settings.FreeSpaceColor() != fFreeSpaceColor
951		|| settings.WarningSpaceColor() != fWarningSpaceColor) {
952		settings.SetUsedSpaceColor(fUsedSpaceColor);
953		settings.SetFreeSpaceColor(fFreeSpaceColor);
954		settings.SetWarningSpaceColor(fWarningSpaceColor);
955		tracker->SendNotices(kSpaceBarColorChanged);
956	}
957
958	ShowCurrentSettings();
959}
960
961
962void
963SpaceBarSettingsView::ShowCurrentSettings()
964{
965	TrackerSettings settings;
966
967	fSpaceBarShowCheckBox->SetValue(settings.ShowVolumeSpaceBar());
968
969	switch (fCurrentColor) {
970		case 0:
971			fColorControl->SetValue(settings.UsedSpaceColor());
972			break;
973		case 1:
974			fColorControl->SetValue(settings.FreeSpaceColor());
975			break;
976		case 2:
977			fColorControl->SetValue(settings.WarningSpaceColor());
978			break;
979	}
980}
981
982
983void
984SpaceBarSettingsView::RecordRevertSettings()
985{
986	TrackerSettings settings;
987
988	fSpaceBarShow = settings.ShowVolumeSpaceBar();
989	fUsedSpaceColor = settings.UsedSpaceColor();
990	fFreeSpaceColor = settings.FreeSpaceColor();
991	fWarningSpaceColor = settings.WarningSpaceColor();
992}
993
994
995bool
996SpaceBarSettingsView::IsRevertable() const
997{
998	TrackerSettings settings;
999
1000	return fSpaceBarShow != settings.ShowVolumeSpaceBar()
1001		|| fUsedSpaceColor != settings.UsedSpaceColor()
1002		|| fFreeSpaceColor != settings.FreeSpaceColor()
1003		|| fWarningSpaceColor != settings.WarningSpaceColor();
1004}
1005