0.9.7claws15
[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
232         g_return_if_fail(prefs != NULL);
233
234         prefs->enable_simplify_subject =
235             gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_simplify_subject));
236         ASSIGN_STRING(prefs->simplify_subject_regexp,
237             gtk_editable_get_chars(GTK_EDITABLE(page->entry_simplify_subject), 0, -1));
238         
239 /*
240         if (page->item == page->folderview->summaryview->folder_item &&
241             (prefs->enable_simplify_subject != old_simplify_val ||  
242             0 != strcmp2(prefs->simplify_subject_regexp, old_simplify_str))) {
243                 summary_clear_all(page->folderview->summaryview);
244                 page->folderview->opened = NULL;
245                 page->folderview->selected = NULL;
246                 folderview_select(page->folderview, page->item);
247         }
248 */
249         prefs->enable_folder_chmod = 
250             gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_folder_chmod));
251         buf = gtk_editable_get_chars(GTK_EDITABLE(page->entry_folder_chmod), 0, -1);
252         prefs->folder_chmod = prefs_folder_item_chmod_mode(buf);
253         g_free(buf);
254
255         prefs->color = page->folder_color;
256         /* update folder view */
257         if (prefs->color > 0)
258                 folder_item_update(page->item, F_ITEM_UPDATE_MSGCNT);
259
260         prefs->enable_processing = 
261             gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_enable_processing));
262
263         folder_item_prefs_save_config(page->item);
264 }
265
266 void prefs_folder_item_compose_create_widget_func(PrefsPage * _page,
267                                                    GtkWindow * window,
268                                                    gpointer data)
269 {
270         struct FolderItemComposePage *page = (struct FolderItemComposePage *) _page;
271         FolderItem *item = (FolderItem *) data;
272         guint rowcount;
273
274         GtkWidget *table;
275         
276         GtkWidget *checkbtn_request_return_receipt;
277         GtkWidget *checkbtn_save_copy_to_folder;
278         GtkWidget *checkbtn_default_to;
279         GtkWidget *entry_default_to;
280         GtkWidget *checkbtn_default_reply_to;
281         GtkWidget *entry_default_reply_to;
282         GtkWidget *checkbtn_enable_default_account;
283         GtkWidget *optmenu_default_account;
284         GtkWidget *optmenu_default_account_menu;
285         GtkWidget *optmenu_default_account_menuitem;
286 #if USE_ASPELL
287         GtkWidget *checkbtn_enable_default_dictionary;
288         GtkWidget *optmenu_default_dictionary;
289 #endif
290         GList *cur_ac;
291         GList *account_list;
292 #if USE_ASPELL
293         gchar *dictionary;
294 #endif
295         PrefsAccount *ac_prefs;
296         GtkOptionMenu *optmenu;
297         GtkWidget *menu;
298         GtkWidget *menuitem;
299         gint account_index, index;
300
301         page->item         = item;
302
303         /* Table */
304 #if USE_ASPELL
305 # define TABLEHEIGHT 6
306 #else
307 # define TABLEHEIGHT 5
308 #endif
309         table = gtk_table_new(TABLEHEIGHT, 2, FALSE);
310         gtk_widget_show(table);
311         gtk_table_set_row_spacings(GTK_TABLE(table), -1);
312         rowcount = 0;
313
314         /* Request Return Receipt */
315         checkbtn_request_return_receipt = gtk_check_button_new_with_label
316                 (_("Request Return Receipt"));
317         gtk_widget_show(checkbtn_request_return_receipt);
318         gtk_table_attach(GTK_TABLE(table), checkbtn_request_return_receipt, 
319                          0, 2, rowcount, rowcount + 1, GTK_SHRINK | GTK_FILL, 
320                          GTK_FILL, 0, 0);
321         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_request_return_receipt),
322                                      item->ret_rcpt ? TRUE : FALSE);
323
324         rowcount++;
325
326         /* Save Copy to Folder */
327         checkbtn_save_copy_to_folder = gtk_check_button_new_with_label
328                 (_("Save copy of outgoing messages to this folder instead of Sent"));
329         gtk_widget_show(checkbtn_save_copy_to_folder);
330         gtk_table_attach(GTK_TABLE(table), checkbtn_save_copy_to_folder, 0, 2, 
331                          rowcount, rowcount + 1, GTK_SHRINK | GTK_FILL, GTK_FILL, 0, 0);
332         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_save_copy_to_folder),
333                                      item->prefs->save_copy_to_folder ? TRUE : FALSE);
334
335         rowcount++;
336
337         /* Default To */
338         checkbtn_default_to = gtk_check_button_new_with_label(_("Default To: "));
339         gtk_widget_show(checkbtn_default_to);
340         gtk_table_attach(GTK_TABLE(table), checkbtn_default_to, 0, 1, 
341                          rowcount, rowcount + 1, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 0, 0);
342         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_default_to), 
343                                      item->prefs->enable_default_to);
344
345         entry_default_to = gtk_entry_new();
346         gtk_widget_show(entry_default_to);
347         gtk_table_attach_defaults(GTK_TABLE(table), entry_default_to, 1, 2, rowcount, rowcount + 1);
348         SET_TOGGLE_SENSITIVITY(checkbtn_default_to, entry_default_to);
349         gtk_entry_set_text(GTK_ENTRY(entry_default_to), SAFE_STRING(item->prefs->default_to));
350         address_completion_register_entry(GTK_ENTRY(entry_default_to));
351
352         rowcount++;
353
354         /* Default address to reply to */
355         checkbtn_default_reply_to = gtk_check_button_new_with_label(_("Send replies to: "));
356         gtk_widget_show(checkbtn_default_reply_to);
357         gtk_table_attach(GTK_TABLE(table), checkbtn_default_reply_to, 0, 1, 
358                          rowcount, rowcount + 1, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 0, 0);
359         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_default_reply_to), 
360                                      item->prefs->enable_default_reply_to);
361
362         entry_default_reply_to = gtk_entry_new();
363         gtk_widget_show(entry_default_reply_to);
364         gtk_table_attach_defaults(GTK_TABLE(table), entry_default_reply_to, 1, 2, rowcount, rowcount + 1);
365         SET_TOGGLE_SENSITIVITY(checkbtn_default_reply_to, entry_default_reply_to);
366         gtk_entry_set_text(GTK_ENTRY(entry_default_reply_to), SAFE_STRING(item->prefs->default_reply_to));
367         address_completion_register_entry(GTK_ENTRY(entry_default_reply_to));
368
369         rowcount++;
370
371         /* Default account */
372         checkbtn_enable_default_account = gtk_check_button_new_with_label(_("Default account: "));
373         gtk_widget_show(checkbtn_enable_default_account);
374         gtk_table_attach(GTK_TABLE(table), checkbtn_enable_default_account, 0, 1, 
375                          rowcount, rowcount + 1, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 0, 0);
376         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_enable_default_account), 
377                                      item->prefs->enable_default_account);
378
379         optmenu_default_account = gtk_option_menu_new ();
380         gtk_widget_show (optmenu_default_account);
381         gtk_table_attach_defaults(GTK_TABLE(table), optmenu_default_account, 1, 2, 
382                                   rowcount, rowcount + 1);
383         optmenu_default_account_menu = gtk_menu_new ();
384
385         account_list = account_get_list();
386         account_index = 0;
387         index = 0;
388         for (cur_ac = account_list; cur_ac != NULL; cur_ac = cur_ac->next) {
389                 ac_prefs = (PrefsAccount *)cur_ac->data;
390                 MENUITEM_ADD (optmenu_default_account_menu, optmenu_default_account_menuitem,
391                                         ac_prefs->account_name?ac_prefs->account_name : _("Untitled"),
392                                         ac_prefs->account_id);
393                 /* get the index for menu's set_history (sad method?) */
394                 if (ac_prefs->account_id == item->prefs->default_account)
395                         account_index = index;
396                 index++;                        
397         }
398
399         optmenu = GTK_OPTION_MENU(optmenu_default_account);
400         gtk_option_menu_set_menu(optmenu, optmenu_default_account_menu);
401
402         gtk_option_menu_set_history(optmenu, account_index);
403
404         menu = gtk_option_menu_get_menu(optmenu);
405         menuitem = gtk_menu_get_active(GTK_MENU(menu));
406         gtk_menu_item_activate(GTK_MENU_ITEM(menuitem));
407
408         SET_TOGGLE_SENSITIVITY(checkbtn_enable_default_account, optmenu_default_account);
409
410         rowcount++;
411
412 #if USE_ASPELL
413         /* Default dictionary */
414         checkbtn_enable_default_dictionary = gtk_check_button_new_with_label(_("Default dictionary: "));
415         gtk_widget_show(checkbtn_enable_default_dictionary);
416         gtk_table_attach(GTK_TABLE(table), checkbtn_enable_default_dictionary, 0, 1,
417                          rowcount, rowcount + 1, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 0, 0);
418         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_enable_default_dictionary),
419                                      item->prefs->enable_default_dictionary);
420
421         optmenu_default_dictionary = gtk_option_menu_new();
422         gtk_widget_show(optmenu_default_dictionary);
423         gtk_table_attach_defaults(GTK_TABLE(table), optmenu_default_dictionary, 1, 2,
424                                 rowcount, rowcount + 1);
425
426         gtk_option_menu_set_menu(GTK_OPTION_MENU(optmenu_default_dictionary), 
427                                  gtkaspell_dictionary_option_menu_new(
428                                          prefs_common.aspell_path));
429
430         dictionary = item->prefs->default_dictionary;
431
432         optmenu = GTK_OPTION_MENU(optmenu_default_dictionary);
433
434         menu = gtk_option_menu_get_menu(optmenu);
435         if (dictionary)
436                 gtkaspell_set_dictionary_menu_active_item(optmenu_default_dictionary, dictionary);
437         menuitem = gtk_menu_get_active(GTK_MENU(menu));
438         gtk_menu_item_activate(GTK_MENU_ITEM(menuitem));
439
440         SET_TOGGLE_SENSITIVITY(checkbtn_enable_default_dictionary, optmenu_default_dictionary);
441
442         rowcount++;
443 #endif
444
445         page->window = GTK_WIDGET(window);
446         page->table = table;
447         page->checkbtn_request_return_receipt = checkbtn_request_return_receipt;
448         page->checkbtn_save_copy_to_folder = checkbtn_save_copy_to_folder;
449         page->checkbtn_default_to = checkbtn_default_to;
450         page->entry_default_to = entry_default_to;
451         page->checkbtn_default_reply_to = checkbtn_default_reply_to;
452         page->entry_default_reply_to = entry_default_reply_to;
453         page->checkbtn_enable_default_account = checkbtn_enable_default_account;
454         page->optmenu_default_account = optmenu_default_account;
455 #ifdef USE_ASPELL
456         page->checkbtn_enable_default_dictionary = checkbtn_enable_default_dictionary;
457         page->optmenu_default_dictionary = optmenu_default_dictionary;
458 #endif
459
460         address_completion_start(page->window);
461
462         page->page.widget = table;
463 }
464
465 void prefs_folder_item_compose_destroy_widget_func(PrefsPage *_page) 
466 {
467         struct FolderItemComposePage *page = (struct FolderItemComposePage *) _page;
468
469         address_completion_unregister_entry(GTK_ENTRY(page->entry_default_to));
470         address_completion_unregister_entry(GTK_ENTRY(page->entry_default_reply_to));
471         address_completion_end(page->window);
472 }
473
474 void prefs_folder_item_compose_save_func(PrefsPage *_page) 
475 {
476         struct FolderItemComposePage *page = (struct FolderItemComposePage *) _page;
477         FolderItemPrefs *prefs = page->item->prefs;
478         GtkWidget *menu;
479         GtkWidget *menuitem;
480
481         g_return_if_fail(prefs != NULL);
482
483         prefs->request_return_receipt = 
484             gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_request_return_receipt));
485         /* MIGRATION */    
486         page->item->ret_rcpt = prefs->request_return_receipt;
487
488         prefs->save_copy_to_folder = 
489             gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_save_copy_to_folder));
490
491         prefs->enable_default_to = 
492             gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_default_to));
493         ASSIGN_STRING(prefs->default_to,
494             gtk_editable_get_chars(GTK_EDITABLE(page->entry_default_to), 0, -1));
495
496         prefs->enable_default_reply_to = 
497             gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_default_reply_to));
498         ASSIGN_STRING(prefs->default_reply_to,
499             gtk_editable_get_chars(GTK_EDITABLE(page->entry_default_reply_to), 0, -1));
500
501         prefs->enable_default_account = 
502             gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_enable_default_account));
503         menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(page->optmenu_default_account));
504         menuitem = gtk_menu_get_active(GTK_MENU(menu));
505         prefs->default_account = GPOINTER_TO_INT(gtk_object_get_user_data(GTK_OBJECT(menuitem)));
506
507 #if USE_ASPELL
508         prefs->enable_default_dictionary =
509             gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_enable_default_dictionary));
510         menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(page->optmenu_default_dictionary));
511         ASSIGN_STRING(prefs->default_dictionary,
512             gtkaspell_get_dictionary_menu_active_item(menu));
513 #endif
514
515         folder_item_prefs_save_config(page->item);
516 }
517
518 gint prefs_folder_item_chmod_mode(gchar *folder_chmod) 
519 {
520         gint newmode = 0;
521         gchar *tmp;
522
523         if (folder_chmod) {
524                 newmode = strtol(folder_chmod, &tmp, 8);
525                 if (!(*(folder_chmod) && !(*tmp)))
526                         newmode = 0;
527         }
528
529         return newmode;
530 }
531
532 static void folder_color_set_dialog(GtkWidget *widget, gpointer data)
533 {
534         struct FolderItemGeneralPage *page = (struct FolderItemGeneralPage *) data;
535         gint rgbcolor;
536
537         rgbcolor = colorsel_select_color_rgb(_("Pick color for folder"), 
538                                              page->folder_color);
539         gtkut_set_widget_bgcolor_rgb(page->folder_color_btn, rgbcolor);
540         page->folder_color = rgbcolor;
541 }
542
543 struct FolderItemGeneralPage folder_item_general_page;
544
545 static void register_general_page()
546 {
547         folder_item_general_page.page.path = _("General");
548         folder_item_general_page.page.create_widget = prefs_folder_item_general_create_widget_func;
549         folder_item_general_page.page.destroy_widget = prefs_folder_item_general_destroy_widget_func;
550         folder_item_general_page.page.save_page = prefs_folder_item_general_save_func;
551         
552         prefs_folder_item_register_page((PrefsPage *) &folder_item_general_page);
553 }
554
555 struct FolderItemComposePage folder_item_compose_page;
556
557 static void register_compose_page()
558 {
559         folder_item_compose_page.page.path = _("Compose");
560         folder_item_compose_page.page.create_widget = prefs_folder_item_compose_create_widget_func;
561         folder_item_compose_page.page.destroy_widget = prefs_folder_item_compose_destroy_widget_func;
562         folder_item_compose_page.page.save_page = prefs_folder_item_compose_save_func;
563         
564         prefs_folder_item_register_page((PrefsPage *) &folder_item_compose_page);
565 }
566
567 static GSList *prefs_pages = NULL;
568
569 void prefs_folder_item_open(FolderItem *item)
570 {
571         if (prefs_pages == NULL) {
572                 register_general_page();
573                 register_compose_page();
574         }
575
576         prefswindow_open(_("Settings for folder"), prefs_pages, item);
577 }
578
579 void prefs_folder_item_register_page(PrefsPage *page)
580 {
581         prefs_pages = g_slist_append(prefs_pages, page);
582 }
583
584 void prefs_folder_item_unregister_page(PrefsPage *page)
585 {
586         prefs_pages = g_slist_remove(prefs_pages, page);
587 }