1/*
2 * Copyright 2003-2005, Waldemar Kornewald <wkornew@gmx.net>
3 * Distributed under the terms of the MIT License.
4 */
5
6//-----------------------------------------------------------------------
7// ConnectionOptionsAddon saves the loaded settings.
8// ConnectionOptionsView saves the current settings.
9//-----------------------------------------------------------------------
10
11#include "ConnectionOptionsAddon.h"
12
13#include "MessageDriverSettingsUtils.h"
14
15#include <PPPDefs.h>
16#include <settings_tools.h>
17
18
19// message constants
20static const uint32 kMsgUpdateControls = 'UCTL';
21
22// labels
23static const char *kLabelConnectionOptions = "Options";
24static const char *kLabelAskBeforeConnecting = "Ask Before Connecting";
25static const char *kLabelAutoReconnect = "Reconnect Automatically";
26
27
28ConnectionOptionsAddon::ConnectionOptionsAddon(BMessage *addons)
29	: DialUpAddon(addons),
30	fSettings(NULL),
31	fConnectionOptionsView(NULL)
32{
33	CreateView(BPoint(0,0));
34	fDeleteView = true;
35}
36
37
38ConnectionOptionsAddon::~ConnectionOptionsAddon()
39{
40	if(fDeleteView)
41		delete fConnectionOptionsView;
42}
43
44
45bool
46ConnectionOptionsAddon::LoadSettings(BMessage *settings, bool isNew)
47{
48	fIsNew = isNew;
49	fAskBeforeConnecting = fDoesAutoReconnect = false;
50	fSettings = settings;
51
52	fConnectionOptionsView->Reload();
53		// reset all views (empty settings)
54
55	if(!settings || isNew)
56		return true;
57
58	BMessage parameter;
59	int32 index = 0;
60	const char *value;
61	if(FindMessageParameter(PPP_ASK_BEFORE_CONNECTING_KEY, *fSettings, &parameter,
62			&index) && parameter.FindString(MDSU_VALUES, &value) == B_OK) {
63		if(get_boolean_value(value, false))
64			fAskBeforeConnecting = true;
65
66		parameter.AddBool(MDSU_VALID, true);
67		fSettings->ReplaceMessage(MDSU_PARAMETERS, index, &parameter);
68	}
69
70	index = 0;
71	if(FindMessageParameter(PPP_AUTO_RECONNECT_KEY, *fSettings, &parameter, &index)
72			&& parameter.FindString(MDSU_VALUES, &value) == B_OK) {
73		if(get_boolean_value(value, false))
74			fDoesAutoReconnect = true;
75
76		parameter.AddBool(MDSU_VALID, true);
77		fSettings->ReplaceMessage(MDSU_PARAMETERS, index, &parameter);
78	}
79
80	fConnectionOptionsView->Reload();
81		// reload new settings
82
83	return true;
84}
85
86
87void
88ConnectionOptionsAddon::IsModified(bool *settings) const
89{
90	*settings = false;
91
92	if(!fSettings || !fConnectionOptionsView)
93		return;
94
95	*settings = AskBeforeConnecting() != fConnectionOptionsView->AskBeforeConnecting()
96		|| DoesAutoReconnect() != fConnectionOptionsView->DoesAutoReconnect();
97}
98
99
100bool
101ConnectionOptionsAddon::SaveSettings(BMessage *settings)
102{
103	if(!fSettings || !settings)
104		return false;
105
106	BMessage parameter;
107	if(fConnectionOptionsView->DoesAutoReconnect()) {
108		parameter.MakeEmpty();
109		parameter.AddString(MDSU_NAME, PPP_AUTO_RECONNECT_KEY);
110		parameter.AddString(MDSU_VALUES, "enabled");
111		settings->AddMessage(MDSU_PARAMETERS, &parameter);
112	}
113
114	return true;
115}
116
117
118bool
119ConnectionOptionsAddon::GetPreferredSize(float *width, float *height) const
120{
121	BRect rect;
122	if(Addons()->FindRect(DUN_TAB_VIEW_RECT, &rect) != B_OK)
123		rect.Set(0, 0, 200, 300);
124			// set default values
125
126	if(width)
127		*width = rect.Width();
128	if(height)
129		*height = rect.Height();
130
131	return true;
132}
133
134
135BView*
136ConnectionOptionsAddon::CreateView(BPoint leftTop)
137{
138	if(!fConnectionOptionsView) {
139		BRect rect;
140		Addons()->FindRect(DUN_TAB_VIEW_RECT, &rect);
141		fConnectionOptionsView = new ConnectionOptionsView(this, rect);
142	}
143
144	fDeleteView = false;
145
146	fConnectionOptionsView->MoveTo(leftTop);
147	fConnectionOptionsView->Reload();
148	return fConnectionOptionsView;
149}
150
151
152ConnectionOptionsView::ConnectionOptionsView(ConnectionOptionsAddon *addon, BRect frame)
153	: BView(frame, kLabelConnectionOptions, B_FOLLOW_NONE, 0),
154	fAddon(addon)
155{
156	BRect rect = Bounds();
157	rect.InsetBy(10, 10);
158	rect.bottom = rect.top + 15;
159	fAskBeforeConnecting = new BCheckBox(rect, "AskBeforeConnecting",
160		kLabelAskBeforeConnecting, NULL);
161	rect.top = rect.bottom + 5;
162	rect.bottom = rect.top + 15;
163	fAutoReconnect = new BCheckBox(rect, "AutoReconnect", kLabelAutoReconnect, NULL);
164
165	AddChild(fAskBeforeConnecting);
166	AddChild(fAutoReconnect);
167}
168
169
170void
171ConnectionOptionsView::Reload()
172{
173	fAskBeforeConnecting->SetValue(Addon()->AskBeforeConnecting());
174	fAutoReconnect->SetValue(Addon()->DoesAutoReconnect());
175
176	if(!Addon()->Settings())
177		return;
178}
179
180
181void
182ConnectionOptionsView::AttachedToWindow()
183{
184	SetViewColor(Parent()->ViewColor());
185}
186