2 * Claws Mail -- a GTK+ based, lightweight, and fast e-mail client
3 * Copyright (C) 1999-2007 Tristan Chabredier <wwp@claws-mail.org> and
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
31 #include <glib/gi18n.h>
34 #include "prefs_common.h"
35 #include "prefs_gtk.h"
37 #include "gtk/gtkutils.h"
38 #include "gtk/prefswindow.h"
41 #include "manage_window.h"
45 typedef struct _LoggingPage
51 GtkWidget *checkbtn_clip_network_log;
52 GtkWidget *spinbtn_network_log_length;
53 GtkWidget *checkbtn_clip_filtering_log;
54 GtkWidget *spinbtn_filtering_log_length;
55 GtkWidget *checkbtn_filtering_log;
56 GtkWidget *checkbtn_filtering_log_inc;
57 GtkWidget *checkbtn_filtering_log_manual;
58 GtkWidget *checkbtn_filtering_log_folder_proc;
59 GtkWidget *checkbtn_filtering_log_pre_proc;
60 GtkWidget *checkbtn_filtering_log_post_proc;
61 GtkWidget *optmenu_filtering_log_level;
64 static void prefs_logging_create_widget(PrefsPage *_page, GtkWindow *window,
67 LoggingPage *prefs_logging = (LoggingPage *) _page;
71 GtkWidget *frame_logging;
72 GtkWidget *vbox_network_log;
73 GtkWidget *hbox_clip_network_log;
74 GtkWidget *checkbtn_clip_network_log;
75 GtkWidget *spinbtn_network_log_length;
76 GtkObject *spinbtn_network_log_length_adj;
77 GtkTooltips *network_log_length_tooltip;
79 GtkWidget *vbox1_filtering_log;
80 GtkWidget *hbox_clip_filtering_log;
81 GtkWidget *checkbtn_clip_filtering_log;
82 GtkWidget *spinbtn_filtering_log_length;
83 GtkObject *spinbtn_filtering_log_length_adj;
84 GtkTooltips *filtering_log_length_tooltip;
85 GtkWidget *hbox_filtering_log;
86 GtkWidget *checkbtn_filtering_log;
87 GtkWidget *frame_filtering_log;
88 GtkWidget *vbox2_filtering_log;
89 GtkWidget *hbox_filtering_log_inc;
90 GtkWidget *checkbtn_filtering_log_inc;
91 GtkWidget *hbox_filtering_log_manual;
92 GtkWidget *checkbtn_filtering_log_manual;
93 GtkWidget *hbox_filtering_log_folder_proc;
94 GtkWidget *checkbtn_filtering_log_folder_proc;
95 GtkWidget *hbox_filtering_log_pre_proc;
96 GtkWidget *checkbtn_filtering_log_pre_proc;
97 GtkWidget *hbox_filtering_log_post_proc;
98 GtkWidget *checkbtn_filtering_log_post_proc;
99 GtkTooltips *filtering_log_tooltip;
100 GtkWidget *hbox_filtering_log_level;
101 GtkWidget *label_filtering_log_level;
102 GtkWidget *optmenu_filtering_log_level;
105 GtkTooltips *filtering_log_level_tooltip;
107 vbox1 = gtk_vbox_new (FALSE, VSPACING);
108 gtk_widget_show (vbox1);
109 gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
112 vbox_network_log = gtkut_get_options_frame(vbox1, &frame_logging, _("Network log"));
114 hbox_clip_network_log = gtk_hbox_new (FALSE, 8);
115 gtk_container_add (GTK_CONTAINER (vbox_network_log), hbox_clip_network_log);
116 gtk_widget_show (hbox_clip_network_log);
118 PACK_CHECK_BUTTON (hbox_clip_network_log, checkbtn_clip_network_log,
119 _("Restrict the log window to"));
121 network_log_length_tooltip = gtk_tooltips_new();
123 spinbtn_network_log_length_adj = gtk_adjustment_new (500, 0, G_MAXINT, 1, 10, 10);
124 spinbtn_network_log_length = gtk_spin_button_new
125 (GTK_ADJUSTMENT (spinbtn_network_log_length_adj), 1, 0);
126 gtk_widget_show (spinbtn_network_log_length);
127 gtk_box_pack_start (GTK_BOX (hbox_clip_network_log), spinbtn_network_log_length,
129 gtk_widget_set_size_request (GTK_WIDGET (spinbtn_network_log_length), 64, -1);
130 gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbtn_network_log_length), TRUE);
132 gtk_tooltips_set_tip(GTK_TOOLTIPS(network_log_length_tooltip), spinbtn_network_log_length,
133 _("0 to stop logging in the log window"),
136 label = gtk_label_new(_("lines"));
137 gtk_widget_show (label);
138 gtk_box_pack_start(GTK_BOX(hbox_clip_network_log), label, FALSE, FALSE, 0);
140 SET_TOGGLE_SENSITIVITY(checkbtn_clip_network_log, spinbtn_network_log_length);
141 SET_TOGGLE_SENSITIVITY(checkbtn_clip_network_log, label);
143 /* Filtering/processing debug log */
144 vbox1_filtering_log = gtkut_get_options_frame(vbox1,
145 &frame_logging, _("Filtering/processing log"));
147 PACK_CHECK_BUTTON (vbox1_filtering_log, checkbtn_filtering_log,
148 _("Enable logging of filtering/processing rules"));
149 hbox_filtering_log = gtk_hbox_new (FALSE, 8);
150 gtk_container_add (GTK_CONTAINER (vbox1_filtering_log), hbox_filtering_log);
151 gtk_widget_show (hbox_filtering_log);
153 filtering_log_tooltip = gtk_tooltips_new();
154 gtk_tooltips_set_tip(GTK_TOOLTIPS(filtering_log_tooltip),
155 checkbtn_filtering_log,
156 _("If checked, turns on logging of filtering and processing rules.\n"
157 "The log is accessible from 'Tools/Filtering log'.\n"
158 "Caution: enabling this option will slow down the filtering/processing, "
159 "this might be critical when applying many rules upon thousands of "
163 vbox2_filtering_log = gtkut_get_options_frame(vbox1_filtering_log, &frame_filtering_log,
164 _("Log filtering/processing when..."));
166 PACK_CHECK_BUTTON (vbox2_filtering_log, checkbtn_filtering_log_inc,
167 _("filtering at incorporation"));
168 hbox_filtering_log_inc = gtk_hbox_new (FALSE, 8);
169 gtk_container_add (GTK_CONTAINER (vbox2_filtering_log), hbox_filtering_log_inc);
170 gtk_widget_show (hbox_filtering_log_inc);
172 PACK_CHECK_BUTTON (vbox2_filtering_log, checkbtn_filtering_log_manual,
173 _("manually filtering"));
174 hbox_filtering_log_manual = gtk_hbox_new (FALSE, 8);
175 gtk_container_add (GTK_CONTAINER (vbox2_filtering_log), hbox_filtering_log_manual);
176 gtk_widget_show (hbox_filtering_log_manual);
178 PACK_CHECK_BUTTON (vbox2_filtering_log, checkbtn_filtering_log_folder_proc,
179 _("processing folders"));
180 hbox_filtering_log_folder_proc = gtk_hbox_new (FALSE, 8);
181 gtk_container_add (GTK_CONTAINER (vbox2_filtering_log), hbox_filtering_log_folder_proc);
182 gtk_widget_show (hbox_filtering_log_folder_proc);
184 PACK_CHECK_BUTTON (vbox2_filtering_log, checkbtn_filtering_log_pre_proc,
185 _("pre-processing folders"));
186 hbox_filtering_log_pre_proc = gtk_hbox_new (FALSE, 8);
187 gtk_container_add (GTK_CONTAINER (vbox2_filtering_log), hbox_filtering_log_pre_proc);
188 gtk_widget_show (hbox_filtering_log_pre_proc);
190 PACK_CHECK_BUTTON (vbox2_filtering_log, checkbtn_filtering_log_post_proc,
191 _("post-processing folders"));
192 hbox_filtering_log_post_proc = gtk_hbox_new (FALSE, 8);
193 gtk_container_add (GTK_CONTAINER (vbox2_filtering_log), hbox_filtering_log_post_proc);
194 gtk_widget_show (hbox_filtering_log_post_proc);
196 SET_TOGGLE_SENSITIVITY(checkbtn_filtering_log, frame_filtering_log);
198 hbox_filtering_log_level = gtk_hbox_new (FALSE, 8);
199 gtk_widget_show (hbox_filtering_log_level);
200 gtk_box_pack_start(GTK_BOX (vbox1_filtering_log), hbox_filtering_log_level, FALSE, FALSE, 0);
202 label_filtering_log_level = gtk_label_new (_("Log level"));
203 gtk_widget_show (label_filtering_log_level);
204 gtk_box_pack_start(GTK_BOX(hbox_filtering_log_level), label_filtering_log_level, FALSE, FALSE, 0);
206 optmenu_filtering_log_level = gtk_option_menu_new ();
207 gtk_widget_show (optmenu_filtering_log_level);
209 menu = gtk_menu_new ();
210 MENUITEM_ADD (menu, menuitem, _("Low"), 0);
211 MENUITEM_ADD (menu, menuitem, _("Medium"), 1);
212 MENUITEM_ADD (menu, menuitem, _("High"), 2);
214 gtk_option_menu_set_menu (GTK_OPTION_MENU (optmenu_filtering_log_level), menu);
215 gtk_box_pack_start(GTK_BOX(hbox_filtering_log_level), optmenu_filtering_log_level, FALSE, FALSE, 0);
217 filtering_log_level_tooltip = gtk_tooltips_new();
218 gtk_tooltips_set_tip(GTK_TOOLTIPS(filtering_log_level_tooltip),
219 optmenu_filtering_log_level,
220 _("Select the level of detail of the logging.\n"
221 "Choose Low to see when rules are applied, which "
222 "conditions match or don't match and what actions are "
224 "Choose Medium to see more details about the message "
225 "that is being processed, and why rules are skipped.\n"
226 "Choose High to explicitly show the reason why all "
227 "rules are processed or skipped, and why all conditions "
228 "are matched or not matched.\n"
229 "Caution: the higher the level, the greater the "
230 "impact on performance."),
233 hbox_clip_filtering_log = gtk_hbox_new (FALSE, 8);
234 gtk_container_add (GTK_CONTAINER (vbox1_filtering_log), hbox_clip_filtering_log);
235 gtk_widget_show (hbox_clip_filtering_log);
236 PACK_CHECK_BUTTON (hbox_clip_filtering_log, checkbtn_clip_filtering_log,
237 _("Restrict the log window to"));
239 filtering_log_length_tooltip = gtk_tooltips_new();
241 spinbtn_filtering_log_length_adj = gtk_adjustment_new (500, 0, G_MAXINT, 1, 10, 10);
242 spinbtn_filtering_log_length = gtk_spin_button_new
243 (GTK_ADJUSTMENT (spinbtn_filtering_log_length_adj), 1, 0);
244 gtk_widget_show (spinbtn_filtering_log_length);
245 gtk_box_pack_start (GTK_BOX (hbox_clip_filtering_log), spinbtn_filtering_log_length,
247 gtk_widget_set_size_request (GTK_WIDGET (spinbtn_filtering_log_length), 64, -1);
248 gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbtn_filtering_log_length), TRUE);
250 gtk_tooltips_set_tip(GTK_TOOLTIPS(filtering_log_length_tooltip), spinbtn_filtering_log_length,
251 _("0 to stop logging in the log window"),
254 label = gtk_label_new(_("lines"));
255 gtk_widget_show (label);
256 gtk_box_pack_start(GTK_BOX(hbox_clip_filtering_log), label, FALSE, FALSE, 0);
258 SET_TOGGLE_SENSITIVITY(checkbtn_clip_filtering_log, spinbtn_filtering_log_length);
259 SET_TOGGLE_SENSITIVITY(checkbtn_clip_filtering_log, label);
260 SET_TOGGLE_SENSITIVITY(checkbtn_filtering_log, hbox_clip_filtering_log);
261 SET_TOGGLE_SENSITIVITY(checkbtn_filtering_log, optmenu_filtering_log_level);
262 SET_TOGGLE_SENSITIVITY(checkbtn_filtering_log, checkbtn_clip_filtering_log);
263 SET_TOGGLE_SENSITIVITY(checkbtn_filtering_log, label_filtering_log_level);
265 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_clip_network_log),
266 prefs_common.cliplog);
267 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_clip_filtering_log),
268 prefs_common.filtering_debug_cliplog);
269 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_filtering_log),
270 prefs_common.enable_filtering_debug);
271 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_filtering_log_inc),
272 prefs_common.enable_filtering_debug_inc);
273 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_filtering_log_manual),
274 prefs_common.enable_filtering_debug_manual);
275 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_filtering_log_folder_proc),
276 prefs_common.enable_filtering_debug_folder_proc);
277 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_filtering_log_pre_proc),
278 prefs_common.enable_filtering_debug_pre_proc);
279 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_filtering_log_post_proc),
280 prefs_common.enable_filtering_debug_post_proc);
282 gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinbtn_network_log_length),
283 prefs_common.loglength);
284 gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinbtn_filtering_log_length),
285 prefs_common.filtering_debug_loglength);
287 gtk_option_menu_set_history(GTK_OPTION_MENU(optmenu_filtering_log_level),
288 prefs_common.filtering_debug_level);
290 prefs_logging->checkbtn_clip_network_log = checkbtn_clip_network_log;
291 prefs_logging->spinbtn_network_log_length = spinbtn_network_log_length;
292 prefs_logging->checkbtn_clip_filtering_log = checkbtn_clip_filtering_log;
293 prefs_logging->spinbtn_filtering_log_length = spinbtn_filtering_log_length;
294 prefs_logging->checkbtn_filtering_log = checkbtn_filtering_log;
295 prefs_logging->checkbtn_filtering_log_inc = checkbtn_filtering_log_inc;
296 prefs_logging->checkbtn_filtering_log_manual = checkbtn_filtering_log_manual;
297 prefs_logging->checkbtn_filtering_log_folder_proc = checkbtn_filtering_log_folder_proc;
298 prefs_logging->checkbtn_filtering_log_pre_proc = checkbtn_filtering_log_pre_proc;
299 prefs_logging->checkbtn_filtering_log_post_proc = checkbtn_filtering_log_post_proc;
300 prefs_logging->optmenu_filtering_log_level = optmenu_filtering_log_level;
302 prefs_logging->page.widget = vbox1;
305 static void prefs_logging_save(PrefsPage *_page)
307 LoggingPage *page = (LoggingPage *) _page;
308 MainWindow *mainwindow;
309 gboolean filtering_debug_enabled;
313 menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(page->optmenu_filtering_log_level));
314 menuitem = gtk_menu_get_active(GTK_MENU(menu));
315 prefs_common.filtering_debug_level = GPOINTER_TO_INT
316 (g_object_get_data(G_OBJECT(menuitem), MENU_VAL_ID));
318 prefs_common.cliplog = gtk_toggle_button_get_active(
319 GTK_TOGGLE_BUTTON(page->checkbtn_clip_network_log));
320 prefs_common.loglength = gtk_spin_button_get_value_as_int(
321 GTK_SPIN_BUTTON(page->spinbtn_network_log_length));
322 prefs_common.filtering_debug_cliplog = gtk_toggle_button_get_active(
323 GTK_TOGGLE_BUTTON(page->checkbtn_clip_filtering_log));
324 prefs_common.filtering_debug_loglength = gtk_spin_button_get_value_as_int(
325 GTK_SPIN_BUTTON(page->spinbtn_filtering_log_length));
326 filtering_debug_enabled = prefs_common.enable_filtering_debug;
327 prefs_common.enable_filtering_debug = gtk_toggle_button_get_active(
328 GTK_TOGGLE_BUTTON(page->checkbtn_filtering_log));
329 if (filtering_debug_enabled != prefs_common.enable_filtering_debug) {
330 if (prefs_common.enable_filtering_debug)
331 log_message(LOG_DEBUG_FILTERING, _("filtering log enabled\n"));
333 log_message(LOG_DEBUG_FILTERING, _("filtering log disabled\n"));
335 prefs_common.enable_filtering_debug_inc = gtk_toggle_button_get_active(
336 GTK_TOGGLE_BUTTON(page->checkbtn_filtering_log_inc));
337 prefs_common.enable_filtering_debug_manual = gtk_toggle_button_get_active(
338 GTK_TOGGLE_BUTTON(page->checkbtn_filtering_log_manual));
339 prefs_common.enable_filtering_debug_folder_proc = gtk_toggle_button_get_active(
340 GTK_TOGGLE_BUTTON(page->checkbtn_filtering_log_folder_proc));
341 prefs_common.enable_filtering_debug_pre_proc = gtk_toggle_button_get_active(
342 GTK_TOGGLE_BUTTON(page->checkbtn_filtering_log_pre_proc));
343 prefs_common.enable_filtering_debug_post_proc = gtk_toggle_button_get_active(
344 GTK_TOGGLE_BUTTON(page->checkbtn_filtering_log_post_proc));
346 mainwindow = mainwindow_get_mainwindow();
347 log_window_set_clipping(mainwindow->logwin, prefs_common.cliplog,
348 prefs_common.loglength);
349 log_window_set_clipping(mainwindow->filtering_debugwin, prefs_common.filtering_debug_cliplog,
350 prefs_common.filtering_debug_loglength);
353 static void prefs_logging_destroy_widget(PrefsPage *_page)
357 LoggingPage *prefs_logging;
359 void prefs_logging_init(void)
362 static gchar *path[3];
364 path[0] = _("Other");
365 path[1] = _("Logging");
368 page = g_new0(LoggingPage, 1);
369 page->page.path = path;
370 page->page.create_widget = prefs_logging_create_widget;
371 page->page.destroy_widget = prefs_logging_destroy_widget;
372 page->page.save_page = prefs_logging_save;
373 page->page.weight = 5.0;
374 prefs_gtk_register_page((PrefsPage *) page);
375 prefs_logging = page;
378 void prefs_logging_done(void)
380 prefs_gtk_unregister_page((PrefsPage *) prefs_logging);
381 g_free(prefs_logging);