1/*
2 * Copyright 2007-2012, Haiku, Inc. All rights reserved.
3 * Copyright 2001 Dr. Zoidberg Enterprises. All rights reserved.
4 *
5 * Distributed under the terms of the MIT License.
6 */
7
8
9//!	Config views for the account, protocols, and filters.
10
11
12#include "ConfigViews.h"
13
14#include <Alert.h>
15#include <Button.h>
16#include <Catalog.h>
17#include <Directory.h>
18#include <Entry.h>
19#include <FindDirectory.h>
20#include <ListView.h>
21#include <LayoutBuilder.h>
22#include <Locale.h>
23#include <Looper.h>
24#include <MenuField.h>
25#include <MenuItem.h>
26#include <Path.h>
27#include <PopUpMenu.h>
28#include <TextControl.h>
29
30#include <string.h>
31
32#include <MailSettings.h>
33
34#include "FilterConfigView.h"
35
36
37#undef B_TRANSLATION_CONTEXT
38#define B_TRANSLATION_CONTEXT "Config Views"
39
40
41// AccountConfigView
42const uint32 kMsgAccountNameChanged = 'anmc';
43
44// ProtocolsConfigView
45const uint32 kMsgProtocolChanged = 'prch';
46
47
48// #pragma mark -
49
50
51AccountConfigView::AccountConfigView(BMailAccountSettings* account)
52	:
53	BBox("account"),
54	fAccount(account)
55{
56	SetLabel(B_TRANSLATE("Account settings"));
57
58	fNameControl = new BTextControl(NULL, B_TRANSLATE("Account name:"), NULL,
59		new BMessage(kMsgAccountNameChanged));
60	fRealNameControl = new BTextControl(NULL, B_TRANSLATE("Real name:"), NULL,
61		NULL);
62	fReturnAddressControl = new BTextControl(NULL,
63		B_TRANSLATE("Return address:"), NULL, NULL);
64
65	BView* contents = new BView(NULL, 0);
66	AddChild(contents);
67
68	BLayoutBuilder::Grid<>(contents, 0.f)
69		.SetInsets(B_USE_DEFAULT_SPACING)
70		.Add(fNameControl->CreateLabelLayoutItem(), 0, 0)
71		.Add(fNameControl->CreateTextViewLayoutItem(), 1, 0)
72		.Add(fRealNameControl->CreateLabelLayoutItem(), 0, 1)
73		.Add(fRealNameControl->CreateTextViewLayoutItem(), 1, 1)
74		.Add(fReturnAddressControl->CreateLabelLayoutItem(), 0, 2)
75		.Add(fReturnAddressControl->CreateTextViewLayoutItem(), 1, 2)
76		.AddGlue(0, 3);
77}
78
79
80void
81AccountConfigView::DetachedFromWindow()
82{
83	fAccount->SetName(fNameControl->Text());
84	fAccount->SetRealName(fRealNameControl->Text());
85	fAccount->SetReturnAddress(fReturnAddressControl->Text());
86}
87
88
89void
90AccountConfigView::AttachedToWindow()
91{
92	UpdateViews();
93	fNameControl->SetTarget(this);
94}
95
96
97void
98AccountConfigView::MessageReceived(BMessage *msg)
99{
100	switch (msg->what) {
101		case kMsgAccountNameChanged:
102			fAccount->SetName(fNameControl->Text());
103			break;
104
105		default:
106			BView::MessageReceived(msg);
107	}
108}
109
110
111void
112AccountConfigView::UpdateViews()
113{
114	fNameControl->SetText(fAccount->Name());
115	fRealNameControl->SetText(fAccount->RealName());
116	fReturnAddressControl->SetText(fAccount->ReturnAddress());
117}
118
119
120// #pragma mark -
121
122
123ProtocolSettingsView::ProtocolSettingsView(const entry_ref& ref,
124	const BMailAccountSettings& accountSettings,
125	BMailProtocolSettings& settings)
126	:
127	BBox("protocol"),
128	fSettings(settings),
129	fSettingsView(NULL)
130{
131	status_t status = _CreateSettingsView(ref, accountSettings, settings);
132	BView* view = fSettingsView;
133
134	if (status == B_OK) {
135		SetLabel(ref.name);
136	} else {
137		BString text(B_TRANSLATE("An error occurred while creating the "
138			"config view: %error."));
139		text.ReplaceAll("%error", strerror(status));
140		view = new BStringView("error", text.String());
141
142		SetLabel(B_TRANSLATE("Error!"));
143	}
144
145	BView* contents = new BView(NULL, 0);
146	AddChild(contents);
147
148	BLayoutBuilder::Group<>(contents, B_VERTICAL)
149		.SetInsets(B_USE_DEFAULT_SPACING)
150		.Add(view)
151		.AddGlue();
152}
153
154
155void
156ProtocolSettingsView::DetachedFromWindow()
157{
158	if (fSettingsView == NULL)
159		return;
160
161	if (fSettingsView->SaveInto(fSettings) != B_OK)
162		return;
163
164	// We need to remove the settings view before unloading its add-on
165	fSettingsView->RemoveSelf();
166	delete fSettingsView;
167	fSettingsView = NULL;
168	unload_add_on(fImage);
169}
170
171
172status_t
173ProtocolSettingsView::_CreateSettingsView(const entry_ref& ref,
174	const BMailAccountSettings& accountSettings,
175	BMailProtocolSettings& settings)
176{
177	BMailSettingsView* (*instantiateConfig)(
178		const BMailAccountSettings& accountSettings,
179		BMailProtocolSettings& settings);
180	BPath path(&ref);
181	image_id image = load_add_on(path.Path());
182	if (image < 0)
183		return image;
184
185	if (get_image_symbol(image, "instantiate_protocol_settings_view",
186			B_SYMBOL_TYPE_TEXT, (void**)&instantiateConfig) != B_OK) {
187		unload_add_on(image);
188		return B_MISSING_SYMBOL;
189	}
190
191	fImage = image;
192	fSettingsView = instantiateConfig(accountSettings, settings);
193	return B_OK;
194}
195