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 <libgnomeui/gnome-file-entry.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 "mail-config.h"
58 #include "em-config.h"
60 static void em_mailer_prefs_class_init (EMMailerPrefsClass
*class);
61 static void em_mailer_prefs_init (EMMailerPrefs
*dialog
);
62 static void em_mailer_prefs_finalise (GObject
*obj
);
64 static GtkVBoxClass
*parent_class
= NULL
;
67 HEADER_LIST_NAME_COLUMN
, /* displayable name of the header (may be a translation) */
68 HEADER_LIST_ENABLED_COLUMN
, /* is the header enabled? */
69 HEADER_LIST_IS_DEFAULT_COLUMN
, /* is this header a default header, eg From: */
70 HEADER_LIST_HEADER_COLUMN
, /* the real name of this header */
71 HEADER_LIST_N_COLUMNS
,
74 static GType col_types
[] = {
81 /* temporarily copied from em-format.c */
82 static const char *default_headers
[] = {
91 "x-evolution-mailer", /* DO NOT translate */
94 #define EM_FORMAT_HEADER_XMAILER "x-evolution-mailer"
96 /* for empty trash on exit frequency */
100 } empty_trash_frequency
[] = {
101 { N_("Every time"), 0 },
102 { N_("Once per day"), 1 },
103 { N_("Once per week"), 7 },
104 { N_("Once per month"), 30 },
108 em_mailer_prefs_get_type (void)
110 static GType type
= 0;
113 GTypeInfo type_info
= {
114 sizeof (EMMailerPrefsClass
),
116 (GClassInitFunc
) em_mailer_prefs_class_init
,
118 sizeof (EMMailerPrefs
),
120 (GInstanceInitFunc
) em_mailer_prefs_init
,
123 type
= g_type_register_static (gtk_vbox_get_type (), "EMMailerPrefs", &type_info
, 0);
130 em_mailer_prefs_class_init (EMMailerPrefsClass
*klass
)
132 GObjectClass
*object_class
;
134 object_class
= (GObjectClass
*) klass
;
135 parent_class
= g_type_class_ref (gtk_vbox_get_type ());
137 object_class
->finalize
= em_mailer_prefs_finalise
;
141 em_mailer_prefs_init (EMMailerPrefs
*preferences
)
143 preferences
->gconf
= mail_config_get_gconf_client ();
147 em_mailer_prefs_finalise (GObject
*obj
)
149 EMMailerPrefs
*prefs
= (EMMailerPrefs
*) obj
;
151 g_object_unref (prefs
->gui
);
153 ((GObjectClass
*)(parent_class
))->finalize (obj
);
158 colorpicker_set_color (GnomeColorPicker
*color
, const char *str
)
163 gdk_color_parse (str
, &colour
);
164 rgb
= ((colour
.red
& 0xff00) << 8) | (colour
.green
& 0xff00) | ((colour
.blue
& 0xff00) >> 8);
166 gnome_color_picker_set_i8 (color
, (rgb
& 0xff0000) >> 16, (rgb
& 0xff00) >> 8, rgb
& 0xff, 0xff);
170 colorpicker_get_color (GnomeColorPicker
*color
)
175 gnome_color_picker_get_i8 (color
, &r
, &g
, &b
, &a
);
187 citation_color_set (GtkWidget
*widget
, guint r
, guint g
, guint b
, guint a
, EMMailerPrefs
*prefs
)
198 sprintf (buf
, "#%06x", rgb
& 0xffffff);
200 gconf_client_set_string (prefs
->gconf
, "/apps/evolution/mail/display/citation_colour", buf
, NULL
);
204 labels_changed (EMMailerPrefs
*prefs
)
206 GSList
*l
, *n
, *list
= NULL
;
212 for (i
= 4; i
>= 0; i
--) {
213 cstring
= gtk_entry_get_text (prefs
->labels
[i
].name
);
214 rgb
= colorpicker_get_color (prefs
->labels
[i
].color
);
215 string
= g_strdup_printf ("%s:#%06x", cstring
, rgb
& 0xffffff);
216 list
= g_slist_prepend (list
, string
);
219 gconf_client_set_list (prefs
->gconf
, "/apps/evolution/mail/labels", GCONF_VALUE_STRING
, list
, NULL
);
231 label_color_set (GtkWidget
*widget
, guint r
, guint g
, guint b
, guint a
, EMMailerPrefs
*prefs
)
233 labels_changed (prefs
);
237 label_entry_changed (GtkEntry
*entry
, EMMailerPrefs
*prefs
)
239 labels_changed (prefs
);
243 restore_labels_clicked (GtkWidget
*widget
, gpointer user_data
)
245 EMMailerPrefs
*prefs
= (EMMailerPrefs
*) user_data
;
248 for (i
= 0; i
< 5; i
++) {
249 gtk_entry_set_text (prefs
->labels
[i
].name
, _(label_defaults
[i
].name
));
250 colorpicker_set_color (prefs
->labels
[i
].color
, label_defaults
[i
].colour
);
251 atk_object_set_name(gtk_widget_get_accessible((GtkWidget
*)prefs
->labels
[i
].color
), _(label_defaults
[i
].name
));
256 emmp_header_remove_sensitivity (EMMailerPrefs
*prefs
)
259 GtkTreeSelection
*selection
= gtk_tree_view_get_selection (prefs
->header_list
);
262 /* remove button should be sensitive if the currenlty selected entry in the list view
263 is not a default header. if there are no entries, or none is selected, it should be
266 if (gtk_tree_selection_get_selected (selection
, NULL
, &iter
)) {
267 gtk_tree_model_get (GTK_TREE_MODEL (prefs
->header_list_store
), &iter
,
268 HEADER_LIST_IS_DEFAULT_COLUMN
, &is_default
,
271 gtk_widget_set_sensitive (GTK_WIDGET (prefs
->remove_header
), FALSE
);
273 gtk_widget_set_sensitive (GTK_WIDGET (prefs
->remove_header
), TRUE
);
275 gtk_widget_set_sensitive (GTK_WIDGET (prefs
->remove_header
), FALSE
);
280 emmp_header_is_valid (const char *header
)
282 const char *p
= header
;
288 if ((*p
== ':') || (*p
== ' '))
297 emmp_header_add_sensitivity (EMMailerPrefs
*prefs
)
299 const char *entry_contents
;
303 /* the add header button should be sensitive if the text box contains
304 a valid header string, that is not a duplicate with something already
307 entry_contents
= gtk_entry_get_text (GTK_ENTRY (prefs
->entry_header
));
308 if (!emmp_header_is_valid (entry_contents
)) {
309 gtk_widget_set_sensitive (GTK_WIDGET (prefs
->add_header
), FALSE
);
313 /* check if this is a duplicate */
314 valid
= gtk_tree_model_get_iter_first (GTK_TREE_MODEL (prefs
->header_list_store
), &iter
);
318 gtk_tree_model_get (GTK_TREE_MODEL (prefs
->header_list_store
), &iter
,
319 HEADER_LIST_HEADER_COLUMN
, &header_name
,
321 if (g_ascii_strcasecmp (header_name
, entry_contents
) == 0) {
322 gtk_widget_set_sensitive (GTK_WIDGET (prefs
->add_header
), FALSE
);
326 valid
= gtk_tree_model_iter_next (GTK_TREE_MODEL (prefs
->header_list_store
), &iter
);
329 gtk_widget_set_sensitive (GTK_WIDGET (prefs
->add_header
), TRUE
);
333 emmp_save_headers (EMMailerPrefs
*prefs
)
341 valid
= gtk_tree_model_get_iter_first (GTK_TREE_MODEL (prefs
->header_list_store
), &iter
);
343 struct _EMMailerPrefsHeader h
;
347 gtk_tree_model_get (GTK_TREE_MODEL (prefs
->header_list_store
), &iter
,
348 HEADER_LIST_HEADER_COLUMN
, &h
.name
,
349 HEADER_LIST_ENABLED_COLUMN
, &enabled
,
353 if ((xml
= em_mailer_prefs_header_to_xml (&h
)))
354 header_list
= g_slist_append (header_list
, xml
);
356 valid
= gtk_tree_model_iter_next (GTK_TREE_MODEL (prefs
->header_list_store
), &iter
);
359 gconf_client_set_list (prefs
->gconf
, "/apps/evolution/mail/display/headers", GCONF_VALUE_STRING
, header_list
, NULL
);
360 g_slist_foreach (header_list
, (GFunc
) g_free
, NULL
);
361 g_slist_free (header_list
);
365 emmp_header_list_enabled_toggled (GtkCellRendererToggle
*cell
, const char *path_string
, EMMailerPrefs
*prefs
)
367 GtkTreeModel
*model
= GTK_TREE_MODEL (prefs
->header_list_store
);
368 GtkTreePath
*path
= gtk_tree_path_new_from_string (path_string
);
372 gtk_tree_model_get_iter (model
, &iter
, path
);
373 gtk_tree_model_get (model
, &iter
, HEADER_LIST_ENABLED_COLUMN
, &enabled
, -1);
375 gtk_list_store_set (GTK_LIST_STORE (model
), &iter
, HEADER_LIST_ENABLED_COLUMN
,
377 gtk_tree_path_free (path
);
379 emmp_save_headers (prefs
);
383 emmp_header_add_header (GtkWidget
*widget
, EMMailerPrefs
*prefs
)
385 GtkTreeModel
*model
= GTK_TREE_MODEL (prefs
->header_list_store
);
388 gtk_list_store_append (GTK_LIST_STORE (model
), &iter
);
389 gtk_list_store_set (GTK_LIST_STORE (model
), &iter
,
390 HEADER_LIST_NAME_COLUMN
, gtk_entry_get_text (prefs
->entry_header
),
391 HEADER_LIST_ENABLED_COLUMN
, TRUE
,
392 HEADER_LIST_HEADER_COLUMN
, gtk_entry_get_text (prefs
->entry_header
),
393 HEADER_LIST_IS_DEFAULT_COLUMN
, FALSE
,
395 gtk_entry_set_text (prefs
->entry_header
, "");
396 emmp_header_remove_sensitivity (prefs
);
397 emmp_header_add_sensitivity (prefs
);
399 emmp_save_headers (prefs
);
403 emmp_header_remove_header (GtkWidget
*button
, gpointer user_data
)
405 EMMailerPrefs
*prefs
= (EMMailerPrefs
*) user_data
;
406 GtkTreeModel
*model
= GTK_TREE_MODEL (prefs
->header_list_store
);
407 GtkTreeSelection
*selection
= gtk_tree_view_get_selection (prefs
->header_list
);
410 if (!gtk_tree_selection_get_selected (selection
, NULL
, &iter
))
413 gtk_list_store_remove (GTK_LIST_STORE (model
), &iter
);
414 emmp_header_remove_sensitivity (prefs
);
416 emmp_save_headers (prefs
);
420 emmp_header_list_row_selected (GtkTreeSelection
*selection
, gpointer user_data
)
422 EMMailerPrefs
*prefs
= (EMMailerPrefs
*) user_data
;
424 emmp_header_remove_sensitivity (prefs
);
428 emmp_header_entry_changed (GtkWidget
*entry
, gpointer user_data
)
430 EMMailerPrefs
*prefs
= (EMMailerPrefs
*) user_data
;
432 emmp_header_add_sensitivity (prefs
);
436 mark_seen_timeout_changed (GtkSpinButton
*spin
, EMMailerPrefs
*prefs
)
440 timeout
= (int) (gtk_spin_button_get_value (prefs
->timeout
) * 1000.0);
441 gconf_client_set_int (prefs
->gconf
, "/apps/evolution/mail/display/mark_seen_timeout", timeout
, NULL
);
445 spin_button_init (EMMailerPrefs
*prefs
, GtkSpinButton
*spin
, const char *key
, float div
, GCallback value_changed
)
452 gtk_spin_button_get_range (spin
, &min
, &max
);
454 mkey
= g_alloca (strlen (key
) + 5);
455 p
= g_stpcpy (mkey
, key
);
458 /* see if the admin locked down the min value */
460 val
= gconf_client_get_int (prefs
->gconf
, mkey
, &err
);
462 g_clear_error (&err
);
464 min
= (1.0 * val
) / div
;
466 /* see if the admin locked down the max value */
468 val
= gconf_client_get_int (prefs
->gconf
, mkey
, &err
);
470 g_clear_error (&err
);
472 max
= (1.0 * val
) / div
;
474 gtk_spin_button_set_range (spin
, min
, max
);
477 val
= gconf_client_get_int (prefs
->gconf
, key
, NULL
);
478 gtk_spin_button_set_value (spin
, (1.0 * val
) / div
);
481 g_object_set_data ((GObject
*) spin
, "key", (void *) key
);
482 g_signal_connect (spin
, "value-changed", value_changed
, prefs
);
485 if (!gconf_client_key_is_writable (prefs
->gconf
, key
, NULL
))
486 gtk_widget_set_sensitive ((GtkWidget
*) spin
, FALSE
);
490 toggle_button_toggled (GtkToggleButton
*toggle
, EMMailerPrefs
*prefs
)
494 key
= g_object_get_data ((GObject
*) toggle
, "key");
495 gconf_client_set_bool (prefs
->gconf
, key
, gtk_toggle_button_get_active (toggle
), NULL
);
499 toggle_button_toggled_not (GtkToggleButton
*toggle
, EMMailerPrefs
*prefs
)
503 key
= g_object_get_data ((GObject
*) toggle
, "key");
504 gconf_client_set_bool (prefs
->gconf
, key
, !gtk_toggle_button_get_active (toggle
), NULL
);
508 custom_font_changed (GtkToggleButton
*toggle
, EMMailerPrefs
*prefs
)
512 use_custom
= !gtk_toggle_button_get_active (toggle
);
514 gtk_widget_set_sensitive (GTK_WIDGET (prefs
->font_fixed
), use_custom
);
515 gtk_widget_set_sensitive (GTK_WIDGET (prefs
->font_variable
), use_custom
);
517 gconf_client_set_bool (prefs
->gconf
, "/apps/evolution/mail/display/fonts/use_custom", use_custom
, NULL
);
521 font_changed (GnomeFontPicker
*fontpicker
, const char *arg1
, EMMailerPrefs
*prefs
)
525 key
= g_object_get_data ((GObject
*) fontpicker
, "key");
526 gconf_client_set_string (prefs
->gconf
, key
, gnome_font_picker_get_font_name (fontpicker
), NULL
);
530 toggle_button_init (EMMailerPrefs
*prefs
, GtkToggleButton
*toggle
, int not, const char *key
, GCallback toggled
)
534 bool = gconf_client_get_bool (prefs
->gconf
, key
, NULL
);
535 gtk_toggle_button_set_active (toggle
, not ? !bool : bool);
538 g_object_set_data ((GObject
*) toggle
, "key", (void *) key
);
539 g_signal_connect (toggle
, "toggled", toggled
, prefs
);
542 if (!gconf_client_key_is_writable (prefs
->gconf
, key
, NULL
))
543 gtk_widget_set_sensitive ((GtkWidget
*) toggle
, FALSE
);
547 charset_activate (GtkWidget
*item
, EMMailerPrefs
*prefs
)
552 menu
= gtk_option_menu_get_menu (prefs
->charset
);
553 if (!(string
= e_charset_picker_get_charset (menu
)))
554 string
= g_strdup (e_iconv_locale_charset ());
556 gconf_client_set_string (prefs
->gconf
, "/apps/evolution/mail/display/charset", string
, NULL
);
561 charset_menu_init (EMMailerPrefs
*prefs
)
563 GtkWidget
*menu
, *item
;
567 buf
= gconf_client_get_string (prefs
->gconf
, "/apps/evolution/mail/display/charset", NULL
);
568 menu
= e_charset_picker_new (buf
&& *buf
? buf
: e_iconv_locale_charset ());
569 gtk_option_menu_set_menu (prefs
->charset
, GTK_WIDGET (menu
));
572 items
= GTK_MENU_SHELL (menu
)->children
;
575 g_signal_connect (item
, "activate", G_CALLBACK (charset_activate
), prefs
);
579 if (!gconf_client_key_is_writable (prefs
->gconf
, "/apps/evolution/mail/display/charset", NULL
))
580 gtk_widget_set_sensitive ((GtkWidget
*) prefs
->charset
, FALSE
);
584 trash_days_activate (GtkWidget
*item
, EMMailerPrefs
*prefs
)
588 days
= GPOINTER_TO_INT (g_object_get_data ((GObject
*) item
, "days"));
589 gconf_client_set_int (prefs
->gconf
, "/apps/evolution/mail/trash/empty_on_exit_days", days
, NULL
);
593 emmp_empty_trash_init (EMMailerPrefs
*prefs
)
595 int locked
, days
, hist
= 0, i
;
596 GtkWidget
*menu
, *item
;
598 toggle_button_init (prefs
, prefs
->empty_trash
, FALSE
,
599 "/apps/evolution/mail/trash/empty_on_exit",
600 G_CALLBACK (toggle_button_toggled
));
602 days
= gconf_client_get_int(prefs
->gconf
, "/apps/evolution/mail/trash/empty_on_exit_days", NULL
);
603 menu
= gtk_menu_new();
604 for (i
= 0; i
< G_N_ELEMENTS (empty_trash_frequency
); i
++) {
605 if (days
>= empty_trash_frequency
[i
].days
)
608 item
= gtk_menu_item_new_with_label (_(empty_trash_frequency
[i
].label
));
609 g_object_set_data ((GObject
*) item
, "days", GINT_TO_POINTER (empty_trash_frequency
[i
].days
));
610 g_signal_connect (item
, "activate", G_CALLBACK (trash_days_activate
), prefs
);
612 gtk_widget_show (item
);
613 gtk_menu_shell_append((GtkMenuShell
*)menu
, item
);
616 gtk_widget_show(menu
);
617 gtk_option_menu_set_menu((GtkOptionMenu
*)prefs
->empty_trash_days
, menu
);
618 gtk_option_menu_set_history((GtkOptionMenu
*)prefs
->empty_trash_days
, hist
);
620 locked
= !gconf_client_key_is_writable (prefs
->gconf
, "/apps/evolution/mail/trash/empty_on_exit_days", NULL
);
621 gtk_widget_set_sensitive ((GtkWidget
*) prefs
->empty_trash_days
, !locked
);
625 http_images_changed (GtkWidget
*widget
, EMMailerPrefs
*prefs
)
629 if (gtk_toggle_button_get_active (prefs
->images_always
))
630 when
= MAIL_CONFIG_HTTP_ALWAYS
;
631 else if (gtk_toggle_button_get_active (prefs
->images_sometimes
))
632 when
= MAIL_CONFIG_HTTP_SOMETIMES
;
634 when
= MAIL_CONFIG_HTTP_NEVER
;
636 gconf_client_set_int (prefs
->gconf
, "/apps/evolution/mail/display/load_http_images", when
, NULL
);
640 notify_type_changed (GtkWidget
*widget
, EMMailerPrefs
*prefs
)
644 if (gtk_toggle_button_get_active (prefs
->notify_not
))
645 type
= MAIL_CONFIG_NOTIFY_NOT
;
646 else if (gtk_toggle_button_get_active (prefs
->notify_beep
))
647 type
= MAIL_CONFIG_NOTIFY_BEEP
;
649 type
= MAIL_CONFIG_NOTIFY_PLAY_SOUND
;
651 gconf_client_set_int (prefs
->gconf
, "/apps/evolution/mail/notify/type", type
, NULL
);
655 notify_sound_changed (GtkWidget
*widget
, EMMailerPrefs
*prefs
)
657 const char *filename
;
660 entry
= gnome_file_entry_gtk_entry (GNOME_FILE_ENTRY (prefs
->notify_sound_file
));
661 filename
= gtk_entry_get_text (GTK_ENTRY (entry
));
662 gconf_client_set_string (prefs
->gconf
, "/apps/evolution/mail/notify/sound", filename
, NULL
);
666 emmp_widget_glade(EConfig
*ec
, EConfigItem
*item
, struct _GtkWidget
*parent
, struct _GtkWidget
*old
, void *data
)
668 EMMailerPrefs
*prefs
= data
;
670 return glade_xml_get_widget(prefs
->gui
, item
->label
);
673 /* plugin meta-data */
674 static EMConfigItem emmp_items
[] = {
675 { E_CONFIG_BOOK
, "", "preferences_toplevel", emmp_widget_glade
},
676 { E_CONFIG_PAGE
, "00.general", "vboxGeneral", emmp_widget_glade
},
677 { E_CONFIG_SECTION
, "00.general/00.fonts", "vboxMessageFonts", emmp_widget_glade
},
678 { E_CONFIG_SECTION
, "00.general/10.display", "vboxMessageDisplay", emmp_widget_glade
},
679 { E_CONFIG_SECTION
, "00.general/20.delete", "vboxDeletingMail", emmp_widget_glade
},
680 { E_CONFIG_SECTION
, "00.general/30.newmail", "vboxNewMailNotify", emmp_widget_glade
},
681 { E_CONFIG_PAGE
, "10.html", "vboxHtmlMail", emmp_widget_glade
},
682 { E_CONFIG_SECTION
, "10.html/00.general", "vbox173", emmp_widget_glade
},
683 { E_CONFIG_SECTION
, "10.html/10.images", "vbox190", emmp_widget_glade
},
684 { E_CONFIG_PAGE
, "20.labels", "frameColours", emmp_widget_glade
},
685 /* this is a table, so we can't use it { E_CONFIG_SECTION, "20.labels/00.labels", "tableColours", emmp_widget_glade }, */
686 { E_CONFIG_PAGE
, "30.headers", "vboxHeaderTab", emmp_widget_glade
},
687 /* no subvbox for section { E_CONFIG_PAGE, "30.headers/00.headers", "vbox199", emmp_widget_glade }, */
688 { E_CONFIG_PAGE
, "40.junk", "vbox161", emmp_widget_glade
},
689 /* no subvbox for section { E_CONFIG_SECTION, "40.junk/00.general", xxx, emmp_widget_glade } */
690 { E_CONFIG_SECTION
, "40.junk/10.options", "vbox204", emmp_widget_glade
},
694 emmp_free(EConfig
*ec
, GSList
*items
, void *data
)
696 /* the prefs data is freed automagically */
702 em_mailer_prefs_construct (EMMailerPrefs
*prefs
)
704 GSList
*list
, *header_config_list
, *header_add_list
, *p
;
705 GHashTable
*default_header_hash
;
707 GtkTreeSelection
*selection
;
708 GtkCellRenderer
*renderer
;
715 EMConfigTargetPrefs
*target
;
718 gui
= glade_xml_new (EVOLUTION_GLADEDIR
"/mail-config.glade", "preferences_toplevel", NULL
);
721 /** @HookPoint-EMConfig: Mail Preferences Page
722 * @Id: org.gnome.evolution.mail.prefs
723 * @Type: E_CONFIG_BOOK
724 * @Class: org.gnome.evolution.mail.config:1.0
725 * @Target: EMConfigTargetPrefs
727 * The main mail preferences page.
729 ec
= em_config_new(E_CONFIG_BOOK
, "org.gnome.evolution.mail.prefs");
731 for (i
=0;i
<sizeof(emmp_items
)/sizeof(emmp_items
[0]);i
++)
732 l
= g_slist_prepend(l
, &emmp_items
[i
]);
733 e_config_add_items((EConfig
*)ec
, l
, NULL
, NULL
, emmp_free
, prefs
);
737 /* Message Display */
738 prefs
->timeout_toggle
= GTK_TOGGLE_BUTTON (glade_xml_get_widget (gui
, "chkMarkTimeout"));
739 toggle_button_init (prefs
, prefs
->timeout_toggle
, FALSE
,
740 "/apps/evolution/mail/display/mark_seen",
741 G_CALLBACK (toggle_button_toggled
));
743 prefs
->timeout
= GTK_SPIN_BUTTON (glade_xml_get_widget (gui
, "spinMarkTimeout"));
744 spin_button_init (prefs
, prefs
->timeout
,
745 "/apps/evolution/mail/display/mark_seen_timeout",
746 1000.0, G_CALLBACK (mark_seen_timeout_changed
));
748 prefs
->charset
= GTK_OPTION_MENU (glade_xml_get_widget (gui
, "omenuCharset"));
749 charset_menu_init (prefs
);
751 prefs
->citation_highlight
= GTK_TOGGLE_BUTTON (glade_xml_get_widget (gui
, "chkHighlightCitations"));
752 toggle_button_init (prefs
, prefs
->citation_highlight
, FALSE
,
753 "/apps/evolution/mail/display/mark_citations",
754 G_CALLBACK (toggle_button_toggled
));
756 prefs
->citation_color
= GNOME_COLOR_PICKER (glade_xml_get_widget (gui
, "colorpickerHighlightCitations"));
757 buf
= gconf_client_get_string (prefs
->gconf
, "/apps/evolution/mail/display/citation_colour", NULL
);
758 colorpicker_set_color (prefs
->citation_color
, buf
? buf
: "#737373");
759 g_signal_connect (prefs
->citation_color
, "color-set", G_CALLBACK (citation_color_set
), prefs
);
760 if (!gconf_client_key_is_writable (prefs
->gconf
, "/apps/evolution/mail/display/citation_colour", NULL
))
761 gtk_widget_set_sensitive ((GtkWidget
*) prefs
->citation_color
, FALSE
);
765 prefs
->empty_trash
= GTK_TOGGLE_BUTTON (glade_xml_get_widget (gui
, "chkEmptyTrashOnExit"));
766 prefs
->empty_trash_days
= GTK_OPTION_MENU (glade_xml_get_widget (gui
, "omenuEmptyTrashDays"));
767 emmp_empty_trash_init (prefs
);
769 prefs
->confirm_expunge
= GTK_TOGGLE_BUTTON (glade_xml_get_widget (gui
, "chkConfirmExpunge"));
770 toggle_button_init (prefs
, prefs
->confirm_expunge
, FALSE
,
771 "/apps/evolution/mail/prompts/expunge",
772 G_CALLBACK (toggle_button_toggled
));
774 /* New Mail Notification */
775 locked
= !gconf_client_key_is_writable (prefs
->gconf
, "/apps/evolution/mail/notify/type", NULL
);
777 val
= gconf_client_get_int (prefs
->gconf
, "/apps/evolution/mail/notify/type", NULL
);
778 prefs
->notify_not
= GTK_TOGGLE_BUTTON (glade_xml_get_widget (gui
, "radNotifyNot"));
779 gtk_toggle_button_set_active (prefs
->notify_not
, val
== MAIL_CONFIG_NOTIFY_NOT
);
780 g_signal_connect (prefs
->notify_not
, "toggled", G_CALLBACK (notify_type_changed
), prefs
);
782 gtk_widget_set_sensitive ((GtkWidget
*) prefs
->notify_not
, FALSE
);
784 prefs
->notify_beep
= GTK_TOGGLE_BUTTON (glade_xml_get_widget (gui
, "radNotifyBeep"));
785 gtk_toggle_button_set_active (prefs
->notify_beep
, val
== MAIL_CONFIG_NOTIFY_BEEP
);
786 g_signal_connect (prefs
->notify_beep
, "toggled", G_CALLBACK (notify_type_changed
), prefs
);
788 gtk_widget_set_sensitive ((GtkWidget
*) prefs
->notify_beep
, FALSE
);
790 prefs
->notify_play_sound
= GTK_TOGGLE_BUTTON (glade_xml_get_widget (gui
, "radNotifyPlaySound"));
791 gtk_toggle_button_set_active (prefs
->notify_play_sound
, val
== MAIL_CONFIG_NOTIFY_PLAY_SOUND
);
792 g_signal_connect (prefs
->notify_play_sound
, "toggled", G_CALLBACK (notify_type_changed
), prefs
);
794 gtk_widget_set_sensitive ((GtkWidget
*) prefs
->notify_play_sound
, FALSE
);
796 prefs
->notify_sound_file
= GNOME_FILE_ENTRY (glade_xml_get_widget (gui
, "fileNotifyPlaySound"));
797 buf
= gconf_client_get_string (prefs
->gconf
, "/apps/evolution/mail/notify/sound", NULL
);
798 gtk_entry_set_text (GTK_ENTRY (gnome_file_entry_gtk_entry (prefs
->notify_sound_file
)), buf
? buf
: "");
799 g_signal_connect (gnome_file_entry_gtk_entry (prefs
->notify_sound_file
), "changed",
800 G_CALLBACK (notify_sound_changed
), prefs
);
801 if (!gconf_client_key_is_writable (prefs
->gconf
, "/apps/evolution/mail/notify/sound", NULL
))
802 gtk_widget_set_sensitive ((GtkWidget
*) prefs
->notify_sound_file
, FALSE
);
806 font
= gconf_client_get_string (prefs
->gconf
, "/apps/evolution/mail/display/fonts/monospace", NULL
);
807 prefs
->font_fixed
= GNOME_FONT_PICKER (glade_xml_get_widget (gui
, "FontFixed"));
808 gnome_font_picker_set_font_name (prefs
->font_fixed
, font
);
809 g_object_set_data ((GObject
*) prefs
->font_fixed
, "key", "/apps/evolution/mail/display/fonts/monospace");
810 g_signal_connect (prefs
->font_fixed
, "font-set", G_CALLBACK (font_changed
), prefs
);
811 if (!gconf_client_key_is_writable (prefs
->gconf
, "/apps/evolution/mail/display/fonts/monospace", NULL
))
812 gtk_widget_set_sensitive ((GtkWidget
*) prefs
->font_fixed
, FALSE
);
814 font
= gconf_client_get_string (prefs
->gconf
, "/apps/evolution/mail/display/fonts/variable", NULL
);
815 prefs
->font_variable
= GNOME_FONT_PICKER (glade_xml_get_widget (gui
, "FontVariable"));
816 gnome_font_picker_set_font_name (prefs
->font_variable
, font
);
818 g_object_set_data ((GObject
*) prefs
->font_variable
, "key", "/apps/evolution/mail/display/fonts/variable");
819 g_signal_connect (prefs
->font_variable
, "font-set", G_CALLBACK (font_changed
), prefs
);
820 if (!gconf_client_key_is_writable (prefs
->gconf
, "/apps/evolution/mail/display/fonts/variable", NULL
))
821 gtk_widget_set_sensitive ((GtkWidget
*) prefs
->font_variable
, FALSE
);
823 prefs
->font_share
= GTK_TOGGLE_BUTTON (glade_xml_get_widget (gui
, "radFontUseSame"));
824 toggle_button_init (prefs
, prefs
->font_share
, TRUE
,
825 "/apps/evolution/mail/display/fonts/use_custom",
826 G_CALLBACK (custom_font_changed
));
827 custom_font_changed (prefs
->font_share
, prefs
);
832 locked
= !gconf_client_key_is_writable (prefs
->gconf
, "/apps/evolution/mail/display/load_http_images", NULL
);
834 val
= gconf_client_get_int (prefs
->gconf
, "/apps/evolution/mail/display/load_http_images", NULL
);
835 prefs
->images_never
= GTK_TOGGLE_BUTTON (glade_xml_get_widget (gui
, "radImagesNever"));
836 gtk_toggle_button_set_active (prefs
->images_never
, val
== MAIL_CONFIG_HTTP_NEVER
);
837 g_signal_connect (prefs
->images_never
, "toggled", G_CALLBACK (http_images_changed
), prefs
);
839 gtk_widget_set_sensitive ((GtkWidget
*) prefs
->images_never
, FALSE
);
841 prefs
->images_sometimes
= GTK_TOGGLE_BUTTON (glade_xml_get_widget (gui
, "radImagesSometimes"));
842 gtk_toggle_button_set_active (prefs
->images_sometimes
, val
== MAIL_CONFIG_HTTP_SOMETIMES
);
843 g_signal_connect (prefs
->images_sometimes
, "toggled", G_CALLBACK (http_images_changed
), prefs
);
845 gtk_widget_set_sensitive ((GtkWidget
*) prefs
->images_sometimes
, FALSE
);
847 prefs
->images_always
= GTK_TOGGLE_BUTTON (glade_xml_get_widget (gui
, "radImagesAlways"));
848 gtk_toggle_button_set_active (prefs
->images_always
, val
== MAIL_CONFIG_HTTP_ALWAYS
);
849 g_signal_connect (prefs
->images_always
, "toggled", G_CALLBACK (http_images_changed
), prefs
);
851 gtk_widget_set_sensitive ((GtkWidget
*) prefs
->images_always
, FALSE
);
853 prefs
->show_animated
= GTK_TOGGLE_BUTTON (glade_xml_get_widget (gui
, "chkShowAnimatedImages"));
854 toggle_button_init (prefs
, prefs
->show_animated
, FALSE
,
855 "/apps/evolution/mail/display/animate_images",
856 G_CALLBACK (toggle_button_toggled
));
858 prefs
->prompt_unwanted_html
= GTK_TOGGLE_BUTTON (glade_xml_get_widget (gui
, "chkPromptWantHTML"));
859 toggle_button_init (prefs
, prefs
->prompt_unwanted_html
, FALSE
,
860 "/apps/evolution/mail/prompts/unwanted_html",
861 G_CALLBACK (toggle_button_toggled
));
864 locked
= !gconf_client_key_is_writable (prefs
->gconf
, "/apps/evolution/mail/labels", NULL
);
866 list
= mail_config_get_labels ();
867 while (list
!= NULL
&& i
< 5) {
868 MailConfigLabel
*label
;
872 widget_name
= g_strdup_printf ("txtLabel%d", i
);
873 prefs
->labels
[i
].name
= GTK_ENTRY (glade_xml_get_widget (gui
, widget_name
));
874 gtk_widget_set_sensitive ((GtkWidget
*) prefs
->labels
[i
].name
, !locked
);
875 g_free (widget_name
);
877 widget_name
= g_strdup_printf ("colorLabel%d", i
);
878 prefs
->labels
[i
].color
= GNOME_COLOR_PICKER (glade_xml_get_widget (gui
, widget_name
));
879 gtk_widget_set_sensitive ((GtkWidget
*) prefs
->labels
[i
].color
, !locked
);
880 g_free (widget_name
);
882 gtk_entry_set_text (prefs
->labels
[i
].name
, label
->name
);
883 g_signal_connect (prefs
->labels
[i
].name
, "changed", G_CALLBACK (label_entry_changed
), prefs
);
885 colorpicker_set_color (prefs
->labels
[i
].color
, label
->colour
);
886 g_signal_connect (prefs
->labels
[i
].color
, "color-set", G_CALLBACK (label_color_set
), prefs
);
888 atk_object_set_name(gtk_widget_get_accessible((GtkWidget
*)prefs
->labels
[i
].color
), label
->name
);
894 prefs
->restore_labels
= GTK_BUTTON (glade_xml_get_widget (gui
, "cmdRestoreLabels"));
895 gtk_widget_set_sensitive ((GtkWidget
*) prefs
->restore_labels
, !locked
);
896 g_signal_connect (prefs
->restore_labels
, "clicked", G_CALLBACK (restore_labels_clicked
), prefs
);
899 locked
= !gconf_client_key_is_writable (prefs
->gconf
, "/apps/evolution/mail/display/headers", NULL
);
901 /* always de-sensitised until the user types something in the entry */
902 prefs
->add_header
= GTK_BUTTON (glade_xml_get_widget (gui
, "cmdHeadersAdd"));
903 gtk_widget_set_sensitive ((GtkWidget
*) prefs
->add_header
, FALSE
);
905 /* always de-sensitised until the user selects a header in the list */
906 prefs
->remove_header
= GTK_BUTTON (glade_xml_get_widget (gui
, "cmdHeadersRemove"));
907 gtk_widget_set_sensitive ((GtkWidget
*) prefs
->remove_header
, FALSE
);
909 prefs
->entry_header
= GTK_ENTRY (glade_xml_get_widget (gui
, "txtHeaders"));
910 gtk_widget_set_sensitive ((GtkWidget
*) prefs
->entry_header
, !locked
);
912 prefs
->header_list
= GTK_TREE_VIEW (glade_xml_get_widget (gui
, "treeHeaders"));
913 gtk_widget_set_sensitive ((GtkWidget
*) prefs
->header_list
, !locked
);
915 selection
= gtk_tree_view_get_selection (prefs
->header_list
);
916 g_signal_connect (selection
, "changed", G_CALLBACK (emmp_header_list_row_selected
), prefs
);
917 g_signal_connect (prefs
->entry_header
, "changed", G_CALLBACK (emmp_header_entry_changed
), prefs
);
918 g_signal_connect (prefs
->entry_header
, "activate", G_CALLBACK (emmp_header_add_header
), prefs
);
919 /* initialise the tree with appropriate headings */
920 prefs
->header_list_store
= gtk_list_store_newv (HEADER_LIST_N_COLUMNS
, col_types
);
921 g_signal_connect (prefs
->add_header
, "clicked", G_CALLBACK (emmp_header_add_header
), prefs
);
922 g_signal_connect (prefs
->remove_header
, "clicked", G_CALLBACK (emmp_header_remove_header
), prefs
);
923 gtk_tree_view_set_model (prefs
->header_list
, GTK_TREE_MODEL (prefs
->header_list_store
));
925 renderer
= gtk_cell_renderer_toggle_new ();
926 g_object_set (renderer
, "activatable", TRUE
, NULL
);
927 g_signal_connect (renderer
, "toggled", G_CALLBACK (emmp_header_list_enabled_toggled
), prefs
);
928 gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (prefs
->header_list
), -1,
930 "active", HEADER_LIST_ENABLED_COLUMN
,
932 renderer
= gtk_cell_renderer_text_new ();
933 gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (prefs
->header_list
), -1,
935 "text", HEADER_LIST_NAME_COLUMN
,
938 /* populated the listview with entries; firstly we add all the default headers, and then
939 we add read header configuration out of gconf. If a header in gconf is a default header,
940 we update the enabled flag accordingly
942 header_add_list
= NULL
;
943 default_header_hash
= g_hash_table_new (g_str_hash
, g_str_equal
);
944 for (i
= 0; i
< G_N_ELEMENTS (default_headers
); i
++) {
945 struct _EMMailerPrefsHeader
*h
;
947 h
= g_malloc (sizeof (struct _EMMailerPrefsHeader
));
948 h
->is_default
= TRUE
;
949 h
->name
= g_strdup (default_headers
[i
]);
950 h
->enabled
= strcmp (default_headers
[i
], "x-evolution-mailer") != 0;
951 g_hash_table_insert (default_header_hash
, (gpointer
) default_headers
[i
], h
);
952 header_add_list
= g_slist_append (header_add_list
, h
);
955 /* read stored headers from gconf */
956 header_config_list
= gconf_client_get_list (prefs
->gconf
, "/apps/evolution/mail/display/headers", GCONF_VALUE_STRING
, NULL
);
957 p
= header_config_list
;
959 struct _EMMailerPrefsHeader
*h
, *def
;
960 char *xml
= (char *) p
->data
;
962 h
= em_mailer_prefs_header_from_xml (xml
);
964 def
= g_hash_table_lookup (default_header_hash
, h
->name
);
966 def
->enabled
= h
->enabled
;
967 em_mailer_prefs_header_free (h
);
969 h
->is_default
= FALSE
;
970 header_add_list
= g_slist_append (header_add_list
, h
);
977 g_hash_table_destroy (default_header_hash
);
978 g_slist_foreach (header_config_list
, (GFunc
) g_free
, NULL
);
979 g_slist_free (header_config_list
);
983 struct _EMMailerPrefsHeader
*h
= (struct _EMMailerPrefsHeader
*) p
->data
;
986 if (g_ascii_strcasecmp (h
->name
, EM_FORMAT_HEADER_XMAILER
) == 0)
991 gtk_list_store_append (prefs
->header_list_store
, &iter
);
992 gtk_list_store_set (prefs
->header_list_store
, &iter
,
993 HEADER_LIST_NAME_COLUMN
, name
,
994 HEADER_LIST_ENABLED_COLUMN
, h
->enabled
,
995 HEADER_LIST_IS_DEFAULT_COLUMN
, h
->is_default
,
996 HEADER_LIST_HEADER_COLUMN
, h
->name
,
999 em_mailer_prefs_header_free (h
);
1003 g_slist_free (header_add_list
);
1006 prefs
->check_incoming
= GTK_TOGGLE_BUTTON (glade_xml_get_widget (gui
, "chkCheckIncomingMail"));
1007 toggle_button_init (prefs
, prefs
->check_incoming
, FALSE
,
1008 "/apps/evolution/mail/junk/check_incoming",
1009 G_CALLBACK (toggle_button_toggled
));
1011 prefs
->sa_local_tests_only
= GTK_TOGGLE_BUTTON (glade_xml_get_widget (gui
, "chkSALocalTestsOnly"));
1012 toggle_button_init (prefs
, prefs
->sa_local_tests_only
, TRUE
,
1013 "/apps/evolution/mail/junk/sa/local_only",
1014 G_CALLBACK (toggle_button_toggled_not
));
1016 /* get our toplevel widget */
1017 target
= em_config_target_new_prefs(ec
, prefs
->gconf
);
1018 e_config_set_target((EConfig
*)ec
, (EConfigTarget
*)target
);
1019 toplevel
= e_config_create_widget((EConfig
*)ec
);
1020 gtk_container_add (GTK_CONTAINER (prefs
), toplevel
);
1024 em_mailer_prefs_new (void)
1028 new = (EMMailerPrefs
*) g_object_new (em_mailer_prefs_get_type (), NULL
);
1029 em_mailer_prefs_construct (new);
1031 return (GtkWidget
*) new;
1035 static struct _EMMailerPrefsHeader
*
1036 emmp_header_from_xmldoc (xmlDocPtr doc
)
1038 struct _EMMailerPrefsHeader
*h
;
1045 root
= doc
->children
;
1046 if (strcmp (root
->name
, "header") != 0)
1049 name
= xmlGetProp (root
, "name");
1053 h
= g_malloc0 (sizeof (struct _EMMailerPrefsHeader
));
1054 h
->name
= g_strdup (name
);
1057 if (xmlHasProp (root
, "enabled"))
1066 * em_mailer_prefs_header_from_xml
1067 * @xml: XML configuration data
1069 * Parses passed XML data, which should be of
1070 * the format <header name="foo" enabled />, and
1071 * returns a EMMailerPrefs structure, or NULL if there
1074 struct _EMMailerPrefsHeader
*
1075 em_mailer_prefs_header_from_xml (const char *xml
)
1077 struct _EMMailerPrefsHeader
*header
;
1080 if (!(doc
= xmlParseDoc ((char *) xml
)))
1083 header
= emmp_header_from_xmldoc (doc
);
1090 * em_mailer_prefs_header_free
1091 * @header: header to free
1093 * Frees the memory associated with the passed header
1097 em_mailer_prefs_header_free (struct _EMMailerPrefsHeader
*header
)
1102 g_free (header
->name
);
1107 * em_mailer_prefs_header_to_xml
1108 * @header: header from which to generate XML
1110 * Returns the passed header as a XML structure,
1114 em_mailer_prefs_header_to_xml (struct _EMMailerPrefsHeader
*header
)
1122 g_return_val_if_fail (header
!= NULL
, NULL
);
1123 g_return_val_if_fail (header
->name
!= NULL
, NULL
);
1125 doc
= xmlNewDoc ("1.0");
1127 root
= xmlNewDocNode (doc
, NULL
, "header", NULL
);
1128 xmlSetProp (root
, "name", header
->name
);
1129 if (header
->enabled
)
1130 xmlSetProp (root
, "enabled", NULL
);
1132 xmlDocSetRootElement (doc
, root
);
1133 xmlDocDumpMemory (doc
, &xml
, &size
);
1136 out
= g_malloc (size
+ 1);
1137 memcpy (out
, xml
, size
);