2 * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
3 * Copyright (C) 1999-2012 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) */
26 #include "claws-features.h"
32 #include <glib/gi18n.h>
34 #include "alertpanel.h"
35 #include "prefs_folder_item.h"
36 #include "folderview.h"
38 #include "summaryview.h"
41 #include "prefs_gtk.h"
42 #include "manage_window.h"
44 #include "addr_compl.h"
45 #include "prefs_common.h"
47 #include "filtering.h"
48 #include "folder_item_prefs.h"
49 #include "gtk/colorsel.h"
50 #include "string_match.h"
51 #include "quote_fmt.h"
55 #include "gtkaspell.h"
58 #define ASSIGN_STRING(string, value) \
64 static void prefs_folder_item_register_page (PrefsPage
*page
);
66 typedef struct _FolderItemGeneralPage FolderItemGeneralPage
;
67 typedef struct _FolderItemComposePage FolderItemComposePage
;
68 typedef struct _FolderItemTemplatesPage FolderItemTemplatesPage
;
69 static gboolean can_save
= TRUE
;
71 struct _FolderItemGeneralPage
78 GtkWidget
*no_save_warning
;
79 GtkWidget
*folder_type
;
81 GtkWidget
*checkbtn_simplify_subject
;
82 GtkWidget
*entry_simplify_subject
;
83 GtkWidget
*entry_regexp_test_string
;
84 GtkWidget
*entry_regexp_test_result
;
86 GtkWidget
*checkbtn_folder_chmod
;
87 GtkWidget
*entry_folder_chmod
;
88 GtkWidget
*folder_color_btn
;
89 GtkWidget
*checkbtn_enable_processing
;
90 GtkWidget
*checkbtn_enable_processing_when_opening
;
91 GtkWidget
*checkbtn_newmailcheck
;
92 GtkWidget
*checkbtn_offlinesync
;
93 GtkWidget
*label_offlinesync
;
94 GtkWidget
*entry_offlinesync
;
95 GtkWidget
*label_end_offlinesync
;
96 GtkWidget
*checkbtn_remove_old_offlinesync
;
97 GtkWidget
*promote_html_part
;
99 /* apply to sub folders */
101 GtkWidget
*simplify_subject_rec_checkbtn
;
103 GtkWidget
*folder_chmod_rec_checkbtn
;
104 GtkWidget
*folder_color_rec_checkbtn
;
105 GtkWidget
*enable_processing_rec_checkbtn
;
106 GtkWidget
*enable_processing_when_opening_rec_checkbtn
;
107 GtkWidget
*newmailcheck_rec_checkbtn
;
108 GtkWidget
*offlinesync_rec_checkbtn
;
109 GtkWidget
*promote_html_part_rec_checkbtn
;
114 struct _FolderItemComposePage
122 GtkWidget
*no_save_warning
;
123 GtkWidget
*checkbtn_request_return_receipt
;
124 GtkWidget
*checkbtn_save_copy_to_folder
;
125 GtkWidget
*checkbtn_default_to
;
126 GtkWidget
*entry_default_to
;
127 GtkWidget
*checkbtn_default_reply_to
;
128 GtkWidget
*entry_default_reply_to
;
129 GtkWidget
*checkbtn_default_cc
;
130 GtkWidget
*entry_default_cc
;
131 GtkWidget
*checkbtn_default_bcc
;
132 GtkWidget
*entry_default_bcc
;
133 GtkWidget
*checkbtn_default_replyto
;
134 GtkWidget
*entry_default_replyto
;
135 GtkWidget
*checkbtn_enable_default_account
;
136 GtkWidget
*optmenu_default_account
;
138 GtkWidget
*checkbtn_enable_default_dictionary
;
139 GtkWidget
*checkbtn_enable_default_alt_dictionary
;
140 GtkWidget
*combo_default_dictionary
;
141 GtkWidget
*combo_default_alt_dictionary
;
144 /* apply to sub folders */
145 GtkWidget
*request_return_receipt_rec_checkbtn
;
146 GtkWidget
*save_copy_to_folder_rec_checkbtn
;
147 GtkWidget
*default_to_rec_checkbtn
;
148 GtkWidget
*default_reply_to_rec_checkbtn
;
149 GtkWidget
*default_cc_rec_checkbtn
;
150 GtkWidget
*default_bcc_rec_checkbtn
;
151 GtkWidget
*default_replyto_rec_checkbtn
;
152 GtkWidget
*default_account_rec_checkbtn
;
154 GtkWidget
*default_dictionary_rec_checkbtn
;
155 GtkWidget
*default_alt_dictionary_rec_checkbtn
;
159 struct _FolderItemTemplatesPage
167 GtkWidget
*checkbtn_compose_with_format
;
168 GtkWidget
*compose_override_from_format
;
169 GtkWidget
*compose_subject_format
;
170 GtkWidget
*compose_body_format
;
171 GtkWidget
*checkbtn_reply_with_format
;
172 GtkWidget
*reply_quotemark
;
173 GtkWidget
*reply_override_from_format
;
174 GtkWidget
*reply_body_format
;
175 GtkWidget
*checkbtn_forward_with_format
;
176 GtkWidget
*forward_quotemark
;
177 GtkWidget
*forward_override_from_format
;
178 GtkWidget
*forward_body_format
;
180 /* apply to sub folders */
181 GtkWidget
*new_msg_format_rec_checkbtn
;
182 GtkWidget
*reply_format_rec_checkbtn
;
183 GtkWidget
*forward_format_rec_checkbtn
;
187 static void general_save_folder_prefs(FolderItem
*folder
, FolderItemGeneralPage
*page
);
188 static void compose_save_folder_prefs(FolderItem
*folder
, FolderItemComposePage
*page
);
189 static void templates_save_folder_prefs(FolderItem
*folder
, FolderItemTemplatesPage
*page
);
191 static gboolean
general_save_recurse_func(GNode
*node
, gpointer data
);
192 static gboolean
compose_save_recurse_func(GNode
*node
, gpointer data
);
193 static gboolean
templates_save_recurse_func(GNode
*node
, gpointer data
);
195 static gint
prefs_folder_item_chmod_mode (gchar
*folder_chmod
);
197 static void folder_color_set_dialog(GtkWidget
*widget
, gpointer data
);
198 static void clean_cache_cb(GtkWidget
*widget
, gpointer data
);
200 static void folder_regexp_test_cb(GtkWidget
*widget
, gpointer data
);
201 static void folder_regexp_set_subject_example_cb(GtkWidget
*widget
, gpointer data
);
203 #define SAFE_STRING(str) \
206 static void prefs_folder_item_general_create_widget_func(PrefsPage
* page_
,
210 FolderItemGeneralPage
*page
= (FolderItemGeneralPage
*) page_
;
211 FolderItem
*item
= (FolderItem
*) data
;
215 GtkWidget
*hbox
, *hbox2
, *hbox_spc
;
218 GtkListStore
*folder_type_menu
;
219 GtkWidget
*folder_type
;
221 GtkWidget
*dummy_checkbtn
, *clean_cache_btn
;
222 SpecialFolderItemType type
;
224 GtkWidget
*no_save_warning
= NULL
;
226 GtkWidget
*checkbtn_simplify_subject
;
227 GtkWidget
*entry_simplify_subject
;
228 GtkWidget
*label_regexp_test
;
229 GtkWidget
*entry_regexp_test_string
;
230 GtkWidget
*label_regexp_result
;
231 GtkWidget
*entry_regexp_test_result
;
233 GtkWidget
*checkbtn_folder_chmod
;
234 GtkWidget
*entry_folder_chmod
;
235 GtkWidget
*folder_color
;
236 GtkWidget
*folder_color_btn
;
237 GtkWidget
*checkbtn_enable_processing
;
238 GtkWidget
*checkbtn_enable_processing_when_opening
;
239 GtkWidget
*checkbtn_newmailcheck
;
240 GtkWidget
*checkbtn_offlinesync
;
241 GtkWidget
*label_offlinesync
;
242 GtkWidget
*entry_offlinesync
;
243 GtkWidget
*label_end_offlinesync
;
244 GtkWidget
*checkbtn_remove_old_offlinesync
;
245 GtkWidget
*promote_html_part
;
246 GtkListStore
*promote_html_part_menu
;
249 GtkWidget
*simplify_subject_rec_checkbtn
;
251 GtkWidget
*folder_chmod_rec_checkbtn
;
252 GtkWidget
*folder_color_rec_checkbtn
;
253 GtkWidget
*enable_processing_rec_checkbtn
;
254 GtkWidget
*enable_processing_when_opening_rec_checkbtn
;
255 GtkWidget
*newmailcheck_rec_checkbtn
;
256 GtkWidget
*offlinesync_rec_checkbtn
;
257 GtkWidget
*promote_html_part_rec_checkbtn
;
262 table
= gtk_table_new(12, 3, FALSE
);
263 gtk_container_set_border_width (GTK_CONTAINER (table
), VBOX_BORDER
);
264 gtk_table_set_row_spacings(GTK_TABLE(table
), 4);
265 gtk_table_set_col_spacings(GTK_TABLE(table
), 4);
269 no_save_warning
= gtk_label_new(
270 _("<i>These preferences will not be saved as this folder "
271 "is a top-level folder. However, you can set them for the "
272 "whole mailbox tree by using \"Apply to subfolders\".</i>"));
273 gtk_label_set_use_markup(GTK_LABEL(no_save_warning
), TRUE
);
274 gtk_label_set_line_wrap(GTK_LABEL(no_save_warning
), TRUE
);
275 gtk_misc_set_alignment(GTK_MISC(no_save_warning
), 0.0, 0.5);
276 gtk_table_attach(GTK_TABLE(table
), no_save_warning
, 0, 3,
277 rowcount
, rowcount
+ 1, GTK_FILL
, 0, 0, 0);
281 /* Apply to subfolders */
282 label
= gtk_label_new(_("Apply to\nsubfolders"));
283 gtk_misc_set_alignment(GTK_MISC(label
), 0.5, 0.5);
284 gtk_table_attach(GTK_TABLE(table
), label
, 2, 3,
285 rowcount
, rowcount
+ 1, GTK_SHRINK
, GTK_SHRINK
, 0, 0);
289 folder_type
= gtkut_sc_combobox_create(NULL
, FALSE
);
290 gtk_widget_show (folder_type
);
293 if (item
->stype
== F_INBOX
)
295 else if (folder_has_parent_of_type(item
, F_OUTBOX
))
297 else if (folder_has_parent_of_type(item
, F_DRAFT
))
299 else if (folder_has_parent_of_type(item
, F_QUEUE
))
301 else if (folder_has_parent_of_type(item
, F_TRASH
))
304 folder_type_menu
= GTK_LIST_STORE(gtk_combo_box_get_model(
305 GTK_COMBO_BOX(folder_type
)));
307 COMBOBOX_ADD (folder_type_menu
, _("Normal"), F_NORMAL
);
308 COMBOBOX_ADD (folder_type_menu
, _("Inbox"), F_INBOX
);
309 COMBOBOX_ADD (folder_type_menu
, _("Outbox"), F_OUTBOX
);
310 COMBOBOX_ADD (folder_type_menu
, _("Drafts"), F_DRAFT
);
311 COMBOBOX_ADD (folder_type_menu
, _("Queue"), F_QUEUE
);
312 COMBOBOX_ADD (folder_type_menu
, _("Trash"), F_TRASH
);
314 combobox_select_by_data(GTK_COMBO_BOX(folder_type
), type
);
316 dummy_checkbtn
= gtk_check_button_new();
317 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dummy_checkbtn
), type
!= F_INBOX
);
318 gtk_widget_set_sensitive(dummy_checkbtn
, FALSE
);
320 if (type
== item
->stype
&& type
== F_NORMAL
)
321 gtk_widget_set_sensitive(folder_type
, TRUE
);
323 gtk_widget_set_sensitive(folder_type
, FALSE
);
325 label
= gtk_label_new(_("Folder type"));
326 gtk_misc_set_alignment(GTK_MISC(label
), 0, 0.5);
327 gtk_table_attach(GTK_TABLE(table
), label
, 0, 1,
328 rowcount
, rowcount
+ 1, GTK_SHRINK
| GTK_FILL
, GTK_FILL
, 0, 0);
329 gtk_table_attach(GTK_TABLE(table
), folder_type
, 1, 2,
330 rowcount
, rowcount
+ 1, GTK_SHRINK
| GTK_FILL
, GTK_FILL
, 0, 0);
331 gtk_table_attach(GTK_TABLE(table
), dummy_checkbtn
, 2, 3,
332 rowcount
, rowcount
+ 1, GTK_SHRINK
, GTK_SHRINK
, 0, 0);
337 /* Simplify Subject */
338 checkbtn_simplify_subject
= gtk_check_button_new_with_label(_("Simplify Subject RegExp"));
339 gtk_table_attach(GTK_TABLE(table
), checkbtn_simplify_subject
, 0, 1,
340 rowcount
, rowcount
+ 1, GTK_SHRINK
| GTK_FILL
, GTK_FILL
, 0, 0);
341 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_simplify_subject
),
342 item
->prefs
->enable_simplify_subject
);
344 g_signal_connect(G_OBJECT(checkbtn_simplify_subject
), "toggled",
345 G_CALLBACK(folder_regexp_set_subject_example_cb
), page
);
347 entry_simplify_subject
= gtk_entry_new();
348 gtk_table_attach(GTK_TABLE(table
), entry_simplify_subject
, 1, 2,
349 rowcount
, rowcount
+ 1, GTK_EXPAND
| GTK_FILL
, GTK_FILL
, 0, 0);
350 SET_TOGGLE_SENSITIVITY(checkbtn_simplify_subject
, entry_simplify_subject
);
351 gtk_entry_set_text(GTK_ENTRY(entry_simplify_subject
),
352 SAFE_STRING(item
->prefs
->simplify_subject_regexp
));
354 g_signal_connect(G_OBJECT(entry_simplify_subject
), "changed",
355 G_CALLBACK(folder_regexp_test_cb
), page
);
357 simplify_subject_rec_checkbtn
= gtk_check_button_new();
358 gtk_table_attach(GTK_TABLE(table
), simplify_subject_rec_checkbtn
, 2, 3,
359 rowcount
, rowcount
+ 1, GTK_SHRINK
, GTK_SHRINK
, 0, 0);
364 label_regexp_test
= gtk_label_new(_("Test string:"));
365 gtk_misc_set_alignment(GTK_MISC(label_regexp_test
), 1, 0.5);
366 gtk_table_attach(GTK_TABLE(table
), label_regexp_test
, 0, 1,
367 rowcount
, rowcount
+ 1, GTK_SHRINK
| GTK_FILL
, GTK_FILL
, 0, 0);
368 SET_TOGGLE_SENSITIVITY(checkbtn_simplify_subject
, label_regexp_test
);
370 entry_regexp_test_string
= gtk_entry_new();
371 gtk_table_attach(GTK_TABLE(table
), entry_regexp_test_string
, 1, 2,
372 rowcount
, rowcount
+ 1, GTK_EXPAND
| GTK_FILL
, GTK_FILL
, 0, 0);
373 SET_TOGGLE_SENSITIVITY(checkbtn_simplify_subject
, entry_regexp_test_string
);
375 g_signal_connect(G_OBJECT(entry_regexp_test_string
), "changed",
376 G_CALLBACK(folder_regexp_test_cb
), page
);
381 label_regexp_result
= gtk_label_new(_("Result:"));
382 gtk_misc_set_alignment(GTK_MISC(label_regexp_result
), 1, 0.5);
383 gtk_table_attach(GTK_TABLE(table
), label_regexp_result
, 0, 1,
384 rowcount
, rowcount
+ 1, GTK_SHRINK
| GTK_FILL
, GTK_FILL
, 0, 0);
385 SET_TOGGLE_SENSITIVITY(checkbtn_simplify_subject
, label_regexp_result
);
387 entry_regexp_test_result
= gtk_entry_new();
388 gtk_table_attach(GTK_TABLE(table
), entry_regexp_test_result
, 1, 2,
389 rowcount
, rowcount
+ 1, GTK_EXPAND
| GTK_FILL
, GTK_FILL
, 0, 0);
390 SET_TOGGLE_SENSITIVITY(checkbtn_simplify_subject
, entry_regexp_test_result
);
391 gtk_editable_set_editable(GTK_EDITABLE(entry_regexp_test_result
), FALSE
);
396 checkbtn_folder_chmod
= gtk_check_button_new_with_label(_("Folder chmod"));
397 gtk_table_attach(GTK_TABLE(table
), checkbtn_folder_chmod
, 0, 1,
398 rowcount
, rowcount
+ 1, GTK_SHRINK
| GTK_FILL
, GTK_FILL
, 0, 0);
400 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_folder_chmod
),
401 item
->prefs
->enable_folder_chmod
);
403 entry_folder_chmod
= gtk_entry_new();
404 gtk_table_attach(GTK_TABLE(table
), entry_folder_chmod
, 1, 2,
405 rowcount
, rowcount
+ 1, GTK_EXPAND
| GTK_FILL
, GTK_FILL
, 0, 0);
406 SET_TOGGLE_SENSITIVITY(checkbtn_folder_chmod
, entry_folder_chmod
);
407 if (item
->prefs
->folder_chmod
) {
410 buf
= g_strdup_printf("%o", item
->prefs
->folder_chmod
);
411 gtk_entry_set_text(GTK_ENTRY(entry_folder_chmod
), buf
);
415 folder_chmod_rec_checkbtn
= gtk_check_button_new();
416 gtk_table_attach(GTK_TABLE(table
), folder_chmod_rec_checkbtn
, 2, 3,
417 rowcount
, rowcount
+ 1, GTK_SHRINK
, GTK_SHRINK
, 0, 0);
422 folder_color
= gtk_label_new(_("Folder color"));
423 gtk_misc_set_alignment(GTK_MISC(folder_color
), 0, 0.5);
424 gtk_table_attach(GTK_TABLE(table
), folder_color
, 0, 1,
425 rowcount
, rowcount
+ 1, GTK_SHRINK
| GTK_FILL
, GTK_FILL
, 0, 0);
427 hbox
= gtk_hbox_new(FALSE
, 0);
428 gtk_table_attach(GTK_TABLE(table
), hbox
, 1, 2,
429 rowcount
, rowcount
+ 1, GTK_EXPAND
| GTK_FILL
, GTK_FILL
, 0, 0);
431 folder_color_btn
= gtk_button_new_with_label("");
432 gtk_widget_set_size_request(folder_color_btn
, 36, 26);
433 gtk_box_pack_start (GTK_BOX(hbox
), folder_color_btn
, FALSE
, FALSE
, 0);
434 CLAWS_SET_TIP(folder_color_btn
,
435 _("Pick color for folder"));
437 page
->folder_color
= item
->prefs
->color
;
439 g_signal_connect(G_OBJECT(folder_color_btn
), "clicked",
440 G_CALLBACK(folder_color_set_dialog
),
443 gtkut_set_widget_bgcolor_rgb(folder_color_btn
, item
->prefs
->color
);
445 folder_color_rec_checkbtn
= gtk_check_button_new();
446 gtk_table_attach(GTK_TABLE(table
), folder_color_rec_checkbtn
, 2, 3,
447 rowcount
, rowcount
+ 1, GTK_SHRINK
, GTK_SHRINK
, 0, 0);
451 /* Enable processing at startup */
452 checkbtn_enable_processing
=
453 gtk_check_button_new_with_label(_("Run Processing rules at start-up"));
454 gtk_table_attach(GTK_TABLE(table
), checkbtn_enable_processing
, 0, 2,
455 rowcount
, rowcount
+ 1, GTK_EXPAND
| GTK_FILL
, GTK_FILL
, 0, 0);
457 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_enable_processing
),
458 item
->prefs
->enable_processing
);
460 enable_processing_rec_checkbtn
= gtk_check_button_new();
461 gtk_table_attach(GTK_TABLE(table
), enable_processing_rec_checkbtn
, 2, 3,
462 rowcount
, rowcount
+ 1, GTK_SHRINK
, GTK_SHRINK
, 0, 0);
466 /* Enable processing rules when opening folder */
467 checkbtn_enable_processing_when_opening
=
468 gtk_check_button_new_with_label(_("Run Processing rules when opening"));
469 gtk_table_attach(GTK_TABLE(table
), checkbtn_enable_processing_when_opening
, 0, 2,
470 rowcount
, rowcount
+ 1, GTK_EXPAND
| GTK_FILL
, GTK_FILL
, 0, 0);
472 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_enable_processing_when_opening
),
473 item
->prefs
->enable_processing_when_opening
);
475 enable_processing_when_opening_rec_checkbtn
= gtk_check_button_new();
476 gtk_table_attach(GTK_TABLE(table
), enable_processing_when_opening_rec_checkbtn
, 2, 3,
477 rowcount
, rowcount
+ 1, GTK_SHRINK
, GTK_SHRINK
, 0, 0);
481 /* Check folder for new mail */
482 checkbtn_newmailcheck
= gtk_check_button_new_with_label(_("Scan for new mail"));
483 CLAWS_SET_TIP(checkbtn_newmailcheck
,
484 _("Turn this option on if mail is delivered directly "
485 "to this folder by server side filtering on IMAP or "
486 "by an external application"));
487 gtk_table_attach(GTK_TABLE(table
), checkbtn_newmailcheck
, 0, 2,
488 rowcount
, rowcount
+1, GTK_EXPAND
| GTK_FILL
, GTK_FILL
, 0, 0);
490 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_newmailcheck
),
491 item
->prefs
->newmailcheck
);
492 newmailcheck_rec_checkbtn
= gtk_check_button_new();
493 gtk_table_attach(GTK_TABLE(table
), newmailcheck_rec_checkbtn
, 2, 3,
494 rowcount
, rowcount
+ 1, GTK_SHRINK
, GTK_SHRINK
, 0, 0);
498 /* Select HTML part by default? */
499 hbox
= gtk_hbox_new (FALSE
, 2);
500 gtk_widget_show (hbox
);
501 gtk_table_attach (GTK_TABLE(table
), hbox
, 0, 2,
502 rowcount
, rowcount
+1, GTK_FILL
, GTK_FILL
, 0, 0);
504 label
= gtk_label_new(_("Select the HTML part of multipart messages"));
505 gtk_widget_show (label
);
506 gtk_box_pack_start (GTK_BOX(hbox
), label
, FALSE
, FALSE
, 0);
508 promote_html_part
= gtkut_sc_combobox_create (NULL
, FALSE
);
509 gtk_widget_show (promote_html_part
);
510 gtk_box_pack_start (GTK_BOX(hbox
), promote_html_part
, FALSE
, FALSE
, 0);
512 promote_html_part_menu
= GTK_LIST_STORE(gtk_combo_box_get_model(
513 GTK_COMBO_BOX(promote_html_part
)));
514 COMBOBOX_ADD (promote_html_part_menu
, _("Default"), HTML_PROMOTE_DEFAULT
);
515 COMBOBOX_ADD (promote_html_part_menu
, _("No"), HTML_PROMOTE_NEVER
);
516 COMBOBOX_ADD (promote_html_part_menu
, _("Yes"), HTML_PROMOTE_ALWAYS
);
518 combobox_select_by_data(GTK_COMBO_BOX(promote_html_part
),
519 item
->prefs
->promote_html_part
);
521 CLAWS_SET_TIP(hbox
, _("\"Default\" will follow global preference (found in /Preferences/"
522 "Message View/Text Options)"));
524 promote_html_part_rec_checkbtn
= gtk_check_button_new();
525 gtk_widget_show (promote_html_part_rec_checkbtn
);
526 gtk_table_attach(GTK_TABLE(table
), promote_html_part_rec_checkbtn
, 2, 3,
527 rowcount
, rowcount
+ 1, GTK_SHRINK
, GTK_SHRINK
, 0, 0);
530 /* Synchronise folder for offline use */
531 checkbtn_offlinesync
= gtk_check_button_new_with_label(_("Synchronise for offline use"));
532 gtk_table_attach(GTK_TABLE(table
), checkbtn_offlinesync
, 0, 2,
533 rowcount
, rowcount
+1, GTK_EXPAND
| GTK_FILL
, GTK_FILL
, 0, 0);
535 offlinesync_rec_checkbtn
= gtk_check_button_new();
536 gtk_table_attach(GTK_TABLE(table
), offlinesync_rec_checkbtn
, 2, 3,
537 rowcount
, rowcount
+ 1, GTK_SHRINK
, GTK_SHRINK
, 0, 0);
541 hbox
= gtk_hbox_new (FALSE
, 8);
542 gtk_widget_show (hbox
);
543 gtk_table_attach(GTK_TABLE(table
), hbox
, 0, 3,
544 rowcount
, rowcount
+1, GTK_EXPAND
| GTK_FILL
, GTK_FILL
, 0, 0);
547 hbox_spc
= gtk_hbox_new (FALSE
, 0);
548 gtk_widget_show (hbox_spc
);
549 gtk_box_pack_start (GTK_BOX (hbox
), hbox_spc
, FALSE
, FALSE
, 0);
550 gtk_widget_set_size_request (hbox_spc
, 12, -1);
552 label_offlinesync
= gtk_label_new(_("Fetch message bodies from the last"));
553 gtk_widget_show (label_offlinesync
);
554 gtk_box_pack_start (GTK_BOX (hbox
), label_offlinesync
, FALSE
, FALSE
, 0);
556 entry_offlinesync
= gtk_entry_new();
557 gtk_widget_set_size_request (entry_offlinesync
, 64, -1);
558 gtk_widget_show (entry_offlinesync
);
559 CLAWS_SET_TIP(entry_offlinesync
, _("0: all bodies"));
560 gtk_box_pack_start (GTK_BOX (hbox
), entry_offlinesync
, FALSE
, FALSE
, 0);
562 label_end_offlinesync
= gtk_label_new(_("days"));
563 gtk_widget_show (label_end_offlinesync
);
564 gtk_box_pack_start (GTK_BOX (hbox
), label_end_offlinesync
, FALSE
, FALSE
, 0);
566 checkbtn_remove_old_offlinesync
= gtk_check_button_new_with_label(
567 _("Remove older messages bodies"));
569 hbox2
= gtk_hbox_new (FALSE
, 8);
570 gtk_widget_show (hbox2
);
571 gtk_table_attach(GTK_TABLE(table
), hbox2
, 0, 3,
572 rowcount
, rowcount
+1, GTK_EXPAND
| GTK_FILL
, GTK_FILL
, 0, 0);
575 hbox_spc
= gtk_hbox_new (FALSE
, 0);
576 gtk_widget_show (hbox_spc
);
577 gtk_box_pack_start (GTK_BOX (hbox2
), hbox_spc
, FALSE
, FALSE
, 0);
578 gtk_widget_set_size_request (hbox_spc
, 12, -1);
579 gtk_box_pack_start (GTK_BOX (hbox2
), checkbtn_remove_old_offlinesync
, FALSE
, FALSE
, 0);
581 SET_TOGGLE_SENSITIVITY (checkbtn_offlinesync
, hbox
);
582 SET_TOGGLE_SENSITIVITY (checkbtn_offlinesync
, hbox2
);
584 clean_cache_btn
= gtk_button_new_with_label(_("Discard folder cache"));
585 gtk_widget_show (clean_cache_btn
);
586 gtk_table_attach(GTK_TABLE(table
), clean_cache_btn
, 0, 1,
587 rowcount
, rowcount
+1, GTK_EXPAND
| GTK_FILL
, GTK_FILL
, 0, 0);
588 g_signal_connect(G_OBJECT(clean_cache_btn
), "clicked",
589 G_CALLBACK(clean_cache_cb
),
592 gtk_widget_show_all(table
);
594 if (item
->folder
&& (item
->folder
->klass
->type
!= F_IMAP
&&
595 item
->folder
->klass
->type
!= F_NEWS
)) {
596 item
->prefs
->offlinesync
= TRUE
;
597 item
->prefs
->offlinesync_days
= 0;
598 item
->prefs
->remove_old_bodies
= FALSE
;
600 gtk_widget_set_sensitive(GTK_WIDGET(checkbtn_offlinesync
),
602 gtk_widget_set_sensitive(GTK_WIDGET(offlinesync_rec_checkbtn
),
604 gtk_widget_hide(GTK_WIDGET(checkbtn_offlinesync
));
605 gtk_widget_hide(GTK_WIDGET(hbox
));
606 gtk_widget_hide(GTK_WIDGET(hbox2
));
607 gtk_widget_hide(GTK_WIDGET(offlinesync_rec_checkbtn
));
608 gtk_widget_hide(GTK_WIDGET(clean_cache_btn
));
611 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_offlinesync
),
612 item
->prefs
->offlinesync
);
613 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_remove_old_offlinesync
),
614 item
->prefs
->remove_old_bodies
);
615 gtk_entry_set_text(GTK_ENTRY(entry_offlinesync
), itos(item
->prefs
->offlinesync_days
));
618 page
->folder_type
= folder_type
;
619 page
->no_save_warning
= no_save_warning
;
621 page
->checkbtn_simplify_subject
= checkbtn_simplify_subject
;
622 page
->entry_simplify_subject
= entry_simplify_subject
;
623 page
->entry_regexp_test_string
= entry_regexp_test_string
;
624 page
->entry_regexp_test_result
= entry_regexp_test_result
;
626 page
->checkbtn_folder_chmod
= checkbtn_folder_chmod
;
627 page
->entry_folder_chmod
= entry_folder_chmod
;
628 page
->folder_color_btn
= folder_color_btn
;
629 page
->checkbtn_enable_processing
= checkbtn_enable_processing
;
630 page
->checkbtn_enable_processing_when_opening
= checkbtn_enable_processing_when_opening
;
631 page
->checkbtn_newmailcheck
= checkbtn_newmailcheck
;
632 page
->checkbtn_offlinesync
= checkbtn_offlinesync
;
633 page
->label_offlinesync
= label_offlinesync
;
634 page
->entry_offlinesync
= entry_offlinesync
;
635 page
->label_end_offlinesync
= label_end_offlinesync
;
636 page
->checkbtn_remove_old_offlinesync
= checkbtn_remove_old_offlinesync
;
637 page
->promote_html_part
= promote_html_part
;
640 page
->simplify_subject_rec_checkbtn
= simplify_subject_rec_checkbtn
;
642 page
->folder_chmod_rec_checkbtn
= folder_chmod_rec_checkbtn
;
643 page
->folder_color_rec_checkbtn
= folder_color_rec_checkbtn
;
644 page
->enable_processing_rec_checkbtn
= enable_processing_rec_checkbtn
;
645 page
->enable_processing_when_opening_rec_checkbtn
= enable_processing_when_opening_rec_checkbtn
;
646 page
->newmailcheck_rec_checkbtn
= newmailcheck_rec_checkbtn
;
647 page
->offlinesync_rec_checkbtn
= offlinesync_rec_checkbtn
;
648 page
->promote_html_part_rec_checkbtn
= promote_html_part_rec_checkbtn
;
650 page
->page
.widget
= table
;
653 folder_regexp_set_subject_example_cb(NULL
, page
);
657 static void prefs_folder_item_general_destroy_widget_func(PrefsPage
*page_
)
659 /* FolderItemGeneralPage *page = (FolderItemGeneralPage *) page_; */
662 /** \brief Save the prefs in page to folder.
664 * If the folder is not the one specified in page->item, then only those properties
665 * that have the relevant 'apply to sub folders' button checked are saved
667 static void general_save_folder_prefs(FolderItem
*folder
, FolderItemGeneralPage
*page
)
669 FolderItemPrefs
*prefs
= folder
->prefs
;
671 gboolean all
= FALSE
, summary_update_needed
= FALSE
;
672 SpecialFolderItemType type
= F_NORMAL
;
673 FolderView
*folderview
= mainwindow_get_mainwindow()->folderview
;
674 HTMLPromoteType promote_html_part
= HTML_PROMOTE_DEFAULT
;
676 if (folder
->path
== NULL
)
679 cm_return_if_fail(prefs
!= NULL
);
681 if (page
->item
== folder
)
684 type
= combobox_get_active_data(GTK_COMBO_BOX(page
->folder_type
));
685 if (all
&& folder
->stype
!= type
&& page
->item
->parent_stype
== F_NORMAL
) {
686 folder_item_change_type(folder
, type
);
687 summary_update_needed
= TRUE
;
691 combobox_get_active_data(GTK_COMBO_BOX(page
->promote_html_part
));
692 if (all
|| gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page
->promote_html_part_rec_checkbtn
)))
693 prefs
->promote_html_part
= promote_html_part
;
696 if (all
|| gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page
->simplify_subject_rec_checkbtn
))) {
697 gboolean old_simplify_subject
= prefs
->enable_simplify_subject
;
698 int regexp_diffs
= strcmp2(prefs
->simplify_subject_regexp
, gtk_editable_get_chars(
699 GTK_EDITABLE(page
->entry_simplify_subject
), 0, -1));
700 prefs
->enable_simplify_subject
=
701 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page
->checkbtn_simplify_subject
));
702 ASSIGN_STRING(prefs
->simplify_subject_regexp
,
703 gtk_editable_get_chars(GTK_EDITABLE(page
->entry_simplify_subject
), 0, -1));
704 if (old_simplify_subject
!= prefs
->enable_simplify_subject
|| regexp_diffs
!= 0)
705 summary_update_needed
= TRUE
;
708 if (all
|| gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page
->folder_chmod_rec_checkbtn
))) {
709 prefs
->enable_folder_chmod
=
710 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page
->checkbtn_folder_chmod
));
711 buf
= gtk_editable_get_chars(GTK_EDITABLE(page
->entry_folder_chmod
), 0, -1);
712 prefs
->folder_chmod
= prefs_folder_item_chmod_mode(buf
);
716 if (all
|| gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page
->folder_color_rec_checkbtn
))) {
717 int old_color
= prefs
->color
;
718 prefs
->color
= page
->folder_color
;
720 /* update folder view */
721 if (prefs
->color
!= old_color
)
722 folder_item_update(folder
, F_ITEM_UPDATE_MSGCNT
);
725 if (all
|| gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page
->enable_processing_rec_checkbtn
))) {
726 prefs
->enable_processing
=
727 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page
->checkbtn_enable_processing
));
730 if (all
|| gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page
->enable_processing_when_opening_rec_checkbtn
))) {
731 prefs
->enable_processing_when_opening
=
732 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page
->checkbtn_enable_processing_when_opening
));
735 if (all
|| gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page
->newmailcheck_rec_checkbtn
))) {
736 prefs
->newmailcheck
=
737 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page
->checkbtn_newmailcheck
));
740 if (all
|| gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page
->offlinesync_rec_checkbtn
))) {
742 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page
->checkbtn_offlinesync
));
743 prefs
->offlinesync_days
=
744 atoi(gtk_entry_get_text(GTK_ENTRY(page
->entry_offlinesync
)));
745 prefs
->remove_old_bodies
=
746 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page
->checkbtn_remove_old_offlinesync
));
749 folder_item_prefs_save_config(folder
);
751 if (folder
->opened
&& summary_update_needed
) {
752 summary_set_prefs_from_folderitem(folderview
->summaryview
, folder
);
753 summary_show(folderview
->summaryview
, folder
);
757 static gboolean
general_save_recurse_func(GNode
*node
, gpointer data
)
759 FolderItem
*item
= (FolderItem
*) node
->data
;
760 FolderItemGeneralPage
*page
= (FolderItemGeneralPage
*) data
;
762 cm_return_val_if_fail(item
!= NULL
, TRUE
);
763 cm_return_val_if_fail(page
!= NULL
, TRUE
);
765 general_save_folder_prefs(item
, page
);
767 /* optimise by not continuing if none of the 'apply to sub folders'
768 check boxes are selected - and optimise the checking by only doing
770 if ((node
== page
->item
->node
) &&
773 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page
->simplify_subject_rec_checkbtn
)) ||
775 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page
->folder_chmod_rec_checkbtn
)) ||
776 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page
->folder_color_rec_checkbtn
)) ||
777 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page
->enable_processing_rec_checkbtn
)) ||
778 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page
->enable_processing_when_opening_rec_checkbtn
)) ||
779 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page
->newmailcheck_rec_checkbtn
)) ||
780 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page
->offlinesync_rec_checkbtn
)) ||
781 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page
->promote_html_part_rec_checkbtn
))
788 static void prefs_folder_item_general_save_func(PrefsPage
*page_
)
790 FolderItemGeneralPage
*page
= (FolderItemGeneralPage
*) page_
;
792 g_node_traverse(page
->item
->node
, G_PRE_ORDER
, G_TRAVERSE_ALL
,
793 -1, general_save_recurse_func
, page
);
795 main_window_set_menu_sensitive(mainwindow_get_mainwindow());
799 static RecvProtocol
item_protocol(FolderItem
*item
)
805 if (!item
->folder
->account
)
807 return item
->folder
->account
->protocol
;
810 static void prefs_folder_item_compose_create_widget_func(PrefsPage
* page_
,
814 FolderItemComposePage
*page
= (FolderItemComposePage
*) page_
;
815 FolderItem
*item
= (FolderItem
*) data
;
822 GtkWidget
*no_save_warning
= NULL
;
823 GtkWidget
*checkbtn_request_return_receipt
= NULL
;
824 GtkWidget
*checkbtn_save_copy_to_folder
= NULL
;
825 GtkWidget
*checkbtn_default_to
= NULL
;
826 GtkWidget
*entry_default_to
= NULL
;
827 GtkWidget
*checkbtn_default_reply_to
= NULL
;
828 GtkWidget
*entry_default_reply_to
= NULL
;
829 GtkWidget
*checkbtn_default_cc
= NULL
;
830 GtkWidget
*entry_default_cc
= NULL
;
831 GtkWidget
*checkbtn_default_bcc
= NULL
;
832 GtkWidget
*entry_default_bcc
= NULL
;
833 GtkWidget
*checkbtn_default_replyto
= NULL
;
834 GtkWidget
*entry_default_replyto
= NULL
;
835 GtkWidget
*checkbtn_enable_default_account
= NULL
;
836 GtkWidget
*optmenu_default_account
= NULL
;
837 GtkListStore
*optmenu_default_account_menu
= NULL
;
840 GtkWidget
*checkbtn_enable_default_dictionary
= NULL
;
841 GtkWidget
*combo_default_dictionary
= NULL
;
842 GtkWidget
*checkbtn_enable_default_alt_dictionary
= NULL
;
843 GtkWidget
*combo_default_alt_dictionary
= NULL
;
844 GtkWidget
*default_dictionary_rec_checkbtn
= NULL
;
845 GtkWidget
*default_alt_dictionary_rec_checkbtn
= NULL
;
848 GtkWidget
*request_return_receipt_rec_checkbtn
= NULL
;
849 GtkWidget
*save_copy_to_folder_rec_checkbtn
= NULL
;
850 GtkWidget
*default_to_rec_checkbtn
= NULL
;
851 GtkWidget
*default_reply_to_rec_checkbtn
= NULL
;
852 GtkWidget
*default_cc_rec_checkbtn
= NULL
;
853 GtkWidget
*default_bcc_rec_checkbtn
= NULL
;
854 GtkWidget
*default_replyto_rec_checkbtn
= NULL
;
855 GtkWidget
*default_account_rec_checkbtn
= NULL
;
859 PrefsAccount
*ac_prefs
;
860 gboolean default_account_set
= FALSE
;
866 # define TABLEHEIGHT 7
868 # define TABLEHEIGHT 6
870 table
= gtk_table_new(TABLEHEIGHT
, 3, FALSE
);
871 gtk_container_set_border_width (GTK_CONTAINER (table
), VBOX_BORDER
);
872 gtk_table_set_row_spacings(GTK_TABLE(table
), 4);
873 gtk_table_set_col_spacings(GTK_TABLE(table
), 4);
877 no_save_warning
= gtk_label_new(
878 _("<i>These preferences will not be saved as this folder "
879 "is a top-level folder. However, you can set them for the "
880 "whole mailbox tree by using \"Apply to subfolders\".</i>"));
881 gtk_label_set_use_markup(GTK_LABEL(no_save_warning
), TRUE
);
882 gtk_label_set_line_wrap(GTK_LABEL(no_save_warning
), TRUE
);
883 gtk_misc_set_alignment(GTK_MISC(no_save_warning
), 0.0, 0.5);
884 gtk_table_attach(GTK_TABLE(table
), no_save_warning
, 0, 3,
885 rowcount
, rowcount
+ 1, GTK_FILL
, 0, 0, 0);
889 /* Apply to subfolders */
890 label
= gtk_label_new(_("Apply to\nsubfolders"));
891 gtk_misc_set_alignment(GTK_MISC(label
), 0.5, 0.5);
892 gtk_table_attach(GTK_TABLE(table
), label
, 2, 3,
893 rowcount
, rowcount
+ 1, GTK_SHRINK
, GTK_SHRINK
, 0, 0);
896 if (item_protocol(item
) != A_NNTP
) {
897 /* Request Return Receipt */
898 checkbtn_request_return_receipt
= gtk_check_button_new_with_label
899 (_("Request Return Receipt"));
900 gtk_table_attach(GTK_TABLE(table
), checkbtn_request_return_receipt
,
901 0, 2, rowcount
, rowcount
+ 1, GTK_SHRINK
| GTK_FILL
,
903 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_request_return_receipt
),
904 item
->ret_rcpt
? TRUE
: FALSE
);
906 request_return_receipt_rec_checkbtn
= gtk_check_button_new();
907 gtk_table_attach(GTK_TABLE(table
), request_return_receipt_rec_checkbtn
, 2, 3,
908 rowcount
, rowcount
+ 1, GTK_SHRINK
, GTK_SHRINK
, 0, 0);
912 /* Save Copy to Folder */
913 checkbtn_save_copy_to_folder
= gtk_check_button_new_with_label
914 (_("Save copy of outgoing messages to this folder instead of Sent"));
915 gtk_table_attach(GTK_TABLE(table
), checkbtn_save_copy_to_folder
, 0, 2,
916 rowcount
, rowcount
+ 1, GTK_SHRINK
| GTK_FILL
, GTK_FILL
, 0, 0);
917 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_save_copy_to_folder
),
918 item
->prefs
->save_copy_to_folder
? TRUE
: FALSE
);
920 save_copy_to_folder_rec_checkbtn
= gtk_check_button_new();
921 gtk_table_attach(GTK_TABLE(table
), save_copy_to_folder_rec_checkbtn
, 2, 3,
922 rowcount
, rowcount
+ 1, GTK_SHRINK
, GTK_SHRINK
, 0, 0);
927 text
= g_strconcat(_("Default "), prefs_common_translated_header_name("To:"), NULL
);
928 checkbtn_default_to
= gtk_check_button_new_with_label(text
);
929 gtk_table_attach(GTK_TABLE(table
), checkbtn_default_to
, 0, 1,
930 rowcount
, rowcount
+ 1, GTK_SHRINK
| GTK_FILL
, GTK_SHRINK
, 0, 0);
931 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_default_to
),
932 item
->prefs
->enable_default_to
);
935 entry_default_to
= gtk_entry_new();
936 gtk_table_attach(GTK_TABLE(table
), entry_default_to
, 1, 2,
937 rowcount
, rowcount
+ 1, GTK_EXPAND
| GTK_FILL
, GTK_SHRINK
, 0, 0);
938 SET_TOGGLE_SENSITIVITY(checkbtn_default_to
, entry_default_to
);
939 gtk_entry_set_text(GTK_ENTRY(entry_default_to
), SAFE_STRING(item
->prefs
->default_to
));
940 address_completion_register_entry(GTK_ENTRY(entry_default_to
),
943 default_to_rec_checkbtn
= gtk_check_button_new();
944 gtk_table_attach(GTK_TABLE(table
), default_to_rec_checkbtn
, 2, 3,
945 rowcount
, rowcount
+ 1, GTK_SHRINK
, GTK_SHRINK
, 0, 0);
949 /* Default address to reply to */
950 text
= g_strconcat(_("Default "), prefs_common_translated_header_name("To:"),
951 _(" for replies"), NULL
);
952 checkbtn_default_reply_to
= gtk_check_button_new_with_label(text
);
953 gtk_table_attach(GTK_TABLE(table
), checkbtn_default_reply_to
, 0, 1,
954 rowcount
, rowcount
+ 1, GTK_SHRINK
| GTK_FILL
, GTK_SHRINK
, 0, 0);
955 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_default_reply_to
),
956 item
->prefs
->enable_default_reply_to
);
959 entry_default_reply_to
= gtk_entry_new();
960 gtk_table_attach(GTK_TABLE(table
), entry_default_reply_to
, 1, 2,
961 rowcount
, rowcount
+ 1, GTK_EXPAND
| GTK_FILL
, GTK_SHRINK
, 0, 0);
962 SET_TOGGLE_SENSITIVITY(checkbtn_default_reply_to
, entry_default_reply_to
);
963 gtk_entry_set_text(GTK_ENTRY(entry_default_reply_to
), SAFE_STRING(item
->prefs
->default_reply_to
));
964 address_completion_register_entry(
965 GTK_ENTRY(entry_default_reply_to
), TRUE
);
967 default_reply_to_rec_checkbtn
= gtk_check_button_new();
968 gtk_table_attach(GTK_TABLE(table
), default_reply_to_rec_checkbtn
, 2, 3,
969 rowcount
, rowcount
+ 1, GTK_SHRINK
, GTK_SHRINK
, 0, 0);
974 text
= g_strconcat(_("Default "), prefs_common_translated_header_name("Cc:"), NULL
);
975 checkbtn_default_cc
= gtk_check_button_new_with_label(text
);
976 gtk_table_attach(GTK_TABLE(table
), checkbtn_default_cc
, 0, 1,
977 rowcount
, rowcount
+ 1, GTK_SHRINK
| GTK_FILL
, GTK_SHRINK
, 0, 0);
978 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_default_cc
),
979 item
->prefs
->enable_default_cc
);
982 entry_default_cc
= gtk_entry_new();
983 gtk_table_attach(GTK_TABLE(table
), entry_default_cc
, 1, 2,
984 rowcount
, rowcount
+ 1, GTK_EXPAND
| GTK_FILL
, GTK_SHRINK
, 0, 0);
985 SET_TOGGLE_SENSITIVITY(checkbtn_default_cc
, entry_default_cc
);
986 gtk_entry_set_text(GTK_ENTRY(entry_default_cc
), SAFE_STRING(item
->prefs
->default_cc
));
987 address_completion_register_entry(GTK_ENTRY(entry_default_cc
),
990 default_cc_rec_checkbtn
= gtk_check_button_new();
991 gtk_table_attach(GTK_TABLE(table
), default_cc_rec_checkbtn
, 2, 3,
992 rowcount
, rowcount
+ 1, GTK_SHRINK
, GTK_SHRINK
, 0, 0);
997 text
= g_strconcat(_("Default "), prefs_common_translated_header_name("Bcc:"), NULL
);
998 checkbtn_default_bcc
= gtk_check_button_new_with_label(text
);
999 gtk_table_attach(GTK_TABLE(table
), checkbtn_default_bcc
, 0, 1,
1000 rowcount
, rowcount
+ 1, GTK_SHRINK
| GTK_FILL
, GTK_SHRINK
, 0, 0);
1001 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_default_bcc
),
1002 item
->prefs
->enable_default_bcc
);
1005 entry_default_bcc
= gtk_entry_new();
1006 gtk_table_attach(GTK_TABLE(table
), entry_default_bcc
, 1, 2,
1007 rowcount
, rowcount
+ 1, GTK_EXPAND
| GTK_FILL
, GTK_SHRINK
, 0, 0);
1008 SET_TOGGLE_SENSITIVITY(checkbtn_default_bcc
, entry_default_bcc
);
1009 gtk_entry_set_text(GTK_ENTRY(entry_default_bcc
), SAFE_STRING(item
->prefs
->default_bcc
));
1010 address_completion_register_entry(GTK_ENTRY(entry_default_bcc
),
1013 default_bcc_rec_checkbtn
= gtk_check_button_new();
1014 gtk_table_attach(GTK_TABLE(table
), default_bcc_rec_checkbtn
, 2, 3,
1015 rowcount
, rowcount
+ 1, GTK_SHRINK
, GTK_SHRINK
, 0, 0);
1019 /* Default Reply-to */
1020 text
= g_strconcat(_("Default "), prefs_common_translated_header_name("Reply-To:"), NULL
);
1021 checkbtn_default_replyto
= gtk_check_button_new_with_label(text
);
1022 gtk_table_attach(GTK_TABLE(table
), checkbtn_default_replyto
, 0, 1,
1023 rowcount
, rowcount
+ 1, GTK_SHRINK
| GTK_FILL
, GTK_SHRINK
, 0, 0);
1024 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_default_replyto
),
1025 item
->prefs
->enable_default_replyto
);
1028 entry_default_replyto
= gtk_entry_new();
1029 gtk_table_attach(GTK_TABLE(table
), entry_default_replyto
, 1, 2,
1030 rowcount
, rowcount
+ 1, GTK_EXPAND
| GTK_FILL
, GTK_SHRINK
, 0, 0);
1031 SET_TOGGLE_SENSITIVITY(checkbtn_default_replyto
, entry_default_replyto
);
1032 gtk_entry_set_text(GTK_ENTRY(entry_default_replyto
), SAFE_STRING(item
->prefs
->default_replyto
));
1033 address_completion_register_entry(GTK_ENTRY(entry_default_replyto
),
1036 default_replyto_rec_checkbtn
= gtk_check_button_new();
1037 gtk_table_attach(GTK_TABLE(table
), default_replyto_rec_checkbtn
, 2, 3,
1038 rowcount
, rowcount
+ 1, GTK_SHRINK
, GTK_SHRINK
, 0, 0);
1042 /* Default account */
1043 checkbtn_enable_default_account
= gtk_check_button_new_with_label(_("Default account"));
1044 gtk_table_attach(GTK_TABLE(table
), checkbtn_enable_default_account
, 0, 1,
1045 rowcount
, rowcount
+ 1, GTK_SHRINK
| GTK_FILL
, GTK_SHRINK
, 0, 0);
1046 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_enable_default_account
),
1047 item
->prefs
->enable_default_account
);
1049 optmenu_default_account
= gtkut_sc_combobox_create(NULL
, FALSE
);
1050 gtk_table_attach(GTK_TABLE(table
), optmenu_default_account
, 1, 2,
1051 rowcount
, rowcount
+ 1, GTK_EXPAND
| GTK_FILL
, GTK_SHRINK
, 0, 0);
1052 optmenu_default_account_menu
= GTK_LIST_STORE(
1053 gtk_combo_box_get_model(GTK_COMBO_BOX(optmenu_default_account
)));
1055 account_list
= account_get_list();
1056 for (cur_ac
= account_list
; cur_ac
!= NULL
; cur_ac
= cur_ac
->next
) {
1057 ac_prefs
= (PrefsAccount
*)cur_ac
->data
;
1058 if (item
->folder
->account
&&
1059 ( (item_protocol(item
) == A_NNTP
&& ac_prefs
->protocol
!= A_NNTP
)
1060 ||(item_protocol(item
) != A_NNTP
&& ac_prefs
->protocol
== A_NNTP
)))
1063 if (item
->folder
->klass
->type
!= F_NEWS
&& ac_prefs
->protocol
== A_NNTP
)
1066 COMBOBOX_ADD_ESCAPED (optmenu_default_account_menu
,
1067 ac_prefs
->account_name
?ac_prefs
->account_name
: _("Untitled"),
1068 ac_prefs
->account_id
);
1070 /* Set combobox to current default account id */
1071 if (ac_prefs
->account_id
== item
->prefs
->default_account
) {
1072 combobox_select_by_data(GTK_COMBO_BOX(optmenu_default_account
),
1073 ac_prefs
->account_id
);
1074 default_account_set
= TRUE
;
1078 /* If nothing has been set (folder doesn't have a default account set),
1079 * pre-select global default account, since that's what actually used
1080 * anyway. We don't want nothing selected in combobox. */
1081 if( !default_account_set
)
1082 combobox_select_by_data(GTK_COMBO_BOX(optmenu_default_account
),
1083 account_get_default()->account_id
);
1085 SET_TOGGLE_SENSITIVITY(checkbtn_enable_default_account
, optmenu_default_account
);
1087 default_account_rec_checkbtn
= gtk_check_button_new();
1088 gtk_table_attach(GTK_TABLE(table
), default_account_rec_checkbtn
, 2, 3,
1089 rowcount
, rowcount
+ 1, GTK_SHRINK
, GTK_SHRINK
, 0, 0);
1093 /* Default dictionary */
1094 checkbtn_enable_default_dictionary
= gtk_check_button_new_with_label(_("Default dictionary"));
1095 gtk_table_attach(GTK_TABLE(table
), checkbtn_enable_default_dictionary
, 0, 1,
1096 rowcount
, rowcount
+ 1, GTK_SHRINK
| GTK_FILL
, GTK_SHRINK
, 0, 0);
1097 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_enable_default_dictionary
),
1098 item
->prefs
->enable_default_dictionary
);
1100 combo_default_dictionary
= gtkaspell_dictionary_combo_new(TRUE
);
1101 gtk_table_attach(GTK_TABLE(table
), combo_default_dictionary
, 1, 2,
1102 rowcount
, rowcount
+ 1, GTK_EXPAND
| GTK_FILL
, GTK_SHRINK
, 0, 0);
1104 dictionary
= item
->prefs
->default_dictionary
;
1105 if (dictionary
&& strrchr(dictionary
, '/')) {
1106 gchar
*tmp
= g_strdup(strrchr(dictionary
, '/')+1);
1107 g_free(item
->prefs
->default_dictionary
);
1108 item
->prefs
->default_dictionary
= tmp
;
1109 dictionary
= item
->prefs
->default_dictionary
;
1111 if (item
->prefs
->default_dictionary
&&
1112 strchr(item
->prefs
->default_dictionary
, '-')) {
1113 *(strchr(item
->prefs
->default_dictionary
, '-')) = '\0';
1116 gtkaspell_set_dictionary_menu_active_item(
1117 GTK_COMBO_BOX(combo_default_dictionary
), dictionary
);
1119 SET_TOGGLE_SENSITIVITY(checkbtn_enable_default_dictionary
, combo_default_dictionary
);
1121 default_dictionary_rec_checkbtn
= gtk_check_button_new();
1122 gtk_table_attach(GTK_TABLE(table
), default_dictionary_rec_checkbtn
, 2, 3,
1123 rowcount
, rowcount
+ 1, GTK_SHRINK
, GTK_SHRINK
, 0, 0);
1127 /* Default dictionary */
1128 checkbtn_enable_default_alt_dictionary
= gtk_check_button_new_with_label(_("Default alternate dictionary"));
1129 gtk_table_attach(GTK_TABLE(table
), checkbtn_enable_default_alt_dictionary
, 0, 1,
1130 rowcount
, rowcount
+ 1, GTK_SHRINK
| GTK_FILL
, GTK_SHRINK
, 0, 0);
1131 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_enable_default_alt_dictionary
),
1132 item
->prefs
->enable_default_alt_dictionary
);
1134 combo_default_alt_dictionary
= gtkaspell_dictionary_combo_new(FALSE
);
1135 gtk_table_attach(GTK_TABLE(table
), combo_default_alt_dictionary
, 1, 2,
1136 rowcount
, rowcount
+ 1, GTK_EXPAND
| GTK_FILL
, GTK_SHRINK
, 0, 0);
1138 dictionary
= item
->prefs
->default_alt_dictionary
;
1139 if (dictionary
&& strrchr(dictionary
, '/')) {
1140 gchar
*tmp
= g_strdup(strrchr(dictionary
, '/')+1);
1141 g_free(item
->prefs
->default_alt_dictionary
);
1142 item
->prefs
->default_alt_dictionary
= tmp
;
1143 dictionary
= item
->prefs
->default_alt_dictionary
;
1145 if (item
->prefs
->default_alt_dictionary
&&
1146 strchr(item
->prefs
->default_alt_dictionary
, '-')) {
1147 *(strchr(item
->prefs
->default_alt_dictionary
, '-')) = '\0';
1150 gtkaspell_set_dictionary_menu_active_item(
1151 GTK_COMBO_BOX(combo_default_alt_dictionary
), dictionary
);
1153 SET_TOGGLE_SENSITIVITY(checkbtn_enable_default_alt_dictionary
, combo_default_alt_dictionary
);
1155 default_alt_dictionary_rec_checkbtn
= gtk_check_button_new();
1156 gtk_table_attach(GTK_TABLE(table
), default_alt_dictionary_rec_checkbtn
, 2, 3,
1157 rowcount
, rowcount
+ 1, GTK_SHRINK
, GTK_SHRINK
, 0, 0);
1162 gtk_widget_show_all(table
);
1164 page
->window
= GTK_WIDGET(window
);
1165 page
->table
= table
;
1166 page
->no_save_warning
= no_save_warning
;
1167 page
->checkbtn_request_return_receipt
= checkbtn_request_return_receipt
;
1168 page
->checkbtn_save_copy_to_folder
= checkbtn_save_copy_to_folder
;
1169 page
->checkbtn_default_to
= checkbtn_default_to
;
1170 page
->entry_default_to
= entry_default_to
;
1171 page
->checkbtn_default_reply_to
= checkbtn_default_reply_to
;
1172 page
->entry_default_reply_to
= entry_default_reply_to
;
1173 page
->checkbtn_default_cc
= checkbtn_default_cc
;
1174 page
->entry_default_cc
= entry_default_cc
;
1175 page
->checkbtn_default_bcc
= checkbtn_default_bcc
;
1176 page
->entry_default_bcc
= entry_default_bcc
;
1177 page
->checkbtn_default_replyto
= checkbtn_default_replyto
;
1178 page
->entry_default_replyto
= entry_default_replyto
;
1179 page
->checkbtn_enable_default_account
= checkbtn_enable_default_account
;
1180 page
->optmenu_default_account
= optmenu_default_account
;
1182 page
->checkbtn_enable_default_dictionary
= checkbtn_enable_default_dictionary
;
1183 page
->combo_default_dictionary
= combo_default_dictionary
;
1184 page
->checkbtn_enable_default_alt_dictionary
= checkbtn_enable_default_alt_dictionary
;
1185 page
->combo_default_alt_dictionary
= combo_default_alt_dictionary
;
1188 page
->request_return_receipt_rec_checkbtn
= request_return_receipt_rec_checkbtn
;
1189 page
->save_copy_to_folder_rec_checkbtn
= save_copy_to_folder_rec_checkbtn
;
1190 page
->default_to_rec_checkbtn
= default_to_rec_checkbtn
;
1191 page
->default_reply_to_rec_checkbtn
= default_reply_to_rec_checkbtn
;
1192 page
->default_cc_rec_checkbtn
= default_cc_rec_checkbtn
;
1193 page
->default_bcc_rec_checkbtn
= default_bcc_rec_checkbtn
;
1194 page
->default_replyto_rec_checkbtn
= default_replyto_rec_checkbtn
;
1195 page
->default_account_rec_checkbtn
= default_account_rec_checkbtn
;
1197 page
->default_dictionary_rec_checkbtn
= default_dictionary_rec_checkbtn
;
1198 page
->default_alt_dictionary_rec_checkbtn
= default_alt_dictionary_rec_checkbtn
;
1201 page
->page
.widget
= table
;
1204 static void prefs_folder_item_compose_destroy_widget_func(PrefsPage
*page_
)
1206 FolderItemComposePage
*page
= (FolderItemComposePage
*) page_
;
1208 if (page
->entry_default_to
)
1209 address_completion_unregister_entry(GTK_ENTRY(page
->entry_default_to
));
1210 if (page
->entry_default_reply_to
)
1211 address_completion_unregister_entry(GTK_ENTRY(page
->entry_default_reply_to
));
1212 if (page
->entry_default_cc
)
1213 address_completion_unregister_entry(GTK_ENTRY(page
->entry_default_cc
));
1214 if (page
->entry_default_bcc
)
1215 address_completion_unregister_entry(GTK_ENTRY(page
->entry_default_bcc
));
1216 if (page
->entry_default_replyto
)
1217 address_completion_unregister_entry(GTK_ENTRY(page
->entry_default_replyto
));
1220 /** \brief Save the prefs in page to folder.
1222 * If the folder is not the one specified in page->item, then only those properties
1223 * that have the relevant 'apply to sub folders' button checked are saved
1225 static void compose_save_folder_prefs(FolderItem
*folder
, FolderItemComposePage
*page
)
1227 FolderItemPrefs
*prefs
= folder
->prefs
;
1229 gboolean all
= FALSE
;
1231 if (folder
->path
== NULL
)
1234 if (page
->item
== folder
)
1237 cm_return_if_fail(prefs
!= NULL
);
1239 if (item_protocol(folder
) != A_NNTP
) {
1240 if (all
|| gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page
->request_return_receipt_rec_checkbtn
))) {
1241 prefs
->request_return_receipt
=
1242 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page
->checkbtn_request_return_receipt
));
1244 folder
->ret_rcpt
= prefs
->request_return_receipt
;
1247 if (all
|| gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page
->save_copy_to_folder_rec_checkbtn
))) {
1248 prefs
->save_copy_to_folder
=
1249 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page
->checkbtn_save_copy_to_folder
));
1252 if (all
|| gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page
->default_to_rec_checkbtn
))) {
1254 prefs
->enable_default_to
=
1255 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page
->checkbtn_default_to
));
1256 ASSIGN_STRING(prefs
->default_to
,
1257 gtk_editable_get_chars(GTK_EDITABLE(page
->entry_default_to
), 0, -1));
1260 if (all
|| gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page
->default_reply_to_rec_checkbtn
))) {
1261 prefs
->enable_default_reply_to
=
1262 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page
->checkbtn_default_reply_to
));
1263 ASSIGN_STRING(prefs
->default_reply_to
,
1264 gtk_editable_get_chars(GTK_EDITABLE(page
->entry_default_reply_to
), 0, -1));
1267 if (all
|| gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page
->default_cc_rec_checkbtn
))) {
1269 prefs
->enable_default_cc
=
1270 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page
->checkbtn_default_cc
));
1271 ASSIGN_STRING(prefs
->default_cc
,
1272 gtk_editable_get_chars(GTK_EDITABLE(page
->entry_default_cc
), 0, -1));
1275 if (all
|| gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page
->default_bcc_rec_checkbtn
))) {
1277 prefs
->enable_default_bcc
=
1278 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page
->checkbtn_default_bcc
));
1279 ASSIGN_STRING(prefs
->default_bcc
,
1280 gtk_editable_get_chars(GTK_EDITABLE(page
->entry_default_bcc
), 0, -1));
1283 if (all
|| gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page
->default_replyto_rec_checkbtn
))) {
1285 prefs
->enable_default_replyto
=
1286 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page
->checkbtn_default_replyto
));
1287 ASSIGN_STRING(prefs
->default_replyto
,
1288 gtk_editable_get_chars(GTK_EDITABLE(page
->entry_default_replyto
), 0, -1));
1292 prefs
->request_return_receipt
= FALSE
;
1293 prefs
->save_copy_to_folder
= FALSE
;
1294 prefs
->enable_default_to
= FALSE
;
1295 prefs
->enable_default_reply_to
= FALSE
;
1296 prefs
->enable_default_cc
= FALSE
;
1297 prefs
->enable_default_bcc
= FALSE
;
1298 prefs
->enable_default_replyto
= FALSE
;
1301 if (all
|| gtk_toggle_button_get_active(
1302 GTK_TOGGLE_BUTTON(page
->default_account_rec_checkbtn
))) {
1303 prefs
->enable_default_account
=
1304 gtk_toggle_button_get_active(
1305 GTK_TOGGLE_BUTTON(page
->checkbtn_enable_default_account
));
1306 prefs
->default_account
= combobox_get_active_data(
1307 GTK_COMBO_BOX(page
->optmenu_default_account
));
1311 if (all
|| gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page
->default_dictionary_rec_checkbtn
))) {
1312 prefs
->enable_default_dictionary
=
1313 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page
->checkbtn_enable_default_dictionary
));
1314 ASSIGN_STRING(prefs
->default_dictionary
,
1315 gtkaspell_get_dictionary_menu_active_item(
1316 GTK_COMBO_BOX(page
->combo_default_dictionary
)));
1318 if (all
|| gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page
->default_alt_dictionary_rec_checkbtn
))) {
1319 prefs
->enable_default_alt_dictionary
=
1320 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page
->checkbtn_enable_default_alt_dictionary
));
1321 ASSIGN_STRING(prefs
->default_alt_dictionary
,
1322 gtkaspell_get_dictionary_menu_active_item(
1323 GTK_COMBO_BOX(page
->combo_default_alt_dictionary
)));
1327 folder_item_prefs_save_config(folder
);
1330 static gboolean
compose_save_recurse_func(GNode
*node
, gpointer data
)
1332 FolderItem
*item
= (FolderItem
*) node
->data
;
1333 FolderItemComposePage
*page
= (FolderItemComposePage
*) data
;
1335 cm_return_val_if_fail(item
!= NULL
, TRUE
);
1336 cm_return_val_if_fail(page
!= NULL
, TRUE
);
1338 compose_save_folder_prefs(item
, page
);
1340 /* optimise by not continuing if none of the 'apply to sub folders'
1341 check boxes are selected - and optimise the checking by only doing
1343 if ((node
== page
->item
->node
) && item_protocol(item
) != A_NNTP
&&
1344 !(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page
->request_return_receipt_rec_checkbtn
)) ||
1345 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page
->save_copy_to_folder_rec_checkbtn
)) ||
1346 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page
->default_to_rec_checkbtn
)) ||
1347 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page
->default_account_rec_checkbtn
)) ||
1348 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page
->default_cc_rec_checkbtn
)) ||
1349 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page
->default_bcc_rec_checkbtn
)) ||
1350 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page
->default_replyto_rec_checkbtn
)) ||
1352 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page
->default_dictionary_rec_checkbtn
)) ||
1353 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page
->default_alt_dictionary_rec_checkbtn
)) ||
1355 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page
->default_reply_to_rec_checkbtn
))
1358 else if ((node
== page
->item
->node
) && item_protocol(item
) == A_NNTP
&&
1359 !(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page
->default_account_rec_checkbtn
))
1361 || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page
->default_dictionary_rec_checkbtn
))
1362 || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page
->default_alt_dictionary_rec_checkbtn
))
1370 static void prefs_folder_item_compose_save_func(PrefsPage
*page_
)
1372 FolderItemComposePage
*page
= (FolderItemComposePage
*) page_
;
1374 g_node_traverse(page
->item
->node
, G_PRE_ORDER
, G_TRAVERSE_ALL
,
1375 -1, compose_save_recurse_func
, page
);
1379 static void prefs_folder_item_templates_create_widget_func(PrefsPage
* page_
,
1383 FolderItemTemplatesPage
*page
= (FolderItemTemplatesPage
*) page_
;
1384 FolderItem
*item
= (FolderItem
*) data
;
1386 GtkWidget
*notebook
;
1388 GtkWidget
*page_vbox
;
1389 GtkWidget
*no_save_warning
;
1390 GtkWidget
*new_msg_format_rec_checkbtn
;
1391 GtkWidget
*reply_format_rec_checkbtn
;
1392 GtkWidget
*forward_format_rec_checkbtn
;
1394 GtkWidget
*vbox_format
;
1398 page_vbox
= gtk_vbox_new (FALSE
, 0);
1399 gtk_widget_show (page_vbox
);
1402 no_save_warning
= gtk_label_new(
1403 _("<i>These preferences will not be saved as this folder "
1404 "is a top-level folder. However, you can set them for the "
1405 "whole mailbox tree by using \"Apply to subfolders\".</i>"));
1406 gtk_label_set_use_markup(GTK_LABEL(no_save_warning
), TRUE
);
1407 gtk_label_set_line_wrap(GTK_LABEL(no_save_warning
), TRUE
);
1408 gtk_misc_set_alignment(GTK_MISC(no_save_warning
), 0.0, 0.5);
1409 gtk_box_pack_start(GTK_BOX(page_vbox
), no_save_warning
, FALSE
, FALSE
, 4);
1413 notebook
= gtk_notebook_new();
1414 gtk_widget_show(notebook
);
1415 gtk_box_pack_start(GTK_BOX(page_vbox
), notebook
, TRUE
, TRUE
, 0);
1417 /* compose format */
1418 vbox
= gtk_vbox_new (FALSE
, VSPACING
);
1419 gtk_widget_show (vbox
);
1420 gtk_container_set_border_width (GTK_CONTAINER (vbox
), VBOX_BORDER
);
1422 quotefmt_create_new_msg_fmt_widgets(
1425 &page
->checkbtn_compose_with_format
,
1426 &page
->compose_override_from_format
,
1427 &page
->compose_subject_format
,
1428 &page
->compose_body_format
,
1430 address_completion_register_entry(GTK_ENTRY(page
->compose_override_from_format
),
1433 vbox_format
= gtk_widget_get_parent(
1434 gtk_widget_get_parent(page
->compose_body_format
));
1436 hbox
= gtk_hbox_new (FALSE
, 0);
1437 gtk_box_pack_end (GTK_BOX(vbox_format
), hbox
, FALSE
, FALSE
, 0);
1438 quotefmt_add_info_button(window
, hbox
);
1440 new_msg_format_rec_checkbtn
= gtk_check_button_new_with_label(
1441 _("Apply to subfolders"));
1442 gtk_box_pack_end (GTK_BOX(hbox
), new_msg_format_rec_checkbtn
, FALSE
, FALSE
, 0);
1443 gtk_notebook_append_page(GTK_NOTEBOOK(notebook
), vbox
, gtk_label_new(_("Compose")));
1446 vbox
= gtk_vbox_new (FALSE
, VSPACING
);
1447 gtk_widget_show (vbox
);
1448 gtk_container_set_border_width (GTK_CONTAINER (vbox
), VBOX_BORDER
);
1450 quotefmt_create_reply_fmt_widgets(
1453 &page
->checkbtn_reply_with_format
,
1454 &page
->reply_override_from_format
,
1455 &page
->reply_quotemark
,
1456 &page
->reply_body_format
,
1458 address_completion_register_entry(GTK_ENTRY(page
->reply_override_from_format
),
1461 vbox_format
= gtk_widget_get_parent(
1462 gtk_widget_get_parent(page
->reply_body_format
));
1464 hbox
= gtk_hbox_new (FALSE
, 0);
1465 gtk_box_pack_end (GTK_BOX(vbox_format
), hbox
, FALSE
, FALSE
, 0);
1466 quotefmt_add_info_button(window
, hbox
);
1468 reply_format_rec_checkbtn
= gtk_check_button_new_with_label(
1469 _("Apply to subfolders"));
1470 gtk_box_pack_end (GTK_BOX(hbox
), reply_format_rec_checkbtn
, FALSE
, FALSE
, 0);
1471 gtk_notebook_append_page(GTK_NOTEBOOK(notebook
), vbox
, gtk_label_new(_("Reply")));
1473 /* forward format */
1474 vbox
= gtk_vbox_new (FALSE
, VSPACING
);
1475 gtk_widget_show (vbox
);
1476 gtk_container_set_border_width (GTK_CONTAINER (vbox
), VBOX_BORDER
);
1478 quotefmt_create_forward_fmt_widgets(
1481 &page
->checkbtn_forward_with_format
,
1482 &page
->forward_override_from_format
,
1483 &page
->forward_quotemark
,
1484 &page
->forward_body_format
,
1486 address_completion_register_entry(GTK_ENTRY(page
->forward_override_from_format
),
1489 vbox_format
= gtk_widget_get_parent(
1490 gtk_widget_get_parent(page
->forward_body_format
));
1492 hbox
= gtk_hbox_new (FALSE
, 0);
1493 gtk_box_pack_end (GTK_BOX(vbox_format
), hbox
, FALSE
, FALSE
, 0);
1494 quotefmt_add_info_button(window
, hbox
);
1496 forward_format_rec_checkbtn
= gtk_check_button_new_with_label(
1497 _("Apply to subfolders"));
1498 gtk_box_pack_end (GTK_BOX(hbox
), forward_format_rec_checkbtn
, FALSE
, FALSE
, 0);
1499 gtk_notebook_append_page(GTK_NOTEBOOK(notebook
), vbox
, gtk_label_new(_("Forward")));
1501 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(page
->checkbtn_compose_with_format
),
1502 item
->prefs
->compose_with_format
);
1503 pref_set_entry_from_pref(GTK_ENTRY(page
->compose_override_from_format
),
1504 item
->prefs
->compose_override_from_format
);
1505 pref_set_entry_from_pref(GTK_ENTRY(page
->compose_subject_format
),
1506 item
->prefs
->compose_subject_format
);
1507 pref_set_textview_from_pref(GTK_TEXT_VIEW(page
->compose_body_format
),
1508 item
->prefs
->compose_body_format
);
1510 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(page
->checkbtn_reply_with_format
),
1511 item
->prefs
->reply_with_format
);
1512 pref_set_entry_from_pref(GTK_ENTRY(page
->reply_quotemark
),
1513 item
->prefs
->reply_quotemark
);
1514 pref_set_entry_from_pref(GTK_ENTRY(page
->reply_override_from_format
),
1515 item
->prefs
->reply_override_from_format
);
1516 pref_set_textview_from_pref(GTK_TEXT_VIEW(page
->reply_body_format
),
1517 item
->prefs
->reply_body_format
);
1519 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(page
->checkbtn_forward_with_format
),
1520 item
->prefs
->forward_with_format
);
1521 pref_set_entry_from_pref(GTK_ENTRY(page
->forward_quotemark
),
1522 item
->prefs
->forward_quotemark
);
1523 pref_set_entry_from_pref(GTK_ENTRY(page
->forward_override_from_format
),
1524 item
->prefs
->forward_override_from_format
);
1525 pref_set_textview_from_pref(GTK_TEXT_VIEW(page
->forward_body_format
),
1526 item
->prefs
->forward_body_format
);
1528 gtk_widget_show_all(page_vbox
);
1530 page
->window
= GTK_WIDGET(window
);
1532 page
->new_msg_format_rec_checkbtn
= new_msg_format_rec_checkbtn
;
1533 page
->reply_format_rec_checkbtn
= reply_format_rec_checkbtn
;
1534 page
->forward_format_rec_checkbtn
= forward_format_rec_checkbtn
;
1536 page
->page
.widget
= page_vbox
;
1539 static void prefs_folder_item_templates_destroy_widget_func(PrefsPage
*page_
)
1541 FolderItemTemplatesPage
*page
= (FolderItemTemplatesPage
*) page_
;
1543 if (page
->compose_override_from_format
)
1544 address_completion_unregister_entry(GTK_ENTRY(page
->compose_override_from_format
));
1545 if (page
->reply_override_from_format
)
1546 address_completion_unregister_entry(GTK_ENTRY(page
->reply_override_from_format
));
1547 if (page
->forward_override_from_format
)
1548 address_completion_unregister_entry(GTK_ENTRY(page
->forward_override_from_format
));
1551 /** \brief Save the prefs in page to folder.
1553 * If the folder is not the one specified in page->item, then only those properties
1554 * that have the relevant 'apply to sub folders' button checked are saved
1556 static void templates_save_folder_prefs(FolderItem
*folder
, FolderItemTemplatesPage
*page
)
1558 FolderItemPrefs
*prefs
= folder
->prefs
;
1559 gboolean all
= FALSE
;
1561 if (folder
->path
== NULL
)
1564 if (page
->item
== folder
)
1567 cm_return_if_fail(prefs
!= NULL
);
1569 /* save and check formats */
1571 if (all
|| gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page
->new_msg_format_rec_checkbtn
))) {
1573 prefs
->compose_with_format
=
1574 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page
->checkbtn_compose_with_format
));
1575 prefs
->compose_override_from_format
= pref_get_pref_from_entry(
1576 GTK_ENTRY(page
->compose_override_from_format
));
1577 prefs
->compose_subject_format
= pref_get_pref_from_entry(
1578 GTK_ENTRY(page
->compose_subject_format
));
1579 prefs
->compose_body_format
= pref_get_pref_from_textview(
1580 GTK_TEXT_VIEW(page
->compose_body_format
));
1581 quotefmt_check_new_msg_formats(prefs
->compose_with_format
,
1582 prefs
->compose_override_from_format
,
1583 prefs
->compose_subject_format
,
1584 prefs
->compose_body_format
);
1587 if (all
|| gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page
->reply_format_rec_checkbtn
))) {
1588 prefs
->reply_with_format
=
1589 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page
->checkbtn_reply_with_format
));
1590 prefs
->reply_quotemark
= gtk_editable_get_chars(
1591 GTK_EDITABLE(page
->reply_quotemark
), 0, -1);
1592 prefs
->reply_override_from_format
= pref_get_pref_from_entry(
1593 GTK_ENTRY(page
->reply_override_from_format
));
1594 prefs
->reply_body_format
= pref_get_pref_from_textview(
1595 GTK_TEXT_VIEW(page
->reply_body_format
));
1596 quotefmt_check_reply_formats(prefs
->reply_with_format
,
1597 prefs
->reply_override_from_format
,
1598 prefs
->reply_quotemark
,
1599 prefs
->reply_body_format
);
1602 if (all
|| gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page
->forward_format_rec_checkbtn
))) {
1603 prefs
->forward_with_format
=
1604 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page
->checkbtn_forward_with_format
));
1605 prefs
->forward_quotemark
= gtk_editable_get_chars(
1606 GTK_EDITABLE(page
->forward_quotemark
), 0, -1);
1607 prefs
->forward_override_from_format
= pref_get_pref_from_entry(
1608 GTK_ENTRY(page
->forward_override_from_format
));
1609 prefs
->forward_body_format
= pref_get_pref_from_textview(
1610 GTK_TEXT_VIEW(page
->forward_body_format
));
1611 quotefmt_check_forward_formats(prefs
->forward_with_format
,
1612 prefs
->forward_override_from_format
,
1613 prefs
->forward_quotemark
,
1614 prefs
->forward_body_format
);
1617 folder_item_prefs_save_config(folder
);
1620 static gboolean
templates_save_recurse_func(GNode
*node
, gpointer data
)
1622 FolderItem
*item
= (FolderItem
*) node
->data
;
1623 FolderItemTemplatesPage
*page
= (FolderItemTemplatesPage
*) data
;
1625 cm_return_val_if_fail(item
!= NULL
, TRUE
);
1626 cm_return_val_if_fail(page
!= NULL
, TRUE
);
1628 templates_save_folder_prefs(item
, page
);
1630 /* optimise by not continuing if none of the 'apply to sub folders'
1631 check boxes are selected - and optimise the checking by only doing
1633 if ((node
== page
->item
->node
) &&
1634 !(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page
->new_msg_format_rec_checkbtn
)) ||
1635 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page
->reply_format_rec_checkbtn
)) ||
1636 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page
->forward_format_rec_checkbtn
))))
1644 static void prefs_folder_item_templates_save_func(PrefsPage
*page_
)
1646 FolderItemTemplatesPage
*page
= (FolderItemTemplatesPage
*) page_
;
1648 g_node_traverse(page
->item
->node
, G_PRE_ORDER
, G_TRAVERSE_ALL
,
1649 -1, templates_save_recurse_func
, page
);
1653 static gint
prefs_folder_item_chmod_mode(gchar
*folder_chmod
)
1659 newmode
= strtol(folder_chmod
, &tmp
, 8);
1660 if (!(*(folder_chmod
) && !(*tmp
)))
1667 static void folder_color_set_dialog(GtkWidget
*widget
, gpointer data
)
1669 FolderItemGeneralPage
*page
= (FolderItemGeneralPage
*) data
;
1672 rgbcolor
= colorsel_select_color_rgb(_("Pick color for folder"),
1673 page
->folder_color
);
1674 gtkut_set_widget_bgcolor_rgb(page
->folder_color_btn
, rgbcolor
);
1675 page
->folder_color
= rgbcolor
;
1678 static void clean_cache_cb(GtkWidget
*widget
, gpointer data
)
1680 FolderItemGeneralPage
*page
= (FolderItemGeneralPage
*) data
;
1681 FolderItem
*item
= page
->item
;
1682 gboolean was_open
= FALSE
;
1683 FolderView
*folderview
= NULL
;
1685 if (alertpanel_full(_("Discard cache"),
1686 _("Do you really want to discard the local cached "
1687 "data for this folder?"),
1688 GTK_STOCK_CANCEL
, _("+Discard"), NULL
, FALSE
,
1689 NULL
, ALERT_WARNING
, G_ALERTDEFAULT
)
1690 != G_ALERTALTERNATE
)
1693 if (mainwindow_get_mainwindow())
1694 folderview
= mainwindow_get_mainwindow()->folderview
;
1696 if (folderview
&& item
->opened
) {
1697 folderview_close_opened(folderview
);
1700 folder_item_discard_cache(item
);
1702 folderview_select(folderview
,item
);
1706 static regex_t
*summary_compile_simplify_regexp(gchar
*simplify_subject_regexp
)
1709 gchar buf
[BUFFSIZE
];
1710 regex_t
*preg
= NULL
;
1712 preg
= g_new0(regex_t
, 1);
1714 err
= string_match_precompile(simplify_subject_regexp
,
1715 preg
, REG_EXTENDED
);
1717 regerror(err
, preg
, buf
, BUFFSIZE
);
1725 static void folder_regexp_test_cb(GtkWidget
*widget
, gpointer data
)
1727 #if !GTK_CHECK_VERSION(3, 0, 0)
1728 static GdkColor red
;
1729 static gboolean colors_initialised
= FALSE
;
1731 static GdkColor red
= { (guint32
)0, (guint16
)0xff, (guint16
)0x70, (guint16
)0x70 };
1733 static gchar buf
[BUFFSIZE
];
1734 FolderItemGeneralPage
*page
= (FolderItemGeneralPage
*)data
;
1735 gchar
*test_string
, *regexp
;
1738 regexp
= g_strdup(gtk_entry_get_text(GTK_ENTRY(page
->entry_simplify_subject
)));
1739 test_string
= g_strdup(gtk_entry_get_text(GTK_ENTRY(page
->entry_regexp_test_string
)));
1741 if (!regexp
|| !regexp
[0]) {
1742 gtk_widget_modify_base(page
->entry_simplify_subject
,
1743 GTK_STATE_NORMAL
, NULL
);
1745 gtk_entry_set_text(GTK_ENTRY(page
->entry_regexp_test_result
), test_string
);
1747 g_free(test_string
);
1752 if (!test_string
|| !test_string
[0]) {
1753 g_free(test_string
);
1758 #if !GTK_CHECK_VERSION(3, 0, 0)
1759 if (!colors_initialised
) {
1760 gdk_color_parse("#ff7070", &red
);
1761 colors_initialised
= gdk_colormap_alloc_color(
1762 gdk_colormap_get_system(), &red
, FALSE
, TRUE
);
1766 preg
= summary_compile_simplify_regexp(regexp
);
1767 #if !GTK_CHECK_VERSION(3, 0, 0)
1768 if (colors_initialised
)
1769 gtk_widget_modify_base(page
->entry_simplify_subject
,
1770 GTK_STATE_NORMAL
, preg
? NULL
: &red
);
1774 string_remove_match(buf
, BUFFSIZE
, test_string
, preg
);
1776 gtk_entry_set_text(GTK_ENTRY(page
->entry_regexp_test_result
), buf
);
1782 g_free(test_string
);
1786 static gchar
*folder_regexp_get_subject_example(void)
1788 MsgInfo
*msginfo_selected
;
1789 SummaryView
*summaryview
= NULL
;
1791 if (!mainwindow_get_mainwindow())
1793 summaryview
= mainwindow_get_mainwindow()->summaryview
;
1795 msginfo_selected
= summary_get_selected_msg(summaryview
);
1796 return msginfo_selected
? g_strdup(msginfo_selected
->subject
) : NULL
;
1799 static void folder_regexp_set_subject_example_cb(GtkWidget
*widget
, gpointer data
)
1801 FolderItemGeneralPage
*page
= (FolderItemGeneralPage
*)data
;
1803 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page
->checkbtn_simplify_subject
))) {
1804 gchar
*subject
= folder_regexp_get_subject_example();
1806 gtk_entry_set_text(GTK_ENTRY(page
->entry_regexp_test_string
), subject
);
1812 static void register_general_page()
1814 static gchar
*pfi_general_path
[2];
1815 static FolderItemGeneralPage folder_item_general_page
;
1817 pfi_general_path
[0] = _("General");
1818 pfi_general_path
[1] = NULL
;
1820 folder_item_general_page
.page
.path
= pfi_general_path
;
1821 folder_item_general_page
.page
.create_widget
= prefs_folder_item_general_create_widget_func
;
1822 folder_item_general_page
.page
.destroy_widget
= prefs_folder_item_general_destroy_widget_func
;
1823 folder_item_general_page
.page
.save_page
= prefs_folder_item_general_save_func
;
1825 prefs_folder_item_register_page((PrefsPage
*) &folder_item_general_page
);
1829 static void register_compose_page(void)
1831 static gchar
*pfi_compose_path
[2];
1832 static FolderItemComposePage folder_item_compose_page
;
1834 pfi_compose_path
[0] = _("Compose");
1835 pfi_compose_path
[1] = NULL
;
1837 folder_item_compose_page
.page
.path
= pfi_compose_path
;
1838 folder_item_compose_page
.page
.create_widget
= prefs_folder_item_compose_create_widget_func
;
1839 folder_item_compose_page
.page
.destroy_widget
= prefs_folder_item_compose_destroy_widget_func
;
1840 folder_item_compose_page
.page
.save_page
= prefs_folder_item_compose_save_func
;
1842 prefs_folder_item_register_page((PrefsPage
*) &folder_item_compose_page
);
1845 static void register_templates_page(void)
1847 static gchar
*pfi_templates_path
[2];
1848 static FolderItemTemplatesPage folder_item_templates_page
;
1850 pfi_templates_path
[0] = _("Templates");
1851 pfi_templates_path
[1] = NULL
;
1853 folder_item_templates_page
.page
.path
= pfi_templates_path
;
1854 folder_item_templates_page
.page
.create_widget
= prefs_folder_item_templates_create_widget_func
;
1855 folder_item_templates_page
.page
.destroy_widget
= prefs_folder_item_templates_destroy_widget_func
;
1856 folder_item_templates_page
.page
.save_page
= prefs_folder_item_templates_save_func
;
1858 prefs_folder_item_register_page((PrefsPage
*) &folder_item_templates_page
);
1861 static GSList
*prefs_pages
= NULL
;
1863 static void prefs_folder_item_address_completion_start(GtkWindow
* window
)
1865 address_completion_start(GTK_WIDGET(window
));
1868 static void prefs_folder_item_address_completion_end(GtkWindow
* window
)
1870 address_completion_end(GTK_WIDGET(window
));
1873 void prefs_folder_item_open(FolderItem
*item
)
1876 if (prefs_pages
== NULL
) {
1877 register_general_page();
1878 register_compose_page();
1879 register_templates_page();
1883 id
= folder_item_get_identifier (item
);
1886 id
= g_strdup(item
->name
);
1889 title
= g_strdup_printf (_("Properties for folder %s"), id
);
1891 prefswindow_open(title
, prefs_pages
, item
,
1892 &prefs_common
.folderitemwin_width
, &prefs_common
.folderitemwin_height
,
1893 prefs_folder_item_address_completion_start
,
1894 prefs_folder_item_address_completion_end
);
1899 static void prefs_folder_item_register_page(PrefsPage
*page
)
1901 prefs_pages
= g_slist_append(prefs_pages
, page
);