diff options
Diffstat (limited to 'addressbook')
-rw-r--r-- | addressbook/ChangeLog | 27 | ||||
-rw-r--r-- | addressbook/backend/ebook/e-book-util.c | 6 | ||||
-rw-r--r-- | addressbook/gui/component/GNOME_Evolution_Addressbook.oaf.in | 27 | ||||
-rw-r--r-- | addressbook/gui/component/Makefile.am | 4 | ||||
-rw-r--r-- | addressbook/gui/component/addressbook-factory.c | 2 | ||||
-rw-r--r-- | addressbook/gui/component/e-address-popup.c | 521 | ||||
-rw-r--r-- | addressbook/gui/component/e-address-popup.h | 86 | ||||
-rw-r--r-- | addressbook/gui/component/e-address-widget.c | 1 | ||||
-rw-r--r-- | addressbook/gui/component/e-address-widget.h | 2 | ||||
-rw-r--r-- | addressbook/gui/widgets/e-minicard-widget.c | 38 | ||||
-rw-r--r-- | addressbook/gui/widgets/e-minicard-widget.h | 2 |
11 files changed, 696 insertions, 20 deletions
diff --git a/addressbook/ChangeLog b/addressbook/ChangeLog index 5ede0f8bfd..747c89f897 100644 --- a/addressbook/ChangeLog +++ b/addressbook/ChangeLog @@ -1,3 +1,30 @@ +2001-03-23 Jon Trowbridge <trow@ximian.com> + + * gui/widgets/e-minicard-widget.c (e_minicard_widget_set_card): + Added. Call me old-fashioned, but I just prefer to have a real + API rather than doing everything via gtk_object_get/set-type + calls. + (e_minicard_widget_set_arg): Changed to call + e_minicard_widget_set_card. + + * backend/ebook/e-book-util.c: Small changes to get rid of + compiler warnings. (Casting out const, removed unused variables, + etc.) Removed some debugging messages. + + * gui/component/addressbook-factory.c (main): Added call + to e_address_popup_factory_init. + + * gui/component/e-address-popup.c: Added. A popup gadget that is + invoked (as a bonobo control) when an address is left-clicked in + the mailer. The addressbook is queries, and the address is either + displayed as a minicard (if it already exists) or in a "generic + format". A button is provided for editting/adding the contact. + Some of the semantics of this widget are a bit... non-standard, + because of bonobo issues. I can't really seem to replicate + popup-menu behavior because of how bonobo propogates events, etc. + so I've tried to produce something that I think is non-annoying. + YMMV. + 2001-03-22 Iain Holmes <iain@ximian.com> * backend/ebook/evolution-gnomecard-importer.c: Update to the new diff --git a/addressbook/backend/ebook/e-book-util.c b/addressbook/backend/ebook/e-book-util.c index 1d1106e8f2..1c79ea5d71 100644 --- a/addressbook/backend/ebook/e-book-util.c +++ b/addressbook/backend/ebook/e-book-util.c @@ -151,8 +151,6 @@ simple_query_new (EBook *book, const char *query, EBookSimpleQueryCallback cb, g static void simple_query_free (SimpleQueryInfo *sq) { - GList *i; - /* Remove ourselves from the EBook's pending list. */ book_remove_simple_query (sq->book, sq); @@ -271,7 +269,7 @@ e_book_simple_query (EBook *book, const char *query, EBookSimpleQueryCallback cb #ifdef USE_WORKAROUND gtk_timeout_add (50, WORKAROUND_try_queue, NULL); #else - e_book_get_book_view (book, query, simple_query_book_view_cb, sq); + e_book_get_book_view (book, (gchar *) query, simple_query_book_view_cb, sq); #endif return sq->tag; @@ -426,8 +424,6 @@ e_book_name_and_email_query (EBook *book, } else return 0; - g_message ("query: %s", query); - info = g_new0 (NameEmailQueryInfo, 1); info->name = g_strdup (name); info->email = g_strdup (email); diff --git a/addressbook/gui/component/GNOME_Evolution_Addressbook.oaf.in b/addressbook/gui/component/GNOME_Evolution_Addressbook.oaf.in index 2e604862af..7350b4925e 100644 --- a/addressbook/gui/component/GNOME_Evolution_Addressbook.oaf.in +++ b/addressbook/gui/component/GNOME_Evolution_Addressbook.oaf.in @@ -117,4 +117,31 @@ </oaf_server> +<oaf_server iid="OAFIID:GNOME_Evolution_Addressbook_AddressPopupFactory" + type="exe" + location="evolution-addressbook"> + + <oaf_attribute name="repo_ids" type="stringv"> + <item value="IDL:GNOME/ObjectFactory:1.0"/> + </oaf_attribute> + + <oaf_attribute name="description" type="string" + _value="Factory for the Addressbook's address popup"/> + +</oaf_server> + +<oaf_server iid="OAFIID:GNOME_Evolution_Addressbook_AddressPopup" + type="factory" + location="OAFIID:GNOME_Evolution_Addressbook_AddressPopupFactory"> + + <oaf_attribute name="repo_ids" type="stringv"> + <item value="IDL:BonoboControl/address-widget:1.0"/> + <item value="IDL:GNOME/Control:1.0"/> + </oaf_attribute> + + <oaf_attribute name="description" type="string" + _value="A Bonobo control for an address popup."/> + +</oaf_server> + </oaf_info> diff --git a/addressbook/gui/component/Makefile.am b/addressbook/gui/component/Makefile.am index 59b1d4c394..3089f53901 100644 --- a/addressbook/gui/component/Makefile.am +++ b/addressbook/gui/component/Makefile.am @@ -38,7 +38,9 @@ evolution_addressbook_SOURCES = \ e-cardlist-model.c \ e-cardlist-model.h \ e-address-widget.h \ - e-address-widget.c + e-address-widget.c \ + e-address-popup.h \ + e-address-popup.c evolution_addressbook_LDADD = \ select-names/libeselectnames.la \ diff --git a/addressbook/gui/component/addressbook-factory.c b/addressbook/gui/component/addressbook-factory.c index 51ccb27168..7078a774ef 100644 --- a/addressbook/gui/component/addressbook-factory.c +++ b/addressbook/gui/component/addressbook-factory.c @@ -19,6 +19,7 @@ #include "addressbook.h" #include "addressbook-component.h" #include "e-address-widget.h" +#include "e-address-popup.h" #include "addressbook/gui/widgets/e-minicard-control.h" #include "select-names/e-select-names-factory.h" @@ -65,6 +66,7 @@ main (int argc, char **argv) e_minicard_control_factory_init (); e_address_widget_factory_init (); + e_address_popup_factory_init (); e_cursors_init(); diff --git a/addressbook/gui/component/e-address-popup.c b/addressbook/gui/component/e-address-popup.c new file mode 100644 index 0000000000..19afd29baf --- /dev/null +++ b/addressbook/gui/component/e-address-popup.c @@ -0,0 +1,521 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ + +/* + * e-address-popup.c + * + * Copyright (C) 2001 Ximian, Inc. + * + * Developed by Jon Trowbridge <trow@ximian.com> + */ + +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * 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. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + * USA. + */ + +#include <config.h> +#include "e-address-popup.h" +#include <bonobo/bonobo-control.h> +#include <bonobo/bonobo-property-bag.h> +#include <bonobo/bonobo-generic-factory.h> +#include <gal/widgets/e-popup-menu.h> +#include <addressbook/backend/ebook/e-book.h> +#include <addressbook/backend/ebook/e-book-util.h> +#include <addressbook/contact-editor/e-contact-editor.h> +#include <addressbook/contact-editor/e-contact-quick-add.h> +#include <addressbook/gui/widgets/e-minicard-widget.h> + +static GtkObjectClass *parent_class; +static EBook *common_book = NULL; /* still sort of lame */ + +static void e_address_popup_destroy (GtkObject *); +static void e_address_popup_realize (GtkWidget *); +static gint e_address_popup_button_press_event (GtkWidget *, GdkEventButton *ev); +static gint e_address_popup_enter_notify_event (GtkWidget *, GdkEventCrossing *ev); +static gint e_address_popup_leave_notify_event (GtkWidget *, GdkEventCrossing *ev); + +static void e_address_popup_query (EAddressPopup *); + + +static void +e_address_popup_class_init (EAddressPopupClass *klass) +{ + GtkObjectClass *object_class = (GtkObjectClass *) klass; + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + parent_class = GTK_OBJECT_CLASS (gtk_type_class (gtk_event_box_get_type ())); + + object_class->destroy = e_address_popup_destroy; + + widget_class->realize = e_address_popup_realize; + widget_class->button_press_event = e_address_popup_button_press_event; + widget_class->enter_notify_event = e_address_popup_enter_notify_event; + widget_class->leave_notify_event = e_address_popup_leave_notify_event; +} + +static void +e_address_popup_init (EAddressPopup *pop) +{ + +} + +static void +e_address_popup_destroy (GtkObject *obj) +{ + EAddressPopup *pop = E_ADDRESS_POPUP (obj); + + if (pop->card) + gtk_object_unref (GTK_OBJECT (pop->card)); + + if (pop->leave_timeout_tag) + gtk_timeout_remove (pop->leave_timeout_tag); + + g_free (pop->name); + g_free (pop->email); + + if (GTK_OBJECT_CLASS (parent_class)->destroy) + GTK_OBJECT_CLASS (parent_class)->destroy (obj); +} + +static void +e_address_popup_realize (GtkWidget *w) +{ + EAddressPopup *pop = E_ADDRESS_POPUP (w); + + if (GTK_WIDGET_CLASS (parent_class)->realize) + GTK_WIDGET_CLASS (parent_class)->realize (w); + + /* Start the death count. */ + pop->leave_timeout_tag = gtk_timeout_add (10000, (GtkFunction) gtk_widget_destroy, pop); +} + +static gint +e_address_popup_button_press_event (GtkWidget *w, GdkEventButton *ev) +{ + gtk_widget_destroy (w); + return FALSE; +} + +static gint +e_address_popup_enter_notify_event (GtkWidget *w, GdkEventCrossing *ev) +{ + EAddressPopup *pop = E_ADDRESS_POPUP (w); + + if (pop->leave_timeout_tag) { + gtk_timeout_remove (pop->leave_timeout_tag); + pop->leave_timeout_tag = 0; + } + + return FALSE; +} + +static gint +e_address_popup_leave_notify_event (GtkWidget *w, GdkEventCrossing *ev) +{ + EAddressPopup *pop = E_ADDRESS_POPUP (w); + const gint slack=5; + gint x, y; + + /* Manually check our "leave" events to avoid weird erroneous leaves + that seem related to bonobo... */ + gdk_window_get_pointer (w->window, &x, &y, NULL); + if (slack <= x && x < w->allocation.width-slack && slack <= y && y < w->allocation.height-slack) + return FALSE; + + if (pop->leave_timeout_tag == 0) + pop->leave_timeout_tag = gtk_timeout_add (1000, (GtkFunction) gtk_widget_destroy, pop); + + return FALSE; +} + +GtkType +e_address_popup_get_type (void) +{ + static GtkType pop_type = 0; + + if (!pop_type) { + GtkTypeInfo pop_info = { + "EAddressPopup", + sizeof (EAddressPopup), + sizeof (EAddressPopupClass), + (GtkClassInitFunc) e_address_popup_class_init, + (GtkObjectInitFunc) e_address_popup_init, + NULL, NULL, + (GtkClassInitFunc) NULL + }; + + pop_type = gtk_type_unique (gtk_event_box_get_type (), &pop_info); + } + + return pop_type; +} + +static void +e_address_popup_refresh_names (EAddressPopup *pop) +{ + if (pop->name_widget) { + if (pop->name && *pop->name) { + gtk_label_set_text (GTK_LABEL (pop->name_widget), pop->name); + gtk_widget_show (pop->name_widget); + } else { + gtk_widget_hide (pop->name_widget); + } + } + + if (pop->email_widget) { + if (pop->email && *pop->email) { + gtk_label_set_text (GTK_LABEL (pop->email_widget), pop->email); + gtk_widget_show (pop->email_widget); + } else { + gtk_widget_hide (pop->email_widget); + } + } + + e_address_popup_query (pop); +} + +void +e_address_popup_set_name (EAddressPopup *pop, const gchar *name) +{ + g_return_if_fail (pop && E_IS_ADDRESS_POPUP (pop)); + + g_free (pop->name); + pop->name = g_strdup (name); + g_strstrip (pop->name); + + ++pop->set_count; + + if (pop->set_count >= 2) + e_address_popup_refresh_names (pop); +} + +void +e_address_popup_set_email (EAddressPopup *pop, const gchar *email) +{ + g_return_if_fail (pop && E_IS_ADDRESS_POPUP (pop)); + + g_free (pop->email); + pop->email = g_strdup (email); + g_strstrip (pop->email); + + ++pop->set_count; + + if (pop->set_count >= 2) + e_address_popup_refresh_names (pop); +} + +void +e_address_popup_construct (EAddressPopup *pop) +{ + GtkWidget *vbox, *name_holder; + GdkColor color = { 0x0, 0xffff, 0xffff, 0xffff }; + + g_return_if_fail (pop && E_IS_ADDRESS_POPUP (pop)); + + pop->main_vbox = gtk_vbox_new (FALSE, 0); + + /* Build Generic View */ + + name_holder = gtk_event_box_new (); + vbox = gtk_vbox_new (FALSE, 2); + pop->name_widget = gtk_label_new (""); + pop->email_widget = gtk_label_new (""); + + gtk_box_pack_start (GTK_BOX (vbox), pop->name_widget, TRUE, TRUE, 2); + gtk_box_pack_start (GTK_BOX (vbox), pop->email_widget, TRUE, TRUE, 2); + gtk_container_add (GTK_CONTAINER (name_holder), GTK_WIDGET (vbox)); + + if (gdk_colormap_alloc_color (gtk_widget_get_colormap (GTK_WIDGET (name_holder)), &color, FALSE, TRUE)) { + GtkStyle *style = gtk_style_copy (gtk_widget_get_style (GTK_WIDGET (name_holder))); + style->bg[0] = color; + gtk_widget_set_style (GTK_WIDGET (name_holder), style); + } + + pop->generic_view = gtk_frame_new (NULL); + gtk_container_add (GTK_CONTAINER (pop->generic_view), name_holder); + gtk_box_pack_start (GTK_BOX (pop->main_vbox), pop->generic_view, TRUE, TRUE, 0); + gtk_widget_show_all (pop->generic_view); + + pop->query_msg = gtk_label_new ("Querying Addressbook..."); + gtk_box_pack_start (GTK_BOX (pop->main_vbox), pop->query_msg, TRUE, TRUE, 0); + gtk_widget_show (pop->query_msg); + + /* Build Minicard View */ + pop->minicard_view = e_minicard_widget_new (); + gtk_box_pack_start (GTK_BOX (pop->main_vbox), pop->minicard_view, TRUE, TRUE, 0); + + + /* Final assembly */ + + gtk_container_add (GTK_CONTAINER (pop), pop->main_vbox); + gtk_widget_show (pop->main_vbox); + + gtk_container_set_border_width (GTK_CONTAINER (vbox), 3); + gtk_container_set_border_width (GTK_CONTAINER (pop), 2); +} + +GtkWidget * +e_address_popup_new (void) +{ + EAddressPopup *pop = gtk_type_new (E_ADDRESS_POPUP_TYPE); + e_address_popup_construct (pop); + return GTK_WIDGET (pop); +} + +static GtkWidget * +e_address_popup_popup (EAddressPopup *pop) +{ + GtkWidget *win, *fr; + gint x, y; + + win = gtk_window_new (GTK_WINDOW_POPUP); + fr = gtk_frame_new (NULL); + gtk_container_add (GTK_CONTAINER (win), fr); + gtk_container_add (GTK_CONTAINER (fr), GTK_WIDGET (pop)); + + gtk_window_set_policy (GTK_WINDOW (win), FALSE, FALSE, FALSE); + + gdk_window_get_pointer (NULL, &x, &y, NULL); + x = MAX (x-10, 0); + y = MAX (y-10, 0); + gtk_widget_set_uposition (win, x, y); + + gtk_signal_connect_object (GTK_OBJECT (pop), + "destroy", + GTK_SIGNAL_FUNC(gtk_widget_destroy), + GTK_OBJECT (win)); + + gtk_widget_show (GTK_WIDGET (pop)); + gtk_widget_show (fr); + gtk_widget_show (win); + + return win; +} + +static void +found_fields_cb (EBook *book, EBookStatus status, EList *writable_fields, gpointer closure) +{ + EAddressPopup *pop = E_ADDRESS_POPUP (closure); + EContactEditor *ce = e_contact_editor_new (pop->card, FALSE, writable_fields, FALSE); + e_contact_editor_raise (ce); + gtk_widget_destroy (GTK_WIDGET (pop)); +} + +static void +edit_contact_info_cb (EAddressPopup *pop) +{ + e_book_get_supported_fields (common_book, found_fields_cb, pop); +} + +static void +e_address_popup_cardify (EAddressPopup *pop, ECard *card) +{ + GtkWidget *b; + + g_return_if_fail (pop && E_IS_ADDRESS_POPUP (pop)); + g_return_if_fail (card && E_IS_CARD (card)); + g_return_if_fail (pop->card == NULL); + + pop->card = card; + gtk_object_ref (GTK_OBJECT (pop->card)); + + e_minicard_widget_set_card (E_MINICARD_WIDGET (pop->minicard_view), card); + gtk_widget_show (pop->minicard_view); + gtk_widget_hide (pop->generic_view); + + b = gtk_button_new_with_label ("Edit Contact Info"); + gtk_box_pack_start (GTK_BOX (pop->main_vbox), b, TRUE, TRUE, 0); + gtk_signal_connect_object (GTK_OBJECT (b), + "clicked", + GTK_SIGNAL_FUNC (edit_contact_info_cb), + GTK_OBJECT (pop)); + gtk_widget_show (b); +} + +static void +add_contacts_cb (EAddressPopup *pop) +{ + e_contact_quick_add (pop->name, pop->email, NULL, NULL); + gtk_widget_destroy (GTK_WIDGET (pop)); +} + +static void +e_address_popup_no_matches (EAddressPopup *pop) +{ + GtkWidget *b; + + g_return_if_fail (pop && E_IS_ADDRESS_POPUP (pop)); + + b = gtk_button_new_with_label ("Add to Contacts"); + gtk_box_pack_start (GTK_BOX (pop->main_vbox), b, TRUE, TRUE, 0); + gtk_signal_connect_object (GTK_OBJECT (b), + "clicked", + GTK_SIGNAL_FUNC (add_contacts_cb), + GTK_OBJECT (pop)); + gtk_widget_show (b); +} + +static void +e_address_popup_multiple_matches (EAddressPopup *pop) +{ + +} + + +/** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** **/ + +/* + * Addressbook Query Fun + */ + +static void +query_cb (EBook *book, EBookSimpleQueryStatus status, const GList *cards, gpointer closure) +{ + EAddressPopup *pop; + + if (status != E_BOOK_SIMPLE_QUERY_STATUS_SUCCESS) + return; + + pop = E_ADDRESS_POPUP (closure); + + pop->have_queried = TRUE; + gtk_widget_hide (pop->query_msg); + + if (cards == NULL) { + + e_address_popup_no_matches (pop); + + } else { + if (g_list_length ((GList *) cards) == 1) + e_address_popup_cardify (pop, E_CARD (cards->data)); + else + e_address_popup_multiple_matches (pop); + } + + pop->query_tag = 0; +} + +static void +start_query (EAddressPopup *pop) +{ + g_assert (common_book != NULL); + g_return_if_fail (pop && E_IS_ADDRESS_POPUP (pop)); + + if (pop->query_tag) + e_book_simple_query_cancel (common_book, pop->query_tag); + + pop->query_tag = e_book_name_and_email_query (common_book, pop->name, pop->email, query_cb, pop); +} + +static void +loaded_book_cb (EBook *book, EBookStatus status, gpointer closure) +{ + g_return_if_fail (status == E_BOOK_STATUS_SUCCESS); + g_return_if_fail (book != NULL); + + if (common_book == NULL) { + common_book = book; + gtk_object_ref (GTK_OBJECT (common_book)); + } + + start_query (E_ADDRESS_POPUP (closure)); +} + +static void +e_address_popup_query (EAddressPopup *pop) +{ + g_return_if_fail (pop && E_IS_ADDRESS_POPUP (pop)); + + if (common_book == NULL) { + EBook *book = e_book_new (); + e_book_load_local_address_book (book, loaded_book_cb, pop); + } else { + start_query (pop); + } +} + +/** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** **/ + +enum { + PROPERTY_NAME, + PROPERTY_EMAIL +}; + +static void +set_prop (BonoboPropertyBag *bag, const BonoboArg *arg, guint arg_id, CORBA_Environment *ev, gpointer user_data) +{ + EAddressPopup *pop = E_ADDRESS_POPUP (user_data); + + switch (arg_id) { + + case PROPERTY_NAME: + e_address_popup_set_name (pop, BONOBO_ARG_GET_STRING (arg)); + break; + + case PROPERTY_EMAIL: + e_address_popup_set_email (pop, BONOBO_ARG_GET_STRING (arg)); + break; + + default: + g_assert_not_reached (); + } + +} + +static BonoboControl * +e_address_popup_factory_new_control (void) +{ + BonoboControl *control; + BonoboPropertyBag *bag; + GtkWidget *w; + + w = e_address_popup_new (); + control = bonobo_control_new (e_address_popup_popup (E_ADDRESS_POPUP (w))); + + bag = bonobo_property_bag_new (NULL, set_prop, w); + bonobo_property_bag_add (bag, "name", PROPERTY_NAME, + BONOBO_ARG_STRING, NULL, NULL, + BONOBO_PROPERTY_WRITEABLE); + + bonobo_property_bag_add (bag, "email", PROPERTY_EMAIL, + BONOBO_ARG_STRING, NULL, NULL, + BONOBO_PROPERTY_WRITEABLE); + + bonobo_control_set_properties (control, bag); + bonobo_object_unref (BONOBO_OBJECT (bag)); + + return control; +} + +static BonoboObject * +e_address_popup_factory (BonoboGenericFactory *factory, gpointer user_data) +{ + return BONOBO_OBJECT (e_address_popup_factory_new_control ()); +} + +void +e_address_popup_factory_init (void) +{ + static BonoboGenericFactory *factory = NULL; + + if (factory != NULL) + return; + + factory = bonobo_generic_factory_new ("OAFIID:GNOME_Evolution_Addressbook_AddressPopupFactory", + e_address_popup_factory, NULL); + + if (factory == NULL) + g_error ("I could not register an AddressPopup factory."); +} diff --git a/addressbook/gui/component/e-address-popup.h b/addressbook/gui/component/e-address-popup.h new file mode 100644 index 0000000000..cac060fb4a --- /dev/null +++ b/addressbook/gui/component/e-address-popup.h @@ -0,0 +1,86 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ + +/* + * e-address-popup.h + * + * Copyright (C) 2001 Ximian, Inc. + * + * Developed by Jon Trowbridge <trow@ximian.com> + */ + +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * 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. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + * USA. + */ + +#ifndef __E_ADDRESS_POPUP_H__ +#define __E_ADDRESS_POPUP_H__ + +#include <gtk/gtk.h> +#include <libgnome/gnome-defs.h> +#include <addressbook/backend/ebook/e-card.h> + +BEGIN_GNOME_DECLS + +#define E_ADDRESS_POPUP_TYPE (e_address_popup_get_type ()) +#define E_ADDRESS_POPUP(o) (GTK_CHECK_CAST ((o), E_ADDRESS_POPUP_TYPE, EAddressPopup)) +#define E_ADDRESS_POPUP_CLASS(k) (GTK_CHECK_CLASS_CAST ((k), E_ADDRESS_POPUP_TYPE, EAddressPopupClass)) +#define E_IS_ADDRESS_POPUP(o) (GTK_CHECK_TYPE ((o), E_ADDRESS_POPUP_TYPE)) +#define E_IS_ADDRESS_POPUP_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_ADDRESS_POPUP_TYPE)) + +typedef struct _EAddressPopup EAddressPopup; +typedef struct _EAddressPopupClass EAddressPopupClass; + +struct _EAddressPopup { + GtkEventBox parent; + + guint leave_timeout_tag; + gboolean grabbed; + + gint set_count; + gchar *name; + gchar *email; + + GtkWidget *name_widget; + GtkWidget *email_widget; + GtkWidget *query_msg; + + GtkWidget *main_vbox; + GtkWidget *generic_view; + GtkWidget *minicard_view; + + guint query_tag; + gboolean have_queried, multiple_matches; + ECard *card; +}; + +struct _EAddressPopupClass { + GtkEventBoxClass parent_class; +}; + +GtkType e_address_popup_get_type (void); + +void e_address_popup_set_name (EAddressPopup *, const gchar *name); +void e_address_popup_set_email (EAddressPopup *, const gchar *email); + +void e_address_popup_construct (EAddressPopup *); +GtkWidget *e_address_popup_new (void); + +void e_address_popup_factory_init (void); + +END_GNOME_DECLS + +#endif /* __E_ADDRESS_POPUP_H__ */ + diff --git a/addressbook/gui/component/e-address-widget.c b/addressbook/gui/component/e-address-widget.c index 92b0b9337c..f69ce5c58d 100644 --- a/addressbook/gui/component/e-address-widget.c +++ b/addressbook/gui/component/e-address-widget.c @@ -213,7 +213,6 @@ e_address_widget_construct (EAddressWidget *addr) gtk_box_pack_start (GTK_BOX (box), addr->spacer, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX (box), addr->email_widget, FALSE, FALSE, 0); - gtk_container_add (GTK_CONTAINER (addr), box); gtk_widget_show (box); diff --git a/addressbook/gui/component/e-address-widget.h b/addressbook/gui/component/e-address-widget.h index 2b0b6073c5..a85ed90d8b 100644 --- a/addressbook/gui/component/e-address-widget.h +++ b/addressbook/gui/component/e-address-widget.h @@ -63,7 +63,7 @@ struct _EAddressWidget { }; struct _EAddressWidgetClass { - GtkHBoxClass parent_class; + GtkEventBoxClass parent_class; }; GtkType e_address_widget_get_type (void); diff --git a/addressbook/gui/widgets/e-minicard-widget.c b/addressbook/gui/widgets/e-minicard-widget.c index 3f765425e4..3712d5e306 100644 --- a/addressbook/gui/widgets/e-minicard-widget.c +++ b/addressbook/gui/widgets/e-minicard-widget.c @@ -196,21 +196,12 @@ static void e_minicard_widget_set_arg (GtkObject *object, GtkArg *arg, guint arg_id) { EMinicardWidget *emw = E_MINICARD_WIDGET(object); + gpointer ptr; switch (arg_id){ case ARG_CARD: - if (emw->card) - gtk_object_unref(GTK_OBJECT(emw->card)); - if (GTK_VALUE_OBJECT(*arg)) { - emw->card = E_CARD(GTK_VALUE_OBJECT(*arg)); - gtk_object_ref(GTK_OBJECT(emw->card)); - } - else - emw->card = NULL; - if (emw->item) - gtk_object_set(GTK_OBJECT(emw->item), - "card", emw->card, - NULL); + ptr = GTK_VALUE_POINTER (*arg); + e_minicard_widget_set_card (emw, ptr ? E_CARD (ptr) : NULL); break; default: break; @@ -234,3 +225,26 @@ e_minicard_widget_get_arg (GtkObject *object, GtkArg *arg, guint arg_id) break; } } + +void +e_minicard_widget_set_card (EMinicardWidget *emw, ECard *card) +{ + g_return_if_fail (emw && E_IS_MINICARD_WIDGET (emw)); + g_return_if_fail (card == NULL || E_IS_CARD (card)); + + if (card != emw->card) { + + if (emw->card) + gtk_object_unref (GTK_OBJECT (emw->card)); + + emw->card = card; + + if (emw->card) + gtk_object_ref (GTK_OBJECT (emw->card)); + + if (emw->item) + gtk_object_set (GTK_OBJECT (emw->item), + "card", emw->card, + NULL); + } +} diff --git a/addressbook/gui/widgets/e-minicard-widget.h b/addressbook/gui/widgets/e-minicard-widget.h index 95b56cf3de..3eb544c15e 100644 --- a/addressbook/gui/widgets/e-minicard-widget.h +++ b/addressbook/gui/widgets/e-minicard-widget.h @@ -68,6 +68,8 @@ struct _EMinicardWidgetClass GtkWidget *e_minicard_widget_new(void); GtkType e_minicard_widget_get_type (void); +void e_minicard_widget_set_card (EMinicardWidget *, ECard *); + #ifdef __cplusplus } #endif /* __cplusplus */ |