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