aboutsummaryrefslogtreecommitdiffstats
path: root/widgets/misc/e-auth-combo-box.c
diff options
context:
space:
mode:
Diffstat (limited to 'widgets/misc/e-auth-combo-box.c')
-rw-r--r--widgets/misc/e-auth-combo-box.c260
1 files changed, 260 insertions, 0 deletions
diff --git a/widgets/misc/e-auth-combo-box.c b/widgets/misc/e-auth-combo-box.c
new file mode 100644
index 0000000000..182e171c00
--- /dev/null
+++ b/widgets/misc/e-auth-combo-box.c
@@ -0,0 +1,260 @@
+/*
+ * e-auth-combo-box.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-auth-combo-box.h"
+
+#define E_AUTH_COMBO_BOX_GET_PRIVATE(obj) \
+ (G_TYPE_INSTANCE_GET_PRIVATE \
+ ((obj), E_TYPE_AUTH_COMBO_BOX, EAuthComboBoxPrivate))
+
+struct _EAuthComboBoxPrivate {
+ CamelProvider *provider;
+};
+
+enum {
+ PROP_0,
+ PROP_PROVIDER
+};
+
+enum {
+ COLUMN_MECHANISM,
+ COLUMN_DISPLAY_NAME,
+ COLUMN_STRIKETHROUGH,
+ COLUMN_AUTHTYPE,
+ NUM_COLUMNS
+};
+
+G_DEFINE_TYPE (
+ EAuthComboBox,
+ e_auth_combo_box,
+ GTK_TYPE_COMBO_BOX)
+
+static void
+auth_combo_box_rebuild_model (EAuthComboBox *combo_box)
+{
+ GtkComboBox *gtk_combo_box;
+ CamelProvider *provider;
+ GtkTreeModel *model;
+ GList *link;
+ const gchar *active_id;
+
+ provider = e_auth_combo_box_get_provider (combo_box);
+
+ gtk_combo_box = GTK_COMBO_BOX (combo_box);
+ model = gtk_combo_box_get_model (gtk_combo_box);
+ active_id = gtk_combo_box_get_active_id (gtk_combo_box);
+
+ gtk_list_store_clear (GTK_LIST_STORE (model));
+
+ if (provider == NULL)
+ return;
+
+ for (link = provider->authtypes; link != NULL; link = link->next) {
+ CamelServiceAuthType *authtype = link->data;
+ GtkTreeIter iter;
+
+ gtk_list_store_append (GTK_LIST_STORE (model), &iter);
+
+ gtk_list_store_set (
+ GTK_LIST_STORE (model), &iter,
+ COLUMN_MECHANISM, authtype->authproto,
+ COLUMN_DISPLAY_NAME, authtype->name,
+ COLUMN_AUTHTYPE, authtype,
+ -1);
+ }
+
+ /* Try selecting the previous mechanism. */
+ if (active_id != NULL)
+ gtk_combo_box_set_active_id (gtk_combo_box, active_id);
+
+ /* Or else fall back to the first mechanism. */
+ if (gtk_combo_box_get_active (gtk_combo_box) == -1)
+ gtk_combo_box_set_active (gtk_combo_box, 0);
+}
+
+static void
+auth_combo_box_set_property (GObject *object,
+ guint property_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ switch (property_id) {
+ case PROP_PROVIDER:
+ e_auth_combo_box_set_provider (
+ E_AUTH_COMBO_BOX (object),
+ g_value_get_pointer (value));
+ return;
+ }
+
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+}
+
+static void
+auth_combo_box_get_property (GObject *object,
+ guint property_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ switch (property_id) {
+ case PROP_PROVIDER:
+ g_value_set_pointer (
+ value,
+ e_auth_combo_box_get_provider (
+ E_AUTH_COMBO_BOX (object)));
+ return;
+ }
+
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+}
+
+static void
+auth_combo_box_constructed (GObject *object)
+{
+ GtkComboBox *combo_box;
+ GtkListStore *list_store;
+ GtkCellLayout *cell_layout;
+ GtkCellRenderer *cell_renderer;
+
+ /* Chain up to parent's constructed() method. */
+ G_OBJECT_CLASS (e_auth_combo_box_parent_class)->constructed (object);
+
+ list_store = gtk_list_store_new (
+ NUM_COLUMNS,
+ G_TYPE_STRING, /* COLUMN_MECHANISM */
+ G_TYPE_STRING, /* COLUMN_DISPLAY_NAME */
+ G_TYPE_BOOLEAN, /* COLUMN_STRIKETHROUGH */
+ G_TYPE_POINTER); /* COLUMN_AUTHTYPE */
+
+ combo_box = GTK_COMBO_BOX (object);
+ gtk_combo_box_set_model (combo_box, GTK_TREE_MODEL (list_store));
+ gtk_combo_box_set_id_column (combo_box, COLUMN_MECHANISM);
+ g_object_unref (list_store);
+
+ cell_layout = GTK_CELL_LAYOUT (object);
+ cell_renderer = gtk_cell_renderer_text_new ();
+ gtk_cell_layout_pack_start (cell_layout, cell_renderer, TRUE);
+
+ gtk_cell_layout_set_attributes (
+ cell_layout, cell_renderer,
+ "text", COLUMN_DISPLAY_NAME,
+ "strikethrough", COLUMN_STRIKETHROUGH,
+ NULL);
+}
+
+static void
+e_auth_combo_box_class_init (EAuthComboBoxClass *class)
+{
+ GObjectClass *object_class;
+
+ g_type_class_add_private (class, sizeof (EAuthComboBoxPrivate));
+
+ object_class = G_OBJECT_CLASS (class);
+ object_class->set_property = auth_combo_box_set_property;
+ object_class->get_property = auth_combo_box_get_property;
+ object_class->constructed = auth_combo_box_constructed;
+
+ g_object_class_install_property (
+ object_class,
+ PROP_PROVIDER,
+ g_param_spec_pointer (
+ "provider",
+ "Provider",
+ "The provider to query for auth mechanisms",
+ G_PARAM_READWRITE |
+ G_PARAM_STATIC_STRINGS));
+}
+
+static void
+e_auth_combo_box_init (EAuthComboBox *combo_box)
+{
+ combo_box->priv = E_AUTH_COMBO_BOX_GET_PRIVATE (combo_box);
+}
+
+CamelProvider *
+e_auth_combo_box_get_provider (EAuthComboBox *combo_box)
+{
+ g_return_val_if_fail (E_IS_AUTH_COMBO_BOX (combo_box), NULL);
+
+ return combo_box->priv->provider;
+}
+
+void
+e_auth_combo_box_set_provider (EAuthComboBox *combo_box,
+ CamelProvider *provider)
+{
+ g_return_if_fail (E_IS_AUTH_COMBO_BOX (combo_box));
+
+ if (provider == combo_box->priv->provider)
+ return;
+
+ combo_box->priv->provider = provider;
+
+ g_object_notify (G_OBJECT (combo_box), "provider");
+
+ auth_combo_box_rebuild_model (combo_box);
+}
+
+void
+e_auth_combo_box_update_available (EAuthComboBox *combo_box,
+ GList *available_authtypes)
+{
+ GtkComboBox *gtk_combo_box;
+ GtkTreeModel *model;
+ GtkTreeIter iter;
+ gint active_index;
+ gint available_index = -1;
+ gint index = 0;
+ gboolean iter_set;
+
+ g_return_if_fail (E_IS_AUTH_COMBO_BOX (combo_box));
+
+ gtk_combo_box = GTK_COMBO_BOX (combo_box);
+ model = gtk_combo_box_get_model (gtk_combo_box);
+ active_index = gtk_combo_box_get_active (gtk_combo_box);
+
+ iter_set = gtk_tree_model_get_iter_first (model, &iter);
+
+ while (iter_set) {
+ CamelServiceAuthType *authtype;
+ gboolean available;
+
+ gtk_tree_model_get (
+ model, &iter, COLUMN_AUTHTYPE, &authtype, -1);
+
+ available = (g_list_find (
+ available_authtypes, authtype) != NULL);
+
+ gtk_list_store_set (
+ GTK_LIST_STORE (model), &iter,
+ COLUMN_STRIKETHROUGH, !available, -1);
+
+ if (index == active_index && !available)
+ active_index = -1;
+
+ if (available && available_index == -1)
+ available_index = index;
+
+ iter_set = gtk_tree_model_iter_next (model, &iter);
+ index++;
+ }
+
+ /* If the active combo_box item turned out to be unavailable
+ * (or there was no active item), select the first available. */
+ if (active_index == -1 && available_index != -1)
+ gtk_combo_box_set_active (gtk_combo_box, available_index);
+}