2 * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
3 * Copyright (C) 1999-2007 Hiroyuki Yamamoto and the Claws Mail team
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 3 of the License, or
8 * (at your option) any later version.
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.
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
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) */
31 #include <glib/gi18n.h>
33 #include "prefs_folder_item.h"
34 #include "folderview.h"
36 #include "summaryview.h"
39 #include "prefs_gtk.h"
40 #include "manage_window.h"
42 #include "addr_compl.h"
43 #include "prefs_common.h"
45 #include "filtering.h"
46 #include "folder_item_prefs.h"
47 #include "gtk/colorsel.h"
48 #include "string_match.h"
49 #include "quote_fmt.h"
52 #include "gtkaspell.h"
55 #define ASSIGN_STRING(string, value) \
61 typedef struct _FolderItemGeneralPage FolderItemGeneralPage;
62 typedef struct _FolderItemComposePage FolderItemComposePage;
63 typedef struct _FolderItemTemplatesPage FolderItemTemplatesPage;
64 static gboolean can_save = TRUE;
66 struct _FolderItemGeneralPage
73 GtkWidget *no_save_warning;
74 GtkWidget *folder_type;
75 GtkWidget *checkbtn_simplify_subject;
76 GtkWidget *entry_simplify_subject;
77 GtkWidget *entry_regexp_test_string;
78 GtkWidget *entry_regexp_test_result;
79 GtkWidget *checkbtn_folder_chmod;
80 GtkWidget *entry_folder_chmod;
81 GtkWidget *folder_color_btn;
82 GtkWidget *checkbtn_enable_processing;
83 GtkWidget *checkbtn_newmailcheck;
84 GtkWidget *checkbtn_offlinesync;
86 /* apply to sub folders */
87 GtkWidget *simplify_subject_rec_checkbtn;
88 GtkWidget *folder_chmod_rec_checkbtn;
89 GtkWidget *folder_color_rec_checkbtn;
90 GtkWidget *enable_processing_rec_checkbtn;
91 GtkWidget *newmailcheck_rec_checkbtn;
92 GtkWidget *offlinesync_rec_checkbtn;
97 struct _FolderItemComposePage
105 GtkWidget *no_save_warning;
106 GtkWidget *checkbtn_request_return_receipt;
107 GtkWidget *checkbtn_save_copy_to_folder;
108 GtkWidget *checkbtn_default_to;
109 GtkWidget *entry_default_to;
110 GtkWidget *checkbtn_default_reply_to;
111 GtkWidget *entry_default_reply_to;
112 GtkWidget *checkbtn_enable_default_account;
113 GtkWidget *optmenu_default_account;
115 GtkWidget *checkbtn_enable_default_dictionary;
116 GtkWidget *checkbtn_enable_default_alt_dictionary;
117 GtkWidget *optmenu_default_dictionary;
118 GtkWidget *optmenu_default_alt_dictionary;
121 /* apply to sub folders */
122 GtkWidget *request_return_receipt_rec_checkbtn;
123 GtkWidget *save_copy_to_folder_rec_checkbtn;
124 GtkWidget *default_to_rec_checkbtn;
125 GtkWidget *default_reply_to_rec_checkbtn;
126 GtkWidget *default_account_rec_checkbtn;
128 GtkWidget *default_dictionary_rec_checkbtn;
129 GtkWidget *default_alt_dictionary_rec_checkbtn;
133 struct _FolderItemTemplatesPage
141 GtkWidget *checkbtn_compose_with_format;
142 GtkWidget *compose_subject_format;
143 GtkWidget *compose_body_format;
144 GtkWidget *checkbtn_reply_with_format;
145 GtkWidget *reply_quotemark;
146 GtkWidget *reply_body_format;
147 GtkWidget *checkbtn_forward_with_format;
148 GtkWidget *forward_quotemark;
149 GtkWidget *forward_body_format;
151 /* apply to sub folders */
152 GtkWidget *new_msg_format_rec_checkbtn;
153 GtkWidget *reply_format_rec_checkbtn;
154 GtkWidget *forward_format_rec_checkbtn;
158 static void general_save_folder_prefs(FolderItem *folder, FolderItemGeneralPage *page);
159 static void compose_save_folder_prefs(FolderItem *folder, FolderItemComposePage *page);
160 static void templates_save_folder_prefs(FolderItem *folder, FolderItemTemplatesPage *page);
162 static gboolean general_save_recurse_func(GNode *node, gpointer data);
163 static gboolean compose_save_recurse_func(GNode *node, gpointer data);
164 static gboolean templates_save_recurse_func(GNode *node, gpointer data);
166 static gint prefs_folder_item_chmod_mode (gchar *folder_chmod);
168 static void folder_color_set_dialog(GtkWidget *widget, gpointer data);
169 static void folder_regexp_test_cb(GtkWidget *widget, gpointer data);
170 static void folder_regexp_set_subject_example_cb(GtkWidget *widget, gpointer data);
172 #define SAFE_STRING(str) \
175 static void prefs_folder_item_general_create_widget_func(PrefsPage * page_,
179 FolderItemGeneralPage *page = (FolderItemGeneralPage *) page_;
180 FolderItem *item = (FolderItem *) data;
187 GtkWidget *folder_type_menu;
188 GtkWidget *folder_type;
189 GtkWidget *dummy_checkbtn;
191 SpecialFolderItemType type;
193 GtkWidget *no_save_warning = NULL;
194 GtkWidget *checkbtn_simplify_subject;
195 GtkWidget *entry_simplify_subject;
196 GtkWidget *hbox_regexp;
197 GtkWidget *label_regexp_test;
198 GtkWidget *entry_regexp_test_string;
199 GtkWidget *left_arrow;
200 GtkWidget *entry_regexp_test_result;
202 GtkWidget *checkbtn_folder_chmod;
203 GtkWidget *entry_folder_chmod;
204 GtkWidget *folder_color;
205 GtkWidget *folder_color_btn;
206 GtkWidget *checkbtn_enable_processing;
207 GtkWidget *checkbtn_newmailcheck;
208 GtkWidget *checkbtn_offlinesync;
210 GtkWidget *simplify_subject_rec_checkbtn;
211 GtkWidget *folder_chmod_rec_checkbtn;
212 GtkWidget *folder_color_rec_checkbtn;
213 GtkWidget *enable_processing_rec_checkbtn;
214 GtkWidget *newmailcheck_rec_checkbtn;
215 GtkWidget *offlinesync_rec_checkbtn;
216 GtkTooltips *tooltips;
221 table = gtk_table_new(7, 4, FALSE);
222 gtk_container_set_border_width (GTK_CONTAINER (table), VBOX_BORDER);
223 gtk_table_set_row_spacings(GTK_TABLE(table), 4);
224 gtk_table_set_col_spacings(GTK_TABLE(table), 4);
228 no_save_warning = gtk_label_new(
229 _("<i>These preferences will not be saved as this folder "
230 "is a top-level one. However you can use them to set them "
231 "to the whole mailbox tree using \"Apply to subfolders\".</i>"));
232 gtk_label_set_use_markup(GTK_LABEL(no_save_warning), TRUE);
233 gtk_label_set_line_wrap(GTK_LABEL(no_save_warning), TRUE);
234 gtk_misc_set_alignment(GTK_MISC(no_save_warning), 0.0, 0.5);
235 gtk_table_attach(GTK_TABLE(table), no_save_warning, 0, 4,
236 rowcount, rowcount + 1, GTK_FILL, 0, 0, 0);
240 /* Apply to subfolders */
241 label = gtk_label_new(_("Apply to\nsubfolders"));
242 gtk_misc_set_alignment(GTK_MISC(label), 0.5, 0.5);
243 gtk_table_attach(GTK_TABLE(table), label, 3, 4,
244 rowcount, rowcount + 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
248 folder_type = gtk_option_menu_new ();
249 gtk_widget_show (folder_type);
252 if (item->stype == F_INBOX)
254 else if (folder_has_parent_of_type(item, F_OUTBOX))
256 else if (folder_has_parent_of_type(item, F_DRAFT))
258 else if (folder_has_parent_of_type(item, F_QUEUE))
260 else if (folder_has_parent_of_type(item, F_TRASH))
263 folder_type_menu = gtk_menu_new ();
265 MENUITEM_ADD (folder_type_menu, menuitem, _("Normal"), F_NORMAL);
266 MENUITEM_ADD (folder_type_menu, menuitem, _("Inbox"), F_INBOX);
267 MENUITEM_ADD (folder_type_menu, menuitem, _("Outbox"), F_OUTBOX);
268 MENUITEM_ADD (folder_type_menu, menuitem, _("Drafts"), F_DRAFT);
269 MENUITEM_ADD (folder_type_menu, menuitem, _("Queue"), F_QUEUE);
270 MENUITEM_ADD (folder_type_menu, menuitem, _("Trash"), F_TRASH);
271 gtk_option_menu_set_menu (GTK_OPTION_MENU (folder_type), folder_type_menu);
273 gtk_option_menu_set_history(GTK_OPTION_MENU(folder_type), type);
275 dummy_checkbtn = gtk_check_button_new();
276 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dummy_checkbtn), type != F_INBOX);
277 gtk_widget_set_sensitive(dummy_checkbtn, FALSE);
279 if (type == item->stype && type == F_NORMAL)
280 gtk_widget_set_sensitive(folder_type, TRUE);
282 gtk_widget_set_sensitive(folder_type, FALSE);
284 label = gtk_label_new(_("Folder type"));
285 gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
286 gtk_table_attach(GTK_TABLE(table), label, 0, 1,
287 rowcount, rowcount + 1, GTK_SHRINK | GTK_FILL, GTK_FILL, 0, 0);
288 gtk_table_attach(GTK_TABLE(table), folder_type, 1, 2,
289 rowcount, rowcount + 1, GTK_SHRINK | GTK_FILL, GTK_FILL, 0, 0);
290 gtk_table_attach(GTK_TABLE(table), dummy_checkbtn, 3, 4,
291 rowcount, rowcount + 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
295 /* Simplify Subject */
296 checkbtn_simplify_subject = gtk_check_button_new_with_label(_("Simplify Subject RegExp"));
297 gtk_table_attach(GTK_TABLE(table), checkbtn_simplify_subject, 0, 1,
298 rowcount, rowcount + 1, GTK_SHRINK | GTK_FILL, GTK_FILL, 0, 0);
299 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_simplify_subject),
300 item->prefs->enable_simplify_subject);
302 g_signal_connect(G_OBJECT(checkbtn_simplify_subject), "toggled",
303 G_CALLBACK(folder_regexp_set_subject_example_cb), page);
305 entry_simplify_subject = gtk_entry_new();
306 gtk_table_attach(GTK_TABLE(table), entry_simplify_subject, 1, 3,
307 rowcount, rowcount + 1, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
308 SET_TOGGLE_SENSITIVITY(checkbtn_simplify_subject, entry_simplify_subject);
309 gtk_entry_set_text(GTK_ENTRY(entry_simplify_subject),
310 SAFE_STRING(item->prefs->simplify_subject_regexp));
312 g_signal_connect(G_OBJECT(entry_simplify_subject), "changed",
313 G_CALLBACK(folder_regexp_test_cb), page);
315 simplify_subject_rec_checkbtn = gtk_check_button_new();
316 gtk_table_attach(GTK_TABLE(table), simplify_subject_rec_checkbtn, 3, 4,
317 rowcount, rowcount + 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
322 label_regexp_test = gtk_label_new(_("Test RegExp"));
323 gtk_misc_set_alignment(GTK_MISC(label_regexp_test), 0, 0.5);
324 gtk_table_attach(GTK_TABLE(table), label_regexp_test, 0, 1,
325 rowcount, rowcount + 1, GTK_SHRINK | GTK_FILL, GTK_FILL, 0, 0);
326 SET_TOGGLE_SENSITIVITY(checkbtn_simplify_subject, label_regexp_test);
328 entry_regexp_test_string = gtk_entry_new();
329 gtk_table_attach(GTK_TABLE(table), entry_regexp_test_string, 1, 2,
330 rowcount, rowcount + 1, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
331 SET_TOGGLE_SENSITIVITY(checkbtn_simplify_subject, entry_regexp_test_string);
333 g_signal_connect(G_OBJECT(entry_regexp_test_string), "changed",
334 G_CALLBACK(folder_regexp_test_cb), page);
336 hbox_regexp = gtk_hbox_new (FALSE, 4);
337 gtk_widget_show (hbox_regexp);
338 gtk_table_attach(GTK_TABLE(table), hbox_regexp, 2, 3,
339 rowcount, rowcount + 1, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
341 left_arrow = gtk_arrow_new(GTK_ARROW_RIGHT, GTK_SHADOW_OUT);
342 gtk_widget_show(left_arrow);
343 gtk_box_pack_start (GTK_BOX(hbox_regexp), left_arrow, FALSE, FALSE, 0);
344 SET_TOGGLE_SENSITIVITY(checkbtn_simplify_subject, left_arrow);
346 entry_regexp_test_result = gtk_entry_new();
347 gtk_box_pack_end (GTK_BOX(hbox_regexp), entry_regexp_test_result, TRUE, TRUE, 0);
348 SET_TOGGLE_SENSITIVITY(checkbtn_simplify_subject, entry_regexp_test_result);
349 gtk_entry_set_editable(GTK_ENTRY(entry_regexp_test_result), FALSE);
354 checkbtn_folder_chmod = gtk_check_button_new_with_label(_("Folder chmod"));
355 gtk_table_attach(GTK_TABLE(table), checkbtn_folder_chmod, 0, 1,
356 rowcount, rowcount + 1, GTK_SHRINK | GTK_FILL, GTK_FILL, 0, 0);
358 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_folder_chmod),
359 item->prefs->enable_folder_chmod);
361 entry_folder_chmod = gtk_entry_new();
362 gtk_table_attach(GTK_TABLE(table), entry_folder_chmod, 1, 2,
363 rowcount, rowcount + 1, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
364 SET_TOGGLE_SENSITIVITY(checkbtn_folder_chmod, entry_folder_chmod);
365 if (item->prefs->folder_chmod) {
368 buf = g_strdup_printf("%o", item->prefs->folder_chmod);
369 gtk_entry_set_text(GTK_ENTRY(entry_folder_chmod), buf);
373 folder_chmod_rec_checkbtn = gtk_check_button_new();
374 gtk_table_attach(GTK_TABLE(table), folder_chmod_rec_checkbtn, 3, 4,
375 rowcount, rowcount + 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
380 folder_color = gtk_label_new(_("Folder color"));
381 gtk_misc_set_alignment(GTK_MISC(folder_color), 0, 0.5);
382 gtk_table_attach(GTK_TABLE(table), folder_color, 0, 1,
383 rowcount, rowcount + 1, GTK_SHRINK | GTK_FILL, GTK_FILL, 0, 0);
385 hbox = gtk_hbox_new(FALSE, 0);
386 gtk_table_attach(GTK_TABLE(table), hbox, 1, 2,
387 rowcount, rowcount + 1, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
389 folder_color_btn = gtk_button_new_with_label("");
390 gtk_widget_set_size_request(folder_color_btn, 36, 26);
391 gtk_box_pack_start (GTK_BOX(hbox), folder_color_btn, FALSE, FALSE, 0);
392 tooltips = gtk_tooltips_new();
393 gtk_tooltips_set_tip(tooltips, folder_color_btn,
394 _("Pick color for folder"), NULL);
396 page->folder_color = item->prefs->color;
398 g_signal_connect(G_OBJECT(folder_color_btn), "clicked",
399 G_CALLBACK(folder_color_set_dialog),
402 gtkut_set_widget_bgcolor_rgb(folder_color_btn, item->prefs->color);
404 folder_color_rec_checkbtn = gtk_check_button_new();
405 gtk_table_attach(GTK_TABLE(table), folder_color_rec_checkbtn, 3, 4,
406 rowcount, rowcount + 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
410 /* Enable processing at startup */
411 checkbtn_enable_processing = gtk_check_button_new_with_label(_("Process at start-up"));
412 gtk_table_attach(GTK_TABLE(table), checkbtn_enable_processing, 0, 2,
413 rowcount, rowcount + 1, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
415 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_enable_processing),
416 item->prefs->enable_processing);
418 enable_processing_rec_checkbtn = gtk_check_button_new();
419 gtk_table_attach(GTK_TABLE(table), enable_processing_rec_checkbtn, 3, 4,
420 rowcount, rowcount + 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
424 /* Check folder for new mail */
425 checkbtn_newmailcheck = gtk_check_button_new_with_label(_("Scan for new mail"));
426 gtk_table_attach(GTK_TABLE(table), checkbtn_newmailcheck, 0, 2,
427 rowcount, rowcount+1, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
429 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_newmailcheck),
430 item->prefs->newmailcheck);
431 newmailcheck_rec_checkbtn = gtk_check_button_new();
432 gtk_table_attach(GTK_TABLE(table), newmailcheck_rec_checkbtn, 3, 4,
433 rowcount, rowcount + 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
437 /* Synchronise folder for offline use */
438 checkbtn_offlinesync = gtk_check_button_new_with_label(_("Synchronise for offline use"));
439 gtk_table_attach(GTK_TABLE(table), checkbtn_offlinesync, 0, 2,
440 rowcount, rowcount+1, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
442 offlinesync_rec_checkbtn = gtk_check_button_new();
443 gtk_table_attach(GTK_TABLE(table), offlinesync_rec_checkbtn, 3, 4,
444 rowcount, rowcount + 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
446 if (item->folder && (item->folder->klass->type != F_IMAP &&
447 item->folder->klass->type != F_NEWS)) {
448 item->prefs->offlinesync = TRUE;
449 gtk_widget_set_sensitive(GTK_WIDGET(checkbtn_offlinesync),
451 gtk_widget_set_sensitive(GTK_WIDGET(offlinesync_rec_checkbtn),
455 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_offlinesync),
456 item->prefs->offlinesync);
459 gtk_widget_show_all(table);
462 page->folder_type = folder_type;
463 page->no_save_warning = no_save_warning;
464 page->checkbtn_simplify_subject = checkbtn_simplify_subject;
465 page->entry_simplify_subject = entry_simplify_subject;
466 page->entry_regexp_test_string = entry_regexp_test_string;
467 page->entry_regexp_test_result = entry_regexp_test_result;
468 page->checkbtn_folder_chmod = checkbtn_folder_chmod;
469 page->entry_folder_chmod = entry_folder_chmod;
470 page->folder_color_btn = folder_color_btn;
471 page->checkbtn_enable_processing = checkbtn_enable_processing;
472 page->checkbtn_newmailcheck = checkbtn_newmailcheck;
473 page->checkbtn_offlinesync = checkbtn_offlinesync;
475 page->simplify_subject_rec_checkbtn = simplify_subject_rec_checkbtn;
476 page->folder_chmod_rec_checkbtn = folder_chmod_rec_checkbtn;
477 page->folder_color_rec_checkbtn = folder_color_rec_checkbtn;
478 page->enable_processing_rec_checkbtn = enable_processing_rec_checkbtn;
479 page->newmailcheck_rec_checkbtn = newmailcheck_rec_checkbtn;
480 page->offlinesync_rec_checkbtn = offlinesync_rec_checkbtn;
482 page->page.widget = table;
484 folder_regexp_set_subject_example_cb(NULL, page);
487 static void prefs_folder_item_general_destroy_widget_func(PrefsPage *page_)
489 /* FolderItemGeneralPage *page = (FolderItemGeneralPage *) page_; */
492 /** \brief Save the prefs in page to folder.
494 * If the folder is not the one specified in page->item, then only those properties
495 * that have the relevant 'apply to sub folders' button checked are saved
497 static void general_save_folder_prefs(FolderItem *folder, FolderItemGeneralPage *page)
499 FolderItemPrefs *prefs = folder->prefs;
501 gboolean all = FALSE;
502 SpecialFolderItemType type = F_NORMAL;
506 if (folder->path == NULL)
509 g_return_if_fail(prefs != NULL);
511 if (page->item == folder)
514 menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(page->folder_type));
515 menuitem = gtk_menu_get_active(GTK_MENU(menu));
516 type = GPOINTER_TO_INT
517 (g_object_get_data(G_OBJECT(menuitem), MENU_VAL_ID));
518 if (all && folder->stype != type) {
519 folder_item_change_type(folder, type);
522 if (all || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->simplify_subject_rec_checkbtn))) {
523 prefs->enable_simplify_subject =
524 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_simplify_subject));
525 ASSIGN_STRING(prefs->simplify_subject_regexp,
526 gtk_editable_get_chars(GTK_EDITABLE(page->entry_simplify_subject), 0, -1));
529 if (all || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->folder_chmod_rec_checkbtn))) {
530 prefs->enable_folder_chmod =
531 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_folder_chmod));
532 buf = gtk_editable_get_chars(GTK_EDITABLE(page->entry_folder_chmod), 0, -1);
533 prefs->folder_chmod = prefs_folder_item_chmod_mode(buf);
537 if (all || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->folder_color_rec_checkbtn))) {
538 int old_color = prefs->color;
539 prefs->color = page->folder_color;
541 /* update folder view */
542 if (prefs->color != old_color)
543 folder_item_update(folder, F_ITEM_UPDATE_MSGCNT);
546 if (all || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->enable_processing_rec_checkbtn))) {
547 prefs->enable_processing =
548 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_enable_processing));
551 if (all || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->newmailcheck_rec_checkbtn))) {
552 prefs->newmailcheck =
553 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_newmailcheck));
556 if (all || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->offlinesync_rec_checkbtn))) {
558 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_offlinesync));
561 folder_item_prefs_save_config(folder);
564 static gboolean general_save_recurse_func(GNode *node, gpointer data)
566 FolderItem *item = (FolderItem *) node->data;
567 FolderItemGeneralPage *page = (FolderItemGeneralPage *) data;
569 g_return_val_if_fail(item != NULL, TRUE);
570 g_return_val_if_fail(page != NULL, TRUE);
572 general_save_folder_prefs(item, page);
574 /* optimise by not continuing if none of the 'apply to sub folders'
575 check boxes are selected - and optimise the checking by only doing
577 if ((node == page->item->node) &&
578 !(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->simplify_subject_rec_checkbtn)) ||
579 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->folder_chmod_rec_checkbtn)) ||
580 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->folder_color_rec_checkbtn)) ||
581 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->enable_processing_rec_checkbtn)) ||
582 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->newmailcheck_rec_checkbtn)) ||
583 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->offlinesync_rec_checkbtn))))
589 static void prefs_folder_item_general_save_func(PrefsPage *page_)
591 FolderItemGeneralPage *page = (FolderItemGeneralPage *) page_;
593 g_node_traverse(page->item->node, G_PRE_ORDER, G_TRAVERSE_ALL,
594 -1, general_save_recurse_func, page);
596 main_window_set_menu_sensitive(mainwindow_get_mainwindow());
600 static RecvProtocol item_protocol(FolderItem *item)
606 if (!item->folder->account)
608 return item->folder->account->protocol;
611 static void prefs_folder_item_compose_create_widget_func(PrefsPage * page_,
615 FolderItemComposePage *page = (FolderItemComposePage *) page_;
616 FolderItem *item = (FolderItem *) data;
622 GtkWidget *no_save_warning = NULL;
623 GtkWidget *checkbtn_request_return_receipt = NULL;
624 GtkWidget *checkbtn_save_copy_to_folder = NULL;
625 GtkWidget *checkbtn_default_to = NULL;
626 GtkWidget *entry_default_to = NULL;
627 GtkWidget *checkbtn_default_reply_to = NULL;
628 GtkWidget *entry_default_reply_to = NULL;
629 GtkWidget *checkbtn_enable_default_account = NULL;
630 GtkWidget *optmenu_default_account = NULL;
631 GtkWidget *optmenu_default_account_menu = NULL;
632 GtkWidget *optmenu_default_account_menuitem = NULL;
634 GtkWidget *checkbtn_enable_default_dictionary = NULL;
635 GtkWidget *optmenu_default_dictionary = NULL;
636 GtkWidget *checkbtn_enable_default_alt_dictionary = NULL;
637 GtkWidget *optmenu_default_alt_dictionary = NULL;
639 GtkWidget *request_return_receipt_rec_checkbtn = NULL;
640 GtkWidget *save_copy_to_folder_rec_checkbtn = NULL;
641 GtkWidget *default_to_rec_checkbtn = NULL;
642 GtkWidget *default_reply_to_rec_checkbtn = NULL;
643 GtkWidget *default_account_rec_checkbtn = NULL;
645 GtkWidget *default_dictionary_rec_checkbtn = NULL;
646 GtkWidget *default_alt_dictionary_rec_checkbtn = NULL;
654 PrefsAccount *ac_prefs;
655 GtkOptionMenu *optmenu;
658 gint account_index, index;
664 # define TABLEHEIGHT 7
666 # define TABLEHEIGHT 6
668 table = gtk_table_new(TABLEHEIGHT, 3, FALSE);
669 gtk_container_set_border_width (GTK_CONTAINER (table), VBOX_BORDER);
670 gtk_table_set_row_spacings(GTK_TABLE(table), 4);
671 gtk_table_set_col_spacings(GTK_TABLE(table), 4);
675 no_save_warning = gtk_label_new(
676 _("<i>These preferences will not be saved as this folder "
677 "is a top-level one. However you can use them to set them "
678 "to the whole mailbox tree using \"Apply to subfolders\".</i>"));
679 gtk_label_set_use_markup(GTK_LABEL(no_save_warning), TRUE);
680 gtk_label_set_line_wrap(GTK_LABEL(no_save_warning), TRUE);
681 gtk_misc_set_alignment(GTK_MISC(no_save_warning), 0.0, 0.5);
682 gtk_table_attach(GTK_TABLE(table), no_save_warning, 0, 3,
683 rowcount, rowcount + 1, GTK_FILL, 0, 0, 0);
687 /* Apply to subfolders */
688 label = gtk_label_new(_("Apply to\nsubfolders"));
689 gtk_misc_set_alignment(GTK_MISC(label), 0.5, 0.5);
690 gtk_table_attach(GTK_TABLE(table), label, 2, 3,
691 rowcount, rowcount + 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
694 if (item_protocol(item) != A_NNTP) {
695 /* Request Return Receipt */
696 checkbtn_request_return_receipt = gtk_check_button_new_with_label
697 (_("Request Return Receipt"));
698 gtk_table_attach(GTK_TABLE(table), checkbtn_request_return_receipt,
699 0, 2, rowcount, rowcount + 1, GTK_SHRINK | GTK_FILL,
701 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_request_return_receipt),
702 item->ret_rcpt ? TRUE : FALSE);
704 request_return_receipt_rec_checkbtn = gtk_check_button_new();
705 gtk_table_attach(GTK_TABLE(table), request_return_receipt_rec_checkbtn, 2, 3,
706 rowcount, rowcount + 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
710 /* Save Copy to Folder */
711 checkbtn_save_copy_to_folder = gtk_check_button_new_with_label
712 (_("Save copy of outgoing messages to this folder instead of Sent"));
713 gtk_table_attach(GTK_TABLE(table), checkbtn_save_copy_to_folder, 0, 2,
714 rowcount, rowcount + 1, GTK_SHRINK | GTK_FILL, GTK_FILL, 0, 0);
715 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_save_copy_to_folder),
716 item->prefs->save_copy_to_folder ? TRUE : FALSE);
718 save_copy_to_folder_rec_checkbtn = gtk_check_button_new();
719 gtk_table_attach(GTK_TABLE(table), save_copy_to_folder_rec_checkbtn, 2, 3,
720 rowcount, rowcount + 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
725 checkbtn_default_to = gtk_check_button_new_with_label(_("Default To:"));
726 gtk_table_attach(GTK_TABLE(table), checkbtn_default_to, 0, 1,
727 rowcount, rowcount + 1, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 0, 0);
728 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_default_to),
729 item->prefs->enable_default_to);
731 entry_default_to = gtk_entry_new();
732 gtk_table_attach(GTK_TABLE(table), entry_default_to, 1, 2,
733 rowcount, rowcount + 1, GTK_EXPAND | GTK_FILL, GTK_SHRINK, 0, 0);
734 SET_TOGGLE_SENSITIVITY(checkbtn_default_to, entry_default_to);
735 gtk_entry_set_text(GTK_ENTRY(entry_default_to), SAFE_STRING(item->prefs->default_to));
736 address_completion_register_entry(GTK_ENTRY(entry_default_to),
739 default_to_rec_checkbtn = gtk_check_button_new();
740 gtk_table_attach(GTK_TABLE(table), default_to_rec_checkbtn, 2, 3,
741 rowcount, rowcount + 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
745 /* Default address to reply to */
746 checkbtn_default_reply_to = gtk_check_button_new_with_label(_("Default To: for replies"));
747 gtk_table_attach(GTK_TABLE(table), checkbtn_default_reply_to, 0, 1,
748 rowcount, rowcount + 1, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 0, 0);
749 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_default_reply_to),
750 item->prefs->enable_default_reply_to);
752 entry_default_reply_to = gtk_entry_new();
753 gtk_table_attach(GTK_TABLE(table), entry_default_reply_to, 1, 2,
754 rowcount, rowcount + 1, GTK_EXPAND | GTK_FILL, GTK_SHRINK, 0, 0);
755 SET_TOGGLE_SENSITIVITY(checkbtn_default_reply_to, entry_default_reply_to);
756 gtk_entry_set_text(GTK_ENTRY(entry_default_reply_to), SAFE_STRING(item->prefs->default_reply_to));
757 address_completion_register_entry(
758 GTK_ENTRY(entry_default_reply_to), TRUE);
760 default_reply_to_rec_checkbtn = gtk_check_button_new();
761 gtk_table_attach(GTK_TABLE(table), default_reply_to_rec_checkbtn, 2, 3,
762 rowcount, rowcount + 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
766 /* Default account */
767 checkbtn_enable_default_account = gtk_check_button_new_with_label(_("Default account"));
768 gtk_table_attach(GTK_TABLE(table), checkbtn_enable_default_account, 0, 1,
769 rowcount, rowcount + 1, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 0, 0);
770 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_enable_default_account),
771 item->prefs->enable_default_account);
773 optmenu_default_account = gtk_option_menu_new ();
774 gtk_table_attach(GTK_TABLE(table), optmenu_default_account, 1, 2,
775 rowcount, rowcount + 1, GTK_EXPAND | GTK_FILL, GTK_SHRINK, 0, 0);
776 optmenu_default_account_menu = gtk_menu_new ();
778 account_list = account_get_list();
781 for (cur_ac = account_list; cur_ac != NULL; cur_ac = cur_ac->next) {
782 ac_prefs = (PrefsAccount *)cur_ac->data;
783 if (item->folder->account &&
784 ( (item_protocol(item) == A_NNTP && ac_prefs->protocol != A_NNTP)
785 ||(item_protocol(item) != A_NNTP && ac_prefs->protocol == A_NNTP)))
788 if (item->folder->klass->type != F_NEWS && ac_prefs->protocol == A_NNTP)
791 MENUITEM_ADD (optmenu_default_account_menu, optmenu_default_account_menuitem,
792 ac_prefs->account_name?ac_prefs->account_name : _("Untitled"),
793 ac_prefs->account_id);
794 /* get the index for menu's set_history (sad method?) */
795 if (ac_prefs->account_id == item->prefs->default_account)
796 account_index = index;
800 optmenu = GTK_OPTION_MENU(optmenu_default_account);
801 gtk_option_menu_set_menu(optmenu, optmenu_default_account_menu);
803 gtk_option_menu_set_history(optmenu, account_index);
805 menu = gtk_option_menu_get_menu(optmenu);
806 menuitem = gtk_menu_get_active(GTK_MENU(menu));
807 gtk_menu_item_activate(GTK_MENU_ITEM(menuitem));
809 SET_TOGGLE_SENSITIVITY(checkbtn_enable_default_account, optmenu_default_account);
811 default_account_rec_checkbtn = gtk_check_button_new();
812 gtk_table_attach(GTK_TABLE(table), default_account_rec_checkbtn, 2, 3,
813 rowcount, rowcount + 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
817 /* Default dictionary */
818 checkbtn_enable_default_dictionary = gtk_check_button_new_with_label(_("Default dictionary"));
819 gtk_table_attach(GTK_TABLE(table), checkbtn_enable_default_dictionary, 0, 1,
820 rowcount, rowcount + 1, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 0, 0);
821 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_enable_default_dictionary),
822 item->prefs->enable_default_dictionary);
824 optmenu_default_dictionary = gtk_option_menu_new();
825 gtk_table_attach(GTK_TABLE(table), optmenu_default_dictionary, 1, 2,
826 rowcount, rowcount + 1, GTK_EXPAND | GTK_FILL, GTK_SHRINK, 0, 0);
828 gtk_option_menu_set_menu(GTK_OPTION_MENU(optmenu_default_dictionary),
829 gtkaspell_dictionary_option_menu_new(
830 prefs_common.aspell_path));
832 dictionary = item->prefs->default_dictionary;
834 optmenu = GTK_OPTION_MENU(optmenu_default_dictionary);
836 menu = gtk_option_menu_get_menu(optmenu);
838 gtkaspell_set_dictionary_menu_active_item(optmenu_default_dictionary, dictionary);
839 menuitem = gtk_menu_get_active(GTK_MENU(menu));
840 gtk_menu_item_activate(GTK_MENU_ITEM(menuitem));
842 SET_TOGGLE_SENSITIVITY(checkbtn_enable_default_dictionary, optmenu_default_dictionary);
844 default_dictionary_rec_checkbtn = gtk_check_button_new();
845 gtk_table_attach(GTK_TABLE(table), default_dictionary_rec_checkbtn, 2, 3,
846 rowcount, rowcount + 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
850 /* Default dictionary */
851 checkbtn_enable_default_alt_dictionary = gtk_check_button_new_with_label(_("Default alternate dictionary"));
852 gtk_table_attach(GTK_TABLE(table), checkbtn_enable_default_alt_dictionary, 0, 1,
853 rowcount, rowcount + 1, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 0, 0);
854 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_enable_default_alt_dictionary),
855 item->prefs->enable_default_alt_dictionary);
857 optmenu_default_alt_dictionary = gtk_option_menu_new();
858 gtk_table_attach(GTK_TABLE(table), optmenu_default_alt_dictionary, 1, 2,
859 rowcount, rowcount + 1, GTK_EXPAND | GTK_FILL, GTK_SHRINK, 0, 0);
861 gtk_option_menu_set_menu(GTK_OPTION_MENU(optmenu_default_alt_dictionary),
862 gtkaspell_dictionary_option_menu_new_with_refresh(
863 prefs_common.aspell_path, FALSE));
865 dictionary = item->prefs->default_alt_dictionary;
867 optmenu = GTK_OPTION_MENU(optmenu_default_alt_dictionary);
869 menu = gtk_option_menu_get_menu(optmenu);
871 gtkaspell_set_dictionary_menu_active_item(optmenu_default_alt_dictionary, dictionary);
872 menuitem = gtk_menu_get_active(GTK_MENU(menu));
873 gtk_menu_item_activate(GTK_MENU_ITEM(menuitem));
875 SET_TOGGLE_SENSITIVITY(checkbtn_enable_default_alt_dictionary, optmenu_default_alt_dictionary);
877 default_alt_dictionary_rec_checkbtn = gtk_check_button_new();
878 gtk_table_attach(GTK_TABLE(table), default_alt_dictionary_rec_checkbtn, 2, 3,
879 rowcount, rowcount + 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
884 gtk_widget_show_all(table);
886 page->window = GTK_WIDGET(window);
888 page->no_save_warning = no_save_warning;
889 page->checkbtn_request_return_receipt = checkbtn_request_return_receipt;
890 page->checkbtn_save_copy_to_folder = checkbtn_save_copy_to_folder;
891 page->checkbtn_default_to = checkbtn_default_to;
892 page->entry_default_to = entry_default_to;
893 page->checkbtn_default_reply_to = checkbtn_default_reply_to;
894 page->entry_default_reply_to = entry_default_reply_to;
895 page->checkbtn_enable_default_account = checkbtn_enable_default_account;
896 page->optmenu_default_account = optmenu_default_account;
898 page->checkbtn_enable_default_dictionary = checkbtn_enable_default_dictionary;
899 page->optmenu_default_dictionary = optmenu_default_dictionary;
900 page->checkbtn_enable_default_alt_dictionary = checkbtn_enable_default_alt_dictionary;
901 page->optmenu_default_alt_dictionary = optmenu_default_alt_dictionary;
904 page->request_return_receipt_rec_checkbtn = request_return_receipt_rec_checkbtn;
905 page->save_copy_to_folder_rec_checkbtn = save_copy_to_folder_rec_checkbtn;
906 page->default_to_rec_checkbtn = default_to_rec_checkbtn;
907 page->default_reply_to_rec_checkbtn = default_reply_to_rec_checkbtn;
908 page->default_account_rec_checkbtn = default_account_rec_checkbtn;
910 page->default_dictionary_rec_checkbtn = default_dictionary_rec_checkbtn;
911 page->default_alt_dictionary_rec_checkbtn = default_alt_dictionary_rec_checkbtn;
914 address_completion_start(page->window);
916 page->page.widget = table;
919 static void prefs_folder_item_compose_destroy_widget_func(PrefsPage *page_)
921 FolderItemComposePage *page = (FolderItemComposePage *) page_;
923 if (page->entry_default_to)
924 address_completion_unregister_entry(GTK_ENTRY(page->entry_default_to));
925 if (page->entry_default_reply_to)
926 address_completion_unregister_entry(GTK_ENTRY(page->entry_default_reply_to));
927 address_completion_end(page->window);
930 /** \brief Save the prefs in page to folder.
932 * If the folder is not the one specified in page->item, then only those properties
933 * that have the relevant 'apply to sub folders' button checked are saved
935 static void compose_save_folder_prefs(FolderItem *folder, FolderItemComposePage *page)
937 FolderItemPrefs *prefs = folder->prefs;
940 gboolean all = FALSE;
942 if (folder->path == NULL)
945 if (page->item == folder)
948 g_return_if_fail(prefs != NULL);
950 if (item_protocol(folder) != A_NNTP) {
951 if (all || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->request_return_receipt_rec_checkbtn))) {
952 prefs->request_return_receipt =
953 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_request_return_receipt));
955 folder->ret_rcpt = prefs->request_return_receipt;
958 if (all || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->save_copy_to_folder_rec_checkbtn))) {
959 prefs->save_copy_to_folder =
960 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_save_copy_to_folder));
963 if (all || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->default_to_rec_checkbtn))) {
965 prefs->enable_default_to =
966 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_default_to));
967 ASSIGN_STRING(prefs->default_to,
968 gtk_editable_get_chars(GTK_EDITABLE(page->entry_default_to), 0, -1));
971 if (all || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->default_reply_to_rec_checkbtn))) {
972 prefs->enable_default_reply_to =
973 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_default_reply_to));
974 ASSIGN_STRING(prefs->default_reply_to,
975 gtk_editable_get_chars(GTK_EDITABLE(page->entry_default_reply_to), 0, -1));
978 prefs->request_return_receipt = FALSE;
979 prefs->save_copy_to_folder = FALSE;
980 prefs->enable_default_to = FALSE;
981 prefs->enable_default_reply_to = FALSE;
983 if (all || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->default_account_rec_checkbtn))) {
984 prefs->enable_default_account =
985 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_enable_default_account));
986 menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(page->optmenu_default_account));
987 menuitem = gtk_menu_get_active(GTK_MENU(menu));
988 prefs->default_account = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(menuitem), MENU_VAL_ID));
992 if (all || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->default_dictionary_rec_checkbtn))) {
993 prefs->enable_default_dictionary =
994 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_enable_default_dictionary));
995 menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(page->optmenu_default_dictionary));
996 ASSIGN_STRING(prefs->default_dictionary,
997 gtkaspell_get_dictionary_menu_active_item(menu));
999 if (all || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->default_alt_dictionary_rec_checkbtn))) {
1000 prefs->enable_default_alt_dictionary =
1001 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_enable_default_alt_dictionary));
1002 menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(page->optmenu_default_alt_dictionary));
1003 ASSIGN_STRING(prefs->default_alt_dictionary,
1004 gtkaspell_get_dictionary_menu_active_item(menu));
1008 folder_item_prefs_save_config(folder);
1011 static gboolean compose_save_recurse_func(GNode *node, gpointer data)
1013 FolderItem *item = (FolderItem *) node->data;
1014 FolderItemComposePage *page = (FolderItemComposePage *) data;
1016 g_return_val_if_fail(item != NULL, TRUE);
1017 g_return_val_if_fail(page != NULL, TRUE);
1019 compose_save_folder_prefs(item, page);
1021 /* optimise by not continuing if none of the 'apply to sub folders'
1022 check boxes are selected - and optimise the checking by only doing
1024 if ((node == page->item->node) && item_protocol(item) != A_NNTP &&
1025 !(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->request_return_receipt_rec_checkbtn)) ||
1026 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->save_copy_to_folder_rec_checkbtn)) ||
1027 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->default_to_rec_checkbtn)) ||
1028 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->default_account_rec_checkbtn)) ||
1030 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->default_dictionary_rec_checkbtn)) ||
1031 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->default_alt_dictionary_rec_checkbtn)) ||
1033 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->default_reply_to_rec_checkbtn))))
1035 else if ((node == page->item->node) && item_protocol(item) == A_NNTP &&
1036 !(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->default_account_rec_checkbtn))
1038 || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->default_dictionary_rec_checkbtn))
1039 || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->default_alt_dictionary_rec_checkbtn))
1047 static void prefs_folder_item_compose_save_func(PrefsPage *page_)
1049 FolderItemComposePage *page = (FolderItemComposePage *) page_;
1051 g_node_traverse(page->item->node, G_PRE_ORDER, G_TRAVERSE_ALL,
1052 -1, compose_save_recurse_func, page);
1056 static void prefs_folder_item_templates_create_widget_func(PrefsPage * page_,
1060 FolderItemTemplatesPage *page = (FolderItemTemplatesPage *) page_;
1061 FolderItem *item = (FolderItem *) data;
1067 GtkWidget *alignment;
1068 GtkWidget *new_msg_format_rec_checkbtn;
1069 GtkWidget *reply_format_rec_checkbtn;
1070 GtkWidget *forward_format_rec_checkbtn;
1075 table = gtk_table_new(5, 3, FALSE);
1076 gtk_container_set_border_width (GTK_CONTAINER (table), VBOX_BORDER);
1077 gtk_table_set_row_spacings(GTK_TABLE(table), 4);
1078 gtk_table_set_col_spacings(GTK_TABLE(table), 4);
1081 /* Apply to subfolders */
1082 label = gtk_label_new(_("Apply to\nsubfolders"));
1083 gtk_misc_set_alignment(GTK_MISC(label), 0.5, 0.5);
1084 gtk_table_attach(GTK_TABLE(table), label, 2, 3,
1085 rowcount, rowcount + 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
1088 /* compose format */
1089 vbox = gtk_vbox_new (FALSE, VSPACING);
1090 gtk_widget_show (vbox);
1091 gtk_container_set_border_width (GTK_CONTAINER (vbox), 0);
1092 gtk_table_attach(GTK_TABLE(table), vbox, 1, 2,
1093 rowcount, rowcount + 1, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
1095 quotefmt_create_new_msg_fmt_widgets(
1098 &page->checkbtn_compose_with_format,
1099 _("Use a specific format for new messages"),
1100 &page->compose_subject_format,
1101 &page->compose_body_format,
1104 vbox = gtk_vbox_new (FALSE, VSPACING);
1105 gtk_widget_show (vbox);
1106 gtk_container_set_border_width (GTK_CONTAINER (vbox), 0);
1107 gtk_table_attach(GTK_TABLE(table), vbox, 2, 3,
1108 rowcount, rowcount + 1, GTK_SHRINK, GTK_FILL, 0, 0);
1110 new_msg_format_rec_checkbtn = gtk_check_button_new();
1111 gtk_box_pack_start (GTK_BOX(vbox), new_msg_format_rec_checkbtn, FALSE, FALSE, 0);
1112 alignment = gtk_alignment_new(0, 1, 0, 0);
1113 gtk_box_pack_start (GTK_BOX(vbox), alignment, FALSE, FALSE, 0);
1118 vbox = gtk_vbox_new (FALSE, VSPACING);
1119 gtk_widget_show (vbox);
1120 gtk_container_set_border_width (GTK_CONTAINER (vbox), 0);
1121 gtk_table_attach(GTK_TABLE(table), vbox, 1, 2,
1122 rowcount, rowcount + 1, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
1124 quotefmt_create_reply_fmt_widgets(
1127 &page->checkbtn_reply_with_format,
1128 _("Use a specific reply quote format"),
1129 &page->reply_quotemark,
1130 &page->reply_body_format,
1133 vbox = gtk_vbox_new (FALSE, VSPACING);
1134 gtk_widget_show (vbox);
1135 gtk_container_set_border_width (GTK_CONTAINER (vbox), 0);
1136 gtk_table_attach(GTK_TABLE(table), vbox, 2, 3,
1137 rowcount, rowcount + 1, GTK_SHRINK, GTK_FILL, 0, 0);
1139 reply_format_rec_checkbtn = gtk_check_button_new();
1140 gtk_box_pack_start (GTK_BOX(vbox), reply_format_rec_checkbtn, FALSE, FALSE, 0);
1141 alignment = gtk_alignment_new(0, 1, 0, 0);
1142 gtk_box_pack_start (GTK_BOX(vbox), alignment, FALSE, FALSE, 0);
1146 /* forward format */
1147 vbox = gtk_vbox_new (FALSE, VSPACING);
1148 gtk_widget_show (vbox);
1149 gtk_container_set_border_width (GTK_CONTAINER (vbox), 0);
1150 gtk_table_attach(GTK_TABLE(table), vbox, 1, 2,
1151 rowcount, rowcount + 1, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
1153 quotefmt_create_forward_fmt_widgets(
1156 &page->checkbtn_forward_with_format,
1157 _("Use a specific forward quote format"),
1158 &page->forward_quotemark,
1159 &page->forward_body_format,
1162 vbox = gtk_vbox_new (FALSE, VSPACING);
1163 gtk_widget_show (vbox);
1164 gtk_container_set_border_width (GTK_CONTAINER (vbox), 0);
1165 gtk_table_attach(GTK_TABLE(table), vbox, 2, 3,
1166 rowcount, rowcount + 1, GTK_SHRINK, GTK_FILL, 0, 0);
1168 forward_format_rec_checkbtn = gtk_check_button_new();
1169 gtk_box_pack_start (GTK_BOX(vbox), forward_format_rec_checkbtn, FALSE, FALSE, 0);
1170 alignment = gtk_alignment_new(0, 1, 0, 0);
1171 gtk_box_pack_start (GTK_BOX(vbox), alignment, FALSE, FALSE, 0);
1175 /* information button */
1176 vbox = gtk_vbox_new (FALSE, VSPACING);
1177 gtk_widget_show (vbox);
1178 gtk_container_set_border_width (GTK_CONTAINER (vbox), 0);
1179 gtk_table_attach(GTK_TABLE(table), vbox, 1, 2,
1180 rowcount, rowcount + 1, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
1182 quotefmt_add_info_button(window, vbox);
1185 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(page->checkbtn_compose_with_format),
1186 item->prefs->compose_with_format);
1187 pref_set_entry_from_pref(GTK_ENTRY(page->compose_subject_format),
1188 item->prefs->compose_subject_format);
1189 pref_set_textview_from_pref(GTK_TEXT_VIEW(page->compose_body_format),
1190 item->prefs->compose_body_format);
1192 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(page->checkbtn_reply_with_format),
1193 item->prefs->reply_with_format);
1194 pref_set_entry_from_pref(GTK_ENTRY(page->reply_quotemark),
1195 item->prefs->reply_quotemark);
1196 pref_set_textview_from_pref(GTK_TEXT_VIEW(page->reply_body_format),
1197 item->prefs->reply_body_format);
1199 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(page->checkbtn_forward_with_format),
1200 item->prefs->forward_with_format);
1201 pref_set_entry_from_pref(GTK_ENTRY(page->forward_quotemark),
1202 item->prefs->forward_quotemark);
1203 pref_set_textview_from_pref(GTK_TEXT_VIEW(page->forward_body_format),
1204 item->prefs->forward_body_format);
1206 gtk_widget_show_all(table);
1208 page->window = GTK_WIDGET(window);
1209 page->table = table;
1211 page->new_msg_format_rec_checkbtn = new_msg_format_rec_checkbtn;
1212 page->reply_format_rec_checkbtn = reply_format_rec_checkbtn;
1213 page->forward_format_rec_checkbtn = forward_format_rec_checkbtn;
1215 page->page.widget = table;
1218 static void prefs_folder_item_templates_destroy_widget_func(PrefsPage *page_)
1220 /* FolderItemTemplatesPage *page = (FolderItemTemplatesPage *) page_; */
1223 /** \brief Save the prefs in page to folder.
1225 * If the folder is not the one specified in page->item, then only those properties
1226 * that have the relevant 'apply to sub folders' button checked are saved
1228 static void templates_save_folder_prefs(FolderItem *folder, FolderItemTemplatesPage *page)
1230 FolderItemPrefs *prefs = folder->prefs;
1231 gboolean all = FALSE;
1233 if (folder->path == NULL)
1236 if (page->item == folder)
1239 g_return_if_fail(prefs != NULL);
1241 /* save and check formats */
1243 if (all || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->new_msg_format_rec_checkbtn))) {
1244 prefs->compose_with_format =
1245 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_compose_with_format));
1246 prefs->compose_subject_format = pref_get_pref_from_entry(
1247 GTK_ENTRY(page->compose_subject_format));
1248 prefs->compose_body_format = pref_get_pref_from_textview(
1249 GTK_TEXT_VIEW(page->compose_body_format));
1250 quotefmt_check_new_msg_formats(prefs->compose_with_format,
1251 prefs->compose_subject_format,
1252 prefs->compose_body_format);
1255 if (all || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->reply_format_rec_checkbtn))) {
1256 prefs->reply_with_format =
1257 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_reply_with_format));
1258 prefs->reply_quotemark = gtk_editable_get_chars(
1259 GTK_EDITABLE(page->reply_quotemark), 0, -1);
1260 prefs->reply_body_format = pref_get_pref_from_textview(
1261 GTK_TEXT_VIEW(page->reply_body_format));
1262 quotefmt_check_reply_formats(prefs->reply_with_format,
1263 prefs->reply_quotemark,
1264 prefs->reply_body_format);
1267 if (all || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->forward_format_rec_checkbtn))) {
1268 prefs->forward_with_format =
1269 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_forward_with_format));
1270 prefs->forward_quotemark = gtk_editable_get_chars(
1271 GTK_EDITABLE(page->forward_quotemark), 0, -1);
1272 prefs->forward_body_format = pref_get_pref_from_textview(
1273 GTK_TEXT_VIEW(page->forward_body_format));
1274 quotefmt_check_forward_formats(prefs->forward_with_format,
1275 prefs->forward_quotemark,
1276 prefs->forward_body_format);
1279 folder_item_prefs_save_config(folder);
1282 static gboolean templates_save_recurse_func(GNode *node, gpointer data)
1284 FolderItem *item = (FolderItem *) node->data;
1285 FolderItemTemplatesPage *page = (FolderItemTemplatesPage *) data;
1287 g_return_val_if_fail(item != NULL, TRUE);
1288 g_return_val_if_fail(page != NULL, TRUE);
1290 templates_save_folder_prefs(item, page);
1292 /* optimise by not continuing if none of the 'apply to sub folders'
1293 check boxes are selected - and optimise the checking by only doing
1295 if ((node == page->item->node) &&
1296 !(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->new_msg_format_rec_checkbtn)) ||
1297 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->reply_format_rec_checkbtn)) ||
1298 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->forward_format_rec_checkbtn))))
1306 static void prefs_folder_item_templates_save_func(PrefsPage *page_)
1308 FolderItemTemplatesPage *page = (FolderItemTemplatesPage *) page_;
1310 g_node_traverse(page->item->node, G_PRE_ORDER, G_TRAVERSE_ALL,
1311 -1, templates_save_recurse_func, page);
1315 static gint prefs_folder_item_chmod_mode(gchar *folder_chmod)
1321 newmode = strtol(folder_chmod, &tmp, 8);
1322 if (!(*(folder_chmod) && !(*tmp)))
1329 static void folder_color_set_dialog(GtkWidget *widget, gpointer data)
1331 FolderItemGeneralPage *page = (FolderItemGeneralPage *) data;
1334 rgbcolor = colorsel_select_color_rgb(_("Pick color for folder"),
1335 page->folder_color);
1336 gtkut_set_widget_bgcolor_rgb(page->folder_color_btn, rgbcolor);
1337 page->folder_color = rgbcolor;
1340 static regex_t *summary_compile_simplify_regexp(gchar *simplify_subject_regexp)
1343 gchar buf[BUFFSIZE];
1344 regex_t *preg = NULL;
1346 preg = g_new0(regex_t, 1);
1348 err = string_match_precompile(simplify_subject_regexp,
1349 preg, REG_EXTENDED);
1351 regerror(err, preg, buf, BUFFSIZE);
1359 static void folder_regexp_test_cb(GtkWidget *widget, gpointer data)
1361 static GdkColor red;
1362 static gboolean colors_initialised = FALSE;
1363 static gchar buf[BUFFSIZE];
1364 FolderItemGeneralPage *page = (FolderItemGeneralPage *)data;
1365 gchar *test_string, *regexp;
1368 regexp = g_strdup(gtk_entry_get_text(GTK_ENTRY(page->entry_simplify_subject)));
1369 test_string = g_strdup(gtk_entry_get_text(GTK_ENTRY(page->entry_regexp_test_string)));
1371 if (!regexp || !regexp[0]) {
1372 gtk_widget_modify_base(page->entry_simplify_subject,
1373 GTK_STATE_NORMAL, NULL);
1375 gtk_entry_set_text(GTK_ENTRY(page->entry_regexp_test_result), test_string);
1376 g_free(test_string);
1381 if (!test_string || !test_string[0]) {
1386 if (!colors_initialised) {
1387 gdk_color_parse("#ff7070", &red);
1388 colors_initialised = gdk_colormap_alloc_color(
1389 gdk_colormap_get_system(), &red, FALSE, TRUE);
1392 preg = summary_compile_simplify_regexp(regexp);
1393 if (colors_initialised) {
1394 gtk_widget_modify_base(page->entry_simplify_subject,
1395 GTK_STATE_NORMAL, preg ? NULL : &red);
1399 string_remove_match(buf, BUFFSIZE, test_string, preg);
1401 gtk_entry_set_text(GTK_ENTRY(page->entry_regexp_test_result), buf);
1407 g_free(test_string);
1411 static gchar *folder_regexp_get_subject_example(void)
1413 MsgInfo *msginfo_selected;
1414 SummaryView *summaryview = NULL;
1416 if (!mainwindow_get_mainwindow())
1418 summaryview = mainwindow_get_mainwindow()->summaryview;
1420 msginfo_selected = summary_get_selected_msg(summaryview);
1421 return msginfo_selected ? g_strdup(msginfo_selected->subject) : NULL;
1424 static void folder_regexp_set_subject_example_cb(GtkWidget *widget, gpointer data)
1426 FolderItemGeneralPage *page = (FolderItemGeneralPage *)data;
1428 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_simplify_subject))) {
1429 gchar *subject = folder_regexp_get_subject_example();
1431 gtk_entry_set_text(GTK_ENTRY(page->entry_regexp_test_string), subject);
1437 static void register_general_page()
1439 static gchar *pfi_general_path[2];
1440 static FolderItemGeneralPage folder_item_general_page;
1442 pfi_general_path[0] = _("General");
1443 pfi_general_path[1] = NULL;
1445 folder_item_general_page.page.path = pfi_general_path;
1446 folder_item_general_page.page.create_widget = prefs_folder_item_general_create_widget_func;
1447 folder_item_general_page.page.destroy_widget = prefs_folder_item_general_destroy_widget_func;
1448 folder_item_general_page.page.save_page = prefs_folder_item_general_save_func;
1450 prefs_folder_item_register_page((PrefsPage *) &folder_item_general_page);
1454 static void register_compose_page(void)
1456 static gchar *pfi_compose_path[2];
1457 static FolderItemComposePage folder_item_compose_page;
1459 pfi_compose_path[0] = _("Compose");
1460 pfi_compose_path[1] = NULL;
1462 folder_item_compose_page.page.path = pfi_compose_path;
1463 folder_item_compose_page.page.create_widget = prefs_folder_item_compose_create_widget_func;
1464 folder_item_compose_page.page.destroy_widget = prefs_folder_item_compose_destroy_widget_func;
1465 folder_item_compose_page.page.save_page = prefs_folder_item_compose_save_func;
1467 prefs_folder_item_register_page((PrefsPage *) &folder_item_compose_page);
1470 static void register_templates_page(void)
1472 static gchar *pfi_templates_path[2];
1473 static FolderItemTemplatesPage folder_item_templates_page;
1475 pfi_templates_path[0] = _("Templates");
1476 pfi_templates_path[1] = NULL;
1478 folder_item_templates_page.page.path = pfi_templates_path;
1479 folder_item_templates_page.page.create_widget = prefs_folder_item_templates_create_widget_func;
1480 folder_item_templates_page.page.destroy_widget = prefs_folder_item_templates_destroy_widget_func;
1481 folder_item_templates_page.page.save_page = prefs_folder_item_templates_save_func;
1483 prefs_folder_item_register_page((PrefsPage *) &folder_item_templates_page);
1486 static GSList *prefs_pages = NULL;
1488 void prefs_folder_item_open(FolderItem *item)
1491 if (prefs_pages == NULL) {
1492 register_general_page();
1493 register_compose_page();
1494 register_templates_page();
1498 id = folder_item_get_identifier (item);
1501 id = g_strdup(item->name);
1504 title = g_strdup_printf (_("Properties for folder %s"), id);
1506 prefswindow_open(title, prefs_pages, item,
1507 &prefs_common.folderitemwin_width, &prefs_common.folderitemwin_height);
1512 void prefs_folder_item_register_page(PrefsPage *page)
1514 prefs_pages = g_slist_append(prefs_pages, page);
1517 void prefs_folder_item_unregister_page(PrefsPage *page)
1519 prefs_pages = g_slist_remove(prefs_pages, page);