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