2007-08-08 [ticho] 2.10.0cvs102
[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;
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
726         page->item         = item;
727
728         /* Table */
729 #if USE_ASPELL
730 # define TABLEHEIGHT 7
731 #else
732 # define TABLEHEIGHT 6
733 #endif
734         table = gtk_table_new(TABLEHEIGHT, 3, FALSE);
735         gtk_container_set_border_width (GTK_CONTAINER (table), VBOX_BORDER);
736         gtk_table_set_row_spacings(GTK_TABLE(table), 4);
737         gtk_table_set_col_spacings(GTK_TABLE(table), 4);
738         rowcount = 0;
739
740         if (!can_save) {
741                 no_save_warning = gtk_label_new(
742                         _("<i>These preferences will not be saved as this folder "
743                         "is a top-level one. However you can use them to set them "
744                         "to the whole mailbox tree using \"Apply to subfolders\".</i>"));
745                 gtk_label_set_use_markup(GTK_LABEL(no_save_warning), TRUE);
746                 gtk_label_set_line_wrap(GTK_LABEL(no_save_warning), TRUE);
747                 gtk_misc_set_alignment(GTK_MISC(no_save_warning), 0.0, 0.5);
748                 gtk_table_attach(GTK_TABLE(table), no_save_warning, 0, 3,
749                          rowcount, rowcount + 1, GTK_FILL, 0, 0, 0);
750                 rowcount++;
751         }
752         
753         /* Apply to subfolders */
754         label = gtk_label_new(_("Apply to\nsubfolders"));
755         gtk_misc_set_alignment(GTK_MISC(label), 0.5, 0.5);
756         gtk_table_attach(GTK_TABLE(table), label, 2, 3,
757                          rowcount, rowcount + 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
758         rowcount++;
759
760         if (item_protocol(item) != A_NNTP) {
761                 /* Request Return Receipt */
762                 checkbtn_request_return_receipt = gtk_check_button_new_with_label
763                         (_("Request Return Receipt"));
764                 gtk_table_attach(GTK_TABLE(table), checkbtn_request_return_receipt, 
765                                  0, 2, rowcount, rowcount + 1, GTK_SHRINK | GTK_FILL, 
766                                  GTK_FILL, 0, 0);
767                 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_request_return_receipt),
768                                              item->ret_rcpt ? TRUE : FALSE);
769
770                 request_return_receipt_rec_checkbtn = gtk_check_button_new();
771                 gtk_table_attach(GTK_TABLE(table), request_return_receipt_rec_checkbtn, 2, 3, 
772                                  rowcount, rowcount + 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
773
774                 rowcount++;
775
776                 /* Save Copy to Folder */
777                 checkbtn_save_copy_to_folder = gtk_check_button_new_with_label
778                         (_("Save copy of outgoing messages to this folder instead of Sent"));
779                 gtk_table_attach(GTK_TABLE(table), checkbtn_save_copy_to_folder, 0, 2, 
780                                  rowcount, rowcount + 1, GTK_SHRINK | GTK_FILL, GTK_FILL, 0, 0);
781                 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_save_copy_to_folder),
782                                              item->prefs->save_copy_to_folder ? TRUE : FALSE);
783
784                 save_copy_to_folder_rec_checkbtn = gtk_check_button_new();
785                 gtk_table_attach(GTK_TABLE(table), save_copy_to_folder_rec_checkbtn, 2, 3, 
786                                  rowcount, rowcount + 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
787
788                 rowcount++;
789
790                 /* Default To */
791                 checkbtn_default_to = gtk_check_button_new_with_label(_("Default To:"));
792                 gtk_table_attach(GTK_TABLE(table), checkbtn_default_to, 0, 1, 
793                                  rowcount, rowcount + 1, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 0, 0);
794                 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_default_to), 
795                                              item->prefs->enable_default_to);
796
797                 entry_default_to = gtk_entry_new();
798                 gtk_table_attach(GTK_TABLE(table), entry_default_to, 1, 2,
799                                  rowcount, rowcount + 1, GTK_EXPAND | GTK_FILL, GTK_SHRINK, 0, 0);
800                 SET_TOGGLE_SENSITIVITY(checkbtn_default_to, entry_default_to);
801                 gtk_entry_set_text(GTK_ENTRY(entry_default_to), SAFE_STRING(item->prefs->default_to));
802                 address_completion_register_entry(GTK_ENTRY(entry_default_to),
803                                 TRUE);
804
805                 default_to_rec_checkbtn = gtk_check_button_new();
806                 gtk_table_attach(GTK_TABLE(table), default_to_rec_checkbtn, 2, 3, 
807                                  rowcount, rowcount + 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
808
809                 rowcount++;
810
811                 /* Default address to reply to */
812                 checkbtn_default_reply_to = gtk_check_button_new_with_label(_("Default To: for replies"));
813                 gtk_table_attach(GTK_TABLE(table), checkbtn_default_reply_to, 0, 1, 
814                                  rowcount, rowcount + 1, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 0, 0);
815                 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_default_reply_to), 
816                                              item->prefs->enable_default_reply_to);
817
818                 entry_default_reply_to = gtk_entry_new();
819                 gtk_table_attach(GTK_TABLE(table), entry_default_reply_to, 1, 2,
820                                  rowcount, rowcount + 1, GTK_EXPAND | GTK_FILL, GTK_SHRINK, 0, 0);
821                 SET_TOGGLE_SENSITIVITY(checkbtn_default_reply_to, entry_default_reply_to);
822                 gtk_entry_set_text(GTK_ENTRY(entry_default_reply_to), SAFE_STRING(item->prefs->default_reply_to));
823                 address_completion_register_entry(
824                                 GTK_ENTRY(entry_default_reply_to), TRUE);
825
826                 default_reply_to_rec_checkbtn = gtk_check_button_new();
827                 gtk_table_attach(GTK_TABLE(table), default_reply_to_rec_checkbtn, 2, 3, 
828                                  rowcount, rowcount + 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
829
830                 rowcount++;
831         }
832         /* Default account */
833         checkbtn_enable_default_account = gtk_check_button_new_with_label(_("Default account"));
834         gtk_table_attach(GTK_TABLE(table), checkbtn_enable_default_account, 0, 1, 
835                          rowcount, rowcount + 1, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 0, 0);
836         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_enable_default_account), 
837                                      item->prefs->enable_default_account);
838
839         optmenu_default_account = gtkut_sc_combobox_create(NULL, FALSE);
840         gtk_table_attach(GTK_TABLE(table), optmenu_default_account, 1, 2, 
841                          rowcount, rowcount + 1, GTK_EXPAND | GTK_FILL, GTK_SHRINK, 0, 0);
842         optmenu_default_account_menu = GTK_LIST_STORE(
843                         gtk_combo_box_get_model(GTK_COMBO_BOX(optmenu_default_account)));
844
845         account_list = account_get_list();
846         for (cur_ac = account_list; cur_ac != NULL; cur_ac = cur_ac->next) {
847                 ac_prefs = (PrefsAccount *)cur_ac->data;
848                 if (item->folder->account &&
849                     ( (item_protocol(item) == A_NNTP && ac_prefs->protocol != A_NNTP)
850                     ||(item_protocol(item) != A_NNTP && ac_prefs->protocol == A_NNTP))) 
851                         continue;
852
853                 if (item->folder->klass->type != F_NEWS && ac_prefs->protocol == A_NNTP)
854                         continue;
855
856                 COMBOBOX_ADD (optmenu_default_account_menu,
857                                         ac_prefs->account_name?ac_prefs->account_name : _("Untitled"),
858                                         ac_prefs->account_id);
859
860                 /* Set combobox to current default account id */
861                 if (ac_prefs->account_id == item->prefs->default_account)
862                         combobox_select_by_data(GTK_COMBO_BOX(optmenu_default_account),
863                                         ac_prefs->account_id);
864         }
865
866         SET_TOGGLE_SENSITIVITY(checkbtn_enable_default_account, optmenu_default_account);
867
868         default_account_rec_checkbtn = gtk_check_button_new();
869         gtk_table_attach(GTK_TABLE(table), default_account_rec_checkbtn, 2, 3, 
870                          rowcount, rowcount + 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
871         rowcount++;
872
873 #if USE_ASPELL
874         /* Default dictionary */
875         checkbtn_enable_default_dictionary = gtk_check_button_new_with_label(_("Default dictionary"));
876         gtk_table_attach(GTK_TABLE(table), checkbtn_enable_default_dictionary, 0, 1,
877                          rowcount, rowcount + 1, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 0, 0);
878         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_enable_default_dictionary),
879                                      item->prefs->enable_default_dictionary);
880
881         optmenu_default_dictionary = gtk_option_menu_new();
882         gtk_table_attach(GTK_TABLE(table), optmenu_default_dictionary, 1, 2,
883                          rowcount, rowcount + 1, GTK_EXPAND | GTK_FILL, GTK_SHRINK, 0, 0);
884
885         gtk_option_menu_set_menu(GTK_OPTION_MENU(optmenu_default_dictionary), 
886                                  gtkaspell_dictionary_option_menu_new(
887                                          prefs_common.aspell_path));
888
889         dictionary = item->prefs->default_dictionary;
890
891         optmenu = GTK_OPTION_MENU(optmenu_default_dictionary);
892
893         menu = gtk_option_menu_get_menu(optmenu);
894         if (dictionary)
895                 gtkaspell_set_dictionary_menu_active_item(optmenu_default_dictionary, dictionary);
896         menuitem = gtk_menu_get_active(GTK_MENU(menu));
897         gtk_menu_item_activate(GTK_MENU_ITEM(menuitem));
898
899         SET_TOGGLE_SENSITIVITY(checkbtn_enable_default_dictionary, optmenu_default_dictionary);
900
901         default_dictionary_rec_checkbtn = gtk_check_button_new();
902         gtk_table_attach(GTK_TABLE(table), default_dictionary_rec_checkbtn, 2, 3, 
903                          rowcount, rowcount + 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
904         
905         rowcount++;
906
907         /* Default dictionary */
908         checkbtn_enable_default_alt_dictionary = gtk_check_button_new_with_label(_("Default alternate dictionary"));
909         gtk_table_attach(GTK_TABLE(table), checkbtn_enable_default_alt_dictionary, 0, 1,
910                          rowcount, rowcount + 1, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 0, 0);
911         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_enable_default_alt_dictionary),
912                                      item->prefs->enable_default_alt_dictionary);
913
914         optmenu_default_alt_dictionary = gtk_option_menu_new();
915         gtk_table_attach(GTK_TABLE(table), optmenu_default_alt_dictionary, 1, 2,
916                          rowcount, rowcount + 1, GTK_EXPAND | GTK_FILL, GTK_SHRINK, 0, 0);
917
918         gtk_option_menu_set_menu(GTK_OPTION_MENU(optmenu_default_alt_dictionary), 
919                                  gtkaspell_dictionary_option_menu_new_with_refresh(
920                                          prefs_common.aspell_path, FALSE));
921
922         dictionary = item->prefs->default_alt_dictionary;
923
924         optmenu = GTK_OPTION_MENU(optmenu_default_alt_dictionary);
925
926         menu = gtk_option_menu_get_menu(optmenu);
927         if (dictionary)
928                 gtkaspell_set_dictionary_menu_active_item(optmenu_default_alt_dictionary, dictionary);
929         menuitem = gtk_menu_get_active(GTK_MENU(menu));
930         gtk_menu_item_activate(GTK_MENU_ITEM(menuitem));
931
932         SET_TOGGLE_SENSITIVITY(checkbtn_enable_default_alt_dictionary, optmenu_default_alt_dictionary);
933
934         default_alt_dictionary_rec_checkbtn = gtk_check_button_new();
935         gtk_table_attach(GTK_TABLE(table), default_alt_dictionary_rec_checkbtn, 2, 3, 
936                          rowcount, rowcount + 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
937         
938         rowcount++;
939 #endif
940
941         gtk_widget_show_all(table);
942
943         page->window = GTK_WIDGET(window);
944         page->table = table;
945         page->no_save_warning = no_save_warning;
946         page->checkbtn_request_return_receipt = checkbtn_request_return_receipt;
947         page->checkbtn_save_copy_to_folder = checkbtn_save_copy_to_folder;
948         page->checkbtn_default_to = checkbtn_default_to;
949         page->entry_default_to = entry_default_to;
950         page->checkbtn_default_reply_to = checkbtn_default_reply_to;
951         page->entry_default_reply_to = entry_default_reply_to;
952         page->checkbtn_enable_default_account = checkbtn_enable_default_account;
953         page->optmenu_default_account = optmenu_default_account;
954 #ifdef USE_ASPELL
955         page->checkbtn_enable_default_dictionary = checkbtn_enable_default_dictionary;
956         page->optmenu_default_dictionary = optmenu_default_dictionary;
957         page->checkbtn_enable_default_alt_dictionary = checkbtn_enable_default_alt_dictionary;
958         page->optmenu_default_alt_dictionary = optmenu_default_alt_dictionary;
959 #endif
960
961         page->request_return_receipt_rec_checkbtn = request_return_receipt_rec_checkbtn;
962         page->save_copy_to_folder_rec_checkbtn    = save_copy_to_folder_rec_checkbtn;
963         page->default_to_rec_checkbtn             = default_to_rec_checkbtn;
964         page->default_reply_to_rec_checkbtn       = default_reply_to_rec_checkbtn;
965         page->default_account_rec_checkbtn        = default_account_rec_checkbtn;
966 #if USE_ASPELL
967         page->default_dictionary_rec_checkbtn = default_dictionary_rec_checkbtn;
968         page->default_alt_dictionary_rec_checkbtn = default_alt_dictionary_rec_checkbtn;
969 #endif
970
971         address_completion_start(page->window);
972
973         page->page.widget = table;
974 }
975
976 static void prefs_folder_item_compose_destroy_widget_func(PrefsPage *page_) 
977 {
978         FolderItemComposePage *page = (FolderItemComposePage *) page_;
979
980         if (page->entry_default_to)
981                 address_completion_unregister_entry(GTK_ENTRY(page->entry_default_to));
982         if (page->entry_default_reply_to)
983                 address_completion_unregister_entry(GTK_ENTRY(page->entry_default_reply_to));
984         address_completion_end(page->window);
985 }
986
987 /** \brief  Save the prefs in page to folder.
988  *
989  *  If the folder is not the one  specified in page->item, then only those properties 
990  *  that have the relevant 'apply to sub folders' button checked are saved
991  */
992 static void compose_save_folder_prefs(FolderItem *folder, FolderItemComposePage *page)
993 {
994         FolderItemPrefs *prefs = folder->prefs;
995         gboolean all = FALSE;
996
997         if (folder->path == NULL)
998                 return;
999
1000         if (page->item == folder) 
1001                 all = TRUE;
1002
1003         g_return_if_fail(prefs != NULL);
1004
1005         if (item_protocol(folder) != A_NNTP) {
1006                 if (all || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->request_return_receipt_rec_checkbtn))) {
1007                         prefs->request_return_receipt = 
1008                                 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_request_return_receipt));
1009                         /* MIGRATION */    
1010                         folder->ret_rcpt = prefs->request_return_receipt;
1011                 }
1012
1013                 if (all || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->save_copy_to_folder_rec_checkbtn))) {
1014                         prefs->save_copy_to_folder = 
1015                                 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_save_copy_to_folder));
1016                 }
1017
1018                 if (all || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->default_to_rec_checkbtn))) {
1019
1020                         prefs->enable_default_to = 
1021                                 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_default_to));
1022                         ASSIGN_STRING(prefs->default_to,
1023                                       gtk_editable_get_chars(GTK_EDITABLE(page->entry_default_to), 0, -1));
1024                 }
1025
1026                 if (all || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->default_reply_to_rec_checkbtn))) {
1027                         prefs->enable_default_reply_to = 
1028                                 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_default_reply_to));
1029                         ASSIGN_STRING(prefs->default_reply_to,
1030                                       gtk_editable_get_chars(GTK_EDITABLE(page->entry_default_reply_to), 0, -1));
1031                 }
1032         } else {
1033                 prefs->request_return_receipt = FALSE;
1034                 prefs->save_copy_to_folder = FALSE;
1035                 prefs->enable_default_to = FALSE;
1036                 prefs->enable_default_reply_to = FALSE;
1037         }
1038
1039         if (all || gtk_toggle_button_get_active(
1040                                 GTK_TOGGLE_BUTTON(page->default_account_rec_checkbtn))) {
1041                 prefs->enable_default_account = 
1042                         gtk_toggle_button_get_active(
1043                                         GTK_TOGGLE_BUTTON(page->checkbtn_enable_default_account));
1044                 prefs->default_account = combobox_get_active_data(
1045                                 GTK_COMBO_BOX(page->optmenu_default_account));
1046         }
1047
1048 #if USE_ASPELL
1049         if (all || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->default_dictionary_rec_checkbtn))) {
1050                 prefs->enable_default_dictionary =
1051                         gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_enable_default_dictionary));
1052                 menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(page->optmenu_default_dictionary));
1053                 ASSIGN_STRING(prefs->default_dictionary,
1054                               gtkaspell_get_dictionary_menu_active_item(menu));
1055         }
1056         if (all || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->default_alt_dictionary_rec_checkbtn))) {
1057                 prefs->enable_default_alt_dictionary =
1058                         gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_enable_default_alt_dictionary));
1059                 menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(page->optmenu_default_alt_dictionary));
1060                 ASSIGN_STRING(prefs->default_alt_dictionary,
1061                               gtkaspell_get_dictionary_menu_active_item(menu));
1062         }
1063 #endif
1064
1065         folder_item_prefs_save_config(folder);
1066 }       
1067
1068 static gboolean compose_save_recurse_func(GNode *node, gpointer data)
1069 {
1070         FolderItem *item = (FolderItem *) node->data;
1071         FolderItemComposePage *page = (FolderItemComposePage *) data;
1072
1073         g_return_val_if_fail(item != NULL, TRUE);
1074         g_return_val_if_fail(page != NULL, TRUE);
1075
1076         compose_save_folder_prefs(item, page);
1077
1078         /* optimise by not continuing if none of the 'apply to sub folders'
1079            check boxes are selected - and optimise the checking by only doing
1080            it once */
1081         if ((node == page->item->node) && item_protocol(item) != A_NNTP &&
1082             !(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->request_return_receipt_rec_checkbtn)) ||
1083               gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->save_copy_to_folder_rec_checkbtn)) ||
1084               gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->default_to_rec_checkbtn)) ||
1085               gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->default_account_rec_checkbtn)) ||
1086 #if USE_ASPELL
1087               gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->default_dictionary_rec_checkbtn)) ||
1088               gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->default_alt_dictionary_rec_checkbtn)) ||
1089 #endif
1090               gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->default_reply_to_rec_checkbtn))))
1091                 return TRUE;
1092         else if ((node == page->item->node) && item_protocol(item) == A_NNTP &&
1093             !(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->default_account_rec_checkbtn)) 
1094 #if USE_ASPELL
1095               || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->default_dictionary_rec_checkbtn))
1096               || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->default_alt_dictionary_rec_checkbtn))
1097 #endif
1098                     ))
1099                 return TRUE;
1100         else 
1101                 return FALSE;
1102 }
1103
1104 static void prefs_folder_item_compose_save_func(PrefsPage *page_) 
1105 {
1106         FolderItemComposePage *page = (FolderItemComposePage *) page_;
1107
1108         g_node_traverse(page->item->node, G_PRE_ORDER, G_TRAVERSE_ALL,
1109                         -1, compose_save_recurse_func, page);
1110
1111 }
1112
1113 static void prefs_folder_item_templates_create_widget_func(PrefsPage * page_,
1114                                                    GtkWindow * window,
1115                                                    gpointer data)
1116 {
1117         FolderItemTemplatesPage *page = (FolderItemTemplatesPage *) page_;
1118         FolderItem *item = (FolderItem *) data;
1119
1120         GtkWidget *table;
1121         GtkWidget *label;
1122         guint rowcount;
1123         GtkWidget *vbox;
1124         GtkWidget *alignment;
1125         GtkWidget *new_msg_format_rec_checkbtn;
1126         GtkWidget *reply_format_rec_checkbtn;
1127         GtkWidget *forward_format_rec_checkbtn;
1128
1129         page->item         = item;
1130
1131         /* Table */
1132         table = gtk_table_new(5, 3, FALSE);
1133         gtk_container_set_border_width (GTK_CONTAINER (table), VBOX_BORDER);
1134         gtk_table_set_row_spacings(GTK_TABLE(table), 4);
1135         gtk_table_set_col_spacings(GTK_TABLE(table), 4);
1136         rowcount = 0;
1137
1138         /* Apply to subfolders */
1139         label = gtk_label_new(_("Apply to\nsubfolders"));
1140         gtk_misc_set_alignment(GTK_MISC(label), 0.5, 0.5);
1141         gtk_table_attach(GTK_TABLE(table), label, 2, 3,
1142                          rowcount, rowcount + 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
1143         rowcount++;
1144
1145         /* compose format */
1146         vbox = gtk_vbox_new (FALSE, VSPACING);
1147         gtk_widget_show (vbox);
1148         gtk_container_set_border_width (GTK_CONTAINER (vbox), 0);
1149         gtk_table_attach(GTK_TABLE(table), vbox, 1, 2, 
1150                          rowcount, rowcount + 1, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
1151
1152         quotefmt_create_new_msg_fmt_widgets(
1153                                 window,
1154                                 vbox,
1155                                 &page->checkbtn_compose_with_format,
1156                                 _("Use a specific format for new messages"),
1157                                 &page->compose_subject_format,
1158                                 &page->compose_body_format,
1159                                 FALSE);
1160
1161         vbox = gtk_vbox_new (FALSE, VSPACING);
1162         gtk_widget_show (vbox);
1163         gtk_container_set_border_width (GTK_CONTAINER (vbox), 0);
1164         gtk_table_attach(GTK_TABLE(table), vbox, 2, 3, 
1165                          rowcount, rowcount + 1, GTK_SHRINK, GTK_FILL, 0, 0);
1166
1167         new_msg_format_rec_checkbtn = gtk_check_button_new();
1168         gtk_box_pack_start (GTK_BOX(vbox), new_msg_format_rec_checkbtn, FALSE, FALSE, 0);
1169         alignment = gtk_alignment_new(0, 1, 0, 0);      
1170         gtk_box_pack_start (GTK_BOX(vbox), alignment, FALSE, FALSE, 0);
1171
1172         rowcount++;
1173
1174         /* reply format */
1175         vbox = gtk_vbox_new (FALSE, VSPACING);
1176         gtk_widget_show (vbox);
1177         gtk_container_set_border_width (GTK_CONTAINER (vbox), 0);
1178         gtk_table_attach(GTK_TABLE(table), vbox, 1, 2, 
1179                          rowcount, rowcount + 1, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
1180
1181         quotefmt_create_reply_fmt_widgets(
1182                                 window,
1183                                 vbox,
1184                                 &page->checkbtn_reply_with_format,
1185                                 _("Use a specific reply quote format"),
1186                                 &page->reply_quotemark,
1187                                 &page->reply_body_format,
1188                                 FALSE);
1189
1190         vbox = gtk_vbox_new (FALSE, VSPACING);
1191         gtk_widget_show (vbox);
1192         gtk_container_set_border_width (GTK_CONTAINER (vbox), 0);
1193         gtk_table_attach(GTK_TABLE(table), vbox, 2, 3, 
1194                          rowcount, rowcount + 1, GTK_SHRINK, GTK_FILL, 0, 0);
1195
1196         reply_format_rec_checkbtn = gtk_check_button_new();
1197         gtk_box_pack_start (GTK_BOX(vbox), reply_format_rec_checkbtn, FALSE, FALSE, 0);
1198         alignment = gtk_alignment_new(0, 1, 0, 0);      
1199         gtk_box_pack_start (GTK_BOX(vbox), alignment, FALSE, FALSE, 0);
1200
1201         rowcount++;
1202
1203         /* forward format */
1204         vbox = gtk_vbox_new (FALSE, VSPACING);
1205         gtk_widget_show (vbox);
1206         gtk_container_set_border_width (GTK_CONTAINER (vbox), 0);
1207         gtk_table_attach(GTK_TABLE(table), vbox, 1, 2, 
1208                          rowcount, rowcount + 1, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
1209
1210         quotefmt_create_forward_fmt_widgets(
1211                                 window,
1212                                 vbox,
1213                                 &page->checkbtn_forward_with_format,
1214                                 _("Use a specific forward quote format"),
1215                                 &page->forward_quotemark,
1216                                 &page->forward_body_format,
1217                                 FALSE);
1218
1219         vbox = gtk_vbox_new (FALSE, VSPACING);
1220         gtk_widget_show (vbox);
1221         gtk_container_set_border_width (GTK_CONTAINER (vbox), 0);
1222         gtk_table_attach(GTK_TABLE(table), vbox, 2, 3, 
1223                          rowcount, rowcount + 1, GTK_SHRINK, GTK_FILL, 0, 0);
1224
1225         forward_format_rec_checkbtn = gtk_check_button_new();
1226         gtk_box_pack_start (GTK_BOX(vbox), forward_format_rec_checkbtn, FALSE, FALSE, 0);
1227         alignment = gtk_alignment_new(0, 1, 0, 0);      
1228         gtk_box_pack_start (GTK_BOX(vbox), alignment, FALSE, FALSE, 0);
1229
1230         rowcount++;
1231
1232         /* information button */
1233         vbox = gtk_vbox_new (FALSE, VSPACING);
1234         gtk_widget_show (vbox);
1235         gtk_container_set_border_width (GTK_CONTAINER (vbox), 0);
1236         gtk_table_attach(GTK_TABLE(table), vbox, 1, 2, 
1237                          rowcount, rowcount + 1, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
1238         rowcount++;
1239         quotefmt_add_info_button(window, vbox);
1240
1241
1242         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(page->checkbtn_compose_with_format),
1243                         item->prefs->compose_with_format);
1244         pref_set_entry_from_pref(GTK_ENTRY(page->compose_subject_format),
1245                         item->prefs->compose_subject_format);
1246         pref_set_textview_from_pref(GTK_TEXT_VIEW(page->compose_body_format),
1247                         item->prefs->compose_body_format);
1248
1249         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(page->checkbtn_reply_with_format),
1250                         item->prefs->reply_with_format);
1251         pref_set_entry_from_pref(GTK_ENTRY(page->reply_quotemark),
1252                         item->prefs->reply_quotemark);
1253         pref_set_textview_from_pref(GTK_TEXT_VIEW(page->reply_body_format),
1254                         item->prefs->reply_body_format);
1255
1256         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(page->checkbtn_forward_with_format),
1257                         item->prefs->forward_with_format);
1258         pref_set_entry_from_pref(GTK_ENTRY(page->forward_quotemark),
1259                         item->prefs->forward_quotemark);
1260         pref_set_textview_from_pref(GTK_TEXT_VIEW(page->forward_body_format),
1261                         item->prefs->forward_body_format);
1262
1263         gtk_widget_show_all(table);
1264
1265         page->window = GTK_WIDGET(window);
1266         page->table = table;
1267
1268         page->new_msg_format_rec_checkbtn = new_msg_format_rec_checkbtn;
1269         page->reply_format_rec_checkbtn = reply_format_rec_checkbtn;
1270         page->forward_format_rec_checkbtn = forward_format_rec_checkbtn;
1271
1272         page->page.widget = table;
1273 }
1274
1275 static void prefs_folder_item_templates_destroy_widget_func(PrefsPage *page_) 
1276 {
1277         /* FolderItemTemplatesPage *page = (FolderItemTemplatesPage *) page_; */
1278 }
1279
1280 /** \brief  Save the prefs in page to folder.
1281  *
1282  *  If the folder is not the one  specified in page->item, then only those properties 
1283  *  that have the relevant 'apply to sub folders' button checked are saved
1284  */
1285 static void templates_save_folder_prefs(FolderItem *folder, FolderItemTemplatesPage *page)
1286 {
1287         FolderItemPrefs *prefs = folder->prefs;
1288         gboolean all = FALSE;
1289
1290         if (folder->path == NULL)
1291                 return;
1292
1293         if (page->item == folder) 
1294                 all = TRUE;
1295
1296         g_return_if_fail(prefs != NULL);
1297
1298         /* save and check formats */
1299
1300         if (all || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->new_msg_format_rec_checkbtn))) {
1301                 prefs->compose_with_format =
1302                         gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_compose_with_format));
1303                 prefs->compose_subject_format = pref_get_pref_from_entry(
1304                                 GTK_ENTRY(page->compose_subject_format));
1305                 prefs->compose_body_format = pref_get_pref_from_textview(
1306                                 GTK_TEXT_VIEW(page->compose_body_format));
1307                 quotefmt_check_new_msg_formats(prefs->compose_with_format,
1308                                                                                 prefs->compose_subject_format,
1309                                                                                 prefs->compose_body_format);
1310         }
1311
1312         if (all || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->reply_format_rec_checkbtn))) {
1313                 prefs->reply_with_format =
1314                         gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_reply_with_format));
1315                 prefs->reply_quotemark = gtk_editable_get_chars(
1316                                 GTK_EDITABLE(page->reply_quotemark), 0, -1);
1317                 prefs->reply_body_format = pref_get_pref_from_textview(
1318                                 GTK_TEXT_VIEW(page->reply_body_format));
1319                 quotefmt_check_reply_formats(prefs->reply_with_format,
1320                                                                                 prefs->reply_quotemark,
1321                                                                                 prefs->reply_body_format);
1322         }
1323
1324         if (all || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->forward_format_rec_checkbtn))) {
1325                 prefs->forward_with_format =
1326                         gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_forward_with_format));
1327                 prefs->forward_quotemark = gtk_editable_get_chars(
1328                                 GTK_EDITABLE(page->forward_quotemark), 0, -1);
1329                 prefs->forward_body_format = pref_get_pref_from_textview(
1330                                 GTK_TEXT_VIEW(page->forward_body_format));
1331                 quotefmt_check_forward_formats(prefs->forward_with_format,
1332                                                                                 prefs->forward_quotemark,
1333                                                                                 prefs->forward_body_format);
1334         }
1335
1336         folder_item_prefs_save_config(folder);
1337 }       
1338
1339 static gboolean templates_save_recurse_func(GNode *node, gpointer data)
1340 {
1341         FolderItem *item = (FolderItem *) node->data;
1342         FolderItemTemplatesPage *page = (FolderItemTemplatesPage *) data;
1343
1344         g_return_val_if_fail(item != NULL, TRUE);
1345         g_return_val_if_fail(page != NULL, TRUE);
1346
1347         templates_save_folder_prefs(item, page);
1348
1349         /* optimise by not continuing if none of the 'apply to sub folders'
1350            check boxes are selected - and optimise the checking by only doing
1351            it once */
1352         if ((node == page->item->node) &&
1353             !(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->new_msg_format_rec_checkbtn)) ||
1354               gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->reply_format_rec_checkbtn)) ||
1355               gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->forward_format_rec_checkbtn))))
1356                 return TRUE;
1357         else 
1358                 return FALSE;
1359
1360         return FALSE;
1361 }
1362
1363 static void prefs_folder_item_templates_save_func(PrefsPage *page_) 
1364 {
1365         FolderItemTemplatesPage *page = (FolderItemTemplatesPage *) page_;
1366
1367         g_node_traverse(page->item->node, G_PRE_ORDER, G_TRAVERSE_ALL,
1368                         -1, templates_save_recurse_func, page);
1369
1370 }
1371
1372 static gint prefs_folder_item_chmod_mode(gchar *folder_chmod) 
1373 {
1374         gint newmode = 0;
1375         gchar *tmp;
1376
1377         if (folder_chmod) {
1378                 newmode = strtol(folder_chmod, &tmp, 8);
1379                 if (!(*(folder_chmod) && !(*tmp)))
1380                         newmode = 0;
1381         }
1382
1383         return newmode;
1384 }
1385
1386 static void folder_color_set_dialog(GtkWidget *widget, gpointer data)
1387 {
1388         FolderItemGeneralPage *page = (FolderItemGeneralPage *) data;
1389         gint rgbcolor;
1390
1391         rgbcolor = colorsel_select_color_rgb(_("Pick color for folder"), 
1392                                              page->folder_color);
1393         gtkut_set_widget_bgcolor_rgb(page->folder_color_btn, rgbcolor);
1394         page->folder_color = rgbcolor;
1395 }
1396
1397 static regex_t *summary_compile_simplify_regexp(gchar *simplify_subject_regexp)
1398 {
1399         int err;
1400         gchar buf[BUFFSIZE];
1401         regex_t *preg = NULL;
1402
1403         preg = g_new0(regex_t, 1);
1404
1405         err = string_match_precompile(simplify_subject_regexp, 
1406                                       preg, REG_EXTENDED);
1407         if (err) {
1408                 regerror(err, preg, buf, BUFFSIZE);
1409                 g_free(preg);
1410                 preg = NULL;
1411         }
1412
1413         return preg;
1414 }
1415
1416 static void folder_regexp_test_cb(GtkWidget *widget, gpointer data)
1417 {
1418         static GdkColor red;
1419         static gboolean colors_initialised = FALSE;
1420         static gchar buf[BUFFSIZE];
1421         FolderItemGeneralPage *page = (FolderItemGeneralPage *)data;
1422         gchar *test_string, *regexp;
1423         regex_t *preg;
1424
1425         regexp = g_strdup(gtk_entry_get_text(GTK_ENTRY(page->entry_simplify_subject)));
1426         test_string = g_strdup(gtk_entry_get_text(GTK_ENTRY(page->entry_regexp_test_string)));
1427
1428         if (!regexp || !regexp[0]) {
1429                 gtk_widget_modify_base(page->entry_simplify_subject,
1430                                 GTK_STATE_NORMAL, NULL);
1431                 if (test_string) {
1432                         gtk_entry_set_text(GTK_ENTRY(page->entry_regexp_test_result), test_string);
1433                         g_free(test_string);
1434                 }
1435                 return;
1436         }
1437
1438         if (!test_string || !test_string[0]) {
1439                 g_free(regexp);
1440                 return;
1441         }
1442
1443         if (!colors_initialised) {
1444                 gdk_color_parse("#ff7070", &red);
1445                 colors_initialised = gdk_colormap_alloc_color(
1446                         gdk_colormap_get_system(), &red, FALSE, TRUE);
1447         }
1448
1449         preg = summary_compile_simplify_regexp(regexp);
1450         if (colors_initialised) {
1451                 gtk_widget_modify_base(page->entry_simplify_subject,
1452                                 GTK_STATE_NORMAL, preg ? NULL : &red);
1453         }
1454
1455         if (preg != NULL) {
1456                 string_remove_match(buf, BUFFSIZE, test_string, preg);
1457
1458                 gtk_entry_set_text(GTK_ENTRY(page->entry_regexp_test_result), buf);
1459
1460                 regfree(preg);
1461                 g_free(preg);
1462         }
1463
1464         g_free(test_string);
1465         g_free(regexp);
1466 }
1467
1468 static gchar *folder_regexp_get_subject_example(void)
1469 {
1470         MsgInfo *msginfo_selected;
1471         SummaryView *summaryview = NULL;
1472
1473         if (!mainwindow_get_mainwindow())
1474                 return NULL;
1475         summaryview = mainwindow_get_mainwindow()->summaryview;
1476
1477         msginfo_selected = summary_get_selected_msg(summaryview);
1478         return msginfo_selected ? g_strdup(msginfo_selected->subject) : NULL;
1479 }
1480
1481 static void folder_regexp_set_subject_example_cb(GtkWidget *widget, gpointer data)
1482 {
1483         FolderItemGeneralPage *page = (FolderItemGeneralPage *)data;
1484
1485         if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_simplify_subject))) {
1486                 gchar *subject = folder_regexp_get_subject_example();
1487                 if (subject) {
1488                         gtk_entry_set_text(GTK_ENTRY(page->entry_regexp_test_string), subject);
1489                         g_free(subject);
1490                 }
1491         }
1492 }
1493
1494 static void register_general_page()
1495 {
1496         static gchar *pfi_general_path[2];
1497         static FolderItemGeneralPage folder_item_general_page;
1498
1499         pfi_general_path[0] = _("General");
1500         pfi_general_path[1] = NULL;
1501
1502         folder_item_general_page.page.path = pfi_general_path;
1503         folder_item_general_page.page.create_widget = prefs_folder_item_general_create_widget_func;
1504         folder_item_general_page.page.destroy_widget = prefs_folder_item_general_destroy_widget_func;
1505         folder_item_general_page.page.save_page = prefs_folder_item_general_save_func;
1506         
1507         prefs_folder_item_register_page((PrefsPage *) &folder_item_general_page);
1508 }
1509
1510
1511 static void register_compose_page(void)
1512 {
1513         static gchar *pfi_compose_path[2];
1514         static FolderItemComposePage folder_item_compose_page;
1515
1516         pfi_compose_path[0] = _("Compose");
1517         pfi_compose_path[1] = NULL;
1518
1519         folder_item_compose_page.page.path = pfi_compose_path;
1520         folder_item_compose_page.page.create_widget = prefs_folder_item_compose_create_widget_func;
1521         folder_item_compose_page.page.destroy_widget = prefs_folder_item_compose_destroy_widget_func;
1522         folder_item_compose_page.page.save_page = prefs_folder_item_compose_save_func;
1523         
1524         prefs_folder_item_register_page((PrefsPage *) &folder_item_compose_page);
1525 }
1526
1527 static void register_templates_page(void)
1528 {
1529         static gchar *pfi_templates_path[2];
1530         static FolderItemTemplatesPage folder_item_templates_page;
1531
1532         pfi_templates_path[0] = _("Templates");
1533         pfi_templates_path[1] = NULL;
1534
1535         folder_item_templates_page.page.path = pfi_templates_path;
1536         folder_item_templates_page.page.create_widget = prefs_folder_item_templates_create_widget_func;
1537         folder_item_templates_page.page.destroy_widget = prefs_folder_item_templates_destroy_widget_func;
1538         folder_item_templates_page.page.save_page = prefs_folder_item_templates_save_func;
1539         
1540         prefs_folder_item_register_page((PrefsPage *) &folder_item_templates_page);
1541 }
1542
1543 static GSList *prefs_pages = NULL;
1544
1545 void prefs_folder_item_open(FolderItem *item)
1546 {
1547         gchar *id, *title;
1548         if (prefs_pages == NULL) {
1549                 register_general_page();
1550                 register_compose_page();
1551                 register_templates_page();
1552         }
1553
1554         if (item->path) {
1555                 id = folder_item_get_identifier (item);
1556                 can_save = TRUE;
1557         } else {
1558                 id = g_strdup(item->name);
1559                 can_save = FALSE;
1560         }
1561         title = g_strdup_printf (_("Properties for folder %s"), id);
1562         g_free (id);
1563         prefswindow_open(title, prefs_pages, item,
1564                         &prefs_common.folderitemwin_width, &prefs_common.folderitemwin_height);
1565         
1566         g_free (title);
1567 }
1568
1569 void prefs_folder_item_register_page(PrefsPage *page)
1570 {
1571         prefs_pages = g_slist_append(prefs_pages, page);
1572 }
1573
1574 void prefs_folder_item_unregister_page(PrefsPage *page)
1575 {
1576         prefs_pages = g_slist_remove(prefs_pages, page);
1577 }