aboutsummaryrefslogtreecommitdiffstats
path: root/mail/e-mail-config-defaults-page.c
diff options
context:
space:
mode:
authorMatthew Barnes <mbarnes@redhat.com>2011-04-13 22:30:40 +0800
committerMatthew Barnes <mbarnes@redhat.com>2012-06-03 11:00:40 +0800
commit3449e5fcc7f9c797fcde7f2a444b1eb7a934cd81 (patch)
treeff59febf4ac0c6316ef344ea25cee002088bd314 /mail/e-mail-config-defaults-page.c
parentf78795f4dff8b225d78385c5e23e1cd44ee946ad (diff)
downloadgsoc2013-evolution-3449e5fcc7f9c797fcde7f2a444b1eb7a934cd81.tar
gsoc2013-evolution-3449e5fcc7f9c797fcde7f2a444b1eb7a934cd81.tar.gz
gsoc2013-evolution-3449e5fcc7f9c797fcde7f2a444b1eb7a934cd81.tar.bz2
gsoc2013-evolution-3449e5fcc7f9c797fcde7f2a444b1eb7a934cd81.tar.lz
gsoc2013-evolution-3449e5fcc7f9c797fcde7f2a444b1eb7a934cd81.tar.xz
gsoc2013-evolution-3449e5fcc7f9c797fcde7f2a444b1eb7a934cd81.tar.zst
gsoc2013-evolution-3449e5fcc7f9c797fcde7f2a444b1eb7a934cd81.zip
Adapt mail to the new ESource API.
Diffstat (limited to 'mail/e-mail-config-defaults-page.c')
-rw-r--r--mail/e-mail-config-defaults-page.c868
1 files changed, 868 insertions, 0 deletions
diff --git a/mail/e-mail-config-defaults-page.c b/mail/e-mail-config-defaults-page.c
new file mode 100644
index 0000000000..d815f0560c
--- /dev/null
+++ b/mail/e-mail-config-defaults-page.c
@@ -0,0 +1,868 @@
+/*
+ * e-mail-config-defaults-page.c
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) version 3.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with the program; if not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+#include "e-mail-config-defaults-page.h"
+
+#include <config.h>
+#include <glib/gi18n-lib.h>
+
+#include <libebackend/e-extensible.h>
+#include <libedataserver/e-source-camel.h>
+#include <libedataserver/e-source-enumtypes.h>
+#include <libedataserver/e-source-mail-account.h>
+#include <libedataserver/e-source-mail-composition.h>
+#include <libedataserver/e-source-mail-submission.h>
+#include <libedataserver/e-source-mdn.h>
+#include <libedataserver/e-data-server-util.h>
+
+#include <libemail-engine/e-mail-folder-utils.h>
+
+#include <mail/e-mail-config-page.h>
+#include <mail/em-folder-selection-button.h>
+
+#define E_MAIL_CONFIG_DEFAULTS_PAGE_GET_PRIVATE(obj) \
+ (G_TYPE_INSTANCE_GET_PRIVATE \
+ ((obj), E_TYPE_MAIL_CONFIG_DEFAULTS_PAGE, EMailConfigDefaultsPagePrivate))
+
+struct _EMailConfigDefaultsPagePrivate {
+ EMailSession *session;
+ ESource *account_source;
+ ESource *identity_source;
+
+ GtkWidget *drafts_button; /* not referenced */
+ GtkWidget *sent_button; /* not referenced */
+ GtkWidget *trash_toggle; /* not referenced */
+ GtkWidget *junk_toggle; /* not referenced */
+};
+
+enum {
+ PROP_0,
+ PROP_ACCOUNT_SOURCE,
+ PROP_IDENTITY_SOURCE,
+ PROP_SESSION
+};
+
+/* Forward Declarations */
+static void e_mail_config_defaults_page_interface_init
+ (EMailConfigPageInterface *interface);
+
+G_DEFINE_TYPE_WITH_CODE (
+ EMailConfigDefaultsPage,
+ e_mail_config_defaults_page,
+ GTK_TYPE_BOX,
+ G_IMPLEMENT_INTERFACE (
+ E_TYPE_EXTENSIBLE, NULL)
+ G_IMPLEMENT_INTERFACE (
+ E_TYPE_MAIL_CONFIG_PAGE,
+ e_mail_config_defaults_page_interface_init))
+
+static CamelSettings *
+mail_config_defaults_page_maybe_get_settings (EMailConfigDefaultsPage *page)
+{
+ ESource *source;
+ ESourceCamel *camel_ext;
+ ESourceBackend *backend_ext;
+ const gchar *backend_name;
+ const gchar *extension_name;
+
+ source = e_mail_config_defaults_page_get_account_source (page);
+
+ extension_name = E_SOURCE_EXTENSION_MAIL_ACCOUNT;
+ backend_ext = e_source_get_extension (source, extension_name);
+ backend_name = e_source_backend_get_backend_name (backend_ext);
+ extension_name = e_source_camel_get_extension_name (backend_name);
+
+ /* Avoid accidentally creating a backend-specific extension
+ * in the mail account source if the mail account source is
+ * part of a collection, in which case the backend-specific
+ * extension is kept in the top-level collection source. */
+ if (!e_source_has_extension (source, extension_name))
+ return NULL;
+
+ camel_ext = e_source_get_extension (source, extension_name);
+
+ return e_source_camel_get_settings (camel_ext);
+}
+
+static CamelStore *
+mail_config_defaults_page_get_store (EMailConfigDefaultsPage *page)
+{
+ ESource *source;
+ EMailSession *session;
+ CamelService *service;
+ const gchar *uid;
+
+ session = e_mail_config_defaults_page_get_session (page);
+ source = e_mail_config_defaults_page_get_account_source (page);
+
+ uid = e_source_get_uid (source);
+ service = camel_session_get_service (CAMEL_SESSION (session), uid);
+
+ return CAMEL_IS_STORE (service) ? CAMEL_STORE (service) : NULL;
+}
+
+static gboolean
+mail_config_defaults_page_addrs_to_string (GBinding *binding,
+ const GValue *source_value,
+ GValue *target_value,
+ gpointer unused)
+{
+ gchar **strv;
+
+ strv = g_value_dup_boxed (source_value);
+
+ if (strv != NULL) {
+ gchar *string = g_strjoinv ("; ", strv);
+ g_value_set_string (target_value, string);
+ g_free (string);
+ } else {
+ g_value_set_string (target_value, "");
+ }
+
+ g_strfreev (strv);
+
+ return TRUE;
+}
+
+static gboolean
+mail_config_defaults_page_string_to_addrs (GBinding *binding,
+ const GValue *source_value,
+ GValue *target_value,
+ gpointer unused)
+{
+ CamelInternetAddress *address;
+ const gchar *string;
+ gchar **strv;
+ gint n_addresses, ii;
+
+ string = g_value_get_string (source_value);
+
+ address = camel_internet_address_new ();
+ n_addresses = camel_address_decode (CAMEL_ADDRESS (address), string);
+
+ if (n_addresses < 0) {
+ g_object_unref (address);
+ return FALSE;
+
+ } else if (n_addresses == 0) {
+ g_value_set_boxed (target_value, NULL);
+ g_object_unref (address);
+ return TRUE;
+ }
+
+ strv = g_new0 (gchar *, n_addresses + 1);
+
+ for (ii = 0; ii < n_addresses; ii++) {
+ const gchar *name = NULL;
+ const gchar *addr = NULL;
+
+ camel_internet_address_get (address, ii, &name, &addr);
+ strv[ii] = camel_internet_address_format_address (name, addr);
+ }
+
+ g_value_take_boxed (target_value, strv);
+
+ return TRUE;
+}
+
+static gboolean
+mail_config_defaults_page_folder_name_to_uri (GBinding *binding,
+ const GValue *source_value,
+ GValue *target_value,
+ gpointer data)
+{
+ EMailConfigDefaultsPage *page;
+ CamelStore *store;
+ const gchar *folder_name;
+ gchar *folder_uri = NULL;
+
+ page = E_MAIL_CONFIG_DEFAULTS_PAGE (data);
+ store = mail_config_defaults_page_get_store (page);
+ g_return_val_if_fail (CAMEL_IS_STORE (store), FALSE);
+
+ folder_name = g_value_get_string (source_value);
+
+ if (folder_name != NULL)
+ folder_uri = e_mail_folder_uri_build (store, folder_name);
+
+ g_value_set_string (target_value, folder_uri);
+
+ g_free (folder_uri);
+
+ return TRUE;
+}
+
+static gboolean
+mail_config_defaults_page_folder_uri_to_name (GBinding *binding,
+ const GValue *source_value,
+ GValue *target_value,
+ gpointer data)
+{
+ EMailConfigDefaultsPage *page;
+ EMailSession *session;
+ const gchar *folder_uri;
+ gchar *folder_name = NULL;
+ GError *error = NULL;
+
+ page = E_MAIL_CONFIG_DEFAULTS_PAGE (data);
+ session = e_mail_config_defaults_page_get_session (page);
+
+ folder_uri = g_value_get_string (source_value);
+
+ if (folder_uri == NULL) {
+ g_value_set_string (target_value, NULL);
+ return TRUE;
+ }
+
+ e_mail_folder_uri_parse (
+ CAMEL_SESSION (session), folder_uri,
+ NULL, &folder_name, &error);
+
+ if (error != NULL) {
+ g_warn_if_fail (folder_name == NULL);
+ g_warning ("%s: %s", G_STRFUNC, error->message);
+ g_error_free (error);
+ return FALSE;
+ }
+
+ g_return_val_if_fail (folder_name != NULL, FALSE);
+
+ g_value_set_string (target_value, folder_name);
+
+ g_free (folder_name);
+
+ return TRUE;
+}
+
+static void
+mail_config_defaults_page_restore_folders (EMailConfigDefaultsPage *page)
+{
+ EMFolderSelectionButton *button;
+ EMailSession *session;
+ EMailLocalFolder type;
+ const gchar *folder_uri;
+
+ session = e_mail_config_defaults_page_get_session (page);
+
+ type = E_MAIL_LOCAL_FOLDER_DRAFTS;
+ button = EM_FOLDER_SELECTION_BUTTON (page->priv->drafts_button);
+ folder_uri = e_mail_session_get_local_folder_uri (session, type);
+ em_folder_selection_button_set_folder_uri (button, folder_uri);
+
+ type = E_MAIL_LOCAL_FOLDER_SENT;
+ button = EM_FOLDER_SELECTION_BUTTON (page->priv->sent_button);
+ folder_uri = e_mail_session_get_local_folder_uri (session, type);
+ em_folder_selection_button_set_folder_uri (button, folder_uri);
+}
+
+static void
+mail_config_defaults_page_restore_real_folder (GtkToggleButton *toggle_button)
+{
+ gtk_toggle_button_set_active (toggle_button, FALSE);
+}
+
+static GtkWidget *
+mail_config_defaults_page_add_real_folder (EMailConfigDefaultsPage *page,
+ GtkSizeGroup *size_group,
+ GtkButton *revert_button,
+ const gchar *toggle_label,
+ const gchar *dialog_caption,
+ const gchar *property_name,
+ const gchar *use_property_name)
+{
+ GtkWidget *box;
+ GtkWidget *check_button;
+ GtkWidget *folder_button;
+ EMailSession *session;
+ CamelSettings *settings;
+ CamelStore *store;
+ GObjectClass *class;
+
+ store = mail_config_defaults_page_get_store (page);
+ g_return_val_if_fail (CAMEL_IS_STORE (store), NULL);
+
+ session = e_mail_config_defaults_page_get_session (page);
+ settings = mail_config_defaults_page_maybe_get_settings (page);
+
+ if (settings == NULL)
+ return NULL;
+
+ /* These folder settings are backend-specific, so check if
+ * the CamelSettings class has the property names we need. */
+
+ class = G_OBJECT_GET_CLASS (settings);
+
+ if (g_object_class_find_property (class, property_name) == NULL)
+ return NULL;
+
+ if (g_object_class_find_property (class, use_property_name) == NULL)
+ return NULL;
+
+ /* We're good to go. */
+
+ box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
+
+ check_button = gtk_check_button_new_with_mnemonic (toggle_label);
+ g_object_set (check_button, "xalign", 1.0, NULL);
+ gtk_size_group_add_widget (size_group, check_button);
+ gtk_box_pack_start (GTK_BOX (box), check_button, FALSE, FALSE, 0);
+ gtk_widget_show (check_button);
+
+ g_object_bind_property (
+ settings, use_property_name,
+ check_button, "active",
+ G_BINDING_BIDIRECTIONAL |
+ G_BINDING_SYNC_CREATE);
+
+ folder_button = em_folder_selection_button_new (
+ session, "", dialog_caption);
+ em_folder_selection_button_set_store (
+ EM_FOLDER_SELECTION_BUTTON (folder_button), store);
+ gtk_box_pack_start (GTK_BOX (box), folder_button, TRUE, TRUE, 0);
+ gtk_widget_show (folder_button);
+
+ /* XXX CamelSettings only stores the folder's path name, but the
+ * EMFolderSelectionButton requires a full folder URI, so we
+ * have to do some fancy transforms for the binding to work. */
+ g_object_bind_property_full (
+ settings, property_name,
+ folder_button, "folder-uri",
+ G_BINDING_BIDIRECTIONAL |
+ G_BINDING_SYNC_CREATE,
+ mail_config_defaults_page_folder_name_to_uri,
+ mail_config_defaults_page_folder_uri_to_name,
+ g_object_ref (page),
+ (GDestroyNotify) g_object_unref);
+
+ g_object_bind_property (
+ check_button, "active",
+ folder_button, "sensitive",
+ G_BINDING_SYNC_CREATE);
+
+ g_signal_connect_swapped (
+ revert_button, "clicked",
+ G_CALLBACK (mail_config_defaults_page_restore_real_folder),
+ check_button);
+
+ return box;
+}
+
+static void
+mail_config_defaults_page_set_account_source (EMailConfigDefaultsPage *page,
+ ESource *account_source)
+{
+ g_return_if_fail (E_IS_SOURCE (account_source));
+ g_return_if_fail (page->priv->account_source == NULL);
+
+ page->priv->account_source = g_object_ref (account_source);
+}
+
+static void
+mail_config_defaults_page_set_identity_source (EMailConfigDefaultsPage *page,
+ ESource *identity_source)
+{
+ g_return_if_fail (E_IS_SOURCE (identity_source));
+ g_return_if_fail (page->priv->identity_source == NULL);
+
+ page->priv->identity_source = g_object_ref (identity_source);
+}
+
+static void
+mail_config_defaults_page_set_session (EMailConfigDefaultsPage *page,
+ EMailSession *session)
+{
+ g_return_if_fail (E_IS_MAIL_SESSION (session));
+ g_return_if_fail (page->priv->session == NULL);
+
+ page->priv->session = g_object_ref (session);
+}
+
+static void
+mail_config_defaults_page_set_property (GObject *object,
+ guint property_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ switch (property_id) {
+ case PROP_ACCOUNT_SOURCE:
+ mail_config_defaults_page_set_account_source (
+ E_MAIL_CONFIG_DEFAULTS_PAGE (object),
+ g_value_get_object (value));
+ return;
+
+ case PROP_IDENTITY_SOURCE:
+ mail_config_defaults_page_set_identity_source (
+ E_MAIL_CONFIG_DEFAULTS_PAGE (object),
+ g_value_get_object (value));
+ return;
+
+ case PROP_SESSION:
+ mail_config_defaults_page_set_session (
+ E_MAIL_CONFIG_DEFAULTS_PAGE (object),
+ g_value_get_object (value));
+ return;
+ }
+
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+}
+
+static void
+mail_config_defaults_page_get_property (GObject *object,
+ guint property_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ switch (property_id) {
+ case PROP_ACCOUNT_SOURCE:
+ g_value_set_object (
+ value,
+ e_mail_config_defaults_page_get_account_source (
+ E_MAIL_CONFIG_DEFAULTS_PAGE (object)));
+ return;
+
+ case PROP_IDENTITY_SOURCE:
+ g_value_set_object (
+ value,
+ e_mail_config_defaults_page_get_identity_source (
+ E_MAIL_CONFIG_DEFAULTS_PAGE (object)));
+ return;
+
+ case PROP_SESSION:
+ g_value_set_object (
+ value,
+ e_mail_config_defaults_page_get_session (
+ E_MAIL_CONFIG_DEFAULTS_PAGE (object)));
+ return;
+ }
+
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+}
+
+static void
+mail_config_defaults_page_dispose (GObject *object)
+{
+ EMailConfigDefaultsPagePrivate *priv;
+
+ priv = E_MAIL_CONFIG_DEFAULTS_PAGE_GET_PRIVATE (object);
+
+ if (priv->identity_source != NULL) {
+ g_object_unref (priv->identity_source);
+ priv->identity_source = NULL;
+ }
+
+ if (priv->session != NULL) {
+ g_object_unref (priv->session);
+ priv->session = NULL;
+ }
+
+ /* Chain up to parent's dispose() method. */
+ G_OBJECT_CLASS (e_mail_config_defaults_page_parent_class)->
+ dispose (object);
+}
+
+static void
+mail_config_defaults_page_constructed (GObject *object)
+{
+ EMailConfigDefaultsPage *page;
+ EMailSession *session;
+ ESource *source;
+ ESourceMailComposition *composition_ext;
+ ESourceMailSubmission *submission_ext;
+ ESourceMDN *mdn_ext;
+ GtkLabel *label;
+ GtkButton *button;
+ GtkWidget *widget;
+ GtkWidget *container;
+ GtkSizeGroup *size_group;
+ GEnumClass *enum_class;
+ GEnumValue *enum_value;
+ EMdnResponsePolicy policy;
+ const gchar *extension_name;
+ const gchar *text;
+ gchar *markup;
+
+ page = E_MAIL_CONFIG_DEFAULTS_PAGE (object);
+
+ /* Chain up to parent's constructed() method. */
+ G_OBJECT_CLASS (e_mail_config_defaults_page_parent_class)->
+ constructed (object);
+
+ session = e_mail_config_defaults_page_get_session (page);
+ source = e_mail_config_defaults_page_get_identity_source (page);
+
+ extension_name = E_SOURCE_EXTENSION_MAIL_COMPOSITION;
+ composition_ext = e_source_get_extension (source, extension_name);
+
+ extension_name = E_SOURCE_EXTENSION_MAIL_SUBMISSION;
+ submission_ext = e_source_get_extension (source, extension_name);
+
+ extension_name = E_SOURCE_EXTENSION_MDN;
+ mdn_ext = e_source_get_extension (source, extension_name);
+
+ gtk_orientable_set_orientation (
+ GTK_ORIENTABLE (page), GTK_ORIENTATION_VERTICAL);
+
+ gtk_box_set_spacing (GTK_BOX (page), 12);
+
+ size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
+
+ /*** Special Folders ***/
+
+ widget = gtk_grid_new ();
+ gtk_grid_set_row_spacing (GTK_GRID (widget), 6);
+ gtk_grid_set_column_spacing (GTK_GRID (widget), 6);
+ gtk_box_pack_start (GTK_BOX (page), widget, FALSE, FALSE, 0);
+ gtk_widget_show (widget);
+
+ container = widget;
+
+ text = _("Special Folders");
+ markup = g_markup_printf_escaped ("<b>%s</b>", text);
+ widget = gtk_label_new (markup);
+ gtk_label_set_use_markup (GTK_LABEL (widget), TRUE);
+ gtk_misc_set_alignment (GTK_MISC (widget), 0.0, 0.5);
+ gtk_grid_attach (GTK_GRID (container), widget, 0, 0, 2, 1);
+ gtk_widget_show (widget);
+ g_free (markup);
+
+ text = _("Draft Messages _Folder:");
+ widget = gtk_label_new_with_mnemonic (text);
+ gtk_widget_set_margin_left (widget, 12);
+ gtk_size_group_add_widget (size_group, widget);
+ gtk_misc_set_alignment (GTK_MISC (widget), 1.0, 0.5);
+ gtk_grid_attach (GTK_GRID (container), widget, 0, 1, 1, 1);
+ gtk_widget_show (widget);
+
+ label = GTK_LABEL (widget);
+
+ text = _("Choose a folder for saving draft messages.");
+ widget = em_folder_selection_button_new (session, "", text);
+ gtk_widget_set_hexpand (widget, TRUE);
+ gtk_label_set_mnemonic_widget (label, widget);
+ gtk_grid_attach (GTK_GRID (container), widget, 1, 1, 1, 1);
+ page->priv->drafts_button = widget; /* not referenced */
+ gtk_widget_show (widget);
+
+ g_object_bind_property (
+ composition_ext, "drafts-folder",
+ widget, "folder-uri",
+ G_BINDING_BIDIRECTIONAL |
+ G_BINDING_SYNC_CREATE);
+
+ text = _("Sent _Messages Folder:");
+ widget = gtk_label_new_with_mnemonic (text);
+ gtk_widget_set_margin_left (widget, 12);
+ gtk_size_group_add_widget (size_group, widget);
+ gtk_misc_set_alignment (GTK_MISC (widget), 1.0, 0.5);
+ gtk_grid_attach (GTK_GRID (container), widget, 0, 2, 1, 1);
+ gtk_widget_show (widget);
+
+ label = GTK_LABEL (widget);
+
+ text = _("Choose a folder for saving sent messages.");
+ widget = em_folder_selection_button_new (session, "", text);
+ gtk_widget_set_hexpand (widget, TRUE);
+ gtk_label_set_mnemonic_widget (label, widget);
+ gtk_grid_attach (GTK_GRID (container), widget, 1, 2, 1, 1);
+ page->priv->sent_button = widget; /* not referenced */
+ gtk_widget_show (widget);
+
+ g_object_bind_property (
+ submission_ext, "sent-folder",
+ widget, "folder-uri",
+ G_BINDING_BIDIRECTIONAL |
+ G_BINDING_SYNC_CREATE);
+
+ widget = gtk_button_new_with_mnemonic (_("_Restore Defaults"));
+ gtk_widget_set_halign (widget, GTK_ALIGN_START);
+ gtk_grid_attach (GTK_GRID (container), widget, 1, 5, 1, 1);
+ gtk_widget_show (widget);
+
+ g_signal_connect_swapped (
+ widget, "clicked",
+ G_CALLBACK (mail_config_defaults_page_restore_folders),
+ page);
+
+ button = GTK_BUTTON (widget);
+
+ widget = mail_config_defaults_page_add_real_folder (
+ page, size_group, button,
+ _("Use a Real Folder for _Trash:"),
+ _("Choose a folder for deleted messages."),
+ "real-trash-path", "use-real-trash-path");
+ if (widget != NULL) {
+ gtk_grid_attach (GTK_GRID (container), widget, 0, 3, 2, 1);
+ gtk_widget_show (widget);
+ }
+
+ widget = mail_config_defaults_page_add_real_folder (
+ page, size_group, button,
+ _("Use a Real Folder for _Junk:"),
+ _("Choose a folder for junk messages."),
+ "real-junk-path", "use-real-junk-path");
+ if (widget != NULL) {
+ gtk_grid_attach (GTK_GRID (container), widget, 0, 4, 2, 1);
+ gtk_widget_show (widget);
+ }
+
+ /*** Composing Messages ***/
+
+ widget = gtk_grid_new ();
+ gtk_grid_set_row_spacing (GTK_GRID (widget), 6);
+ gtk_grid_set_column_spacing (GTK_GRID (widget), 6);
+ gtk_box_pack_start (GTK_BOX (page), widget, FALSE, FALSE, 0);
+ gtk_widget_show (widget);
+
+ container = widget;
+
+ text = _("Composing Messages");
+ markup = g_markup_printf_escaped ("<b>%s</b>", text);
+ widget = gtk_label_new (markup);
+ gtk_label_set_use_markup (GTK_LABEL (widget), TRUE);
+ gtk_misc_set_alignment (GTK_MISC (widget), 0.0, 0.5);
+ gtk_grid_attach (GTK_GRID (container), widget, 0, 0, 1, 1);
+ gtk_widget_show (widget);
+ g_free (markup);
+
+ text = _("Alway_s carbon-copy (cc) to:");
+ widget = gtk_label_new_with_mnemonic (text);
+ gtk_widget_set_margin_left (widget, 12);
+ gtk_misc_set_alignment (GTK_MISC (widget), 0.0, 0.5);
+ gtk_grid_attach (GTK_GRID (container), widget, 0, 1, 1, 1);
+ gtk_widget_show (widget);
+
+ label = GTK_LABEL (widget);
+
+ widget = gtk_entry_new ();
+ gtk_widget_set_hexpand (widget, TRUE);
+ gtk_widget_set_margin_left (widget, 12);
+ gtk_label_set_mnemonic_widget (label, widget);
+ gtk_grid_attach (GTK_GRID (container), widget, 0, 2, 1, 1);
+ gtk_widget_show (widget);
+
+ g_object_bind_property_full (
+ composition_ext, "cc",
+ widget, "text",
+ G_BINDING_BIDIRECTIONAL |
+ G_BINDING_SYNC_CREATE,
+ mail_config_defaults_page_addrs_to_string,
+ mail_config_defaults_page_string_to_addrs,
+ NULL, (GDestroyNotify) NULL);
+
+ text = _("Always _blind carbon-copy (bcc) to:");
+ widget = gtk_label_new_with_mnemonic (text);
+ gtk_widget_set_margin_left (widget, 12);
+ gtk_misc_set_alignment (GTK_MISC (widget), 0.0, 0.5);
+ gtk_grid_attach (GTK_GRID (container), widget, 0, 3, 1, 1);
+ gtk_widget_show (widget);
+
+ label = GTK_LABEL (widget);
+
+ widget = gtk_entry_new ();
+ gtk_widget_set_hexpand (widget, TRUE);
+ gtk_widget_set_margin_left (widget, 12);
+ gtk_label_set_mnemonic_widget (label, widget);
+ gtk_grid_attach (GTK_GRID (container), widget, 0, 4, 1, 1);
+ gtk_widget_show (widget);
+
+ g_object_bind_property_full (
+ composition_ext, "bcc",
+ widget, "text",
+ G_BINDING_BIDIRECTIONAL |
+ G_BINDING_SYNC_CREATE,
+ mail_config_defaults_page_addrs_to_string,
+ mail_config_defaults_page_string_to_addrs,
+ NULL, (GDestroyNotify) NULL);
+
+ /*** Message Receipts ***/
+
+ widget = gtk_grid_new ();
+ gtk_grid_set_row_spacing (GTK_GRID (widget), 6);
+ gtk_grid_set_column_spacing (GTK_GRID (widget), 6);
+ gtk_box_pack_start (GTK_BOX (page), widget, FALSE, FALSE, 0);
+ gtk_widget_show (widget);
+
+ container = widget;
+
+ text = _("Message Receipts");
+ markup = g_markup_printf_escaped ("<b>%s</b>", text);
+ widget = gtk_label_new (markup);
+ gtk_label_set_use_markup (GTK_LABEL (widget), TRUE);
+ gtk_misc_set_alignment (GTK_MISC (widget), 0.0, 0.5);
+ gtk_grid_attach (GTK_GRID (container), widget, 0, 0, 2, 1);
+ gtk_widget_show (widget);
+ g_free (markup);
+
+ text = _("S_end message receipts:");
+ widget = gtk_label_new_with_mnemonic (text);
+ gtk_widget_set_margin_left (widget, 12);
+ gtk_size_group_add_widget (size_group, widget);
+ gtk_misc_set_alignment (GTK_MISC (widget), 1.0, 0.5);
+ gtk_grid_attach (GTK_GRID (container), widget, 0, 1, 1, 1);
+ gtk_widget_show (widget);
+
+ label = GTK_LABEL (widget);
+
+ widget = gtk_combo_box_text_new ();
+ gtk_widget_set_hexpand (widget, TRUE);
+ gtk_label_set_mnemonic_widget (label, widget);
+ gtk_grid_attach (GTK_GRID (container), widget, 1, 1, 1, 1);
+ gtk_widget_show (widget);
+
+ /* XXX This is a pain in the butt, but we want to avoid hard-coding
+ * string values from the EMdnResponsePolicy enum class in case
+ * they change in the future. */
+ enum_class = g_type_class_ref (E_TYPE_MDN_RESPONSE_POLICY);
+ policy = E_MDN_RESPONSE_POLICY_NEVER;
+ enum_value = g_enum_get_value (enum_class, policy);
+ g_return_if_fail (enum_value != NULL);
+ gtk_combo_box_text_append (
+ GTK_COMBO_BOX_TEXT (widget),
+ enum_value->value_nick, _("Never"));
+ policy = E_MDN_RESPONSE_POLICY_ALWAYS;
+ enum_value = g_enum_get_value (enum_class, policy);
+ g_return_if_fail (enum_value != NULL);
+ gtk_combo_box_text_append (
+ GTK_COMBO_BOX_TEXT (widget),
+ enum_value->value_nick, _("Always"));
+ policy = E_MDN_RESPONSE_POLICY_ASK;
+ enum_value = g_enum_get_value (enum_class, policy);
+ g_return_if_fail (enum_value != NULL);
+ gtk_combo_box_text_append (
+ GTK_COMBO_BOX_TEXT (widget),
+ enum_value->value_nick, _("Ask for each message"));
+ g_type_class_unref (enum_class);
+
+ g_object_bind_property_full (
+ mdn_ext, "response-policy",
+ widget, "active-id",
+ G_BINDING_BIDIRECTIONAL |
+ G_BINDING_SYNC_CREATE,
+ e_binding_transform_enum_value_to_nick,
+ e_binding_transform_enum_nick_to_value,
+ NULL, (GDestroyNotify) NULL);
+
+ g_object_unref (size_group);
+
+ e_extensible_load_extensions (E_EXTENSIBLE (page));
+}
+
+static void
+e_mail_config_defaults_page_class_init (EMailConfigDefaultsPageClass *class)
+{
+ GObjectClass *object_class;
+
+ g_type_class_add_private (
+ class, sizeof (EMailConfigDefaultsPagePrivate));
+
+ object_class = G_OBJECT_CLASS (class);
+ object_class->set_property = mail_config_defaults_page_set_property;
+ object_class->get_property = mail_config_defaults_page_get_property;
+ object_class->dispose = mail_config_defaults_page_dispose;
+ object_class->constructed = mail_config_defaults_page_constructed;
+
+ g_object_class_install_property (
+ object_class,
+ PROP_ACCOUNT_SOURCE,
+ g_param_spec_object (
+ "account-source",
+ "Account Source",
+ "Mail account source being edited",
+ E_TYPE_SOURCE,
+ G_PARAM_READWRITE |
+ G_PARAM_CONSTRUCT_ONLY |
+ G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (
+ object_class,
+ PROP_IDENTITY_SOURCE,
+ g_param_spec_object (
+ "identity-source",
+ "Identity Source",
+ "Mail identity source being edited",
+ E_TYPE_SOURCE,
+ G_PARAM_READWRITE |
+ G_PARAM_CONSTRUCT_ONLY |
+ G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (
+ object_class,
+ PROP_SESSION,
+ g_param_spec_object (
+ "session",
+ "Session",
+ "Mail session",
+ E_TYPE_MAIL_SESSION,
+ G_PARAM_READWRITE |
+ G_PARAM_CONSTRUCT_ONLY |
+ G_PARAM_STATIC_STRINGS));
+}
+
+static void
+e_mail_config_defaults_page_interface_init (EMailConfigPageInterface *interface)
+{
+ interface->title = _("Defaults");
+ interface->sort_order = E_MAIL_CONFIG_DEFAULTS_PAGE_SORT_ORDER;
+}
+
+static void
+e_mail_config_defaults_page_init (EMailConfigDefaultsPage *page)
+{
+ page->priv = E_MAIL_CONFIG_DEFAULTS_PAGE_GET_PRIVATE (page);
+}
+
+EMailConfigPage *
+e_mail_config_defaults_page_new (EMailSession *session,
+ ESource *account_source,
+ ESource *identity_source)
+{
+ g_return_val_if_fail (E_IS_MAIL_SESSION (session), NULL);
+ g_return_val_if_fail (E_IS_SOURCE (account_source), NULL);
+ g_return_val_if_fail (E_IS_SOURCE (identity_source), NULL);
+
+ return g_object_new (
+ E_TYPE_MAIL_CONFIG_DEFAULTS_PAGE,
+ "account-source", account_source,
+ "identity-source", identity_source,
+ "session", session, NULL);
+}
+
+EMailSession *
+e_mail_config_defaults_page_get_session (EMailConfigDefaultsPage *page)
+{
+ g_return_val_if_fail (E_IS_MAIL_CONFIG_DEFAULTS_PAGE (page), NULL);
+
+ return page->priv->session;
+}
+
+ESource *
+e_mail_config_defaults_page_get_account_source (EMailConfigDefaultsPage *page)
+{
+ g_return_val_if_fail (E_IS_MAIL_CONFIG_DEFAULTS_PAGE (page), NULL);
+
+ return page->priv->account_source;
+}
+
+ESource *
+e_mail_config_defaults_page_get_identity_source (EMailConfigDefaultsPage *page)
+{
+ g_return_val_if_fail (E_IS_MAIL_CONFIG_DEFAULTS_PAGE (page), NULL);
+
+ return page->priv->identity_source;
+}
+