1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
3 * Authors: Jeffrey Stedfast <fejj@ximian.com>
5 * Copyright 2002-2003 Ximian, Inc. (www.ximian.com)
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA.
29 #include "em-mailer-prefs.h"
30 #include "em-format.h"
32 #include <libedataserver/e-iconv.h>
33 #include <gtkhtml/gtkhtml-properties.h>
34 #include <libxml/tree.h>
35 #include "misc/e-charset-picker.h"
36 #include <bonobo/bonobo-generic-factory.h>
38 #include <libgnomeui/gnome-color-picker.h>
39 #include <libgnomeui/gnome-font-picker.h>
40 #include <gtk/gtkfilechooserbutton.h>
42 #include <glade/glade.h>
44 #include <gconf/gconf-client.h>
46 #include <gtk/gtkentry.h>
47 #include <gtk/gtktreeview.h>
48 #include <gtk/gtkliststore.h>
49 #include <gtk/gtktreeselection.h>
50 #include <gtk/gtkcellrenderertoggle.h>
51 #include <gtk/gtkcellrenderertext.h>
52 #include <gtk/gtkspinbutton.h>
53 #include <gtk/gtktogglebutton.h>
54 #include <gtk/gtkoptionmenu.h>
55 #include <gtk/gtkmenuitem.h>
57 #include "e-util/e-util-private.h"
59 #include "mail-config.h"
60 #include "em-config.h"
62 static void em_mailer_prefs_class_init (EMMailerPrefsClass
*class);
63 static void em_mailer_prefs_init (EMMailerPrefs
*dialog
);
64 static void em_mailer_prefs_finalise (GObject
*obj
);
66 static GtkVBoxClass
*parent_class
= NULL
;
69 HEADER_LIST_NAME_COLUMN
, /* displayable name of the header (may be a translation) */
70 HEADER_LIST_ENABLED_COLUMN
, /* is the header enabled? */
71 HEADER_LIST_IS_DEFAULT_COLUMN
, /* is this header a default header, eg From: */
72 HEADER_LIST_HEADER_COLUMN
, /* the real name of this header */
73 HEADER_LIST_N_COLUMNS
,
76 static GType col_types
[] = {
83 /* temporarily copied from em-format.c */
84 static const char *default_headers
[] = {
93 "x-evolution-mailer", /* DO NOT translate */
96 #define EM_FORMAT_HEADER_XMAILER "x-evolution-mailer"
98 /* for empty trash on exit frequency */
102 } empty_trash_frequency
[] = {
103 { N_("Every time"), 0 },
104 { N_("Once per day"), 1 },
105 { N_("Once per week"), 7 },
106 { N_("Once per month"), 30 },
110 em_mailer_prefs_get_type (void)
112 static GType type
= 0;
115 GTypeInfo type_info
= {
116 sizeof (EMMailerPrefsClass
),
118 (GClassInitFunc
) em_mailer_prefs_class_init
,
120 sizeof (EMMailerPrefs
),
122 (GInstanceInitFunc
) em_mailer_prefs_init
,
125 type
= g_type_register_static (gtk_vbox_get_type (), "EMMailerPrefs", &type_info
, 0);
132 em_mailer_prefs_class_init (EMMailerPrefsClass
*klass
)
134 GObjectClass
*object_class
;
136 object_class
= (GObjectClass
*) klass
;
137 parent_class
= g_type_class_ref (gtk_vbox_get_type ());
139 object_class
->finalize
= em_mailer_prefs_finalise
;
143 em_mailer_prefs_init (EMMailerPrefs
*preferences
)
145 preferences
->gconf
= mail_config_get_gconf_client ();
149 em_mailer_prefs_finalise (GObject
*obj
)
151 EMMailerPrefs
*prefs
= (EMMailerPrefs
*) obj
;
153 g_object_unref (prefs
->gui
);
155 ((GObjectClass
*)(parent_class
))->finalize (obj
);
160 colorpicker_set_color (GnomeColorPicker
*color
, const char *str
)
165 gdk_color_parse (str
, &colour
);
166 rgb
= ((colour
.red
& 0xff00) << 8) | (colour
.green
& 0xff00) | ((colour
.blue
& 0xff00) >> 8);
168 gnome_color_picker_set_i8 (color
, (rgb
& 0xff0000) >> 16, (rgb
& 0xff00) >> 8, rgb
& 0xff, 0xff);
172 colorpicker_get_color (GnomeColorPicker
*color
)
177 gnome_color_picker_get_i8 (color
, &r
, &g
, &b
, &a
);
189 citation_color_set (GtkWidget
*widget
, guint r
, guint g
, guint b
, guint a
, EMMailerPrefs
*prefs
)
200 sprintf (buf
, "#%06x", rgb
& 0xffffff);
202 gconf_client_set_string (prefs
->gconf
, "/apps/evolution/mail/display/citation_colour", buf
, NULL
);
206 labels_changed (EMMailerPrefs
*prefs
)
208 GSList
*l
, *n
, *list
= NULL
;
214 for (i
= 4; i
>= 0; i
--) {
215 cstring
= gtk_entry_get_text (prefs
->labels
[i
].name
);
216 rgb
= colorpicker_get_color (prefs
->labels
[i
].color
);
217 string
= g_strdup_printf ("%s:#%06x", cstring
, rgb
& 0xffffff);
218 list
= g_slist_prepend (list
, string
);
221 gconf_client_set_list (prefs
->gconf
, "/apps/evolution/mail/labels", GCONF_VALUE_STRING
, list
, NULL
);
233 label_color_set (GtkWidget
*widget
, guint r
, guint g
, guint b
, guint a
, EMMailerPrefs
*prefs
)
235 labels_changed (prefs
);
239 label_entry_changed (GtkEntry
*entry
, EMMailerPrefs
*prefs
)
241 labels_changed (prefs
);
245 restore_labels_clicked (GtkWidget
*widget
, gpointer user_data
)
247 EMMailerPrefs
*prefs
= (EMMailerPrefs
*) user_data
;
250 for (i
= 0; i
< 5; i
++) {
251 gtk_entry_set_text (prefs
->labels
[i
].name
, _(label_defaults
[i
].name
));
252 colorpicker_set_color (prefs
->labels
[i
].color
, label_defaults
[i
].colour
);
253 atk_object_set_name(gtk_widget_get_accessible((GtkWidget
*)prefs
->labels
[i
].color
), _(label_defaults
[i
].name
));
258 emmp_header_remove_sensitivity (EMMailerPrefs
*prefs
)
261 GtkTreeSelection
*selection
= gtk_tree_view_get_selection (prefs
->header_list
);
264 /* remove button should be sensitive if the currenlty selected entry in the list view
265 is not a default header. if there are no entries, or none is selected, it should be
268 if (gtk_tree_selection_get_selected (selection
, NULL
, &iter
)) {
269 gtk_tree_model_get (GTK_TREE_MODEL (prefs
->header_list_store
), &iter
,
270 HEADER_LIST_IS_DEFAULT_COLUMN
, &is_default
,
273 gtk_widget_set_sensitive (GTK_WIDGET (prefs
->remove_header
), FALSE
);
275 gtk_widget_set_sensitive (GTK_WIDGET (prefs
->remove_header
), TRUE
);
277 gtk_widget_set_sensitive (GTK_WIDGET (prefs
->remove_header
), FALSE
);
282 emmp_header_is_valid (const char *header
)
284 const char *p
= header
;
290 if ((*p
== ':') || (*p
== ' '))
299 emmp_header_add_sensitivity (EMMailerPrefs
*prefs
)
301 const char *entry_contents
;
305 /* the add header button should be sensitive if the text box contains
306 a valid header string, that is not a duplicate with something already
309 entry_contents
= gtk_entry_get_text (GTK_ENTRY (prefs
->entry_header
));
310 if (!emmp_header_is_valid (entry_contents
)) {
311 gtk_widget_set_sensitive (GTK_WIDGET (prefs
->add_header
), FALSE
);
315 /* check if this is a duplicate */
316 valid
= gtk_tree_model_get_iter_first (GTK_TREE_MODEL (prefs
->header_list_store
), &iter
);
320 gtk_tree_model_get (GTK_TREE_MODEL (prefs
->header_list_store
), &iter
,
321 HEADER_LIST_HEADER_COLUMN
, &header_name
,
323 if (g_ascii_strcasecmp (header_name
, entry_contents
) == 0) {
324 gtk_widget_set_sensitive (GTK_WIDGET (prefs
->add_header
), FALSE
);
328 valid
= gtk_tree_model_iter_next (GTK_TREE_MODEL (prefs
->header_list_store
), &iter
);
331 gtk_widget_set_sensitive (GTK_WIDGET (prefs
->add_header
), TRUE
);
335 emmp_save_headers (EMMailerPrefs
*prefs
)
343 valid
= gtk_tree_model_get_iter_first (GTK_TREE_MODEL (prefs
->header_list_store
), &iter
);
345 struct _EMMailerPrefsHeader h
;
349 gtk_tree_model_get (GTK_TREE_MODEL (prefs
->header_list_store
), &iter
,
350 HEADER_LIST_HEADER_COLUMN
, &h
.name
,
351 HEADER_LIST_ENABLED_COLUMN
, &enabled
,
355 if ((xml
= em_mailer_prefs_header_to_xml (&h
)))
356 header_list
= g_slist_append (header_list
, xml
);
358 valid
= gtk_tree_model_iter_next (GTK_TREE_MODEL (prefs
->header_list_store
), &iter
);
361 gconf_client_set_list (prefs
->gconf
, "/apps/evolution/mail/display/headers", GCONF_VALUE_STRING
, header_list
, NULL
);
362 g_slist_foreach (header_list
, (GFunc
) g_free
, NULL
);
363 g_slist_free (header_list
);
367 emmp_header_list_enabled_toggled (GtkCellRendererToggle
*cell
, const char *path_string
, EMMailerPrefs
*prefs
)
369 GtkTreeModel
*model
= GTK_TREE_MODEL (prefs
->header_list_store
);
370 GtkTreePath
*path
= gtk_tree_path_new_from_string (path_string
);
374 gtk_tree_model_get_iter (model
, &iter
, path
);
375 gtk_tree_model_get (model
, &iter
, HEADER_LIST_ENABLED_COLUMN
, &enabled
, -1);
377 gtk_list_store_set (GTK_LIST_STORE (model
), &iter
, HEADER_LIST_ENABLED_COLUMN
,
379 gtk_tree_path_free (path
);
381 emmp_save_headers (prefs
);
385 emmp_header_add_header (GtkWidget
*widget
, EMMailerPrefs
*prefs
)
387 GtkTreeModel
*model
= GTK_TREE_MODEL (prefs
->header_list_store
);
389 const gchar
*text
= gtk_entry_get_text (prefs
->entry_header
);
393 if (text
&& (strlen (text
)>0)) {
394 gtk_list_store_append (GTK_LIST_STORE (model
), &iter
);
395 gtk_list_store_set (GTK_LIST_STORE (model
), &iter
,
396 HEADER_LIST_NAME_COLUMN
, text
,
397 HEADER_LIST_ENABLED_COLUMN
, TRUE
,
398 HEADER_LIST_HEADER_COLUMN
, text
,
399 HEADER_LIST_IS_DEFAULT_COLUMN
, FALSE
,
401 gtk_entry_set_text (prefs
->entry_header
, "");
402 emmp_header_remove_sensitivity (prefs
);
403 emmp_header_add_sensitivity (prefs
);
405 emmp_save_headers (prefs
);
410 emmp_header_remove_header (GtkWidget
*button
, gpointer user_data
)
412 EMMailerPrefs
*prefs
= (EMMailerPrefs
*) user_data
;
413 GtkTreeModel
*model
= GTK_TREE_MODEL (prefs
->header_list_store
);
414 GtkTreeSelection
*selection
= gtk_tree_view_get_selection (prefs
->header_list
);
417 if (!gtk_tree_selection_get_selected (selection
, NULL
, &iter
))
420 gtk_list_store_remove (GTK_LIST_STORE (model
), &iter
);
421 emmp_header_remove_sensitivity (prefs
);
423 emmp_save_headers (prefs
);
427 emmp_header_list_row_selected (GtkTreeSelection
*selection
, gpointer user_data
)
429 EMMailerPrefs
*prefs
= (EMMailerPrefs
*) user_data
;
431 emmp_header_remove_sensitivity (prefs
);
435 emmp_header_entry_changed (GtkWidget
*entry
, gpointer user_data
)
437 EMMailerPrefs
*prefs
= (EMMailerPrefs
*) user_data
;
439 emmp_header_add_sensitivity (prefs
);
443 mark_seen_timeout_changed (GtkSpinButton
*spin
, EMMailerPrefs
*prefs
)
447 timeout
= (int) (gtk_spin_button_get_value (prefs
->timeout
) * 1000.0);
448 gconf_client_set_int (prefs
->gconf
, "/apps/evolution/mail/display/mark_seen_timeout", timeout
, NULL
);
452 address_compress_count_changed (GtkSpinButton
*spin
, EMMailerPrefs
*prefs
)
456 count
= (int) gtk_spin_button_get_value (prefs
->address_count
);
458 gconf_client_set_int (prefs
->gconf
, "/apps/evolution/mail/display/address_count", count
, NULL
);
462 mlimit_count_changed (GtkSpinButton
*spin
, EMMailerPrefs
*prefs
)
466 count
= (int) gtk_spin_button_get_value (prefs
->mlimit_count
);
468 gconf_client_set_int (prefs
->gconf
, "/apps/evolution/mail/display/message_text_part_limit", count
, NULL
);
472 spin_button_init (EMMailerPrefs
*prefs
, GtkSpinButton
*spin
, const char *key
, float div
, GCallback value_changed
)
479 gtk_spin_button_get_range (spin
, &min
, &max
);
481 mkey
= g_alloca (strlen (key
) + 5);
482 p
= g_stpcpy (mkey
, key
);
485 /* see if the admin locked down the min value */
487 val
= gconf_client_get_int (prefs
->gconf
, mkey
, &err
);
489 g_clear_error (&err
);
491 min
= (1.0 * val
) / div
;
493 /* see if the admin locked down the max value */
495 val
= gconf_client_get_int (prefs
->gconf
, mkey
, &err
);
497 g_clear_error (&err
);
499 max
= (1.0 * val
) / div
;
501 gtk_spin_button_set_range (spin
, min
, max
);
504 val
= gconf_client_get_int (prefs
->gconf
, key
, NULL
);
505 gtk_spin_button_set_value (spin
, (1.0 * val
) / div
);
508 g_object_set_data ((GObject
*) spin
, "key", (void *) key
);
509 g_signal_connect (spin
, "value-changed", value_changed
, prefs
);
512 if (!gconf_client_key_is_writable (prefs
->gconf
, key
, NULL
))
513 gtk_widget_set_sensitive ((GtkWidget
*) spin
, FALSE
);
517 toggle_button_toggled (GtkToggleButton
*toggle
, EMMailerPrefs
*prefs
)
521 key
= g_object_get_data ((GObject
*) toggle
, "key");
522 gconf_client_set_bool (prefs
->gconf
, key
, gtk_toggle_button_get_active (toggle
), NULL
);
526 toggle_button_toggled_not (GtkToggleButton
*toggle
, EMMailerPrefs
*prefs
)
530 key
= g_object_get_data ((GObject
*) toggle
, "key");
531 gconf_client_set_bool (prefs
->gconf
, key
, !gtk_toggle_button_get_active (toggle
), NULL
);
535 custom_font_changed (GtkToggleButton
*toggle
, EMMailerPrefs
*prefs
)
539 use_custom
= !gtk_toggle_button_get_active (toggle
);
541 gtk_widget_set_sensitive (GTK_WIDGET (prefs
->font_fixed
), use_custom
);
542 gtk_widget_set_sensitive (GTK_WIDGET (prefs
->font_variable
), use_custom
);
544 gconf_client_set_bool (prefs
->gconf
, "/apps/evolution/mail/display/fonts/use_custom", use_custom
, NULL
);
548 font_changed (GnomeFontPicker
*fontpicker
, const char *arg1
, EMMailerPrefs
*prefs
)
552 key
= g_object_get_data ((GObject
*) fontpicker
, "key");
553 gconf_client_set_string (prefs
->gconf
, key
, gnome_font_picker_get_font_name (fontpicker
), NULL
);
557 toggle_button_init (EMMailerPrefs
*prefs
, GtkToggleButton
*toggle
, int not, const char *key
, GCallback toggled
)
561 bool = gconf_client_get_bool (prefs
->gconf
, key
, NULL
);
562 gtk_toggle_button_set_active (toggle
, not ? !bool : bool);
565 g_object_set_data ((GObject
*) toggle
, "key", (void *) key
);
566 g_signal_connect (toggle
, "toggled", toggled
, prefs
);
569 if (!gconf_client_key_is_writable (prefs
->gconf
, key
, NULL
))
570 gtk_widget_set_sensitive ((GtkWidget
*) toggle
, FALSE
);
574 charset_activate (GtkWidget
*item
, EMMailerPrefs
*prefs
)
579 menu
= gtk_option_menu_get_menu (prefs
->charset
);
580 if (!(string
= e_charset_picker_get_charset (menu
)))
581 string
= g_strdup (e_iconv_locale_charset ());
583 gconf_client_set_string (prefs
->gconf
, "/apps/evolution/mail/display/charset", string
, NULL
);
588 charset_menu_init (EMMailerPrefs
*prefs
)
590 GtkWidget
*menu
, *item
;
594 buf
= gconf_client_get_string (prefs
->gconf
, "/apps/evolution/mail/display/charset", NULL
);
595 menu
= e_charset_picker_new (buf
&& *buf
? buf
: e_iconv_locale_charset ());
596 gtk_option_menu_set_menu (prefs
->charset
, GTK_WIDGET (menu
));
599 items
= GTK_MENU_SHELL (menu
)->children
;
602 g_signal_connect (item
, "activate", G_CALLBACK (charset_activate
), prefs
);
606 if (!gconf_client_key_is_writable (prefs
->gconf
, "/apps/evolution/mail/display/charset", NULL
))
607 gtk_widget_set_sensitive ((GtkWidget
*) prefs
->charset
, FALSE
);
611 trash_days_activate (GtkWidget
*item
, EMMailerPrefs
*prefs
)
615 days
= GPOINTER_TO_INT (g_object_get_data ((GObject
*) item
, "days"));
616 gconf_client_set_int (prefs
->gconf
, "/apps/evolution/mail/trash/empty_on_exit_days", days
, NULL
);
620 emmp_empty_trash_init (EMMailerPrefs
*prefs
)
622 int locked
, days
, hist
= 0, i
;
623 GtkWidget
*menu
, *item
;
625 toggle_button_init (prefs
, prefs
->empty_trash
, FALSE
,
626 "/apps/evolution/mail/trash/empty_on_exit",
627 G_CALLBACK (toggle_button_toggled
));
629 days
= gconf_client_get_int(prefs
->gconf
, "/apps/evolution/mail/trash/empty_on_exit_days", NULL
);
630 menu
= gtk_menu_new();
631 for (i
= 0; i
< G_N_ELEMENTS (empty_trash_frequency
); i
++) {
632 if (days
>= empty_trash_frequency
[i
].days
)
635 item
= gtk_menu_item_new_with_label (_(empty_trash_frequency
[i
].label
));
636 g_object_set_data ((GObject
*) item
, "days", GINT_TO_POINTER (empty_trash_frequency
[i
].days
));
637 g_signal_connect (item
, "activate", G_CALLBACK (trash_days_activate
), prefs
);
639 gtk_widget_show (item
);
640 gtk_menu_shell_append((GtkMenuShell
*)menu
, item
);
643 gtk_widget_show(menu
);
644 gtk_option_menu_set_menu((GtkOptionMenu
*)prefs
->empty_trash_days
, menu
);
645 gtk_option_menu_set_history((GtkOptionMenu
*)prefs
->empty_trash_days
, hist
);
647 locked
= !gconf_client_key_is_writable (prefs
->gconf
, "/apps/evolution/mail/trash/empty_on_exit_days", NULL
);
648 gtk_widget_set_sensitive ((GtkWidget
*) prefs
->empty_trash_days
, !locked
);
652 http_images_changed (GtkWidget
*widget
, EMMailerPrefs
*prefs
)
656 if (gtk_toggle_button_get_active (prefs
->images_always
))
657 when
= MAIL_CONFIG_HTTP_ALWAYS
;
658 else if (gtk_toggle_button_get_active (prefs
->images_sometimes
))
659 when
= MAIL_CONFIG_HTTP_SOMETIMES
;
661 when
= MAIL_CONFIG_HTTP_NEVER
;
663 gconf_client_set_int (prefs
->gconf
, "/apps/evolution/mail/display/load_http_images", when
, NULL
);
667 notify_type_changed (GtkWidget
*widget
, EMMailerPrefs
*prefs
)
671 if (gtk_toggle_button_get_active (prefs
->notify_not
))
672 type
= MAIL_CONFIG_NOTIFY_NOT
;
673 else if (gtk_toggle_button_get_active (prefs
->notify_beep
))
674 type
= MAIL_CONFIG_NOTIFY_BEEP
;
676 type
= MAIL_CONFIG_NOTIFY_PLAY_SOUND
;
678 if (type
== MAIL_CONFIG_NOTIFY_PLAY_SOUND
)
679 gtk_widget_set_sensitive ((GtkWidget
*) prefs
->notify_sound_file
, TRUE
);
681 gtk_widget_set_sensitive ((GtkWidget
*) prefs
->notify_sound_file
, FALSE
);
683 gconf_client_set_int (prefs
->gconf
, "/apps/evolution/mail/notify/type", type
, NULL
);
687 notify_sound_changed (GtkWidget
*widget
, EMMailerPrefs
*prefs
)
689 const char *filename
;
691 filename
= gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (prefs
->notify_sound_file
));
692 /* When we startup the file name will be NULL*/
693 gconf_client_set_string (prefs
->gconf
, "/apps/evolution/mail/notify/sound", filename
? filename
: "", NULL
);
697 emmp_widget_glade(EConfig
*ec
, EConfigItem
*item
, struct _GtkWidget
*parent
, struct _GtkWidget
*old
, void *data
)
699 EMMailerPrefs
*prefs
= data
;
701 return glade_xml_get_widget(prefs
->gui
, item
->label
);
704 /* plugin meta-data */
705 static EMConfigItem emmp_items
[] = {
706 { E_CONFIG_BOOK
, "", "preferences_toplevel", emmp_widget_glade
},
707 { E_CONFIG_PAGE
, "00.general", "vboxGeneral", emmp_widget_glade
},
708 { E_CONFIG_SECTION
, "00.general/00.fonts", "vboxMessageFonts", emmp_widget_glade
},
709 { E_CONFIG_SECTION
, "00.general/10.display", "vboxMessageDisplay", emmp_widget_glade
},
710 { E_CONFIG_SECTION
, "00.general/20.delete", "vboxDeletingMail", emmp_widget_glade
},
711 { E_CONFIG_SECTION
, "00.general/30.newmail", "vboxNewMailNotify", emmp_widget_glade
},
712 { E_CONFIG_PAGE
, "10.html", "vboxHtmlMail", emmp_widget_glade
},
713 { E_CONFIG_SECTION
, "10.html/00.general", "vbox173", emmp_widget_glade
},
714 { E_CONFIG_SECTION
, "10.html/10.images", "vbox190", emmp_widget_glade
},
715 { E_CONFIG_PAGE
, "20.labels", "frameColours", emmp_widget_glade
},
716 /* this is a table, so we can't use it { E_CONFIG_SECTION, "20.labels/00.labels", "tableColours", emmp_widget_glade }, */
717 { E_CONFIG_PAGE
, "30.headers", "vboxHeaderTab", emmp_widget_glade
},
718 /* no subvbox for section { E_CONFIG_PAGE, "30.headers/00.headers", "vbox199", emmp_widget_glade }, */
719 { E_CONFIG_PAGE
, "40.junk", "vbox161", emmp_widget_glade
},
720 /* no subvbox for section { E_CONFIG_SECTION, "40.junk/00.general", xxx, emmp_widget_glade } */
721 { E_CONFIG_SECTION
, "40.junk/10.options", "vbox204", emmp_widget_glade
},
725 emmp_free(EConfig
*ec
, GSList
*items
, void *data
)
727 /* the prefs data is freed automagically */
733 em_mailer_prefs_construct (EMMailerPrefs
*prefs
)
735 GSList
*list
, *header_config_list
, *header_add_list
, *p
;
736 GHashTable
*default_header_hash
;
738 GtkTreeSelection
*selection
;
739 GtkCellRenderer
*renderer
;
746 EMConfigTargetPrefs
*target
;
750 gladefile
= g_build_filename (EVOLUTION_GLADEDIR
,
753 gui
= glade_xml_new (gladefile
, "preferences_toplevel", NULL
);
758 /** @HookPoint-EMConfig: Mail Preferences Page
759 * @Id: org.gnome.evolution.mail.prefs
760 * @Type: E_CONFIG_BOOK
761 * @Class: org.gnome.evolution.mail.config:1.0
762 * @Target: EMConfigTargetPrefs
764 * The main mail preferences page.
766 ec
= em_config_new(E_CONFIG_BOOK
, "org.gnome.evolution.mail.prefs");
768 for (i
=0;i
<sizeof(emmp_items
)/sizeof(emmp_items
[0]);i
++)
769 l
= g_slist_prepend(l
, &emmp_items
[i
]);
770 e_config_add_items((EConfig
*)ec
, l
, NULL
, NULL
, emmp_free
, prefs
);
774 /* Message Display */
775 prefs
->timeout_toggle
= GTK_TOGGLE_BUTTON (glade_xml_get_widget (gui
, "chkMarkTimeout"));
776 toggle_button_init (prefs
, prefs
->timeout_toggle
, FALSE
,
777 "/apps/evolution/mail/display/mark_seen",
778 G_CALLBACK (toggle_button_toggled
));
780 prefs
->timeout
= GTK_SPIN_BUTTON (glade_xml_get_widget (gui
, "spinMarkTimeout"));
781 spin_button_init (prefs
, prefs
->timeout
,
782 "/apps/evolution/mail/display/mark_seen_timeout",
783 1000.0, G_CALLBACK (mark_seen_timeout_changed
));
785 prefs
->mlimit_toggle
= GTK_TOGGLE_BUTTON (glade_xml_get_widget (gui
, "mlimit_checkbutton"));
786 toggle_button_init (prefs
, prefs
->mlimit_toggle
, FALSE
,
787 "/apps/evolution/mail/display/force_message_limit",
788 G_CALLBACK (toggle_button_toggled
));
790 prefs
->mlimit_count
= GTK_SPIN_BUTTON (glade_xml_get_widget (gui
, "mlimit_spin"));
791 spin_button_init (prefs
, prefs
->mlimit_count
,
792 "/apps/evolution/mail/display/message_text_part_limit",
793 1, G_CALLBACK (mlimit_count_changed
));
795 prefs
->address_toggle
= GTK_TOGGLE_BUTTON (glade_xml_get_widget (gui
, "address_checkbox"));
796 toggle_button_init (prefs
, prefs
->address_toggle
, FALSE
,
797 "/apps/evolution/mail/display/address_compress",
798 G_CALLBACK (toggle_button_toggled
));
800 prefs
->address_count
= GTK_SPIN_BUTTON (glade_xml_get_widget (gui
, "address_spin"));
801 spin_button_init (prefs
, prefs
->address_count
,
802 "/apps/evolution/mail/display/address_count",
803 1, G_CALLBACK (address_compress_count_changed
));
805 prefs
->charset
= GTK_OPTION_MENU (glade_xml_get_widget (gui
, "omenuCharset"));
806 charset_menu_init (prefs
);
808 prefs
->citation_highlight
= GTK_TOGGLE_BUTTON (glade_xml_get_widget (gui
, "chkHighlightCitations"));
809 toggle_button_init (prefs
, prefs
->citation_highlight
, FALSE
,
810 "/apps/evolution/mail/display/mark_citations",
811 G_CALLBACK (toggle_button_toggled
));
813 prefs
->citation_color
= GNOME_COLOR_PICKER (glade_xml_get_widget (gui
, "colorpickerHighlightCitations"));
814 buf
= gconf_client_get_string (prefs
->gconf
, "/apps/evolution/mail/display/citation_colour", NULL
);
815 colorpicker_set_color (prefs
->citation_color
, buf
? buf
: "#737373");
816 g_signal_connect (prefs
->citation_color
, "color-set", G_CALLBACK (citation_color_set
), prefs
);
817 if (!gconf_client_key_is_writable (prefs
->gconf
, "/apps/evolution/mail/display/citation_colour", NULL
))
818 gtk_widget_set_sensitive ((GtkWidget
*) prefs
->citation_color
, FALSE
);
822 prefs
->empty_trash
= GTK_TOGGLE_BUTTON (glade_xml_get_widget (gui
, "chkEmptyTrashOnExit"));
823 prefs
->empty_trash_days
= GTK_OPTION_MENU (glade_xml_get_widget (gui
, "omenuEmptyTrashDays"));
824 emmp_empty_trash_init (prefs
);
826 prefs
->confirm_expunge
= GTK_TOGGLE_BUTTON (glade_xml_get_widget (gui
, "chkConfirmExpunge"));
827 toggle_button_init (prefs
, prefs
->confirm_expunge
, FALSE
,
828 "/apps/evolution/mail/prompts/expunge",
829 G_CALLBACK (toggle_button_toggled
));
831 /* New Mail Notification */
832 locked
= !gconf_client_key_is_writable (prefs
->gconf
, "/apps/evolution/mail/notify/type", NULL
);
834 val
= gconf_client_get_int (prefs
->gconf
, "/apps/evolution/mail/notify/type", NULL
);
835 prefs
->notify_not
= GTK_TOGGLE_BUTTON (glade_xml_get_widget (gui
, "radNotifyNot"));
836 gtk_toggle_button_set_active (prefs
->notify_not
, val
== MAIL_CONFIG_NOTIFY_NOT
);
837 g_signal_connect (prefs
->notify_not
, "toggled", G_CALLBACK (notify_type_changed
), prefs
);
839 gtk_widget_set_sensitive ((GtkWidget
*) prefs
->notify_not
, FALSE
);
841 prefs
->notify_beep
= GTK_TOGGLE_BUTTON (glade_xml_get_widget (gui
, "radNotifyBeep"));
842 prefs
->notify_sound_file
= GTK_FILE_CHOOSER_BUTTON (glade_xml_get_widget (gui
, "fileNotifyPlaySoundButton"));
843 gtk_toggle_button_set_active (prefs
->notify_beep
, val
== MAIL_CONFIG_NOTIFY_BEEP
);
844 g_signal_connect (prefs
->notify_beep
, "toggled", G_CALLBACK (notify_type_changed
), prefs
);
846 gtk_widget_set_sensitive ((GtkWidget
*) prefs
->notify_beep
, FALSE
);
848 prefs
->notify_play_sound
= GTK_TOGGLE_BUTTON (glade_xml_get_widget (gui
, "radNotifyPlaySound"));
849 gtk_toggle_button_set_active (prefs
->notify_play_sound
, val
== MAIL_CONFIG_NOTIFY_PLAY_SOUND
);
850 g_signal_connect (prefs
->notify_play_sound
, "toggled", G_CALLBACK (notify_type_changed
), prefs
);
852 gtk_widget_set_sensitive ((GtkWidget
*) prefs
->notify_play_sound
, FALSE
);
854 buf
= gconf_client_get_string (prefs
->gconf
, "/apps/evolution/mail/notify/sound", NULL
);
855 gtk_file_chooser_set_filename (GTK_FILE_CHOOSER_BUTTON (prefs
->notify_sound_file
), buf
? buf
: "");
856 g_signal_connect (GTK_FILE_CHOOSER_BUTTON (prefs
->notify_sound_file
), "selection-changed",
857 G_CALLBACK (notify_sound_changed
), prefs
);
858 if (val
!= MAIL_CONFIG_NOTIFY_PLAY_SOUND
)
859 gtk_widget_set_sensitive ((GtkWidget
*) prefs
->notify_sound_file
, FALSE
);
863 font
= gconf_client_get_string (prefs
->gconf
, "/apps/evolution/mail/display/fonts/monospace", NULL
);
864 prefs
->font_fixed
= GNOME_FONT_PICKER (glade_xml_get_widget (gui
, "FontFixed"));
865 gnome_font_picker_set_font_name (prefs
->font_fixed
, font
);
867 g_object_set_data ((GObject
*) prefs
->font_fixed
, "key", "/apps/evolution/mail/display/fonts/monospace");
868 g_signal_connect (prefs
->font_fixed
, "font-set", G_CALLBACK (font_changed
), prefs
);
869 if (!gconf_client_key_is_writable (prefs
->gconf
, "/apps/evolution/mail/display/fonts/monospace", NULL
))
870 gtk_widget_set_sensitive ((GtkWidget
*) prefs
->font_fixed
, FALSE
);
872 font
= gconf_client_get_string (prefs
->gconf
, "/apps/evolution/mail/display/fonts/variable", NULL
);
873 prefs
->font_variable
= GNOME_FONT_PICKER (glade_xml_get_widget (gui
, "FontVariable"));
874 gnome_font_picker_set_font_name (prefs
->font_variable
, font
);
876 g_object_set_data ((GObject
*) prefs
->font_variable
, "key", "/apps/evolution/mail/display/fonts/variable");
877 g_signal_connect (prefs
->font_variable
, "font-set", G_CALLBACK (font_changed
), prefs
);
878 if (!gconf_client_key_is_writable (prefs
->gconf
, "/apps/evolution/mail/display/fonts/variable", NULL
))
879 gtk_widget_set_sensitive ((GtkWidget
*) prefs
->font_variable
, FALSE
);
881 prefs
->font_share
= GTK_TOGGLE_BUTTON (glade_xml_get_widget (gui
, "radFontUseSame"));
882 toggle_button_init (prefs
, prefs
->font_share
, TRUE
,
883 "/apps/evolution/mail/display/fonts/use_custom",
884 G_CALLBACK (custom_font_changed
));
885 custom_font_changed (prefs
->font_share
, prefs
);
890 locked
= !gconf_client_key_is_writable (prefs
->gconf
, "/apps/evolution/mail/display/load_http_images", NULL
);
892 val
= gconf_client_get_int (prefs
->gconf
, "/apps/evolution/mail/display/load_http_images", NULL
);
893 prefs
->images_never
= GTK_TOGGLE_BUTTON (glade_xml_get_widget (gui
, "radImagesNever"));
894 gtk_toggle_button_set_active (prefs
->images_never
, val
== MAIL_CONFIG_HTTP_NEVER
);
895 g_signal_connect (prefs
->images_never
, "toggled", G_CALLBACK (http_images_changed
), prefs
);
897 gtk_widget_set_sensitive ((GtkWidget
*) prefs
->images_never
, FALSE
);
899 prefs
->images_sometimes
= GTK_TOGGLE_BUTTON (glade_xml_get_widget (gui
, "radImagesSometimes"));
900 gtk_toggle_button_set_active (prefs
->images_sometimes
, val
== MAIL_CONFIG_HTTP_SOMETIMES
);
901 g_signal_connect (prefs
->images_sometimes
, "toggled", G_CALLBACK (http_images_changed
), prefs
);
903 gtk_widget_set_sensitive ((GtkWidget
*) prefs
->images_sometimes
, FALSE
);
905 prefs
->images_always
= GTK_TOGGLE_BUTTON (glade_xml_get_widget (gui
, "radImagesAlways"));
906 gtk_toggle_button_set_active (prefs
->images_always
, val
== MAIL_CONFIG_HTTP_ALWAYS
);
907 g_signal_connect (prefs
->images_always
, "toggled", G_CALLBACK (http_images_changed
), prefs
);
909 gtk_widget_set_sensitive ((GtkWidget
*) prefs
->images_always
, FALSE
);
911 prefs
->show_animated
= GTK_TOGGLE_BUTTON (glade_xml_get_widget (gui
, "chkShowAnimatedImages"));
912 toggle_button_init (prefs
, prefs
->show_animated
, FALSE
,
913 "/apps/evolution/mail/display/animate_images",
914 G_CALLBACK (toggle_button_toggled
));
916 prefs
->prompt_unwanted_html
= GTK_TOGGLE_BUTTON (glade_xml_get_widget (gui
, "chkPromptWantHTML"));
917 toggle_button_init (prefs
, prefs
->prompt_unwanted_html
, FALSE
,
918 "/apps/evolution/mail/prompts/unwanted_html",
919 G_CALLBACK (toggle_button_toggled
));
922 locked
= !gconf_client_key_is_writable (prefs
->gconf
, "/apps/evolution/mail/labels", NULL
);
924 list
= mail_config_get_labels ();
925 while (list
!= NULL
&& i
< 5) {
926 MailConfigLabel
*label
;
930 widget_name
= g_strdup_printf ("txtLabel%d", i
);
931 prefs
->labels
[i
].name
= GTK_ENTRY (glade_xml_get_widget (gui
, widget_name
));
932 gtk_widget_set_sensitive ((GtkWidget
*) prefs
->labels
[i
].name
, !locked
);
933 g_free (widget_name
);
935 widget_name
= g_strdup_printf ("colorLabel%d", i
);
936 prefs
->labels
[i
].color
= GNOME_COLOR_PICKER (glade_xml_get_widget (gui
, widget_name
));
937 gtk_widget_set_sensitive ((GtkWidget
*) prefs
->labels
[i
].color
, !locked
);
938 g_free (widget_name
);
940 gtk_entry_set_text (prefs
->labels
[i
].name
, label
->name
);
941 g_signal_connect (prefs
->labels
[i
].name
, "changed", G_CALLBACK (label_entry_changed
), prefs
);
943 colorpicker_set_color (prefs
->labels
[i
].color
, label
->colour
);
944 g_signal_connect (prefs
->labels
[i
].color
, "color-set", G_CALLBACK (label_color_set
), prefs
);
946 atk_object_set_name(gtk_widget_get_accessible((GtkWidget
*)prefs
->labels
[i
].color
), label
->name
);
952 prefs
->restore_labels
= GTK_BUTTON (glade_xml_get_widget (gui
, "cmdRestoreLabels"));
953 gtk_widget_set_sensitive ((GtkWidget
*) prefs
->restore_labels
, !locked
);
954 g_signal_connect (prefs
->restore_labels
, "clicked", G_CALLBACK (restore_labels_clicked
), prefs
);
957 locked
= !gconf_client_key_is_writable (prefs
->gconf
, "/apps/evolution/mail/display/headers", NULL
);
959 /* always de-sensitised until the user types something in the entry */
960 prefs
->add_header
= GTK_BUTTON (glade_xml_get_widget (gui
, "cmdHeadersAdd"));
961 gtk_widget_set_sensitive ((GtkWidget
*) prefs
->add_header
, FALSE
);
963 /* always de-sensitised until the user selects a header in the list */
964 prefs
->remove_header
= GTK_BUTTON (glade_xml_get_widget (gui
, "cmdHeadersRemove"));
965 gtk_widget_set_sensitive ((GtkWidget
*) prefs
->remove_header
, FALSE
);
967 prefs
->entry_header
= GTK_ENTRY (glade_xml_get_widget (gui
, "txtHeaders"));
968 gtk_widget_set_sensitive ((GtkWidget
*) prefs
->entry_header
, !locked
);
970 prefs
->header_list
= GTK_TREE_VIEW (glade_xml_get_widget (gui
, "treeHeaders"));
971 gtk_widget_set_sensitive ((GtkWidget
*) prefs
->header_list
, !locked
);
973 selection
= gtk_tree_view_get_selection (prefs
->header_list
);
974 g_signal_connect (selection
, "changed", G_CALLBACK (emmp_header_list_row_selected
), prefs
);
975 g_signal_connect (prefs
->entry_header
, "changed", G_CALLBACK (emmp_header_entry_changed
), prefs
);
976 g_signal_connect (prefs
->entry_header
, "activate", G_CALLBACK (emmp_header_add_header
), prefs
);
977 /* initialise the tree with appropriate headings */
978 prefs
->header_list_store
= gtk_list_store_newv (HEADER_LIST_N_COLUMNS
, col_types
);
979 g_signal_connect (prefs
->add_header
, "clicked", G_CALLBACK (emmp_header_add_header
), prefs
);
980 g_signal_connect (prefs
->remove_header
, "clicked", G_CALLBACK (emmp_header_remove_header
), prefs
);
981 gtk_tree_view_set_model (prefs
->header_list
, GTK_TREE_MODEL (prefs
->header_list_store
));
983 renderer
= gtk_cell_renderer_toggle_new ();
984 g_object_set (renderer
, "activatable", TRUE
, NULL
);
985 g_signal_connect (renderer
, "toggled", G_CALLBACK (emmp_header_list_enabled_toggled
), prefs
);
986 gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (prefs
->header_list
), -1,
988 "active", HEADER_LIST_ENABLED_COLUMN
,
990 renderer
= gtk_cell_renderer_text_new ();
991 gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (prefs
->header_list
), -1,
993 "text", HEADER_LIST_NAME_COLUMN
,
996 /* populated the listview with entries; firstly we add all the default headers, and then
997 we add read header configuration out of gconf. If a header in gconf is a default header,
998 we update the enabled flag accordingly
1000 header_add_list
= NULL
;
1001 default_header_hash
= g_hash_table_new (g_str_hash
, g_str_equal
);
1002 for (i
= 0; i
< G_N_ELEMENTS (default_headers
); i
++) {
1003 struct _EMMailerPrefsHeader
*h
;
1005 h
= g_malloc (sizeof (struct _EMMailerPrefsHeader
));
1006 h
->is_default
= TRUE
;
1007 h
->name
= g_strdup (default_headers
[i
]);
1008 h
->enabled
= strcmp (default_headers
[i
], "x-evolution-mailer") != 0;
1009 g_hash_table_insert (default_header_hash
, (gpointer
) default_headers
[i
], h
);
1010 header_add_list
= g_slist_append (header_add_list
, h
);
1013 /* read stored headers from gconf */
1014 header_config_list
= gconf_client_get_list (prefs
->gconf
, "/apps/evolution/mail/display/headers", GCONF_VALUE_STRING
, NULL
);
1015 p
= header_config_list
;
1017 struct _EMMailerPrefsHeader
*h
, *def
;
1018 char *xml
= (char *) p
->data
;
1020 h
= em_mailer_prefs_header_from_xml (xml
);
1022 def
= g_hash_table_lookup (default_header_hash
, h
->name
);
1024 def
->enabled
= h
->enabled
;
1025 em_mailer_prefs_header_free (h
);
1027 h
->is_default
= FALSE
;
1028 header_add_list
= g_slist_append (header_add_list
, h
);
1035 g_hash_table_destroy (default_header_hash
);
1036 g_slist_foreach (header_config_list
, (GFunc
) g_free
, NULL
);
1037 g_slist_free (header_config_list
);
1039 p
= header_add_list
;
1041 struct _EMMailerPrefsHeader
*h
= (struct _EMMailerPrefsHeader
*) p
->data
;
1044 if (g_ascii_strcasecmp (h
->name
, EM_FORMAT_HEADER_XMAILER
) == 0)
1049 gtk_list_store_append (prefs
->header_list_store
, &iter
);
1050 gtk_list_store_set (prefs
->header_list_store
, &iter
,
1051 HEADER_LIST_NAME_COLUMN
, name
,
1052 HEADER_LIST_ENABLED_COLUMN
, h
->enabled
,
1053 HEADER_LIST_IS_DEFAULT_COLUMN
, h
->is_default
,
1054 HEADER_LIST_HEADER_COLUMN
, h
->name
,
1057 em_mailer_prefs_header_free (h
);
1061 g_slist_free (header_add_list
);
1064 prefs
->check_incoming
= GTK_TOGGLE_BUTTON (glade_xml_get_widget (gui
, "chkCheckIncomingMail"));
1065 toggle_button_init (prefs
, prefs
->check_incoming
, FALSE
,
1066 "/apps/evolution/mail/junk/check_incoming",
1067 G_CALLBACK (toggle_button_toggled
));
1069 prefs
->sa_local_tests_only
= GTK_TOGGLE_BUTTON (glade_xml_get_widget (gui
, "chkSALocalTestsOnly"));
1070 toggle_button_init (prefs
, prefs
->sa_local_tests_only
, TRUE
,
1071 "/apps/evolution/mail/junk/sa/local_only",
1072 G_CALLBACK (toggle_button_toggled_not
));
1074 /* get our toplevel widget */
1075 target
= em_config_target_new_prefs(ec
, prefs
->gconf
);
1076 e_config_set_target((EConfig
*)ec
, (EConfigTarget
*)target
);
1077 toplevel
= e_config_create_widget((EConfig
*)ec
);
1078 gtk_container_add (GTK_CONTAINER (prefs
), toplevel
);
1082 em_mailer_prefs_new (void)
1086 new = (EMMailerPrefs
*) g_object_new (em_mailer_prefs_get_type (), NULL
);
1087 em_mailer_prefs_construct (new);
1089 return (GtkWidget
*) new;
1093 static struct _EMMailerPrefsHeader
*
1094 emmp_header_from_xmldoc (xmlDocPtr doc
)
1096 struct _EMMailerPrefsHeader
*h
;
1103 root
= doc
->children
;
1104 if (strcmp (root
->name
, "header") != 0)
1107 name
= xmlGetProp (root
, "name");
1111 h
= g_malloc0 (sizeof (struct _EMMailerPrefsHeader
));
1112 h
->name
= g_strdup (name
);
1115 if (xmlHasProp (root
, "enabled"))
1124 * em_mailer_prefs_header_from_xml
1125 * @xml: XML configuration data
1127 * Parses passed XML data, which should be of
1128 * the format <header name="foo" enabled />, and
1129 * returns a EMMailerPrefs structure, or NULL if there
1132 struct _EMMailerPrefsHeader
*
1133 em_mailer_prefs_header_from_xml (const char *xml
)
1135 struct _EMMailerPrefsHeader
*header
;
1138 if (!(doc
= xmlParseDoc ((char *) xml
)))
1141 header
= emmp_header_from_xmldoc (doc
);
1148 * em_mailer_prefs_header_free
1149 * @header: header to free
1151 * Frees the memory associated with the passed header
1155 em_mailer_prefs_header_free (struct _EMMailerPrefsHeader
*header
)
1160 g_free (header
->name
);
1165 * em_mailer_prefs_header_to_xml
1166 * @header: header from which to generate XML
1168 * Returns the passed header as a XML structure,
1172 em_mailer_prefs_header_to_xml (struct _EMMailerPrefsHeader
*header
)
1180 g_return_val_if_fail (header
!= NULL
, NULL
);
1181 g_return_val_if_fail (header
->name
!= NULL
, NULL
);
1183 doc
= xmlNewDoc ("1.0");
1185 root
= xmlNewDocNode (doc
, NULL
, "header", NULL
);
1186 xmlSetProp (root
, "name", header
->name
);
1187 if (header
->enabled
)
1188 xmlSetProp (root
, "enabled", NULL
);
1190 xmlDocSetRootElement (doc
, root
);
1191 xmlDocDumpMemory (doc
, &xml
, &size
);
1194 out
= g_malloc (size
+ 1);
1195 memcpy (out
, xml
, size
);