diff options
Diffstat (limited to 'calendar/gui/e-select-names-editable.c')
-rw-r--r-- | calendar/gui/e-select-names-editable.c | 245 |
1 files changed, 245 insertions, 0 deletions
diff --git a/calendar/gui/e-select-names-editable.c b/calendar/gui/e-select-names-editable.c new file mode 100644 index 0000000000..2cc4a767b3 --- /dev/null +++ b/calendar/gui/e-select-names-editable.c @@ -0,0 +1,245 @@ +/* + * 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/> + * + * + * Authors: + * Mike Kestner <mkestner@ximian.com> + * + * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com) + * + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <gtk/gtk.h> +#include <gdk/gdkkeysyms.h> +#include <libebook/libebook.h> +#include <shell/e-shell.h> + +#include "e-select-names-editable.h" + +G_DEFINE_TYPE_WITH_CODE ( + ESelectNamesEditable, + e_select_names_editable, + E_TYPE_NAME_SELECTOR_ENTRY, + G_IMPLEMENT_INTERFACE ( + GTK_TYPE_CELL_EDITABLE, NULL)) + +static void +e_select_names_editable_class_init (ESelectNamesEditableClass *class) +{ +} + +static void +e_select_names_editable_init (ESelectNamesEditable *esne) +{ +} + +GtkWidget * +e_select_names_editable_new (EClientCache *client_cache) +{ + g_return_val_if_fail (E_IS_CLIENT_CACHE (client_cache), NULL); + + return g_object_new ( + E_TYPE_SELECT_NAMES_EDITABLE, + "client-cache", client_cache, NULL); +} + +gchar * +e_select_names_editable_get_email (ESelectNamesEditable *esne) +{ + EDestinationStore *destination_store; + GList *list; + gchar *result = NULL; + + g_return_val_if_fail (E_SELECT_NAMES_EDITABLE (esne), NULL); + + destination_store = e_name_selector_entry_peek_destination_store ( + E_NAME_SELECTOR_ENTRY (esne)); + list = e_destination_store_list_destinations (destination_store); + if (list == NULL) + return NULL; + + if (list != NULL) { + EDestination *destination; + + destination = E_DESTINATION (list->data); + result = g_strdup (e_destination_get_email (destination)); + g_list_free (list); + } + + return result; +} + +GList * +e_select_names_editable_get_emails (ESelectNamesEditable *esne) +{ + EDestinationStore *destination_store; + GQueue queue = G_QUEUE_INIT; + GList *list, *link; + + g_return_val_if_fail (E_SELECT_NAMES_EDITABLE (esne), NULL); + + destination_store = e_name_selector_entry_peek_destination_store ( + E_NAME_SELECTOR_ENTRY (esne)); + list = e_destination_store_list_destinations (destination_store); + + for (link = list; link != NULL; link = g_list_next (link->next)) { + EDestination *destination; + + destination = E_DESTINATION (link->data); + + if (e_destination_is_evolution_list (destination)) { + const GList *list_dests; + + list_dests = e_destination_list_get_dests (destination); + while (list_dests != NULL) { + const gchar *email; + + destination = E_DESTINATION (list_dests->data); + email = e_destination_get_email (destination); + g_queue_push_tail (&queue, g_strdup (email)); + + list_dests = g_list_next (list_dests); + } + + } else { + EContact *contact; + const gchar *name; + const gchar *email; + gboolean contact_is_list; + + contact = e_destination_get_contact (destination); + name = e_destination_get_name (destination); + email = e_destination_get_email (destination); + + contact_is_list = + (contact != NULL) && + e_contact_get (contact, E_CONTACT_IS_LIST); + + if (contact_is_list) { + /* If its a contact_list which is not expanded, + * it won't have an email id, so we can use the + * name as the email id. */ + g_queue_push_tail (&queue, g_strdup (name)); + } else { + g_queue_push_tail (&queue, g_strdup (email)); + } + } + } + + g_list_free (list); + + return queue.head; +} + +gchar * +e_select_names_editable_get_name (ESelectNamesEditable *esne) +{ + EDestinationStore *destination_store; + GList *list; + gchar *result = NULL; + + g_return_val_if_fail (E_SELECT_NAMES_EDITABLE (esne), NULL); + + destination_store = e_name_selector_entry_peek_destination_store ( + E_NAME_SELECTOR_ENTRY (esne)); + list = e_destination_store_list_destinations (destination_store); + + if (list != NULL) { + EDestination *destination; + + destination = E_DESTINATION (list->data); + result = g_strdup (e_destination_get_name (destination)); + g_list_free (list); + } + + return result; +} + +GList * +e_select_names_editable_get_names (ESelectNamesEditable *esne) +{ + EDestinationStore *destination_store; + GQueue queue = G_QUEUE_INIT; + GList *list, *link; + + g_return_val_if_fail (E_SELECT_NAMES_EDITABLE (esne), NULL); + + destination_store = e_name_selector_entry_peek_destination_store ( + E_NAME_SELECTOR_ENTRY (esne)); + list = e_destination_store_list_destinations (destination_store); + + for (link = list; link != NULL; link = g_list_next (link)) { + EDestination *destination; + + destination = E_DESTINATION (link->data); + + if (e_destination_is_evolution_list (destination)) { + const GList *list_dests; + + list_dests = e_destination_list_get_dests (destination); + while (list_dests != NULL) { + const gchar *name; + + destination = E_DESTINATION (list_dests->data); + name = e_destination_get_name (destination); + g_queue_push_tail (&queue, g_strdup (name)); + + list_dests = g_list_next (list_dests); + } + } else { + const gchar *name; + + name = e_destination_get_name (destination); + g_queue_push_tail (&queue, g_strdup (name)); + } + } + + g_list_free (list); + + return queue.head; +} + +void +e_select_names_editable_set_address (ESelectNamesEditable *esne, + const gchar *name, + const gchar *email) +{ + EDestinationStore *destination_store; + GList *list; + EDestination *destination; + + g_return_if_fail (E_IS_SELECT_NAMES_EDITABLE (esne)); + + destination_store = e_name_selector_entry_peek_destination_store ( + E_NAME_SELECTOR_ENTRY (esne)); + list = e_destination_store_list_destinations (destination_store); + + if (list == NULL) + destination = e_destination_new (); + else + destination = g_object_ref (list->data); + + e_destination_set_name (destination, name); + e_destination_set_email (destination, email); + + if (list == NULL) + e_destination_store_append_destination ( + destination_store, destination); + + g_object_unref (destination); +} |