Fix typos and errors in polish translation
[claws.git] / src / prefs_logging.c
1 /*
2  * Claws Mail -- a GTK+ based, lightweight, and fast e-mail client
3  * Copyright (C) 1999-2012 Tristan Chabredier <wwp@claws-mail.org> and 
4  * the Claws Mail team
5  *
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.
10  *
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.
15  *
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/>.
18  * 
19  */
20
21 #ifdef HAVE_CONFIG_H
22 #  include "config.h"
23 #include "claws-features.h"
24 #endif
25
26 #include "defs.h"
27
28 #include <stdio.h>
29 #include <stdlib.h>
30
31 #include <glib.h>
32 #include <glib/gi18n.h>
33 #include <gtk/gtk.h>
34
35 #include "prefs_common.h"
36 #include "prefs_gtk.h"
37
38 #include "gtk/gtkutils.h"
39 #include "gtk/prefswindow.h"
40 #include "gtk/menu.h"
41
42 #include "manage_window.h"
43
44 #include "log.h"
45 #include "combobox.h"
46
47 typedef struct _LoggingPage
48 {
49         PrefsPage page;
50
51         GtkWidget *window;
52
53         GtkWidget *checkbtn_clip_network_log;
54         GtkWidget *spinbtn_network_log_length;
55         GtkWidget *checkbtn_log_standard;
56         GtkWidget *checkbtn_log_warning;
57         GtkWidget *checkbtn_log_error;
58         GtkWidget *checkbtn_log_status;
59         GtkWidget *checkbtn_clip_filtering_log;
60         GtkWidget *spinbtn_filtering_log_length;
61         GtkWidget *checkbtn_filtering_log;
62         GtkWidget *checkbtn_filtering_log_inc;
63         GtkWidget *checkbtn_filtering_log_manual;
64         GtkWidget *checkbtn_filtering_log_folder_proc;
65         GtkWidget *checkbtn_filtering_log_pre_proc;
66         GtkWidget *checkbtn_filtering_log_post_proc;
67         GtkWidget *optmenu_filtering_log_level;
68 } LoggingPage;
69
70 static GtkWidget *prefs_logging_create_check_buttons(GtkWidget **checkbtn1,
71                         gchar *label1, GtkWidget **checkbtn2, gchar *label2)
72 {
73         GtkWidget *hbox_checkbtn;
74
75         hbox_checkbtn = gtk_hbox_new(FALSE, VBOX_BORDER);
76         gtk_widget_show(hbox_checkbtn);
77         
78         PACK_CHECK_BUTTON (hbox_checkbtn, *checkbtn1, label1); 
79         gtk_label_set_line_wrap(GTK_LABEL(gtk_bin_get_child(GTK_BIN((*checkbtn1)))), TRUE);
80
81         PACK_CHECK_BUTTON (hbox_checkbtn, *checkbtn2, label2);
82         gtk_label_set_line_wrap(GTK_LABEL(gtk_bin_get_child(GTK_BIN((*checkbtn2)))), TRUE);
83         
84         return hbox_checkbtn;
85 }
86
87 static void prefs_logging_create_widget(PrefsPage *_page, GtkWindow *window, 
88                                   gpointer data)
89 {
90         LoggingPage *prefs_logging = (LoggingPage *) _page;
91         
92         GtkWidget *vbox1;
93
94         GtkWidget *frame_logging;
95         GtkWidget *vbox_network_log;
96         GtkWidget *hbox_clip_network_log;
97         GtkWidget *checkbtn_clip_network_log;
98         GtkWidget *spinbtn_network_log_length;
99         GtkAdjustment *spinbtn_network_log_length_adj;
100         GtkWidget *hbox_checkbtn;
101         GtkWidget *vbox1_filtering_log;
102         GtkWidget *hbox_clip_filtering_log;
103         GtkWidget *checkbtn_clip_filtering_log;
104         GtkWidget *spinbtn_filtering_log_length;
105         GtkAdjustment *spinbtn_filtering_log_length_adj;
106         GtkWidget *hbox_filtering_log;
107         GtkWidget *checkbtn_filtering_log;
108         GtkWidget *frame_filtering_log;
109         GtkWidget *vbox2_filtering_log;
110         GtkWidget *checkbtn_filtering_log_inc;
111         GtkWidget *checkbtn_filtering_log_manual;
112         GtkWidget *checkbtn_filtering_log_folder_proc;
113         GtkWidget *checkbtn_filtering_log_pre_proc;
114         GtkWidget *checkbtn_filtering_log_post_proc;
115         GtkWidget *hbox_filtering_log_level;
116         GtkWidget *label_filtering_log_level;
117         GtkWidget *optmenu_filtering_log_level;
118         GtkSizeGroup *filter_size_group;
119         GtkListStore *menu;
120         GtkTreeIter iter;
121         GtkWidget *frame_disk_log;
122         GtkWidget *vbox_disk_log;
123         GtkWidget *label;
124         GtkWidget *hbox;
125         GtkWidget *checkbtn_log_standard;
126         GtkWidget *checkbtn_log_warning;
127         GtkWidget *checkbtn_log_error;
128         GtkWidget *checkbtn_log_status;
129         GtkSizeGroup *log_size_group;
130         
131         vbox1 = gtk_vbox_new (FALSE, VSPACING);
132         gtk_widget_show (vbox1);
133         gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
134
135         /* Protocol log */
136         vbox_network_log = gtkut_get_options_frame(vbox1, &frame_logging, _("Network log"));
137
138         hbox_clip_network_log = gtk_hbox_new (FALSE, 8);
139         gtk_container_add (GTK_CONTAINER (vbox_network_log), hbox_clip_network_log);
140         gtk_widget_show (hbox_clip_network_log);
141
142         PACK_CHECK_BUTTON (hbox_clip_network_log, checkbtn_clip_network_log,
143                            _("Restrict the log window to"));
144         
145         spinbtn_network_log_length_adj = GTK_ADJUSTMENT(gtk_adjustment_new (500, 0, G_MAXINT, 1, 10, 0));
146         spinbtn_network_log_length = gtk_spin_button_new
147                 (GTK_ADJUSTMENT (spinbtn_network_log_length_adj), 1, 0);
148         gtk_widget_show (spinbtn_network_log_length);
149         gtk_box_pack_start (GTK_BOX (hbox_clip_network_log), spinbtn_network_log_length,
150                             FALSE, FALSE, 0);
151         gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbtn_network_log_length), TRUE);
152
153         CLAWS_SET_TIP(spinbtn_network_log_length,
154                              _("0 to stop logging in the log window"));
155
156         label = gtk_label_new(_("lines"));
157         gtk_widget_show (label);
158         gtk_box_pack_start(GTK_BOX(hbox_clip_network_log), label, FALSE, FALSE, 0);
159
160         SET_TOGGLE_SENSITIVITY(checkbtn_clip_network_log, spinbtn_network_log_length);
161         SET_TOGGLE_SENSITIVITY(checkbtn_clip_network_log, label);
162
163         /* Filtering/processing debug log */
164         vbox1_filtering_log = gtkut_get_options_frame(vbox1,
165                                 &frame_logging, _("Filtering/processing log"));
166
167         PACK_CHECK_BUTTON (vbox1_filtering_log, checkbtn_filtering_log,
168                            _("Enable logging of filtering/processing rules"));
169         hbox_filtering_log = gtk_hbox_new (FALSE, 8);
170         gtk_container_add (GTK_CONTAINER (vbox1_filtering_log), hbox_filtering_log);
171         gtk_widget_show (hbox_filtering_log);
172
173         CLAWS_SET_TIP(checkbtn_filtering_log,
174                              _("If checked, turns on logging of filtering and processing rules.\n"
175                                 "The log is accessible from 'Tools/Filtering log'.\n"
176                                 "Caution: enabling this option will slow down the filtering/processing, "
177                                 "this might be critical when applying many rules upon thousands of "
178                                 "messages."));
179
180         vbox2_filtering_log = gtkut_get_options_frame(vbox1_filtering_log, &frame_filtering_log,
181                                                         _("Log filtering/processing when..."));
182
183         hbox_checkbtn = prefs_logging_create_check_buttons(
184                                                 &checkbtn_filtering_log_inc,
185                                                 _("filtering at incorporation"),
186                                                 &checkbtn_filtering_log_pre_proc,
187                                                 _("pre-processing folders"));
188         gtk_box_pack_start(GTK_BOX(vbox2_filtering_log), hbox_checkbtn, FALSE, FALSE, 0);
189
190         hbox_checkbtn = prefs_logging_create_check_buttons(
191                                                 &checkbtn_filtering_log_manual,
192                                                 _("manually filtering"),
193                                                 &checkbtn_filtering_log_post_proc,
194                                                 _("post-processing folders"));
195         gtk_box_pack_start(GTK_BOX(vbox2_filtering_log), hbox_checkbtn, FALSE, FALSE, 0);
196         
197         hbox_checkbtn = gtk_hbox_new(TRUE, VBOX_BORDER);
198         gtk_widget_show(hbox_checkbtn);
199         gtk_box_pack_start(GTK_BOX(vbox2_filtering_log), hbox_checkbtn, FALSE, FALSE, 0);
200         PACK_CHECK_BUTTON (hbox_checkbtn, checkbtn_filtering_log_folder_proc,
201                            _("processing folders"));
202         gtk_box_pack_start(GTK_BOX(hbox_checkbtn), gtk_label_new(""),
203                            FALSE, TRUE, 0);
204
205         filter_size_group = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
206         gtk_size_group_add_widget(filter_size_group, checkbtn_filtering_log_inc);
207         gtk_size_group_add_widget(filter_size_group, checkbtn_filtering_log_manual);
208         gtk_size_group_add_widget(filter_size_group, checkbtn_filtering_log_folder_proc);
209         g_object_unref(G_OBJECT(filter_size_group));
210
211         SET_TOGGLE_SENSITIVITY(checkbtn_filtering_log, frame_filtering_log);
212
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);
216
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);
220
221         optmenu_filtering_log_level = gtkut_sc_combobox_create(NULL, FALSE);
222         gtk_widget_show (optmenu_filtering_log_level);
223         
224         menu = GTK_LIST_STORE(gtk_combo_box_get_model(
225                                 GTK_COMBO_BOX(optmenu_filtering_log_level)));
226         COMBOBOX_ADD (menu, _("Low"), 0);
227         COMBOBOX_ADD (menu, _("Medium"), 1);
228         COMBOBOX_ADD (menu, _("High"), 2);
229
230         gtk_box_pack_start(GTK_BOX(hbox_filtering_log_level), optmenu_filtering_log_level, FALSE, FALSE, 0);
231
232         CLAWS_SET_TIP(optmenu_filtering_log_level,
233                              _("Select the level of detail of the logging.\n"
234                                 "Choose Low to see when rules are applied, which "
235                                 "conditions match or don't match and what actions are "
236                                 "performed.\n"
237                                 "Choose Medium to see more details about the message "
238                                 "that is being processed, and why rules are skipped.\n"
239                                 "Choose High to explicitly show the reason why all "
240                                 "rules are processed or skipped, and why all conditions "
241                                 "are matched or not matched.\n"
242                                 "Caution: the higher the level, the greater the "
243                                 "impact on performance."));
244
245         hbox_clip_filtering_log = gtk_hbox_new (FALSE, 8);
246         gtk_container_add (GTK_CONTAINER (vbox1_filtering_log), hbox_clip_filtering_log);
247         gtk_widget_show (hbox_clip_filtering_log);
248         PACK_CHECK_BUTTON (hbox_clip_filtering_log, checkbtn_clip_filtering_log,
249                            _("Restrict the log window to"));
250         
251         spinbtn_filtering_log_length_adj = GTK_ADJUSTMENT(gtk_adjustment_new (500, 0, G_MAXINT, 1, 10, 0));
252         spinbtn_filtering_log_length = gtk_spin_button_new
253                 (GTK_ADJUSTMENT (spinbtn_filtering_log_length_adj), 1, 0);
254         gtk_widget_show (spinbtn_filtering_log_length);
255         gtk_box_pack_start (GTK_BOX (hbox_clip_filtering_log), spinbtn_filtering_log_length,
256                             FALSE, FALSE, 0);
257         gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbtn_filtering_log_length), TRUE);
258
259         CLAWS_SET_TIP(spinbtn_filtering_log_length,
260                              _("0 to stop logging in the log window"));
261
262         label = gtk_label_new(_("lines"));
263         gtk_widget_show (label);
264         gtk_box_pack_start(GTK_BOX(hbox_clip_filtering_log), label, FALSE, FALSE, 0);
265
266         SET_TOGGLE_SENSITIVITY(checkbtn_clip_filtering_log, spinbtn_filtering_log_length);
267         SET_TOGGLE_SENSITIVITY(checkbtn_clip_filtering_log, label);
268         SET_TOGGLE_SENSITIVITY(checkbtn_filtering_log, hbox_clip_filtering_log);
269         SET_TOGGLE_SENSITIVITY(checkbtn_filtering_log, optmenu_filtering_log_level);
270         SET_TOGGLE_SENSITIVITY(checkbtn_filtering_log, checkbtn_clip_filtering_log);
271         SET_TOGGLE_SENSITIVITY(checkbtn_filtering_log, label_filtering_log_level);
272
273         /* disk log */
274         vbox_disk_log = gtkut_get_options_frame(vbox1, &frame_disk_log, _("Disk log"));
275
276         label = gtk_label_new(_("Write the following information to disk..."));
277         gtk_widget_show(label);
278         hbox = gtk_hbox_new (FALSE, 8);
279         gtk_container_add (GTK_CONTAINER (vbox_disk_log), hbox);
280         gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
281         gtk_widget_show (hbox);
282
283         hbox_checkbtn = prefs_logging_create_check_buttons(&checkbtn_log_warning,
284                                 _("Warning messages"), &checkbtn_log_standard,
285                                 _("Network protocol messages"));
286         gtk_box_pack_start(GTK_BOX(vbox_disk_log), hbox_checkbtn, FALSE, FALSE, 0);
287
288         hbox_checkbtn = prefs_logging_create_check_buttons(&checkbtn_log_error, 
289                                 _("Error messages"), &checkbtn_log_status,
290                                 _("Status messages for filtering/processing log"));
291         gtk_box_pack_start(GTK_BOX(vbox_disk_log), hbox_checkbtn, FALSE, FALSE, 0);
292         
293         log_size_group = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
294         gtk_size_group_add_widget(log_size_group, checkbtn_log_warning);
295         gtk_size_group_add_widget(log_size_group, checkbtn_log_error);
296         g_object_unref(G_OBJECT(log_size_group));
297
298         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_clip_network_log), 
299                 prefs_common.cliplog);
300         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_clip_filtering_log), 
301                 prefs_common.filtering_debug_cliplog);
302         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_log_standard), 
303                 prefs_common.enable_log_standard);
304         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_log_warning), 
305                 prefs_common.enable_log_warning);
306         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_log_error), 
307                 prefs_common.enable_log_error);
308         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_log_status), 
309                 prefs_common.enable_log_status);
310         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_filtering_log), 
311                 prefs_common.enable_filtering_debug);
312         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_filtering_log_inc), 
313                 prefs_common.enable_filtering_debug_inc);
314         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_filtering_log_manual), 
315                 prefs_common.enable_filtering_debug_manual);
316         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_filtering_log_folder_proc), 
317                 prefs_common.enable_filtering_debug_folder_proc);
318         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_filtering_log_pre_proc), 
319                 prefs_common.enable_filtering_debug_pre_proc);
320         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_filtering_log_post_proc), 
321                 prefs_common.enable_filtering_debug_post_proc);
322
323         gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinbtn_network_log_length),
324                 prefs_common.loglength);
325         gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinbtn_filtering_log_length),
326                 prefs_common.filtering_debug_loglength);
327         combobox_select_by_data(GTK_COMBO_BOX(optmenu_filtering_log_level),
328                         prefs_common.filtering_debug_level);
329
330         prefs_logging->checkbtn_clip_network_log = checkbtn_clip_network_log;
331         prefs_logging->spinbtn_network_log_length = spinbtn_network_log_length;
332         prefs_logging->checkbtn_log_standard = checkbtn_log_standard;
333         prefs_logging->checkbtn_log_warning = checkbtn_log_warning;
334         prefs_logging->checkbtn_log_error = checkbtn_log_error;
335         prefs_logging->checkbtn_log_status = checkbtn_log_status;
336         prefs_logging->checkbtn_clip_filtering_log = checkbtn_clip_filtering_log;
337         prefs_logging->spinbtn_filtering_log_length = spinbtn_filtering_log_length;
338         prefs_logging->checkbtn_filtering_log = checkbtn_filtering_log;
339         prefs_logging->checkbtn_filtering_log_inc = checkbtn_filtering_log_inc;
340         prefs_logging->checkbtn_filtering_log_manual = checkbtn_filtering_log_manual;
341         prefs_logging->checkbtn_filtering_log_folder_proc = checkbtn_filtering_log_folder_proc;
342         prefs_logging->checkbtn_filtering_log_pre_proc = checkbtn_filtering_log_pre_proc;
343         prefs_logging->checkbtn_filtering_log_post_proc = checkbtn_filtering_log_post_proc;
344         prefs_logging->optmenu_filtering_log_level = optmenu_filtering_log_level;
345         prefs_logging->page.widget = vbox1;
346 }
347
348 static void prefs_logging_save(PrefsPage *_page)
349 {
350         LoggingPage *page = (LoggingPage *) _page;
351         MainWindow *mainwindow;
352
353         gboolean filtering_debug_enabled;
354         prefs_common.filtering_debug_level =
355                 combobox_get_active_data(GTK_COMBO_BOX(page->optmenu_filtering_log_level));
356
357         prefs_common.cliplog = gtk_toggle_button_get_active(
358                 GTK_TOGGLE_BUTTON(page->checkbtn_clip_network_log));
359         prefs_common.loglength = gtk_spin_button_get_value_as_int(
360                 GTK_SPIN_BUTTON(page->spinbtn_network_log_length));
361         prefs_common.enable_log_standard = gtk_toggle_button_get_active(
362                 GTK_TOGGLE_BUTTON(page->checkbtn_log_standard));
363         prefs_common.enable_log_warning = gtk_toggle_button_get_active(
364                 GTK_TOGGLE_BUTTON(page->checkbtn_log_warning));
365         prefs_common.enable_log_error = gtk_toggle_button_get_active(
366                 GTK_TOGGLE_BUTTON(page->checkbtn_log_error));
367         prefs_common.enable_log_status = gtk_toggle_button_get_active(
368                 GTK_TOGGLE_BUTTON(page->checkbtn_log_status));
369         prefs_common.filtering_debug_cliplog = gtk_toggle_button_get_active(
370                 GTK_TOGGLE_BUTTON(page->checkbtn_clip_filtering_log));
371         prefs_common.filtering_debug_loglength = gtk_spin_button_get_value_as_int(
372                 GTK_SPIN_BUTTON(page->spinbtn_filtering_log_length));
373         filtering_debug_enabled = prefs_common.enable_filtering_debug;
374         prefs_common.enable_filtering_debug = gtk_toggle_button_get_active(
375                 GTK_TOGGLE_BUTTON(page->checkbtn_filtering_log));
376         if (filtering_debug_enabled != prefs_common.enable_filtering_debug) {
377                 if (prefs_common.enable_filtering_debug)
378                         log_message(LOG_DEBUG_FILTERING, _("filtering log enabled\n"));
379                 else
380                         log_message(LOG_DEBUG_FILTERING, _("filtering log disabled\n"));
381         }
382         prefs_common.enable_filtering_debug_inc = gtk_toggle_button_get_active(
383                 GTK_TOGGLE_BUTTON(page->checkbtn_filtering_log_inc));
384         prefs_common.enable_filtering_debug_manual = gtk_toggle_button_get_active(
385                 GTK_TOGGLE_BUTTON(page->checkbtn_filtering_log_manual));
386         prefs_common.enable_filtering_debug_folder_proc = gtk_toggle_button_get_active(
387                 GTK_TOGGLE_BUTTON(page->checkbtn_filtering_log_folder_proc));
388         prefs_common.enable_filtering_debug_pre_proc = gtk_toggle_button_get_active(
389                 GTK_TOGGLE_BUTTON(page->checkbtn_filtering_log_pre_proc));
390         prefs_common.enable_filtering_debug_post_proc = gtk_toggle_button_get_active(
391                 GTK_TOGGLE_BUTTON(page->checkbtn_filtering_log_post_proc));
392         mainwindow = mainwindow_get_mainwindow();
393         log_window_set_clipping(mainwindow->logwin, prefs_common.cliplog,
394                                 prefs_common.loglength);
395         log_window_set_clipping(mainwindow->filtering_debugwin, prefs_common.filtering_debug_cliplog,
396                                 prefs_common.filtering_debug_loglength);
397 }
398
399 static void prefs_logging_destroy_widget(PrefsPage *_page)
400 {
401 }
402
403 LoggingPage *prefs_logging;
404
405 void prefs_logging_init(void)
406 {
407         LoggingPage *page;
408         static gchar *path[3];
409
410         path[0] = _("Other");
411         path[1] = _("Logging");
412         path[2] = NULL;
413
414         page = g_new0(LoggingPage, 1);
415         page->page.path = path;
416         page->page.create_widget = prefs_logging_create_widget;
417         page->page.destroy_widget = prefs_logging_destroy_widget;
418         page->page.save_page = prefs_logging_save;
419         page->page.weight = 5.0;
420         prefs_gtk_register_page((PrefsPage *) page);
421         prefs_logging = page;
422 }
423
424 void prefs_logging_done(void)
425 {
426         prefs_gtk_unregister_page((PrefsPage *) prefs_logging);
427         g_free(prefs_logging);
428 }