xref: /haiku/src/kits/tracker/AutoMounterSettings.cpp (revision 820dca4df6c7bf955c46e8f6521b9408f50b2900)
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 "AutoMounterSettings.h"
37 
38 #include <Alert.h>
39 #include <Box.h>
40 #include <Button.h>
41 #include <Catalog.h>
42 #include <CheckBox.h>
43 #include <ControlLook.h>
44 #include <Debug.h>
45 #include <LayoutBuilder.h>
46 #include <Locale.h>
47 #include <Message.h>
48 #include <RadioButton.h>
49 #include <SeparatorView.h>
50 #include <SpaceLayoutItem.h>
51 #include <Window.h>
52 
53 #include <MountServer.h>
54 
55 
56 const uint32 kAutomountSettingsChanged = 'achg';
57 const uint32 kBootMountSettingsChanged = 'bchg';
58 const uint32 kEjectWhenUnmountingChanged = 'ejct';
59 
60 #undef B_TRANSLATION_CONTEXT
61 #define B_TRANSLATION_CONTEXT "AutoMounterSettings"
62 
63 class AutomountSettingsPanel : public BBox {
64 public:
65 								AutomountSettingsPanel(BMessage* settings,
66 									const BMessenger& target);
67 	virtual						~AutomountSettingsPanel();
68 
69 protected:
70 	virtual	void				MessageReceived(BMessage* message);
71 	virtual	void				AttachedToWindow();
72 
73 private:
74 			void				_SendSettings(bool rescan);
75 
76 			BRadioButton*		fInitialDontMountCheck;
77 			BRadioButton*		fInitialMountAllBFSCheck;
78 			BRadioButton*		fInitialMountAllCheck;
79 			BRadioButton*		fInitialMountRestoreCheck;
80 
81 			BRadioButton*		fScanningDisabledCheck;
82 			BRadioButton*		fAutoMountAllBFSCheck;
83 			BRadioButton*		fAutoMountAllCheck;
84 
85 			BCheckBox*			fEjectWhenUnmountingCheckBox;
86 
87 			BButton*			fDone;
88 			BButton*			fMountAllNow;
89 
90 			BMessenger			fTarget;
91 
92 			typedef BBox _inherited;
93 };
94 
95 
96 AutomountSettingsDialog* AutomountSettingsDialog::sOneCopyOnly = NULL;
97 
98 
99 AutomountSettingsPanel::AutomountSettingsPanel(BMessage* settings,
100 		const BMessenger& target)
101 	:
102 	BBox("", B_WILL_DRAW | B_FRAME_EVENTS | B_NAVIGABLE_JUMP, B_NO_BORDER),
103 	fTarget(target)
104 {
105 	const float spacing = be_control_look->DefaultItemSpacing();
106 
107 	// "Automatic Disk Mounting" group
108 
109 	BBox* autoMountBox = new BBox("autoMountBox", B_WILL_DRAW | B_FRAME_EVENTS
110 		| B_PULSE_NEEDED | B_NAVIGABLE_JUMP);
111 	autoMountBox->SetLabel(B_TRANSLATE("Automatic disk mounting"));
112 	BGroupLayout* autoMountLayout = new BGroupLayout(B_VERTICAL, 0);
113 	autoMountBox->SetLayout(autoMountLayout);
114 	autoMountLayout->SetInsets(spacing,
115 		autoMountBox->InnerFrame().top + spacing / 2, spacing, spacing);
116 
117 	fScanningDisabledCheck = new BRadioButton("scanningOff",
118 		B_TRANSLATE("Don't automount"),
119 		new BMessage(kAutomountSettingsChanged));
120 
121 	fAutoMountAllBFSCheck = new BRadioButton("autoBFS",
122 		B_TRANSLATE("All BeOS disks"),
123 			new BMessage(kAutomountSettingsChanged));
124 
125 	fAutoMountAllCheck = new BRadioButton("autoAll",
126 		B_TRANSLATE("All disks"), new BMessage(kAutomountSettingsChanged));
127 
128 	// "Disk Mounting During Boot" group
129 
130 	BBox* bootMountBox = new BBox("", B_WILL_DRAW | B_FRAME_EVENTS
131 		| B_PULSE_NEEDED | B_NAVIGABLE_JUMP);
132 	bootMountBox->SetLabel(B_TRANSLATE("Disk mounting during boot"));
133 	BGroupLayout* bootMountLayout = new BGroupLayout(B_VERTICAL, 0);
134 	bootMountBox->SetLayout(bootMountLayout);
135 	bootMountLayout->SetInsets(spacing,
136 		bootMountBox->InnerFrame().top + spacing / 2, spacing, spacing);
137 
138 	fInitialDontMountCheck = new BRadioButton("initialNone",
139 		B_TRANSLATE("Only the boot disk"),
140 		new BMessage(kBootMountSettingsChanged));
141 
142 	fInitialMountRestoreCheck = new BRadioButton("initialRestore",
143 		B_TRANSLATE("Previously mounted disks"),
144 		new BMessage(kBootMountSettingsChanged));
145 
146 	fInitialMountAllBFSCheck = new BRadioButton("initialBFS",
147 		B_TRANSLATE("All BeOS disks"),
148 		new BMessage(kBootMountSettingsChanged));
149 
150 	fInitialMountAllCheck = new BRadioButton("initialAll",
151 		B_TRANSLATE("All disks"), new BMessage(kBootMountSettingsChanged));
152 
153 	fEjectWhenUnmountingCheckBox = new BCheckBox("ejectWhenUnmounting",
154 		B_TRANSLATE("Eject when unmounting"),
155 		new BMessage(kEjectWhenUnmountingChanged));
156 
157 	// Buttons
158 
159 	fDone = new BButton(B_TRANSLATE("Done"), new BMessage(B_QUIT_REQUESTED));
160 
161 	fMountAllNow = new BButton("mountAll", B_TRANSLATE("Mount all disks now"),
162 		new BMessage(kMountAllNow));
163 
164 	fDone->MakeDefault(true);
165 
166 	// Layout the controls
167 	BGroupView* contentView = new BGroupView(B_VERTICAL, 0);
168 	AddChild(contentView);
169 	BLayoutBuilder::Group<>(contentView)
170 		.AddGroup(B_VERTICAL, spacing)
171 			.SetInsets(spacing, spacing, spacing, spacing)
172 			.AddGroup(autoMountLayout)
173 				.Add(fScanningDisabledCheck)
174 				.Add(fAutoMountAllBFSCheck)
175 				.Add(fAutoMountAllCheck)
176 				.End()
177 			.AddGroup(bootMountLayout)
178 				.Add(fInitialDontMountCheck)
179 				.Add(fInitialMountRestoreCheck)
180 				.Add(fInitialMountAllBFSCheck)
181 				.Add(fInitialMountAllCheck)
182 				.End()
183 			.Add(fEjectWhenUnmountingCheckBox)
184 			.End()
185 		.Add(new BSeparatorView(B_HORIZONTAL/*, B_FANCY_BORDER*/))
186 		.AddGroup(B_HORIZONTAL, spacing)
187 			.SetInsets(0, spacing, spacing, spacing)
188 			.AddGlue()
189 			.Add(fMountAllNow)
190 			.Add(fDone);
191 
192 	// Apply the settings
193 
194 	bool result;
195 	if (settings->FindBool("autoMountAll", &result) == B_OK && result)
196 		fAutoMountAllCheck->SetValue(B_CONTROL_ON);
197 	else if (settings->FindBool("autoMountAllBFS", &result) == B_OK && result)
198 		fAutoMountAllBFSCheck->SetValue(B_CONTROL_ON);
199 	else
200 		fScanningDisabledCheck->SetValue(B_CONTROL_ON);
201 
202 	if (settings->FindBool("suspended", &result) == B_OK && result)
203 		fScanningDisabledCheck->SetValue(B_CONTROL_ON);
204 
205 	if (settings->FindBool("initialMountAll", &result) == B_OK && result)
206 		fInitialMountAllCheck->SetValue(B_CONTROL_ON);
207 	else if (settings->FindBool("initialMountRestore", &result) == B_OK
208 		&& result) {
209 		fInitialMountRestoreCheck->SetValue(B_CONTROL_ON);
210 	} else if (settings->FindBool("initialMountAllBFS", &result) == B_OK
211 		&& result) {
212 		fInitialMountAllBFSCheck->SetValue(B_CONTROL_ON);
213 	} else
214 		fInitialDontMountCheck->SetValue(B_CONTROL_ON);
215 
216 	if (settings->FindBool("ejectWhenUnmounting", &result) == B_OK && result)
217 		fEjectWhenUnmountingCheckBox->SetValue(B_CONTROL_ON);
218 }
219 
220 
221 AutomountSettingsPanel::~AutomountSettingsPanel()
222 {
223 }
224 
225 
226 void
227 AutomountSettingsPanel::AttachedToWindow()
228 {
229 	fInitialMountAllCheck->SetTarget(this);
230 	fInitialMountAllBFSCheck->SetTarget(this);
231 	fInitialMountRestoreCheck->SetTarget(this);
232 	fInitialDontMountCheck->SetTarget(this);
233 
234 	fAutoMountAllCheck->SetTarget(this);
235 	fAutoMountAllBFSCheck->SetTarget(this);
236 	fScanningDisabledCheck->SetTarget(this);
237 	fEjectWhenUnmountingCheckBox->SetTarget(this);
238 
239 	fDone->SetTarget(this);
240 	fMountAllNow->SetTarget(fTarget);
241 }
242 
243 
244 void
245 AutomountSettingsPanel::MessageReceived(BMessage* message)
246 {
247 	switch (message->what) {
248 		case B_QUIT_REQUESTED:
249 			Window()->Quit();
250 			break;
251 
252 		case kAutomountSettingsChanged:
253 			_SendSettings(true);
254 			break;
255 
256 		case kBootMountSettingsChanged:
257 		case kEjectWhenUnmountingChanged:
258 			_SendSettings(false);
259 			break;
260 
261 		default:
262 			_inherited::MessageReceived(message);
263 			break;
264 	}
265 }
266 
267 
268 void
269 AutomountSettingsPanel::_SendSettings(bool rescan)
270 {
271 	BMessage message(kSetAutomounterParams);
272 
273 	message.AddBool("autoMountAll", (bool)fAutoMountAllCheck->Value());
274 	message.AddBool("autoMountAllBFS", (bool)fAutoMountAllBFSCheck->Value());
275 	if (fAutoMountAllBFSCheck->Value())
276 		message.AddBool("autoMountAllHFS", false);
277 
278 	message.AddBool("suspended", (bool)fScanningDisabledCheck->Value());
279 	message.AddBool("rescanNow", rescan);
280 
281 	message.AddBool("initialMountAll", (bool)fInitialMountAllCheck->Value());
282 	message.AddBool("initialMountAllBFS",
283 		(bool)fInitialMountAllBFSCheck->Value());
284 	message.AddBool("initialMountRestore",
285 		(bool)fInitialMountRestoreCheck->Value());
286 	if (fInitialDontMountCheck->Value())
287 		message.AddBool("initialMountAllHFS", false);
288 
289 	message.AddBool("ejectWhenUnmounting",
290 		(bool)fEjectWhenUnmountingCheckBox->Value());
291 
292 	fTarget.SendMessage(&message);
293 }
294 
295 
296 //	#pragma mark -
297 
298 
299 AutomountSettingsDialog::AutomountSettingsDialog(BMessage* settings,
300 		const BMessenger& target)
301 	:
302 	BWindow(BRect(100, 100, 320, 370), B_TRANSLATE("Disk mount settings"),
303 		B_TITLED_WINDOW, B_NOT_RESIZABLE | B_NOT_ZOOMABLE
304 		| B_AUTO_UPDATE_SIZE_LIMITS)
305 {
306 	SetLayout(new BGroupLayout(B_HORIZONTAL));
307 	BView* view = new AutomountSettingsPanel(settings, target);
308 	AddChild(view);
309 
310 	ASSERT(!sOneCopyOnly);
311 	sOneCopyOnly = this;
312 }
313 
314 
315 AutomountSettingsDialog::~AutomountSettingsDialog()
316 {
317 	ASSERT(sOneCopyOnly);
318 	sOneCopyOnly = NULL;
319 }
320 
321 
322 void
323 AutomountSettingsDialog::RunAutomountSettings(const BMessenger& target)
324 {
325 	// either activate an existing mount settings dialog or create a new one
326 	if (sOneCopyOnly) {
327 		sOneCopyOnly->Activate();
328 		return;
329 	}
330 
331 	BMessage message(kGetAutomounterParams);
332 	BMessage reply;
333 	status_t ret = target.SendMessage(&message, &reply, 2500000);
334 	if (ret != B_OK) {
335 		BAlert* alert = new BAlert(B_TRANSLATE("Mount server error"),
336 			B_TRANSLATE("The mount server could not be contacted."),
337 			B_TRANSLATE("OK"),
338 			NULL, NULL, B_WIDTH_AS_USUAL, B_STOP_ALERT);
339 		alert->SetFlags(alert->Flags() | B_CLOSE_ON_ESCAPE);
340 		alert->Go();
341 		return;
342 	}
343 
344 	(new AutomountSettingsDialog(&reply, target))->Show();
345 }
346