* src/procmime.c
[claws.git] / src / prefs_folder_item.c
1 /*
2  * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
3  * Copyright (C) 1999-2001 Hiroyuki Yamamoto
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 2 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, write to the Free Software
17  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
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 "intl.h"
29 #include "defs.h"
30 #include "folder.h"
31 #include "prefs_folder_item.h"
32 #include "folderview.h"
33 #include "summaryview.h"
34 #include "menu.h"
35 #include "account.h"
36 #include "prefs_gtk.h"
37 #include "manage_window.h"
38 #include "utils.h"
39 #include "addr_compl.h"
40 #include "prefs_common.h"
41 #include "prefs_scoring.h"
42 #include "gtkutils.h"
43 #include "filtering.h"
44 #include "folder_item_prefs.h"
45 #include "gtk/colorsel.h"
46
47 #if USE_ASPELL
48 #include "gtkaspell.h"
49 #endif
50
51 #define ASSIGN_STRING(string, value) \
52         { \
53                 g_free(string); \
54                 string = (value); \
55         }
56
57 struct FolderItemGeneralPage
58 {
59         PrefsPage page;
60
61         FolderItem *item;
62
63         GtkWidget *table;
64         GtkWidget *checkbtn_simplify_subject;
65         GtkWidget *entry_simplify_subject;
66         GtkWidget *checkbtn_folder_chmod;
67         GtkWidget *entry_folder_chmod;
68         GtkWidget *folder_color_btn;
69         GtkWidget *checkbtn_enable_processing;
70
71         gint       folder_color;
72 };
73
74 struct FolderItemComposePage
75 {
76         PrefsPage page;
77
78         FolderItem *item;
79
80         GtkWidget *window;
81         GtkWidget *table;
82         GtkWidget *checkbtn_request_return_receipt;
83         GtkWidget *checkbtn_save_copy_to_folder;
84         GtkWidget *checkbtn_default_to;
85         GtkWidget *entry_default_to;
86         GtkWidget *checkbtn_default_reply_to;
87         GtkWidget *entry_default_reply_to;
88         GtkWidget *checkbtn_enable_default_account;
89         GtkWidget *optmenu_default_account;
90 #if USE_ASPELL
91         GtkWidget *checkbtn_enable_default_dictionary;
92         GtkWidget *optmenu_default_dictionary;
93 #endif
94 };
95
96
97 gint prefs_folder_item_chmod_mode               (gchar *folder_chmod);
98
99 static void folder_color_set_dialog(GtkWidget *widget, gpointer data);
100
101 #define SAFE_STRING(str) \
102         (str) ? (str) : ""
103
104 void prefs_folder_item_general_create_widget_func(PrefsPage * _page,
105                                                    GtkWindow * window,
106                                                    gpointer data)
107 {
108         struct FolderItemGeneralPage *page = (struct FolderItemGeneralPage *) _page;
109         FolderItem *item = (FolderItem *) data;
110         guint rowcount;
111
112         GtkWidget *table;
113         GtkWidget *hbox;
114         
115         GtkWidget *checkbtn_simplify_subject;
116         GtkWidget *entry_simplify_subject;
117         GtkWidget *checkbtn_folder_chmod;
118         GtkWidget *entry_folder_chmod;
119         GtkWidget *folder_color;
120         GtkWidget *folder_color_btn;
121         GtkWidget *checkbtn_enable_processing;
122
123         page->item         = item;
124
125         /* Table */
126         table = gtk_table_new(4, 2, FALSE);
127         gtk_widget_show(table);
128         gtk_table_set_row_spacings(GTK_TABLE(table), -1);
129         rowcount = 0;
130
131         /* Simplify Subject */
132         checkbtn_simplify_subject = gtk_check_button_new_with_label(_("Simplify Subject RegExp: "));
133         gtk_widget_show(checkbtn_simplify_subject);
134         gtk_table_attach(GTK_TABLE(table), checkbtn_simplify_subject, 0, 1, 
135                          rowcount, rowcount + 1, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 0, 0);
136         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_simplify_subject), 
137                                      item->prefs->enable_simplify_subject);
138
139         entry_simplify_subject = gtk_entry_new();
140         gtk_widget_show(entry_simplify_subject);
141         gtk_table_attach_defaults(GTK_TABLE(table), entry_simplify_subject, 1, 2, 
142                                   rowcount, rowcount + 1);
143         SET_TOGGLE_SENSITIVITY(checkbtn_simplify_subject, entry_simplify_subject);
144         gtk_entry_set_text(GTK_ENTRY(entry_simplify_subject), 
145                            SAFE_STRING(item->prefs->simplify_subject_regexp));
146
147         rowcount++;
148
149         /* Folder chmod */
150         checkbtn_folder_chmod = gtk_check_button_new_with_label(_("Folder chmod: "));
151         gtk_widget_show(checkbtn_folder_chmod);
152         gtk_table_attach(GTK_TABLE(table), checkbtn_folder_chmod, 0, 1, 
153                          rowcount, rowcount + 1, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 0, 0);
154
155         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_folder_chmod), 
156                                      item->prefs->enable_folder_chmod);
157
158         entry_folder_chmod = gtk_entry_new();
159         gtk_widget_show(entry_folder_chmod);
160         gtk_table_attach_defaults(GTK_TABLE(table), entry_folder_chmod, 1, 2, 
161                                   rowcount, rowcount + 1);
162         SET_TOGGLE_SENSITIVITY(checkbtn_folder_chmod, entry_folder_chmod);
163         if (item->prefs->folder_chmod) {
164                 gchar *buf;
165
166                 buf = g_strdup_printf("%o", item->prefs->folder_chmod);
167                 gtk_entry_set_text(GTK_ENTRY(entry_folder_chmod), buf);
168                 g_free(buf);
169         }
170         
171         rowcount++;
172
173         /* Folder color */
174         folder_color = gtk_label_new(_("Folder color: "));
175         gtk_misc_set_alignment(GTK_MISC(folder_color), 0, 0.5);
176         gtk_widget_show(folder_color);
177         gtk_table_attach_defaults(GTK_TABLE(table), folder_color, 0, 1, 
178                          rowcount, rowcount + 1);
179
180         hbox = gtk_hbox_new(FALSE, 0);
181         gtk_widget_show(hbox);
182         gtk_table_attach_defaults(GTK_TABLE(table), hbox, 1, 2, 
183                                   rowcount, rowcount + 1);
184
185         folder_color_btn = gtk_button_new_with_label("");
186         gtk_widget_set_usize(folder_color_btn, 36, 26);
187         gtk_box_pack_start (GTK_BOX(hbox), folder_color_btn, FALSE, FALSE, 0);
188
189         page->folder_color = item->prefs->color;
190
191         gtk_signal_connect(GTK_OBJECT(folder_color_btn), "clicked",
192                            GTK_SIGNAL_FUNC(folder_color_set_dialog),
193                            page);
194
195         gtkut_set_widget_bgcolor_rgb(folder_color_btn, item->prefs->color);
196
197         rowcount++;
198
199         /* Enable processing at startup */
200         checkbtn_enable_processing = gtk_check_button_new_with_label(_("Processing on startup: "));
201         gtk_widget_show(checkbtn_enable_processing);
202         gtk_table_attach(GTK_TABLE(table), checkbtn_enable_processing, 0, 2, 
203                          rowcount, rowcount + 1, GTK_SHRINK | GTK_FILL, GTK_FILL, 0, 0);
204
205         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_enable_processing), 
206                                      item->prefs->enable_processing);
207
208         rowcount++;
209
210         page->table = table;
211         page->checkbtn_simplify_subject = checkbtn_simplify_subject;
212         page->entry_simplify_subject = entry_simplify_subject;
213         page->checkbtn_folder_chmod = checkbtn_folder_chmod;
214         page->entry_folder_chmod = entry_folder_chmod;
215         page->folder_color_btn = folder_color_btn;
216         page->checkbtn_enable_processing = checkbtn_enable_processing;
217
218         page->page.widget = table;
219 }
220
221 void prefs_folder_item_general_destroy_widget_func(PrefsPage *_page) 
222 {
223         /* struct FolderItemGeneralPage *page = (struct FolderItemGeneralPage *) _page; */
224 }
225
226 void prefs_folder_item_general_save_func(PrefsPage *_page) 
227 {
228         gchar *buf;
229         struct FolderItemGeneralPage *page = (struct FolderItemGeneralPage *) _page;
230         FolderItemPrefs *prefs = page->item->prefs;
231         gboolean   old_simplify_val;
232         gchar     *old_simplify_str;
233
234         g_return_if_fail(prefs != NULL);
235
236         prefs->enable_simplify_subject =
237             gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_simplify_subject));
238         ASSIGN_STRING(prefs->simplify_subject_regexp,
239             gtk_editable_get_chars(GTK_EDITABLE(page->entry_simplify_subject), 0, -1));
240         
241 /*
242         if (page->item == page->folderview->summaryview->folder_item &&
243             (prefs->enable_simplify_subject != old_simplify_val ||  
244             0 != strcmp2(prefs->simplify_subject_regexp, old_simplify_str))) {
245                 summary_clear_all(page->folderview->summaryview);
246                 page->folderview->opened = NULL;
247                 page->folderview->selected = NULL;
248                 folderview_select(page->folderview, page->item);
249         }
250 */
251         prefs->enable_folder_chmod = 
252             gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_folder_chmod));
253         buf = gtk_editable_get_chars(GTK_EDITABLE(page->entry_folder_chmod), 0, -1);
254         prefs->folder_chmod = prefs_folder_item_chmod_mode(buf);
255         g_free(buf);
256
257         prefs->color = page->folder_color;
258         /* update folder view */
259         if (prefs->color > 0)
260                 folder_item_update(page->item, F_ITEM_UPDATE_MSGCNT);
261
262         prefs->enable_processing = 
263             gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_enable_processing));
264
265         folder_item_prefs_save_config(page->item);
266 }
267
268 void prefs_folder_item_compose_create_widget_func(PrefsPage * _page,
269                                                    GtkWindow * window,
270                                                    gpointer data)
271 {
272         struct FolderItemComposePage *page = (struct FolderItemComposePage *) _page;
273         FolderItem *item = (FolderItem *) data;
274         guint rowcount;
275
276         GtkWidget *table;
277         
278         GtkWidget *checkbtn_request_return_receipt;
279         GtkWidget *checkbtn_save_copy_to_folder;
280         GtkWidget *checkbtn_default_to;
281         GtkWidget *entry_default_to;
282         GtkWidget *checkbtn_default_reply_to;
283         GtkWidget *entry_default_reply_to;
284         GtkWidget *checkbtn_enable_default_account;
285         GtkWidget *optmenu_default_account;
286         GtkWidget *optmenu_default_account_menu;
287         GtkWidget *optmenu_default_account_menuitem;
288 #if USE_ASPELL
289         GtkWidget *checkbtn_enable_default_dictionary;
290         GtkWidget *optmenu_default_dictionary;
291         GtkWidget *optmenu_default_dictionary_menu;
292         GtkWidget *opemenu_default_dictionary_menuitem;
293 #endif
294         GList *cur_ac;
295         GList *account_list;
296 #if USE_ASPELL
297         gchar *dictionary;
298 #endif
299         PrefsAccount *ac_prefs;
300         GtkOptionMenu *optmenu;
301         GtkWidget *menu;
302         GtkWidget *menuitem;
303         gint account_index, index;
304
305         page->item         = item;
306
307         /* Table */
308 #if USE_ASPELL
309 # define TABLEHEIGHT 6
310 #else
311 # define TABLEHEIGHT 5
312 #endif
313         table = gtk_table_new(TABLEHEIGHT, 2, FALSE);
314         gtk_widget_show(table);
315         gtk_table_set_row_spacings(GTK_TABLE(table), -1);
316         rowcount = 0;
317
318         /* Request Return Receipt */
319         checkbtn_request_return_receipt = gtk_check_button_new_with_label
320                 (_("Request Return Receipt"));
321         gtk_widget_show(checkbtn_request_return_receipt);
322         gtk_table_attach(GTK_TABLE(table), checkbtn_request_return_receipt, 
323                          0, 2, rowcount, rowcount + 1, GTK_SHRINK | GTK_FILL, 
324                          GTK_FILL, 0, 0);
325         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_request_return_receipt),
326                                      item->ret_rcpt ? TRUE : FALSE);
327
328         rowcount++;
329
330         /* Save Copy to Folder */
331         checkbtn_save_copy_to_folder = gtk_check_button_new_with_label
332                 (_("Save copy of outgoing messages to this folder instead of Sent"));
333         gtk_widget_show(checkbtn_save_copy_to_folder);
334         gtk_table_attach(GTK_TABLE(table), checkbtn_save_copy_to_folder, 0, 2, 
335                          rowcount, rowcount + 1, GTK_SHRINK | GTK_FILL, GTK_FILL, 0, 0);
336         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_save_copy_to_folder),
337                                      item->prefs->save_copy_to_folder ? TRUE : FALSE);
338
339         rowcount++;
340
341         /* Default To */
342         checkbtn_default_to = gtk_check_button_new_with_label(_("Default To: "));
343         gtk_widget_show(checkbtn_default_to);
344         gtk_table_attach(GTK_TABLE(table), checkbtn_default_to, 0, 1, 
345                          rowcount, rowcount + 1, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 0, 0);
346         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_default_to), 
347                                      item->prefs->enable_default_to);
348
349         entry_default_to = gtk_entry_new();
350         gtk_widget_show(entry_default_to);
351         gtk_table_attach_defaults(GTK_TABLE(table), entry_default_to, 1, 2, rowcount, rowcount + 1);
352         SET_TOGGLE_SENSITIVITY(checkbtn_default_to, entry_default_to);
353         gtk_entry_set_text(GTK_ENTRY(entry_default_to), SAFE_STRING(item->prefs->default_to));
354         address_completion_register_entry(GTK_ENTRY(entry_default_to));
355
356         rowcount++;
357
358         /* Default address to reply to */
359         checkbtn_default_reply_to = gtk_check_button_new_with_label(_("Send replies to: "));
360         gtk_widget_show(checkbtn_default_reply_to);
361         gtk_table_attach(GTK_TABLE(table), checkbtn_default_reply_to, 0, 1, 
362                          rowcount, rowcount + 1, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 0, 0);
363         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_default_reply_to), 
364                                      item->prefs->enable_default_reply_to);
365
366         entry_default_reply_to = gtk_entry_new();
367         gtk_widget_show(entry_default_reply_to);
368         gtk_table_attach_defaults(GTK_TABLE(table), entry_default_reply_to, 1, 2, rowcount, rowcount + 1);
369         SET_TOGGLE_SENSITIVITY(checkbtn_default_reply_to, entry_default_reply_to);
370         gtk_entry_set_text(GTK_ENTRY(entry_default_reply_to), SAFE_STRING(item->prefs->default_reply_to));
371         address_completion_register_entry(GTK_ENTRY(entry_default_reply_to));
372
373         rowcount++;
374
375         /* Default account */
376         checkbtn_enable_default_account = gtk_check_button_new_with_label(_("Default account: "));
377         gtk_widget_show(checkbtn_enable_default_account);
378         gtk_table_attach(GTK_TABLE(table), checkbtn_enable_default_account, 0, 1, 
379                          rowcount, rowcount + 1, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 0, 0);
380         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_enable_default_account), 
381                                      item->prefs->enable_default_account);
382
383         optmenu_default_account = gtk_option_menu_new ();
384         gtk_widget_show (optmenu_default_account);
385         gtk_table_attach_defaults(GTK_TABLE(table), optmenu_default_account, 1, 2, 
386                                   rowcount, rowcount + 1);
387         optmenu_default_account_menu = gtk_menu_new ();
388
389         account_list = account_get_list();
390         account_index = 0;
391         index = 0;
392         for (cur_ac = account_list; cur_ac != NULL; cur_ac = cur_ac->next) {
393                 ac_prefs = (PrefsAccount *)cur_ac->data;
394                 MENUITEM_ADD (optmenu_default_account_menu, optmenu_default_account_menuitem,
395                                         ac_prefs->account_name?ac_prefs->account_name : _("Untitled"),
396                                         ac_prefs->account_id);
397                 /* get the index for menu's set_history (sad method?) */
398                 if (ac_prefs->account_id == item->prefs->default_account)
399                         account_index = index;
400                 index++;                        
401         }
402
403         optmenu = GTK_OPTION_MENU(optmenu_default_account);
404         gtk_option_menu_set_menu(optmenu, optmenu_default_account_menu);
405
406         gtk_option_menu_set_history(optmenu, account_index);
407
408         menu = gtk_option_menu_get_menu(optmenu);
409         menuitem = gtk_menu_get_active(GTK_MENU(menu));
410         gtk_menu_item_activate(GTK_MENU_ITEM(menuitem));
411
412         SET_TOGGLE_SENSITIVITY(checkbtn_enable_default_account, optmenu_default_account);
413
414         rowcount++;
415
416 #if USE_ASPELL
417         /* Default dictionary */
418         checkbtn_enable_default_dictionary = gtk_check_button_new_with_label(_("Default dictionary: "));
419         gtk_widget_show(checkbtn_enable_default_dictionary);
420         gtk_table_attach(GTK_TABLE(table), checkbtn_enable_default_dictionary, 0, 1,
421                          rowcount, rowcount + 1, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 0, 0);
422         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_enable_default_dictionary),
423                                      item->prefs->enable_default_dictionary);
424
425         optmenu_default_dictionary = gtk_option_menu_new();
426         gtk_widget_show(optmenu_default_dictionary);
427         gtk_table_attach_defaults(GTK_TABLE(table), optmenu_default_dictionary, 1, 2,
428                                 rowcount, rowcount + 1);
429
430         gtk_option_menu_set_menu(GTK_OPTION_MENU(optmenu_default_dictionary), 
431                                  gtkaspell_dictionary_option_menu_new(
432                                          prefs_common.aspell_path));
433
434         dictionary = item->prefs->default_dictionary;
435
436         optmenu = GTK_OPTION_MENU(optmenu_default_dictionary);
437
438         menu = gtk_option_menu_get_menu(optmenu);
439         if (dictionary)
440                 gtkaspell_set_dictionary_menu_active_item(optmenu_default_dictionary, dictionary);
441         menuitem = gtk_menu_get_active(GTK_MENU(menu));
442         gtk_menu_item_activate(GTK_MENU_ITEM(menuitem));
443
444         SET_TOGGLE_SENSITIVITY(checkbtn_enable_default_dictionary, optmenu_default_dictionary);
445
446         rowcount++;
447 #endif
448
449         page->window = GTK_WIDGET(window);
450         page->table = table;
451         page->checkbtn_request_return_receipt = checkbtn_request_return_receipt;
452         page->checkbtn_save_copy_to_folder = checkbtn_save_copy_to_folder;
453         page->checkbtn_default_to = checkbtn_default_to;
454         page->entry_default_to = entry_default_to;
455         page->checkbtn_default_reply_to = checkbtn_default_reply_to;
456         page->entry_default_reply_to = entry_default_reply_to;
457         page->checkbtn_enable_default_account = checkbtn_enable_default_account;
458         page->optmenu_default_account = optmenu_default_account;
459 #ifdef USE_ASPELL
460         page->checkbtn_enable_default_dictionary = checkbtn_enable_default_dictionary;
461         page->optmenu_default_dictionary = optmenu_default_dictionary;
462 #endif
463
464         address_completion_start(page->window);
465
466         page->page.widget = table;
467 }
468
469 void prefs_folder_item_compose_destroy_widget_func(PrefsPage *_page) 
470 {
471         struct FolderItemComposePage *page = (struct FolderItemComposePage *) _page;
472
473         address_completion_unregister_entry(GTK_ENTRY(page->entry_default_to));
474         address_completion_unregister_entry(GTK_ENTRY(page->entry_default_reply_to));
475         address_completion_end(page->window);
476 }
477
478 void prefs_folder_item_compose_save_func(PrefsPage *_page) 
479 {
480         struct FolderItemComposePage *page = (struct FolderItemComposePage *) _page;
481         FolderItemPrefs *prefs = page->item->prefs;
482         GtkWidget *menu;
483         GtkWidget *menuitem;
484
485         g_return_if_fail(prefs != NULL);
486
487         prefs->request_return_receipt = 
488             gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_request_return_receipt));
489         /* MIGRATION */    
490         page->item->ret_rcpt = prefs->request_return_receipt;
491
492         prefs->save_copy_to_folder = 
493             gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_save_copy_to_folder));
494
495         prefs->enable_default_to = 
496             gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_default_to));
497         ASSIGN_STRING(prefs->default_to,
498             gtk_editable_get_chars(GTK_EDITABLE(page->entry_default_to), 0, -1));
499
500         prefs->enable_default_reply_to = 
501             gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_default_reply_to));
502         ASSIGN_STRING(prefs->default_reply_to,
503             gtk_editable_get_chars(GTK_EDITABLE(page->entry_default_reply_to), 0, -1));
504
505         prefs->enable_default_account = 
506             gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_enable_default_account));
507         menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(page->optmenu_default_account));
508         menuitem = gtk_menu_get_active(GTK_MENU(menu));
509         prefs->default_account = GPOINTER_TO_INT(gtk_object_get_user_data(GTK_OBJECT(menuitem)));
510
511 #if USE_ASPELL
512         prefs->enable_default_dictionary =
513             gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_enable_default_dictionary));
514         menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(page->optmenu_default_dictionary));
515         ASSIGN_STRING(prefs->default_dictionary,
516             gtkaspell_get_dictionary_menu_active_item(menu));
517 #endif
518
519         folder_item_prefs_save_config(page->item);
520 }
521
522 gint prefs_folder_item_chmod_mode(gchar *folder_chmod) 
523 {
524         gint newmode = 0;
525         gchar *tmp;
526
527         if (folder_chmod) {
528                 newmode = strtol(folder_chmod, &tmp, 8);
529                 if (!(*(folder_chmod) && !(*tmp)))
530                         newmode = 0;
531         }
532
533         return newmode;
534 }
535
536 static void folder_color_set_dialog(GtkWidget *widget, gpointer data)
537 {
538         struct FolderItemGeneralPage *page = (struct FolderItemGeneralPage *) data;
539         gint rgbcolor;
540
541         rgbcolor = colorsel_select_color_rgb(_("Pick color for folder"), 
542                                              page->folder_color);
543         gtkut_set_widget_bgcolor_rgb(page->folder_color_btn, rgbcolor);
544         page->folder_color = rgbcolor;
545 }
546
547 struct FolderItemGeneralPage folder_item_general_page;
548
549 static void register_general_page()
550 {
551         folder_item_general_page.page.path = _("General");
552         folder_item_general_page.page.create_widget = prefs_folder_item_general_create_widget_func;
553         folder_item_general_page.page.destroy_widget = prefs_folder_item_general_destroy_widget_func;
554         folder_item_general_page.page.save_page = prefs_folder_item_general_save_func;
555         
556         prefs_folder_item_register_page((PrefsPage *) &folder_item_general_page);
557 }
558
559 struct FolderItemComposePage folder_item_compose_page;
560
561 static void register_compose_page()
562 {
563         folder_item_compose_page.page.path = _("Compose");
564         folder_item_compose_page.page.create_widget = prefs_folder_item_compose_create_widget_func;
565         folder_item_compose_page.page.destroy_widget = prefs_folder_item_compose_destroy_widget_func;
566         folder_item_compose_page.page.save_page = prefs_folder_item_compose_save_func;
567         
568         prefs_folder_item_register_page((PrefsPage *) &folder_item_compose_page);
569 }
570
571 static GSList *prefs_pages = NULL;
572
573 void prefs_folder_item_open(FolderItem *item)
574 {
575         if (prefs_pages == NULL) {
576                 register_general_page();
577                 register_compose_page();
578         }
579
580         prefswindow_open(_("Settings for folder"), prefs_pages, item);
581 }
582
583 void prefs_folder_item_register_page(PrefsPage *page)
584 {
585         prefs_pages = g_slist_append(prefs_pages, page);
586 }
587
588 void prefs_folder_item_unregister_page(PrefsPage *page)
589 {
590         prefs_pages = g_slist_remove(prefs_pages, page);
591 }