aboutsummaryrefslogtreecommitdiffstats
path: root/mail/e-mail-config-provider-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-provider-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-provider-page.c')
-rw-r--r--mail/e-mail-config-provider-page.c774
1 files changed, 774 insertions, 0 deletions
diff --git a/mail/e-mail-config-provider-page.c b/mail/e-mail-config-provider-page.c
new file mode 100644
index 0000000000..1474ff3263
--- /dev/null
+++ b/mail/e-mail-config-provider-page.c
@@ -0,0 +1,774 @@
+/*
+ * e-mail-config-provider-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-provider-page.h"
+
+#include <config.h>
+#include <string.h>
+#include <glib/gi18n-lib.h>
+
+#include <libebackend/e-extensible.h>
+#include <libedataserver/e-data-server-util.h>
+
+#include <libevolution-utils/e-alert-sink.h>
+#include <libevolution-utils/e-alert-dialog.h>
+#include <misc/e-activity-bar.h>
+#include <misc/e-alert-bar.h>
+
+#define E_MAIL_CONFIG_PROVIDER_PAGE_GET_PRIVATE(obj) \
+ (G_TYPE_INSTANCE_GET_PRIVATE \
+ ((obj), E_TYPE_MAIL_CONFIG_PROVIDER_PAGE, EMailConfigProviderPagePrivate))
+
+#define STANDARD_MARGIN 12
+#define DEPENDENCY_MARGIN 24
+
+struct _EMailConfigProviderPagePrivate {
+ EMailConfigServiceBackend *backend;
+ gboolean is_empty;
+
+ GtkWidget *activity_bar;
+ GtkWidget *alert_bar;
+};
+
+enum {
+ PROP_0,
+ PROP_BACKEND
+};
+
+/* Forward Declarations */
+static void e_mail_config_provider_page_alert_sink_init
+ (EAlertSinkInterface *interface);
+static void e_mail_config_provider_page_interface_init
+ (EMailConfigPageInterface *interface);
+
+G_DEFINE_TYPE_WITH_CODE (
+ EMailConfigProviderPage,
+ e_mail_config_provider_page,
+ GTK_TYPE_BOX,
+ G_IMPLEMENT_INTERFACE (
+ E_TYPE_EXTENSIBLE, NULL)
+ G_IMPLEMENT_INTERFACE (
+ E_TYPE_ALERT_SINK,
+ e_mail_config_provider_page_alert_sink_init)
+ G_IMPLEMENT_INTERFACE (
+ E_TYPE_MAIL_CONFIG_PAGE,
+ e_mail_config_provider_page_interface_init))
+
+static void
+mail_config_provider_page_handle_dependency (EMailConfigProviderPage *page,
+ CamelProviderConfEntry *entry,
+ GtkWidget *widget)
+{
+ EMailConfigServiceBackend *backend;
+ CamelSettings *settings;
+ GBindingFlags binding_flags = G_BINDING_SYNC_CREATE;
+ const gchar *depname = entry->depname;
+ gint margin;
+
+ if (depname == NULL)
+ return;
+
+ if (*depname == '!') {
+ binding_flags |= G_BINDING_INVERT_BOOLEAN;
+ depname++;
+ }
+
+ backend = e_mail_config_provider_page_get_backend (page);
+ settings = e_mail_config_service_backend_get_settings (backend);
+
+ g_object_bind_property (
+ settings, depname,
+ widget, "sensitive",
+ binding_flags);
+
+ /* Further indent the widget to show its dependency. */
+ margin = gtk_widget_get_margin_left (widget);
+ gtk_widget_set_margin_left (widget, margin + DEPENDENCY_MARGIN);
+}
+
+static void
+mail_config_provider_page_add_section (EMailConfigProviderPage *page,
+ CamelProviderConfEntry *entry)
+{
+ EMailConfigServiceBackend *backend;
+ CamelProvider *provider;
+ GtkWidget *widget;
+ gchar *markup;
+
+ g_return_if_fail (entry->text != NULL);
+
+ backend = e_mail_config_provider_page_get_backend (page);
+ provider = e_mail_config_service_backend_get_provider (backend);
+
+ markup = g_markup_printf_escaped ("<b>%s</b>", entry->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_box_pack_start (GTK_BOX (page), widget, FALSE, FALSE, 0);
+ gtk_widget_show (widget);
+
+ /* Skip the top margin if this is the first entry. */
+ if (entry != provider->extra_conf)
+ gtk_widget_set_margin_top (widget, 6);
+
+ g_free (markup);
+}
+
+static void
+mail_config_provider_page_add_checkbox (EMailConfigProviderPage *page,
+ CamelProviderConfEntry *entry)
+{
+ EMailConfigServiceBackend *backend;
+ CamelSettings *settings;
+ GtkWidget *widget;
+
+ g_return_if_fail (entry->text != NULL);
+
+ backend = e_mail_config_provider_page_get_backend (page);
+ settings = e_mail_config_service_backend_get_settings (backend);
+
+ widget = gtk_check_button_new_with_mnemonic (entry->text);
+ gtk_widget_set_margin_left (widget, STANDARD_MARGIN);
+ gtk_box_pack_start (GTK_BOX (page), widget, FALSE, FALSE, 0);
+ gtk_widget_show (widget);
+
+ g_object_bind_property (
+ settings, entry->name,
+ widget, "active",
+ G_BINDING_BIDIRECTIONAL |
+ G_BINDING_SYNC_CREATE);
+
+ mail_config_provider_page_handle_dependency (page, entry, widget);
+}
+
+static void
+mail_config_provider_page_add_checkspin (EMailConfigProviderPage *page,
+ CamelProviderConfEntry *entry)
+{
+ EMailConfigServiceBackend *backend;
+ CamelSettings *settings;
+ GObjectClass *class;
+ GParamSpec *pspec;
+ GParamSpec *use_pspec;
+ GtkAdjustment *adjustment;
+ GtkWidget *hbox, *spin;
+ GtkWidget *prefix;
+ gchar *use_property_name;
+ gchar *pre, *post;
+
+ g_return_if_fail (entry->text != NULL);
+
+ backend = e_mail_config_provider_page_get_backend (page);
+ settings = e_mail_config_service_backend_get_settings (backend);
+
+ /* The entry->name property (e.g. "foo") should be numeric for the
+ * spin button. If a "use" boolean property exists (e.g. "use-foo")
+ * then a checkbox is also shown. */
+
+ class = G_OBJECT_GET_CLASS (settings);
+ pspec = g_object_class_find_property (class, entry->name);
+ g_return_if_fail (pspec != NULL);
+
+ use_property_name = g_strconcat ("use-", entry->name, NULL);
+ use_pspec = g_object_class_find_property (class, use_property_name);
+ if (use_pspec != NULL && use_pspec->value_type != G_TYPE_BOOLEAN)
+ use_pspec = NULL;
+ g_free (use_property_name);
+
+ /* Make sure we can convert to and from doubles. */
+ g_return_if_fail (
+ g_value_type_transformable (
+ pspec->value_type, G_TYPE_DOUBLE));
+ g_return_if_fail (
+ g_value_type_transformable (
+ G_TYPE_DOUBLE, pspec->value_type));
+
+ if (G_IS_PARAM_SPEC_CHAR (pspec)) {
+ GParamSpecChar *pspec_char;
+ pspec_char = G_PARAM_SPEC_CHAR (pspec);
+ adjustment = gtk_adjustment_new (
+ (gdouble) pspec_char->default_value,
+ (gdouble) pspec_char->minimum,
+ (gdouble) pspec_char->maximum,
+ 1.0, 1.0, 0.0);
+
+ } else if (G_IS_PARAM_SPEC_UCHAR (pspec)) {
+ GParamSpecUChar *pspec_uchar;
+ pspec_uchar = G_PARAM_SPEC_UCHAR (pspec);
+ adjustment = gtk_adjustment_new (
+ (gdouble) pspec_uchar->default_value,
+ (gdouble) pspec_uchar->minimum,
+ (gdouble) pspec_uchar->maximum,
+ 1.0, 1.0, 0.0);
+
+ } else if (G_IS_PARAM_SPEC_INT (pspec)) {
+ GParamSpecInt *pspec_int;
+ pspec_int = G_PARAM_SPEC_INT (pspec);
+ adjustment = gtk_adjustment_new (
+ (gdouble) pspec_int->default_value,
+ (gdouble) pspec_int->minimum,
+ (gdouble) pspec_int->maximum,
+ 1.0, 1.0, 0.0);
+
+ } else if (G_IS_PARAM_SPEC_UINT (pspec)) {
+ GParamSpecUInt *pspec_uint;
+ pspec_uint = G_PARAM_SPEC_UINT (pspec);
+ adjustment = gtk_adjustment_new (
+ (gdouble) pspec_uint->default_value,
+ (gdouble) pspec_uint->minimum,
+ (gdouble) pspec_uint->maximum,
+ 1.0, 1.0, 0.0);
+
+ } else if (G_IS_PARAM_SPEC_LONG (pspec)) {
+ GParamSpecLong *pspec_long;
+ pspec_long = G_PARAM_SPEC_LONG (pspec);
+ adjustment = gtk_adjustment_new (
+ (gdouble) pspec_long->default_value,
+ (gdouble) pspec_long->minimum,
+ (gdouble) pspec_long->maximum,
+ 1.0, 1.0, 0.0);
+
+ } else if (G_IS_PARAM_SPEC_ULONG (pspec)) {
+ GParamSpecULong *pspec_ulong;
+ pspec_ulong = G_PARAM_SPEC_ULONG (pspec);
+ adjustment = gtk_adjustment_new (
+ (gdouble) pspec_ulong->default_value,
+ (gdouble) pspec_ulong->minimum,
+ (gdouble) pspec_ulong->maximum,
+ 1.0, 1.0, 0.0);
+
+ } else if (G_IS_PARAM_SPEC_FLOAT (pspec)) {
+ GParamSpecFloat *pspec_float;
+ pspec_float = G_PARAM_SPEC_FLOAT (pspec);
+ adjustment = gtk_adjustment_new (
+ (gdouble) pspec_float->default_value,
+ (gdouble) pspec_float->minimum,
+ (gdouble) pspec_float->maximum,
+ 1.0, 1.0, 0.0);
+
+ } else if (G_IS_PARAM_SPEC_DOUBLE (pspec)) {
+ GParamSpecDouble *pspec_double;
+ pspec_double = G_PARAM_SPEC_DOUBLE (pspec);
+ adjustment = gtk_adjustment_new (
+ (gdouble) pspec_double->default_value,
+ (gdouble) pspec_double->minimum,
+ (gdouble) pspec_double->maximum,
+ 1.0, 1.0, 0.0);
+
+ } else
+ g_return_if_reached ();
+
+ pre = g_alloca (strlen (entry->text) + 1);
+ strcpy (pre, entry->text);
+ post = strstr (pre, "%s");
+ if (post != NULL) {
+ *post = '\0';
+ post += 2;
+ }
+
+ hbox = gtk_hbox_new (FALSE, 3);
+ gtk_widget_set_margin_left (hbox, STANDARD_MARGIN);
+ gtk_box_pack_start (GTK_BOX (page), hbox, FALSE, FALSE, 0);
+ gtk_widget_show (hbox);
+
+ if (use_pspec != NULL) {
+ prefix = gtk_check_button_new_with_mnemonic (pre);
+
+ g_object_bind_property (
+ settings, use_pspec->name,
+ prefix, "active",
+ G_BINDING_BIDIRECTIONAL |
+ G_BINDING_SYNC_CREATE);
+ } else {
+ prefix = gtk_label_new_with_mnemonic (pre);
+ }
+ gtk_box_pack_start (GTK_BOX (hbox), prefix, FALSE, TRUE, 0);
+ gtk_widget_show (prefix);
+
+ spin = gtk_spin_button_new (adjustment, 1.0, 0);
+ gtk_box_pack_start (GTK_BOX (hbox), spin, FALSE, TRUE, 0);
+ gtk_widget_show (spin);
+
+ g_object_bind_property (
+ settings, entry->name,
+ spin, "value",
+ G_BINDING_BIDIRECTIONAL |
+ G_BINDING_SYNC_CREATE);
+
+ if (use_pspec != NULL)
+ g_object_bind_property (
+ prefix, "active",
+ spin, "sensitive",
+ G_BINDING_SYNC_CREATE);
+
+ if (post != NULL) {
+ GtkWidget *label = gtk_label_new_with_mnemonic (post);
+ gtk_label_set_mnemonic_widget (GTK_LABEL (label), prefix);
+ gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
+ gtk_widget_show (label);
+ }
+
+ mail_config_provider_page_handle_dependency (page, entry, hbox);
+}
+
+static void
+mail_config_provider_page_add_entry (EMailConfigProviderPage *page,
+ CamelProviderConfEntry *entry)
+{
+ EMailConfigServiceBackend *backend;
+ CamelSettings *settings;
+ GtkWidget *hbox;
+ GtkWidget *input;
+ GtkWidget *label;
+
+ g_return_if_fail (entry->text != NULL);
+
+ backend = e_mail_config_provider_page_get_backend (page);
+ settings = e_mail_config_service_backend_get_settings (backend);
+
+ hbox = gtk_hbox_new (FALSE, 0);
+ gtk_box_set_spacing (GTK_BOX (hbox), 6);
+ gtk_widget_set_margin_left (hbox, STANDARD_MARGIN);
+ gtk_box_pack_start (GTK_BOX (page), hbox, FALSE, FALSE, 0);
+ gtk_widget_show (hbox);
+
+ label = gtk_label_new_with_mnemonic (entry->text);
+ gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
+ gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
+ gtk_widget_show (label);
+
+ input = gtk_entry_new ();
+ gtk_label_set_mnemonic_widget (GTK_LABEL (label), input);
+ gtk_box_pack_start (GTK_BOX (hbox), input, TRUE, TRUE, 0);
+ gtk_widget_show (input);
+
+ g_object_bind_property (
+ settings, entry->name,
+ input, "text",
+ G_BINDING_BIDIRECTIONAL |
+ G_BINDING_SYNC_CREATE);
+
+ g_object_bind_property (
+ input, "sensitive",
+ label, "sensitive",
+ G_BINDING_SYNC_CREATE);
+
+ mail_config_provider_page_handle_dependency (page, entry, hbox);
+}
+
+static void
+mail_config_provider_page_add_options (EMailConfigProviderPage *page,
+ CamelProviderConfEntry *entry)
+{
+ EMailConfigServiceBackend *backend;
+ CamelProvider *provider;
+ CamelSettings *settings;
+ GtkCellRenderer *renderer;
+ GtkListStore *store;
+ GtkWidget *hbox;
+ GtkWidget *combo;
+ GtkWidget *label;
+ gchar **tokens;
+ guint length, ii;
+
+ /* The 'value' string is of the format:
+ *
+ * 'nick0:caption0:nick1:caption1:...nickN:captionN'
+ *
+ * where 'nick' is the nickname a GEnumValue and 'caption'
+ * is the localized combo box item displayed to the user. */
+
+ g_return_if_fail (entry->text != NULL);
+ g_return_if_fail (entry->value != NULL);
+
+ backend = e_mail_config_provider_page_get_backend (page);
+ provider = e_mail_config_service_backend_get_provider (backend);
+ settings = e_mail_config_service_backend_get_settings (backend);
+
+ hbox = gtk_hbox_new (FALSE, 0);
+ gtk_box_set_spacing (GTK_BOX (hbox), 6);
+ gtk_widget_set_margin_left (hbox, STANDARD_MARGIN);
+ gtk_box_pack_start (GTK_BOX (page), hbox, FALSE, FALSE, 0);
+ gtk_widget_show (hbox);
+
+ label = gtk_label_new_with_mnemonic (entry->text);
+ gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
+ gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
+ gtk_widget_show (label);
+
+ /* 0: 'nick', 1: caption */
+ store = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_STRING);
+
+ tokens = g_strsplit (entry->value, ":", -1);
+ length = g_strv_length (tokens);
+
+ /* Take the strings two at a time. */
+ for (ii = 0; ii + 1 < length; ii += 2) {
+ GtkTreeIter iter;
+ const gchar *nick;
+ const gchar *caption;
+
+ nick = tokens[ii + 0];
+ caption = tokens[ii + 1];
+
+ /* Localize the caption. */
+ caption = dgettext (provider->translation_domain, caption);
+
+ gtk_list_store_append (store, &iter);
+ gtk_list_store_set (store, &iter, 0, nick, 1, caption, -1);
+ }
+
+ g_strfreev (tokens);
+
+ combo = gtk_combo_box_new_with_model (GTK_TREE_MODEL (store));
+ gtk_combo_box_set_id_column (GTK_COMBO_BOX (combo), 0);
+ gtk_label_set_mnemonic_widget (GTK_LABEL (label), combo);
+ gtk_box_pack_start (GTK_BOX (hbox), combo, FALSE, FALSE, 0);
+ gtk_widget_show (combo);
+
+ g_object_bind_property_full (
+ settings, entry->name,
+ combo, "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);
+
+ renderer = gtk_cell_renderer_text_new ();
+ gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combo), renderer, TRUE);
+ gtk_cell_layout_set_attributes (
+ GTK_CELL_LAYOUT (combo), renderer, "text", 1, NULL);
+
+ mail_config_provider_page_handle_dependency (page, entry, hbox);
+}
+
+static void
+mail_config_provider_page_add_widgets (EMailConfigProviderPage *page)
+{
+ EMailConfigServiceBackend *backend;
+ CamelProviderConfEntry *entries;
+ CamelProvider *provider;
+ GtkWidget *frame;
+ GtkWidget *widget;
+ gint ii;
+
+ /* Note the "text" member of each CamelProviderConfEntry is
+ * already localized, so we can use it directly in widgets. */
+
+ backend = e_mail_config_provider_page_get_backend (page);
+ provider = e_mail_config_service_backend_get_provider (backend);
+ g_return_if_fail (provider != NULL);
+
+ entries = provider->extra_conf;
+
+ /* Loop until we see CAMEL_PROVIDER_CONF_END. */
+ for (ii = 0; entries[ii].type != CAMEL_PROVIDER_CONF_END; ii++) {
+
+ /* Skip entries with no name. */
+ if (entries[ii].name == NULL)
+ continue;
+
+ switch (entries[ii].type) {
+ case CAMEL_PROVIDER_CONF_SECTION_START:
+ mail_config_provider_page_add_section (
+ page, &entries[ii]);
+ break;
+
+ case CAMEL_PROVIDER_CONF_CHECKBOX:
+ mail_config_provider_page_add_checkbox (
+ page, &entries[ii]);
+ break;
+
+ case CAMEL_PROVIDER_CONF_CHECKSPIN:
+ mail_config_provider_page_add_checkspin (
+ page, &entries[ii]);
+ break;
+
+ case CAMEL_PROVIDER_CONF_ENTRY:
+ mail_config_provider_page_add_entry (
+ page, &entries[ii]);
+ break;
+
+ case CAMEL_PROVIDER_CONF_OPTIONS:
+ mail_config_provider_page_add_options (
+ page, &entries[ii]);
+ break;
+
+ default:
+ break; /* skip it */
+ }
+ }
+
+ /* So far only Evolution-EWS uses the activity and alert
+ * bars, but other packages may someday find it handy. */
+
+ widget = gtk_frame_new (NULL);
+ gtk_frame_set_shadow_type (GTK_FRAME (widget), GTK_SHADOW_IN);
+ gtk_box_pack_end (GTK_BOX (page), widget, FALSE, FALSE, 0);
+ /* Visibility is bound to the EActivityBar. */
+
+ frame = widget;
+
+ widget = e_activity_bar_new ();
+ gtk_container_add (GTK_CONTAINER (frame), widget);
+ page->priv->activity_bar = widget; /* not referenced */
+ /* EActivity controls its own visibility. */
+
+ g_object_bind_property (
+ widget, "visible",
+ frame, "visible",
+ G_BINDING_SYNC_CREATE);
+
+ widget = gtk_frame_new (NULL);
+ gtk_frame_set_shadow_type (GTK_FRAME (widget), GTK_SHADOW_IN);
+ gtk_box_pack_end (GTK_BOX (page), widget, FALSE, FALSE, 0);
+ /* Visibility is bound to the EAlertBar. */
+
+ frame = widget;
+
+ widget = e_alert_bar_new ();
+ gtk_container_add (GTK_CONTAINER (frame), widget);
+ page->priv->alert_bar = widget; /* not referenced */
+ /* EAlertBar controls its own visibility. */
+
+ g_object_bind_property (
+ widget, "visible",
+ frame, "visible",
+ G_BINDING_SYNC_CREATE);
+}
+
+static void
+mail_config_provider_page_set_backend (EMailConfigProviderPage *page,
+ EMailConfigServiceBackend *backend)
+{
+ g_return_if_fail (E_IS_MAIL_CONFIG_SERVICE_BACKEND (backend));
+ g_return_if_fail (page->priv->backend == NULL);
+
+ page->priv->backend = g_object_ref (backend);
+}
+
+static void
+mail_config_provider_page_set_property (GObject *object,
+ guint property_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ switch (property_id) {
+ case PROP_BACKEND:
+ mail_config_provider_page_set_backend (
+ E_MAIL_CONFIG_PROVIDER_PAGE (object),
+ g_value_get_object (value));
+ return;
+ }
+
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+}
+
+static void
+mail_config_provider_page_get_property (GObject *object,
+ guint property_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ switch (property_id) {
+ case PROP_BACKEND:
+ g_value_set_object (
+ value,
+ e_mail_config_provider_page_get_backend (
+ E_MAIL_CONFIG_PROVIDER_PAGE (object)));
+ return;
+ }
+
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+}
+
+static void
+mail_config_provider_page_dispose (GObject *object)
+{
+ EMailConfigProviderPagePrivate *priv;
+
+ priv = E_MAIL_CONFIG_PROVIDER_PAGE_GET_PRIVATE (object);
+
+ if (priv->backend != NULL) {
+ g_object_unref (priv->backend);
+ priv->backend = NULL;
+ }
+
+ /* Chain up parent's dispose() method. */
+ G_OBJECT_CLASS (e_mail_config_provider_page_parent_class)->
+ dispose (object);
+}
+
+static void
+mail_config_provider_page_constructed (GObject *object)
+{
+ EMailConfigProviderPage *page;
+ EMailConfigServiceBackend *backend;
+ CamelProvider *provider;
+
+ page = E_MAIL_CONFIG_PROVIDER_PAGE (object);
+
+ /* Chain up parent's constructed() method. */
+ G_OBJECT_CLASS (e_mail_config_provider_page_parent_class)->
+ constructed (object);
+
+ gtk_box_set_spacing (GTK_BOX (object), 6);
+
+ gtk_orientable_set_orientation (
+ GTK_ORIENTABLE (object), GTK_ORIENTATION_VERTICAL);
+
+ backend = e_mail_config_provider_page_get_backend (page);
+ provider = e_mail_config_service_backend_get_provider (backend);
+
+ if (provider != NULL && provider->extra_conf != NULL)
+ mail_config_provider_page_add_widgets (page);
+ else
+ page->priv->is_empty = TRUE;
+
+ e_extensible_load_extensions (E_EXTENSIBLE (page));
+}
+
+static void
+mail_config_provider_page_submit_alert (EAlertSink *alert_sink,
+ EAlert *alert)
+{
+ EMailConfigProviderPagePrivate *priv;
+ EAlertBar *alert_bar;
+ GtkWidget *dialog;
+ gpointer parent;
+
+ priv = E_MAIL_CONFIG_PROVIDER_PAGE_GET_PRIVATE (alert_sink);
+
+ parent = gtk_widget_get_toplevel (GTK_WIDGET (alert_sink));
+ parent = gtk_widget_is_toplevel (parent) ? parent : NULL;
+
+ switch (e_alert_get_message_type (alert)) {
+ case GTK_MESSAGE_INFO:
+ case GTK_MESSAGE_WARNING:
+ case GTK_MESSAGE_ERROR:
+ alert_bar = E_ALERT_BAR (priv->alert_bar);
+ e_alert_bar_add_alert (alert_bar, alert);
+ break;
+
+ default:
+ dialog = e_alert_dialog_new (parent, alert);
+ gtk_dialog_run (GTK_DIALOG (dialog));
+ gtk_widget_destroy (dialog);
+ break;
+ }
+}
+
+static void
+e_mail_config_provider_page_class_init (EMailConfigProviderPageClass *class)
+{
+ GObjectClass *object_class;
+
+ g_type_class_add_private (class, sizeof (EMailConfigProviderPagePrivate));
+
+ object_class = G_OBJECT_CLASS (class);
+ object_class->set_property = mail_config_provider_page_set_property;
+ object_class->get_property = mail_config_provider_page_get_property;
+ object_class->dispose = mail_config_provider_page_dispose;
+ object_class->constructed = mail_config_provider_page_constructed;
+
+ g_object_class_install_property (
+ object_class,
+ PROP_BACKEND,
+ g_param_spec_object (
+ "backend",
+ "Backend",
+ "Service backend to generate options from",
+ E_TYPE_MAIL_CONFIG_SERVICE_BACKEND,
+ G_PARAM_READWRITE |
+ G_PARAM_CONSTRUCT_ONLY |
+ G_PARAM_STATIC_STRINGS));
+}
+
+static void
+e_mail_config_provider_page_alert_sink_init (EAlertSinkInterface *interface)
+{
+ interface->submit_alert = mail_config_provider_page_submit_alert;
+}
+
+static void
+e_mail_config_provider_page_interface_init (EMailConfigPageInterface *interface)
+{
+ interface->title = _("Receiving Options");
+ interface->sort_order = E_MAIL_CONFIG_PROVIDER_PAGE_SORT_ORDER;
+}
+
+static void
+e_mail_config_provider_page_init (EMailConfigProviderPage *page)
+{
+ page->priv = E_MAIL_CONFIG_PROVIDER_PAGE_GET_PRIVATE (page);
+}
+
+EMailConfigPage *
+e_mail_config_provider_page_new (EMailConfigServiceBackend *backend)
+{
+ g_return_val_if_fail (E_IS_MAIL_CONFIG_SERVICE_BACKEND (backend), NULL);
+
+ return g_object_new (
+ E_TYPE_MAIL_CONFIG_PROVIDER_PAGE,
+ "backend", backend, NULL);
+}
+
+gboolean
+e_mail_config_provider_page_is_empty (EMailConfigProviderPage *page)
+{
+ g_return_val_if_fail (E_IS_MAIL_CONFIG_PROVIDER_PAGE (page), TRUE);
+
+ return page->priv->is_empty;
+}
+
+EMailConfigServiceBackend *
+e_mail_config_provider_page_get_backend (EMailConfigProviderPage *page)
+{
+ g_return_val_if_fail (E_IS_MAIL_CONFIG_PROVIDER_PAGE (page), NULL);
+
+ return page->priv->backend;
+}
+
+EActivity *
+e_mail_config_provider_page_new_activity (EMailConfigProviderPage *page)
+{
+ EActivity *activity;
+ EActivityBar *activity_bar;
+ GCancellable *cancellable;
+
+ g_return_val_if_fail (E_IS_MAIL_CONFIG_PROVIDER_PAGE (page), NULL);
+
+ /* Clear any previous alerts. */
+ e_alert_bar_clear (E_ALERT_BAR (page->priv->alert_bar));
+
+ activity = e_activity_new ();
+
+ e_activity_set_alert_sink (activity, E_ALERT_SINK (page));
+
+ cancellable = camel_operation_new ();
+ e_activity_set_cancellable (activity, cancellable);
+ g_object_unref (cancellable);
+
+ activity_bar = E_ACTIVITY_BAR (page->priv->activity_bar);
+ e_activity_bar_set_activity (activity_bar, activity);
+
+ return activity;
+}
+