fix bug where creating a new folder wth inheriting properties doesn't write processin...
[claws.git] / src / prefs_folder_item.c
1 /*
2  * Claws Mail -- a GTK+ based, lightweight, and fast e-mail client
3  * Copyright (C) 1999-2016 Hiroyuki Yamamoto and the Claws Mail team
4  *
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 3 of the License, or
8  * (at your option) any later version.
9  *
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.
14  *
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/>.
17  */
18
19 /* alfons - all folder item specific settings should migrate into 
20  * folderlist.xml!!! the old folderitemrc file will only serve for a few 
21  * versions (for compatibility) */
22
23 #ifdef HAVE_CONFIG_H
24 #  include "config.h"
25 #include "claws-features.h"
26 #endif
27
28 #include "defs.h"
29
30 #include <glib.h>
31 #include <glib/gi18n.h>
32 #include "folder.h"
33 #include "alertpanel.h"
34 #include "prefs_folder_item.h"
35 #include "folderview.h"
36 #include "folder.h"
37 #include "summaryview.h"
38 #include "menu.h"
39 #include "account.h"
40 #include "prefs_gtk.h"
41 #include "manage_window.h"
42 #include "utils.h"
43 #include "addr_compl.h"
44 #include "prefs_common.h"
45 #include "gtkutils.h"
46 #include "filtering.h"
47 #include "folder_item_prefs.h"
48 #include "gtk/colorsel.h"
49 #include "string_match.h"
50 #include "quote_fmt.h"
51 #include "combobox.h"
52 #include "stock_pixmap.h"
53
54 #if USE_ENCHANT
55 #include "gtkaspell.h"
56 #endif
57
58 #define ASSIGN_STRING(string, value) \
59         { \
60                 g_free(string); \
61                 string = (value); \
62         }
63
64 typedef struct _FolderItemGeneralPage FolderItemGeneralPage;
65 typedef struct _FolderItemComposePage FolderItemComposePage;
66 typedef struct _FolderItemTemplatesPage FolderItemTemplatesPage;
67 static gboolean can_save = TRUE;
68
69 struct _FolderItemGeneralPage
70 {
71         PrefsPage page;
72
73         FolderItem *item;
74
75         GtkWidget *table;
76         GtkWidget *no_save_warning;
77         GtkWidget *folder_type;
78         GtkWidget *checkbtn_simplify_subject;
79         GtkWidget *entry_simplify_subject;
80         GtkWidget *entry_regexp_test_string;
81         GtkWidget *entry_regexp_test_result;
82         GtkWidget *checkbtn_folder_chmod;
83         GtkWidget *entry_folder_chmod;
84         GtkWidget *folder_color_btn;
85         GtkWidget *checkbtn_enable_processing;
86         GtkWidget *checkbtn_enable_processing_when_opening;
87         GtkWidget *checkbtn_newmailcheck;
88         GtkWidget *checkbtn_offlinesync;
89         GtkWidget *label_offlinesync;
90         GtkWidget *entry_offlinesync;
91         GtkWidget *label_end_offlinesync;
92         GtkWidget *checkbtn_remove_old_offlinesync;
93         GtkWidget *promote_html_part;
94         
95         /* apply to sub folders */
96         GtkWidget *simplify_subject_rec_checkbtn;
97         GtkWidget *folder_chmod_rec_checkbtn;
98         GtkWidget *folder_color_rec_checkbtn;
99         GtkWidget *enable_processing_rec_checkbtn;
100         GtkWidget *enable_processing_when_opening_rec_checkbtn;
101         GtkWidget *newmailcheck_rec_checkbtn;
102         GtkWidget *offlinesync_rec_checkbtn;
103         GtkWidget *promote_html_part_rec_checkbtn;
104
105         gint       folder_color;
106 };
107
108 struct _FolderItemComposePage
109 {
110         PrefsPage page;
111
112         FolderItem *item;
113
114         GtkWidget *window;
115         GtkWidget *table;
116         GtkWidget *no_save_warning;
117         GtkWidget *checkbtn_request_return_receipt;
118         GtkWidget *checkbtn_save_copy_to_folder;
119         GtkWidget *checkbtn_default_to;
120         GtkWidget *entry_default_to;
121         GtkWidget *checkbtn_default_reply_to;
122         GtkWidget *entry_default_reply_to;
123         GtkWidget *checkbtn_default_cc;
124         GtkWidget *entry_default_cc;
125         GtkWidget *checkbtn_default_bcc;
126         GtkWidget *entry_default_bcc;
127         GtkWidget *checkbtn_default_replyto;
128         GtkWidget *entry_default_replyto;
129         GtkWidget *checkbtn_enable_default_account;
130         GtkWidget *optmenu_default_account;
131 #if USE_ENCHANT
132         GtkWidget *checkbtn_enable_default_dictionary;
133         GtkWidget *checkbtn_enable_default_alt_dictionary;
134         GtkWidget *combo_default_dictionary;
135         GtkWidget *combo_default_alt_dictionary;
136 #endif
137         GtkWidget *always_sign;
138         GtkWidget *always_encrypt;
139
140         /* apply to sub folders */
141         GtkWidget *request_return_receipt_rec_checkbtn;
142         GtkWidget *save_copy_to_folder_rec_checkbtn;
143         GtkWidget *default_to_rec_checkbtn;
144         GtkWidget *default_reply_to_rec_checkbtn;
145         GtkWidget *default_cc_rec_checkbtn;
146         GtkWidget *default_bcc_rec_checkbtn;
147         GtkWidget *default_replyto_rec_checkbtn;
148         GtkWidget *default_account_rec_checkbtn;
149 #if USE_ENCHANT
150         GtkWidget *default_dictionary_rec_checkbtn;
151         GtkWidget *default_alt_dictionary_rec_checkbtn;
152 #endif
153         GtkWidget *always_sign_rec_checkbtn;
154         GtkWidget *always_encrypt_rec_checkbtn;
155 };
156
157 struct _FolderItemTemplatesPage
158 {
159         PrefsPage page;
160
161         FolderItem *item;
162
163         GtkWidget *window;
164         GtkWidget *table;
165         GtkWidget *checkbtn_compose_with_format;
166         GtkWidget *compose_override_from_format;
167         GtkWidget *compose_subject_format;
168         GtkWidget *compose_body_format;
169         GtkWidget *checkbtn_reply_with_format;
170         GtkWidget *reply_quotemark;
171         GtkWidget *reply_override_from_format;
172         GtkWidget *reply_body_format;
173         GtkWidget *checkbtn_forward_with_format;
174         GtkWidget *forward_quotemark;
175         GtkWidget *forward_override_from_format;
176         GtkWidget *forward_body_format;
177
178         /* apply to sub folders */
179         GtkWidget *new_msg_format_rec_checkbtn;
180         GtkWidget *reply_format_rec_checkbtn;
181         GtkWidget *forward_format_rec_checkbtn;
182 };
183
184
185 static void general_save_folder_prefs(FolderItem *folder, FolderItemGeneralPage *page);
186 static void compose_save_folder_prefs(FolderItem *folder, FolderItemComposePage *page);
187 static void templates_save_folder_prefs(FolderItem *folder, FolderItemTemplatesPage *page);
188
189 static gboolean general_save_recurse_func(GNode *node, gpointer data);
190 static gboolean compose_save_recurse_func(GNode *node, gpointer data);
191 static gboolean templates_save_recurse_func(GNode *node, gpointer data);
192
193 static gint prefs_folder_item_chmod_mode                (gchar *folder_chmod);
194
195 static void folder_color_set_dialog(GtkWidget *widget, gpointer data);
196 static void clean_cache_cb(GtkWidget *widget, gpointer data);
197 static void folder_regexp_test_cb(GtkWidget *widget, gpointer data);
198 static void folder_regexp_set_subject_example_cb(GtkWidget *widget, gpointer data);
199
200 #define SAFE_STRING(str) \
201         (str) ? (str) : ""
202
203 static GtkWidget *prefs_folder_no_save_warning_create_widget() {
204         GtkWidget *hbox;
205         GtkWidget *icon;
206         GtkWidget *label;
207
208         hbox = gtk_hbox_new(FALSE, 0);
209
210         icon = stock_pixmap_widget(STOCK_PIXMAP_NOTICE_WARN);
211         gtk_box_pack_start(GTK_BOX(hbox), icon, FALSE, FALSE, 8);
212
213         label = gtk_label_new(g_strconcat("<i>",
214                 _("These preferences will not be saved as this folder "
215                 "is a top-level folder.\nHowever, you can set them for the "
216                 "whole mailbox tree by using \"Apply to subfolders\"."),
217                 "</i>", NULL));
218         gtk_label_set_use_markup(GTK_LABEL(label), TRUE);
219         gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
220         gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0);
221
222         return hbox;
223 }
224
225 static void prefs_folder_item_general_create_widget_func(PrefsPage * page_,
226                                                    GtkWindow * window,
227                                                    gpointer data)
228 {
229         FolderItemGeneralPage *page = (FolderItemGeneralPage *) page_;
230         FolderItem *item = (FolderItem *) data;
231         guint rowcount;
232
233         GtkWidget *table;
234         GtkWidget *hbox, *hbox2, *hbox_spc;
235         GtkWidget *label;
236         
237         GtkListStore *folder_type_menu;
238         GtkWidget *folder_type;
239         GtkTreeIter iter;
240         GtkWidget *dummy_checkbtn, *clean_cache_btn;
241         SpecialFolderItemType type;
242         GtkWidget *no_save_warning = NULL;
243
244         GtkWidget *checkbtn_simplify_subject;
245         GtkWidget *entry_simplify_subject;
246         GtkWidget *label_regexp_test;
247         GtkWidget *entry_regexp_test_string;
248         GtkWidget *label_regexp_result;
249         GtkWidget *entry_regexp_test_result;
250
251         GtkWidget *checkbtn_folder_chmod;
252         GtkWidget *entry_folder_chmod;
253         GtkWidget *folder_color;
254         GtkWidget *folder_color_btn;
255         GtkWidget *checkbtn_enable_processing;
256         GtkWidget *checkbtn_enable_processing_when_opening;
257         GtkWidget *checkbtn_newmailcheck;
258         GtkWidget *checkbtn_offlinesync;
259         GtkWidget *label_offlinesync;
260         GtkWidget *entry_offlinesync;
261         GtkWidget *label_end_offlinesync;
262         GtkWidget *checkbtn_remove_old_offlinesync;
263         GtkWidget *promote_html_part;
264         GtkListStore *promote_html_part_menu;
265
266         GtkWidget *simplify_subject_rec_checkbtn;
267
268         GtkWidget *folder_chmod_rec_checkbtn;
269         GtkWidget *folder_color_rec_checkbtn;
270         GtkWidget *enable_processing_rec_checkbtn;
271         GtkWidget *enable_processing_when_opening_rec_checkbtn;
272         GtkWidget *newmailcheck_rec_checkbtn;
273         GtkWidget *offlinesync_rec_checkbtn;
274         GtkWidget *promote_html_part_rec_checkbtn;
275
276         page->item         = item;
277
278         /* Table */
279         table = gtk_table_new(12, 3, FALSE);
280         gtk_container_set_border_width (GTK_CONTAINER (table), VBOX_BORDER);
281         gtk_table_set_row_spacings(GTK_TABLE(table), 4);
282         gtk_table_set_col_spacings(GTK_TABLE(table), 4);
283         rowcount = 0;
284
285         if (!can_save) {
286                 no_save_warning = prefs_folder_no_save_warning_create_widget();
287                 gtk_table_attach(GTK_TABLE(table), no_save_warning, 0, 3,
288                         rowcount, rowcount + 1, GTK_FILL, 0, 0, 0);
289                 rowcount++;
290         }
291         
292         /* Apply to subfolders */
293         label = gtk_label_new(_("Apply to\nsubfolders"));
294         gtk_misc_set_alignment(GTK_MISC(label), 0.5, 0.5);
295         gtk_table_attach(GTK_TABLE(table), label, 2, 3,
296                          rowcount, rowcount + 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
297         rowcount++;
298
299         /* folder_type */
300         folder_type = gtkut_sc_combobox_create(NULL, FALSE);
301         gtk_widget_show (folder_type);
302
303         type = F_NORMAL;
304         if (item->stype == F_INBOX)
305                 type = F_INBOX;
306         else if (folder_has_parent_of_type(item, F_OUTBOX))
307                 type = F_OUTBOX;
308         else if (folder_has_parent_of_type(item, F_DRAFT))
309                 type = F_DRAFT;
310         else if (folder_has_parent_of_type(item, F_QUEUE))
311                 type = F_QUEUE;
312         else if (folder_has_parent_of_type(item, F_TRASH))
313                 type = F_TRASH;
314
315         folder_type_menu = GTK_LIST_STORE(gtk_combo_box_get_model(
316                                 GTK_COMBO_BOX(folder_type)));
317
318         COMBOBOX_ADD (folder_type_menu, _("Normal"),  F_NORMAL);
319         COMBOBOX_ADD (folder_type_menu, _("Inbox"),  F_INBOX);
320         COMBOBOX_ADD (folder_type_menu, _("Outbox"),  F_OUTBOX);
321         COMBOBOX_ADD (folder_type_menu, _("Drafts"),  F_DRAFT);
322         COMBOBOX_ADD (folder_type_menu, _("Queue"),  F_QUEUE);
323         COMBOBOX_ADD (folder_type_menu, _("Trash"),  F_TRASH);
324
325         combobox_select_by_data(GTK_COMBO_BOX(folder_type), type);
326
327         dummy_checkbtn = gtk_check_button_new();
328         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dummy_checkbtn), type != F_INBOX);
329         gtk_widget_set_sensitive(dummy_checkbtn, FALSE);
330
331         if (type == item->stype && type == F_NORMAL)
332                 gtk_widget_set_sensitive(folder_type, TRUE);
333         else
334                 gtk_widget_set_sensitive(folder_type, FALSE);
335
336         label = gtk_label_new(_("Folder type"));
337         gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
338         gtk_table_attach(GTK_TABLE(table), label, 0, 1, 
339                          rowcount, rowcount + 1, GTK_SHRINK | GTK_FILL, GTK_FILL, 0, 0);
340         gtk_table_attach(GTK_TABLE(table), folder_type, 1, 2, 
341                          rowcount, rowcount + 1, GTK_SHRINK | GTK_FILL, GTK_FILL, 0, 0);
342         gtk_table_attach(GTK_TABLE(table), dummy_checkbtn, 2, 3, 
343                          rowcount, rowcount + 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
344
345         rowcount++;
346
347         /* Simplify Subject */
348         checkbtn_simplify_subject = gtk_check_button_new_with_label(_("Simplify Subject RegExp"));
349         gtk_table_attach(GTK_TABLE(table), checkbtn_simplify_subject, 0, 1, 
350                          rowcount, rowcount + 1, GTK_SHRINK | GTK_FILL, GTK_FILL, 0, 0);
351         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_simplify_subject), 
352                                      item->prefs->enable_simplify_subject);
353
354         g_signal_connect(G_OBJECT(checkbtn_simplify_subject), "toggled",
355                         G_CALLBACK(folder_regexp_set_subject_example_cb), page);
356
357         entry_simplify_subject = gtk_entry_new();
358         gtk_table_attach(GTK_TABLE(table), entry_simplify_subject, 1, 2, 
359                          rowcount, rowcount + 1, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
360         SET_TOGGLE_SENSITIVITY(checkbtn_simplify_subject, entry_simplify_subject);
361         gtk_entry_set_text(GTK_ENTRY(entry_simplify_subject), 
362                            SAFE_STRING(item->prefs->simplify_subject_regexp));
363
364         g_signal_connect(G_OBJECT(entry_simplify_subject), "changed",
365                         G_CALLBACK(folder_regexp_test_cb), page);
366
367         simplify_subject_rec_checkbtn = gtk_check_button_new();
368         gtk_table_attach(GTK_TABLE(table), simplify_subject_rec_checkbtn, 2, 3, 
369                          rowcount, rowcount + 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
370
371         rowcount++;
372
373         /* Test string */
374         label_regexp_test = gtk_label_new(_("Test string"));
375         gtk_misc_set_alignment(GTK_MISC(label_regexp_test), 1, 0.5);
376         gtk_table_attach(GTK_TABLE(table), label_regexp_test, 0, 1, 
377                          rowcount, rowcount + 1, GTK_SHRINK | GTK_FILL, GTK_FILL, 0, 0);
378         SET_TOGGLE_SENSITIVITY(checkbtn_simplify_subject, label_regexp_test);
379
380         entry_regexp_test_string = gtk_entry_new();
381         gtk_table_attach(GTK_TABLE(table), entry_regexp_test_string, 1, 2, 
382                          rowcount, rowcount + 1, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
383         SET_TOGGLE_SENSITIVITY(checkbtn_simplify_subject, entry_regexp_test_string);
384
385         g_signal_connect(G_OBJECT(entry_regexp_test_string), "changed",
386                         G_CALLBACK(folder_regexp_test_cb), page);
387
388         rowcount++;
389         
390         /* Test result */
391         label_regexp_result = gtk_label_new(_("Result"));
392         gtk_misc_set_alignment(GTK_MISC(label_regexp_result), 1, 0.5);
393         gtk_table_attach(GTK_TABLE(table), label_regexp_result, 0, 1, 
394                          rowcount, rowcount + 1, GTK_SHRINK | GTK_FILL, GTK_FILL, 0, 0);
395         SET_TOGGLE_SENSITIVITY(checkbtn_simplify_subject, label_regexp_result);
396
397         entry_regexp_test_result = gtk_entry_new();
398         gtk_table_attach(GTK_TABLE(table), entry_regexp_test_result, 1, 2, 
399                          rowcount, rowcount + 1, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
400         SET_TOGGLE_SENSITIVITY(checkbtn_simplify_subject, entry_regexp_test_result);
401         gtk_editable_set_editable(GTK_EDITABLE(entry_regexp_test_result), FALSE);
402
403         rowcount++;
404
405         /* Folder chmod */
406         checkbtn_folder_chmod = gtk_check_button_new_with_label(_("Folder chmod"));
407         gtk_table_attach(GTK_TABLE(table), checkbtn_folder_chmod, 0, 1, 
408                          rowcount, rowcount + 1, GTK_SHRINK | GTK_FILL, GTK_FILL, 0, 0);
409
410         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_folder_chmod), 
411                                      item->prefs->enable_folder_chmod);
412
413         entry_folder_chmod = gtk_entry_new();
414         gtk_table_attach(GTK_TABLE(table), entry_folder_chmod, 1, 2, 
415                          rowcount, rowcount + 1, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
416         SET_TOGGLE_SENSITIVITY(checkbtn_folder_chmod, entry_folder_chmod);
417         if (item->prefs->folder_chmod) {
418                 gchar *buf;
419
420                 buf = g_strdup_printf("%o", item->prefs->folder_chmod);
421                 gtk_entry_set_text(GTK_ENTRY(entry_folder_chmod), buf);
422                 g_free(buf);
423         }
424         
425         folder_chmod_rec_checkbtn = gtk_check_button_new();
426         gtk_table_attach(GTK_TABLE(table), folder_chmod_rec_checkbtn, 2, 3, 
427                          rowcount, rowcount + 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
428
429         rowcount++;
430         
431         /* Folder color */
432         folder_color = gtk_label_new(_("Folder color"));
433         gtk_misc_set_alignment(GTK_MISC(folder_color), 0, 0.5);
434         gtk_table_attach(GTK_TABLE(table), folder_color, 0, 1, 
435                          rowcount, rowcount + 1, GTK_SHRINK | GTK_FILL, GTK_FILL, 0, 0);
436
437         hbox = gtk_hbox_new(FALSE, 0);
438         gtk_table_attach(GTK_TABLE(table), hbox, 1, 2, 
439                          rowcount, rowcount + 1, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
440
441         folder_color_btn = GTKUT_COLOR_BUTTON();
442         gtk_box_pack_start (GTK_BOX(hbox), folder_color_btn, FALSE, FALSE, 0);
443         CLAWS_SET_TIP(folder_color_btn,
444                              _("Pick color for folder"));
445
446         page->folder_color = item->prefs->color;
447
448         g_signal_connect(G_OBJECT(folder_color_btn), "clicked",
449                          G_CALLBACK(folder_color_set_dialog),
450                          page);
451
452         gtkut_set_widget_bgcolor_rgb(folder_color_btn, item->prefs->color);
453
454         folder_color_rec_checkbtn = gtk_check_button_new();
455         gtk_table_attach(GTK_TABLE(table), folder_color_rec_checkbtn, 2, 3, 
456                          rowcount, rowcount + 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
457
458         rowcount++;
459
460         /* Enable processing at startup */
461         checkbtn_enable_processing =
462                 gtk_check_button_new_with_label(_("Run Processing rules at start-up"));
463         gtk_table_attach(GTK_TABLE(table), checkbtn_enable_processing, 0, 2, 
464                          rowcount, rowcount + 1, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
465
466         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_enable_processing), 
467                                      item->prefs->enable_processing);
468
469         enable_processing_rec_checkbtn = gtk_check_button_new();
470         gtk_table_attach(GTK_TABLE(table), enable_processing_rec_checkbtn, 2, 3, 
471                          rowcount, rowcount + 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
472         
473         rowcount++;
474
475         /* Enable processing rules when opening folder */
476         checkbtn_enable_processing_when_opening =
477                 gtk_check_button_new_with_label(_("Run Processing rules when opening"));
478         gtk_table_attach(GTK_TABLE(table), checkbtn_enable_processing_when_opening, 0, 2, 
479                          rowcount, rowcount + 1, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
480
481         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_enable_processing_when_opening), 
482                                      item->prefs->enable_processing_when_opening);
483
484         enable_processing_when_opening_rec_checkbtn = gtk_check_button_new();
485         gtk_table_attach(GTK_TABLE(table), enable_processing_when_opening_rec_checkbtn, 2, 3, 
486                          rowcount, rowcount + 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
487         
488         rowcount++;
489
490         /* Check folder for new mail */
491         checkbtn_newmailcheck = gtk_check_button_new_with_label(_("Scan for new mail"));
492         CLAWS_SET_TIP(checkbtn_newmailcheck,
493                              _("Turn this option on if mail is delivered directly "
494                                "to this folder by server side filtering on IMAP or "
495                                "by an external application"));
496         gtk_table_attach(GTK_TABLE(table), checkbtn_newmailcheck, 0, 2,
497                          rowcount, rowcount+1, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
498         
499         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_newmailcheck),
500                                                                  item->prefs->newmailcheck);
501         newmailcheck_rec_checkbtn = gtk_check_button_new();
502         gtk_table_attach(GTK_TABLE(table), newmailcheck_rec_checkbtn, 2, 3, 
503                          rowcount, rowcount + 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
504
505         rowcount++;
506
507         /* Select HTML part by default? */
508         hbox = gtk_hbox_new (FALSE, 2);
509         gtk_widget_show (hbox);
510         gtk_table_attach (GTK_TABLE(table), hbox, 0, 2,
511                         rowcount, rowcount+1, GTK_FILL, GTK_FILL, 0, 0);
512
513         label = gtk_label_new(_("Select the HTML part of multipart messages"));
514         gtk_widget_show (label);
515         gtk_box_pack_start (GTK_BOX(hbox), label, FALSE, FALSE, 0);
516
517         promote_html_part = gtkut_sc_combobox_create (NULL, FALSE);
518         gtk_widget_show (promote_html_part);
519         gtk_box_pack_start (GTK_BOX(hbox), promote_html_part, FALSE, FALSE, 0);
520
521         promote_html_part_menu = GTK_LIST_STORE(gtk_combo_box_get_model(
522                                 GTK_COMBO_BOX(promote_html_part)));
523         COMBOBOX_ADD (promote_html_part_menu, _("Default"), HTML_PROMOTE_DEFAULT);
524         COMBOBOX_ADD (promote_html_part_menu, _("No"), HTML_PROMOTE_NEVER);
525         COMBOBOX_ADD (promote_html_part_menu, _("Yes"), HTML_PROMOTE_ALWAYS);
526
527         combobox_select_by_data(GTK_COMBO_BOX(promote_html_part),
528                         item->prefs->promote_html_part);
529
530         CLAWS_SET_TIP(hbox, _("\"Default\" will follow global preference (found in /Preferences/"
531                               "Message View/Text Options)"));
532
533         promote_html_part_rec_checkbtn = gtk_check_button_new();
534         gtk_widget_show (promote_html_part_rec_checkbtn);
535         gtk_table_attach(GTK_TABLE(table), promote_html_part_rec_checkbtn, 2, 3, 
536                          rowcount, rowcount + 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
537         rowcount++;
538
539         /* Synchronise folder for offline use */
540         checkbtn_offlinesync = gtk_check_button_new_with_label(_("Synchronise for offline use"));
541         gtk_table_attach(GTK_TABLE(table), checkbtn_offlinesync, 0, 2,
542                          rowcount, rowcount+1, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
543         
544         offlinesync_rec_checkbtn = gtk_check_button_new();
545         gtk_table_attach(GTK_TABLE(table), offlinesync_rec_checkbtn, 2, 3, 
546                          rowcount, rowcount + 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
547
548         rowcount++;
549
550         hbox = gtk_hbox_new (FALSE, 8);
551         gtk_widget_show (hbox);
552         gtk_table_attach(GTK_TABLE(table), hbox, 0, 3,
553                          rowcount, rowcount+1, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
554         rowcount++;
555
556         hbox_spc = gtk_hbox_new (FALSE, 0);
557         gtk_widget_show (hbox_spc);
558         gtk_box_pack_start (GTK_BOX (hbox), hbox_spc, FALSE, FALSE, 0);
559         gtk_widget_set_size_request (hbox_spc, 12, -1);
560
561         label_offlinesync = gtk_label_new(_("Fetch message bodies from the last"));
562         gtk_widget_show (label_offlinesync);
563         gtk_box_pack_start (GTK_BOX (hbox), label_offlinesync, FALSE, FALSE, 0);
564
565         entry_offlinesync = gtk_entry_new();
566         gtk_widget_set_size_request (entry_offlinesync, 64, -1);
567         gtk_widget_show (entry_offlinesync);
568         CLAWS_SET_TIP(entry_offlinesync, _("0: all bodies"));
569         gtk_box_pack_start (GTK_BOX (hbox), entry_offlinesync, FALSE, FALSE, 0);
570
571         label_end_offlinesync = gtk_label_new(_("days"));
572         gtk_widget_show (label_end_offlinesync);
573         gtk_box_pack_start (GTK_BOX (hbox), label_end_offlinesync, FALSE, FALSE, 0);
574
575         checkbtn_remove_old_offlinesync = gtk_check_button_new_with_label(
576                                                 _("Remove older messages bodies"));
577
578         hbox2 = gtk_hbox_new (FALSE, 8);
579         gtk_widget_show (hbox2);
580         gtk_table_attach(GTK_TABLE(table), hbox2, 0, 3,
581                          rowcount, rowcount+1, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
582         rowcount++;
583
584         hbox_spc = gtk_hbox_new (FALSE, 0);
585         gtk_widget_show (hbox_spc);
586         gtk_box_pack_start (GTK_BOX (hbox2), hbox_spc, FALSE, FALSE, 0);
587         gtk_widget_set_size_request (hbox_spc, 12, -1);
588         gtk_box_pack_start (GTK_BOX (hbox2), checkbtn_remove_old_offlinesync, FALSE, FALSE, 0);
589
590         SET_TOGGLE_SENSITIVITY (checkbtn_offlinesync, hbox);
591         SET_TOGGLE_SENSITIVITY (checkbtn_offlinesync, hbox2);
592         
593         clean_cache_btn = gtk_button_new_with_label(_("Discard folder cache"));
594         gtk_widget_show (clean_cache_btn);
595         gtk_table_attach(GTK_TABLE(table), clean_cache_btn, 0, 1,
596                          rowcount, rowcount+1, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
597         g_signal_connect(G_OBJECT(clean_cache_btn), "clicked",
598                          G_CALLBACK(clean_cache_cb),
599                          page);
600
601         gtk_widget_show_all(table);
602
603         if (item->folder && (item->folder->klass->type != F_IMAP && 
604             item->folder->klass->type != F_NEWS)) {
605                 item->prefs->offlinesync = TRUE;
606                 item->prefs->offlinesync_days = 0;
607                 item->prefs->remove_old_bodies = FALSE;
608
609                 gtk_widget_set_sensitive(GTK_WIDGET(checkbtn_offlinesync),
610                                                                  FALSE);
611                 gtk_widget_set_sensitive(GTK_WIDGET(offlinesync_rec_checkbtn),
612                                                                  FALSE);
613                 gtk_widget_hide(GTK_WIDGET(checkbtn_offlinesync));
614                 gtk_widget_hide(GTK_WIDGET(hbox));
615                 gtk_widget_hide(GTK_WIDGET(hbox2));
616                 gtk_widget_hide(GTK_WIDGET(offlinesync_rec_checkbtn));
617                 gtk_widget_hide(GTK_WIDGET(clean_cache_btn));
618         
619         }
620         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_offlinesync),
621                                                                  item->prefs->offlinesync);
622         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_remove_old_offlinesync),
623                                                                  item->prefs->remove_old_bodies);
624         gtk_entry_set_text(GTK_ENTRY(entry_offlinesync), itos(item->prefs->offlinesync_days));
625
626         page->table = table;
627         page->folder_type = folder_type;
628         page->no_save_warning = no_save_warning;
629
630         page->checkbtn_simplify_subject = checkbtn_simplify_subject;
631         page->entry_simplify_subject = entry_simplify_subject;
632         page->entry_regexp_test_string = entry_regexp_test_string;
633         page->entry_regexp_test_result = entry_regexp_test_result;
634
635         page->checkbtn_folder_chmod = checkbtn_folder_chmod;
636         page->entry_folder_chmod = entry_folder_chmod;
637         page->folder_color_btn = folder_color_btn;
638         page->checkbtn_enable_processing = checkbtn_enable_processing;
639         page->checkbtn_enable_processing_when_opening = checkbtn_enable_processing_when_opening;
640         page->checkbtn_newmailcheck = checkbtn_newmailcheck;
641         page->checkbtn_offlinesync = checkbtn_offlinesync;
642         page->label_offlinesync = label_offlinesync;
643         page->entry_offlinesync = entry_offlinesync;
644         page->label_end_offlinesync = label_end_offlinesync;
645         page->checkbtn_remove_old_offlinesync = checkbtn_remove_old_offlinesync;
646         page->promote_html_part = promote_html_part;
647
648
649         page->simplify_subject_rec_checkbtn  = simplify_subject_rec_checkbtn;
650
651         page->folder_chmod_rec_checkbtn      = folder_chmod_rec_checkbtn;
652         page->folder_color_rec_checkbtn      = folder_color_rec_checkbtn;
653         page->enable_processing_rec_checkbtn = enable_processing_rec_checkbtn;
654         page->enable_processing_when_opening_rec_checkbtn = enable_processing_when_opening_rec_checkbtn;
655         page->newmailcheck_rec_checkbtn      = newmailcheck_rec_checkbtn;
656         page->offlinesync_rec_checkbtn       = offlinesync_rec_checkbtn;
657         page->promote_html_part_rec_checkbtn = promote_html_part_rec_checkbtn;
658
659         page->page.widget = table;
660
661         folder_regexp_set_subject_example_cb(NULL, page);
662 }
663
664 static void prefs_folder_item_general_destroy_widget_func(PrefsPage *page_) 
665 {
666         /* FolderItemGeneralPage *page = (FolderItemGeneralPage *) page_; */
667 }
668
669 /** \brief  Save the prefs in page to folder.
670  *
671  *  If the folder is not the one specified in page->item, then only those properties 
672  *  that have the relevant 'apply to sub folders' button checked are saved
673  */
674 static void general_save_folder_prefs(FolderItem *folder, FolderItemGeneralPage *page)
675 {
676         FolderItemPrefs *prefs = folder->prefs;
677         gchar *buf;
678         gboolean all = FALSE, summary_update_needed = FALSE;
679         SpecialFolderItemType type = F_NORMAL;
680         FolderView *folderview = mainwindow_get_mainwindow()->folderview;
681         HTMLPromoteType promote_html_part = HTML_PROMOTE_DEFAULT;
682
683         if (folder->path == NULL)
684                 return;
685
686         cm_return_if_fail(prefs != NULL);
687
688         if (page->item == folder) 
689                 all = TRUE;
690
691         type = combobox_get_active_data(GTK_COMBO_BOX(page->folder_type));
692         if (all && folder->stype != type && page->item->parent_stype == F_NORMAL) {
693                 folder_item_change_type(folder, type);
694                 summary_update_needed = TRUE;
695         }
696
697         promote_html_part =
698                 combobox_get_active_data(GTK_COMBO_BOX(page->promote_html_part));
699         if (all || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->promote_html_part_rec_checkbtn)))
700                 prefs->promote_html_part = promote_html_part;
701
702         if (all || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->simplify_subject_rec_checkbtn))) {
703                 gboolean old_simplify_subject = prefs->enable_simplify_subject;
704                 int regexp_diffs = strcmp2(prefs->simplify_subject_regexp, gtk_editable_get_chars(
705                                         GTK_EDITABLE(page->entry_simplify_subject), 0, -1));
706                 prefs->enable_simplify_subject =
707                         gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_simplify_subject));
708                 ASSIGN_STRING(prefs->simplify_subject_regexp,
709                               gtk_editable_get_chars(GTK_EDITABLE(page->entry_simplify_subject), 0, -1));
710                 if (old_simplify_subject != prefs->enable_simplify_subject || regexp_diffs != 0)
711                         summary_update_needed = TRUE;
712         }
713
714         if (all || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->folder_chmod_rec_checkbtn))) {
715                 prefs->enable_folder_chmod = 
716                         gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_folder_chmod));
717                 buf = gtk_editable_get_chars(GTK_EDITABLE(page->entry_folder_chmod), 0, -1);
718                 prefs->folder_chmod = prefs_folder_item_chmod_mode(buf);
719                 g_free(buf);
720         }
721
722         if (all || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->folder_color_rec_checkbtn))) {
723                 int old_color = prefs->color;
724                 prefs->color = page->folder_color;
725         
726                 /* update folder view */
727                 if (prefs->color != old_color)
728                         folder_item_update(folder, F_ITEM_UPDATE_MSGCNT);
729         }
730
731         if (all || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->enable_processing_rec_checkbtn))) {
732                 prefs->enable_processing = 
733                         gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_enable_processing));
734         }
735
736         if (all || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->enable_processing_when_opening_rec_checkbtn))) {
737                 prefs->enable_processing_when_opening = 
738                         gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_enable_processing_when_opening));
739         }
740
741         if (all ||  gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->newmailcheck_rec_checkbtn))) {
742                 prefs->newmailcheck = 
743                         gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_newmailcheck));
744         }
745
746         if (all ||  gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->offlinesync_rec_checkbtn))) {
747                 prefs->offlinesync = 
748                         gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_offlinesync));
749                 prefs->offlinesync_days = 
750                         atoi(gtk_entry_get_text(GTK_ENTRY(page->entry_offlinesync)));
751                 prefs->remove_old_bodies =
752                         gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_remove_old_offlinesync));
753         }
754
755         folder_item_prefs_save_config(folder);
756
757         if (folder->opened && summary_update_needed) {
758                 summary_set_prefs_from_folderitem(folderview->summaryview, folder);
759                 summary_show(folderview->summaryview, folder);
760         }       
761 }       
762
763 static gboolean general_save_recurse_func(GNode *node, gpointer data)
764 {
765         FolderItem *item = (FolderItem *) node->data;
766         FolderItemGeneralPage *page = (FolderItemGeneralPage *) data;
767
768         cm_return_val_if_fail(item != NULL, TRUE);
769         cm_return_val_if_fail(page != NULL, TRUE);
770
771         general_save_folder_prefs(item, page);
772
773         /* optimise by not continuing if none of the 'apply to sub folders'
774            check boxes are selected - and optimise the checking by only doing
775            it once */
776         if ((node == page->item->node) &&
777             !(
778               gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->simplify_subject_rec_checkbtn)) ||
779               gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->folder_chmod_rec_checkbtn)) ||
780               gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->folder_color_rec_checkbtn)) ||
781               gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->enable_processing_rec_checkbtn)) ||
782               gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->enable_processing_when_opening_rec_checkbtn)) ||
783               gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->newmailcheck_rec_checkbtn)) ||
784               gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->offlinesync_rec_checkbtn)) ||
785                                 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->promote_html_part_rec_checkbtn))
786                         ))
787                 return TRUE;
788         else 
789                 return FALSE;
790 }
791
792 static void prefs_folder_item_general_save_func(PrefsPage *page_) 
793 {
794         FolderItemGeneralPage *page = (FolderItemGeneralPage *) page_;
795
796         g_node_traverse(page->item->node, G_PRE_ORDER, G_TRAVERSE_ALL,
797                         -1, general_save_recurse_func, page);
798         
799         main_window_set_menu_sensitive(mainwindow_get_mainwindow());
800
801 }
802
803 static RecvProtocol item_protocol(FolderItem *item)
804 {
805         if (!item)
806                 return A_NONE;
807         if (!item->folder)
808                 return A_NONE;
809         if (!item->folder->account)
810                 return A_NONE;
811         return item->folder->account->protocol;
812 }
813
814 static void prefs_folder_item_compose_create_widget_func(PrefsPage * page_,
815                                                    GtkWindow * window,
816                                                    gpointer data)
817 {
818         FolderItemComposePage *page = (FolderItemComposePage *) page_;
819         FolderItem *item = (FolderItem *) data;
820         guint rowcount;
821         gchar *text = NULL;
822         gchar *tr = NULL;
823
824         GtkWidget *table;
825         GtkWidget *hbox;
826         GtkWidget *label;
827         
828         GtkWidget *no_save_warning = NULL;
829         GtkWidget *checkbtn_request_return_receipt = NULL;
830         GtkWidget *checkbtn_save_copy_to_folder = NULL;
831         GtkWidget *checkbtn_default_to = NULL;
832         GtkWidget *entry_default_to = NULL;
833         GtkWidget *checkbtn_default_reply_to = NULL;
834         GtkWidget *entry_default_reply_to = NULL;
835         GtkWidget *checkbtn_default_cc = NULL;
836         GtkWidget *entry_default_cc = NULL;
837         GtkWidget *checkbtn_default_bcc = NULL;
838         GtkWidget *entry_default_bcc = NULL;
839         GtkWidget *checkbtn_default_replyto = NULL;
840         GtkWidget *entry_default_replyto = NULL;
841         GtkWidget *checkbtn_enable_default_account = NULL;
842         GtkWidget *optmenu_default_account = NULL;
843         GtkListStore *optmenu_default_account_menu = NULL;
844         GtkTreeIter iter;
845 #if USE_ENCHANT
846         GtkWidget *checkbtn_enable_default_dictionary = NULL;
847         GtkWidget *combo_default_dictionary = NULL;
848         GtkWidget *checkbtn_enable_default_alt_dictionary = NULL;
849         GtkWidget *combo_default_alt_dictionary = NULL;
850         GtkWidget *default_dictionary_rec_checkbtn = NULL;
851         GtkWidget *default_alt_dictionary_rec_checkbtn = NULL;
852         gchar *dictionary;
853 #endif
854         GtkWidget *always_sign;
855         GtkListStore *always_sign_menu;
856         GtkWidget *always_encrypt;
857         GtkListStore *always_encrypt_menu;
858         GtkWidget *request_return_receipt_rec_checkbtn = NULL;
859         GtkWidget *save_copy_to_folder_rec_checkbtn = NULL;
860         GtkWidget *default_to_rec_checkbtn = NULL;
861         GtkWidget *default_reply_to_rec_checkbtn = NULL;
862         GtkWidget *default_cc_rec_checkbtn = NULL;
863         GtkWidget *default_bcc_rec_checkbtn = NULL;
864         GtkWidget *default_replyto_rec_checkbtn = NULL;
865         GtkWidget *default_account_rec_checkbtn = NULL;
866         GtkWidget *always_sign_rec_checkbtn = NULL;
867         GtkWidget *always_encrypt_rec_checkbtn = NULL;
868
869         GList *cur_ac;
870         GList *account_list;
871         PrefsAccount *ac_prefs;
872         gboolean default_account_set = FALSE;
873
874         page->item         = item;
875
876         /* Table */
877 #if USE_ENCHANT
878 # define TABLEHEIGHT 7
879 #else
880 # define TABLEHEIGHT 6
881 #endif
882         table = gtk_table_new(TABLEHEIGHT, 3, FALSE);
883         gtk_container_set_border_width (GTK_CONTAINER (table), VBOX_BORDER);
884         gtk_table_set_row_spacings(GTK_TABLE(table), 4);
885         gtk_table_set_col_spacings(GTK_TABLE(table), 4);
886         rowcount = 0;
887
888         if (!can_save) {
889                 no_save_warning = prefs_folder_no_save_warning_create_widget();
890                 gtk_table_attach(GTK_TABLE(table), no_save_warning, 0, 3,
891                          rowcount, rowcount + 1, GTK_FILL, 0, 0, 0);
892                 rowcount++;
893         }
894         
895         /* Apply to subfolders */
896         label = gtk_label_new(_("Apply to\nsubfolders"));
897         gtk_misc_set_alignment(GTK_MISC(label), 0.5, 0.5);
898         gtk_table_attach(GTK_TABLE(table), label, 2, 3,
899                          rowcount, rowcount + 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
900         rowcount++;
901
902         if (item_protocol(item) != A_NNTP) {
903                 /* Request Return Receipt */
904                 checkbtn_request_return_receipt = gtk_check_button_new_with_label
905                         (_("Request Return Receipt"));
906                 gtk_table_attach(GTK_TABLE(table), checkbtn_request_return_receipt, 
907                                  0, 2, rowcount, rowcount + 1, GTK_SHRINK | GTK_FILL, 
908                                  GTK_FILL, 0, 0);
909                 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_request_return_receipt),
910                                              item->ret_rcpt ? TRUE : FALSE);
911
912                 request_return_receipt_rec_checkbtn = gtk_check_button_new();
913                 gtk_table_attach(GTK_TABLE(table), request_return_receipt_rec_checkbtn, 2, 3, 
914                                  rowcount, rowcount + 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
915
916                 rowcount++;
917
918                 /* Save Copy to Folder */
919                 checkbtn_save_copy_to_folder = gtk_check_button_new_with_label
920                         (_("Save copy of outgoing messages to this folder instead of Sent"));
921                 gtk_table_attach(GTK_TABLE(table), checkbtn_save_copy_to_folder, 0, 2, 
922                                  rowcount, rowcount + 1, GTK_SHRINK | GTK_FILL, GTK_FILL, 0, 0);
923                 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_save_copy_to_folder),
924                                              item->prefs->save_copy_to_folder ? TRUE : FALSE);
925
926                 save_copy_to_folder_rec_checkbtn = gtk_check_button_new();
927                 gtk_table_attach(GTK_TABLE(table), save_copy_to_folder_rec_checkbtn, 2, 3, 
928                                  rowcount, rowcount + 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
929
930                 rowcount++;
931
932                 /* Default To */
933                 tr = g_strdup(C_("folder properties: %s stands for a header name",
934                                           "Default %s"));
935                 text = g_strdup_printf(tr, prefs_common_translated_header_name("To:"));
936                 checkbtn_default_to = gtk_check_button_new_with_label(text);
937                 gtk_table_attach(GTK_TABLE(table), checkbtn_default_to, 0, 1, 
938                                  rowcount, rowcount + 1, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 0, 0);
939                 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_default_to), 
940                                              item->prefs->enable_default_to);
941                 g_free(text);
942                 g_free(tr);
943
944                 entry_default_to = gtk_entry_new();
945                 gtk_table_attach(GTK_TABLE(table), entry_default_to, 1, 2,
946                                  rowcount, rowcount + 1, GTK_EXPAND | GTK_FILL, GTK_SHRINK, 0, 0);
947                 SET_TOGGLE_SENSITIVITY(checkbtn_default_to, entry_default_to);
948                 gtk_entry_set_text(GTK_ENTRY(entry_default_to), SAFE_STRING(item->prefs->default_to));
949                 address_completion_register_entry(GTK_ENTRY(entry_default_to),
950                                 TRUE);
951
952                 default_to_rec_checkbtn = gtk_check_button_new();
953                 gtk_table_attach(GTK_TABLE(table), default_to_rec_checkbtn, 2, 3, 
954                                  rowcount, rowcount + 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
955
956                 rowcount++;
957
958                 /* Default address to reply to */
959                 tr = g_strdup(C_("folder properties: %s stands for a header name",
960                                           "Default %s for replies"));
961                 text = g_strdup_printf(tr, prefs_common_translated_header_name("To:"));
962                 checkbtn_default_reply_to = gtk_check_button_new_with_label(text);
963                 gtk_table_attach(GTK_TABLE(table), checkbtn_default_reply_to, 0, 1, 
964                                  rowcount, rowcount + 1, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 0, 0);
965                 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_default_reply_to), 
966                                              item->prefs->enable_default_reply_to);
967                 g_free(text);
968                 g_free(tr);
969
970                 entry_default_reply_to = gtk_entry_new();
971                 gtk_table_attach(GTK_TABLE(table), entry_default_reply_to, 1, 2,
972                                  rowcount, rowcount + 1, GTK_EXPAND | GTK_FILL, GTK_SHRINK, 0, 0);
973                 SET_TOGGLE_SENSITIVITY(checkbtn_default_reply_to, entry_default_reply_to);
974                 gtk_entry_set_text(GTK_ENTRY(entry_default_reply_to), SAFE_STRING(item->prefs->default_reply_to));
975                 address_completion_register_entry(
976                                 GTK_ENTRY(entry_default_reply_to), TRUE);
977
978                 default_reply_to_rec_checkbtn = gtk_check_button_new();
979                 gtk_table_attach(GTK_TABLE(table), default_reply_to_rec_checkbtn, 2, 3, 
980                                  rowcount, rowcount + 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
981
982                 rowcount++;
983
984                 /* Default Cc */
985                 tr = g_strdup(C_("folder properties: %s stands for a header name",
986                                           "Default %s"));
987                 text = g_strdup_printf(tr, prefs_common_translated_header_name("Cc:"));
988                 checkbtn_default_cc = gtk_check_button_new_with_label(text);
989                 gtk_table_attach(GTK_TABLE(table), checkbtn_default_cc, 0, 1, 
990                                  rowcount, rowcount + 1, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 0, 0);
991                 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_default_cc), 
992                                              item->prefs->enable_default_cc);
993                 g_free(text);
994                 g_free(tr);
995
996                 entry_default_cc = gtk_entry_new();
997                 gtk_table_attach(GTK_TABLE(table), entry_default_cc, 1, 2,
998                                  rowcount, rowcount + 1, GTK_EXPAND | GTK_FILL, GTK_SHRINK, 0, 0);
999                 SET_TOGGLE_SENSITIVITY(checkbtn_default_cc, entry_default_cc);
1000                 gtk_entry_set_text(GTK_ENTRY(entry_default_cc), SAFE_STRING(item->prefs->default_cc));
1001                 address_completion_register_entry(GTK_ENTRY(entry_default_cc),
1002                                 TRUE);
1003
1004                 default_cc_rec_checkbtn = gtk_check_button_new();
1005                 gtk_table_attach(GTK_TABLE(table), default_cc_rec_checkbtn, 2, 3, 
1006                                  rowcount, rowcount + 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
1007
1008                 rowcount++;
1009
1010                 /* Default Bcc */
1011                 tr = g_strdup(C_("folder properties: %s stands for a header name",
1012                                           "Default %s"));
1013                 text = g_strdup_printf(tr, prefs_common_translated_header_name("Bcc:"));
1014                 checkbtn_default_bcc = gtk_check_button_new_with_label(text);
1015                 gtk_table_attach(GTK_TABLE(table), checkbtn_default_bcc, 0, 1, 
1016                                  rowcount, rowcount + 1, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 0, 0);
1017                 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_default_bcc), 
1018                                              item->prefs->enable_default_bcc);
1019                 g_free(text);
1020                 g_free(tr);
1021
1022                 entry_default_bcc = gtk_entry_new();
1023                 gtk_table_attach(GTK_TABLE(table), entry_default_bcc, 1, 2,
1024                                  rowcount, rowcount + 1, GTK_EXPAND | GTK_FILL, GTK_SHRINK, 0, 0);
1025                 SET_TOGGLE_SENSITIVITY(checkbtn_default_bcc, entry_default_bcc);
1026                 gtk_entry_set_text(GTK_ENTRY(entry_default_bcc), SAFE_STRING(item->prefs->default_bcc));
1027                 address_completion_register_entry(GTK_ENTRY(entry_default_bcc),
1028                                 TRUE);
1029
1030                 default_bcc_rec_checkbtn = gtk_check_button_new();
1031                 gtk_table_attach(GTK_TABLE(table), default_bcc_rec_checkbtn, 2, 3, 
1032                                  rowcount, rowcount + 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
1033
1034                 rowcount++;
1035
1036                 /* Default Reply-to */
1037                 tr = g_strdup(C_("folder properties: %s stands for a header name",
1038                                           "Default %s"));
1039                 text = g_strdup_printf(tr, prefs_common_translated_header_name("Reply-To:"));
1040                 checkbtn_default_replyto = gtk_check_button_new_with_label(text);
1041                 gtk_table_attach(GTK_TABLE(table), checkbtn_default_replyto, 0, 1, 
1042                                  rowcount, rowcount + 1, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 0, 0);
1043                 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_default_replyto), 
1044                                              item->prefs->enable_default_replyto);
1045                 g_free(text);
1046                 g_free(tr);
1047
1048                 entry_default_replyto = gtk_entry_new();
1049                 gtk_table_attach(GTK_TABLE(table), entry_default_replyto, 1, 2,
1050                                  rowcount, rowcount + 1, GTK_EXPAND | GTK_FILL, GTK_SHRINK, 0, 0);
1051                 SET_TOGGLE_SENSITIVITY(checkbtn_default_replyto, entry_default_replyto);
1052                 gtk_entry_set_text(GTK_ENTRY(entry_default_replyto), SAFE_STRING(item->prefs->default_replyto));
1053                 address_completion_register_entry(GTK_ENTRY(entry_default_replyto),
1054                                 TRUE);
1055
1056                 default_replyto_rec_checkbtn = gtk_check_button_new();
1057                 gtk_table_attach(GTK_TABLE(table), default_replyto_rec_checkbtn, 2, 3, 
1058                                  rowcount, rowcount + 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
1059
1060                 rowcount++;
1061         }
1062         /* Default account */
1063         checkbtn_enable_default_account = gtk_check_button_new_with_label(_("Default account"));
1064         gtk_table_attach(GTK_TABLE(table), checkbtn_enable_default_account, 0, 1, 
1065                          rowcount, rowcount + 1, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 0, 0);
1066         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_enable_default_account), 
1067                                      item->prefs->enable_default_account);
1068
1069         optmenu_default_account = gtkut_sc_combobox_create(NULL, FALSE);
1070         gtk_table_attach(GTK_TABLE(table), optmenu_default_account, 1, 2, 
1071                          rowcount, rowcount + 1, GTK_EXPAND | GTK_FILL, GTK_SHRINK, 0, 0);
1072         optmenu_default_account_menu = GTK_LIST_STORE(
1073                         gtk_combo_box_get_model(GTK_COMBO_BOX(optmenu_default_account)));
1074
1075         account_list = account_get_list();
1076         for (cur_ac = account_list; cur_ac != NULL; cur_ac = cur_ac->next) {
1077                 ac_prefs = (PrefsAccount *)cur_ac->data;
1078                 if (item->folder->account &&
1079                     ( (item_protocol(item) == A_NNTP && ac_prefs->protocol != A_NNTP)
1080                     ||(item_protocol(item) != A_NNTP && ac_prefs->protocol == A_NNTP))) 
1081                         continue;
1082
1083                 if (item->folder->klass->type != F_NEWS && ac_prefs->protocol == A_NNTP)
1084                         continue;
1085
1086                 COMBOBOX_ADD_ESCAPED (optmenu_default_account_menu,
1087                                         ac_prefs->account_name?ac_prefs->account_name : _("Untitled"),
1088                                         ac_prefs->account_id);
1089
1090                 /* Set combobox to current default account id */
1091                 if (ac_prefs->account_id == item->prefs->default_account) {
1092                         combobox_select_by_data(GTK_COMBO_BOX(optmenu_default_account),
1093                                         ac_prefs->account_id);
1094                         default_account_set = TRUE;
1095                 }
1096         }
1097
1098         /* If nothing has been set (folder doesn't have a default account set),
1099          * pre-select global default account, since that's what actually used
1100          * anyway. We don't want nothing selected in combobox. */
1101         if( !default_account_set )
1102                 combobox_select_by_data(GTK_COMBO_BOX(optmenu_default_account),
1103                                 account_get_default()->account_id);
1104
1105         SET_TOGGLE_SENSITIVITY(checkbtn_enable_default_account, optmenu_default_account);
1106
1107         default_account_rec_checkbtn = gtk_check_button_new();
1108         gtk_table_attach(GTK_TABLE(table), default_account_rec_checkbtn, 2, 3, 
1109                          rowcount, rowcount + 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
1110         rowcount++;
1111
1112 #if USE_ENCHANT
1113         /* Default dictionary */
1114         checkbtn_enable_default_dictionary = gtk_check_button_new_with_label(_("Default dictionary"));
1115         gtk_table_attach(GTK_TABLE(table), checkbtn_enable_default_dictionary, 0, 1,
1116                          rowcount, rowcount + 1, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 0, 0);
1117         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_enable_default_dictionary),
1118                                      item->prefs->enable_default_dictionary);
1119
1120         combo_default_dictionary = gtkaspell_dictionary_combo_new(TRUE);
1121         gtk_table_attach(GTK_TABLE(table), combo_default_dictionary, 1, 2,
1122                          rowcount, rowcount + 1, GTK_EXPAND | GTK_FILL, GTK_SHRINK, 0, 0);
1123
1124         dictionary = item->prefs->default_dictionary;
1125         if (dictionary && strrchr(dictionary, '/')) {
1126                 gchar *tmp = g_strdup(strrchr(dictionary, '/')+1);
1127                 g_free(item->prefs->default_dictionary);
1128                 item->prefs->default_dictionary = tmp;
1129                 dictionary = item->prefs->default_dictionary;
1130         }
1131         if (item->prefs->default_dictionary &&
1132             strchr(item->prefs->default_dictionary, '-')) {
1133                 *(strchr(item->prefs->default_dictionary, '-')) = '\0';
1134         }
1135         if (dictionary)
1136                 gtkaspell_set_dictionary_menu_active_item(
1137                         GTK_COMBO_BOX(combo_default_dictionary), dictionary);
1138
1139         SET_TOGGLE_SENSITIVITY(checkbtn_enable_default_dictionary, combo_default_dictionary);
1140
1141         default_dictionary_rec_checkbtn = gtk_check_button_new();
1142         gtk_table_attach(GTK_TABLE(table), default_dictionary_rec_checkbtn, 2, 3, 
1143                          rowcount, rowcount + 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
1144         
1145         rowcount++;
1146
1147         /* Default alternate dictionary */
1148         checkbtn_enable_default_alt_dictionary = gtk_check_button_new_with_label(_("Default alternate dictionary"));
1149         gtk_table_attach(GTK_TABLE(table), checkbtn_enable_default_alt_dictionary, 0, 1,
1150                          rowcount, rowcount + 1, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 0, 0);
1151         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_enable_default_alt_dictionary),
1152                                      item->prefs->enable_default_alt_dictionary);
1153
1154         combo_default_alt_dictionary = gtkaspell_dictionary_combo_new(FALSE);
1155         gtk_table_attach(GTK_TABLE(table), combo_default_alt_dictionary, 1, 2,
1156                          rowcount, rowcount + 1, GTK_EXPAND | GTK_FILL, GTK_SHRINK, 0, 0);
1157
1158         dictionary = item->prefs->default_alt_dictionary;
1159         if (dictionary && strrchr(dictionary, '/')) {
1160                 gchar *tmp = g_strdup(strrchr(dictionary, '/')+1);
1161                 g_free(item->prefs->default_alt_dictionary);
1162                 item->prefs->default_alt_dictionary = tmp;
1163                 dictionary = item->prefs->default_alt_dictionary;
1164         }
1165         if (item->prefs->default_alt_dictionary &&
1166             strchr(item->prefs->default_alt_dictionary, '-')) {
1167                 *(strchr(item->prefs->default_alt_dictionary, '-')) = '\0';
1168         }
1169         if (dictionary)
1170                 gtkaspell_set_dictionary_menu_active_item(
1171                         GTK_COMBO_BOX(combo_default_alt_dictionary), dictionary);
1172
1173         SET_TOGGLE_SENSITIVITY(checkbtn_enable_default_alt_dictionary, combo_default_alt_dictionary);
1174
1175         default_alt_dictionary_rec_checkbtn = gtk_check_button_new();
1176         gtk_table_attach(GTK_TABLE(table), default_alt_dictionary_rec_checkbtn, 2, 3, 
1177                          rowcount, rowcount + 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
1178         
1179         rowcount++;
1180 #endif
1181
1182         /* PGP sign? */
1183         hbox = gtk_hbox_new (FALSE, 2);
1184         gtk_widget_show (hbox);
1185         gtk_table_attach (GTK_TABLE(table), hbox, 0, 2,
1186                         rowcount, rowcount+1, GTK_FILL, GTK_FILL, 0, 0);
1187
1188         label = gtk_label_new(_("Always sign messages"));
1189         gtk_widget_show (label);
1190         gtk_box_pack_start (GTK_BOX(hbox), label, FALSE, FALSE, 0);
1191
1192         always_sign = gtkut_sc_combobox_create (NULL, FALSE);
1193         gtk_widget_show (always_sign);
1194         gtk_box_pack_start (GTK_BOX(hbox), always_sign, FALSE, FALSE, 0);
1195
1196         always_sign_menu = GTK_LIST_STORE(gtk_combo_box_get_model(
1197                                 GTK_COMBO_BOX(always_sign)));
1198         COMBOBOX_ADD (always_sign_menu, _("Default"), SIGN_OR_ENCRYPT_DEFAULT);
1199         COMBOBOX_ADD (always_sign_menu, _("No"), SIGN_OR_ENCRYPT_NEVER);
1200         COMBOBOX_ADD (always_sign_menu, _("Yes"), SIGN_OR_ENCRYPT_ALWAYS);
1201
1202         combobox_select_by_data(GTK_COMBO_BOX(always_sign),
1203                         item->prefs->always_sign);
1204
1205         CLAWS_SET_TIP(hbox, _("\"Default\" will follow the applicable account preference"));
1206
1207         always_sign_rec_checkbtn = gtk_check_button_new();
1208         gtk_widget_show (always_sign_rec_checkbtn);
1209         gtk_table_attach(GTK_TABLE(table), always_sign_rec_checkbtn, 2, 3, 
1210                          rowcount, rowcount + 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
1211
1212         rowcount++;
1213
1214         /* PGP encrypt? */
1215         hbox = gtk_hbox_new (FALSE, 2);
1216         gtk_widget_show (hbox);
1217         gtk_table_attach (GTK_TABLE(table), hbox, 0, 2,
1218                         rowcount, rowcount+1, GTK_FILL, GTK_FILL, 0, 0);
1219
1220         label = gtk_label_new(_("Always encrypt messages"));
1221         gtk_widget_show (label);
1222         gtk_box_pack_start (GTK_BOX(hbox), label, FALSE, FALSE, 0);
1223
1224         always_encrypt = gtkut_sc_combobox_create (NULL, FALSE);
1225         gtk_widget_show (always_encrypt);
1226         gtk_box_pack_start (GTK_BOX(hbox), always_encrypt, FALSE, FALSE, 0);
1227
1228         always_encrypt_menu = GTK_LIST_STORE(gtk_combo_box_get_model(
1229                                 GTK_COMBO_BOX(always_encrypt)));
1230         COMBOBOX_ADD (always_encrypt_menu, _("Default"), SIGN_OR_ENCRYPT_DEFAULT);
1231         COMBOBOX_ADD (always_encrypt_menu, _("No"), SIGN_OR_ENCRYPT_NEVER);
1232         COMBOBOX_ADD (always_encrypt_menu, _("Yes"), SIGN_OR_ENCRYPT_ALWAYS);
1233
1234         combobox_select_by_data(GTK_COMBO_BOX(always_encrypt),
1235                         item->prefs->always_encrypt);
1236
1237         CLAWS_SET_TIP(hbox, _("\"Default\" will follow the applicable account preference"));
1238
1239         always_encrypt_rec_checkbtn = gtk_check_button_new();
1240         gtk_widget_show (always_encrypt_rec_checkbtn);
1241         gtk_table_attach(GTK_TABLE(table), always_encrypt_rec_checkbtn, 2, 3, 
1242                          rowcount, rowcount + 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
1243
1244         rowcount++;
1245
1246         gtk_widget_show_all(table);
1247
1248         page->window = GTK_WIDGET(window);
1249         page->table = table;
1250         page->no_save_warning = no_save_warning;
1251         page->checkbtn_request_return_receipt = checkbtn_request_return_receipt;
1252         page->checkbtn_save_copy_to_folder = checkbtn_save_copy_to_folder;
1253         page->checkbtn_default_to = checkbtn_default_to;
1254         page->entry_default_to = entry_default_to;
1255         page->checkbtn_default_reply_to = checkbtn_default_reply_to;
1256         page->entry_default_reply_to = entry_default_reply_to;
1257         page->checkbtn_default_cc = checkbtn_default_cc;
1258         page->entry_default_cc = entry_default_cc;
1259         page->checkbtn_default_bcc = checkbtn_default_bcc;
1260         page->entry_default_bcc = entry_default_bcc;
1261         page->checkbtn_default_replyto = checkbtn_default_replyto;
1262         page->entry_default_replyto = entry_default_replyto;
1263         page->checkbtn_enable_default_account = checkbtn_enable_default_account;
1264         page->optmenu_default_account = optmenu_default_account;
1265 #ifdef USE_ENCHANT
1266         page->checkbtn_enable_default_dictionary = checkbtn_enable_default_dictionary;
1267         page->combo_default_dictionary = combo_default_dictionary;
1268         page->checkbtn_enable_default_alt_dictionary = checkbtn_enable_default_alt_dictionary;
1269         page->combo_default_alt_dictionary = combo_default_alt_dictionary;
1270 #endif
1271         page->always_sign = always_sign;
1272         page->always_encrypt = always_encrypt;
1273
1274         page->request_return_receipt_rec_checkbtn = request_return_receipt_rec_checkbtn;
1275         page->save_copy_to_folder_rec_checkbtn    = save_copy_to_folder_rec_checkbtn;
1276         page->default_to_rec_checkbtn             = default_to_rec_checkbtn;
1277         page->default_reply_to_rec_checkbtn       = default_reply_to_rec_checkbtn;
1278         page->default_cc_rec_checkbtn             = default_cc_rec_checkbtn;
1279         page->default_bcc_rec_checkbtn            = default_bcc_rec_checkbtn;
1280         page->default_replyto_rec_checkbtn                = default_replyto_rec_checkbtn;
1281         page->default_account_rec_checkbtn        = default_account_rec_checkbtn;
1282 #if USE_ENCHANT
1283         page->default_dictionary_rec_checkbtn = default_dictionary_rec_checkbtn;
1284         page->default_alt_dictionary_rec_checkbtn = default_alt_dictionary_rec_checkbtn;
1285 #endif
1286         page->always_sign_rec_checkbtn = always_sign_rec_checkbtn;
1287         page->always_encrypt_rec_checkbtn = always_encrypt_rec_checkbtn;
1288
1289         page->page.widget = table;
1290 }
1291
1292 static void prefs_folder_item_compose_destroy_widget_func(PrefsPage *page_) 
1293 {
1294         FolderItemComposePage *page = (FolderItemComposePage *) page_;
1295
1296         if (page->entry_default_to)
1297                 address_completion_unregister_entry(GTK_ENTRY(page->entry_default_to));
1298         if (page->entry_default_reply_to)
1299                 address_completion_unregister_entry(GTK_ENTRY(page->entry_default_reply_to));
1300         if (page->entry_default_cc)
1301                 address_completion_unregister_entry(GTK_ENTRY(page->entry_default_cc));
1302         if (page->entry_default_bcc)
1303                 address_completion_unregister_entry(GTK_ENTRY(page->entry_default_bcc));
1304         if (page->entry_default_replyto)
1305                 address_completion_unregister_entry(GTK_ENTRY(page->entry_default_replyto));
1306 }
1307
1308 /** \brief  Save the prefs in page to folder.
1309  *
1310  *  If the folder is not the one  specified in page->item, then only those properties 
1311  *  that have the relevant 'apply to sub folders' button checked are saved
1312  */
1313 static void compose_save_folder_prefs(FolderItem *folder, FolderItemComposePage *page)
1314 {
1315         FolderItemPrefs *prefs = folder->prefs;
1316
1317         gboolean all = FALSE;
1318
1319         if (folder->path == NULL)
1320                 return;
1321
1322         if (page->item == folder) 
1323                 all = TRUE;
1324
1325         cm_return_if_fail(prefs != NULL);
1326
1327         if (item_protocol(folder) != A_NNTP) {
1328                 if (all || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->request_return_receipt_rec_checkbtn))) {
1329                         prefs->request_return_receipt = 
1330                                 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_request_return_receipt));
1331                         /* MIGRATION */    
1332                         folder->ret_rcpt = prefs->request_return_receipt;
1333                 }
1334
1335                 if (all || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->save_copy_to_folder_rec_checkbtn))) {
1336                         prefs->save_copy_to_folder = 
1337                                 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_save_copy_to_folder));
1338                 }
1339
1340                 if (all || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->default_to_rec_checkbtn))) {
1341
1342                         prefs->enable_default_to = 
1343                                 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_default_to));
1344                         ASSIGN_STRING(prefs->default_to,
1345                                       gtk_editable_get_chars(GTK_EDITABLE(page->entry_default_to), 0, -1));
1346                 }
1347
1348                 if (all || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->default_reply_to_rec_checkbtn))) {
1349                         prefs->enable_default_reply_to = 
1350                                 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_default_reply_to));
1351                         ASSIGN_STRING(prefs->default_reply_to,
1352                                       gtk_editable_get_chars(GTK_EDITABLE(page->entry_default_reply_to), 0, -1));
1353                 }
1354
1355                 if (all || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->default_cc_rec_checkbtn))) {
1356
1357                         prefs->enable_default_cc = 
1358                                 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_default_cc));
1359                         ASSIGN_STRING(prefs->default_cc,
1360                                       gtk_editable_get_chars(GTK_EDITABLE(page->entry_default_cc), 0, -1));
1361                 }
1362
1363                 if (all || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->default_bcc_rec_checkbtn))) {
1364
1365                         prefs->enable_default_bcc = 
1366                                 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_default_bcc));
1367                         ASSIGN_STRING(prefs->default_bcc,
1368                                       gtk_editable_get_chars(GTK_EDITABLE(page->entry_default_bcc), 0, -1));
1369                 }
1370
1371                 if (all || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->default_replyto_rec_checkbtn))) {
1372
1373                         prefs->enable_default_replyto = 
1374                                 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_default_replyto));
1375                         ASSIGN_STRING(prefs->default_replyto,
1376                                       gtk_editable_get_chars(GTK_EDITABLE(page->entry_default_replyto), 0, -1));
1377                 }
1378
1379         } else {
1380                 prefs->request_return_receipt = FALSE;
1381                 prefs->save_copy_to_folder = FALSE;
1382                 prefs->enable_default_to = FALSE;
1383                 prefs->enable_default_reply_to = FALSE;
1384                 prefs->enable_default_cc = FALSE;
1385                 prefs->enable_default_bcc = FALSE;
1386                 prefs->enable_default_replyto = FALSE;
1387         }
1388
1389         if (all || gtk_toggle_button_get_active(
1390                                 GTK_TOGGLE_BUTTON(page->default_account_rec_checkbtn))) {
1391                 prefs->enable_default_account = 
1392                         gtk_toggle_button_get_active(
1393                                         GTK_TOGGLE_BUTTON(page->checkbtn_enable_default_account));
1394                 prefs->default_account = combobox_get_active_data(
1395                                 GTK_COMBO_BOX(page->optmenu_default_account));
1396         }
1397
1398 #if USE_ENCHANT
1399         if (all || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->default_dictionary_rec_checkbtn))) {
1400                 prefs->enable_default_dictionary =
1401                         gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_enable_default_dictionary));
1402                 ASSIGN_STRING(prefs->default_dictionary,
1403                               gtkaspell_get_dictionary_menu_active_item(
1404                                         GTK_COMBO_BOX(page->combo_default_dictionary)));
1405         }
1406         if (all || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->default_alt_dictionary_rec_checkbtn))) {
1407                 prefs->enable_default_alt_dictionary =
1408                         gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_enable_default_alt_dictionary));
1409                 ASSIGN_STRING(prefs->default_alt_dictionary,
1410                               gtkaspell_get_dictionary_menu_active_item(
1411                                       GTK_COMBO_BOX(page->combo_default_alt_dictionary)));
1412         }
1413 #endif
1414         if (all || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->always_sign_rec_checkbtn))) {
1415                 prefs->always_sign = 
1416                                 combobox_get_active_data(GTK_COMBO_BOX(page->always_sign));
1417         }
1418         if (all || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->always_encrypt_rec_checkbtn))) {
1419                 prefs->always_encrypt = 
1420                                 combobox_get_active_data(GTK_COMBO_BOX(page->always_encrypt));
1421         }
1422
1423         folder_item_prefs_save_config(folder);
1424 }       
1425
1426 static gboolean compose_save_recurse_func(GNode *node, gpointer data)
1427 {
1428         FolderItem *item = (FolderItem *) node->data;
1429         FolderItemComposePage *page = (FolderItemComposePage *) data;
1430
1431         cm_return_val_if_fail(item != NULL, TRUE);
1432         cm_return_val_if_fail(page != NULL, TRUE);
1433
1434         compose_save_folder_prefs(item, page);
1435
1436         /* optimise by not continuing if none of the 'apply to sub folders'
1437            check boxes are selected - and optimise the checking by only doing
1438            it once */
1439         if ((node == page->item->node) && item_protocol(item) != A_NNTP &&
1440             !(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->request_return_receipt_rec_checkbtn)) ||
1441               gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->save_copy_to_folder_rec_checkbtn)) ||
1442               gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->default_to_rec_checkbtn)) ||
1443               gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->default_account_rec_checkbtn)) ||
1444               gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->default_cc_rec_checkbtn)) ||
1445               gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->default_bcc_rec_checkbtn)) ||
1446               gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->default_replyto_rec_checkbtn)) ||
1447 #if USE_ENCHANT
1448               gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->default_dictionary_rec_checkbtn)) ||
1449               gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->default_alt_dictionary_rec_checkbtn)) ||
1450 #endif
1451               gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->always_sign_rec_checkbtn)) ||
1452               gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->always_encrypt_rec_checkbtn)) ||
1453               gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->default_reply_to_rec_checkbtn))
1454                         ))
1455                 return TRUE;
1456         else if ((node == page->item->node) && item_protocol(item) == A_NNTP &&
1457             !(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->default_account_rec_checkbtn)) 
1458 #if USE_ENCHANT
1459               || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->default_dictionary_rec_checkbtn))
1460               || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->default_alt_dictionary_rec_checkbtn))
1461 #endif
1462               || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->always_sign_rec_checkbtn))
1463               || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->always_encrypt_rec_checkbtn))
1464                     ))
1465                 return TRUE;
1466         else 
1467                 return FALSE;
1468 }
1469
1470 static void prefs_folder_item_compose_save_func(PrefsPage *page_) 
1471 {
1472         FolderItemComposePage *page = (FolderItemComposePage *) page_;
1473
1474         g_node_traverse(page->item->node, G_PRE_ORDER, G_TRAVERSE_ALL,
1475                         -1, compose_save_recurse_func, page);
1476
1477 }
1478
1479 static void prefs_folder_item_templates_create_widget_func(PrefsPage * page_,
1480                                                    GtkWindow * window,
1481                                                    gpointer data)
1482 {
1483         FolderItemTemplatesPage *page = (FolderItemTemplatesPage *) page_;
1484         FolderItem *item = (FolderItem *) data;
1485
1486         GtkWidget *notebook;
1487         GtkWidget *vbox;
1488         GtkWidget *page_vbox;
1489         GtkWidget *no_save_warning;
1490         GtkWidget *new_msg_format_rec_checkbtn;
1491         GtkWidget *reply_format_rec_checkbtn;
1492         GtkWidget *forward_format_rec_checkbtn;
1493         GtkWidget *hbox;
1494         GtkWidget *vbox_format;
1495         
1496         page->item = item;
1497
1498         page_vbox = gtk_vbox_new (FALSE, 0);
1499         gtk_container_set_border_width (GTK_CONTAINER (page_vbox), VBOX_BORDER);
1500         gtk_widget_show (page_vbox);
1501         
1502         if (!can_save) {
1503                 no_save_warning = prefs_folder_no_save_warning_create_widget();
1504                 gtk_box_pack_start(GTK_BOX(page_vbox),
1505                                    no_save_warning, FALSE, FALSE, 0);
1506         }
1507
1508         /* Notebook */
1509         notebook = gtk_notebook_new();
1510         gtk_widget_show(notebook);
1511         gtk_box_pack_start(GTK_BOX(page_vbox), notebook, TRUE, TRUE, 4);
1512
1513         /* compose format */
1514         vbox = gtk_vbox_new (FALSE, VSPACING);
1515         gtk_widget_show (vbox);
1516         gtk_container_set_border_width (GTK_CONTAINER (vbox), VBOX_BORDER);
1517
1518         quotefmt_create_new_msg_fmt_widgets(
1519                                 window,
1520                                 vbox,
1521                                 &page->checkbtn_compose_with_format,
1522                                 &page->compose_override_from_format,
1523                                 &page->compose_subject_format,
1524                                 &page->compose_body_format,
1525                                 FALSE, FALSE);
1526         address_completion_register_entry(GTK_ENTRY(page->compose_override_from_format),
1527                         TRUE);
1528         
1529         vbox_format = gtk_widget_get_parent(
1530                         gtk_widget_get_parent(page->compose_body_format));
1531
1532         hbox = gtk_hbox_new (FALSE, 0);
1533         gtk_box_pack_end (GTK_BOX(vbox_format), hbox, FALSE, FALSE, 0);
1534         quotefmt_add_info_button(window, hbox);
1535         
1536         new_msg_format_rec_checkbtn = gtk_check_button_new_with_label(
1537                         _("Apply to subfolders"));
1538         gtk_box_pack_end (GTK_BOX(hbox), new_msg_format_rec_checkbtn, FALSE, FALSE, 0);
1539         gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox, gtk_label_new(_("Compose")));
1540
1541         /* reply format */
1542         vbox = gtk_vbox_new (FALSE, VSPACING);
1543         gtk_widget_show (vbox);
1544         gtk_container_set_border_width (GTK_CONTAINER (vbox), VBOX_BORDER);
1545
1546         quotefmt_create_reply_fmt_widgets(
1547                                 window,
1548                                 vbox,
1549                                 &page->checkbtn_reply_with_format,
1550                                 &page->reply_override_from_format,
1551                                 &page->reply_quotemark,
1552                                 &page->reply_body_format,
1553                                 FALSE, FALSE);
1554         address_completion_register_entry(GTK_ENTRY(page->reply_override_from_format),
1555                         TRUE);
1556
1557         vbox_format = gtk_widget_get_parent(
1558                         gtk_widget_get_parent(page->reply_body_format));
1559
1560         hbox = gtk_hbox_new (FALSE, 0);
1561         gtk_box_pack_end (GTK_BOX(vbox_format), hbox, FALSE, FALSE, 0);
1562         quotefmt_add_info_button(window, hbox);
1563
1564         reply_format_rec_checkbtn = gtk_check_button_new_with_label(
1565                         _("Apply to subfolders"));
1566         gtk_box_pack_end (GTK_BOX(hbox), reply_format_rec_checkbtn, FALSE, FALSE, 0);
1567         gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox, gtk_label_new(_("Reply")));
1568
1569         /* forward format */
1570         vbox = gtk_vbox_new (FALSE, VSPACING);
1571         gtk_widget_show (vbox);
1572         gtk_container_set_border_width (GTK_CONTAINER (vbox), VBOX_BORDER);
1573
1574         quotefmt_create_forward_fmt_widgets(
1575                                 window,
1576                                 vbox,
1577                                 &page->checkbtn_forward_with_format,
1578                                 &page->forward_override_from_format,
1579                                 &page->forward_quotemark,
1580                                 &page->forward_body_format,
1581                                 FALSE, FALSE);
1582         address_completion_register_entry(GTK_ENTRY(page->forward_override_from_format),
1583                         TRUE);
1584
1585         vbox_format = gtk_widget_get_parent(
1586                         gtk_widget_get_parent(page->forward_body_format));
1587
1588         hbox = gtk_hbox_new (FALSE, 0);
1589         gtk_box_pack_end (GTK_BOX(vbox_format), hbox, FALSE, FALSE, 0);
1590         quotefmt_add_info_button(window, hbox);
1591
1592         forward_format_rec_checkbtn = gtk_check_button_new_with_label(
1593                         _("Apply to subfolders"));
1594         gtk_box_pack_end (GTK_BOX(hbox), forward_format_rec_checkbtn, FALSE, FALSE, 0);
1595         gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox, gtk_label_new(_("Forward")));
1596
1597         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(page->checkbtn_compose_with_format),
1598                         item->prefs->compose_with_format);
1599         pref_set_entry_from_pref(GTK_ENTRY(page->compose_override_from_format),
1600                         item->prefs->compose_override_from_format);
1601         pref_set_entry_from_pref(GTK_ENTRY(page->compose_subject_format),
1602                         item->prefs->compose_subject_format);
1603         pref_set_textview_from_pref(GTK_TEXT_VIEW(page->compose_body_format),
1604                         item->prefs->compose_body_format);
1605
1606         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(page->checkbtn_reply_with_format),
1607                         item->prefs->reply_with_format);
1608         pref_set_entry_from_pref(GTK_ENTRY(page->reply_quotemark),
1609                         item->prefs->reply_quotemark);
1610         pref_set_entry_from_pref(GTK_ENTRY(page->reply_override_from_format),
1611                         item->prefs->reply_override_from_format);
1612         pref_set_textview_from_pref(GTK_TEXT_VIEW(page->reply_body_format),
1613                         item->prefs->reply_body_format);
1614
1615         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(page->checkbtn_forward_with_format),
1616                         item->prefs->forward_with_format);
1617         pref_set_entry_from_pref(GTK_ENTRY(page->forward_quotemark),
1618                         item->prefs->forward_quotemark);
1619         pref_set_entry_from_pref(GTK_ENTRY(page->forward_override_from_format),
1620                         item->prefs->forward_override_from_format);
1621         pref_set_textview_from_pref(GTK_TEXT_VIEW(page->forward_body_format),
1622                         item->prefs->forward_body_format);
1623
1624         gtk_widget_show_all(page_vbox);
1625
1626         page->window = GTK_WIDGET(window);
1627
1628         page->new_msg_format_rec_checkbtn = new_msg_format_rec_checkbtn;
1629         page->reply_format_rec_checkbtn = reply_format_rec_checkbtn;
1630         page->forward_format_rec_checkbtn = forward_format_rec_checkbtn;
1631
1632         page->page.widget = page_vbox;
1633 }
1634
1635 static void prefs_folder_item_templates_destroy_widget_func(PrefsPage *page_) 
1636 {
1637         FolderItemTemplatesPage *page = (FolderItemTemplatesPage *) page_;
1638
1639         if (page->compose_override_from_format)
1640                 address_completion_unregister_entry(GTK_ENTRY(page->compose_override_from_format));             
1641         if (page->reply_override_from_format)
1642                 address_completion_unregister_entry(GTK_ENTRY(page->reply_override_from_format));               
1643         if (page->forward_override_from_format)
1644                 address_completion_unregister_entry(GTK_ENTRY(page->forward_override_from_format));             
1645 }
1646
1647 /** \brief  Save the prefs in page to folder.
1648  *
1649  *  If the folder is not the one  specified in page->item, then only those properties 
1650  *  that have the relevant 'apply to sub folders' button checked are saved
1651  */
1652 static void templates_save_folder_prefs(FolderItem *folder, FolderItemTemplatesPage *page)
1653 {
1654         FolderItemPrefs *prefs = folder->prefs;
1655         gboolean all = FALSE;
1656
1657         if (folder->path == NULL)
1658                 return;
1659
1660         if (page->item == folder) 
1661                 all = TRUE;
1662
1663         cm_return_if_fail(prefs != NULL);
1664
1665         /* save and check formats */
1666
1667         if (all || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->new_msg_format_rec_checkbtn))) {
1668                 
1669                 prefs->compose_with_format =
1670                         gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_compose_with_format));
1671                 prefs->compose_override_from_format = pref_get_pref_from_entry(
1672                                 GTK_ENTRY(page->compose_override_from_format));
1673                 prefs->compose_subject_format = pref_get_pref_from_entry(
1674                                 GTK_ENTRY(page->compose_subject_format));
1675                 prefs->compose_body_format = pref_get_pref_from_textview(
1676                                 GTK_TEXT_VIEW(page->compose_body_format));
1677                 quotefmt_check_new_msg_formats(prefs->compose_with_format,
1678                                                 prefs->compose_override_from_format,
1679                                                 prefs->compose_subject_format,
1680                                                 prefs->compose_body_format);
1681         }
1682
1683         if (all || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->reply_format_rec_checkbtn))) {
1684                 prefs->reply_with_format =
1685                         gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_reply_with_format));
1686                 prefs->reply_quotemark = gtk_editable_get_chars(
1687                                 GTK_EDITABLE(page->reply_quotemark), 0, -1);
1688                 prefs->reply_override_from_format = pref_get_pref_from_entry(
1689                                 GTK_ENTRY(page->reply_override_from_format));
1690                 prefs->reply_body_format = pref_get_pref_from_textview(
1691                                 GTK_TEXT_VIEW(page->reply_body_format));
1692                 quotefmt_check_reply_formats(prefs->reply_with_format,
1693                                                                                 prefs->reply_override_from_format,
1694                                                                                 prefs->reply_quotemark,
1695                                                                                 prefs->reply_body_format);
1696         }
1697
1698         if (all || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->forward_format_rec_checkbtn))) {
1699                 prefs->forward_with_format =
1700                         gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_forward_with_format));
1701                 prefs->forward_quotemark = gtk_editable_get_chars(
1702                                 GTK_EDITABLE(page->forward_quotemark), 0, -1);
1703                 prefs->forward_override_from_format = pref_get_pref_from_entry(
1704                                 GTK_ENTRY(page->forward_override_from_format));
1705                 prefs->forward_body_format = pref_get_pref_from_textview(
1706                                 GTK_TEXT_VIEW(page->forward_body_format));
1707                 quotefmt_check_forward_formats(prefs->forward_with_format,
1708                                                                                 prefs->forward_override_from_format,
1709                                                                                 prefs->forward_quotemark,
1710                                                                                 prefs->forward_body_format);
1711         }
1712
1713         folder_item_prefs_save_config(folder);
1714 }       
1715
1716 static gboolean templates_save_recurse_func(GNode *node, gpointer data)
1717 {
1718         FolderItem *item = (FolderItem *) node->data;
1719         FolderItemTemplatesPage *page = (FolderItemTemplatesPage *) data;
1720
1721         cm_return_val_if_fail(item != NULL, TRUE);
1722         cm_return_val_if_fail(page != NULL, TRUE);
1723
1724         templates_save_folder_prefs(item, page);
1725
1726         /* optimise by not continuing if none of the 'apply to sub folders'
1727            check boxes are selected - and optimise the checking by only doing
1728            it once */
1729         if ((node == page->item->node) &&
1730             !(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->new_msg_format_rec_checkbtn)) ||
1731               gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->reply_format_rec_checkbtn)) ||
1732               gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->forward_format_rec_checkbtn))))
1733                 return TRUE;
1734         else 
1735                 return FALSE;
1736
1737         return FALSE;
1738 }
1739
1740 static void prefs_folder_item_templates_save_func(PrefsPage *page_) 
1741 {
1742         FolderItemTemplatesPage *page = (FolderItemTemplatesPage *) page_;
1743
1744         g_node_traverse(page->item->node, G_PRE_ORDER, G_TRAVERSE_ALL,
1745                         -1, templates_save_recurse_func, page);
1746
1747 }
1748
1749 static gint prefs_folder_item_chmod_mode(gchar *folder_chmod) 
1750 {
1751         gint newmode = 0;
1752         gchar *tmp;
1753
1754         if (folder_chmod) {
1755                 newmode = strtol(folder_chmod, &tmp, 8);
1756                 if (!(*(folder_chmod) && !(*tmp)))
1757                         newmode = 0;
1758         }
1759
1760         return newmode;
1761 }
1762
1763 static void folder_color_set_dialog(GtkWidget *widget, gpointer data)
1764 {
1765         FolderItemGeneralPage *page = (FolderItemGeneralPage *) data;
1766         gint rgbcolor;
1767
1768         rgbcolor = colorsel_select_color_rgb(_("Pick color for folder"), 
1769                                              page->folder_color);
1770         gtkut_set_widget_bgcolor_rgb(page->folder_color_btn, rgbcolor);
1771         page->folder_color = rgbcolor;
1772 }
1773
1774 static void clean_cache_cb(GtkWidget *widget, gpointer data)
1775 {
1776         FolderItemGeneralPage *page = (FolderItemGeneralPage *) data;
1777         FolderItem *item = page->item;
1778         gboolean was_open = FALSE;
1779         FolderView *folderview = NULL;
1780
1781         if (alertpanel_full(_("Discard cache"), 
1782                             _("Do you really want to discard the local cached "
1783                               "data for this folder?"),
1784                                  GTK_STOCK_CANCEL, _("Discard"), NULL, ALERTFOCUS_SECOND,
1785                                  FALSE, NULL, ALERT_WARNING)
1786                 != G_ALERTALTERNATE)
1787                 return;
1788         
1789         if (mainwindow_get_mainwindow())
1790                 folderview = mainwindow_get_mainwindow()->folderview;
1791
1792         if (folderview && item->opened) {
1793                 folderview_close_opened(folderview, FALSE);
1794                 was_open = TRUE;
1795         }
1796         folder_item_discard_cache(item);
1797         if (was_open)
1798                 folderview_select(folderview,item);
1799 }
1800
1801 static regex_t *summary_compile_simplify_regexp(gchar *simplify_subject_regexp)
1802 {
1803         int err;
1804         gchar buf[BUFFSIZE];
1805         regex_t *preg = NULL;
1806
1807         preg = g_new0(regex_t, 1);
1808
1809         err = string_match_precompile(simplify_subject_regexp, 
1810                                       preg, REG_EXTENDED);
1811         if (err) {
1812                 regerror(err, preg, buf, BUFFSIZE);
1813                 g_free(preg);
1814                 preg = NULL;
1815         }
1816
1817         return preg;
1818 }
1819
1820 static void folder_regexp_test_cb(GtkWidget *widget, gpointer data)
1821 {
1822         static GdkColor red;
1823         static gboolean colors_initialised = FALSE;
1824         static gchar buf[BUFFSIZE];
1825         FolderItemGeneralPage *page = (FolderItemGeneralPage *)data;
1826         gchar *test_string, *regexp;
1827         regex_t *preg;
1828
1829         regexp = g_strdup(gtk_entry_get_text(GTK_ENTRY(page->entry_simplify_subject)));
1830         test_string = g_strdup(gtk_entry_get_text(GTK_ENTRY(page->entry_regexp_test_string)));
1831
1832         if (!regexp || !regexp[0]) {
1833                 gtk_widget_modify_base(page->entry_simplify_subject,
1834                                 GTK_STATE_NORMAL, NULL);
1835                 if (test_string)
1836                         gtk_entry_set_text(GTK_ENTRY(page->entry_regexp_test_result), test_string);
1837                         
1838                 g_free(test_string);
1839                 g_free(regexp);
1840                 return;
1841         }
1842
1843         if (!test_string || !test_string[0]) {
1844                 g_free(test_string);
1845                 g_free(regexp);
1846                 return;
1847         }
1848
1849         if (!colors_initialised) {
1850                 if (!gdk_color_parse("#ff7070", &red)) {
1851                 g_warning("color parse failed: red");
1852                                         return;
1853                 }
1854                 colors_initialised = gdk_colormap_alloc_color(
1855                                 gdk_colormap_get_system(), &red, FALSE, TRUE);
1856         }
1857
1858         preg = summary_compile_simplify_regexp(regexp);
1859         if (colors_initialised)
1860                 gtk_widget_modify_base(page->entry_simplify_subject,
1861                                 GTK_STATE_NORMAL, preg ? NULL : &red);
1862
1863         if (preg != NULL) {
1864                 string_remove_match(buf, BUFFSIZE, test_string, preg);
1865
1866                 gtk_entry_set_text(GTK_ENTRY(page->entry_regexp_test_result), buf);
1867
1868                 regfree(preg);
1869                 g_free(preg);
1870         }
1871
1872         g_free(test_string);
1873         g_free(regexp);
1874 }
1875
1876 static gchar *folder_regexp_get_subject_example(void)
1877 {
1878         MsgInfo *msginfo_selected;
1879         SummaryView *summaryview = NULL;
1880
1881         if (!mainwindow_get_mainwindow())
1882                 return NULL;
1883         summaryview = mainwindow_get_mainwindow()->summaryview;
1884
1885         msginfo_selected = summary_get_selected_msg(summaryview);
1886         return msginfo_selected ? g_strdup(msginfo_selected->subject) : NULL;
1887 }
1888
1889 static void folder_regexp_set_subject_example_cb(GtkWidget *widget, gpointer data)
1890 {
1891         FolderItemGeneralPage *page = (FolderItemGeneralPage *)data;
1892
1893         if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_simplify_subject))) {
1894                 gchar *subject = folder_regexp_get_subject_example();
1895                 if (subject) {
1896                         gtk_entry_set_text(GTK_ENTRY(page->entry_regexp_test_string), subject);
1897                         g_free(subject);
1898                 }
1899         }
1900 }
1901
1902 static void register_general_page()
1903 {
1904         static gchar *pfi_general_path[2];
1905         static FolderItemGeneralPage folder_item_general_page;
1906
1907         pfi_general_path[0] = _("General");
1908         pfi_general_path[1] = NULL;
1909
1910         folder_item_general_page.page.path = pfi_general_path;
1911         folder_item_general_page.page.create_widget = prefs_folder_item_general_create_widget_func;
1912         folder_item_general_page.page.destroy_widget = prefs_folder_item_general_destroy_widget_func;
1913         folder_item_general_page.page.save_page = prefs_folder_item_general_save_func;
1914         
1915         prefs_folder_item_register_page((PrefsPage *) &folder_item_general_page, NULL);
1916 }
1917
1918
1919 static void register_compose_page(void)
1920 {
1921         static gchar *pfi_compose_path[2];
1922         static FolderItemComposePage folder_item_compose_page;
1923
1924         pfi_compose_path[0] = _("Compose");
1925         pfi_compose_path[1] = NULL;
1926
1927         folder_item_compose_page.page.path = pfi_compose_path;
1928         folder_item_compose_page.page.create_widget = prefs_folder_item_compose_create_widget_func;
1929         folder_item_compose_page.page.destroy_widget = prefs_folder_item_compose_destroy_widget_func;
1930         folder_item_compose_page.page.save_page = prefs_folder_item_compose_save_func;
1931         
1932         prefs_folder_item_register_page((PrefsPage *) &folder_item_compose_page, NULL);
1933 }
1934
1935 static void register_templates_page(void)
1936 {
1937         static gchar *pfi_templates_path[2];
1938         static FolderItemTemplatesPage folder_item_templates_page;
1939
1940         pfi_templates_path[0] = _("Templates");
1941         pfi_templates_path[1] = NULL;
1942
1943         folder_item_templates_page.page.path = pfi_templates_path;
1944         folder_item_templates_page.page.create_widget = prefs_folder_item_templates_create_widget_func;
1945         folder_item_templates_page.page.destroy_widget = prefs_folder_item_templates_destroy_widget_func;
1946         folder_item_templates_page.page.save_page = prefs_folder_item_templates_save_func;
1947         
1948         prefs_folder_item_register_page((PrefsPage *) &folder_item_templates_page, NULL);
1949 }
1950
1951 static GSList *prefs_pages = NULL;
1952
1953 static void prefs_folder_item_address_completion_start(PrefsWindow *window)
1954 {
1955         address_completion_start(window->window);
1956 }
1957
1958 static void prefs_folder_item_address_completion_end(PrefsWindow *window)
1959 {
1960         address_completion_end(window->window);
1961 }
1962
1963 void prefs_folder_item_open(FolderItem *item)
1964 {
1965         gchar *id, *title;
1966         GSList *pages;
1967
1968         if (prefs_pages == NULL) {
1969                 register_general_page();
1970                 register_compose_page();
1971                 register_templates_page();
1972         }
1973
1974         if (item->path) {
1975                 id = folder_item_get_identifier (item);
1976                 can_save = TRUE;
1977         } else {
1978                 id = g_strdup(item->name);
1979                 can_save = FALSE;
1980         }
1981         
1982         pages = g_slist_concat(
1983                         g_slist_copy(prefs_pages),
1984                         g_slist_copy(item->folder->klass->prefs_pages));
1985
1986         title = g_strdup_printf (_("Properties for folder %s"), id);
1987         g_free (id);
1988         prefswindow_open(title, pages, item,
1989                         &prefs_common.folderitemwin_width, &prefs_common.folderitemwin_height,
1990                         prefs_folder_item_address_completion_start,
1991                         NULL,
1992                         prefs_folder_item_address_completion_end);
1993
1994         g_slist_free(pages);
1995         g_free (title);
1996 }
1997
1998 void prefs_folder_item_register_page(PrefsPage *page, FolderClass *klass)
1999 {
2000         if (klass != NULL)
2001                 klass->prefs_pages = g_slist_append(klass->prefs_pages, page);
2002         else
2003                 prefs_pages = g_slist_append(prefs_pages, page);
2004 }
2005
2006 void prefs_folder_item_unregister_page(PrefsPage *page, FolderClass *klass)
2007 {
2008         if (klass != NULL)
2009                 klass->prefs_pages = g_slist_remove(klass->prefs_pages, page);
2010         else
2011                 prefs_pages = g_slist_remove(prefs_pages, page);
2012 }