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 3 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, see <http://www.gnu.org/licenses/>.
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_log_standard;
54 GtkWidget *checkbtn_log_warning;
55 GtkWidget *checkbtn_log_error;
56 GtkWidget *checkbtn_log_status;
57 GtkWidget *checkbtn_clip_filtering_log;
58 GtkWidget *spinbtn_filtering_log_length;
59 GtkWidget *checkbtn_filtering_log;
60 GtkWidget *checkbtn_filtering_log_inc;
61 GtkWidget *checkbtn_filtering_log_manual;
62 GtkWidget *checkbtn_filtering_log_folder_proc;
63 GtkWidget *checkbtn_filtering_log_pre_proc;
64 GtkWidget *checkbtn_filtering_log_post_proc;
65 GtkWidget *optmenu_filtering_log_level;
68 static void prefs_logging_create_widget(PrefsPage *_page, GtkWindow *window,
71 LoggingPage *prefs_logging = (LoggingPage *) _page;
75 GtkWidget *frame_logging;
76 GtkWidget *vbox_network_log;
77 GtkWidget *hbox_clip_network_log;
78 GtkWidget *checkbtn_clip_network_log;
79 GtkWidget *spinbtn_network_log_length;
80 GtkObject *spinbtn_network_log_length_adj;
81 GtkTooltips *network_log_length_tooltip;
82 GtkWidget *vbox1_filtering_log;
83 GtkWidget *hbox_clip_filtering_log;
84 GtkWidget *checkbtn_clip_filtering_log;
85 GtkWidget *spinbtn_filtering_log_length;
86 GtkObject *spinbtn_filtering_log_length_adj;
87 GtkTooltips *filtering_log_length_tooltip;
88 GtkWidget *hbox_filtering_log;
89 GtkWidget *checkbtn_filtering_log;
90 GtkWidget *frame_filtering_log;
91 GtkWidget *vbox2_filtering_log;
92 GtkWidget *hbox_filtering_log_inc;
93 GtkWidget *checkbtn_filtering_log_inc;
94 GtkWidget *hbox_filtering_log_manual;
95 GtkWidget *checkbtn_filtering_log_manual;
96 GtkWidget *hbox_filtering_log_folder_proc;
97 GtkWidget *checkbtn_filtering_log_folder_proc;
98 GtkWidget *hbox_filtering_log_pre_proc;
99 GtkWidget *checkbtn_filtering_log_pre_proc;
100 GtkWidget *hbox_filtering_log_post_proc;
101 GtkWidget *checkbtn_filtering_log_post_proc;
102 GtkTooltips *filtering_log_tooltip;
103 GtkWidget *hbox_filtering_log_level;
104 GtkWidget *label_filtering_log_level;
105 GtkWidget *optmenu_filtering_log_level;
108 GtkTooltips *filtering_log_level_tooltip;
109 GtkWidget *frame_disc_log;
110 GtkWidget *vbox_disc_log;
113 GtkWidget *checkbtn_log_standard;
114 GtkWidget *hbox_log_standard;
115 GtkWidget *checkbtn_log_warning;
116 GtkWidget *hbox_log_warning;
117 GtkWidget *checkbtn_log_error;
118 GtkWidget *hbox_log_error;
119 GtkWidget *checkbtn_log_status;
120 GtkWidget *hbox_log_status;
122 vbox1 = gtk_vbox_new (FALSE, VSPACING);
123 gtk_widget_show (vbox1);
124 gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
127 vbox_network_log = gtkut_get_options_frame(vbox1, &frame_logging, _("Network log"));
129 hbox_clip_network_log = gtk_hbox_new (FALSE, 8);
130 gtk_container_add (GTK_CONTAINER (vbox_network_log), hbox_clip_network_log);
131 gtk_widget_show (hbox_clip_network_log);
133 PACK_CHECK_BUTTON (hbox_clip_network_log, checkbtn_clip_network_log,
134 _("Restrict the log window to"));
136 network_log_length_tooltip = gtk_tooltips_new();
138 spinbtn_network_log_length_adj = gtk_adjustment_new (500, 0, G_MAXINT, 1, 10, 10);
139 spinbtn_network_log_length = gtk_spin_button_new
140 (GTK_ADJUSTMENT (spinbtn_network_log_length_adj), 1, 0);
141 gtk_widget_show (spinbtn_network_log_length);
142 gtk_box_pack_start (GTK_BOX (hbox_clip_network_log), spinbtn_network_log_length,
144 gtk_widget_set_size_request (GTK_WIDGET (spinbtn_network_log_length), 64, -1);
145 gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbtn_network_log_length), TRUE);
147 gtk_tooltips_set_tip(GTK_TOOLTIPS(network_log_length_tooltip), spinbtn_network_log_length,
148 _("0 to stop logging in the log window"),
151 label = gtk_label_new(_("lines"));
152 gtk_widget_show (label);
153 gtk_box_pack_start(GTK_BOX(hbox_clip_network_log), label, FALSE, FALSE, 0);
155 SET_TOGGLE_SENSITIVITY(checkbtn_clip_network_log, spinbtn_network_log_length);
156 SET_TOGGLE_SENSITIVITY(checkbtn_clip_network_log, label);
158 /* Filtering/processing debug log */
159 vbox1_filtering_log = gtkut_get_options_frame(vbox1,
160 &frame_logging, _("Filtering/processing log"));
162 PACK_CHECK_BUTTON (vbox1_filtering_log, checkbtn_filtering_log,
163 _("Enable logging of filtering/processing rules"));
164 hbox_filtering_log = gtk_hbox_new (FALSE, 8);
165 gtk_container_add (GTK_CONTAINER (vbox1_filtering_log), hbox_filtering_log);
166 gtk_widget_show (hbox_filtering_log);
168 filtering_log_tooltip = gtk_tooltips_new();
169 gtk_tooltips_set_tip(GTK_TOOLTIPS(filtering_log_tooltip),
170 checkbtn_filtering_log,
171 _("If checked, turns on logging of filtering and processing rules.\n"
172 "The log is accessible from 'Tools/Filtering log'.\n"
173 "Caution: enabling this option will slow down the filtering/processing, "
174 "this might be critical when applying many rules upon thousands of "
178 vbox2_filtering_log = gtkut_get_options_frame(vbox1_filtering_log, &frame_filtering_log,
179 _("Log filtering/processing when..."));
181 PACK_CHECK_BUTTON (vbox2_filtering_log, checkbtn_filtering_log_inc,
182 _("filtering at incorporation"));
183 hbox_filtering_log_inc = gtk_hbox_new (FALSE, 8);
184 gtk_container_add (GTK_CONTAINER (vbox2_filtering_log), hbox_filtering_log_inc);
185 gtk_widget_show (hbox_filtering_log_inc);
187 PACK_CHECK_BUTTON (vbox2_filtering_log, checkbtn_filtering_log_manual,
188 _("manually filtering"));
189 hbox_filtering_log_manual = gtk_hbox_new (FALSE, 8);
190 gtk_container_add (GTK_CONTAINER (vbox2_filtering_log), hbox_filtering_log_manual);
191 gtk_widget_show (hbox_filtering_log_manual);
193 PACK_CHECK_BUTTON (vbox2_filtering_log, checkbtn_filtering_log_folder_proc,
194 _("processing folders"));
195 hbox_filtering_log_folder_proc = gtk_hbox_new (FALSE, 8);
196 gtk_container_add (GTK_CONTAINER (vbox2_filtering_log), hbox_filtering_log_folder_proc);
197 gtk_widget_show (hbox_filtering_log_folder_proc);
199 PACK_CHECK_BUTTON (vbox2_filtering_log, checkbtn_filtering_log_pre_proc,
200 _("pre-processing folders"));
201 hbox_filtering_log_pre_proc = gtk_hbox_new (FALSE, 8);
202 gtk_container_add (GTK_CONTAINER (vbox2_filtering_log), hbox_filtering_log_pre_proc);
203 gtk_widget_show (hbox_filtering_log_pre_proc);
205 PACK_CHECK_BUTTON (vbox2_filtering_log, checkbtn_filtering_log_post_proc,
206 _("post-processing folders"));
207 hbox_filtering_log_post_proc = gtk_hbox_new (FALSE, 8);
208 gtk_container_add (GTK_CONTAINER (vbox2_filtering_log), hbox_filtering_log_post_proc);
209 gtk_widget_show (hbox_filtering_log_post_proc);
211 SET_TOGGLE_SENSITIVITY(checkbtn_filtering_log, frame_filtering_log);
213 hbox_filtering_log_level = gtk_hbox_new (FALSE, 8);
214 gtk_widget_show (hbox_filtering_log_level);
215 gtk_box_pack_start(GTK_BOX (vbox1_filtering_log), hbox_filtering_log_level, FALSE, FALSE, 0);
217 label_filtering_log_level = gtk_label_new (_("Log level"));
218 gtk_widget_show (label_filtering_log_level);
219 gtk_box_pack_start(GTK_BOX(hbox_filtering_log_level), label_filtering_log_level, FALSE, FALSE, 0);
221 optmenu_filtering_log_level = gtk_option_menu_new ();
222 gtk_widget_show (optmenu_filtering_log_level);
224 menu = gtk_menu_new ();
225 MENUITEM_ADD (menu, menuitem, _("Low"), 0);
226 MENUITEM_ADD (menu, menuitem, _("Medium"), 1);
227 MENUITEM_ADD (menu, menuitem, _("High"), 2);
229 gtk_option_menu_set_menu (GTK_OPTION_MENU (optmenu_filtering_log_level), menu);
230 gtk_box_pack_start(GTK_BOX(hbox_filtering_log_level), optmenu_filtering_log_level, FALSE, FALSE, 0);
232 filtering_log_level_tooltip = gtk_tooltips_new();
233 gtk_tooltips_set_tip(GTK_TOOLTIPS(filtering_log_level_tooltip),
234 optmenu_filtering_log_level,
235 _("Select the level of detail of the logging.\n"
236 "Choose Low to see when rules are applied, which "
237 "conditions match or don't match and what actions are "
239 "Choose Medium to see more details about the message "
240 "that is being processed, and why rules are skipped.\n"
241 "Choose High to explicitly show the reason why all "
242 "rules are processed or skipped, and why all conditions "
243 "are matched or not matched.\n"
244 "Caution: the higher the level, the greater the "
245 "impact on performance."),
248 hbox_clip_filtering_log = gtk_hbox_new (FALSE, 8);
249 gtk_container_add (GTK_CONTAINER (vbox1_filtering_log), hbox_clip_filtering_log);
250 gtk_widget_show (hbox_clip_filtering_log);
251 PACK_CHECK_BUTTON (hbox_clip_filtering_log, checkbtn_clip_filtering_log,
252 _("Restrict the log window to"));
254 filtering_log_length_tooltip = gtk_tooltips_new();
256 spinbtn_filtering_log_length_adj = gtk_adjustment_new (500, 0, G_MAXINT, 1, 10, 10);
257 spinbtn_filtering_log_length = gtk_spin_button_new
258 (GTK_ADJUSTMENT (spinbtn_filtering_log_length_adj), 1, 0);
259 gtk_widget_show (spinbtn_filtering_log_length);
260 gtk_box_pack_start (GTK_BOX (hbox_clip_filtering_log), spinbtn_filtering_log_length,
262 gtk_widget_set_size_request (GTK_WIDGET (spinbtn_filtering_log_length), 64, -1);
263 gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbtn_filtering_log_length), TRUE);
265 gtk_tooltips_set_tip(GTK_TOOLTIPS(filtering_log_length_tooltip), spinbtn_filtering_log_length,
266 _("0 to stop logging in the log window"),
269 label = gtk_label_new(_("lines"));
270 gtk_widget_show (label);
271 gtk_box_pack_start(GTK_BOX(hbox_clip_filtering_log), label, FALSE, FALSE, 0);
273 SET_TOGGLE_SENSITIVITY(checkbtn_clip_filtering_log, spinbtn_filtering_log_length);
274 SET_TOGGLE_SENSITIVITY(checkbtn_clip_filtering_log, label);
275 SET_TOGGLE_SENSITIVITY(checkbtn_filtering_log, hbox_clip_filtering_log);
276 SET_TOGGLE_SENSITIVITY(checkbtn_filtering_log, optmenu_filtering_log_level);
277 SET_TOGGLE_SENSITIVITY(checkbtn_filtering_log, checkbtn_clip_filtering_log);
278 SET_TOGGLE_SENSITIVITY(checkbtn_filtering_log, label_filtering_log_level);
281 vbox_disc_log = gtkut_get_options_frame(vbox1, &frame_disc_log, _("Disc log"));
283 label = gtk_label_new(_("Write the following information to disc..."));
284 gtk_widget_show(label);
285 hbox = gtk_hbox_new (FALSE, 8);
286 gtk_container_add (GTK_CONTAINER (vbox_disc_log), hbox);
287 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
288 gtk_widget_show (hbox);
290 PACK_CHECK_BUTTON (vbox_disc_log, checkbtn_log_standard,
291 _("Network protocol messages"));
292 hbox_log_standard = gtk_hbox_new (FALSE, 8);
293 gtk_container_add (GTK_CONTAINER (vbox_disc_log), hbox_log_standard);
294 gtk_widget_show (hbox_log_standard);
296 PACK_CHECK_BUTTON (vbox_disc_log, checkbtn_log_warning,
297 _("Warning messages"));
298 hbox_log_warning = gtk_hbox_new (FALSE, 8);
299 gtk_container_add (GTK_CONTAINER (vbox_disc_log), hbox_log_warning);
300 gtk_widget_show (hbox_log_warning);
302 PACK_CHECK_BUTTON (vbox_disc_log, checkbtn_log_error,
303 _("Error messages"));
304 hbox_log_error = gtk_hbox_new (FALSE, 8);
305 gtk_container_add (GTK_CONTAINER (vbox_disc_log), hbox_log_error);
306 gtk_widget_show (hbox_log_error);
308 PACK_CHECK_BUTTON (vbox_disc_log, checkbtn_log_status,
309 _("Status messages for filtering/processing log"));
310 hbox_log_status = gtk_hbox_new (FALSE, 8);
311 gtk_container_add (GTK_CONTAINER (vbox_disc_log), hbox_log_status);
312 gtk_widget_show (hbox_log_status);
314 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_clip_network_log),
315 prefs_common.cliplog);
316 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_clip_filtering_log),
317 prefs_common.filtering_debug_cliplog);
318 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_log_standard),
319 prefs_common.enable_log_standard);
320 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_log_warning),
321 prefs_common.enable_log_warning);
322 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_log_error),
323 prefs_common.enable_log_error);
324 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_log_status),
325 prefs_common.enable_log_status);
326 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_filtering_log),
327 prefs_common.enable_filtering_debug);
328 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_filtering_log_inc),
329 prefs_common.enable_filtering_debug_inc);
330 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_filtering_log_manual),
331 prefs_common.enable_filtering_debug_manual);
332 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_filtering_log_folder_proc),
333 prefs_common.enable_filtering_debug_folder_proc);
334 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_filtering_log_pre_proc),
335 prefs_common.enable_filtering_debug_pre_proc);
336 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_filtering_log_post_proc),
337 prefs_common.enable_filtering_debug_post_proc);
339 gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinbtn_network_log_length),
340 prefs_common.loglength);
341 gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinbtn_filtering_log_length),
342 prefs_common.filtering_debug_loglength);
344 gtk_option_menu_set_history(GTK_OPTION_MENU(optmenu_filtering_log_level),
345 prefs_common.filtering_debug_level);
347 prefs_logging->checkbtn_clip_network_log = checkbtn_clip_network_log;
348 prefs_logging->spinbtn_network_log_length = spinbtn_network_log_length;
349 prefs_logging->checkbtn_log_standard = checkbtn_log_standard;
350 prefs_logging->checkbtn_log_warning = checkbtn_log_warning;
351 prefs_logging->checkbtn_log_error = checkbtn_log_error;
352 prefs_logging->checkbtn_log_status = checkbtn_log_status;
353 prefs_logging->checkbtn_clip_filtering_log = checkbtn_clip_filtering_log;
354 prefs_logging->spinbtn_filtering_log_length = spinbtn_filtering_log_length;
355 prefs_logging->checkbtn_filtering_log = checkbtn_filtering_log;
356 prefs_logging->checkbtn_filtering_log_inc = checkbtn_filtering_log_inc;
357 prefs_logging->checkbtn_filtering_log_manual = checkbtn_filtering_log_manual;
358 prefs_logging->checkbtn_filtering_log_folder_proc = checkbtn_filtering_log_folder_proc;
359 prefs_logging->checkbtn_filtering_log_pre_proc = checkbtn_filtering_log_pre_proc;
360 prefs_logging->checkbtn_filtering_log_post_proc = checkbtn_filtering_log_post_proc;
361 prefs_logging->optmenu_filtering_log_level = optmenu_filtering_log_level;
363 prefs_logging->page.widget = vbox1;
366 static void prefs_logging_save(PrefsPage *_page)
368 LoggingPage *page = (LoggingPage *) _page;
369 MainWindow *mainwindow;
370 gboolean filtering_debug_enabled;
374 menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(page->optmenu_filtering_log_level));
375 menuitem = gtk_menu_get_active(GTK_MENU(menu));
376 prefs_common.filtering_debug_level = GPOINTER_TO_INT
377 (g_object_get_data(G_OBJECT(menuitem), MENU_VAL_ID));
379 prefs_common.cliplog = gtk_toggle_button_get_active(
380 GTK_TOGGLE_BUTTON(page->checkbtn_clip_network_log));
381 prefs_common.loglength = gtk_spin_button_get_value_as_int(
382 GTK_SPIN_BUTTON(page->spinbtn_network_log_length));
383 prefs_common.enable_log_standard = gtk_toggle_button_get_active(
384 GTK_TOGGLE_BUTTON(page->checkbtn_log_standard));
385 prefs_common.enable_log_warning = gtk_toggle_button_get_active(
386 GTK_TOGGLE_BUTTON(page->checkbtn_log_warning));
387 prefs_common.enable_log_error = gtk_toggle_button_get_active(
388 GTK_TOGGLE_BUTTON(page->checkbtn_log_error));
389 prefs_common.enable_log_status = gtk_toggle_button_get_active(
390 GTK_TOGGLE_BUTTON(page->checkbtn_log_status));
391 prefs_common.filtering_debug_cliplog = gtk_toggle_button_get_active(
392 GTK_TOGGLE_BUTTON(page->checkbtn_clip_filtering_log));
393 prefs_common.filtering_debug_loglength = gtk_spin_button_get_value_as_int(
394 GTK_SPIN_BUTTON(page->spinbtn_filtering_log_length));
395 filtering_debug_enabled = prefs_common.enable_filtering_debug;
396 prefs_common.enable_filtering_debug = gtk_toggle_button_get_active(
397 GTK_TOGGLE_BUTTON(page->checkbtn_filtering_log));
398 if (filtering_debug_enabled != prefs_common.enable_filtering_debug) {
399 if (prefs_common.enable_filtering_debug)
400 log_message(LOG_DEBUG_FILTERING, _("filtering log enabled\n"));
402 log_message(LOG_DEBUG_FILTERING, _("filtering log disabled\n"));
404 prefs_common.enable_filtering_debug_inc = gtk_toggle_button_get_active(
405 GTK_TOGGLE_BUTTON(page->checkbtn_filtering_log_inc));
406 prefs_common.enable_filtering_debug_manual = gtk_toggle_button_get_active(
407 GTK_TOGGLE_BUTTON(page->checkbtn_filtering_log_manual));
408 prefs_common.enable_filtering_debug_folder_proc = gtk_toggle_button_get_active(
409 GTK_TOGGLE_BUTTON(page->checkbtn_filtering_log_folder_proc));
410 prefs_common.enable_filtering_debug_pre_proc = gtk_toggle_button_get_active(
411 GTK_TOGGLE_BUTTON(page->checkbtn_filtering_log_pre_proc));
412 prefs_common.enable_filtering_debug_post_proc = gtk_toggle_button_get_active(
413 GTK_TOGGLE_BUTTON(page->checkbtn_filtering_log_post_proc));
415 mainwindow = mainwindow_get_mainwindow();
416 log_window_set_clipping(mainwindow->logwin, prefs_common.cliplog,
417 prefs_common.loglength);
418 log_window_set_clipping(mainwindow->filtering_debugwin, prefs_common.filtering_debug_cliplog,
419 prefs_common.filtering_debug_loglength);
422 static void prefs_logging_destroy_widget(PrefsPage *_page)
426 LoggingPage *prefs_logging;
428 void prefs_logging_init(void)
431 static gchar *path[3];
433 path[0] = _("Other");
434 path[1] = _("Logging");
437 page = g_new0(LoggingPage, 1);
438 page->page.path = path;
439 page->page.create_widget = prefs_logging_create_widget;
440 page->page.destroy_widget = prefs_logging_destroy_widget;
441 page->page.save_page = prefs_logging_save;
442 page->page.weight = 5.0;
443 prefs_gtk_register_page((PrefsPage *) page);
444 prefs_logging = page;
447 void prefs_logging_done(void)
449 prefs_gtk_unregister_page((PrefsPage *) prefs_logging);
450 g_free(prefs_logging);