2ab89dab6a455fbe84a79b5ff65d3ec3911bdf65
[claws.git] / src / prefs_folder_item.c
1 /*
2  * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
3  * Copyright (C) 1999-2007 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
20 /* alfons - all folder item specific settings should migrate into 
21  * folderlist.xml!!! the old folderitemrc file will only serve for a few 
22  * versions (for compatibility) */
23
24 #ifdef HAVE_CONFIG_H
25 #  include "config.h"
26 #endif
27
28 #include "defs.h"
29
30 #include <glib.h>
31 #include <glib/gi18n.h>
32 #include "folder.h"
33 #include "prefs_folder_item.h"
34 #include "folderview.h"
35 #include "folder.h"
36 #include "summaryview.h"
37 #include "menu.h"
38 #include "account.h"
39 #include "prefs_gtk.h"
40 #include "manage_window.h"
41 #include "utils.h"
42 #include "addr_compl.h"
43 #include "prefs_common.h"
44 #include "gtkutils.h"
45 #include "filtering.h"
46 #include "folder_item_prefs.h"
47 #include "gtk/colorsel.h"
48 #include "string_match.h"
49 #include "quote_fmt.h"
50 #include "combobox.h"
51
52 #if USE_ASPELL
53 #include "gtkaspell.h"
54 #endif
55
56 #define ASSIGN_STRING(string, value) \
57         { \
58                 g_free(string); \
59                 string = (value); \
60         }
61
62 typedef struct _FolderItemGeneralPage FolderItemGeneralPage;
63 typedef struct _FolderItemComposePage FolderItemComposePage;
64 typedef struct _FolderItemTemplatesPage FolderItemTemplatesPage;
65 static gboolean can_save = TRUE;
66
67 struct _FolderItemGeneralPage
68 {
69         PrefsPage page;
70
71         FolderItem *item;
72
73         GtkWidget *table;
74         GtkWidget *no_save_warning;
75         GtkWidget *folder_type;
76         GtkWidget *checkbtn_simplify_subject;
77         GtkWidget *entry_simplify_subject;
78         GtkWidget *entry_regexp_test_string;
79         GtkWidget *entry_regexp_test_result;
80         GtkWidget *checkbtn_folder_chmod;
81         GtkWidget *entry_folder_chmod;
82         GtkWidget *folder_color_btn;
83         GtkWidget *checkbtn_enable_processing;
84         GtkWidget *checkbtn_newmailcheck;
85         GtkWidget *checkbtn_offlinesync;
86         GtkWidget *label_offlinesync;
87         GtkWidget *entry_offlinesync;
88         GtkWidget *label_end_offlinesync;
89         GtkWidget *checkbtn_remove_old_offlinesync;
90         
91         /* apply to sub folders */
92         GtkWidget *simplify_subject_rec_checkbtn;
93         GtkWidget *folder_chmod_rec_checkbtn;
94         GtkWidget *folder_color_rec_checkbtn;
95         GtkWidget *enable_processing_rec_checkbtn;
96         GtkWidget *newmailcheck_rec_checkbtn;
97         GtkWidget *offlinesync_rec_checkbtn;
98
99         gint       folder_color;
100 };
101
102 struct _FolderItemComposePage
103 {
104         PrefsPage page;
105
106         FolderItem *item;
107
108         GtkWidget *window;
109         GtkWidget *table;
110         GtkWidget *no_save_warning;
111         GtkWidget *checkbtn_request_return_receipt;
112         GtkWidget *checkbtn_save_copy_to_folder;
113         GtkWidget *checkbtn_default_to;
114         GtkWidget *entry_default_to;
115         GtkWidget *checkbtn_default_reply_to;
116         GtkWidget *entry_default_reply_to;
117         GtkWidget *checkbtn_enable_default_account;
118         GtkWidget *optmenu_default_account;
119 #if USE_ASPELL
120         GtkWidget *checkbtn_enable_default_dictionary;
121         GtkWidget *checkbtn_enable_default_alt_dictionary;
122         GtkWidget *optmenu_default_dictionary;
123         GtkWidget *optmenu_default_alt_dictionary;
124 #endif
125
126         /* apply to sub folders */
127         GtkWidget *request_return_receipt_rec_checkbtn;
128         GtkWidget *save_copy_to_folder_rec_checkbtn;
129         GtkWidget *default_to_rec_checkbtn;
130         GtkWidget *default_reply_to_rec_checkbtn;
131         GtkWidget *default_account_rec_checkbtn;
132 #if USE_ASPELL
133         GtkWidget *default_dictionary_rec_checkbtn;
134         GtkWidget *default_alt_dictionary_rec_checkbtn;
135 #endif
136 };
137
138 struct _FolderItemTemplatesPage
139 {
140         PrefsPage page;
141
142         FolderItem *item;
143
144         GtkWidget *window;
145         GtkWidget *table;
146         GtkWidget *checkbtn_compose_with_format;
147         GtkWidget *compose_subject_format;
148         GtkWidget *compose_body_format;
149         GtkWidget *checkbtn_reply_with_format;
150         GtkWidget *reply_quotemark;
151         GtkWidget *reply_body_format;
152         GtkWidget *checkbtn_forward_with_format;
153         GtkWidget *forward_quotemark;
154         GtkWidget *forward_body_format;
155
156         /* apply to sub folders */
157         GtkWidget *new_msg_format_rec_checkbtn;
158         GtkWidget *reply_format_rec_checkbtn;
159         GtkWidget *forward_format_rec_checkbtn;
160 };
161
162
163 static void general_save_folder_prefs(FolderItem *folder, FolderItemGeneralPage *page);
164 static void compose_save_folder_prefs(FolderItem *folder, FolderItemComposePage *page);
165 static void templates_save_folder_prefs(FolderItem *folder, FolderItemTemplatesPage *page);
166
167 static gboolean general_save_recurse_func(GNode *node, gpointer data);
168 static gboolean compose_save_recurse_func(GNode *node, gpointer data);
169 static gboolean templates_save_recurse_func(GNode *node, gpointer data);
170
171 static gint prefs_folder_item_chmod_mode                (gchar *folder_chmod);
172
173 static void folder_color_set_dialog(GtkWidget *widget, gpointer data);
174 static void folder_regexp_test_cb(GtkWidget *widget, gpointer data);
175 static void folder_regexp_set_subject_example_cb(GtkWidget *widget, gpointer data);
176
177 #define SAFE_STRING(str) \
178         (str) ? (str) : ""
179
180 static void prefs_folder_item_general_create_widget_func(PrefsPage * page_,
181                                                    GtkWindow * window,
182                                                    gpointer data)
183 {
184         FolderItemGeneralPage *page = (FolderItemGeneralPage *) page_;
185         FolderItem *item = (FolderItem *) data;
186         guint rowcount;
187
188         GtkWidget *table;
189         GtkWidget *hbox, *hbox2, *hbox_spc;
190         GtkWidget *label;
191         
192         GtkListStore *folder_type_menu;
193         GtkWidget *folder_type;
194         GtkTreeIter iter;
195         GtkWidget *dummy_checkbtn;
196         SpecialFolderItemType type;
197         
198         GtkWidget *no_save_warning = NULL;
199         GtkWidget *checkbtn_simplify_subject;
200         GtkWidget *entry_simplify_subject;
201         GtkWidget *hbox_regexp;
202         GtkWidget *label_regexp_test;
203         GtkWidget *entry_regexp_test_string;
204         GtkWidget *left_arrow;
205         GtkWidget *entry_regexp_test_result;
206
207         GtkWidget *checkbtn_folder_chmod;
208         GtkWidget *entry_folder_chmod;
209         GtkWidget *folder_color;
210         GtkWidget *folder_color_btn;
211         GtkWidget *checkbtn_enable_processing;
212         GtkWidget *checkbtn_newmailcheck;
213         GtkWidget *checkbtn_offlinesync;
214         GtkWidget *label_offlinesync;
215         GtkWidget *entry_offlinesync;
216         GtkWidget *label_end_offlinesync;
217         GtkWidget *checkbtn_remove_old_offlinesync;
218
219         GtkWidget *simplify_subject_rec_checkbtn;
220         GtkWidget *folder_chmod_rec_checkbtn;
221         GtkWidget *folder_color_rec_checkbtn;
222         GtkWidget *enable_processing_rec_checkbtn;
223         GtkWidget *newmailcheck_rec_checkbtn;
224         GtkWidget *offlinesync_rec_checkbtn;
225         GtkTooltips *tooltips;
226
227         tooltips = gtk_tooltips_new();
228         page->item         = item;
229
230         /* Table */
231         table = gtk_table_new(9, 4, FALSE);
232         gtk_container_set_border_width (GTK_CONTAINER (table), VBOX_BORDER);
233         gtk_table_set_row_spacings(GTK_TABLE(table), 4);
234         gtk_table_set_col_spacings(GTK_TABLE(table), 4);
235         rowcount = 0;
236
237         if (!can_save) {
238                 no_save_warning = gtk_label_new(
239                         _("<i>These preferences will not be saved as this folder "
240                         "is a top-level one. However you can use them to set them "
241                         "to the whole mailbox tree using \"Apply to subfolders\".</i>"));
242                 gtk_label_set_use_markup(GTK_LABEL(no_save_warning), TRUE);
243                 gtk_label_set_line_wrap(GTK_LABEL(no_save_warning), TRUE);
244                 gtk_misc_set_alignment(GTK_MISC(no_save_warning), 0.0, 0.5);
245                 gtk_table_attach(GTK_TABLE(table), no_save_warning, 0, 4,
246                          rowcount, rowcount + 1, GTK_FILL, 0, 0, 0);
247                 rowcount++;
248         }
249         
250         /* Apply to subfolders */
251         label = gtk_label_new(_("Apply to\nsubfolders"));
252         gtk_misc_set_alignment(GTK_MISC(label), 0.5, 0.5);
253         gtk_table_attach(GTK_TABLE(table), label, 3, 4,
254                          rowcount, rowcount + 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
255         rowcount++;
256
257         /* folder_type */
258         folder_type = gtkut_sc_combobox_create(NULL, FALSE);
259         gtk_widget_show (folder_type);
260
261         type = F_NORMAL;
262         if (item->stype == F_INBOX)
263                 type = F_INBOX;
264         else if (folder_has_parent_of_type(item, F_OUTBOX))
265                 type = F_OUTBOX;
266         else if (folder_has_parent_of_type(item, F_DRAFT))
267                 type = F_DRAFT;
268         else if (folder_has_parent_of_type(item, F_QUEUE))
269                 type = F_QUEUE;
270         else if (folder_has_parent_of_type(item, F_TRASH))
271                 type = F_TRASH;
272
273         folder_type_menu = GTK_LIST_STORE(gtk_combo_box_get_model(
274                                 GTK_COMBO_BOX(folder_type)));
275
276         COMBOBOX_ADD (folder_type_menu, _("Normal"),  F_NORMAL);
277         COMBOBOX_ADD (folder_type_menu, _("Inbox"),  F_INBOX);
278         COMBOBOX_ADD (folder_type_menu, _("Outbox"),  F_OUTBOX);
279         COMBOBOX_ADD (folder_type_menu, _("Drafts"),  F_DRAFT);
280         COMBOBOX_ADD (folder_type_menu, _("Queue"),  F_QUEUE);
281         COMBOBOX_ADD (folder_type_menu, _("Trash"),  F_TRASH);
282
283         combobox_select_by_data(GTK_COMBO_BOX(folder_type), type);
284
285         dummy_checkbtn = gtk_check_button_new();
286         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dummy_checkbtn), type != F_INBOX);
287         gtk_widget_set_sensitive(dummy_checkbtn, FALSE);
288
289         if (type == item->stype && type == F_NORMAL)
290                 gtk_widget_set_sensitive(folder_type, TRUE);
291         else
292                 gtk_widget_set_sensitive(folder_type, FALSE);
293
294         label = gtk_label_new(_("Folder type"));
295         gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
296         gtk_table_attach(GTK_TABLE(table), label, 0, 1, 
297                          rowcount, rowcount + 1, GTK_SHRINK | GTK_FILL, GTK_FILL, 0, 0);
298         gtk_table_attach(GTK_TABLE(table), folder_type, 1, 2, 
299                          rowcount, rowcount + 1, GTK_SHRINK | GTK_FILL, GTK_FILL, 0, 0);
300         gtk_table_attach(GTK_TABLE(table), dummy_checkbtn, 3, 4, 
301                          rowcount, rowcount + 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
302
303         rowcount++;
304
305         /* Simplify Subject */
306         checkbtn_simplify_subject = gtk_check_button_new_with_label(_("Simplify Subject RegExp"));
307         gtk_table_attach(GTK_TABLE(table), checkbtn_simplify_subject, 0, 1, 
308                          rowcount, rowcount + 1, GTK_SHRINK | GTK_FILL, GTK_FILL, 0, 0);
309         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_simplify_subject), 
310                                      item->prefs->enable_simplify_subject);
311
312         g_signal_connect(G_OBJECT(checkbtn_simplify_subject), "toggled",
313                         G_CALLBACK(folder_regexp_set_subject_example_cb), page);
314
315         entry_simplify_subject = gtk_entry_new();
316         gtk_table_attach(GTK_TABLE(table), entry_simplify_subject, 1, 3, 
317                          rowcount, rowcount + 1, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
318         SET_TOGGLE_SENSITIVITY(checkbtn_simplify_subject, entry_simplify_subject);
319         gtk_entry_set_text(GTK_ENTRY(entry_simplify_subject), 
320                            SAFE_STRING(item->prefs->simplify_subject_regexp));
321
322         g_signal_connect(G_OBJECT(entry_simplify_subject), "changed",
323                         G_CALLBACK(folder_regexp_test_cb), page);
324
325         simplify_subject_rec_checkbtn = gtk_check_button_new();
326         gtk_table_attach(GTK_TABLE(table), simplify_subject_rec_checkbtn, 3, 4, 
327                          rowcount, rowcount + 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
328
329         rowcount++;
330
331         /* Test RegExp */
332         label_regexp_test = gtk_label_new(_("Test RegExp"));
333         gtk_misc_set_alignment(GTK_MISC(label_regexp_test), 0, 0.5);
334         gtk_table_attach(GTK_TABLE(table), label_regexp_test, 0, 1, 
335                          rowcount, rowcount + 1, GTK_SHRINK | GTK_FILL, GTK_FILL, 0, 0);
336         SET_TOGGLE_SENSITIVITY(checkbtn_simplify_subject, label_regexp_test);
337
338         entry_regexp_test_string = gtk_entry_new();
339         gtk_table_attach(GTK_TABLE(table), entry_regexp_test_string, 1, 2, 
340                          rowcount, rowcount + 1, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
341         SET_TOGGLE_SENSITIVITY(checkbtn_simplify_subject, entry_regexp_test_string);
342
343         g_signal_connect(G_OBJECT(entry_regexp_test_string), "changed",
344                         G_CALLBACK(folder_regexp_test_cb), page);
345
346         hbox_regexp = gtk_hbox_new (FALSE, 4);
347         gtk_widget_show (hbox_regexp);
348         gtk_table_attach(GTK_TABLE(table), hbox_regexp, 2, 3, 
349                          rowcount, rowcount + 1, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
350
351         left_arrow = gtk_arrow_new(GTK_ARROW_RIGHT, GTK_SHADOW_OUT);
352         gtk_widget_show(left_arrow);
353         gtk_box_pack_start (GTK_BOX(hbox_regexp), left_arrow, FALSE, FALSE, 0);
354         SET_TOGGLE_SENSITIVITY(checkbtn_simplify_subject, left_arrow);
355
356         entry_regexp_test_result = gtk_entry_new();
357         gtk_box_pack_end (GTK_BOX(hbox_regexp), entry_regexp_test_result, TRUE, TRUE, 0);
358         SET_TOGGLE_SENSITIVITY(checkbtn_simplify_subject, entry_regexp_test_result);
359         gtk_entry_set_editable(GTK_ENTRY(entry_regexp_test_result), FALSE);
360
361         rowcount++;
362
363         /* Folder chmod */
364         checkbtn_folder_chmod = gtk_check_button_new_with_label(_("Folder chmod"));
365         gtk_table_attach(GTK_TABLE(table), checkbtn_folder_chmod, 0, 1, 
366                          rowcount, rowcount + 1, GTK_SHRINK | GTK_FILL, GTK_FILL, 0, 0);
367
368         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_folder_chmod), 
369                                      item->prefs->enable_folder_chmod);
370
371         entry_folder_chmod = gtk_entry_new();
372         gtk_table_attach(GTK_TABLE(table), entry_folder_chmod, 1, 2, 
373                          rowcount, rowcount + 1, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
374         SET_TOGGLE_SENSITIVITY(checkbtn_folder_chmod, entry_folder_chmod);
375         if (item->prefs->folder_chmod) {
376                 gchar *buf;
377
378                 buf = g_strdup_printf("%o", item->prefs->folder_chmod);
379                 gtk_entry_set_text(GTK_ENTRY(entry_folder_chmod), buf);
380                 g_free(buf);
381         }
382         
383         folder_chmod_rec_checkbtn = gtk_check_button_new();
384         gtk_table_attach(GTK_TABLE(table), folder_chmod_rec_checkbtn, 3, 4, 
385                          rowcount, rowcount + 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
386
387         rowcount++;
388         
389         /* Folder color */
390         folder_color = gtk_label_new(_("Folder color"));
391         gtk_misc_set_alignment(GTK_MISC(folder_color), 0, 0.5);
392         gtk_table_attach(GTK_TABLE(table), folder_color, 0, 1, 
393                          rowcount, rowcount + 1, GTK_SHRINK | GTK_FILL, GTK_FILL, 0, 0);
394
395         hbox = gtk_hbox_new(FALSE, 0);
396         gtk_table_attach(GTK_TABLE(table), hbox, 1, 2, 
397                          rowcount, rowcount + 1, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
398
399         folder_color_btn = gtk_button_new_with_label("");
400         gtk_widget_set_size_request(folder_color_btn, 36, 26);
401         gtk_box_pack_start (GTK_BOX(hbox), folder_color_btn, FALSE, FALSE, 0);
402         gtk_tooltips_set_tip(tooltips, folder_color_btn,
403                              _("Pick color for folder"), NULL);
404
405         page->folder_color = item->prefs->color;
406
407         g_signal_connect(G_OBJECT(folder_color_btn), "clicked",
408                          G_CALLBACK(folder_color_set_dialog),
409                          page);
410
411         gtkut_set_widget_bgcolor_rgb(folder_color_btn, item->prefs->color);
412
413         folder_color_rec_checkbtn = gtk_check_button_new();
414         gtk_table_attach(GTK_TABLE(table), folder_color_rec_checkbtn, 3, 4, 
415                          rowcount, rowcount + 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
416
417         rowcount++;
418
419         /* Enable processing at startup */
420         checkbtn_enable_processing = gtk_check_button_new_with_label(_("Process at start-up"));
421         gtk_table_attach(GTK_TABLE(table), checkbtn_enable_processing, 0, 2, 
422                          rowcount, rowcount + 1, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
423
424         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_enable_processing), 
425                                      item->prefs->enable_processing);
426
427         enable_processing_rec_checkbtn = gtk_check_button_new();
428         gtk_table_attach(GTK_TABLE(table), enable_processing_rec_checkbtn, 3, 4, 
429                          rowcount, rowcount + 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
430         
431         rowcount++;
432
433         /* Check folder for new mail */
434         checkbtn_newmailcheck = gtk_check_button_new_with_label(_("Scan for new mail"));
435         gtk_tooltips_set_tip(tooltips, checkbtn_newmailcheck,
436                              _("Turn this option on if mail is delivered directly "
437                                "to this folder by server side filtering on IMAP or "
438                                "by an external application"), NULL);
439         gtk_table_attach(GTK_TABLE(table), checkbtn_newmailcheck, 0, 2,
440                          rowcount, rowcount+1, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
441         
442         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_newmailcheck),
443                                                                  item->prefs->newmailcheck);
444         newmailcheck_rec_checkbtn = gtk_check_button_new();
445         gtk_table_attach(GTK_TABLE(table), newmailcheck_rec_checkbtn, 3, 4, 
446                          rowcount, rowcount + 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
447
448         rowcount++;
449
450         /* Synchronise folder for offline use */
451         checkbtn_offlinesync = gtk_check_button_new_with_label(_("Synchronise for offline use"));
452         gtk_table_attach(GTK_TABLE(table), checkbtn_offlinesync, 0, 2,
453                          rowcount, rowcount+1, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
454         
455         offlinesync_rec_checkbtn = gtk_check_button_new();
456         gtk_table_attach(GTK_TABLE(table), offlinesync_rec_checkbtn, 3, 4, 
457                          rowcount, rowcount + 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
458
459         rowcount++;
460
461         hbox = gtk_hbox_new (FALSE, 8);
462         gtk_widget_show (hbox);
463         gtk_table_attach(GTK_TABLE(table), hbox, 0, 4,
464                          rowcount, rowcount+1, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
465         rowcount++;
466
467         hbox_spc = gtk_hbox_new (FALSE, 0);
468         gtk_widget_show (hbox_spc);
469         gtk_box_pack_start (GTK_BOX (hbox), hbox_spc, FALSE, FALSE, 0);
470         gtk_widget_set_size_request (hbox_spc, 12, -1);
471
472         label_offlinesync = gtk_label_new(_("Fetch message bodies from the last"));
473         gtk_widget_show (label_offlinesync);
474         gtk_box_pack_start (GTK_BOX (hbox), label_offlinesync, FALSE, FALSE, 0);
475
476         entry_offlinesync = gtk_entry_new();
477         gtk_widget_set_size_request (entry_offlinesync, 64, -1);
478         gtk_widget_show (entry_offlinesync);
479         gtk_tooltips_set_tip(tooltips, entry_offlinesync, _("0: all bodies"), NULL);
480         gtk_box_pack_start (GTK_BOX (hbox), entry_offlinesync, FALSE, FALSE, 0);
481
482         label_end_offlinesync = gtk_label_new(_("days"));
483         gtk_widget_show (label_end_offlinesync);
484         gtk_box_pack_start (GTK_BOX (hbox), label_end_offlinesync, FALSE, FALSE, 0);
485
486         checkbtn_remove_old_offlinesync = gtk_check_button_new_with_label(
487                                                 _("Remove older messages bodies"));
488
489         hbox2 = gtk_hbox_new (FALSE, 8);
490         gtk_widget_show (hbox2);
491         gtk_table_attach(GTK_TABLE(table), hbox2, 0, 4,
492                          rowcount, rowcount+1, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
493         rowcount++;
494
495         hbox_spc = gtk_hbox_new (FALSE, 0);
496         gtk_widget_show (hbox_spc);
497         gtk_box_pack_start (GTK_BOX (hbox2), hbox_spc, FALSE, FALSE, 0);
498         gtk_widget_set_size_request (hbox_spc, 12, -1);
499         gtk_box_pack_start (GTK_BOX (hbox2), checkbtn_remove_old_offlinesync, FALSE, FALSE, 0);
500
501         SET_TOGGLE_SENSITIVITY (checkbtn_offlinesync, hbox);
502         SET_TOGGLE_SENSITIVITY (checkbtn_offlinesync, hbox2);
503         
504         gtk_widget_show_all(table);
505
506         if (item->folder && (item->folder->klass->type != F_IMAP && 
507             item->folder->klass->type != F_NEWS)) {
508                 item->prefs->offlinesync = TRUE;
509                 item->prefs->offlinesync_days = 0;
510                 item->prefs->remove_old_bodies = FALSE;
511
512                 gtk_widget_set_sensitive(GTK_WIDGET(checkbtn_offlinesync),
513                                                                  FALSE);
514                 gtk_widget_set_sensitive(GTK_WIDGET(offlinesync_rec_checkbtn),
515                                                                  FALSE);
516                 gtk_widget_hide(GTK_WIDGET(checkbtn_offlinesync));
517                 gtk_widget_hide(GTK_WIDGET(hbox));
518                 gtk_widget_hide(GTK_WIDGET(hbox2));
519                 gtk_widget_hide(GTK_WIDGET(offlinesync_rec_checkbtn));
520         
521         }
522         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_offlinesync),
523                                                                  item->prefs->offlinesync);
524         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_remove_old_offlinesync),
525                                                                  item->prefs->remove_old_bodies);
526         gtk_entry_set_text(GTK_ENTRY(entry_offlinesync), itos(item->prefs->offlinesync_days));
527
528         page->table = table;
529         page->folder_type = folder_type;
530         page->no_save_warning = no_save_warning;
531         page->checkbtn_simplify_subject = checkbtn_simplify_subject;
532         page->entry_simplify_subject = entry_simplify_subject;
533         page->entry_regexp_test_string = entry_regexp_test_string;
534         page->entry_regexp_test_result = entry_regexp_test_result;
535         page->checkbtn_folder_chmod = checkbtn_folder_chmod;
536         page->entry_folder_chmod = entry_folder_chmod;
537         page->folder_color_btn = folder_color_btn;
538         page->checkbtn_enable_processing = checkbtn_enable_processing;
539         page->checkbtn_newmailcheck = checkbtn_newmailcheck;
540         page->checkbtn_offlinesync = checkbtn_offlinesync;
541         page->label_offlinesync = label_offlinesync;
542         page->entry_offlinesync = entry_offlinesync;
543         page->label_end_offlinesync = label_end_offlinesync;
544         page->checkbtn_remove_old_offlinesync = checkbtn_remove_old_offlinesync;
545
546         page->simplify_subject_rec_checkbtn  = simplify_subject_rec_checkbtn;
547         page->folder_chmod_rec_checkbtn      = folder_chmod_rec_checkbtn;
548         page->folder_color_rec_checkbtn      = folder_color_rec_checkbtn;
549         page->enable_processing_rec_checkbtn = enable_processing_rec_checkbtn;
550         page->newmailcheck_rec_checkbtn      = newmailcheck_rec_checkbtn;
551         page->offlinesync_rec_checkbtn       = offlinesync_rec_checkbtn;
552
553         page->page.widget = table;
554
555         folder_regexp_set_subject_example_cb(NULL, page);
556 }
557
558 static void prefs_folder_item_general_destroy_widget_func(PrefsPage *page_) 
559 {
560         /* FolderItemGeneralPage *page = (FolderItemGeneralPage *) page_; */
561 }
562
563 /** \brief  Save the prefs in page to folder.
564  *
565  *  If the folder is not the one  specified in page->item, then only those properties 
566  *  that have the relevant 'apply to sub folders' button checked are saved
567  */
568 static void general_save_folder_prefs(FolderItem *folder, FolderItemGeneralPage *page)
569 {
570         FolderItemPrefs *prefs = folder->prefs;
571         gchar *buf;
572         gboolean all = FALSE;
573         SpecialFolderItemType type = F_NORMAL;
574
575         if (folder->path == NULL)
576                 return;
577
578         g_return_if_fail(prefs != NULL);
579
580         if (page->item == folder) 
581                 all = TRUE;
582
583         type = combobox_get_active_data(GTK_COMBO_BOX(page->folder_type));
584         if (all && folder->stype != type) {
585                 folder_item_change_type(folder, type);
586         }
587
588         if (all || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->simplify_subject_rec_checkbtn))) {
589                 prefs->enable_simplify_subject =
590                         gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_simplify_subject));
591                 ASSIGN_STRING(prefs->simplify_subject_regexp,
592                               gtk_editable_get_chars(GTK_EDITABLE(page->entry_simplify_subject), 0, -1));
593         }
594         
595         if (all || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->folder_chmod_rec_checkbtn))) {
596                 prefs->enable_folder_chmod = 
597                         gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_folder_chmod));
598                 buf = gtk_editable_get_chars(GTK_EDITABLE(page->entry_folder_chmod), 0, -1);
599                 prefs->folder_chmod = prefs_folder_item_chmod_mode(buf);
600                 g_free(buf);
601         }
602
603         if (all || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->folder_color_rec_checkbtn))) {
604                 int old_color = prefs->color;
605                 prefs->color = page->folder_color;
606         
607                 /* update folder view */
608                 if (prefs->color != old_color)
609                         folder_item_update(folder, F_ITEM_UPDATE_MSGCNT);
610         }
611
612         if (all || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->enable_processing_rec_checkbtn))) {
613                 prefs->enable_processing = 
614                         gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_enable_processing));
615         }
616
617         if (all ||  gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->newmailcheck_rec_checkbtn))) {
618                 prefs->newmailcheck = 
619                         gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_newmailcheck));
620         }
621
622         if (all ||  gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->offlinesync_rec_checkbtn))) {
623                 prefs->offlinesync = 
624                         gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_offlinesync));
625                 prefs->offlinesync_days = 
626                         atoi(gtk_entry_get_text(GTK_ENTRY(page->entry_offlinesync)));
627                 prefs->remove_old_bodies =
628                         gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_remove_old_offlinesync));
629         }
630
631         folder_item_prefs_save_config(folder);
632 }       
633
634 static gboolean general_save_recurse_func(GNode *node, gpointer data)
635 {
636         FolderItem *item = (FolderItem *) node->data;
637         FolderItemGeneralPage *page = (FolderItemGeneralPage *) data;
638
639         g_return_val_if_fail(item != NULL, TRUE);
640         g_return_val_if_fail(page != NULL, TRUE);
641
642         general_save_folder_prefs(item, page);
643
644         /* optimise by not continuing if none of the 'apply to sub folders'
645            check boxes are selected - and optimise the checking by only doing
646            it once */
647         if ((node == page->item->node) &&
648             !(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->simplify_subject_rec_checkbtn)) ||
649               gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->folder_chmod_rec_checkbtn)) ||
650               gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->folder_color_rec_checkbtn)) ||
651               gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->enable_processing_rec_checkbtn)) ||
652               gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->newmailcheck_rec_checkbtn)) ||
653               gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->offlinesync_rec_checkbtn))))
654                 return TRUE;
655         else 
656                 return FALSE;
657 }
658
659 static void prefs_folder_item_general_save_func(PrefsPage *page_) 
660 {
661         FolderItemGeneralPage *page = (FolderItemGeneralPage *) page_;
662
663         g_node_traverse(page->item->node, G_PRE_ORDER, G_TRAVERSE_ALL,
664                         -1, general_save_recurse_func, page);
665         
666         main_window_set_menu_sensitive(mainwindow_get_mainwindow());
667
668 }
669
670 static RecvProtocol item_protocol(FolderItem *item)
671 {
672         if (!item)
673                 return A_NONE;
674         if (!item->folder)
675                 return A_NONE;
676         if (!item->folder->account)
677                 return A_NONE;
678         return item->folder->account->protocol;
679 }
680
681 static void prefs_folder_item_compose_create_widget_func(PrefsPage * page_,
682                                                    GtkWindow * window,
683                                                    gpointer data)
684 {
685         FolderItemComposePage *page = (FolderItemComposePage *) page_;
686         FolderItem *item = (FolderItem *) data;
687         guint rowcount;
688
689         GtkWidget *table;
690         GtkWidget *label;
691         
692         GtkWidget *no_save_warning = NULL;
693         GtkWidget *checkbtn_request_return_receipt = NULL;
694         GtkWidget *checkbtn_save_copy_to_folder = NULL;
695         GtkWidget *checkbtn_default_to = NULL;
696         GtkWidget *entry_default_to = NULL;
697         GtkWidget *checkbtn_default_reply_to = NULL;
698         GtkWidget *entry_default_reply_to = NULL;
699         GtkWidget *checkbtn_enable_default_account = NULL;
700         GtkWidget *optmenu_default_account = NULL;
701         GtkListStore *optmenu_default_account_menu = NULL;
702         GtkTreeIter iter;
703 #if USE_ASPELL
704         GtkWidget *checkbtn_enable_default_dictionary = NULL;
705         GtkWidget *optmenu_default_dictionary = NULL;
706         GtkWidget *checkbtn_enable_default_alt_dictionary = NULL;
707         GtkWidget *optmenu_default_alt_dictionary = NULL;
708 #endif
709         GtkWidget *request_return_receipt_rec_checkbtn = NULL;
710         GtkWidget *save_copy_to_folder_rec_checkbtn = NULL;
711         GtkWidget *default_to_rec_checkbtn = NULL;
712         GtkWidget *default_reply_to_rec_checkbtn = NULL;
713         GtkWidget *default_account_rec_checkbtn = NULL;\f
714 #if USE_ASPELL
715         GtkWidget *default_dictionary_rec_checkbtn = NULL;
716         GtkWidget *default_alt_dictionary_rec_checkbtn = NULL;
717 #endif
718
719         GList *cur_ac;
720         GList *account_list;
721 #if USE_ASPELL
722         gchar *dictionary;
723 #endif
724         PrefsAccount *ac_prefs;
725         GtkOptionMenu *optmenu;
726         GtkWidget *menu;
727         GtkWidget *menuitem;
728
729         page->item         = item;
730
731         /* Table */
732 #if USE_ASPELL
733 # define TABLEHEIGHT 7
734 #else
735 # define TABLEHEIGHT 6
736 #endif
737         table = gtk_table_new(TABLEHEIGHT, 3, FALSE);
738         gtk_container_set_border_width (GTK_CONTAINER (table), VBOX_BORDER);
739         gtk_table_set_row_spacings(GTK_TABLE(table), 4);
740         gtk_table_set_col_spacings(GTK_TABLE(table), 4);
741         rowcount = 0;
742
743         if (!can_save) {
744                 no_save_warning = gtk_label_new(
745                         _("<i>These preferences will not be saved as this folder "
746                         "is a top-level one. However you can use them to set them "
747                         "to the whole mailbox tree using \"Apply to subfolders\".</i>"));
748                 gtk_label_set_use_markup(GTK_LABEL(no_save_warning), TRUE);
749                 gtk_label_set_line_wrap(GTK_LABEL(no_save_warning), TRUE);
750                 gtk_misc_set_alignment(GTK_MISC(no_save_warning), 0.0, 0.5);
751                 gtk_table_attach(GTK_TABLE(table), no_save_warning, 0, 3,
752                          rowcount, rowcount + 1, GTK_FILL, 0, 0, 0);
753                 rowcount++;
754         }
755         
756         /* Apply to subfolders */
757         label = gtk_label_new(_("Apply to\nsubfolders"));
758         gtk_misc_set_alignment(GTK_MISC(label), 0.5, 0.5);
759         gtk_table_attach(GTK_TABLE(table), label, 2, 3,
760                          rowcount, rowcount + 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
761         rowcount++;
762
763         if (item_protocol(item) != A_NNTP) {
764                 /* Request Return Receipt */
765                 checkbtn_request_return_receipt = gtk_check_button_new_with_label
766                         (_("Request Return Receipt"));
767                 gtk_table_attach(GTK_TABLE(table), checkbtn_request_return_receipt, 
768                                  0, 2, rowcount, rowcount + 1, GTK_SHRINK | GTK_FILL, 
769                                  GTK_FILL, 0, 0);
770                 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_request_return_receipt),
771                                              item->ret_rcpt ? TRUE : FALSE);
772
773                 request_return_receipt_rec_checkbtn = gtk_check_button_new();
774                 gtk_table_attach(GTK_TABLE(table), request_return_receipt_rec_checkbtn, 2, 3, 
775                                  rowcount, rowcount + 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
776
777                 rowcount++;
778
779                 /* Save Copy to Folder */
780                 checkbtn_save_copy_to_folder = gtk_check_button_new_with_label
781                         (_("Save copy of outgoing messages to this folder instead of Sent"));
782                 gtk_table_attach(GTK_TABLE(table), checkbtn_save_copy_to_folder, 0, 2, 
783                                  rowcount, rowcount + 1, GTK_SHRINK | GTK_FILL, GTK_FILL, 0, 0);
784                 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_save_copy_to_folder),
785                                              item->prefs->save_copy_to_folder ? TRUE : FALSE);
786
787                 save_copy_to_folder_rec_checkbtn = gtk_check_button_new();
788                 gtk_table_attach(GTK_TABLE(table), save_copy_to_folder_rec_checkbtn, 2, 3, 
789                                  rowcount, rowcount + 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
790
791                 rowcount++;
792
793                 /* Default To */
794                 checkbtn_default_to = gtk_check_button_new_with_label(_("Default To:"));
795                 gtk_table_attach(GTK_TABLE(table), checkbtn_default_to, 0, 1, 
796                                  rowcount, rowcount + 1, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 0, 0);
797                 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_default_to), 
798                                              item->prefs->enable_default_to);
799
800                 entry_default_to = gtk_entry_new();
801                 gtk_table_attach(GTK_TABLE(table), entry_default_to, 1, 2,
802                                  rowcount, rowcount + 1, GTK_EXPAND | GTK_FILL, GTK_SHRINK, 0, 0);
803                 SET_TOGGLE_SENSITIVITY(checkbtn_default_to, entry_default_to);
804                 gtk_entry_set_text(GTK_ENTRY(entry_default_to), SAFE_STRING(item->prefs->default_to));
805                 address_completion_register_entry(GTK_ENTRY(entry_default_to),
806                                 TRUE);
807
808                 default_to_rec_checkbtn = gtk_check_button_new();
809                 gtk_table_attach(GTK_TABLE(table), default_to_rec_checkbtn, 2, 3, 
810                                  rowcount, rowcount + 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
811
812                 rowcount++;
813
814                 /* Default address to reply to */
815                 checkbtn_default_reply_to = gtk_check_button_new_with_label(_("Default To: for replies"));
816                 gtk_table_attach(GTK_TABLE(table), checkbtn_default_reply_to, 0, 1, 
817                                  rowcount, rowcount + 1, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 0, 0);
818                 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_default_reply_to), 
819                                              item->prefs->enable_default_reply_to);
820
821                 entry_default_reply_to = gtk_entry_new();
822                 gtk_table_attach(GTK_TABLE(table), entry_default_reply_to, 1, 2,
823                                  rowcount, rowcount + 1, GTK_EXPAND | GTK_FILL, GTK_SHRINK, 0, 0);
824                 SET_TOGGLE_SENSITIVITY(checkbtn_default_reply_to, entry_default_reply_to);
825                 gtk_entry_set_text(GTK_ENTRY(entry_default_reply_to), SAFE_STRING(item->prefs->default_reply_to));
826                 address_completion_register_entry(
827                                 GTK_ENTRY(entry_default_reply_to), TRUE);
828
829                 default_reply_to_rec_checkbtn = gtk_check_button_new();
830                 gtk_table_attach(GTK_TABLE(table), default_reply_to_rec_checkbtn, 2, 3, 
831                                  rowcount, rowcount + 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
832
833                 rowcount++;
834         }
835         /* Default account */
836         checkbtn_enable_default_account = gtk_check_button_new_with_label(_("Default account"));
837         gtk_table_attach(GTK_TABLE(table), checkbtn_enable_default_account, 0, 1, 
838                          rowcount, rowcount + 1, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 0, 0);
839         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_enable_default_account), 
840                                      item->prefs->enable_default_account);
841
842         optmenu_default_account = gtkut_sc_combobox_create(NULL, FALSE);
843         gtk_table_attach(GTK_TABLE(table), optmenu_default_account, 1, 2, 
844                          rowcount, rowcount + 1, GTK_EXPAND | GTK_FILL, GTK_SHRINK, 0, 0);
845         optmenu_default_account_menu = GTK_LIST_STORE(
846                         gtk_combo_box_get_model(GTK_COMBO_BOX(optmenu_default_account)));
847
848         account_list = account_get_list();
849         for (cur_ac = account_list; cur_ac != NULL; cur_ac = cur_ac->next) {
850                 ac_prefs = (PrefsAccount *)cur_ac->data;
851                 if (item->folder->account &&
852                     ( (item_protocol(item) == A_NNTP && ac_prefs->protocol != A_NNTP)
853                     ||(item_protocol(item) != A_NNTP && ac_prefs->protocol == A_NNTP))) 
854                         continue;
855
856                 if (item->folder->klass->type != F_NEWS && ac_prefs->protocol == A_NNTP)
857                         continue;
858
859                 COMBOBOX_ADD (optmenu_default_account_menu,
860                                         ac_prefs->account_name?ac_prefs->account_name : _("Untitled"),
861                                         ac_prefs->account_id);
862
863                 /* Set combobox to current default account id */
864                 if (ac_prefs->account_id == item->prefs->default_account)
865                         combobox_select_by_data(GTK_COMBO_BOX(optmenu_default_account),
866                                         ac_prefs->account_id);
867         }
868
869         SET_TOGGLE_SENSITIVITY(checkbtn_enable_default_account, optmenu_default_account);
870
871         default_account_rec_checkbtn = gtk_check_button_new();
872         gtk_table_attach(GTK_TABLE(table), default_account_rec_checkbtn, 2, 3, 
873                          rowcount, rowcount + 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
874         rowcount++;
875
876 #if USE_ASPELL
877         /* Default dictionary */
878         checkbtn_enable_default_dictionary = gtk_check_button_new_with_label(_("Default dictionary"));
879         gtk_table_attach(GTK_TABLE(table), checkbtn_enable_default_dictionary, 0, 1,
880                          rowcount, rowcount + 1, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 0, 0);
881         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_enable_default_dictionary),
882                                      item->prefs->enable_default_dictionary);
883
884         optmenu_default_dictionary = gtk_option_menu_new();
885         gtk_table_attach(GTK_TABLE(table), optmenu_default_dictionary, 1, 2,
886                          rowcount, rowcount + 1, GTK_EXPAND | GTK_FILL, GTK_SHRINK, 0, 0);
887
888         gtk_option_menu_set_menu(GTK_OPTION_MENU(optmenu_default_dictionary), 
889                                  gtkaspell_dictionary_option_menu_new(
890                                          prefs_common.aspell_path));
891
892         dictionary = item->prefs->default_dictionary;
893
894         optmenu = GTK_OPTION_MENU(optmenu_default_dictionary);
895
896         menu = gtk_option_menu_get_menu(optmenu);
897         if (dictionary)
898                 gtkaspell_set_dictionary_menu_active_item(optmenu_default_dictionary, dictionary);
899         menuitem = gtk_menu_get_active(GTK_MENU(menu));
900         gtk_menu_item_activate(GTK_MENU_ITEM(menuitem));
901
902         SET_TOGGLE_SENSITIVITY(checkbtn_enable_default_dictionary, optmenu_default_dictionary);
903
904         default_dictionary_rec_checkbtn = gtk_check_button_new();
905         gtk_table_attach(GTK_TABLE(table), default_dictionary_rec_checkbtn, 2, 3, 
906                          rowcount, rowcount + 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
907         
908         rowcount++;
909
910         /* Default dictionary */
911         checkbtn_enable_default_alt_dictionary = gtk_check_button_new_with_label(_("Default alternate dictionary"));
912         gtk_table_attach(GTK_TABLE(table), checkbtn_enable_default_alt_dictionary, 0, 1,
913                          rowcount, rowcount + 1, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 0, 0);
914         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_enable_default_alt_dictionary),
915                                      item->prefs->enable_default_alt_dictionary);
916
917         optmenu_default_alt_dictionary = gtk_option_menu_new();
918         gtk_table_attach(GTK_TABLE(table), optmenu_default_alt_dictionary, 1, 2,
919                          rowcount, rowcount + 1, GTK_EXPAND | GTK_FILL, GTK_SHRINK, 0, 0);
920
921         gtk_option_menu_set_menu(GTK_OPTION_MENU(optmenu_default_alt_dictionary), 
922                                  gtkaspell_dictionary_option_menu_new_with_refresh(
923                                          prefs_common.aspell_path, FALSE));
924
925         dictionary = item->prefs->default_alt_dictionary;
926
927         optmenu = GTK_OPTION_MENU(optmenu_default_alt_dictionary);
928
929         menu = gtk_option_menu_get_menu(optmenu);
930         if (dictionary)
931                 gtkaspell_set_dictionary_menu_active_item(optmenu_default_alt_dictionary, dictionary);
932         menuitem = gtk_menu_get_active(GTK_MENU(menu));
933         gtk_menu_item_activate(GTK_MENU_ITEM(menuitem));
934
935         SET_TOGGLE_SENSITIVITY(checkbtn_enable_default_alt_dictionary, optmenu_default_alt_dictionary);
936
937         default_alt_dictionary_rec_checkbtn = gtk_check_button_new();
938         gtk_table_attach(GTK_TABLE(table), default_alt_dictionary_rec_checkbtn, 2, 3, 
939                          rowcount, rowcount + 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
940         
941         rowcount++;
942 #endif
943
944         gtk_widget_show_all(table);
945
946         page->window = GTK_WIDGET(window);
947         page->table = table;
948         page->no_save_warning = no_save_warning;
949         page->checkbtn_request_return_receipt = checkbtn_request_return_receipt;
950         page->checkbtn_save_copy_to_folder = checkbtn_save_copy_to_folder;
951         page->checkbtn_default_to = checkbtn_default_to;
952         page->entry_default_to = entry_default_to;
953         page->checkbtn_default_reply_to = checkbtn_default_reply_to;
954         page->entry_default_reply_to = entry_default_reply_to;
955         page->checkbtn_enable_default_account = checkbtn_enable_default_account;
956         page->optmenu_default_account = optmenu_default_account;
957 #ifdef USE_ASPELL
958         page->checkbtn_enable_default_dictionary = checkbtn_enable_default_dictionary;
959         page->optmenu_default_dictionary = optmenu_default_dictionary;
960         page->checkbtn_enable_default_alt_dictionary = checkbtn_enable_default_alt_dictionary;
961         page->optmenu_default_alt_dictionary = optmenu_default_alt_dictionary;
962 #endif
963
964         page->request_return_receipt_rec_checkbtn = request_return_receipt_rec_checkbtn;
965         page->save_copy_to_folder_rec_checkbtn    = save_copy_to_folder_rec_checkbtn;
966         page->default_to_rec_checkbtn             = default_to_rec_checkbtn;
967         page->default_reply_to_rec_checkbtn       = default_reply_to_rec_checkbtn;
968         page->default_account_rec_checkbtn        = default_account_rec_checkbtn;
969 #if USE_ASPELL
970         page->default_dictionary_rec_checkbtn = default_dictionary_rec_checkbtn;
971         page->default_alt_dictionary_rec_checkbtn = default_alt_dictionary_rec_checkbtn;
972 #endif
973
974         address_completion_start(page->window);
975
976         page->page.widget = table;
977 }
978
979 static void prefs_folder_item_compose_destroy_widget_func(PrefsPage *page_) 
980 {
981         FolderItemComposePage *page = (FolderItemComposePage *) page_;
982
983         if (page->entry_default_to)
984                 address_completion_unregister_entry(GTK_ENTRY(page->entry_default_to));
985         if (page->entry_default_reply_to)
986                 address_completion_unregister_entry(GTK_ENTRY(page->entry_default_reply_to));
987         address_completion_end(page->window);
988 }
989
990 /** \brief  Save the prefs in page to folder.
991  *
992  *  If the folder is not the one  specified in page->item, then only those properties 
993  *  that have the relevant 'apply to sub folders' button checked are saved
994  */
995 static void compose_save_folder_prefs(FolderItem *folder, FolderItemComposePage *page)
996 {
997         FolderItemPrefs *prefs = folder->prefs;
998         GtkWidget *menu;
999         gboolean all = FALSE;
1000
1001         if (folder->path == NULL)
1002                 return;
1003
1004         if (page->item == folder) 
1005                 all = TRUE;
1006
1007         g_return_if_fail(prefs != NULL);
1008
1009         if (item_protocol(folder) != A_NNTP) {
1010                 if (all || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->request_return_receipt_rec_checkbtn))) {
1011                         prefs->request_return_receipt = 
1012                                 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_request_return_receipt));
1013                         /* MIGRATION */    
1014                         folder->ret_rcpt = prefs->request_return_receipt;
1015                 }
1016
1017                 if (all || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->save_copy_to_folder_rec_checkbtn))) {
1018                         prefs->save_copy_to_folder = 
1019                                 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_save_copy_to_folder));
1020                 }
1021
1022                 if (all || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->default_to_rec_checkbtn))) {
1023
1024                         prefs->enable_default_to = 
1025                                 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_default_to));
1026                         ASSIGN_STRING(prefs->default_to,
1027                                       gtk_editable_get_chars(GTK_EDITABLE(page->entry_default_to), 0, -1));
1028                 }
1029
1030                 if (all || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->default_reply_to_rec_checkbtn))) {
1031                         prefs->enable_default_reply_to = 
1032                                 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_default_reply_to));
1033                         ASSIGN_STRING(prefs->default_reply_to,
1034                                       gtk_editable_get_chars(GTK_EDITABLE(page->entry_default_reply_to), 0, -1));
1035                 }
1036         } else {
1037                 prefs->request_return_receipt = FALSE;
1038                 prefs->save_copy_to_folder = FALSE;
1039                 prefs->enable_default_to = FALSE;
1040                 prefs->enable_default_reply_to = FALSE;
1041         }
1042
1043         if (all || gtk_toggle_button_get_active(
1044                                 GTK_TOGGLE_BUTTON(page->default_account_rec_checkbtn))) {
1045                 prefs->enable_default_account = 
1046                         gtk_toggle_button_get_active(
1047                                         GTK_TOGGLE_BUTTON(page->checkbtn_enable_default_account));
1048                 prefs->default_account = combobox_get_active_data(
1049                                 GTK_COMBO_BOX(page->optmenu_default_account));
1050         }
1051
1052 #if USE_ASPELL
1053         if (all || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->default_dictionary_rec_checkbtn))) {
1054                 prefs->enable_default_dictionary =
1055                         gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_enable_default_dictionary));
1056                 menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(page->optmenu_default_dictionary));
1057                 ASSIGN_STRING(prefs->default_dictionary,
1058                               gtkaspell_get_dictionary_menu_active_item(menu));
1059         }
1060         if (all || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->default_alt_dictionary_rec_checkbtn))) {
1061                 prefs->enable_default_alt_dictionary =
1062                         gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_enable_default_alt_dictionary));
1063                 menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(page->optmenu_default_alt_dictionary));
1064                 ASSIGN_STRING(prefs->default_alt_dictionary,
1065                               gtkaspell_get_dictionary_menu_active_item(menu));
1066         }
1067 #endif
1068
1069         folder_item_prefs_save_config(folder);
1070 }       
1071
1072 static gboolean compose_save_recurse_func(GNode *node, gpointer data)
1073 {
1074         FolderItem *item = (FolderItem *) node->data;
1075         FolderItemComposePage *page = (FolderItemComposePage *) data;
1076
1077         g_return_val_if_fail(item != NULL, TRUE);
1078         g_return_val_if_fail(page != NULL, TRUE);
1079
1080         compose_save_folder_prefs(item, page);
1081
1082         /* optimise by not continuing if none of the 'apply to sub folders'
1083            check boxes are selected - and optimise the checking by only doing
1084            it once */
1085         if ((node == page->item->node) && item_protocol(item) != A_NNTP &&
1086             !(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->request_return_receipt_rec_checkbtn)) ||
1087               gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->save_copy_to_folder_rec_checkbtn)) ||
1088               gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->default_to_rec_checkbtn)) ||
1089               gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->default_account_rec_checkbtn)) ||
1090 #if USE_ASPELL
1091               gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->default_dictionary_rec_checkbtn)) ||
1092               gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->default_alt_dictionary_rec_checkbtn)) ||
1093 #endif
1094               gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->default_reply_to_rec_checkbtn))))
1095                 return TRUE;
1096         else if ((node == page->item->node) && item_protocol(item) == A_NNTP &&
1097             !(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->default_account_rec_checkbtn)) 
1098 #if USE_ASPELL
1099               || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->default_dictionary_rec_checkbtn))
1100               || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->default_alt_dictionary_rec_checkbtn))
1101 #endif
1102                     ))
1103                 return TRUE;
1104         else 
1105                 return FALSE;
1106 }
1107
1108 static void prefs_folder_item_compose_save_func(PrefsPage *page_) 
1109 {
1110         FolderItemComposePage *page = (FolderItemComposePage *) page_;
1111
1112         g_node_traverse(page->item->node, G_PRE_ORDER, G_TRAVERSE_ALL,
1113                         -1, compose_save_recurse_func, page);
1114
1115 }
1116
1117 static void prefs_folder_item_templates_create_widget_func(PrefsPage * page_,
1118                                                    GtkWindow * window,
1119                                                    gpointer data)
1120 {
1121         FolderItemTemplatesPage *page = (FolderItemTemplatesPage *) page_;
1122         FolderItem *item = (FolderItem *) data;
1123
1124         GtkWidget *table;
1125         GtkWidget *label;
1126         guint rowcount;
1127         GtkWidget *vbox;
1128         GtkWidget *alignment;
1129         GtkWidget *new_msg_format_rec_checkbtn;
1130         GtkWidget *reply_format_rec_checkbtn;
1131         GtkWidget *forward_format_rec_checkbtn;
1132
1133         page->item         = item;
1134
1135         /* Table */
1136         table = gtk_table_new(5, 3, FALSE);
1137         gtk_container_set_border_width (GTK_CONTAINER (table), VBOX_BORDER);
1138         gtk_table_set_row_spacings(GTK_TABLE(table), 4);
1139         gtk_table_set_col_spacings(GTK_TABLE(table), 4);
1140         rowcount = 0;
1141
1142         /* Apply to subfolders */
1143         label = gtk_label_new(_("Apply to\nsubfolders"));
1144         gtk_misc_set_alignment(GTK_MISC(label), 0.5, 0.5);
1145         gtk_table_attach(GTK_TABLE(table), label, 2, 3,
1146                          rowcount, rowcount + 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
1147         rowcount++;
1148
1149         /* compose format */
1150         vbox = gtk_vbox_new (FALSE, VSPACING);
1151         gtk_widget_show (vbox);
1152         gtk_container_set_border_width (GTK_CONTAINER (vbox), 0);
1153         gtk_table_attach(GTK_TABLE(table), vbox, 1, 2, 
1154                          rowcount, rowcount + 1, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
1155
1156         quotefmt_create_new_msg_fmt_widgets(
1157                                 window,
1158                                 vbox,
1159                                 &page->checkbtn_compose_with_format,
1160                                 _("Use a specific format for new messages"),
1161                                 &page->compose_subject_format,
1162                                 &page->compose_body_format,
1163                                 FALSE);
1164
1165         vbox = gtk_vbox_new (FALSE, VSPACING);
1166         gtk_widget_show (vbox);
1167         gtk_container_set_border_width (GTK_CONTAINER (vbox), 0);
1168         gtk_table_attach(GTK_TABLE(table), vbox, 2, 3, 
1169                          rowcount, rowcount + 1, GTK_SHRINK, GTK_FILL, 0, 0);
1170
1171         new_msg_format_rec_checkbtn = gtk_check_button_new();
1172         gtk_box_pack_start (GTK_BOX(vbox), new_msg_format_rec_checkbtn, FALSE, FALSE, 0);
1173         alignment = gtk_alignment_new(0, 1, 0, 0);      
1174         gtk_box_pack_start (GTK_BOX(vbox), alignment, FALSE, FALSE, 0);
1175
1176         rowcount++;
1177
1178         /* reply format */
1179         vbox = gtk_vbox_new (FALSE, VSPACING);
1180         gtk_widget_show (vbox);
1181         gtk_container_set_border_width (GTK_CONTAINER (vbox), 0);
1182         gtk_table_attach(GTK_TABLE(table), vbox, 1, 2, 
1183                          rowcount, rowcount + 1, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
1184
1185         quotefmt_create_reply_fmt_widgets(
1186                                 window,
1187                                 vbox,
1188                                 &page->checkbtn_reply_with_format,
1189                                 _("Use a specific reply quote format"),
1190                                 &page->reply_quotemark,
1191                                 &page->reply_body_format,
1192                                 FALSE);
1193
1194         vbox = gtk_vbox_new (FALSE, VSPACING);
1195         gtk_widget_show (vbox);
1196         gtk_container_set_border_width (GTK_CONTAINER (vbox), 0);
1197         gtk_table_attach(GTK_TABLE(table), vbox, 2, 3, 
1198                          rowcount, rowcount + 1, GTK_SHRINK, GTK_FILL, 0, 0);
1199
1200         reply_format_rec_checkbtn = gtk_check_button_new();
1201         gtk_box_pack_start (GTK_BOX(vbox), reply_format_rec_checkbtn, FALSE, FALSE, 0);
1202         alignment = gtk_alignment_new(0, 1, 0, 0);      
1203         gtk_box_pack_start (GTK_BOX(vbox), alignment, FALSE, FALSE, 0);
1204
1205         rowcount++;
1206
1207         /* forward format */
1208         vbox = gtk_vbox_new (FALSE, VSPACING);
1209         gtk_widget_show (vbox);
1210         gtk_container_set_border_width (GTK_CONTAINER (vbox), 0);
1211         gtk_table_attach(GTK_TABLE(table), vbox, 1, 2, 
1212                          rowcount, rowcount + 1, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
1213
1214         quotefmt_create_forward_fmt_widgets(
1215                                 window,
1216                                 vbox,
1217                                 &page->checkbtn_forward_with_format,
1218                                 _("Use a specific forward quote format"),
1219                                 &page->forward_quotemark,
1220                                 &page->forward_body_format,
1221                                 FALSE);
1222
1223         vbox = gtk_vbox_new (FALSE, VSPACING);
1224         gtk_widget_show (vbox);
1225         gtk_container_set_border_width (GTK_CONTAINER (vbox), 0);
1226         gtk_table_attach(GTK_TABLE(table), vbox, 2, 3, 
1227                          rowcount, rowcount + 1, GTK_SHRINK, GTK_FILL, 0, 0);
1228
1229         forward_format_rec_checkbtn = gtk_check_button_new();
1230         gtk_box_pack_start (GTK_BOX(vbox), forward_format_rec_checkbtn, FALSE, FALSE, 0);
1231         alignment = gtk_alignment_new(0, 1, 0, 0);      
1232         gtk_box_pack_start (GTK_BOX(vbox), alignment, FALSE, FALSE, 0);
1233
1234         rowcount++;
1235
1236         /* information button */
1237         vbox = gtk_vbox_new (FALSE, VSPACING);
1238         gtk_widget_show (vbox);
1239         gtk_container_set_border_width (GTK_CONTAINER (vbox), 0);
1240         gtk_table_attach(GTK_TABLE(table), vbox, 1, 2, 
1241                          rowcount, rowcount + 1, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
1242         rowcount++;
1243         quotefmt_add_info_button(window, vbox);
1244
1245
1246         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(page->checkbtn_compose_with_format),
1247                         item->prefs->compose_with_format);
1248         pref_set_entry_from_pref(GTK_ENTRY(page->compose_subject_format),
1249                         item->prefs->compose_subject_format);
1250         pref_set_textview_from_pref(GTK_TEXT_VIEW(page->compose_body_format),
1251                         item->prefs->compose_body_format);
1252
1253         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(page->checkbtn_reply_with_format),
1254                         item->prefs->reply_with_format);
1255         pref_set_entry_from_pref(GTK_ENTRY(page->reply_quotemark),
1256                         item->prefs->reply_quotemark);
1257         pref_set_textview_from_pref(GTK_TEXT_VIEW(page->reply_body_format),
1258                         item->prefs->reply_body_format);
1259
1260         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(page->checkbtn_forward_with_format),
1261                         item->prefs->forward_with_format);
1262         pref_set_entry_from_pref(GTK_ENTRY(page->forward_quotemark),
1263                         item->prefs->forward_quotemark);
1264         pref_set_textview_from_pref(GTK_TEXT_VIEW(page->forward_body_format),
1265                         item->prefs->forward_body_format);
1266
1267         gtk_widget_show_all(table);
1268
1269         page->window = GTK_WIDGET(window);
1270         page->table = table;
1271
1272         page->new_msg_format_rec_checkbtn = new_msg_format_rec_checkbtn;
1273         page->reply_format_rec_checkbtn = reply_format_rec_checkbtn;
1274         page->forward_format_rec_checkbtn = forward_format_rec_checkbtn;
1275
1276         page->page.widget = table;
1277 }
1278
1279 static void prefs_folder_item_templates_destroy_widget_func(PrefsPage *page_) 
1280 {
1281         /* FolderItemTemplatesPage *page = (FolderItemTemplatesPage *) page_; */
1282 }
1283
1284 /** \brief  Save the prefs in page to folder.
1285  *
1286  *  If the folder is not the one  specified in page->item, then only those properties 
1287  *  that have the relevant 'apply to sub folders' button checked are saved
1288  */
1289 static void templates_save_folder_prefs(FolderItem *folder, FolderItemTemplatesPage *page)
1290 {
1291         FolderItemPrefs *prefs = folder->prefs;
1292         gboolean all = FALSE;
1293
1294         if (folder->path == NULL)
1295                 return;
1296
1297         if (page->item == folder) 
1298                 all = TRUE;
1299
1300         g_return_if_fail(prefs != NULL);
1301
1302         /* save and check formats */
1303
1304         if (all || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->new_msg_format_rec_checkbtn))) {
1305                 prefs->compose_with_format =
1306                         gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_compose_with_format));
1307                 prefs->compose_subject_format = pref_get_pref_from_entry(
1308                                 GTK_ENTRY(page->compose_subject_format));
1309                 prefs->compose_body_format = pref_get_pref_from_textview(
1310                                 GTK_TEXT_VIEW(page->compose_body_format));
1311                 quotefmt_check_new_msg_formats(prefs->compose_with_format,
1312                                                                                 prefs->compose_subject_format,
1313                                                                                 prefs->compose_body_format);
1314         }
1315
1316         if (all || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->reply_format_rec_checkbtn))) {
1317                 prefs->reply_with_format =
1318                         gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_reply_with_format));
1319                 prefs->reply_quotemark = gtk_editable_get_chars(
1320                                 GTK_EDITABLE(page->reply_quotemark), 0, -1);
1321                 prefs->reply_body_format = pref_get_pref_from_textview(
1322                                 GTK_TEXT_VIEW(page->reply_body_format));
1323                 quotefmt_check_reply_formats(prefs->reply_with_format,
1324                                                                                 prefs->reply_quotemark,
1325                                                                                 prefs->reply_body_format);
1326         }
1327
1328         if (all || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->forward_format_rec_checkbtn))) {
1329                 prefs->forward_with_format =
1330                         gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_forward_with_format));
1331                 prefs->forward_quotemark = gtk_editable_get_chars(
1332                                 GTK_EDITABLE(page->forward_quotemark), 0, -1);
1333                 prefs->forward_body_format = pref_get_pref_from_textview(
1334                                 GTK_TEXT_VIEW(page->forward_body_format));
1335                 quotefmt_check_forward_formats(prefs->forward_with_format,
1336                                                                                 prefs->forward_quotemark,
1337                                                                                 prefs->forward_body_format);
1338         }
1339
1340         folder_item_prefs_save_config(folder);
1341 }       
1342
1343 static gboolean templates_save_recurse_func(GNode *node, gpointer data)
1344 {
1345         FolderItem *item = (FolderItem *) node->data;
1346         FolderItemTemplatesPage *page = (FolderItemTemplatesPage *) data;
1347
1348         g_return_val_if_fail(item != NULL, TRUE);
1349         g_return_val_if_fail(page != NULL, TRUE);
1350
1351         templates_save_folder_prefs(item, page);
1352
1353         /* optimise by not continuing if none of the 'apply to sub folders'
1354            check boxes are selected - and optimise the checking by only doing
1355            it once */
1356         if ((node == page->item->node) &&
1357             !(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->new_msg_format_rec_checkbtn)) ||
1358               gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->reply_format_rec_checkbtn)) ||
1359               gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->forward_format_rec_checkbtn))))
1360                 return TRUE;
1361         else 
1362                 return FALSE;
1363
1364         return FALSE;
1365 }
1366
1367 static void prefs_folder_item_templates_save_func(PrefsPage *page_) 
1368 {
1369         FolderItemTemplatesPage *page = (FolderItemTemplatesPage *) page_;
1370
1371         g_node_traverse(page->item->node, G_PRE_ORDER, G_TRAVERSE_ALL,
1372                         -1, templates_save_recurse_func, page);
1373
1374 }
1375
1376 static gint prefs_folder_item_chmod_mode(gchar *folder_chmod) 
1377 {
1378         gint newmode = 0;
1379         gchar *tmp;
1380
1381         if (folder_chmod) {
1382                 newmode = strtol(folder_chmod, &tmp, 8);
1383                 if (!(*(folder_chmod) && !(*tmp)))
1384                         newmode = 0;
1385         }
1386
1387         return newmode;
1388 }
1389
1390 static void folder_color_set_dialog(GtkWidget *widget, gpointer data)
1391 {
1392         FolderItemGeneralPage *page = (FolderItemGeneralPage *) data;
1393         gint rgbcolor;
1394
1395         rgbcolor = colorsel_select_color_rgb(_("Pick color for folder"), 
1396                                              page->folder_color);
1397         gtkut_set_widget_bgcolor_rgb(page->folder_color_btn, rgbcolor);
1398         page->folder_color = rgbcolor;
1399 }
1400
1401 static regex_t *summary_compile_simplify_regexp(gchar *simplify_subject_regexp)
1402 {
1403         int err;
1404         gchar buf[BUFFSIZE];
1405         regex_t *preg = NULL;
1406
1407         preg = g_new0(regex_t, 1);
1408
1409         err = string_match_precompile(simplify_subject_regexp, 
1410                                       preg, REG_EXTENDED);
1411         if (err) {
1412                 regerror(err, preg, buf, BUFFSIZE);
1413                 g_free(preg);
1414                 preg = NULL;
1415         }
1416
1417         return preg;
1418 }
1419
1420 static void folder_regexp_test_cb(GtkWidget *widget, gpointer data)
1421 {
1422         static GdkColor red;
1423         static gboolean colors_initialised = FALSE;
1424         static gchar buf[BUFFSIZE];
1425         FolderItemGeneralPage *page = (FolderItemGeneralPage *)data;
1426         gchar *test_string, *regexp;
1427         regex_t *preg;
1428
1429         regexp = g_strdup(gtk_entry_get_text(GTK_ENTRY(page->entry_simplify_subject)));
1430         test_string = g_strdup(gtk_entry_get_text(GTK_ENTRY(page->entry_regexp_test_string)));
1431
1432         if (!regexp || !regexp[0]) {
1433                 gtk_widget_modify_base(page->entry_simplify_subject,
1434                                 GTK_STATE_NORMAL, NULL);
1435                 if (test_string) {
1436                         gtk_entry_set_text(GTK_ENTRY(page->entry_regexp_test_result), test_string);
1437                         g_free(test_string);
1438                 }
1439                 return;
1440         }
1441
1442         if (!test_string || !test_string[0]) {
1443                 g_free(regexp);
1444                 return;
1445         }
1446
1447         if (!colors_initialised) {
1448                 gdk_color_parse("#ff7070", &red);
1449                 colors_initialised = gdk_colormap_alloc_color(
1450                         gdk_colormap_get_system(), &red, FALSE, TRUE);
1451         }
1452
1453         preg = summary_compile_simplify_regexp(regexp);
1454         if (colors_initialised) {
1455                 gtk_widget_modify_base(page->entry_simplify_subject,
1456                                 GTK_STATE_NORMAL, preg ? NULL : &red);
1457         }
1458
1459         if (preg != NULL) {
1460                 string_remove_match(buf, BUFFSIZE, test_string, preg);
1461
1462                 gtk_entry_set_text(GTK_ENTRY(page->entry_regexp_test_result), buf);
1463
1464                 regfree(preg);
1465                 g_free(preg);
1466         }
1467
1468         g_free(test_string);
1469         g_free(regexp);
1470 }
1471
1472 static gchar *folder_regexp_get_subject_example(void)
1473 {
1474         MsgInfo *msginfo_selected;
1475         SummaryView *summaryview = NULL;
1476
1477         if (!mainwindow_get_mainwindow())
1478                 return NULL;
1479         summaryview = mainwindow_get_mainwindow()->summaryview;
1480
1481         msginfo_selected = summary_get_selected_msg(summaryview);
1482         return msginfo_selected ? g_strdup(msginfo_selected->subject) : NULL;
1483 }
1484
1485 static void folder_regexp_set_subject_example_cb(GtkWidget *widget, gpointer data)
1486 {
1487         FolderItemGeneralPage *page = (FolderItemGeneralPage *)data;
1488
1489         if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_simplify_subject))) {
1490                 gchar *subject = folder_regexp_get_subject_example();
1491                 if (subject) {
1492                         gtk_entry_set_text(GTK_ENTRY(page->entry_regexp_test_string), subject);
1493                         g_free(subject);
1494                 }
1495         }
1496 }
1497
1498 static void register_general_page()
1499 {
1500         static gchar *pfi_general_path[2];
1501         static FolderItemGeneralPage folder_item_general_page;
1502
1503         pfi_general_path[0] = _("General");
1504         pfi_general_path[1] = NULL;
1505
1506         folder_item_general_page.page.path = pfi_general_path;
1507         folder_item_general_page.page.create_widget = prefs_folder_item_general_create_widget_func;
1508         folder_item_general_page.page.destroy_widget = prefs_folder_item_general_destroy_widget_func;
1509         folder_item_general_page.page.save_page = prefs_folder_item_general_save_func;
1510         
1511         prefs_folder_item_register_page((PrefsPage *) &folder_item_general_page);
1512 }
1513
1514
1515 static void register_compose_page(void)
1516 {
1517         static gchar *pfi_compose_path[2];
1518         static FolderItemComposePage folder_item_compose_page;
1519
1520         pfi_compose_path[0] = _("Compose");
1521         pfi_compose_path[1] = NULL;
1522
1523         folder_item_compose_page.page.path = pfi_compose_path;
1524         folder_item_compose_page.page.create_widget = prefs_folder_item_compose_create_widget_func;
1525         folder_item_compose_page.page.destroy_widget = prefs_folder_item_compose_destroy_widget_func;
1526         folder_item_compose_page.page.save_page = prefs_folder_item_compose_save_func;
1527         
1528         prefs_folder_item_register_page((PrefsPage *) &folder_item_compose_page);
1529 }
1530
1531 static void register_templates_page(void)
1532 {
1533         static gchar *pfi_templates_path[2];
1534         static FolderItemTemplatesPage folder_item_templates_page;
1535
1536         pfi_templates_path[0] = _("Templates");
1537         pfi_templates_path[1] = NULL;
1538
1539         folder_item_templates_page.page.path = pfi_templates_path;
1540         folder_item_templates_page.page.create_widget = prefs_folder_item_templates_create_widget_func;
1541         folder_item_templates_page.page.destroy_widget = prefs_folder_item_templates_destroy_widget_func;
1542         folder_item_templates_page.page.save_page = prefs_folder_item_templates_save_func;
1543         
1544         prefs_folder_item_register_page((PrefsPage *) &folder_item_templates_page);
1545 }
1546
1547 static GSList *prefs_pages = NULL;
1548
1549 void prefs_folder_item_open(FolderItem *item)
1550 {
1551         gchar *id, *title;
1552         if (prefs_pages == NULL) {
1553                 register_general_page();
1554                 register_compose_page();
1555                 register_templates_page();
1556         }
1557
1558         if (item->path) {
1559                 id = folder_item_get_identifier (item);
1560                 can_save = TRUE;
1561         } else {
1562                 id = g_strdup(item->name);
1563                 can_save = FALSE;
1564         }
1565         title = g_strdup_printf (_("Properties for folder %s"), id);
1566         g_free (id);
1567         prefswindow_open(title, prefs_pages, item,
1568                         &prefs_common.folderitemwin_width, &prefs_common.folderitemwin_height);
1569         
1570         g_free (title);
1571 }
1572
1573 void prefs_folder_item_register_page(PrefsPage *page)
1574 {
1575         prefs_pages = g_slist_append(prefs_pages, page);
1576 }
1577
1578 void prefs_folder_item_unregister_page(PrefsPage *page)
1579 {
1580         prefs_pages = g_slist_remove(prefs_pages, page);
1581 }