From ae21bb5e661666159f212d008e0bacd850ec2cab Mon Sep 17 00:00:00 2001 From: Matthew Barnes Date: Tue, 7 Dec 2010 15:30:15 -0600 Subject: Adapt libeutil to the new ESource API. --- widgets/misc/e-account-combo-box.c | 514 ------------------------------------- 1 file changed, 514 deletions(-) delete mode 100644 widgets/misc/e-account-combo-box.c (limited to 'widgets/misc/e-account-combo-box.c') diff --git a/widgets/misc/e-account-combo-box.c b/widgets/misc/e-account-combo-box.c deleted file mode 100644 index 9c750f9ec4..0000000000 --- a/widgets/misc/e-account-combo-box.c +++ /dev/null @@ -1,514 +0,0 @@ -/* - * e-account-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 - * - * - * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com) - * - */ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include "e-account-combo-box.h" - -#include - -#define E_ACCOUNT_COMBO_BOX_GET_PRIVATE(obj) \ - (G_TYPE_INSTANCE_GET_PRIVATE \ - ((obj), E_TYPE_ACCOUNT_COMBO_BOX, EAccountComboBoxPrivate)) - -enum { - COLUMN_STRING, - COLUMN_ACCOUNT -}; - -enum { - REFRESHED, - LAST_SIGNAL -}; - -struct _EAccountComboBoxPrivate { - EAccountList *account_list; - GHashTable *index; - gint num_displayed_accounts; -}; - -static CamelSession *camel_session; -static guint signal_ids[LAST_SIGNAL]; - -G_DEFINE_TYPE ( - EAccountComboBox, - e_account_combo_box, - GTK_TYPE_COMBO_BOX) - -static gboolean -account_combo_box_has_dupes (GList *list, - const gchar *address) -{ - GList *iter; - guint count = 0; - - /* Look for duplicates of the given email address. */ - for (iter = list; iter != NULL; iter = iter->next) { - EAccount *account = iter->data; - - if (g_ascii_strcasecmp (account->id->address, address) == 0) - count++; - } - - return (count > 1); -} - -static EAccount * -account_combo_box_choose_account (EAccountComboBox *combo_box) -{ - EAccountList *account_list; - EAccount *account; - GtkTreeModel *model; - GtkTreeIter iter; - - account_list = e_account_combo_box_get_account_list (combo_box); - g_return_val_if_fail (account_list != NULL, NULL); - - /* First try the default account. */ - - /* XXX EAccountList misuses const. */ - account = (EAccount *) - e_account_list_get_default (account_list); - - /* If there is no default account, give up. */ - if (account == NULL) - return NULL; - - /* Make sure the default account appears in the combo box. */ - if (g_hash_table_lookup (combo_box->priv->index, account) != NULL) - return account; - - /* Default account is disabled or otherwise unusable, - * so fall back to the first account in the combo box. */ - - model = gtk_combo_box_get_model (GTK_COMBO_BOX (combo_box)); - - if (!gtk_tree_model_get_iter_first (model, &iter)) - return NULL; - - gtk_tree_model_get (model, &iter, COLUMN_ACCOUNT, &account, -1); - - return account; -} - -static gboolean -account_combo_box_test_account (EAccount *account) -{ - CamelService *service; - gboolean writable = FALSE; - - /* Account must be enabled. */ - if (!account->enabled) - return FALSE; - - /* Account must have a non-empty email address. */ - if (account->id->address == NULL || *account->id->address == '\0') - return FALSE; - - /* XXX Not sure I understand this part. */ - if (account->parent_uid == NULL) - return TRUE; - - /* Account must be writable. */ - service = camel_session_get_service (camel_session, account->uid); - if (CAMEL_IS_STORE (service)) { - CamelStore *store = CAMEL_STORE (service); - writable = (store->mode & CAMEL_STORE_WRITE); - } - - return writable; -} - -static void -account_combo_box_refresh_cb (EAccountList *account_list, - EAccount *unused, - EAccountComboBox *combo_box) -{ - GtkListStore *store; - GtkTreeModel *model; - EIterator *account_iter; - EAccount *account; - GHashTable *index; - GList *list = NULL; - GList *iter; - - combo_box->priv->num_displayed_accounts = 0; - - store = gtk_list_store_new (2, G_TYPE_STRING, E_TYPE_ACCOUNT); - model = GTK_TREE_MODEL (store); - index = combo_box->priv->index; - - g_hash_table_remove_all (index); - - if (account_list == NULL) - goto skip; - - /* Build a list of EAccounts to display. */ - account_iter = e_list_get_iterator (E_LIST (account_list)); - while (e_iterator_is_valid (account_iter)) { - EAccount *account; - - /* XXX EIterator misuses const. */ - account = (EAccount *) e_iterator_get (account_iter); - if (account_combo_box_test_account (account)) - list = g_list_prepend (list, account); - e_iterator_next (account_iter); - } - g_object_unref (account_iter); - - list = g_list_reverse (list); - - /* Populate the list store and index. */ - for (iter = list; iter != NULL; iter = iter->next) { - GtkTreeRowReference *reference; - GtkTreeIter tree_iter; - GtkTreePath *path; - gchar *string; - - account = iter->data; - combo_box->priv->num_displayed_accounts++; - - /* Show the account name for duplicate email addresses. */ - if (account_combo_box_has_dupes (list, account->id->address)) - string = g_strdup_printf ( - "%s <%s> (%s)", - account->id->name, - account->id->address, - account->name); - else - string = g_strdup_printf ( - "%s <%s>", - account->id->name, - account->id->address); - - gtk_list_store_append (store, &tree_iter); - gtk_list_store_set ( - store, &tree_iter, - COLUMN_STRING, string, - COLUMN_ACCOUNT, account, -1); - - path = gtk_tree_model_get_path (model, &tree_iter); - reference = gtk_tree_row_reference_new (model, path); - g_hash_table_insert (index, account, reference); - gtk_tree_path_free (path); - - g_free (string); - } - - g_list_free (list); - -skip: - /* Restore the previously selected account. */ - account = e_account_combo_box_get_active (combo_box); - if (account != NULL) - g_object_ref (account); - gtk_combo_box_set_model (GTK_COMBO_BOX (combo_box), model); - e_account_combo_box_set_active (combo_box, account); - if (account != NULL) - g_object_unref (account); - - g_signal_emit (combo_box, signal_ids[REFRESHED], 0); -} - -static GObject * -account_combo_box_constructor (GType type, - guint n_construct_properties, - GObjectConstructParam *construct_properties) -{ - GObject *object; - GObjectClass *parent_class; - GtkCellRenderer *renderer; - - /* Chain up to parent's constructor() method. */ - parent_class = G_OBJECT_CLASS (e_account_combo_box_parent_class); - object = parent_class->constructor ( - type, n_construct_properties, construct_properties); - - renderer = gtk_cell_renderer_text_new (); - - gtk_cell_layout_pack_start ( - GTK_CELL_LAYOUT (object), renderer, TRUE); - gtk_cell_layout_add_attribute ( - GTK_CELL_LAYOUT (object), renderer, "text", COLUMN_STRING); - - return object; -} - -static void -account_combo_box_dispose (GObject *object) -{ - EAccountComboBoxPrivate *priv; - - priv = E_ACCOUNT_COMBO_BOX_GET_PRIVATE (object); - - if (priv->account_list != NULL) { - g_signal_handlers_disconnect_by_func ( - priv->account_list, - account_combo_box_refresh_cb, object); - g_object_unref (priv->account_list); - priv->account_list = NULL; - } - - g_hash_table_remove_all (priv->index); - - /* Chain up to parent's dispose() method. */ - G_OBJECT_CLASS (e_account_combo_box_parent_class)->dispose (object); -} - -static void -account_combo_box_finalize (GObject *object) -{ - EAccountComboBoxPrivate *priv; - - priv = E_ACCOUNT_COMBO_BOX_GET_PRIVATE (object); - - g_hash_table_destroy (priv->index); - - /* Chain up to parent's finalize() method. */ - G_OBJECT_CLASS (e_account_combo_box_parent_class)->finalize (object); -} - -static void -e_account_combo_box_class_init (EAccountComboBoxClass *class) -{ - GObjectClass *object_class; - - g_type_class_add_private (class, sizeof (EAccountComboBoxPrivate)); - - object_class = G_OBJECT_CLASS (class); - object_class->constructor = account_combo_box_constructor; - object_class->dispose = account_combo_box_dispose; - object_class->finalize = account_combo_box_finalize; - - signal_ids[REFRESHED] = g_signal_new ( - "refreshed", - G_TYPE_FROM_CLASS (class), - G_SIGNAL_RUN_LAST, - 0, NULL, NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, 0); -} - -static void -e_account_combo_box_init (EAccountComboBox *combo_box) -{ - GHashTable *index; - - /* Reverse-lookup index */ - index = g_hash_table_new_full ( - g_direct_hash, g_direct_equal, - (GDestroyNotify) g_object_unref, - (GDestroyNotify) gtk_tree_row_reference_free); - - combo_box->priv = E_ACCOUNT_COMBO_BOX_GET_PRIVATE (combo_box); - combo_box->priv->index = index; -} - -GtkWidget * -e_account_combo_box_new (void) -{ - return g_object_new (E_TYPE_ACCOUNT_COMBO_BOX, NULL); -} - -void -e_account_combo_box_set_session (CamelSession *session) -{ - /* XXX Really gross hack. - * - * We need a CamelSession to test whether a given EAccount is - * writable. The global CamelSession object is defined in the - * mailer, but we're too far down the stack to access it. So - * we have to rely on someone passing us a reference to it. - * - * A much cleaner solution would be to store the writeability - * of an account directly into the EAccount, but this would likely - * require breaking ABI and all the fun that goes along with that. - */ - - camel_session = session; -} - -EAccountList * -e_account_combo_box_get_account_list (EAccountComboBox *combo_box) -{ - g_return_val_if_fail (E_IS_ACCOUNT_COMBO_BOX (combo_box), NULL); - - return combo_box->priv->account_list; -} - -void -e_account_combo_box_set_account_list (EAccountComboBox *combo_box, - EAccountList *account_list) -{ - EAccountComboBoxPrivate *priv; - - g_return_if_fail (E_IS_ACCOUNT_COMBO_BOX (combo_box)); - - if (account_list != NULL) - g_return_if_fail (E_IS_ACCOUNT_LIST (account_list)); - - priv = E_ACCOUNT_COMBO_BOX_GET_PRIVATE (combo_box); - - if (priv->account_list != NULL) { - g_signal_handlers_disconnect_by_func ( - priv->account_list, - account_combo_box_refresh_cb, combo_box); - g_object_unref (priv->account_list); - priv->account_list = NULL; - } - - if (account_list != NULL) { - priv->account_list = g_object_ref (account_list); - - /* Listen for changes to the account list. */ - g_signal_connect ( - priv->account_list, "account-added", - G_CALLBACK (account_combo_box_refresh_cb), combo_box); - g_signal_connect ( - priv->account_list, "account-changed", - G_CALLBACK (account_combo_box_refresh_cb), combo_box); - g_signal_connect ( - priv->account_list, "account-removed", - G_CALLBACK (account_combo_box_refresh_cb), combo_box); - } - - account_combo_box_refresh_cb (account_list, NULL, combo_box); -} - -EAccount * -e_account_combo_box_get_active (EAccountComboBox *combo_box) -{ - EAccount *account; - GtkTreeModel *model; - GtkTreeIter iter; - gboolean iter_set; - - g_return_val_if_fail (E_IS_ACCOUNT_COMBO_BOX (combo_box), NULL); - - iter_set = gtk_combo_box_get_active_iter ( - GTK_COMBO_BOX (combo_box), &iter); - if (!iter_set) - return NULL; - - model = gtk_combo_box_get_model (GTK_COMBO_BOX (combo_box)); - gtk_tree_model_get (model, &iter, COLUMN_ACCOUNT, &account, -1); - - return account; -} - -gboolean -e_account_combo_box_set_active (EAccountComboBox *combo_box, - EAccount *account) -{ - EAccountList *account_list; - GtkTreeRowReference *reference; - GtkTreeModel *model; - GtkTreePath *path; - GtkTreeIter iter; - gboolean iter_set; - - g_return_val_if_fail (E_IS_ACCOUNT_COMBO_BOX (combo_box), FALSE); - - if (account != NULL) - g_return_val_if_fail (E_IS_ACCOUNT (account), FALSE); - - account_list = combo_box->priv->account_list; - g_return_val_if_fail (account_list != NULL, FALSE); - - /* NULL means choose an account ourselves. */ - if (account == NULL) - account = account_combo_box_choose_account (combo_box); - - if (account == NULL) - return FALSE; - - /* Lookup the tree row reference for the account. */ - reference = g_hash_table_lookup (combo_box->priv->index, account); - if (reference == NULL) - return FALSE; - - /* Convert the reference to a tree iterator. */ - path = gtk_tree_row_reference_get_path (reference); - model = gtk_combo_box_get_model (GTK_COMBO_BOX (combo_box)); - iter_set = gtk_tree_model_get_iter (model, &iter, path); - gtk_tree_path_free (path); - - if (!iter_set) - return FALSE; - - /* Activate the corresponding combo box item. */ - gtk_combo_box_set_active_iter (GTK_COMBO_BOX (combo_box), &iter); - - return TRUE; -} - -const gchar * -e_account_combo_box_get_active_name (EAccountComboBox *combo_box) -{ - EAccount *account; - - g_return_val_if_fail (E_IS_ACCOUNT_COMBO_BOX (combo_box), NULL); - - account = e_account_combo_box_get_active (combo_box); - return (account != NULL) ? account->name : NULL; -} - -gboolean -e_account_combo_box_set_active_name (EAccountComboBox *combo_box, - const gchar *account_name) -{ - EAccountList *account_list; - EAccount *account; - - g_return_val_if_fail (E_IS_ACCOUNT_COMBO_BOX (combo_box), FALSE); - - account_list = combo_box->priv->account_list; - g_return_val_if_fail (account_list != NULL, FALSE); - - /* XXX EAccountList misuses const. */ - account = (EAccount *) e_account_list_find ( - account_list, E_ACCOUNT_FIND_NAME, account_name); - - if (account == NULL) - return FALSE; - - return e_account_combo_box_set_active (combo_box, account); -} - -/** - * e_account_combo_box_count_displayed_accounts: - * @combo_box: an #EAccountComboBox - * - * Counts the number of accounts that are displayed in the @combo_box. This may not - * be the actual number of accounts that are configured, as some of those accounts - * may be disabled by the user. - * - * Return value: number of active and valid accounts as shown in the @combo_box. - */ -gint -e_account_combo_box_count_displayed_accounts (EAccountComboBox *combo_box) -{ - g_return_val_if_fail (E_IS_ACCOUNT_COMBO_BOX (combo_box), -1); - - return combo_box->priv->num_displayed_accounts; -} -- cgit v1.2.3