2 * Claws Mail -- a GTK based, lightweight, and fast e-mail client
3 * Copyright (C) 2006-2022 Ricardo Mones and the Claws Mail Team
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
21 #include "claws-features.h"
25 #include <glib/gi18n.h>
27 #include "keyword_warner.h"
30 #include "keyword_warner_prefs.h"
31 #include "prefs_common.h"
32 #include "prefs_gtk.h"
34 #define PREFS_BLOCK_NAME "Keyword_Warner"
36 KeywordWarnerPrefs kwarnerprefs
;
38 struct KeywordWarnerPrefsPage
42 GtkWidget
*regexp_text
;
43 GtkWidget
*skip_quotes_checkbox
;
44 GtkWidget
*skip_forwards_and_redirections
;
45 GtkWidget
*skip_signature
;
46 GtkWidget
*case_sensitive_checkbox
;
49 struct KeywordWarnerPrefsPage kwarnerprefs_page
;
51 static PrefParam param
[] = {
52 {"match_strings", "", &kwarnerprefs
.match_strings
, P_STRING
,
54 {"skip_quotes", "TRUE", &kwarnerprefs
.skip_quotes
, P_BOOL
,
56 {"skip_forwards_and_redirections", "TRUE", &kwarnerprefs
.skip_forwards_and_redirections
, P_BOOL
,
58 {"skip_signature", "TRUE", &kwarnerprefs
.skip_signature
, P_BOOL
,
60 {"case_sensitive", "TRUE", &kwarnerprefs
.case_sensitive
, P_BOOL
,
62 {NULL
, NULL
, NULL
, P_OTHER
, NULL
, NULL
, NULL
}
65 static void keyword_warner_prefs_create_widget_func(PrefsPage
* _page
,
69 struct KeywordWarnerPrefsPage
*page
= (struct KeywordWarnerPrefsPage
*) _page
;
70 GtkWidget
*vbox
, *vbox1
, *vbox2
;
73 GtkWidget
*scrolledwin
;
74 GtkTextBuffer
*buffer
;
75 GtkWidget
*skip_quotes_checkbox
;
76 GtkWidget
*skip_fwd_redir_checkbox
;
77 GtkWidget
*skip_signature_checkbox
;
78 GtkWidget
*case_sensitive_checkbox
;
80 vbox1
= gtk_box_new(GTK_ORIENTATION_VERTICAL
, 6);
81 vbox2
= gtk_box_new(GTK_ORIENTATION_VERTICAL
, 6);
83 label
= gtk_label_new(_("Warn when one of the following regular expressions is matched (one per line)"));
84 gtk_label_set_xalign(GTK_LABEL(label
), 0.0);
85 gtk_widget_set_margin_start(GTK_WIDGET(label
), 2);
86 gtk_widget_set_margin_end(GTK_WIDGET(label
), 0);
88 case_sensitive_checkbox
= gtk_check_button_new_with_label(_("Expressions are case sensitive"));
89 gtk_toggle_button_set_active(
90 GTK_TOGGLE_BUTTON(case_sensitive_checkbox
),
91 kwarnerprefs
.case_sensitive
);
92 gtk_widget_show(case_sensitive_checkbox
);
94 CLAWS_SET_TIP(case_sensitive_checkbox
,
95 _("Case sensitive when matching for the regular expressions in the list"));
96 page
->case_sensitive_checkbox
= case_sensitive_checkbox
;
98 page
->regexp_text
= gtk_text_view_new();
99 buffer
= gtk_text_view_get_buffer(GTK_TEXT_VIEW(page
->regexp_text
));
100 gtk_text_buffer_set_text(buffer
, kwarnerprefs
.match_strings
, -1);
102 scrolledwin
= gtk_scrolled_window_new(NULL
, NULL
);
103 gtk_scrolled_window_set_policy(
104 GTK_SCROLLED_WINDOW (scrolledwin
),
105 GTK_POLICY_NEVER
, GTK_POLICY_AUTOMATIC
);
106 gtk_scrolled_window_set_shadow_type(
107 GTK_SCROLLED_WINDOW (scrolledwin
), GTK_SHADOW_IN
);
108 gtk_container_set_border_width(GTK_CONTAINER(scrolledwin
), 3);
110 gtk_container_add(GTK_CONTAINER(scrolledwin
), page
->regexp_text
);
111 gtk_widget_set_size_request(scrolledwin
, -1, 100);
113 gtk_box_pack_start(GTK_BOX(vbox1
), label
, FALSE
, FALSE
, 0);
114 gtk_box_pack_start(GTK_BOX(vbox1
), scrolledwin
, FALSE
, FALSE
, 0);
115 gtk_box_pack_start(GTK_BOX(vbox1
), case_sensitive_checkbox
, FALSE
, FALSE
, 0);
117 skip_quotes_checkbox
= gtk_check_button_new_with_label(_("Lines starting with quotation marks"));
118 gtk_toggle_button_set_active(
119 GTK_TOGGLE_BUTTON(skip_quotes_checkbox
),
120 kwarnerprefs
.skip_quotes
);
121 gtk_box_pack_start(GTK_BOX(vbox2
), skip_quotes_checkbox
, FALSE
, FALSE
, 0);
122 gtk_widget_show(skip_quotes_checkbox
);
124 CLAWS_SET_TIP(skip_quotes_checkbox
,
125 _("Exclude quoted lines from checking for the regular "
126 "expressions above. Note that handmade quotes cannot "
127 "be distinguished from quotes generated by replying."));
128 page
->skip_quotes_checkbox
= skip_quotes_checkbox
;
130 skip_fwd_redir_checkbox
= gtk_check_button_new_with_label(_("Forwarded or redirected messages"));
131 gtk_toggle_button_set_active(
132 GTK_TOGGLE_BUTTON(skip_fwd_redir_checkbox
),
133 kwarnerprefs
.skip_forwards_and_redirections
);
134 gtk_box_pack_start(GTK_BOX(vbox2
), skip_fwd_redir_checkbox
, FALSE
, FALSE
, 0);
135 gtk_widget_show(skip_fwd_redir_checkbox
);
137 CLAWS_SET_TIP(skip_fwd_redir_checkbox
,
138 _("Don't check for keywords when forwarding or redirecting messages"));
139 page
->skip_forwards_and_redirections
= skip_fwd_redir_checkbox
;
141 skip_signature_checkbox
= gtk_check_button_new_with_label(_("Signatures"));
142 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(skip_signature_checkbox
),
143 kwarnerprefs
.skip_signature
);
144 gtk_box_pack_start(GTK_BOX(vbox2
), skip_signature_checkbox
, FALSE
, FALSE
, 0);
145 gtk_widget_show(skip_signature_checkbox
);
147 CLAWS_SET_TIP(skip_signature_checkbox
,
148 _("Exclude lines from the first signature-separator onwards "
149 "from checking for the regular expressions above"));
150 page
->skip_signature
= skip_signature_checkbox
;
152 vbox
= gtk_box_new(GTK_ORIENTATION_VERTICAL
, VSPACING
);
153 gtk_container_set_border_width (GTK_CONTAINER (vbox
), VBOX_BORDER
);
155 gtk_container_add(GTK_CONTAINER(vbox
), vbox1
);
157 PACK_FRAME (vbox
, frame
, _("Exclude"));
158 gtk_container_set_border_width(GTK_CONTAINER(vbox2
), 6);
159 gtk_container_add(GTK_CONTAINER(frame
), vbox2
);
161 gtk_widget_show_all(vbox
);
163 page
->page
.widget
= vbox
;
166 static void keyword_warner_prefs_destroy_widget_func(PrefsPage
*_page
)
170 static void keyword_warner_save_config(void)
175 debug_print("Saving Keyword Warner Page\n");
177 rcpath
= g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S
, COMMON_RC
, NULL
);
178 pfile
= prefs_write_open(rcpath
);
180 if (!pfile
|| (prefs_set_block_label(pfile
, PREFS_BLOCK_NAME
) < 0))
183 if (prefs_write_param(param
, pfile
->fp
) < 0) {
184 g_warning("failed to write Keyword Warner configuration to file");
185 prefs_file_close_revert(pfile
);
188 if (fprintf(pfile
->fp
, "\n") < 0) {
189 FILE_OP_ERROR(rcpath
, "fprintf");
190 prefs_file_close_revert(pfile
);
192 prefs_file_close(pfile
);
196 static void keyword_warner_prefs_save_func(PrefsPage
* _page
)
198 struct KeywordWarnerPrefsPage
*page
= (struct KeywordWarnerPrefsPage
*) _page
;
199 GtkTextBuffer
*buffer
;
200 GtkTextIter start
, end
;
202 buffer
= gtk_text_view_get_buffer(GTK_TEXT_VIEW(page
->regexp_text
));
204 g_free(kwarnerprefs
.match_strings
);
206 gtk_text_buffer_get_start_iter(buffer
, &start
);
207 gtk_text_buffer_get_end_iter(buffer
, &end
);
209 tmp
= gtk_text_buffer_get_text(buffer
, &start
, &end
, FALSE
);
211 kwarnerprefs
.match_strings
= g_malloc(2*strlen(tmp
)+1);
212 pref_get_escaped_pref(kwarnerprefs
.match_strings
, tmp
);
214 kwarnerprefs
.skip_quotes
= gtk_toggle_button_get_active(
215 GTK_TOGGLE_BUTTON(page
->skip_quotes_checkbox
));
216 kwarnerprefs
.skip_forwards_and_redirections
= gtk_toggle_button_get_active(
217 GTK_TOGGLE_BUTTON(page
->skip_forwards_and_redirections
));
218 kwarnerprefs
.skip_signature
= gtk_toggle_button_get_active(
219 GTK_TOGGLE_BUTTON(page
->skip_signature
));
220 kwarnerprefs
.case_sensitive
= gtk_toggle_button_get_active(
221 GTK_TOGGLE_BUTTON(page
->case_sensitive_checkbox
));
223 keyword_warner_save_config();
224 g_free(kwarnerprefs
.match_strings
);
225 kwarnerprefs
.match_strings
= tmp
;
228 void keyword_warner_prefs_init(void)
230 static gchar
*path
[3];
234 path
[0] = _("Plugins");
235 path
[1] = _("Keyword Warner");
238 prefs_set_default(param
);
239 rcpath
= g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S
, COMMON_RC
, NULL
);
240 prefs_read_config(param
, PREFS_BLOCK_NAME
, rcpath
, NULL
);
243 tmp
= g_malloc(strlen(kwarnerprefs
.match_strings
)+1);
244 pref_get_unescaped_pref(tmp
, kwarnerprefs
.match_strings
);
246 g_free(kwarnerprefs
.match_strings
);
247 kwarnerprefs
.match_strings
= tmp
;
249 kwarnerprefs_page
.page
.path
= path
;
250 kwarnerprefs_page
.page
.create_widget
= keyword_warner_prefs_create_widget_func
;
251 kwarnerprefs_page
.page
.destroy_widget
= keyword_warner_prefs_destroy_widget_func
;
252 kwarnerprefs_page
.page
.save_page
= keyword_warner_prefs_save_func
;
253 kwarnerprefs_page
.page
.weight
= 40.0;
255 prefs_gtk_register_page((PrefsPage
*) &kwarnerprefs_page
);
258 void keyword_warner_prefs_done(void)
260 prefs_gtk_unregister_page((PrefsPage
*) &kwarnerprefs_page
);