diff options
Diffstat (limited to 'addressbook/gui/widgets/e-minicard-view.c')
-rw-r--r-- | addressbook/gui/widgets/e-minicard-view.c | 695 |
1 files changed, 389 insertions, 306 deletions
diff --git a/addressbook/gui/widgets/e-minicard-view.c b/addressbook/gui/widgets/e-minicard-view.c index 6b596bb754..1a35f3aa09 100644 --- a/addressbook/gui/widgets/e-minicard-view.c +++ b/addressbook/gui/widgets/e-minicard-view.c @@ -1,123 +1,158 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * e-minicard-view.c - * Copyright (C) 2000 Ximian, Inc. - * Author: Chris Lahey <clahey@ximian.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. +/* + * 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 - * General Public License for more details. + * 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: + * Chris Lahey <clahey@ximian.com> + * + * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com) * - * You should have received a copy of the GNU General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. */ +#ifdef HAVE_CONFIG_H #include <config.h> +#endif #include "e-minicard-view.h" -#include "e-addressbook-util.h" +#include <string.h> + +#include <gtk/gtk.h> +#include <glib/gi18n.h> +#include <gdk/gdkkeysyms.h> -#include <gtk/gtkselection.h> -#include <gtk/gtkdnd.h> -#include <gal/widgets/e-canvas.h> -#include <gal/widgets/e-unicode.h> -#include <libgnome/gnome-i18n.h> +#include "e-util/e-util.h" -static void e_minicard_view_drag_data_get(GtkWidget *widget, +#include "eab-gui-util.h" +#include "util/eab-book-util.h" + +#include "ea-addressbook.h" + +static void e_minicard_view_drag_data_get (GtkWidget *widget, GdkDragContext *context, GtkSelectionData *selection_data, guint info, guint time, EMinicardView *view); -static EReflowClass *parent_class = NULL; -#define PARENT_TYPE (E_REFLOW_TYPE) - -/* The arguments we take */ enum { - ARG_0, - ARG_ADAPTER, - ARG_BOOK, - ARG_QUERY, - ARG_EDITABLE + PROP_0, + PROP_ADAPTER, + PROP_CLIENT, + PROP_QUERY, + PROP_EDITABLE }; - enum { + CREATE_CONTACT, + CREATE_CONTACT_LIST, RIGHT_CLICK, LAST_SIGNAL }; -static guint signals [LAST_SIGNAL] = {0, }; +static guint signals[LAST_SIGNAL] = {0, }; enum DndTargetType { DND_TARGET_TYPE_VCARD_LIST, + DND_TARGET_TYPE_SOURCE_VCARD_LIST }; #define VCARD_LIST_TYPE "text/x-vcard" +#define SOURCE_VCARD_LIST_TYPE "text/x-source-vcard" static GtkTargetEntry drag_types[] = { - { VCARD_LIST_TYPE, 0, DND_TARGET_TYPE_VCARD_LIST } + { (gchar *) SOURCE_VCARD_LIST_TYPE, 0, DND_TARGET_TYPE_SOURCE_VCARD_LIST }, + { (gchar *) VCARD_LIST_TYPE, 0, DND_TARGET_TYPE_VCARD_LIST } }; -static gint num_drag_types = sizeof(drag_types) / sizeof(drag_types[0]); + +G_DEFINE_TYPE (EMinicardView, e_minicard_view, E_TYPE_REFLOW) static void -e_minicard_view_drag_data_get(GtkWidget *widget, - GdkDragContext *context, - GtkSelectionData *selection_data, - guint info, - guint time, - EMinicardView *view) +e_minicard_view_drag_data_get (GtkWidget *widget, + GdkDragContext *context, + GtkSelectionData *selection_data, + guint info, + guint time, + EMinicardView *view) { - if (!E_IS_MINICARD_VIEW(view)) + GdkAtom target; + + if (!E_IS_MINICARD_VIEW (view)) return; + target = gtk_selection_data_get_target (selection_data); + switch (info) { case DND_TARGET_TYPE_VCARD_LIST: { - char *value; - - value = e_card_list_get_vcard(view->drag_list); - - gtk_selection_data_set (selection_data, - selection_data->target, - 8, - value, strlen (value)); + gchar *value; + + value = eab_contact_list_to_string (view->drag_list); + + gtk_selection_data_set ( + selection_data, target, 8, + (guchar *) value, strlen (value)); + g_free (value); + break; + } + case DND_TARGET_TYPE_SOURCE_VCARD_LIST: { + EBookClient *book_client = NULL; + gchar *value; + + g_object_get (view->adapter, "book_client", &book_client, NULL); + value = eab_book_and_contact_list_to_string (book_client, view->drag_list); + + gtk_selection_data_set ( + selection_data, target, 8, + (guchar *) value, strlen (value)); + + g_object_unref (book_client); + g_free (value); break; } } +} - g_list_foreach (view->drag_list, (GFunc)gtk_object_unref, NULL); - g_list_free (view->drag_list); +static void +clear_drag_data (EMinicardView *view) +{ + g_slist_free_full (view->drag_list, (GDestroyNotify) g_object_unref); view->drag_list = NULL; } -static int -e_minicard_view_drag_begin (EAddressbookReflowAdapter *adapter, GdkEvent *event, EMinicardView *view) +static gint +e_minicard_view_drag_begin (EAddressbookReflowAdapter *adapter, + GdkEvent *event, + EMinicardView *view) { GdkDragContext *context; GtkTargetList *target_list; GdkDragAction actions = GDK_ACTION_MOVE | GDK_ACTION_COPY; - + + clear_drag_data (view); + view->drag_list = e_minicard_view_get_card_list (view); - g_print ("dragging %d card(s)\n", g_list_length (view->drag_list)); + g_print ("dragging %d card(s)\n", g_slist_length (view->drag_list)); - target_list = gtk_target_list_new (drag_types, num_drag_types); + target_list = gtk_target_list_new (drag_types, G_N_ELEMENTS (drag_types)); - context = gtk_drag_begin (GTK_WIDGET (GNOME_CANVAS_ITEM (view)->canvas), - target_list, actions, 1/*XXX*/, event); + context = gtk_drag_begin ( + GTK_WIDGET (GNOME_CANVAS_ITEM (view)->canvas), + target_list, actions, 1/*XXX */, event); if (!view->canvas_drag_data_get_id) - view->canvas_drag_data_get_id = gtk_signal_connect (GTK_OBJECT (GNOME_CANVAS_ITEM (view)->canvas), - "drag_data_get", - GTK_SIGNAL_FUNC (e_minicard_view_drag_data_get), - view); + view->canvas_drag_data_get_id = g_signal_connect ( + GNOME_CANVAS_ITEM (view)->canvas, "drag_data_get", + G_CALLBACK (e_minicard_view_drag_data_get), view); gtk_drag_set_icon_default (context); @@ -127,30 +162,64 @@ e_minicard_view_drag_begin (EAddressbookReflowAdapter *adapter, GdkEvent *event, static void set_empty_message (EMinicardView *view) { - char *empty_message; - gboolean editable = FALSE; + gchar *empty_message; + gboolean editable = FALSE, perform_initial_query = FALSE, searching = FALSE; if (view->adapter) { - gtk_object_get (GTK_OBJECT (view->adapter), - "editable", &editable, - NULL); + EAddressbookModel *model = NULL; + EBookClient *book_client = NULL; + + g_object_get ( + view->adapter, + "editable", &editable, + "model", &model, + "client", &book_client, + NULL); + + if (book_client && !e_client_check_capability (E_CLIENT (book_client), "do-initial-query")) + perform_initial_query = TRUE; + + searching = model && e_addressbook_model_can_stop (model); + + if (book_client) + g_object_unref (book_client); + if (model) + g_object_unref (model); } - if (editable) - empty_message = e_utf8_from_locale_string(_("\n\nThere are no items to show in this view.\n\n" - "Double-click here to create a new Contact.")); - else - empty_message = e_utf8_from_locale_string(_("\n\nThere are no items to show in this view.")); + if (searching) { + empty_message = _("\n\nSearching for the Contacts..."); + } else if (editable) { + if (perform_initial_query) + empty_message = _("\n\nSearch for the Contact\n\n" + "or double-click here to create a new Contact."); + else + empty_message = _("\n\nThere are no items to show in this view.\n\n" + "Double-click here to create a new Contact."); + } else { + if (perform_initial_query) + empty_message = _("\n\nSearch for the Contact."); + else + empty_message = _("\n\nThere are no items to show in this view."); + } - gtk_object_set (GTK_OBJECT(view), - "empty_message", empty_message, - NULL); + g_object_set ( + view, + "empty_message", empty_message, + NULL); +} - g_free (empty_message); +static void +writable_status_change (EAddressbookModel *model, + gboolean writable, + EMinicardView *view) +{ + set_empty_message (view); } static void -writable_status_change (EAddressbookModel *model, gboolean writable, EMinicardView *view) +stop_state_changed (EAddressbookModel *model, + EMinicardView *view) { set_empty_message (view); } @@ -160,169 +229,206 @@ adapter_changed (EMinicardView *view) { set_empty_message (view); - gtk_signal_connect (GTK_OBJECT (view->adapter), "drag_begin", - GTK_SIGNAL_FUNC (e_minicard_view_drag_begin), view); + g_signal_connect ( + view->adapter, "drag_begin", + G_CALLBACK (e_minicard_view_drag_begin), view); } static void -e_minicard_view_set_arg (GtkObject *o, GtkArg *arg, guint arg_id) +e_minicard_view_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) { - GnomeCanvasItem *item; EMinicardView *view; - item = GNOME_CANVAS_ITEM (o); - view = E_MINICARD_VIEW (o); - - switch (arg_id){ - case ARG_ADAPTER: + view = E_MINICARD_VIEW (object); + + switch (property_id) { + case PROP_ADAPTER: if (view->adapter) { - if (view->writable_status_id) { + if (view->writable_status_id || view->stop_state_id) { EAddressbookModel *model; - gtk_object_get (GTK_OBJECT (view->adapter), - "model", &model, - NULL); + g_object_get ( + view->adapter, + "model", &model, + NULL); if (model) { - gtk_signal_disconnect (GTK_OBJECT (model), view->writable_status_id); + if (view->writable_status_id) + g_signal_handler_disconnect (model, view->writable_status_id); + if (view->stop_state_id) + g_signal_handler_disconnect (model, view->stop_state_id); } } - gtk_object_unref (GTK_OBJECT(view->adapter)); + g_object_unref (view->adapter); } view->writable_status_id = 0; - view->adapter = GTK_VALUE_POINTER (*arg); - gtk_object_ref (GTK_OBJECT (view->adapter)); + view->stop_state_id = 0; + view->adapter = g_value_get_object (value); + g_object_ref (view->adapter); adapter_changed (view); - gtk_object_set (GTK_OBJECT (view), - "model", view->adapter, - NULL); + g_object_set ( + view, + "model", view->adapter, + NULL); if (view->adapter) { EAddressbookModel *model; - gtk_object_get (GTK_OBJECT (view->adapter), - "model", &model, - NULL); + g_object_get ( + view->adapter, + "model", &model, + NULL); if (model) { - view->writable_status_id = - gtk_signal_connect (GTK_OBJECT (model), "writable_status", - GTK_SIGNAL_FUNC (writable_status_change), view); + view->writable_status_id = g_signal_connect ( + model, "writable_status", + G_CALLBACK (writable_status_change), view); + view->stop_state_id = g_signal_connect ( + model, "stop_state_changed", + G_CALLBACK (stop_state_changed), view); } - + } break; - case ARG_BOOK: - gtk_object_set (GTK_OBJECT (view->adapter), - "book", GTK_VALUE_OBJECT (*arg), - NULL); + case PROP_CLIENT: + g_object_set ( + view->adapter, + "client", g_value_get_object (value), + NULL); set_empty_message (view); break; - case ARG_QUERY: - gtk_object_set (GTK_OBJECT (view->adapter), - "query", GTK_VALUE_STRING (*arg), - NULL); + case PROP_QUERY: + g_object_set ( + view->adapter, + "query", g_value_get_string (value), + NULL); break; - case ARG_EDITABLE: - gtk_object_set (GTK_OBJECT (view->adapter), - "editable", GTK_VALUE_BOOL (*arg), - NULL); + case PROP_EDITABLE: + g_object_set ( + view->adapter, + "editable", g_value_get_boolean (value), + NULL); set_empty_message (view); break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; } } static void -e_minicard_view_get_arg (GtkObject *object, GtkArg *arg, guint arg_id) +e_minicard_view_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) { EMinicardView *view; view = E_MINICARD_VIEW (object); - switch (arg_id) { - case ARG_ADAPTER: - GTK_VALUE_POINTER (*arg) = view->adapter; + switch (property_id) { + case PROP_ADAPTER: + g_value_set_object (value, view->adapter); break; - case ARG_BOOK: - gtk_object_get (GTK_OBJECT (view->adapter), - "book", >K_VALUE_OBJECT (*arg), - NULL); + case PROP_CLIENT: + g_object_get_property ( + G_OBJECT (view->adapter), + "client", value); break; - case ARG_QUERY: - gtk_object_get (GTK_OBJECT (view->adapter), - "query", >K_VALUE_STRING (*arg), - NULL); + case PROP_QUERY: + g_object_get_property ( + G_OBJECT (view->adapter), + "query", value); break; - case ARG_EDITABLE: - gtk_object_get (GTK_OBJECT (view->adapter), - "editable", >K_VALUE_BOOL (*arg), - NULL); + case PROP_EDITABLE: + g_object_get_property ( + G_OBJECT (view->adapter), + "editable", value); break; default: - arg->type = GTK_TYPE_INVALID; + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; } } static void -e_minicard_view_destroy (GtkObject *object) +e_minicard_view_dispose (GObject *object) { - EMinicardView *view = E_MINICARD_VIEW(object); + EMinicardView *view = E_MINICARD_VIEW (object); + + clear_drag_data (view); if (view->canvas_drag_data_get_id) { - gtk_signal_disconnect (GTK_OBJECT (GNOME_CANVAS_ITEM (view)->canvas), - view->canvas_drag_data_get_id); + g_signal_handler_disconnect ( + GNOME_CANVAS_ITEM (view)->canvas, + view->canvas_drag_data_get_id); + view->canvas_drag_data_get_id = 0; } if (view->adapter) { - if (view->writable_status_id) { + if (view->writable_status_id || view->stop_state_id) { EAddressbookModel *model; - gtk_object_get (GTK_OBJECT (view->adapter), - "model", &model, - NULL); + g_object_get ( + view->adapter, + "model", &model, + NULL); if (model) { - gtk_signal_disconnect (GTK_OBJECT (model), view->writable_status_id); + if (view->writable_status_id) + g_signal_handler_disconnect (model, view->writable_status_id); + if (view->stop_state_id) + g_signal_handler_disconnect (model, view->stop_state_id); } } - gtk_object_unref (GTK_OBJECT(view->adapter)); + g_object_unref (view->adapter); } view->writable_status_id = 0; + view->stop_state_id = 0; view->adapter = NULL; - GTK_OBJECT_CLASS(parent_class)->destroy (object); + /* Chain up to parent's dispose() method. */ + G_OBJECT_CLASS (e_minicard_view_parent_class)->dispose (object); } static guint -e_minicard_view_right_click (EMinicardView *view, GdkEvent *event) +e_minicard_view_right_click (EMinicardView *view, + GdkEvent *event) { guint ret_val = 0; - gtk_signal_emit (GTK_OBJECT (view), signals[RIGHT_CLICK], - event, &ret_val); + g_signal_emit ( + view, signals[RIGHT_CLICK], 0, + event, &ret_val); return ret_val; } static gboolean -e_minicard_view_event (GnomeCanvasItem *item, GdkEvent *event) +e_minicard_view_event (GnomeCanvasItem *item, + GdkEvent *event) { EMinicardView *view; - + guint event_button = 0; + view = E_MINICARD_VIEW (item); - switch( event->type ) { + switch (event->type) { case GDK_2BUTTON_PRESS: - if (((GdkEventButton *)event)->button == 1) { + gdk_event_get_button (event, &event_button); + if (event_button == 1) { gboolean editable; - gtk_object_get(GTK_OBJECT(view->adapter), "editable", &editable, NULL); - - if (editable) { - EBook *book; - gtk_object_get(GTK_OBJECT(view), "book", &book, NULL); - - if (book && E_IS_BOOK (book)) - e_addressbook_show_contact_editor (book, e_card_new(""), TRUE, editable); - } + g_object_get (view->adapter, "editable", &editable, NULL); + + if (editable) + e_minicard_view_create_contact (view); return TRUE; } case GDK_BUTTON_PRESS: - if (event->button.button == 3) { + gdk_event_get_button (event, &event_button); + if (event_button == 3) + e_minicard_view_right_click (view, event); + break; + case GDK_KEY_PRESS: + if (event->key.keyval & GDK_SHIFT_MASK && + event->key.keyval == GDK_KEY_F10) { e_minicard_view_right_click (view, event); } break; @@ -330,30 +436,29 @@ e_minicard_view_event (GnomeCanvasItem *item, GdkEvent *event) break; } - if (GNOME_CANVAS_ITEM_CLASS(parent_class)->event) - return GNOME_CANVAS_ITEM_CLASS(parent_class)->event(item, event); - else - return FALSE; + return GNOME_CANVAS_ITEM_CLASS (e_minicard_view_parent_class)-> + event (item, event); } static gint -e_minicard_view_selection_event (EReflow *reflow, GnomeCanvasItem *item, GdkEvent *event) +e_minicard_view_selection_event (EReflow *reflow, + GnomeCanvasItem *item, + GdkEvent *event) { EMinicardView *view; - int return_val = FALSE; + gint return_val = FALSE; view = E_MINICARD_VIEW (reflow); - if (parent_class->selection_event) { - return_val = parent_class->selection_event (reflow, item, event); - } + return_val = E_REFLOW_CLASS (e_minicard_view_parent_class)-> + selection_event (reflow, item, event); switch (event->type) { case GDK_FOCUS_CHANGE: if (event->focus_change.in) { - int i; + gint i; for (i = 0; i < reflow->count; i++) { if (reflow->items[i] == item) { - e_selection_model_maybe_do_something(reflow->selection, i, 0, 0); + e_selection_model_maybe_do_something (reflow->selection, i, 0, 0); break; } } @@ -363,7 +468,7 @@ e_minicard_view_selection_event (EReflow *reflow, GnomeCanvasItem *item, GdkEven if (event->button.button == 3) { return_val = e_minicard_view_right_click (view, event); if (!return_val) - e_selection_model_right_click_up(reflow->selection); + e_selection_model_right_click_up (reflow->selection); } break; default: @@ -372,176 +477,139 @@ e_minicard_view_selection_event (EReflow *reflow, GnomeCanvasItem *item, GdkEven return return_val; } -typedef struct { - EMinicardView *view; - EBookCallback cb; - gpointer closure; -} ViewCbClosure; - -static void -do_remove (int i, gpointer user_data) -{ - EBook *book; - ECard *card; - ViewCbClosure *viewcbclosure = user_data; - EMinicardView *view = viewcbclosure->view; - EBookCallback cb = viewcbclosure->cb; - gpointer closure = viewcbclosure->closure; - - gtk_object_get (GTK_OBJECT(view->adapter), - "book", &book, - NULL); - - card = e_addressbook_reflow_adapter_get_card (view->adapter, i); - - e_book_remove_card(book, card, cb, closure); - - gtk_object_unref (GTK_OBJECT (card)); -} - -#if 0 -static int -compare_to_utf_str (EMinicard *card, const char *utf_str) -{ - g_return_val_if_fail(card != NULL, 0); - g_return_val_if_fail(E_IS_MINICARD(card), 0); - - if (g_unichar_isdigit (g_utf8_get_char (utf_str))) { - return 1; - } - - if (card->card) { - char *file_as; - gtk_object_get(GTK_OBJECT(card->card), - "file_as", &file_as, - NULL); - if (file_as) - return g_utf8_strcasecmp (file_as, utf_str); - else - return 0; - } else { - return 0; - } -} -#endif - static void -e_minicard_view_class_init (EMinicardViewClass *klass) +e_minicard_view_class_init (EMinicardViewClass *class) { - GtkObjectClass *object_class; + GObjectClass *object_class; GnomeCanvasItemClass *item_class; EReflowClass *reflow_class; - - object_class = (GtkObjectClass*) klass; - item_class = (GnomeCanvasItemClass *) klass; - reflow_class = (EReflowClass *) klass; - - parent_class = gtk_type_class (PARENT_TYPE); - - gtk_object_add_arg_type ("EMinicardView::adapter", GTK_TYPE_OBJECT, - GTK_ARG_READWRITE, ARG_ADAPTER); - gtk_object_add_arg_type ("EMinicardView::book", GTK_TYPE_OBJECT, - GTK_ARG_READWRITE, ARG_BOOK); - gtk_object_add_arg_type ("EMinicardView::query", GTK_TYPE_STRING, - GTK_ARG_READWRITE, ARG_QUERY); - gtk_object_add_arg_type ("EMinicardView::editable", GTK_TYPE_BOOL, - GTK_ARG_READWRITE, ARG_EDITABLE); - - signals [RIGHT_CLICK] = - gtk_signal_new ("right_click", - GTK_RUN_LAST, - object_class->type, - GTK_SIGNAL_OFFSET (EMinicardViewClass, right_click), - gtk_marshal_INT__POINTER, - GTK_TYPE_INT, 1, GTK_TYPE_GDK_EVENT); - - gtk_object_class_add_signals (object_class, signals, LAST_SIGNAL); - - object_class->set_arg = e_minicard_view_set_arg; - object_class->get_arg = e_minicard_view_get_arg; - object_class->destroy = e_minicard_view_destroy; + + object_class = G_OBJECT_CLASS (class); + item_class = (GnomeCanvasItemClass *) class; + reflow_class = (EReflowClass *) class; + + object_class->set_property = e_minicard_view_set_property; + object_class->get_property = e_minicard_view_get_property; + object_class->dispose = e_minicard_view_dispose; + + g_object_class_install_property ( + object_class, + PROP_ADAPTER, + g_param_spec_object ( + "adapter", + "Adapter", + NULL, + E_TYPE_ADDRESSBOOK_REFLOW_ADAPTER, + G_PARAM_READWRITE)); + + g_object_class_install_property ( + object_class, + PROP_CLIENT, + g_param_spec_object ( + "client", + "EBookClient", + NULL, + E_TYPE_BOOK_CLIENT, + G_PARAM_READWRITE)); + + g_object_class_install_property ( + object_class, + PROP_QUERY, + g_param_spec_string ( + "query", + "Query", + NULL, + NULL, + G_PARAM_READWRITE)); + + g_object_class_install_property ( + object_class, + PROP_EDITABLE, + g_param_spec_boolean ( + "editable", + "Editable", + NULL, + FALSE, + G_PARAM_READWRITE)); + + signals[CREATE_CONTACT] = g_signal_new ( + "create-contact", + G_OBJECT_CLASS_TYPE (object_class), + G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, + 0, NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + + signals[CREATE_CONTACT_LIST] = g_signal_new ( + "create-contact-list", + G_OBJECT_CLASS_TYPE (object_class), + G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, + 0, NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + + signals[RIGHT_CLICK] = g_signal_new ( + "right_click", + G_OBJECT_CLASS_TYPE (object_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (EMinicardViewClass, right_click), + NULL, NULL, + e_marshal_INT__POINTER, + G_TYPE_INT, 1, + G_TYPE_POINTER); item_class->event = e_minicard_view_event; reflow_class->selection_event = e_minicard_view_selection_event; /* GnomeCanvasItem method overrides */ + + /* init the accessibility support for e_minicard_view */ + e_minicard_view_a11y_init (); } static void e_minicard_view_init (EMinicardView *view) { + view->drag_list = NULL; view->adapter = NULL; view->canvas_drag_data_get_id = 0; view->writable_status_id = 0; + view->stop_state_id = 0; set_empty_message (view); } -GtkType -e_minicard_view_get_type (void) -{ - static GtkType reflow_type = 0; - - if (!reflow_type) { - static const GtkTypeInfo reflow_info = { - "EMinicardView", - sizeof (EMinicardView), - sizeof (EMinicardViewClass), - (GtkClassInitFunc) e_minicard_view_class_init, - (GtkObjectInitFunc) e_minicard_view_init, - /* reserved_1 */ NULL, - /* reserved_2 */ NULL, - (GtkClassInitFunc) NULL, - }; - - reflow_type = gtk_type_unique (PARENT_TYPE, &reflow_info); - } - - return reflow_type; -} - -void -e_minicard_view_remove_selection(EMinicardView *view, - EBookCallback cb, - gpointer closure) -{ - ViewCbClosure viewcbclosure; - viewcbclosure.view = view; - viewcbclosure.cb = cb; - viewcbclosure.closure = closure; - - e_selection_model_foreach (E_REFLOW (view)->selection, - do_remove, - &viewcbclosure); -} - void e_minicard_view_jump_to_letter (EMinicardView *view, gunichar letter) { #if 0 - char uft_str[6 + 1]; + gchar uft_str[6 + 1]; - utf_str [g_unichar_to_utf8 (letter, utf_str)] = '\0'; - e_reflow_sorted_jump (E_REFLOW_SORTED (view), - (GCompareFunc) compare_to_utf_str, - utf_str); + utf_str[g_unichar_to_utf8 (letter, utf_str)] = '\0'; + e_reflow_sorted_jump ( + E_REFLOW_SORTED (view), + (GCompareFunc) compare_to_utf_str, + utf_str); #endif } typedef struct { - GList *list; + GSList *list; EAddressbookReflowAdapter *adapter; } ModelAndList; static void -add_to_list (int index, gpointer closure) +add_to_list (gint index, + gpointer closure) { ModelAndList *mal = closure; - mal->list = g_list_prepend (mal->list, e_addressbook_reflow_adapter_get_card (mal->adapter, index)); + mal->list = g_slist_prepend ( + mal->list, e_addressbook_reflow_adapter_get_contact ( + mal->adapter, index)); } -GList * +GSList * e_minicard_view_get_card_list (EMinicardView *view) { ModelAndList mal; @@ -551,6 +619,21 @@ e_minicard_view_get_card_list (EMinicardView *view) e_selection_model_foreach (E_REFLOW (view)->selection, add_to_list, &mal); - mal.list = g_list_reverse (mal.list); - return mal.list; + return g_slist_reverse (mal.list); +} + +void +e_minicard_view_create_contact (EMinicardView *view) +{ + g_return_if_fail (E_IS_MINICARD_VIEW (view)); + + g_signal_emit (view, signals[CREATE_CONTACT], 0); +} + +void +e_minicard_view_create_contact_list (EMinicardView *view) +{ + g_return_if_fail (E_IS_MINICARD_VIEW (view)); + + g_signal_emit (view, signals[CREATE_CONTACT_LIST], 0); } |