1/*
2 * Copyright 2004-2012, Haiku, Inc. All rights reserved.
3 * Copyright 2002 Alexander G. M. Smith.
4 * Distributed under the terms of the MIT License.
5 */
6
7
8/*!	SpamFilter's configuration view.  Lets the user change various settings
9	related to the add-on, but not the spamdbm server.
10*/
11
12
13#include <stdlib.h>
14#include <stdio.h>
15
16#include <Alert.h>
17#include <Button.h>
18#include <Catalog.h>
19#include <CheckBox.h>
20#include <LayoutBuilder.h>
21#include <MailFilter.h>
22#include <MailSettingsView.h>
23#include <Message.h>
24#include <Messenger.h>
25#include <Roster.h>
26#include <StringView.h>
27#include <TextControl.h>
28#include <FindDirectory.h>
29#include <Entry.h>
30#include <Path.h>
31
32#include <FileConfigView.h>
33
34
35#undef B_TRANSLATION_CONTEXT
36#define B_TRANSLATION_CONTEXT "SpamFilterConfig"
37
38
39class SpamFilterConfig : public BMailSettingsView {
40public:
41								SpamFilterConfig(const BMessage* settings);
42
43	virtual status_t			SaveInto(BMailAddOnSettings& settings) const;
44
45private:
46			BCheckBox*			fSubjectHintCheckBox;
47			BCheckBox*			fAutoTrainingCheckBox;
48			float				fGenuineCutoffRatio;
49			BTextControl*		fGenuineCutoffRatioTextControl;
50			BCheckBox*			fNoWordsMeansSpamCheckBox;
51			float				fSpamCutoffRatio;
52			BTextControl*		fSpamCutoffRatioTextControl;
53};
54
55
56SpamFilterConfig::SpamFilterConfig(const BMessage* settings)
57	:
58	BMailSettingsView("spamfilter_config"),
59	fSubjectHintCheckBox(NULL),
60	fAutoTrainingCheckBox(NULL),
61	fGenuineCutoffRatioTextControl(NULL),
62	fNoWordsMeansSpamCheckBox(NULL),
63	fSpamCutoffRatioTextControl(NULL)
64{
65	bool subjectHint;
66	bool autoTraining;
67	bool noWordsMeansSpam;
68	if (settings->FindBool("AddMarkerToSubject", &subjectHint) != B_OK)
69		subjectHint = false;
70	if (settings->FindBool("AutoTraining", &autoTraining) != B_OK)
71		autoTraining = true;
72	if (settings->FindBool("NoWordsMeansSpam", &noWordsMeansSpam) != B_OK)
73		noWordsMeansSpam = true;
74
75	if (settings->FindFloat("GenuineCutoffRatio", &fGenuineCutoffRatio) != B_OK)
76		fGenuineCutoffRatio = 0.01f;
77	if (settings->FindFloat("SpamCutoffRatio", &fSpamCutoffRatio) != B_OK)
78		fSpamCutoffRatio = 0.99f;
79
80	SetViewUIColor(B_PANEL_BACKGROUND_COLOR);
81
82	fSubjectHintCheckBox = new BCheckBox("AddToSubject",
83		B_TRANSLATE("Add spam rating to start of subject"), NULL);
84	fSubjectHintCheckBox->SetValue(subjectHint);
85
86	BString number;
87	number.SetToFormat("%06.4f", (double)fSpamCutoffRatio);
88	fSpamCutoffRatioTextControl	= new BTextControl("spamcutoffratio",
89		B_TRANSLATE("Spam above:"), number.String(), NULL);
90
91	fNoWordsMeansSpamCheckBox = new BCheckBox("NoWordsMeansSpam",
92		B_TRANSLATE("or empty e-mail"), NULL);
93	fNoWordsMeansSpamCheckBox->SetValue(noWordsMeansSpam);
94
95	number.SetToFormat("%08.6f", (double)fGenuineCutoffRatio);
96	fGenuineCutoffRatioTextControl = new BTextControl("genuinecutoffratio",
97		B_TRANSLATE("Genuine below and uncertain above:"),
98		number.String(), NULL);
99
100	fAutoTrainingCheckBox = new BCheckBox("autoTraining",
101		B_TRANSLATE("Learn from all incoming e-mail"), NULL);
102	fAutoTrainingCheckBox->SetValue(autoTraining);
103
104	BLayoutBuilder::Group<>(this, B_VERTICAL)
105		.Add(fSubjectHintCheckBox)
106		.AddGroup(B_HORIZONTAL)
107			.Add(fSpamCutoffRatioTextControl->CreateLabelLayoutItem())
108			.Add(fSpamCutoffRatioTextControl->CreateTextViewLayoutItem())
109			.Add(fNoWordsMeansSpamCheckBox)
110		.End()
111		.AddGroup(B_HORIZONTAL)
112			.Add(fGenuineCutoffRatioTextControl->CreateLabelLayoutItem())
113			.Add(fGenuineCutoffRatioTextControl->CreateTextViewLayoutItem())
114		.End()
115		.Add(fAutoTrainingCheckBox);
116}
117
118
119status_t
120SpamFilterConfig::SaveInto(BMailAddOnSettings& settings) const
121{
122	settings.MakeEmpty();
123
124	status_t status = settings.AddBool("AddMarkerToSubject",
125		fSubjectHintCheckBox->Value() == B_CONTROL_ON);
126
127	if (status == B_OK) {
128		status = settings.AddBool("AutoTraining",
129			fAutoTrainingCheckBox->Value() == B_CONTROL_ON);
130	}
131	if (status == B_OK) {
132		status = settings.AddBool("NoWordsMeansSpam",
133			fNoWordsMeansSpamCheckBox->Value() == B_CONTROL_ON);
134	}
135	if (status == B_OK) {
136		status = settings.AddFloat("GenuineCutoffRatio",
137			atof(fGenuineCutoffRatioTextControl->Text()));
138	}
139	if (status == B_OK) {
140		status = settings.AddFloat("SpamCutoffRatio",
141			atof(fSpamCutoffRatioTextControl->Text()));
142	}
143
144	return status;
145}
146
147
148// #pragma mark -
149
150
151BMailSettingsView*
152instantiate_filter_settings_view(const BMailAccountSettings& accountSettings,
153	const BMailAddOnSettings& settings)
154{
155	return new SpamFilterConfig(&settings);
156}
157