From 653cfffc0e00dfb59b36813c1b45c53d3f773c65 Mon Sep 17 00:00:00 2001 From: Ettore Perazzoli Date: Tue, 21 Oct 2003 18:49:34 +0000 Subject: Merge new-ui-branch to the trunk. svn path=/trunk/; revision=22965 --- addressbook/gui/widgets/.cvsignore | 4 +- addressbook/gui/widgets/Makefile.am | 115 +- addressbook/gui/widgets/e-addressbook-marshal.list | 11 - addressbook/gui/widgets/e-addressbook-model.c | 382 +++--- addressbook/gui/widgets/e-addressbook-model.h | 83 +- .../gui/widgets/e-addressbook-reflow-adapter.c | 152 ++- .../gui/widgets/e-addressbook-reflow-adapter.h | 11 +- .../gui/widgets/e-addressbook-table-adapter.c | 207 ++-- .../gui/widgets/e-addressbook-table-adapter.h | 32 +- .../gui/widgets/e-addressbook-treeview-adapter.c | 6 +- addressbook/gui/widgets/e-addressbook-util.c | 636 ---------- addressbook/gui/widgets/e-addressbook-util.h | 65 - addressbook/gui/widgets/e-addressbook-view.c | 1147 ++++++++---------- addressbook/gui/widgets/e-addressbook-view.etspec | 30 +- addressbook/gui/widgets/e-addressbook-view.h | 153 ++- addressbook/gui/widgets/e-minicard-control.c | 357 ------ addressbook/gui/widgets/e-minicard-control.h | 8 - addressbook/gui/widgets/e-minicard-label.c | 4 +- addressbook/gui/widgets/e-minicard-view-widget.c | 49 +- addressbook/gui/widgets/e-minicard-view.c | 48 +- addressbook/gui/widgets/e-minicard-widget-test.c | 117 -- addressbook/gui/widgets/e-minicard-widget.c | 264 ----- addressbook/gui/widgets/e-minicard-widget.h | 76 -- addressbook/gui/widgets/e-minicard.c | 264 ++--- addressbook/gui/widgets/e-minicard.h | 6 +- addressbook/gui/widgets/eab-contact-display.c | 486 ++++++++ addressbook/gui/widgets/eab-contact-display.h | 61 + addressbook/gui/widgets/eab-gui-util.c | 823 +++++++++++++ addressbook/gui/widgets/eab-gui-util.h | 70 ++ addressbook/gui/widgets/eab-marshal.list | 11 + addressbook/gui/widgets/eab-popup-control.c | 1236 ++++++++++++++++++++ addressbook/gui/widgets/eab-popup-control.h | 85 ++ addressbook/gui/widgets/eab-vcard-control.c | 310 +++++ addressbook/gui/widgets/eab-vcard-control.h | 8 + addressbook/gui/widgets/test-minicard-label.c | 129 -- addressbook/gui/widgets/test-minicard-view.c | 203 ---- addressbook/gui/widgets/test-minicard.c | 120 -- 37 files changed, 4172 insertions(+), 3597 deletions(-) delete mode 100644 addressbook/gui/widgets/e-addressbook-marshal.list delete mode 100644 addressbook/gui/widgets/e-addressbook-util.c delete mode 100644 addressbook/gui/widgets/e-addressbook-util.h delete mode 100644 addressbook/gui/widgets/e-minicard-control.c delete mode 100644 addressbook/gui/widgets/e-minicard-control.h delete mode 100644 addressbook/gui/widgets/e-minicard-widget-test.c delete mode 100644 addressbook/gui/widgets/e-minicard-widget.c delete mode 100644 addressbook/gui/widgets/e-minicard-widget.h create mode 100644 addressbook/gui/widgets/eab-contact-display.c create mode 100644 addressbook/gui/widgets/eab-contact-display.h create mode 100644 addressbook/gui/widgets/eab-gui-util.c create mode 100644 addressbook/gui/widgets/eab-gui-util.h create mode 100644 addressbook/gui/widgets/eab-marshal.list create mode 100644 addressbook/gui/widgets/eab-popup-control.c create mode 100644 addressbook/gui/widgets/eab-popup-control.h create mode 100644 addressbook/gui/widgets/eab-vcard-control.c create mode 100644 addressbook/gui/widgets/eab-vcard-control.h delete mode 100644 addressbook/gui/widgets/test-minicard-label.c delete mode 100644 addressbook/gui/widgets/test-minicard-view.c delete mode 100644 addressbook/gui/widgets/test-minicard.c (limited to 'addressbook/gui/widgets') diff --git a/addressbook/gui/widgets/.cvsignore b/addressbook/gui/widgets/.cvsignore index d3b9ac4305..b67f65e6c3 100644 --- a/addressbook/gui/widgets/.cvsignore +++ b/addressbook/gui/widgets/.cvsignore @@ -10,8 +10,8 @@ minicard-test minicard-view-test minicard-widget-test reflow-test -e-addressbook-marshal.c -e-addressbook-marshal.h +eab-marshal.c +eab-marshal.h Evolution-Composer-stubs.c Evolution-Composer-skels.c Evolution-Composer-common.c diff --git a/addressbook/gui/widgets/Makefile.am b/addressbook/gui/widgets/Makefile.am index 2185d10764..ce441cbafb 100644 --- a/addressbook/gui/widgets/Makefile.am +++ b/addressbook/gui/widgets/Makefile.am @@ -1,9 +1,10 @@ INCLUDES = \ - -DG_LOG_DOMAIN=\"e-minicard\" \ + -DG_LOG_DOMAIN=\"eab-widgets\" \ -DEVOLUTION_ETSPECDIR=\""$(etspecdir)"\" \ -DEVOLUTION_IMAGESDIR=\""$(imagesdir)"\" \ -DEVOLUTION_GALVIEWSDIR=\""$(viewsdir)"\" \ -I$(top_srcdir) \ + -I$(top_srcdir)/addressbook \ -I$(top_srcdir)/addressbook/backend \ -I$(top_builddir)/addressbook/backend \ -I$(top_srcdir)/addressbook/gui/contact-editor \ @@ -35,37 +36,39 @@ CORBA_SOURCE_C = $(CORBA_COMPOSER_SOURCE_C) CORBA_SOURCE = $(CORBA_SOURCE_H) $(CORBA_SOURCE_C) noinst_LTLIBRARIES = \ - libeminicard.la + libeabwidgets.la -libeminicard_la_SOURCES = \ +libeabwidgets_la_SOURCES = \ $(CORBA_SOURCE) \ - e-addressbook-marshal.c \ + eab-contact-display.c \ + eab-contact-display.h \ + eab-gui-util.c \ + eab-gui-util.h \ + eab-popup-control.c \ + eab-popup-control.h \ + eab-vcard-control.c \ + eab-vcard-control.h \ + eab-marshal.c \ + e-minicard.c \ + e-minicard.h \ + e-minicard-label.c \ + e-minicard-label.h \ + e-minicard-view.c \ + e-minicard-view.h \ + e-minicard-view-widget.c \ + e-minicard-view-widget.h \ e-addressbook-reflow-adapter.c \ e-addressbook-reflow-adapter.h \ e-addressbook-table-adapter.c \ e-addressbook-table-adapter.h \ e-addressbook-model.c \ e-addressbook-model.h \ - e-addressbook-util.c \ - e-addressbook-util.h \ e-addressbook-view.c \ e-addressbook-view.h \ - e-minicard-control.c \ - e-minicard-control.h \ - e-minicard-label.c \ - e-minicard-label.h \ - e-minicard-view-widget.c \ - e-minicard-view-widget.h \ - e-minicard-view.c \ - e-minicard-view.h \ - e-minicard-widget.c \ - e-minicard-widget.h \ - e-minicard.c \ - e-minicard.h \ - gal-view-factory-minicard.c \ - gal-view-factory-minicard.h \ gal-view-minicard.c \ - gal-view-minicard.h + gal-view-minicard.h \ + gal-view-factory-minicard.c \ + gal-view-factory-minicard.h #TREEVIEW_SOURCES= e-addressbook-treeview-adapter.c \ # e-addressbook-treeview-adapter.h \ @@ -74,7 +77,7 @@ libeminicard_la_SOURCES = \ # gal-view-treeview.c \ # gal-view-treeview.h -MARSHAL_GENERATED = e-addressbook-marshal.c e-addressbook-marshal.h +MARSHAL_GENERATED = eab-marshal.c eab-marshal.h @EVO_MARSHAL_RULE@ BUILT_SOURCES = $(CORBA_SOURCE) $(MARSHAL_GENERATED) @@ -83,74 +86,8 @@ CLEANFILES = $(BUILT_SOURCES) dist-hook: cd $(distdir); rm -f $(BUILT_SOURCES) -#noinst_PROGRAMS = \ -# minicard-widget-test \ -# minicard-label-test \ -# minicard-test -## reflow-test -## minicard-view-test -# -#minicard_label_test_SOURCES = \ -# test-minicard-label.c -# -#minicard_label_test_LDADD = \ -# libeminicard.a \ -# $(EVOLUTION_ADDRESSBOOK_LIBS) \ -# $(top_builddir)/e-util/libeutil.la -# -#minicard_test_SOURCES = \ -# test-minicard.c -# -#minicard_test_LDADD = \ -# libeminicard.a \ -# $(top_builddir)/addressbook/backend/ebook/libebook.la \ -# $(top_builddir)/addressbook/gui/contact-editor/libecontacteditor.a \ -# $(top_builddir)/addressbook/gui/contact-list-editor/libecontactlisteditor.a \ -# $(top_builddir)/addressbook/printing/libecontactprint.a \ -# $(top_builddir)/addressbook/gui/merging/libecardmerging.a \ -# $(top_builddir)/widgets/misc/libemiscwidgets.la \ -# $(top_builddir)/addressbook/gui/component/select-names/libeselectnames.la \ -# $(EVOLUTION_ADDRESSBOOK_LIBS) \ -# libeminicard.a -# -#reflow_test_SOURCES = \ -# test-reflow.c -# -#reflow_test_LDADD = \ -# libeminicard.a \ -# $(top_builddir)/addressbook/backend/ebook/libebook.la \ -# $(top_builddir)/addressbook/contact-editor/libecontacteditor.a \ -# $(top_builddir)/addressbook/printing/libecontactprint.a \ -# $(top_builddir)/widgets/misc/libemiscwidgets.la \ -# $(EVOLUTION_ADDRESSBOOK_LIBS) - -#minicard_view_test_SOURCES = \ -# test-minicard-view.c - -#minicard_view_test_LDADD = \ -# $(EVOLUTION_ADDRESSBOOK_LIBS) -# libeminicard.a \ -# $(top_builddir)/addressbook/backend/ebook/libebook.la \ -# $(top_builddir)/addressbook/contact-editor/libecontacteditor.a \ -# $(top_builddir)/addressbook/printing/libecontactprint.a \ -# $(top_builddir)/widgets/misc/libemiscwidgets.la -# -#minicard_widget_test_SOURCES = \ -# e-minicard-widget-test.c -# -#minicard_widget_test_LDADD = \ -# libeminicard.a \ -# $(top_builddir)/addressbook/backend/ebook/libebook.la \ -# $(top_builddir)/addressbook/gui/contact-editor/libecontacteditor.a \ -# $(top_builddir)/addressbook/gui/contact-list-editor/libecontactlisteditor.a \ -# $(top_builddir)/addressbook/gui/component/select-names/libeselectnames.la \ -# $(top_builddir)/addressbook/printing/libecontactprint.a \ -# $(top_builddir)/widgets/misc/libemiscwidgets.la \ -# $(top_builddir)/addressbook/gui/merging/libecardmerging.a \ -# $(EVOLUTION_ADDRESSBOOK_LIBS) - etspec_DATA= e-addressbook-view.etspec EXTRA_DIST = \ $(etspec_DATA) \ - e-addressbook-marshal.list + eab-marshal.list diff --git a/addressbook/gui/widgets/e-addressbook-marshal.list b/addressbook/gui/widgets/e-addressbook-marshal.list deleted file mode 100644 index 2b34707dbb..0000000000 --- a/addressbook/gui/widgets/e-addressbook-marshal.list +++ /dev/null @@ -1,11 +0,0 @@ -INT:POINTER -NONE:NONE -NONE:BOOL -NONE:POINTER -NONE:OBJECT -NONE:ENUM -NONE:INT,INT -NONE:INT -NONE:UINT -NONE:DOUBLE -INT:POINTER diff --git a/addressbook/gui/widgets/e-addressbook-model.c b/addressbook/gui/widgets/e-addressbook-model.c index 10af915ecf..e8a1e76a38 100644 --- a/addressbook/gui/widgets/e-addressbook-model.c +++ b/addressbook/gui/widgets/e-addressbook-model.c @@ -8,25 +8,24 @@ */ #include -#include "e-addressbook-marshal.h" +#include "eab-marshal.h" #include "e-addressbook-model.h" #include #include #include #include #include -#include "e-addressbook-util.h" -#include "e-addressbook-marshal.h" +#include "eab-gui-util.h" #define PARENT_TYPE G_TYPE_OBJECT static GObjectClass *parent_class; /* - * EAddressbookModel callbacks + * EABModel callbacks * These are the callbacks that define the behavior of our custom model. */ -static void e_addressbook_model_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); -static void e_addressbook_model_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); +static void eab_model_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); +static void eab_model_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); enum { @@ -42,21 +41,19 @@ enum { SEARCH_STARTED, SEARCH_RESULT, FOLDER_BAR_MESSAGE, - CARD_ADDED, - CARD_REMOVED, - CARD_CHANGED, + CONTACT_ADDED, + CONTACT_REMOVED, + CONTACT_CHANGED, MODEL_CHANGED, STOP_STATE_CHANGED, BACKEND_DIED, LAST_SIGNAL }; -#define COLS (E_CARD_SIMPLE_FIELD_LAST) - -static guint e_addressbook_model_signals [LAST_SIGNAL] = {0, }; +static guint eab_model_signals [LAST_SIGNAL] = {0, }; static void -free_data (EAddressbookModel *model) +free_data (EABModel *model) { if (model->data) { int i; @@ -73,17 +70,17 @@ free_data (EAddressbookModel *model) } static void -remove_book_view(EAddressbookModel *model) +remove_book_view(EABModel *model) { - if (model->book_view && model->create_card_id) + if (model->book_view && model->create_contact_id) g_signal_handler_disconnect (model->book_view, - model->create_card_id); - if (model->book_view && model->remove_card_id) + model->create_contact_id); + if (model->book_view && model->remove_contact_id) g_signal_handler_disconnect (model->book_view, - model->remove_card_id); - if (model->book_view && model->modify_card_id) + model->remove_contact_id); + if (model->book_view && model->modify_contact_id) g_signal_handler_disconnect (model->book_view, - model->modify_card_id); + model->modify_contact_id); if (model->book_view && model->status_message_id) g_signal_handler_disconnect (model->book_view, model->status_message_id); @@ -91,9 +88,9 @@ remove_book_view(EAddressbookModel *model) g_signal_handler_disconnect (model->book_view, model->sequence_complete_id); - model->create_card_id = 0; - model->remove_card_id = 0; - model->modify_card_id = 0; + model->create_contact_id = 0; + model->remove_contact_id = 0; + model->modify_contact_id = 0; model->status_message_id = 0; model->sequence_complete_id = 0; @@ -109,12 +106,7 @@ remove_book_view(EAddressbookModel *model) static void addressbook_dispose(GObject *object) { - EAddressbookModel *model = E_ADDRESSBOOK_MODEL(object); - - if (model->get_view_idle) { - g_source_remove(model->get_view_idle); - model->get_view_idle = 0; - } + EABModel *model = EAB_MODEL(object); remove_book_view(model); free_data (model); @@ -135,7 +127,7 @@ addressbook_dispose(GObject *object) } if (model->query) { - g_free (model->query); + e_book_query_unref (model->query); model->query = NULL; } @@ -144,7 +136,7 @@ addressbook_dispose(GObject *object) } static void -update_folder_bar_message (EAddressbookModel *model) +update_folder_bar_message (EABModel *model) { int count; char *message; @@ -153,67 +145,68 @@ update_folder_bar_message (EAddressbookModel *model) switch (count) { case 0: - message = g_strdup (_("No cards")); + message = g_strdup (_("No contacts")); break; case 1: - message = g_strdup (_("1 card")); + message = g_strdup (_("1 contact")); break; default: - message = g_strdup_printf (_("%d cards"), count); + message = g_strdup_printf (_("%d contacts"), count); break; } g_signal_emit (model, - e_addressbook_model_signals [FOLDER_BAR_MESSAGE], 0, + eab_model_signals [FOLDER_BAR_MESSAGE], 0, message); g_free (message); } static void -create_card(EBookView *book_view, - const GList *cards, - EAddressbookModel *model) +create_contact(EBookView *book_view, + const GList *contacts, + EABModel *model) { int old_count = model->data_count; - int length = g_list_length ((GList *)cards); + int length = g_list_length ((GList *)contacts); if (model->data_count + length > model->allocated_count) { while (model->data_count + length > model->allocated_count) model->allocated_count = model->allocated_count * 2 + 1; - model->data = g_renew(ECard *, model->data, model->allocated_count); + model->data = g_renew(EContact *, model->data, model->allocated_count); } - for ( ; cards; cards = cards->next) { - model->data[model->data_count++] = cards->data; - g_object_ref (cards->data); + for ( ; contacts; contacts = contacts->next) { + model->data[model->data_count++] = contacts->data; + g_object_ref (contacts->data); } g_signal_emit (model, - e_addressbook_model_signals [CARD_ADDED], 0, + eab_model_signals [CONTACT_ADDED], 0, old_count, model->data_count - old_count); update_folder_bar_message (model); } static void -remove_card(EBookView *book_view, - GList *ids, - EAddressbookModel *model) +remove_contact(EBookView *book_view, + GList *ids, + EABModel *model) { + /* XXX we should keep a hash around instead of this O(n*m) loop */ int i = 0; GList *l; for (l = ids; l; l = l->next) { char *id = l->data; for ( i = 0; i < model->data_count; i++) { - if ( !strcmp(e_card_get_id(model->data[i]), id) ) { + if ( !strcmp(e_contact_get_const (model->data[i], E_CONTACT_UID), id) ) { g_object_unref (model->data[i]); - memmove(model->data + i, model->data + i + 1, (model->data_count - i - 1) * sizeof (ECard *)); + memmove(model->data + i, model->data + i + 1, (model->data_count - i - 1) * sizeof (EContact *)); model->data_count--; g_signal_emit (model, - e_addressbook_model_signals [CARD_REMOVED], 0, + eab_model_signals [CONTACT_REMOVED], 0, i); break; @@ -225,18 +218,19 @@ remove_card(EBookView *book_view, } static void -modify_card(EBookView *book_view, - const GList *cards, - EAddressbookModel *model) +modify_contact(EBookView *book_view, + const GList *contacts, + EABModel *model) { - for ( ; cards; cards = cards->next) { + for ( ; contacts; contacts = contacts->next) { int i; for ( i = 0; i < model->data_count; i++) { - if ( !strcmp(e_card_get_id(model->data[i]), e_card_get_id(E_CARD(cards->data))) ) { + if ( !strcmp(e_contact_get_const(model->data[i], E_CONTACT_UID), + e_contact_get_const(E_CONTACT(contacts->data), E_CONTACT_UID)) ) { g_object_unref (model->data[i]); - model->data[i] = e_card_duplicate(E_CARD(cards->data)); + model->data[i] = e_contact_duplicate(E_CONTACT(contacts->data)); g_signal_emit (model, - e_addressbook_model_signals [CARD_CHANGED], 0, + eab_model_signals [CONTACT_CHANGED], 0, i); break; } @@ -247,57 +241,57 @@ modify_card(EBookView *book_view, static void status_message (EBookView *book_view, char* status, - EAddressbookModel *model) + EABModel *model) { g_signal_emit (model, - e_addressbook_model_signals [STATUS_MESSAGE], 0, + eab_model_signals [STATUS_MESSAGE], 0, status); } static void sequence_complete (EBookView *book_view, EBookViewStatus status, - EAddressbookModel *model) + EABModel *model) { model->search_in_progress = FALSE; status_message (book_view, NULL, model); g_signal_emit (model, - e_addressbook_model_signals [SEARCH_RESULT], 0, + eab_model_signals [SEARCH_RESULT], 0, status); g_signal_emit (model, - e_addressbook_model_signals [STOP_STATE_CHANGED], 0); + eab_model_signals [STOP_STATE_CHANGED], 0); } static void writable_status (EBook *book, gboolean writable, - EAddressbookModel *model) + EABModel *model) { if (!model->editable_set) { model->editable = writable; g_signal_emit (model, - e_addressbook_model_signals [WRITABLE_STATUS], 0, + eab_model_signals [WRITABLE_STATUS], 0, writable); } } static void backend_died (EBook *book, - EAddressbookModel *model) + EABModel *model) { g_signal_emit (model, - e_addressbook_model_signals [BACKEND_DIED], 0); + eab_model_signals [BACKEND_DIED], 0); } static void -e_addressbook_model_class_init (GObjectClass *object_class) +eab_model_class_init (GObjectClass *object_class) { parent_class = g_type_class_ref (PARENT_TYPE); object_class->dispose = addressbook_dispose; - object_class->set_property = e_addressbook_model_set_property; - object_class->get_property = e_addressbook_model_get_property; + object_class->set_property = eab_model_set_property; + object_class->get_property = eab_model_get_property; g_object_class_install_property (object_class, PROP_BOOK, g_param_spec_object ("book", @@ -320,119 +314,118 @@ e_addressbook_model_class_init (GObjectClass *object_class) FALSE, G_PARAM_READWRITE)); - e_addressbook_model_signals [WRITABLE_STATUS] = + eab_model_signals [WRITABLE_STATUS] = g_signal_new ("writable_status", G_OBJECT_CLASS_TYPE (object_class), G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (EAddressbookModelClass, writable_status), + G_STRUCT_OFFSET (EABModelClass, writable_status), NULL, NULL, - e_addressbook_marshal_NONE__BOOL, + eab_marshal_NONE__BOOL, G_TYPE_NONE, 1, G_TYPE_BOOLEAN); - e_addressbook_model_signals [STATUS_MESSAGE] = + eab_model_signals [STATUS_MESSAGE] = g_signal_new ("status_message", G_OBJECT_CLASS_TYPE (object_class), G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (EAddressbookModelClass, status_message), + G_STRUCT_OFFSET (EABModelClass, status_message), NULL, NULL, - e_addressbook_marshal_NONE__POINTER, + eab_marshal_NONE__POINTER, G_TYPE_NONE, 1, G_TYPE_POINTER); - e_addressbook_model_signals [SEARCH_STARTED] = + eab_model_signals [SEARCH_STARTED] = g_signal_new ("search_started", G_OBJECT_CLASS_TYPE (object_class), G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (EAddressbookModelClass, search_started), + G_STRUCT_OFFSET (EABModelClass, search_started), NULL, NULL, - e_addressbook_marshal_NONE__NONE, + eab_marshal_NONE__NONE, G_TYPE_NONE, 0); - e_addressbook_model_signals [SEARCH_RESULT] = + eab_model_signals [SEARCH_RESULT] = g_signal_new ("search_result", G_OBJECT_CLASS_TYPE (object_class), G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (EAddressbookModelClass, search_result), + G_STRUCT_OFFSET (EABModelClass, search_result), NULL, NULL, - e_addressbook_marshal_NONE__INT, + eab_marshal_NONE__INT, G_TYPE_NONE, 1, G_TYPE_INT); - e_addressbook_model_signals [FOLDER_BAR_MESSAGE] = + eab_model_signals [FOLDER_BAR_MESSAGE] = g_signal_new ("folder_bar_message", G_OBJECT_CLASS_TYPE (object_class), G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (EAddressbookModelClass, folder_bar_message), + G_STRUCT_OFFSET (EABModelClass, folder_bar_message), NULL, NULL, - e_addressbook_marshal_NONE__POINTER, + eab_marshal_NONE__POINTER, G_TYPE_NONE, 1, G_TYPE_POINTER); - e_addressbook_model_signals [CARD_ADDED] = - g_signal_new ("card_added", + eab_model_signals [CONTACT_ADDED] = + g_signal_new ("contact_added", G_OBJECT_CLASS_TYPE (object_class), G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (EAddressbookModelClass, card_added), + G_STRUCT_OFFSET (EABModelClass, contact_added), NULL, NULL, - e_addressbook_marshal_NONE__INT_INT, + eab_marshal_NONE__INT_INT, G_TYPE_NONE, 2, G_TYPE_INT, G_TYPE_INT); - e_addressbook_model_signals [CARD_REMOVED] = - g_signal_new ("card_removed", + eab_model_signals [CONTACT_REMOVED] = + g_signal_new ("contact_removed", G_OBJECT_CLASS_TYPE (object_class), G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (EAddressbookModelClass, card_removed), + G_STRUCT_OFFSET (EABModelClass, contact_removed), NULL, NULL, - e_addressbook_marshal_NONE__INT, + eab_marshal_NONE__INT, G_TYPE_NONE, 1, G_TYPE_INT); - e_addressbook_model_signals [CARD_CHANGED] = - g_signal_new ("card_changed", + eab_model_signals [CONTACT_CHANGED] = + g_signal_new ("contact_changed", G_OBJECT_CLASS_TYPE (object_class), G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (EAddressbookModelClass, card_changed), + G_STRUCT_OFFSET (EABModelClass, contact_changed), NULL, NULL, - e_addressbook_marshal_NONE__INT, + eab_marshal_NONE__INT, G_TYPE_NONE, 1, G_TYPE_INT); - e_addressbook_model_signals [MODEL_CHANGED] = + eab_model_signals [MODEL_CHANGED] = g_signal_new ("model_changed", G_OBJECT_CLASS_TYPE (object_class), G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (EAddressbookModelClass, model_changed), + G_STRUCT_OFFSET (EABModelClass, model_changed), NULL, NULL, - e_addressbook_marshal_NONE__NONE, + eab_marshal_NONE__NONE, G_TYPE_NONE, 0); - e_addressbook_model_signals [STOP_STATE_CHANGED] = + eab_model_signals [STOP_STATE_CHANGED] = g_signal_new ("stop_state_changed", G_OBJECT_CLASS_TYPE (object_class), G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (EAddressbookModelClass, stop_state_changed), + G_STRUCT_OFFSET (EABModelClass, stop_state_changed), NULL, NULL, - e_addressbook_marshal_NONE__NONE, + eab_marshal_NONE__NONE, G_TYPE_NONE, 0); - e_addressbook_model_signals [BACKEND_DIED] = + eab_model_signals [BACKEND_DIED] = g_signal_new ("backend_died", G_OBJECT_CLASS_TYPE (object_class), G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (EAddressbookModelClass, backend_died), + G_STRUCT_OFFSET (EABModelClass, backend_died), NULL, NULL, - e_addressbook_marshal_NONE__NONE, + eab_marshal_NONE__NONE, G_TYPE_NONE, 0); } static void -e_addressbook_model_init (GObject *object) +eab_model_init (GObject *object) { - EAddressbookModel *model = E_ADDRESSBOOK_MODEL(object); + EABModel *model = EAB_MODEL(object); model->book = NULL; - model->query = g_strdup("(contains \"x-evolution-any-field\" \"\")"); + model->query = e_book_query_any_field_contains (""); model->book_view = NULL; - model->get_view_idle = 0; - model->create_card_id = 0; - model->remove_card_id = 0; - model->modify_card_id = 0; + model->create_contact_id = 0; + model->remove_contact_id = 0; + model->modify_contact_id = 0; model->status_message_id = 0; model->writable_status_id = 0; model->backend_died_id = 0; @@ -449,30 +442,28 @@ e_addressbook_model_init (GObject *object) static void book_view_loaded (EBook *book, EBookStatus status, EBookView *book_view, gpointer closure) { - EAddressbookModel *model = closure; + EABModel *model = closure; - remove_book_view(model); - - if (status != E_BOOK_STATUS_SUCCESS) { - e_addressbook_error_dialog (_("Error getting book view"), status); + if (status != E_BOOK_ERROR_OK) { + eab_error_dialog (_("Error getting book view"), status); return; } model->book_view = book_view; if (model->book_view) g_object_ref (model->book_view); - model->create_card_id = g_signal_connect(model->book_view, - "card_added", - G_CALLBACK (create_card), - model); - model->remove_card_id = g_signal_connect(model->book_view, - "card_removed", - G_CALLBACK (remove_card), - model); - model->modify_card_id = g_signal_connect(model->book_view, - "card_changed", - G_CALLBACK(modify_card), - model); + model->create_contact_id = g_signal_connect(model->book_view, + "contacts_added", + G_CALLBACK (create_contact), + model); + model->remove_contact_id = g_signal_connect(model->book_view, + "contacts_removed", + G_CALLBACK (remove_contact), + model); + model->modify_contact_id = g_signal_connect(model->book_view, + "contacts_changed", + G_CALLBACK(modify_contact), + model); model->status_message_id = g_signal_connect(model->book_view, "status_message", G_CALLBACK(status_message), @@ -482,70 +473,65 @@ book_view_loaded (EBook *book, EBookStatus status, EBookView *book_view, gpointe G_CALLBACK(sequence_complete), model); - free_data (model); - model->search_in_progress = TRUE; g_signal_emit (model, - e_addressbook_model_signals [MODEL_CHANGED], 0); + eab_model_signals [MODEL_CHANGED], 0); g_signal_emit (model, - e_addressbook_model_signals [SEARCH_STARTED], 0); + eab_model_signals [SEARCH_STARTED], 0); g_signal_emit (model, - e_addressbook_model_signals [STOP_STATE_CHANGED], 0); + eab_model_signals [STOP_STATE_CHANGED], 0); + + e_book_view_start (model->book_view); } -static gboolean -get_view (EAddressbookModel *model) +static void +get_view (EABModel *model) { + gboolean success; + if (model->book && model->query) { + char *query_string = e_book_query_to_string (model->query); + + remove_book_view(model); + free_data (model); + if (model->first_get_view) { + model->first_get_view = FALSE; + if (e_book_check_static_capability (model->book, "do-initial-query")) { - e_book_get_book_view (model->book, model->query, book_view_loaded, model); + success = e_book_async_get_book_view (model->book, query_string, book_view_loaded, model); } else { - remove_book_view(model); - free_data (model); g_signal_emit (model, - e_addressbook_model_signals [MODEL_CHANGED], 0); + eab_model_signals [MODEL_CHANGED], 0); g_signal_emit (model, - e_addressbook_model_signals [STOP_STATE_CHANGED], 0); + eab_model_signals [STOP_STATE_CHANGED], 0); + g_free (query_string); + return; } - model->first_get_view = FALSE; } else - e_book_get_book_view (model->book, model->query, book_view_loaded, model); - } + success = e_book_async_get_book_view (model->book, query_string, book_view_loaded, model); - model->get_view_idle = 0; - return FALSE; -} - -ECard * -e_addressbook_model_get_card(EAddressbookModel *model, - int row) -{ - if (model->data && 0 <= row && row < model->data_count) { - ECard *card; - card = e_card_duplicate (model->data[row]); - return card; + g_free (query_string); } - return NULL; } -const ECard * -e_addressbook_model_peek_card(EAddressbookModel *model, - int row) +EContact * +eab_model_get_contact(EABModel *model, + int row) { if (model->data && 0 <= row && row < model->data_count) { - return model->data[row]; + return e_contact_duplicate (model->data[row]); } return NULL; } static void -e_addressbook_model_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) +eab_model_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { - EAddressbookModel *model; + EABModel *model; - model = E_ADDRESSBOOK_MODEL (object); + model = EAB_MODEL (object); switch (prop_id){ case PROP_BOOK: @@ -564,10 +550,11 @@ e_addressbook_model_set_property (GObject *object, guint prop_id, const GValue * } model->book = E_BOOK(g_value_get_object (value)); if (model->book) { + if (!model->editable_set) + model->editable = e_book_is_writable (model->book); model->first_get_view = TRUE; g_object_ref (model->book); - if (model->get_view_idle == 0) - model->get_view_idle = g_idle_add((GSourceFunc)get_view, model); + get_view (model); g_signal_connect (model->book, "writable_status", G_CALLBACK (writable_status), model); @@ -578,10 +565,9 @@ e_addressbook_model_set_property (GObject *object, guint prop_id, const GValue * break; case PROP_QUERY: if (model->query) - g_free(model->query); - model->query = g_strdup(g_value_get_string (value)); - if (model->get_view_idle == 0) - model->get_view_idle = g_idle_add((GSourceFunc)get_view, model); + e_book_query_unref (model->query); + model->query = e_book_query_from_string (g_value_get_string (value)); + get_view (model); break; case PROP_EDITABLE: model->editable = g_value_get_boolean (value); @@ -594,21 +580,23 @@ e_addressbook_model_set_property (GObject *object, guint prop_id, const GValue * } static void -e_addressbook_model_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) +eab_model_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { - EAddressbookModel *e_addressbook_model; + EABModel *eab_model; - e_addressbook_model = E_ADDRESSBOOK_MODEL (object); + eab_model = EAB_MODEL (object); switch (prop_id) { case PROP_BOOK: - g_value_set_object (value, e_addressbook_model->book); + g_value_set_object (value, eab_model->book); break; - case PROP_QUERY: - g_value_set_string (value, g_strdup(e_addressbook_model->query)); + case PROP_QUERY: { + char *query_string = e_book_query_to_string (eab_model->query); + g_value_set_string (value, query_string); break; + } case PROP_EDITABLE: - g_value_set_boolean (value, e_addressbook_model->editable); + g_value_set_boolean (value, eab_model->editable); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); @@ -617,81 +605,81 @@ e_addressbook_model_get_property (GObject *object, guint prop_id, GValue *value, } GType -e_addressbook_model_get_type (void) +eab_model_get_type (void) { static GType type = 0; if (!type) { static const GTypeInfo info = { - sizeof (EAddressbookModelClass), + sizeof (EABModelClass), NULL, /* base_init */ NULL, /* base_finalize */ - (GClassInitFunc) e_addressbook_model_class_init, + (GClassInitFunc) eab_model_class_init, NULL, /* class_finalize */ NULL, /* class_data */ - sizeof (EAddressbookModel), + sizeof (EABModel), 0, /* n_preallocs */ - (GInstanceInitFunc) e_addressbook_model_init, + (GInstanceInitFunc) eab_model_init, }; - type = g_type_register_static (PARENT_TYPE, "EAddressbookModel", &info, 0); + type = g_type_register_static (PARENT_TYPE, "EABModel", &info, 0); } return type; } -EAddressbookModel* -e_addressbook_model_new (void) +EABModel* +eab_model_new (void) { - EAddressbookModel *et; + EABModel *et; - et = g_object_new (E_TYPE_ADDRESSBOOK_MODEL, NULL); + et = g_object_new (EAB_TYPE_MODEL, NULL); return et; } -void e_addressbook_model_stop (EAddressbookModel *model) +void eab_model_stop (EABModel *model) { remove_book_view(model); g_signal_emit (model, - e_addressbook_model_signals [STOP_STATE_CHANGED], 0); + eab_model_signals [STOP_STATE_CHANGED], 0); g_signal_emit (model, - e_addressbook_model_signals [STATUS_MESSAGE], 0, + eab_model_signals [STATUS_MESSAGE], 0, "Search Interrupted."); } gboolean -e_addressbook_model_can_stop (EAddressbookModel *model) +eab_model_can_stop (EABModel *model) { return model->search_in_progress; } void -e_addressbook_model_force_folder_bar_message (EAddressbookModel *model) +eab_model_force_folder_bar_message (EABModel *model) { update_folder_bar_message (model); } int -e_addressbook_model_card_count (EAddressbookModel *model) +eab_model_contact_count (EABModel *model) { return model->data_count; } -ECard * -e_addressbook_model_card_at (EAddressbookModel *model, int index) +const EContact * +eab_model_contact_at (EABModel *model, int index) { return model->data[index]; } gboolean -e_addressbook_model_editable (EAddressbookModel *model) +eab_model_editable (EABModel *model) { return model->editable; } EBook * -e_addressbook_model_get_ebook (EAddressbookModel *model) +eab_model_get_ebook (EABModel *model) { return model->book; } diff --git a/addressbook/gui/widgets/e-addressbook-model.h b/addressbook/gui/widgets/e-addressbook-model.h index 57cfe6f729..35f9d0e87f 100644 --- a/addressbook/gui/widgets/e-addressbook-model.h +++ b/addressbook/gui/widgets/e-addressbook-model.h @@ -1,37 +1,34 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -#ifndef _E_ADDRESSBOOK_MODEL_H_ -#define _E_ADDRESSBOOK_MODEL_H_ +#ifndef _EAB_MODEL_H_ +#define _EAB_MODEL_H_ #include #include -#include "addressbook/backend/ebook/e-book.h" +#include "addressbook/backend/ebook/e-book-async.h" #include "addressbook/backend/ebook/e-book-view.h" -#include "addressbook/backend/ebook/e-card-simple.h" -#define E_TYPE_ADDRESSBOOK_MODEL (e_addressbook_model_get_type ()) -#define E_ADDRESSBOOK_MODEL(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), E_TYPE_ADDRESSBOOK_MODEL, EAddressbookModel)) -#define E_ADDRESSBOOK_MODEL_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), E_TYPE_ADDRESSBOOK_MODEL, EAddressbookModelClass)) -#define E_IS_ADDRESSBOOK_MODEL(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), E_TYPE_ADDRESSBOOK_MODEL)) -#define E_IS_ADDRESSBOOK_MODEL_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), E_TYPE_ADDRESSBOOK_MODEL)) +#define EAB_TYPE_MODEL (eab_model_get_type ()) +#define EAB_MODEL(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), EAB_TYPE_MODEL, EABModel)) +#define EAB_MODEL_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), EAB_TYPE_MODEL, EABModelClass)) +#define E_IS_ADDRESSBOOK_MODEL(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), EAB_TYPE_MODEL)) +#define E_IS_ADDRESSBOOK_MODEL_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), EAB_TYPE_MODEL)) -typedef struct _EAddressbookModel EAddressbookModel; -typedef struct _EAddressbookModelClass EAddressbookModelClass; +typedef struct _EABModel EABModel; +typedef struct _EABModelClass EABModelClass; -struct _EAddressbookModel { +struct _EABModel { GObject parent; /* item specific fields */ EBook *book; - char *query; + EBookQuery *query; EBookView *book_view; - int get_view_idle; - - ECard **data; + EContact **data; int data_count; int allocated_count; - int create_card_id, remove_card_id, modify_card_id; + int create_contact_id, remove_contact_id, modify_contact_id; int status_message_id, writable_status_id, sequence_complete_id; int backend_died_id; @@ -42,44 +39,42 @@ struct _EAddressbookModel { }; -struct _EAddressbookModelClass { +struct _EABModelClass { GObjectClass parent_class; /* * Signals */ - void (*writable_status) (EAddressbookModel *model, gboolean writable); - void (*search_started) (EAddressbookModel *model); - void (*search_result) (EAddressbookModel *model, EBookViewStatus status); - void (*status_message) (EAddressbookModel *model, const gchar *message); - void (*folder_bar_message) (EAddressbookModel *model, const gchar *message); - void (*card_added) (EAddressbookModel *model, gint index, gint count); - void (*card_removed) (EAddressbookModel *model, gint index); - void (*card_changed) (EAddressbookModel *model, gint index); - void (*model_changed) (EAddressbookModel *model); - void (*stop_state_changed) (EAddressbookModel *model); - void (*backend_died) (EAddressbookModel *model); + void (*writable_status) (EABModel *model, gboolean writable); + void (*search_started) (EABModel *model); + void (*search_result) (EABModel *model, EBookViewStatus status); + void (*status_message) (EABModel *model, const gchar *message); + void (*folder_bar_message) (EABModel *model, const gchar *message); + void (*contact_added) (EABModel *model, gint index, gint count); + void (*contact_removed) (EABModel *model, gint index); + void (*contact_changed) (EABModel *model, gint index); + void (*model_changed) (EABModel *model); + void (*stop_state_changed) (EABModel *model); + void (*backend_died) (EABModel *model); }; -GType e_addressbook_model_get_type (void); -EAddressbookModel *e_addressbook_model_new (void); +GType eab_model_get_type (void); +EABModel *eab_model_new (void); /* Returns object with ref count of 1. */ -ECard *e_addressbook_model_get_card (EAddressbookModel *model, - int row); -const ECard *e_addressbook_model_peek_card (EAddressbookModel *model, - int row); -EBook *e_addressbook_model_get_ebook (EAddressbookModel *model); +EContact *eab_model_get_contact (EABModel *model, + int row); +EBook *eab_model_get_ebook (EABModel *model); -void e_addressbook_model_stop (EAddressbookModel *model); -gboolean e_addressbook_model_can_stop (EAddressbookModel *model); +void eab_model_stop (EABModel *model); +gboolean eab_model_can_stop (EABModel *model); -void e_addressbook_model_force_folder_bar_message (EAddressbookModel *model); +void eab_model_force_folder_bar_message (EABModel *model); -int e_addressbook_model_card_count (EAddressbookModel *model); -ECard *e_addressbook_model_card_at (EAddressbookModel *model, - int index); -gboolean e_addressbook_model_editable (EAddressbookModel *model); +int eab_model_contact_count (EABModel *model); +const EContact *eab_model_contact_at (EABModel *model, + int index); +gboolean eab_model_editable (EABModel *model); -#endif /* _E_ADDRESSBOOK_MODEL_H_ */ +#endif /* _EAB_MODEL_H_ */ diff --git a/addressbook/gui/widgets/e-addressbook-reflow-adapter.c b/addressbook/gui/widgets/e-addressbook-reflow-adapter.c index a4cb9364b5..cf1667fec5 100644 --- a/addressbook/gui/widgets/e-addressbook-reflow-adapter.c +++ b/addressbook/gui/widgets/e-addressbook-reflow-adapter.c @@ -5,26 +5,25 @@ #include #include -#include "e-addressbook-marshal.h" +#include "eab-marshal.h" #include "e-addressbook-reflow-adapter.h" #include "e-addressbook-model.h" #include "e-addressbook-view.h" -#include "e-addressbook-util.h" +#include "eab-gui-util.h" #include "e-minicard.h" #include #include -#include "e-contact-save-as.h" #include "addressbook/printing/e-contact-print.h" #include "addressbook/printing/e-contact-print-envelope.h" struct _EAddressbookReflowAdapterPrivate { - EAddressbookModel *model; + EABModel *model; gboolean loading; - int create_card_id, remove_card_id, modify_card_id, model_changed_id; + int create_contact_id, remove_contact_id, modify_contact_id, model_changed_id; int search_started_id, search_result_id; }; @@ -53,15 +52,15 @@ unlink_model(EAddressbookReflowAdapter *adapter) { EAddressbookReflowAdapterPrivate *priv = adapter->priv; - if (priv->model && priv->create_card_id) + if (priv->model && priv->create_contact_id) g_signal_handler_disconnect (priv->model, - priv->create_card_id); - if (priv->model && priv->remove_card_id) + priv->create_contact_id); + if (priv->model && priv->remove_contact_id) g_signal_handler_disconnect (priv->model, - priv->remove_card_id); - if (priv->model && priv->modify_card_id) + priv->remove_contact_id); + if (priv->model && priv->modify_contact_id) g_signal_handler_disconnect (priv->model, - priv->modify_card_id); + priv->modify_contact_id); if (priv->model && priv->model_changed_id) g_signal_handler_disconnect (priv->model, priv->model_changed_id); @@ -72,9 +71,9 @@ unlink_model(EAddressbookReflowAdapter *adapter) g_signal_handler_disconnect (priv->model, priv->search_result_id); - priv->create_card_id = 0; - priv->remove_card_id = 0; - priv->modify_card_id = 0; + priv->create_contact_id = 0; + priv->remove_contact_id = 0; + priv->modify_contact_id = 0; priv->model_changed_id = 0; priv->search_started_id = 0; priv->search_result_id = 0; @@ -104,20 +103,6 @@ addressbook_dispose(GObject *object) EAddressbookReflowAdapter *adapter = E_ADDRESSBOOK_REFLOW_ADAPTER(object); unlink_model (adapter); - - if (G_OBJECT_CLASS (parent_class)->dispose) - (* G_OBJECT_CLASS (parent_class)->dispose) (object); -} - -static void -addressbook_finalize(GObject *object) -{ - EAddressbookReflowAdapter *adapter = E_ADDRESSBOOK_REFLOW_ADAPTER(object); - - g_free (adapter->priv); - - if (G_OBJECT_CLASS (parent_class)->finalize) - (* G_OBJECT_CLASS (parent_class)->finalize) (object); } static void @@ -132,37 +117,37 @@ addressbook_count (EReflowModel *erm) EAddressbookReflowAdapter *adapter = E_ADDRESSBOOK_REFLOW_ADAPTER(erm); EAddressbookReflowAdapterPrivate *priv = adapter->priv; - return e_addressbook_model_card_count (priv->model); + return eab_model_contact_count (priv->model); } -/* This function returns the height of the minicard in question */ +/* This function returns the height of the minicontact in question */ static int addressbook_height (EReflowModel *erm, int i, GnomeCanvasGroup *parent) { EAddressbookReflowAdapter *adapter = E_ADDRESSBOOK_REFLOW_ADAPTER(erm); EAddressbookReflowAdapterPrivate *priv = adapter->priv; - ECardSimpleField field; + EContactField field; int count = 0; char *string; - ECardSimple *simple = e_card_simple_new (e_addressbook_model_card_at (priv->model, i)); + EContact *contact = (EContact*)eab_model_contact_at (priv->model, i); PangoLayout *layout = gtk_widget_create_pango_layout (GTK_WIDGET (GNOME_CANVAS_ITEM (parent)->canvas), ""); int height; - string = e_card_simple_get(simple, E_CARD_SIMPLE_FIELD_FILE_AS); + string = e_contact_get(contact, E_CONTACT_FILE_AS); height = text_height (layout, string ? string : "") + 10.0; g_free(string); - for(field = E_CARD_SIMPLE_FIELD_FULL_NAME; field != E_CARD_SIMPLE_FIELD_LAST_SIMPLE_STRING && count < 5; field++) { + for(field = E_CONTACT_FULL_NAME; field != E_CONTACT_LAST_SIMPLE_STRING && count < 5; field++) { - if (field == E_CARD_SIMPLE_FIELD_FAMILY_NAME) + if (field == E_CONTACT_FAMILY_NAME || field == E_CONTACT_GIVEN_NAME) continue; - string = e_card_simple_get(simple, field); + string = e_contact_get(contact, field); if (string && *string) { int this_height; int field_text_height; - this_height = text_height (layout, e_card_simple_get_name(simple, field)); + this_height = text_height (layout, e_contact_pretty_name(field)); field_text_height = text_height (layout, string); if (this_height < field_text_height) @@ -177,7 +162,6 @@ addressbook_height (EReflowModel *erm, int i, GnomeCanvasGroup *parent) } height += 2; - g_object_unref (simple); g_object_unref (layout); return height; @@ -188,30 +172,31 @@ addressbook_compare (EReflowModel *erm, int n1, int n2) { EAddressbookReflowAdapter *adapter = E_ADDRESSBOOK_REFLOW_ADAPTER(erm); EAddressbookReflowAdapterPrivate *priv = adapter->priv; - ECard *card1, *card2; + EContact *contact1, *contact2; if (priv->loading) { return n1-n2; } else { - card1 = e_addressbook_model_card_at (priv->model, n1); - card2 = e_addressbook_model_card_at (priv->model, n2); + contact1 = (EContact*)eab_model_contact_at (priv->model, n1); + contact2 = (EContact*)eab_model_contact_at (priv->model, n2); - if (card1 && card2) { - char *file_as1, *file_as2; - file_as1 = card1->file_as; - file_as2 = card2->file_as; + if (contact1 && contact2) { + const char *file_as1, *file_as2; + file_as1 = e_contact_get_const (contact1, E_CONTACT_FILE_AS); + file_as2 = e_contact_get_const (contact2, E_CONTACT_FILE_AS); if (file_as1 && file_as2) return g_utf8_collate(file_as1, file_as2); if (file_as1) return -1; if (file_as2) return 1; - return strcmp(e_card_get_id(card1), e_card_get_id(card2)); + return strcmp(e_contact_get_const (contact1, E_CONTACT_UID), + e_contact_get_const (contact2, E_CONTACT_UID)); } - if (card1) + if (contact1) return -1; - if (card2) + if (contact2) return 1; return 0; } @@ -238,8 +223,8 @@ addressbook_incarnate (EReflowModel *erm, int i, GnomeCanvasGroup *parent) item = gnome_canvas_item_new(parent, e_minicard_get_type(), - "card", e_addressbook_model_card_at (priv->model, i), - "editable", e_addressbook_model_editable (priv->model), + "contact", eab_model_contact_at (priv->model, i), + "editable", eab_model_editable (priv->model), NULL); #if 0 @@ -260,14 +245,14 @@ addressbook_reincarnate (EReflowModel *erm, int i, GnomeCanvasItem *item) EAddressbookReflowAdapterPrivate *priv = adapter->priv; gnome_canvas_item_set(item, - "card", e_addressbook_model_card_at (priv->model, i), + "contact", eab_model_contact_at (priv->model, i), NULL); } static void -create_card (EAddressbookModel *model, - gint index, gint count, - EAddressbookReflowAdapter *adapter) +create_contact (EABModel *model, + gint index, gint count, + EAddressbookReflowAdapter *adapter) { e_reflow_model_items_inserted (E_REFLOW_MODEL (adapter), index, @@ -275,30 +260,30 @@ create_card (EAddressbookModel *model, } static void -remove_card (EAddressbookModel *model, - gint index, - EAddressbookReflowAdapter *adapter) +remove_contact (EABModel *model, + gint index, + EAddressbookReflowAdapter *adapter) { e_reflow_model_item_removed (E_REFLOW_MODEL (adapter), index); } static void -modify_card (EAddressbookModel *model, - gint index, - EAddressbookReflowAdapter *adapter) +modify_contact (EABModel *model, + gint index, + EAddressbookReflowAdapter *adapter) { e_reflow_model_item_changed (E_REFLOW_MODEL (adapter), index); } static void -model_changed (EAddressbookModel *model, +model_changed (EABModel *model, EAddressbookReflowAdapter *adapter) { e_reflow_model_changed (E_REFLOW_MODEL (adapter)); } static void -search_started (EAddressbookModel *model, +search_started (EABModel *model, EAddressbookReflowAdapter *adapter) { EAddressbookReflowAdapterPrivate *priv = adapter->priv; @@ -307,7 +292,7 @@ search_started (EAddressbookModel *model, } static void -search_result (EAddressbookModel *model, +search_result (EABModel *model, EBookViewStatus status, EAddressbookReflowAdapter *adapter) { @@ -387,7 +372,6 @@ e_addressbook_reflow_adapter_class_init (GObjectClass *object_class) object_class->set_property = addressbook_set_property; object_class->get_property = addressbook_get_property; object_class->dispose = addressbook_dispose; - object_class->finalize = addressbook_finalize; g_object_class_install_property (object_class, PROP_BOOK, g_param_spec_object ("book", @@ -414,7 +398,7 @@ e_addressbook_reflow_adapter_class_init (GObjectClass *object_class) g_param_spec_object ("model", _("Model"), /*_( */"XXX blurb" /*)*/, - E_TYPE_ADDRESSBOOK_MODEL, + EAB_TYPE_MODEL, G_PARAM_READABLE)); e_addressbook_reflow_adapter_signals [DRAG_BEGIN] = @@ -423,7 +407,7 @@ e_addressbook_reflow_adapter_class_init (GObjectClass *object_class) G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (EAddressbookReflowAdapterClass, drag_begin), NULL, NULL, - e_addressbook_marshal_INT__POINTER, + eab_marshal_INT__POINTER, G_TYPE_INT, 1, G_TYPE_POINTER); model_class->set_width = addressbook_set_width; @@ -443,9 +427,9 @@ e_addressbook_reflow_adapter_init (GtkObject *object) priv = adapter->priv = g_new0 (EAddressbookReflowAdapterPrivate, 1); priv->loading = FALSE; - priv->create_card_id = 0; - priv->remove_card_id = 0; - priv->modify_card_id = 0; + priv->create_contact_id = 0; + priv->remove_contact_id = 0; + priv->modify_contact_id = 0; priv->model_changed_id = 0; priv->search_started_id = 0; priv->search_result_id = 0; @@ -477,24 +461,24 @@ e_addressbook_reflow_adapter_get_type (void) void e_addressbook_reflow_adapter_construct (EAddressbookReflowAdapter *adapter, - EAddressbookModel *model) + EABModel *model) { EAddressbookReflowAdapterPrivate *priv = adapter->priv; priv->model = model; g_object_ref (priv->model); - priv->create_card_id = g_signal_connect(priv->model, - "card_added", - G_CALLBACK(create_card), + priv->create_contact_id = g_signal_connect(priv->model, + "contact_added", + G_CALLBACK(create_contact), adapter); - priv->remove_card_id = g_signal_connect(priv->model, - "card_removed", - G_CALLBACK(remove_card), + priv->remove_contact_id = g_signal_connect(priv->model, + "contact_removed", + G_CALLBACK(remove_contact), adapter); - priv->modify_card_id = g_signal_connect(priv->model, - "card_changed", - G_CALLBACK(modify_card), + priv->modify_contact_id = g_signal_connect(priv->model, + "contact_changed", + G_CALLBACK(modify_contact), adapter); priv->model_changed_id = g_signal_connect(priv->model, "model_changed", @@ -511,7 +495,7 @@ e_addressbook_reflow_adapter_construct (EAddressbookReflowAdapter *adapter, } EReflowModel * -e_addressbook_reflow_adapter_new (EAddressbookModel *model) +e_addressbook_reflow_adapter_new (EABModel *model) { EAddressbookReflowAdapter *et; @@ -523,11 +507,11 @@ e_addressbook_reflow_adapter_new (EAddressbookModel *model) } -ECard * -e_addressbook_reflow_adapter_get_card (EAddressbookReflowAdapter *adapter, - int index) +EContact * +e_addressbook_reflow_adapter_get_contact (EAddressbookReflowAdapter *adapter, + int index) { EAddressbookReflowAdapterPrivate *priv = adapter->priv; - return e_addressbook_model_get_card (priv->model, index); + return eab_model_get_contact (priv->model, index); } diff --git a/addressbook/gui/widgets/e-addressbook-reflow-adapter.h b/addressbook/gui/widgets/e-addressbook-reflow-adapter.h index 4bf131bc5c..9ba7d2cf2d 100644 --- a/addressbook/gui/widgets/e-addressbook-reflow-adapter.h +++ b/addressbook/gui/widgets/e-addressbook-reflow-adapter.h @@ -3,11 +3,8 @@ #define _E_ADDRESSBOOK_REFLOW_ADAPTER_H_ #include -#include #include "e-addressbook-model.h" -#include "addressbook/backend/ebook/e-book.h" -#include "addressbook/backend/ebook/e-book-view.h" -#include "addressbook/backend/ebook/e-card.h" +#include "addressbook/backend/ebook/e-contact.h" #define E_TYPE_ADDRESSBOOK_REFLOW_ADAPTER (e_addressbook_reflow_adapter_get_type ()) #define E_ADDRESSBOOK_REFLOW_ADAPTER(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), E_TYPE_ADDRESSBOOK_REFLOW_ADAPTER, EAddressbookReflowAdapter)) @@ -38,10 +35,10 @@ struct _EAddressbookReflowAdapterClass { GType e_addressbook_reflow_adapter_get_type (void); void e_addressbook_reflow_adapter_construct (EAddressbookReflowAdapter *adapter, - EAddressbookModel *model); -EReflowModel *e_addressbook_reflow_adapter_new (EAddressbookModel *model); + EABModel *model); +EReflowModel *e_addressbook_reflow_adapter_new (EABModel *model); /* Returns object with ref count of 1. */ -ECard *e_addressbook_reflow_adapter_get_card (EAddressbookReflowAdapter *adapter, +EContact *e_addressbook_reflow_adapter_get_contact (EAddressbookReflowAdapter *adapter, int index); #endif /* _E_ADDRESSBOOK_REFLOW_ADAPTER_H_ */ diff --git a/addressbook/gui/widgets/e-addressbook-table-adapter.c b/addressbook/gui/widgets/e-addressbook-table-adapter.c index 6a9e06da54..eb01b9b079 100644 --- a/addressbook/gui/widgets/e-addressbook-table-adapter.c +++ b/addressbook/gui/widgets/e-addressbook-table-adapter.c @@ -3,87 +3,52 @@ #include #include "e-addressbook-model.h" #include "e-addressbook-table-adapter.h" -#include "e-card-merging.h" -#include "e-addressbook-util.h" -#include "ebook/e-destination.h" +#include "eab-gui-util.h" +#include "util/eab-destination.h" #include #include #include #include struct _EAddressbookTableAdapterPrivate { - EAddressbookModel *model; + EABModel *model; - ECardSimple **simples; - int count; - - int create_card_id, remove_card_id, modify_card_id, model_changed_id; + int create_contact_id, remove_contact_id, modify_contact_id, model_changed_id; }; #define PARENT_TYPE e_table_model_get_type() static ETableModelClass *parent_class; -#define COLS (E_CARD_SIMPLE_FIELD_LAST) +#define COLS (E_CONTACT_FIELD_LAST) static void unlink_model(EAddressbookTableAdapter *adapter) { EAddressbookTableAdapterPrivate *priv = adapter->priv; - int i; g_signal_handler_disconnect (priv->model, - priv->create_card_id); + priv->create_contact_id); g_signal_handler_disconnect (priv->model, - priv->remove_card_id); + priv->remove_contact_id); g_signal_handler_disconnect (priv->model, - priv->modify_card_id); + priv->modify_contact_id); g_signal_handler_disconnect (priv->model, priv->model_changed_id); - priv->create_card_id = 0; - priv->remove_card_id = 0; - priv->modify_card_id = 0; + priv->create_contact_id = 0; + priv->remove_contact_id = 0; + priv->modify_contact_id = 0; priv->model_changed_id = 0; - /* free up the existing mapping if there is one */ - if (priv->simples) { - for (i = 0; i < priv->count; i ++) - g_object_unref (priv->simples[i]); - g_free (priv->simples); - priv->simples = NULL; - } - g_object_unref (priv->model); priv->model = NULL; } -static void -build_simple_mapping(EAddressbookTableAdapter *adapter) -{ - EAddressbookTableAdapterPrivate *priv = adapter->priv; - int i; - - /* free up the existing mapping if there is one */ - if (priv->simples) { - for (i = 0; i < priv->count; i ++) - g_object_unref (priv->simples[i]); - g_free (priv->simples); - } - - /* build up our mapping to ECardSimple*'s */ - priv->count = e_addressbook_model_card_count (priv->model); - priv->simples = g_new (ECardSimple*, priv->count); - for (i = 0; i < priv->count; i ++) { - priv->simples[i] = e_card_simple_new (e_addressbook_model_card_at (priv->model, i)); - g_object_ref (priv->simples[i]); - } -} - static void addressbook_dispose(GObject *object) { - EAddressbookTableAdapter *adapter = E_ADDRESSBOOK_TABLE_ADAPTER(object); + EAddressbookTableAdapter *adapter = EAB_TABLE_ADAPTER(object); if (adapter->priv) { unlink_model(adapter); @@ -107,30 +72,30 @@ addressbook_col_count (ETableModel *etc) static int addressbook_row_count (ETableModel *etc) { - EAddressbookTableAdapter *adapter = E_ADDRESSBOOK_TABLE_ADAPTER(etc); + EAddressbookTableAdapter *adapter = EAB_TABLE_ADAPTER(etc); EAddressbookTableAdapterPrivate *priv = adapter->priv; - return e_addressbook_model_card_count (priv->model); + return eab_model_contact_count (priv->model); } /* This function returns the value at a particular point in our ETableModel. */ static void * addressbook_value_at (ETableModel *etc, int col, int row) { - EAddressbookTableAdapter *adapter = E_ADDRESSBOOK_TABLE_ADAPTER(etc); + EAddressbookTableAdapter *adapter = EAB_TABLE_ADAPTER(etc); EAddressbookTableAdapterPrivate *priv = adapter->priv; const char *value; - if ( col >= COLS || row >= e_addressbook_model_card_count (priv->model) ) + if ( col >= COLS || row >= eab_model_contact_count (priv->model) ) return NULL; - value = e_card_simple_get_const(priv->simples[row], col); + value = e_contact_get_const((EContact*)eab_model_contact_at (priv->model, row), col); if (value && !strncmp (value, "priv; - if (e_addressbook_model_editable (priv->model)) { + if (eab_model_editable (priv->model)) { ECard *card; - if ( col >= COLS|| row >= e_addressbook_model_card_count (priv->model) ) + if ( col >= COLS|| row >= eab_model_card_count (priv->model) ) return; e_table_model_pre_change(etc); @@ -167,29 +136,31 @@ addressbook_set_value_at (ETableModel *etc, int col, int row, const void *val) "card", &card, NULL); - e_card_merging_book_commit_card(e_addressbook_model_get_ebook(priv->model), + e_card_merging_book_commit_card(eab_model_get_ebook(priv->model), card, card_modified_cb, NULL); g_object_unref (card); /* XXX do we need this? shouldn't the commit_card generate a changed signal? */ e_table_model_cell_changed(etc, col, row); } +#endif } /* This function returns whether a particular cell is editable. */ static gboolean addressbook_is_cell_editable (ETableModel *etc, int col, int row) { - EAddressbookTableAdapter *adapter = E_ADDRESSBOOK_TABLE_ADAPTER(etc); +#if 0 + EAddressbookTableAdapter *adapter = EAB_TABLE_ADAPTER(etc); EAddressbookTableAdapterPrivate *priv = adapter->priv; ECard *card; - if (row >= 0 && row < e_addressbook_model_card_count (priv->model)) - card = e_addressbook_model_card_at (priv->model, row); + if (row >= 0 && row < eab_model_card_count (priv->model)) + card = eab_model_card_at (priv->model, row); else card = NULL; - if (!e_addressbook_model_editable(priv->model)) + if (!eab_model_editable(priv->model)) return FALSE; else if (card && e_card_evolution_list (card)) /* we only allow editing of the name and file as for @@ -197,12 +168,16 @@ addressbook_is_cell_editable (ETableModel *etc, int col, int row) return col == E_CARD_SIMPLE_FIELD_FULL_NAME || col == E_CARD_SIMPLE_FIELD_FILE_AS; else return col < E_CARD_SIMPLE_FIELD_LAST_SIMPLE_STRING; +#else + return FALSE; +#endif } static void addressbook_append_row (ETableModel *etm, ETableModel *source, gint row) { - EAddressbookTableAdapter *adapter = E_ADDRESSBOOK_TABLE_ADAPTER(etm); +#if 0 + EAddressbookTableAdapter *adapter = EAB_TABLE_ADAPTER(etm); EAddressbookTableAdapterPrivate *priv = adapter->priv; ECard *card; ECardSimple *simple; @@ -216,9 +191,10 @@ addressbook_append_row (ETableModel *etm, ETableModel *source, gint row) e_card_simple_set(simple, col, val); } e_card_simple_sync_card(simple); - e_card_merging_book_add_card (e_addressbook_model_get_ebook (priv->model), card, NULL, NULL); + e_card_merging_book_add_card (eab_model_get_ebook (priv->model), card, NULL, NULL); g_object_unref (simple); g_object_unref (card); +#endif } /* This function duplicates the value passed to it. */ @@ -254,7 +230,7 @@ addressbook_value_to_string (ETableModel *etc, int col, const void *value) } static void -e_addressbook_table_adapter_class_init (GObjectClass *object_class) +eab_table_adapter_class_init (GObjectClass *object_class) { ETableModelClass *model_class = (ETableModelClass *) object_class; @@ -276,82 +252,57 @@ e_addressbook_table_adapter_class_init (GObjectClass *object_class) } static void -e_addressbook_table_adapter_init (GObject *object) +eab_table_adapter_init (GObject *object) { - EAddressbookTableAdapter *adapter = E_ADDRESSBOOK_TABLE_ADAPTER(object); + EAddressbookTableAdapter *adapter = EAB_TABLE_ADAPTER(object); EAddressbookTableAdapterPrivate *priv; priv = adapter->priv = g_new0 (EAddressbookTableAdapterPrivate, 1); - priv->create_card_id = 0; - priv->remove_card_id = 0; - priv->modify_card_id = 0; + priv->create_contact_id = 0; + priv->remove_contact_id = 0; + priv->modify_contact_id = 0; priv->model_changed_id = 0; - priv->simples = NULL; - priv->count = 0; } static void -create_card (EAddressbookModel *model, - gint index, gint count, - EAddressbookTableAdapter *adapter) +create_contact (EABModel *model, + gint index, gint count, + EAddressbookTableAdapter *adapter) { - EAddressbookTableAdapterPrivate *priv = adapter->priv; - int i; - - priv->count += count; - priv->simples = g_renew(ECardSimple *, priv->simples, priv->count); - memmove (priv->simples + index + count, priv->simples + index, (priv->count - index - count) * sizeof (ECardSimple *)); - e_table_model_pre_change (E_TABLE_MODEL (adapter)); - for (i = 0; i < count; i ++) { - priv->simples[index + i] = e_card_simple_new (e_addressbook_model_card_at (priv->model, index + i)); - } e_table_model_rows_inserted (E_TABLE_MODEL (adapter), index, count); } static void -remove_card (EAddressbookModel *model, - gint index, - EAddressbookTableAdapter *adapter) +remove_contact (EABModel *model, + gint index, + EAddressbookTableAdapter *adapter) { - EAddressbookTableAdapterPrivate *priv = adapter->priv; - e_table_model_pre_change (E_TABLE_MODEL (adapter)); - - g_object_unref (priv->simples[index]); - memmove (priv->simples + index, priv->simples + index + 1, (priv->count - index - 1) * sizeof (ECardSimple *)); - priv->count --; e_table_model_rows_deleted (E_TABLE_MODEL (adapter), index, 1); } static void -modify_card (EAddressbookModel *model, - gint index, - EAddressbookTableAdapter *adapter) +modify_contact (EABModel *model, + gint index, + EAddressbookTableAdapter *adapter) { - EAddressbookTableAdapterPrivate *priv = adapter->priv; - e_table_model_pre_change (E_TABLE_MODEL (adapter)); - - g_object_unref (priv->simples[index]); - priv->simples[index] = e_card_simple_new (e_addressbook_model_card_at (priv->model, index)); - g_object_ref (priv->simples[index]); e_table_model_row_changed (E_TABLE_MODEL (adapter), index); } static void -model_changed (EAddressbookModel *model, +model_changed (EABModel *model, EAddressbookTableAdapter *adapter) { e_table_model_pre_change (E_TABLE_MODEL (adapter)); - build_simple_mapping (adapter); e_table_model_changed (E_TABLE_MODEL (adapter)); } GType -e_addressbook_table_adapter_get_type (void) +eab_table_adapter_get_type (void) { static GType type = 0; @@ -360,12 +311,12 @@ e_addressbook_table_adapter_get_type (void) sizeof (EAddressbookTableAdapterClass), NULL, /* base_init */ NULL, /* base_finalize */ - (GClassInitFunc) e_addressbook_table_adapter_class_init, + (GClassInitFunc) eab_table_adapter_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (EAddressbookTableAdapter), 0, /* n_preallocs */ - (GInstanceInitFunc) e_addressbook_table_adapter_init, + (GInstanceInitFunc) eab_table_adapter_init, }; type = g_type_register_static (PARENT_TYPE, "EAddressbookTableAdapter", &info, 0); @@ -375,42 +326,40 @@ e_addressbook_table_adapter_get_type (void) } void -e_addressbook_table_adapter_construct (EAddressbookTableAdapter *adapter, - EAddressbookModel *model) +eab_table_adapter_construct (EAddressbookTableAdapter *adapter, + EABModel *model) { EAddressbookTableAdapterPrivate *priv = adapter->priv; priv->model = model; g_object_ref (priv->model); - priv->create_card_id = g_signal_connect(priv->model, - "card_added", - G_CALLBACK(create_card), - adapter); - priv->remove_card_id = g_signal_connect(priv->model, - "card_removed", - G_CALLBACK(remove_card), - adapter); - priv->modify_card_id = g_signal_connect(priv->model, - "card_changed", - G_CALLBACK(modify_card), - adapter); + priv->create_contact_id = g_signal_connect(priv->model, + "contact_added", + G_CALLBACK(create_contact), + adapter); + priv->remove_contact_id = g_signal_connect(priv->model, + "contact_removed", + G_CALLBACK(remove_contact), + adapter); + priv->modify_contact_id = g_signal_connect(priv->model, + "contact_changed", + G_CALLBACK(modify_contact), + adapter); priv->model_changed_id = g_signal_connect(priv->model, "model_changed", G_CALLBACK(model_changed), adapter); - - build_simple_mapping (adapter); } ETableModel * -e_addressbook_table_adapter_new (EAddressbookModel *model) +eab_table_adapter_new (EABModel *model) { EAddressbookTableAdapter *et; - et = g_object_new(E_TYPE_ADDRESSBOOK_TABLE_ADAPTER, NULL); + et = g_object_new(E_TYPE_AB_TABLE_ADAPTER, NULL); - e_addressbook_table_adapter_construct (et, model); + eab_table_adapter_construct (et, model); return E_TABLE_MODEL(et); } diff --git a/addressbook/gui/widgets/e-addressbook-table-adapter.h b/addressbook/gui/widgets/e-addressbook-table-adapter.h index df66e1dce9..6f4bfd2960 100644 --- a/addressbook/gui/widgets/e-addressbook-table-adapter.h +++ b/addressbook/gui/widgets/e-addressbook-table-adapter.h @@ -1,24 +1,16 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -#ifndef _E_ADDRESSBOOK_TABLE_ADAPTER_H_ -#define _E_ADDRESSBOOK_TABLE_ADAPTER_H_ +#ifndef _EAB_TABLE_ADAPTER_H_ +#define _EAB_TABLE_ADAPTER_H_ #include #include "addressbook/backend/ebook/e-book.h" #include "addressbook/backend/ebook/e-book-view.h" -#include "addressbook/backend/ebook/e-card-simple.h" -#define E_TYPE_ADDRESSBOOK_TABLE_ADAPTER (e_addressbook_table_adapter_get_type ()) -#define E_ADDRESSBOOK_TABLE_ADAPTER(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), E_TYPE_ADDRESSBOOK_TABLE_ADAPTER, EAddressbookTableAdapter)) -#define E_ADDRESSBOOK_TABLE_ADAPTER_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), E_TYPE_ADDRESSBOOK_TABLE_ADAPTER, EAddressbookTableAdapterClass)) -#define E_IS_ADDRESSBOOK_TABLE_ADAPTER(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), E_TYPE_ADDRESSBOOK_TABLE_ADAPTER)) -#define E_IS_ADDRESSBOOK_TABLE_ADAPTER_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), E_TYPE_ADDRESSBOOK_TABLE_ADAPTER)) - -/* Virtual Column list: - 0 Email - 1 Full Name - 2 Street - 3 Phone -*/ +#define E_TYPE_AB_TABLE_ADAPTER (eab_table_adapter_get_type ()) +#define EAB_TABLE_ADAPTER(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), E_TYPE_AB_TABLE_ADAPTER, EAddressbookTableAdapter)) +#define EAB_TABLE_ADAPTER_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), E_TYPE_AB_TABLE_ADAPTER, EAddressbookTableAdapterClass)) +#define E_IS_ADDRESSBOOK_TABLE_ADAPTER(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), E_TYPE_AB_TABLE_ADAPTER)) +#define E_IS_ADDRESSBOOK_TABLE_ADAPTER_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), E_TYPE_AB_TABLE_ADAPTER)) typedef struct _EAddressbookTableAdapter EAddressbookTableAdapter; typedef struct _EAddressbookTableAdapterPrivate EAddressbookTableAdapterPrivate; @@ -36,9 +28,9 @@ struct _EAddressbookTableAdapterClass { }; -GType e_addressbook_table_adapter_get_type (void); -void e_addressbook_table_adapter_construct (EAddressbookTableAdapter *adapter, - EAddressbookModel *model); -ETableModel *e_addressbook_table_adapter_new (EAddressbookModel *model); +GType eab_table_adapter_get_type (void); +void eab_table_adapter_construct (EAddressbookTableAdapter *adapter, + EABModel *model); +ETableModel *eab_table_adapter_new (EABModel *model); -#endif /* _E_ADDRESSBOOK_TABLE_ADAPTER_H_ */ +#endif /* _EAB_TABLE_ADAPTER_H_ */ diff --git a/addressbook/gui/widgets/e-addressbook-treeview-adapter.c b/addressbook/gui/widgets/e-addressbook-treeview-adapter.c index ab1a559f0c..592f9d2b03 100644 --- a/addressbook/gui/widgets/e-addressbook-treeview-adapter.c +++ b/addressbook/gui/widgets/e-addressbook-treeview-adapter.c @@ -4,7 +4,7 @@ #include "e-addressbook-model.h" #include "e-addressbook-treeview-adapter.h" #include "e-card-merging.h" -#include "e-addressbook-util.h" +#include "eab-gui-util.h" #include #include #include @@ -380,10 +380,10 @@ adapter_get_value (GtkTreeModel *tree_model, v = e_card_simple_get_const(simple, column); if (v && !strncmp (v, " - * - * 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 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 library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#include -#include "e-addressbook-util.h" -#include "ebook/e-destination.h" - -#include -#include - -#include "e-card-merging.h" -#include -#include - -void -e_addressbook_error_dialog (const gchar *msg, EBookStatus status) -{ - static char *status_to_string[] = { - N_("Success"), - N_("Unknown error"), - N_("Repository offline"), - N_("Permission denied"), - N_("Card not found"), - N_("Card ID already exists"), - N_("Protocol not supported"), - N_("Cancelled"), - N_("Authentication Failed"), - N_("Authentication Required"), - N_("TLS not Available"), - N_("Addressbook does not exist"), - N_("Other error") - }; - char *error_msg; - GtkWidget *dialog; - - error_msg = g_strdup_printf ("%s: %s", msg, _(status_to_string [status])); - - dialog = gtk_message_dialog_new (NULL, 0, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, - error_msg); - - g_signal_connect (dialog, "response", G_CALLBACK (gtk_widget_destroy), NULL); - - gtk_widget_show (dialog); - - g_free (error_msg); -} - -gint -e_addressbook_prompt_save_dialog (GtkWindow *parent) -{ - GtkWidget *dialog; - gint response; - - dialog = gtk_message_dialog_new (parent, - (GtkDialogFlags)0, - GTK_MESSAGE_QUESTION, - GTK_BUTTONS_NONE, - _("Do you want to save changes?")); - gtk_dialog_add_buttons (GTK_DIALOG (dialog), - _("_Discard"), GTK_RESPONSE_NO, - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - GTK_STOCK_SAVE, GTK_RESPONSE_YES, - NULL); - - gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_YES); - - response = gtk_dialog_run (GTK_DIALOG (dialog)); - - gtk_widget_destroy (dialog); - - return response; -} - -static void -added_cb (EBook* book, EBookStatus status, const char *id, - gboolean is_list) -{ - if (status != E_BOOK_STATUS_SUCCESS) { - e_addressbook_error_dialog (is_list ? _("Error adding list") : _("Error adding card"), status); - } -} - -static void -modified_cb (EBook* book, EBookStatus status, - gboolean is_list) -{ - if (status != E_BOOK_STATUS_SUCCESS) { - e_addressbook_error_dialog (is_list ? _("Error modifying list") : _("Error modifying card"), - status); - } -} - -static void -deleted_cb (EBook* book, EBookStatus status, - gboolean is_list) -{ - if (status != E_BOOK_STATUS_SUCCESS) { - e_addressbook_error_dialog (is_list ? _("Error removing list") : _("Error removing card"), - status); - } -} - -static void -editor_closed_cb (GtkObject *editor, gpointer data) -{ - g_object_unref (editor); -} - -EContactEditor * -e_addressbook_show_contact_editor (EBook *book, ECard *card, - gboolean is_new_card, - gboolean editable) -{ - EContactEditor *ce; - - ce = e_contact_editor_new (book, card, is_new_card, editable); - - g_signal_connect (ce, "card_added", - G_CALLBACK (added_cb), GINT_TO_POINTER (FALSE)); - g_signal_connect (ce, "card_modified", - G_CALLBACK (modified_cb), GINT_TO_POINTER (FALSE)); - g_signal_connect (ce, "card_deleted", - G_CALLBACK (deleted_cb), GINT_TO_POINTER (FALSE)); - g_signal_connect (ce, "editor_closed", - G_CALLBACK (editor_closed_cb), NULL); - - return ce; -} - -EContactListEditor * -e_addressbook_show_contact_list_editor (EBook *book, ECard *card, - gboolean is_new_card, - gboolean editable) -{ - EContactListEditor *ce; - - ce = e_contact_list_editor_new (book, card, is_new_card, editable); - - g_signal_connect (ce, "list_added", - G_CALLBACK (added_cb), GINT_TO_POINTER (TRUE)); - g_signal_connect (ce, "list_modified", - G_CALLBACK (modified_cb), GINT_TO_POINTER (TRUE)); - g_signal_connect (ce, "list_deleted", - G_CALLBACK (deleted_cb), GINT_TO_POINTER (TRUE)); - g_signal_connect (ce, "editor_closed", - G_CALLBACK (editor_closed_cb), GINT_TO_POINTER (TRUE)); - - e_contact_list_editor_show (ce); - - return ce; -} - -static void -view_cards (EBook *book, GList *list, gboolean editable) -{ - for (; list; list = list->next) { - ECard *card = list->data; - if (e_card_evolution_list (card)) - e_addressbook_show_contact_list_editor (book, card, FALSE, editable); - else - e_addressbook_show_contact_editor (book, card, FALSE, editable); - } -} - -void -e_addressbook_show_multiple_cards (EBook *book, - GList *list, - gboolean editable) -{ - if (list) { - int length = g_list_length (list); - if (length > 5) { - GtkWidget *dialog; - gint response; - - dialog = gtk_message_dialog_new (NULL, - 0, - GTK_MESSAGE_QUESTION, - GTK_BUTTONS_YES_NO, - _("Opening %d cards will open %d new windows as well.\n" - "Do you really want to display all of these cards?"), - length, - length); - - response = gtk_dialog_run (GTK_DIALOG (dialog)); - gtk_widget_destroy (dialog); - if (response == GTK_RESPONSE_YES) - view_cards (book, list, editable); - } else { - view_cards (book, list, editable); - } - } -} - - - -typedef struct CardCopyProcess_ CardCopyProcess; - -typedef void (*CardCopyDone) (CardCopyProcess *process); - -struct CardCopyProcess_ { - int count; - GList *cards; - EBook *source; - EBook *destination; - CardCopyDone done_cb; -}; - -static void -card_deleted_cb (EBook* book, EBookStatus status, gpointer user_data) -{ - if (status != E_BOOK_STATUS_SUCCESS) { - e_addressbook_error_dialog (_("Error removing card"), status); - } -} - -static void -do_delete (gpointer data, gpointer user_data) -{ - EBook *book = user_data; - ECard *card = data; - - e_book_remove_card(book, card, card_deleted_cb, NULL); -} - -static void -delete_cards (CardCopyProcess *process) -{ - g_list_foreach (process->cards, - do_delete, - process->source); -} - -static void -process_unref (CardCopyProcess *process) -{ - process->count --; - if (process->count == 0) { - if (process->done_cb) { - process->done_cb (process); - } - e_free_object_list(process->cards); - g_object_unref (process->source); - g_object_unref (process->destination); - g_free (process); - } -} - -static void -card_added_cb (EBook* book, EBookStatus status, const char *id, gpointer user_data) -{ - CardCopyProcess *process = user_data; - - if (status != E_BOOK_STATUS_SUCCESS) { - e_addressbook_error_dialog (_("Error adding card"), status); - } else { - process_unref (process); - } -} - -static void -do_copy (gpointer data, gpointer user_data) -{ - EBook *book; - ECard *card; - CardCopyProcess *process; - - process = user_data; - card = data; - - book = process->destination; - - process->count ++; - e_book_add_card(book, card, card_added_cb, process); -} - -static void -got_book_cb (EBook *book, gpointer closure) -{ - CardCopyProcess *process; - process = closure; - if (book) { - process->destination = book; - g_object_ref (book); - g_list_foreach (process->cards, - do_copy, - process); - } - process_unref (process); -} - -extern EvolutionShellClient *global_shell_client; - -void -e_addressbook_transfer_cards (EBook *source, GList *cards /* adopted */, gboolean delete_from_source, GtkWindow *parent_window) -{ - const char *allowed_types[] = { "contacts/*", NULL }; - GNOME_Evolution_Folder *folder; - static char *last_uri = NULL; - CardCopyProcess *process; - char *desc; - - if (cards == NULL) - return; - - if (last_uri == NULL) - last_uri = g_strdup (""); - - if (cards->next == NULL) { - if (delete_from_source) - desc = _("Move card to"); - else - desc = _("Copy card to"); - } else { - if (delete_from_source) - desc = _("Move cards to"); - else - desc = _("Copy cards to"); - } - - evolution_shell_client_user_select_folder (global_shell_client, - parent_window, - desc, last_uri, allowed_types, - &folder); - if (!folder) - return; - - if (strcmp (last_uri, folder->evolutionUri) != 0) { - g_free (last_uri); - last_uri = g_strdup (folder->evolutionUri); - } - - process = g_new (CardCopyProcess, 1); - process->count = 1; - process->source = source; - g_object_ref (source); - process->cards = cards; - process->destination = NULL; - - if (delete_from_source) - process->done_cb = delete_cards; - else - process->done_cb = NULL; - - e_book_use_address_book_by_uri (folder->physicalUri, got_book_cb, process); - - CORBA_free (folder); -} - -#include - -#define COMPOSER_OAFID "OAFIID:GNOME_Evolution_Mail_Composer" - -void -e_addressbook_send_card_list (GList *cards, EAddressbookDisposition disposition) -{ - GNOME_Evolution_Composer composer_server; - CORBA_Environment ev; - - if (cards == NULL) - return; - - CORBA_exception_init (&ev); - - composer_server = bonobo_activation_activate_from_id (COMPOSER_OAFID, 0, NULL, &ev); - - if (disposition == E_ADDRESSBOOK_DISPOSITION_AS_TO) { - GNOME_Evolution_Composer_RecipientList *to_list, *cc_list, *bcc_list; - CORBA_char *subject; - int to_i, bcc_i; - GList *iter; - gint to_length = 0, bcc_length = 0; - - /* Figure out how many addresses of each kind we have. */ - for (iter = cards; iter != NULL; iter = g_list_next (iter)) { - ECard *card = E_CARD (iter->data); - if (e_card_evolution_list (card)) { - gint len = card->email ? e_list_length (card->email) : 0; - if (e_card_evolution_list_show_addresses (card)) - to_length += len; - else - bcc_length += len; - } else { - if (card->email != NULL) - ++to_length; - } - } - - /* Now I have to make a CORBA sequences that represents a recipient list with - the right number of entries, for the cards. */ - to_list = GNOME_Evolution_Composer_RecipientList__alloc (); - to_list->_maximum = to_length; - to_list->_length = to_length; - if (to_length > 0) { - to_list->_buffer = CORBA_sequence_GNOME_Evolution_Composer_Recipient_allocbuf (to_length); - } - - cc_list = GNOME_Evolution_Composer_RecipientList__alloc (); - cc_list->_maximum = cc_list->_length = 0; - - bcc_list = GNOME_Evolution_Composer_RecipientList__alloc (); - bcc_list->_maximum = bcc_length; - bcc_list->_length = bcc_length; - if (bcc_length > 0) { - bcc_list->_buffer = CORBA_sequence_GNOME_Evolution_Composer_Recipient_allocbuf (bcc_length); - } - - to_i = 0; - bcc_i = 0; - while (cards != NULL) { - ECard *card = cards->data; - EIterator *iterator; - gchar *name, *addr; - gboolean is_list, is_hidden, free_name_addr; - GNOME_Evolution_Composer_Recipient *recipient; - - if (card->email != NULL) { - - is_list = e_card_evolution_list (card); - is_hidden = is_list && !e_card_evolution_list_show_addresses (card); - - for (iterator = e_list_get_iterator (card->email); e_iterator_is_valid (iterator); e_iterator_next (iterator)) { - - if (is_hidden) { - recipient = &(bcc_list->_buffer[bcc_i]); - ++bcc_i; - } else { - recipient = &(to_list->_buffer[to_i]); - ++to_i; - } - - name = ""; - addr = ""; - free_name_addr = FALSE; - if (e_iterator_is_valid (iterator)) { - - if (is_list) { - /* We need to decode the list entries, which are XMLified EDestinations. */ - EDestination *dest = e_destination_import (e_iterator_get (iterator)); - if (dest != NULL) { - name = g_strdup (e_destination_get_name (dest)); - addr = g_strdup (e_destination_get_email (dest)); - free_name_addr = TRUE; - g_object_unref (dest); - } - - } else { /* is just a plain old card */ - if (card->name) - name = e_card_name_to_string (card->name); - addr = g_strdup ((char *) e_iterator_get (iterator)); - free_name_addr = TRUE; - } - } - - recipient->name = CORBA_string_dup (name ? name : ""); - recipient->address = CORBA_string_dup (addr ? addr : ""); - - if (free_name_addr) { - g_free ((gchar *) name); - g_free ((gchar *) addr); - } - - /* If this isn't a list, we quit after the first (i.e. the default) address. */ - if (!is_list) - break; - - } - g_object_unref (iterator); - } - - cards = g_list_next (cards); - } - - subject = CORBA_string_dup (""); - - GNOME_Evolution_Composer_setHeaders (composer_server, "", to_list, cc_list, bcc_list, subject, &ev); - if (ev._major != CORBA_NO_EXCEPTION) { - g_printerr ("gui/e-meeting-edit.c: I couldn't set the composer headers via CORBA! Aagh.\n"); - CORBA_exception_free (&ev); - return; - } - - CORBA_free (to_list); - CORBA_free (cc_list); - CORBA_free (bcc_list); - CORBA_free (subject); - } else if (disposition == E_ADDRESSBOOK_DISPOSITION_AS_ATTACHMENT) { - CORBA_char *content_type, *filename, *description; - GNOME_Evolution_Composer_AttachmentData *attach_data; - CORBA_boolean show_inline; - char *tempstr; - - GNOME_Evolution_Composer_RecipientList *to_list, *cc_list, *bcc_list; - CORBA_char *subject; - - content_type = CORBA_string_dup ("text/x-vcard"); - filename = CORBA_string_dup (""); - - if (cards->next) { - description = CORBA_string_dup (_("Multiple VCards")); - } else { - char *file_as; - - g_object_get(cards->data, - "file_as", &file_as, - NULL); - - tempstr = g_strdup_printf (_("VCard for %s"), file_as); - description = CORBA_string_dup (tempstr); - g_free (tempstr); - g_free (file_as); - } - - show_inline = FALSE; - - tempstr = e_card_list_get_vcard (cards); - attach_data = GNOME_Evolution_Composer_AttachmentData__alloc(); - attach_data->_maximum = attach_data->_length = strlen (tempstr); - attach_data->_buffer = CORBA_sequence_CORBA_char_allocbuf (attach_data->_length); - memcpy(attach_data->_buffer, tempstr, attach_data->_length); - g_free (tempstr); - - GNOME_Evolution_Composer_attachData (composer_server, - content_type, filename, description, - show_inline, attach_data, - &ev); - - if (ev._major != CORBA_NO_EXCEPTION) { - g_printerr ("gui/e-meeting-edit.c: I couldn't attach data to the composer via CORBA! Aagh.\n"); - CORBA_exception_free (&ev); - return; - } - - CORBA_free (content_type); - CORBA_free (filename); - CORBA_free (description); - CORBA_free (attach_data); - - to_list = GNOME_Evolution_Composer_RecipientList__alloc (); - to_list->_maximum = to_list->_length = 0; - - cc_list = GNOME_Evolution_Composer_RecipientList__alloc (); - cc_list->_maximum = cc_list->_length = 0; - - bcc_list = GNOME_Evolution_Composer_RecipientList__alloc (); - bcc_list->_maximum = bcc_list->_length = 0; - - if (!cards || cards->next) { - subject = CORBA_string_dup ("Contact information"); - } else { - ECard *card = cards->data; - const gchar *tempstr2; - - tempstr2 = NULL; - g_object_get(card, - "file_as", &tempstr2, - NULL); - if (!tempstr2 || !*tempstr2) { - g_free (tempstr2); - g_object_get(card, - "full_name", &tempstr2, - NULL); - } if (!tempstr2 || !*tempstr2) { - g_free (tempstr2); - g_object_get(card, - "org", &tempstr2, - NULL); - } if (!tempstr2 || !*tempstr2) { - EList *list; - EIterator *iterator; - g_object_get(card, - "email", &list, - NULL); - iterator = e_list_get_iterator (list); - if (e_iterator_is_valid (iterator)) { - tempstr2 = e_iterator_get (iterator); - } - g_object_unref (iterator); - g_object_unref (list); - } - - if (!tempstr2 || !*tempstr2) - tempstr = g_strdup_printf ("Contact information"); - else - tempstr = g_strdup_printf ("Contact information for %s", tempstr2); - subject = CORBA_string_dup (tempstr); - g_free (tempstr2); - g_free (tempstr); - } - - GNOME_Evolution_Composer_setHeaders (composer_server, "", to_list, cc_list, bcc_list, subject, &ev); - - CORBA_free (to_list); - CORBA_free (cc_list); - CORBA_free (bcc_list); - CORBA_free (subject); - } - - GNOME_Evolution_Composer_show (composer_server, &ev); - - if (ev._major != CORBA_NO_EXCEPTION) { - g_printerr ("gui/e-meeting-edit.c: I couldn't show the composer via CORBA! Aagh.\n"); - CORBA_exception_free (&ev); - return; - } - - CORBA_exception_free (&ev); -} - -void -e_addressbook_send_card (ECard *card, EAddressbookDisposition disposition) -{ - GList *list; - list = g_list_prepend (NULL, card); - e_addressbook_send_card_list (list, disposition); - g_list_free (list); -} - diff --git a/addressbook/gui/widgets/e-addressbook-util.h b/addressbook/gui/widgets/e-addressbook-util.h deleted file mode 100644 index e6ea3ab73b..0000000000 --- a/addressbook/gui/widgets/e-addressbook-util.h +++ /dev/null @@ -1,65 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* e-addressbook-util.h - * Copyright (C) 2001 Ximian, Inc. - * Author: Chris Toshok - * - * 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 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 library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ -#ifndef __E_ADDRESSBOOK_UTIL_H__ -#define __E_ADDRESSBOOK_UTIL_H__ - -#include "addressbook/backend/ebook/e-book.h" -#include "addressbook/gui/contact-editor/e-contact-editor.h" -#include "addressbook/gui/contact-list-editor/e-contact-list-editor.h" - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus */ - -void e_addressbook_error_dialog (const gchar *msg, - EBookStatus status); -gint e_addressbook_prompt_save_dialog (GtkWindow *parent); -EContactEditor *e_addressbook_show_contact_editor (EBook *book, - ECard *card, - gboolean is_new_card, - gboolean editable); -EContactListEditor *e_addressbook_show_contact_list_editor (EBook *book, - ECard *card, - gboolean is_new_card, - gboolean editable); -void e_addressbook_show_multiple_cards (EBook *book, - GList *list, - gboolean editable); -void e_addressbook_transfer_cards (EBook *source, - GList *cards, /* adopted */ - gboolean delete_from_source, - GtkWindow *parent_window); - -typedef enum { - E_ADDRESSBOOK_DISPOSITION_AS_ATTACHMENT, - E_ADDRESSBOOK_DISPOSITION_AS_TO, -} EAddressbookDisposition; - -void e_addressbook_send_card (ECard *card, - EAddressbookDisposition disposition); -void e_addressbook_send_card_list (GList *cards, - EAddressbookDisposition disposition); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* __E_ADDRESSBOOK_UTIL_H__ */ diff --git a/addressbook/gui/widgets/e-addressbook-view.c b/addressbook/gui/widgets/e-addressbook-view.c index 08710c71b5..4c5976717f 100644 --- a/addressbook/gui/widgets/e-addressbook-view.c +++ b/addressbook/gui/widgets/e-addressbook-view.c @@ -43,26 +43,24 @@ #include "addressbook/printing/e-contact-print.h" #include "addressbook/printing/e-contact-print-envelope.h" -#include "gal-view-factory-minicard.h" -#include "gal-view-minicard.h" #ifdef WITH_ADDRESSBOOK_VIEW_TREEVIEW #include #include "gal-view-factory-treeview.h" #include "gal-view-treeview.h" #endif +#include "gal-view-minicard.h" +#include "gal-view-factory-minicard.h" -#include "e-addressbook-marshal.h" +#include "eab-marshal.h" #include "e-addressbook-view.h" #include "e-addressbook-model.h" -#include "e-addressbook-util.h" +#include "eab-gui-util.h" +#include "util/eab-book-util.h" #include "e-addressbook-table-adapter.h" #ifdef WITH_ADDRESSBOOK_VIEW_TREEVIEW #include "e-addressbook-treeview-adapter.h" #endif -#include "e-addressbook-reflow-adapter.h" -#include "e-minicard-view-widget.h" -#include "e-contact-save-as.h" -#include "e-card-merging.h" +#include "eab-contact-merging.h" #include "e-contact-editor.h" #include @@ -76,33 +74,33 @@ #define d(x) -static void e_addressbook_view_init (EAddressbookView *card); -static void e_addressbook_view_class_init (EAddressbookViewClass *klass); +static void eab_view_init (EABView *card); +static void eab_view_class_init (EABViewClass *klass); -static void e_addressbook_view_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); -static void e_addressbook_view_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); +static void eab_view_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); +static void eab_view_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); -static void e_addressbook_view_dispose (GObject *object); -static void change_view_type (EAddressbookView *view, EAddressbookViewType view_type); +static void eab_view_dispose (GObject *object); +static void change_view_type (EABView *view, EABViewType view_type); -static void status_message (GtkObject *object, const gchar *status, EAddressbookView *eav); -static void search_result (GtkObject *object, EBookViewStatus status, EAddressbookView *eav); -static void folder_bar_message (GtkObject *object, const gchar *status, EAddressbookView *eav); -static void stop_state_changed (GtkObject *object, EAddressbookView *eav); -static void writable_status (GtkObject *object, gboolean writable, EAddressbookView *eav); -static void backend_died (GtkObject *object, EAddressbookView *eav); -static void command_state_change (EAddressbookView *eav); -static void alphabet_state_change (EAddressbookView *eav, gunichar letter); +static void status_message (GtkObject *object, const gchar *status, EABView *eav); +static void search_result (GtkObject *object, EBookViewStatus status, EABView *eav); +static void folder_bar_message (GtkObject *object, const gchar *status, EABView *eav); +static void stop_state_changed (GtkObject *object, EABView *eav); +static void writable_status (GtkObject *object, gboolean writable, EABView *eav); +static void backend_died (GtkObject *object, EABView *eav); +static void command_state_change (EABView *eav); static void selection_clear_event (GtkWidget *invisible, GdkEventSelection *event, - EAddressbookView *view); + EABView *view); static void selection_received (GtkWidget *invisible, GtkSelectionData *selection_data, - guint time, EAddressbookView *view); + guint time, EABView *view); static void selection_get (GtkWidget *invisible, GtkSelectionData *selection_data, - guint info, guint time_stamp, EAddressbookView *view); + guint info, guint time_stamp, EABView *view); static void invisible_destroyed (gpointer data, GObject *where_object_was); -static GtkTableClass *parent_class = NULL; +#define PARENT_TYPE GTK_TYPE_EVENT_BOX +static GtkEventBoxClass *parent_class = NULL; /* The arguments we take */ enum { @@ -117,7 +115,6 @@ enum { SEARCH_RESULT, FOLDER_BAR_MESSAGE, COMMAND_STATE_CHANGE, - ALPHABET_STATE_CHANGE, LAST_SIGNAL }; @@ -130,38 +127,38 @@ static GtkTargetEntry drag_types[] = { }; static const int num_drag_types = sizeof (drag_types) / sizeof (drag_types[0]); -static guint e_addressbook_view_signals [LAST_SIGNAL] = {0, }; +static guint eab_view_signals [LAST_SIGNAL] = {0, }; static GdkAtom clipboard_atom = GDK_NONE; static GalViewCollection *collection = NULL; GType -e_addressbook_view_get_type (void) +eab_view_get_type (void) { static GType type = 0; if (!type) { static const GTypeInfo info = { - sizeof (EAddressbookViewClass), + sizeof (EABViewClass), NULL, /* base_init */ NULL, /* base_finalize */ - (GClassInitFunc) e_addressbook_view_class_init, + (GClassInitFunc) eab_view_class_init, NULL, /* class_finalize */ NULL, /* class_data */ - sizeof (EAddressbookView), + sizeof (EABView), 0, /* n_preallocs */ - (GInstanceInitFunc) e_addressbook_view_init, + (GInstanceInitFunc) eab_view_init, }; - type = g_type_register_static (GTK_TYPE_TABLE, "EAddressbookView", &info, 0); + type = g_type_register_static (PARENT_TYPE, "EABView", &info, 0); } return type; } static void -e_addressbook_view_class_init (EAddressbookViewClass *klass) +eab_view_class_init (EABViewClass *klass) { GObjectClass *object_class; GtkWidgetClass *widget_class; @@ -169,11 +166,11 @@ e_addressbook_view_class_init (EAddressbookViewClass *klass) object_class = G_OBJECT_CLASS(klass); widget_class = GTK_WIDGET_CLASS(klass); - parent_class = gtk_type_class (gtk_table_get_type ()); + parent_class = gtk_type_class (PARENT_TYPE); - object_class->set_property = e_addressbook_view_set_property; - object_class->get_property = e_addressbook_view_get_property; - object_class->dispose = e_addressbook_view_dispose; + object_class->set_property = eab_view_set_property; + object_class->get_property = eab_view_get_property; + object_class->dispose = eab_view_dispose; g_object_class_install_property (object_class, PROP_BOOK, g_param_spec_object ("book", @@ -193,137 +190,78 @@ e_addressbook_view_class_init (EAddressbookViewClass *klass) g_param_spec_int ("type", _("Type"), /*_( */"XXX blurb" /*)*/, - E_ADDRESSBOOK_VIEW_NONE, -#ifdef WITH_ADDRESSBOOK_VIEW_TREEVIEW - E_ADDRESSBOOK_VIEW_TREEVIEW, -#else - E_ADDRESSBOOK_VIEW_MINICARD, -#endif - E_ADDRESSBOOK_VIEW_NONE, + EAB_VIEW_NONE, + EAB_VIEW_TABLE, + EAB_VIEW_NONE, G_PARAM_READWRITE)); - e_addressbook_view_signals [STATUS_MESSAGE] = + eab_view_signals [STATUS_MESSAGE] = g_signal_new ("status_message", G_OBJECT_CLASS_TYPE (object_class), G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (EAddressbookViewClass, status_message), + G_STRUCT_OFFSET (EABViewClass, status_message), NULL, NULL, - e_addressbook_marshal_NONE__POINTER, + eab_marshal_NONE__POINTER, G_TYPE_NONE, 1, G_TYPE_POINTER); - e_addressbook_view_signals [SEARCH_RESULT] = + eab_view_signals [SEARCH_RESULT] = g_signal_new ("search_result", G_OBJECT_CLASS_TYPE (object_class), G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (EAddressbookViewClass, search_result), + G_STRUCT_OFFSET (EABViewClass, search_result), NULL, NULL, - e_addressbook_marshal_NONE__INT, + eab_marshal_NONE__INT, G_TYPE_NONE, 1, G_TYPE_INT); - e_addressbook_view_signals [FOLDER_BAR_MESSAGE] = + eab_view_signals [FOLDER_BAR_MESSAGE] = g_signal_new ("folder_bar_message", G_OBJECT_CLASS_TYPE (object_class), G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (EAddressbookViewClass, folder_bar_message), + G_STRUCT_OFFSET (EABViewClass, folder_bar_message), NULL, NULL, - e_addressbook_marshal_NONE__POINTER, + eab_marshal_NONE__POINTER, G_TYPE_NONE, 1, G_TYPE_POINTER); - e_addressbook_view_signals [COMMAND_STATE_CHANGE] = + eab_view_signals [COMMAND_STATE_CHANGE] = g_signal_new ("command_state_change", G_OBJECT_CLASS_TYPE (object_class), G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (EAddressbookViewClass, command_state_change), + G_STRUCT_OFFSET (EABViewClass, command_state_change), NULL, NULL, - e_addressbook_marshal_NONE__NONE, + eab_marshal_NONE__NONE, G_TYPE_NONE, 0); - e_addressbook_view_signals [ALPHABET_STATE_CHANGE] = - g_signal_new ("alphabet_state_change", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (EAddressbookViewClass, alphabet_state_change), - NULL, NULL, - e_addressbook_marshal_NONE__UINT, - G_TYPE_NONE, 1, G_TYPE_UINT); - - if (!clipboard_atom) clipboard_atom = gdk_atom_intern ("CLIPBOARD", FALSE); } static void -e_addressbook_view_init (EAddressbookView *eav) +eab_view_init (EABView *eav) { - eav->view_type = E_ADDRESSBOOK_VIEW_NONE; - - eav->model = e_addressbook_model_new (); - - g_signal_connect (eav->model, - "status_message", - G_CALLBACK (status_message), - eav); - - g_signal_connect (eav->model, - "search_result", - G_CALLBACK (search_result), - eav); - - g_signal_connect (eav->model, - "folder_bar_message", - G_CALLBACK (folder_bar_message), - eav); - - g_signal_connect (eav->model, - "stop_state_changed", - G_CALLBACK (stop_state_changed), - eav); - - g_signal_connect (eav->model, - "writable_status", - G_CALLBACK (writable_status), - eav); - - g_signal_connect (eav->model, - "backend_died", - G_CALLBACK (backend_died), - eav); - - eav->editable = FALSE; - eav->book = NULL; - eav->query = g_strdup (SHOW_ALL_SEARCH); + eav->view_type = EAB_VIEW_NONE; + eav->model = NULL; eav->object = NULL; eav->widget = NULL; + eav->scrolled = NULL; + eav->contact_display = NULL; eav->view_instance = NULL; eav->view_menus = NULL; + eav->current_view = NULL; eav->uic = NULL; - eav->current_alphabet_widget = NULL; - eav->invisible = gtk_invisible_new (); + eav->book = NULL; + eav->query = NULL; - gtk_selection_add_target (eav->invisible, - clipboard_atom, - GDK_SELECTION_TYPE_STRING, - 0); - - g_signal_connect (eav->invisible, "selection_get", - G_CALLBACK (selection_get), - eav); - g_signal_connect (eav->invisible, "selection_clear_event", - G_CALLBACK (selection_clear_event), - eav); - g_signal_connect (eav->invisible, "selection_received", - G_CALLBACK (selection_received), - eav); - g_object_weak_ref (G_OBJECT (eav->invisible), invisible_destroyed, eav); + eav->invisible = NULL; + eav->clipboard_contacts = NULL; } static void -e_addressbook_view_dispose (GObject *object) +eab_view_dispose (GObject *object) { - EAddressbookView *eav = E_ADDRESSBOOK_VIEW(object); + EABView *eav = EAB_VIEW(object); if (eav->model) { g_signal_handlers_disconnect_matched (eav->model, @@ -356,10 +294,10 @@ e_addressbook_view_dispose (GObject *object) eav->view_menus = NULL; } - if (eav->clipboard_cards) { - g_list_foreach (eav->clipboard_cards, (GFunc)g_object_unref, NULL); - g_list_free (eav->clipboard_cards); - eav->clipboard_cards = NULL; + if (eav->clipboard_contacts) { + g_list_foreach (eav->clipboard_contacts, (GFunc)g_object_unref, NULL); + g_list_free (eav->clipboard_contacts); + eav->clipboard_contacts = NULL; } if (eav->invisible) { @@ -372,14 +310,77 @@ e_addressbook_view_dispose (GObject *object) } GtkWidget* -e_addressbook_view_new (void) -{ - GtkWidget *widget = GTK_WIDGET (g_object_new (E_TYPE_ADDRESSBOOK_VIEW, NULL)); +eab_view_new (void) +{ + GtkWidget *widget = GTK_WIDGET (g_object_new (E_TYPE_AB_VIEW, NULL)); + EABView *eav = EAB_VIEW (widget); + + /* create our model */ + eav->model = eab_model_new (); + + g_signal_connect (eav->model, "status_message", + G_CALLBACK (status_message), eav); + g_signal_connect (eav->model, "search_result", + G_CALLBACK (search_result), eav); + g_signal_connect (eav->model, "folder_bar_message", + G_CALLBACK (folder_bar_message), eav); + g_signal_connect (eav->model, "stop_state_changed", + G_CALLBACK (stop_state_changed), eav); + g_signal_connect (eav->model, "writable_status", + G_CALLBACK (writable_status), eav); + g_signal_connect (eav->model, "backend_died", + G_CALLBACK (backend_died), eav); + + eav->editable = FALSE; + eav->query = g_strdup (SHOW_ALL_SEARCH); + + /* create the paned window and contact display */ + eav->paned = gtk_vpaned_new (); + gtk_container_add (GTK_CONTAINER (eav), eav->paned); + + eav->widget = gtk_label_new ("empty label here"); + gtk_container_add (GTK_CONTAINER (eav->paned), eav->widget); + gtk_widget_show (eav->widget); + + eav->scrolled = gtk_scrolled_window_new (NULL, NULL); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (eav->scrolled), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); + gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (eav->scrolled), GTK_SHADOW_IN); + eav->contact_display = eab_contact_display_new (); + + gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (eav->scrolled), eav->contact_display); + gtk_widget_show (eav->contact_display); + + gtk_container_add (GTK_CONTAINER (eav->paned), eav->scrolled); + gtk_widget_show (eav->scrolled); + gtk_widget_show (eav->paned); + + /* XXX hack */ + gtk_paned_set_position (GTK_PANED (eav->paned), 144); + + /* gtk selection crap */ + eav->invisible = gtk_invisible_new (); + + gtk_selection_add_target (eav->invisible, + clipboard_atom, + GDK_SELECTION_TYPE_STRING, + 0); + + g_signal_connect (eav->invisible, "selection_get", + G_CALLBACK (selection_get), + eav); + g_signal_connect (eav->invisible, "selection_clear_event", + G_CALLBACK (selection_clear_event), + eav); + g_signal_connect (eav->invisible, "selection_received", + G_CALLBACK (selection_received), + eav); + g_object_weak_ref (G_OBJECT (eav->invisible), invisible_destroyed, eav); + return widget; } static void -writable_status (GtkObject *object, gboolean writable, EAddressbookView *eav) +writable_status (GtkObject *object, gboolean writable, EABView *eav) { eav->editable = writable; command_state_change (eav); @@ -412,7 +413,7 @@ init_collection (void) gal_view_collection_add_factory (collection, factory); g_object_unref (factory); - factory = gal_view_factory_minicard_new (); + factory = gal_view_factory_minicard_new(); gal_view_collection_add_factory (collection, factory); g_object_unref (factory); @@ -431,17 +432,18 @@ display_view(GalViewInstance *instance, GalView *view, gpointer data) { - EAddressbookView *address_view = data; + EABView *address_view = data; if (GAL_IS_VIEW_ETABLE(view)) { - change_view_type (address_view, E_ADDRESSBOOK_VIEW_TABLE); + change_view_type (address_view, EAB_VIEW_TABLE); gal_view_etable_attach_table (GAL_VIEW_ETABLE(view), e_table_scrolled_get_table(E_TABLE_SCROLLED(address_view->widget))); - } else if (GAL_IS_VIEW_MINICARD(view)) { - change_view_type (address_view, E_ADDRESSBOOK_VIEW_MINICARD); - gal_view_minicard_attach (GAL_VIEW_MINICARD(view), E_MINICARD_VIEW_WIDGET (address_view->object)); + } + else if (GAL_IS_VIEW_MINICARD(view)) { + change_view_type (address_view, EAB_VIEW_MINICARD); + gal_view_minicard_attach (GAL_VIEW_MINICARD (view), E_MINICARD_VIEW_WIDGET (address_view->object)); } #ifdef WITH_ADDRESSBOOK_VIEW_TREEVIEW else if (GAL_IS_VIEW_TREEVIEW (view)) { - change_view_type (address_view, E_ADDRESSBOOK_VIEW_TREEVIEW); + change_view_type (address_view, EAB_VIEW_TREEVIEW); gal_view_treeview_attach (GAL_VIEW_TREEVIEW(view), GTK_TREE_VIEW (address_view->object)); } #endif @@ -449,7 +451,7 @@ display_view(GalViewInstance *instance, } static void -setup_menus (EAddressbookView *view) +setup_menus (EABView *view) { if (view->book && view->view_instance == NULL) { init_collection (); @@ -468,9 +470,9 @@ setup_menus (EAddressbookView *view) } static void -e_addressbook_view_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) +eab_view_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { - EAddressbookView *eav = E_ADDRESSBOOK_VIEW(object); + EABView *eav = EAB_VIEW(object); switch (prop_id){ case PROP_BOOK: @@ -509,12 +511,6 @@ e_addressbook_view_set_property (GObject *object, guint prop_id, const GValue *v g_object_set(eav->model, "query", eav->query, NULL); - if (eav->current_alphabet_widget != NULL) { - GtkWidget *current = eav->current_alphabet_widget; - - eav->current_alphabet_widget = NULL; - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (current), FALSE); - } break; case PROP_TYPE: change_view_type(eav, g_value_get_int (value)); @@ -526,9 +522,9 @@ e_addressbook_view_set_property (GObject *object, guint prop_id, const GValue *v } static void -e_addressbook_view_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) +eab_view_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { - EAddressbookView *eav = E_ADDRESSBOOK_VIEW(object); + EABView *eav = EAB_VIEW(object); switch (prop_id) { case PROP_BOOK: @@ -550,44 +546,43 @@ e_addressbook_view_get_property (GObject *object, guint prop_id, GValue *value, } static ESelectionModel* -get_selection_model (EAddressbookView *view) +get_selection_model (EABView *view) { - if (view->view_type == E_ADDRESSBOOK_VIEW_MINICARD) - return e_minicard_view_widget_get_selection_model (E_MINICARD_VIEW_WIDGET(view->object)); - else if (view->view_type == E_ADDRESSBOOK_VIEW_TABLE) + if (view->view_type == EAB_VIEW_TABLE) return e_table_get_selection_model (e_table_scrolled_get_table (E_TABLE_SCROLLED(view->widget))); + else if (view->view_type == EAB_VIEW_MINICARD) + return e_minicard_view_widget_get_selection_model (E_MINICARD_VIEW_WIDGET(view->object)); #ifdef WITH_ADDRESSBOOK_VIEW_TREEVIEW - else if (view->view_type == E_ADDRESSBOOK_VIEW_TREEVIEW) { + else if (view->view_type == EAB_VIEW_TREEVIEW) return e_treeview_get_selection_model (GTK_TREE_VIEW (view->object)); - } #endif g_return_val_if_reached (NULL); } /* Popup menu stuff */ typedef struct { - EAddressbookView *view; + EABView *view; EPopupMenu *submenu; gpointer closure; -} CardAndBook; +} ContactAndBook; static ESelectionModel* -card_and_book_get_selection_model (CardAndBook *card_and_book) +contact_and_book_get_selection_model (ContactAndBook *contact_and_book) { - return get_selection_model (card_and_book->view); + return get_selection_model (contact_and_book->view); } static void -card_and_book_free (CardAndBook *card_and_book) +contact_and_book_free (ContactAndBook *contact_and_book) { - EAddressbookView *view = card_and_book->view; + EABView *view = contact_and_book->view; ESelectionModel *selection; - if (card_and_book->submenu) + if (contact_and_book->submenu) gal_view_instance_free_popup_menu (view->view_instance, - card_and_book->submenu); + contact_and_book->submenu); - selection = card_and_book_get_selection_model (card_and_book); + selection = contact_and_book_get_selection_model (contact_and_book); if (selection) e_selection_model_right_click_up(selection); @@ -595,33 +590,33 @@ card_and_book_free (CardAndBook *card_and_book) } static void -get_card_list_1(gint model_row, - gpointer closure) +get_contact_list_1(gint model_row, + gpointer closure) { - CardAndBook *card_and_book; + ContactAndBook *contact_and_book; GList **list; - EAddressbookView *view; - ECard *card; + EABView *view; + EContact *contact; - card_and_book = closure; - list = card_and_book->closure; - view = card_and_book->view; + contact_and_book = closure; + list = contact_and_book->closure; + view = contact_and_book->view; - card = e_addressbook_model_get_card(view->model, model_row); - *list = g_list_prepend(*list, card); + contact = eab_model_get_contact(view->model, model_row); + *list = g_list_prepend(*list, contact); } static GList * -get_card_list (CardAndBook *card_and_book) +get_contact_list (ContactAndBook *contact_and_book) { GList *list = NULL; ESelectionModel *selection; - selection = card_and_book_get_selection_model (card_and_book); + selection = contact_and_book_get_selection_model (contact_and_book); if (selection) { - card_and_book->closure = &list; - e_selection_model_foreach (selection, get_card_list_1, card_and_book); + contact_and_book->closure = &list; + e_selection_model_foreach (selection, get_contact_list_1, contact_and_book); } return list; @@ -631,135 +626,134 @@ static void has_email_address_1(gint model_row, gpointer closure) { - CardAndBook *card_and_book; + ContactAndBook *contact_and_book; gboolean *has_email; - EAddressbookView *view; - const ECard *card; - EList *email; + EABView *view; + const EContact *contact; + GList *email; - card_and_book = closure; - has_email = card_and_book->closure; - view = card_and_book->view; + contact_and_book = closure; + has_email = contact_and_book->closure; + view = contact_and_book->view; if (*has_email) return; - card = e_addressbook_model_peek_card(view->model, model_row); + contact = eab_model_contact_at(view->model, model_row); - g_object_get (G_OBJECT (card), - "email", &email, - NULL); + email = e_contact_get (E_CONTACT (contact), E_CONTACT_EMAIL); - if (e_list_length (email) > 0) + if (g_list_length (email) > 0) *has_email = TRUE; - g_object_unref (email); + g_list_foreach (email, (GFunc)g_free, NULL); + g_list_free (email); } static gboolean -get_has_email_address (CardAndBook *card_and_book) +get_has_email_address (ContactAndBook *contact_and_book) { ESelectionModel *selection; gboolean has_email = FALSE; - selection = card_and_book_get_selection_model (card_and_book); + selection = contact_and_book_get_selection_model (contact_and_book); if (selection) { - card_and_book->closure = &has_email; - e_selection_model_foreach (selection, has_email_address_1, card_and_book); + contact_and_book->closure = &has_email; + e_selection_model_foreach (selection, has_email_address_1, contact_and_book); } return has_email; } static void -save_as (GtkWidget *widget, CardAndBook *card_and_book) +save_as (GtkWidget *widget, ContactAndBook *contact_and_book) { - GList *cards = get_card_list (card_and_book); - if (cards) { - e_contact_list_save_as(_("Save as VCard"), cards, NULL); - e_free_object_list(cards); + GList *contacts = get_contact_list (contact_and_book); + if (contacts) { + eab_contact_list_save(_("Save as VCard"), contacts, NULL); + e_free_object_list(contacts); } } static void -send_as (GtkWidget *widget, CardAndBook *card_and_book) +send_as (GtkWidget *widget, ContactAndBook *contact_and_book) { - GList *cards = get_card_list (card_and_book); - if (cards) { - e_addressbook_send_card_list(cards, E_ADDRESSBOOK_DISPOSITION_AS_ATTACHMENT); - e_free_object_list(cards); + GList *contacts = get_contact_list (contact_and_book); + if (contacts) { + eab_send_contact_list(contacts, EAB_DISPOSITION_AS_ATTACHMENT); + e_free_object_list(contacts); } } static void -send_to (GtkWidget *widget, CardAndBook *card_and_book) +send_to (GtkWidget *widget, ContactAndBook *contact_and_book) { - GList *cards = get_card_list (card_and_book); + GList *contacts = get_contact_list (contact_and_book); - if (cards) { - e_addressbook_send_card_list(cards, E_ADDRESSBOOK_DISPOSITION_AS_TO); - e_free_object_list(cards); + if (contacts) { + eab_send_contact_list(contacts, EAB_DISPOSITION_AS_TO); + e_free_object_list(contacts); } } static void -print (GtkWidget *widget, CardAndBook *card_and_book) +print (GtkWidget *widget, ContactAndBook *contact_and_book) { - GList *cards = get_card_list (card_and_book); - if (cards) { - if (cards->next) - gtk_widget_show(e_contact_print_card_list_dialog_new(cards)); + GList *contacts = get_contact_list (contact_and_book); + if (contacts) { + if (contacts->next) + gtk_widget_show(e_contact_print_contact_list_dialog_new(contacts)); else - gtk_widget_show(e_contact_print_card_dialog_new(cards->data)); - e_free_object_list(cards); + gtk_widget_show(e_contact_print_contact_dialog_new(contacts->data)); + e_free_object_list(contacts); } } #if 0 /* Envelope printing is disabled for Evolution 1.0. */ static void -print_envelope (GtkWidget *widget, CardAndBook *card_and_book) +print_envelope (GtkWidget *widget, ContactAndBook *contact_and_book) { - GList *cards = get_card_list (card_and_book); + GList *cards = get_card_list (contact_and_book); if (cards) { - gtk_widget_show(e_contact_list_print_envelope_dialog_new(card_and_book->card)); + gtk_widget_show(e_contact_list_print_envelope_dialog_new(contact_and_book->card)); e_free_object_list(cards); } } #endif static void -copy (GtkWidget *widget, CardAndBook *card_and_book) +copy (GtkWidget *widget, ContactAndBook *contact_and_book) { - e_addressbook_view_copy (card_and_book->view); + eab_view_copy (contact_and_book->view); } static void -paste (GtkWidget *widget, CardAndBook *card_and_book) +paste (GtkWidget *widget, ContactAndBook *contact_and_book) { - e_addressbook_view_paste (card_and_book->view); + eab_view_paste (contact_and_book->view); } static void -cut (GtkWidget *widget, CardAndBook *card_and_book) +cut (GtkWidget *widget, ContactAndBook *contact_and_book) { - e_addressbook_view_cut (card_and_book->view); + eab_view_cut (contact_and_book->view); } static void -delete (GtkWidget *widget, CardAndBook *card_and_book) +delete (GtkWidget *widget, ContactAndBook *contact_and_book) { - if (e_contact_editor_confirm_delete(GTK_WINDOW(gtk_widget_get_toplevel(card_and_book->view->widget)))) { + if (e_contact_editor_confirm_delete(GTK_WINDOW(gtk_widget_get_toplevel(contact_and_book->view->widget)))) { EBook *book; - GList *list = get_card_list(card_and_book); + GList *list = get_contact_list(contact_and_book); GList *iterator; gboolean bulk_remove = FALSE; - bulk_remove = e_book_check_static_capability (card_and_book->view->model->book, + bulk_remove = e_book_check_static_capability (contact_and_book->view->model->book, "bulk-remove"); - g_object_get(card_and_book->view->model, + g_object_get(contact_and_book->view->model, "book", &book, NULL); @@ -767,26 +761,28 @@ delete (GtkWidget *widget, CardAndBook *card_and_book) GList *ids = NULL; for (iterator = list; iterator; iterator = iterator->next) { - ECard *card = iterator->data; - ids = g_list_prepend (ids, (char*)e_card_get_id (card)); + EContact *contact = iterator->data; + ids = g_list_prepend (ids, (char*)e_contact_get_const (contact, E_CONTACT_UID)); } /* Remove the cards all at once. */ - e_book_remove_cards (book, - ids, - NULL, - NULL); + /* XXX no callback specified... ugh */ + e_book_async_remove_contacts (book, + ids, + NULL, + NULL); g_list_free (ids); } else { for (iterator = list; iterator; iterator = iterator->next) { - ECard *card = iterator->data; + EContact *contact = iterator->data; /* Remove the card. */ - e_book_remove_card (book, - card, - NULL, - NULL); + /* XXX no callback specified... ugh */ + e_book_async_remove_contact (book, + e_contact_get_const (contact, E_CONTACT_UID), + NULL, + NULL); } } e_free_object_list(list); @@ -795,56 +791,55 @@ delete (GtkWidget *widget, CardAndBook *card_and_book) } static void -copy_to_folder (GtkWidget *widget, CardAndBook *card_and_book) +copy_to_folder (GtkWidget *widget, ContactAndBook *contact_and_book) { - e_addressbook_view_copy_to_folder (card_and_book->view); + eab_view_copy_to_folder (contact_and_book->view); } static void -move_to_folder (GtkWidget *widget, CardAndBook *card_and_book) +move_to_folder (GtkWidget *widget, ContactAndBook *contact_and_book) { - e_addressbook_view_move_to_folder (card_and_book->view); + eab_view_move_to_folder (contact_and_book->view); } static void -free_popup_info (GtkWidget *w, CardAndBook *card_and_book) +free_popup_info (GtkWidget *w, ContactAndBook *contact_and_book) { - card_and_book_free (card_and_book); + contact_and_book_free (contact_and_book); } static void -new_card (GtkWidget *widget, CardAndBook *card_and_book) +new_card (GtkWidget *widget, ContactAndBook *contact_and_book) { EBook *book; - ECard *card; + EContact *contact = e_contact_new(); - g_object_get(card_and_book->view->model, + g_object_get(contact_and_book->view->model, "book", &book, NULL); - e_addressbook_show_contact_editor (book, card = e_card_new(""), TRUE, TRUE); - g_object_unref(book); - g_object_unref(card); + eab_show_contact_editor (book, contact, TRUE, TRUE); + g_object_unref (book); + g_object_unref (contact); } static void -new_list (GtkWidget *widget, CardAndBook *card_and_book) +new_list (GtkWidget *widget, ContactAndBook *contact_and_book) { EBook *book; - ECard *card; + EContact *contact = e_contact_new (); - g_object_get(card_and_book->view->model, + g_object_get(contact_and_book->view->model, "book", &book, NULL); - - e_addressbook_show_contact_list_editor (book, card = e_card_new(""), TRUE, TRUE); + eab_show_contact_list_editor (book, contact, TRUE, TRUE); g_object_unref(book); - g_object_unref(card); + g_object_unref(contact); } #if 0 static void -sources (GtkWidget *widget, CardAndBook *card_and_book) +sources (GtkWidget *widget, ContactAndBook *contact_and_book) { BonoboControl *control; GNOME_Evolution_ShellView shell_view; @@ -874,9 +869,9 @@ sources (GtkWidget *widget, CardAndBook *card_and_book) #define POPUP_NOEMAIL_MASK 0x4 static void -do_popup_menu(EAddressbookView *view, GdkEvent *event) +do_popup_menu(EABView *view, GdkEvent *event) { - CardAndBook *card_and_book; + ContactAndBook *contact_and_book; GtkMenu *popup; EPopupMenu *submenu = NULL; ESelectionModel *selection_model; @@ -921,308 +916,62 @@ do_popup_menu(EAddressbookView *view, GdkEvent *event) E_POPUP_TERMINATOR }; - card_and_book = g_new(CardAndBook, 1); - card_and_book->view = view; - card_and_book->submenu = submenu; + contact_and_book = g_new(ContactAndBook, 1); + contact_and_book->view = view; + contact_and_book->submenu = submenu; - g_object_ref (card_and_book->view); + g_object_ref (contact_and_book->view); - selection_model = card_and_book_get_selection_model (card_and_book); + selection_model = contact_and_book_get_selection_model (contact_and_book); if (selection_model) selection = e_selection_model_selected_count (selection_model) > 0; popup = e_popup_menu_create (menu, 0, - (e_addressbook_model_editable (view->model) ? 0 : POPUP_READONLY_MASK) + + (eab_model_editable (view->model) ? 0 : POPUP_READONLY_MASK) + (selection ? 0 : POPUP_NOSELECTION_MASK) + - (get_has_email_address (card_and_book) ? 0 : POPUP_NOEMAIL_MASK), - card_and_book); + (get_has_email_address (contact_and_book) ? 0 : POPUP_NOEMAIL_MASK), + contact_and_book); g_signal_connect (popup, "selection-done", - G_CALLBACK (free_popup_info), card_and_book); + G_CALLBACK (free_popup_info), contact_and_book); e_popup_menu (popup, event); } - -/* Minicard view stuff */ - -/* Translators: put here a list of labels you want to see on buttons in - addressbook. You may use any character to separate labels but it must - also be placed at the begining ot the string */ -const char *button_labels = N_(",123,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z"); -/* Translators: put here a list of characters that correspond to buttons - in addressbook. You may use any character to separate labels but it - must also be placed at the begining ot the string. - Use lower case letters if possible. */ -const char *button_letters = N_(",0,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z"); - -typedef struct { - EAddressbookView *view; - GtkWidget *button; - GtkWidget *vbox; - gchar *letters; -} LetterClosure; - -static char ** -e_utf8_split (const char *utf8_str, gunichar delim) -{ - GSList *str_list = NULL, *sl; - int n = 0; - const char *str, *s; - char **str_array; - - g_return_val_if_fail (utf8_str != NULL, NULL); - - str = utf8_str; - while (*str != '\0') { - int len; - char *new_str; - - for (s = str; *s != '\0' && g_utf8_get_char (s) != delim; s = g_utf8_next_char (s)) - ; - len = s - str; - new_str = g_new (char, len + 1); - if (len > 0) { - memcpy (new_str, str, len); - } - new_str[len] = '\0'; - str_list = g_slist_prepend (str_list, new_str); - n++; - if (*s != '\0') { - str = g_utf8_next_char (s); - } else { - str = s; - } - } - - str_array = g_new (char *, n + 1); - str_array[n--] = NULL; - for (sl = str_list; sl != NULL; sl = sl->next) { - str_array[n--] = sl->data; - } - g_slist_free (str_list); - - return str_array; -} - static void -jump_to_letters (EAddressbookView *view, gchar* l) -{ - char *query; - char *s; - char buf[6 + 1]; - - if (g_unichar_isdigit (g_utf8_get_char(l))) { - const char *letters = _(button_letters); - char **letter_v; - GString *gstr; - char **p; - - letter_v = e_utf8_split (g_utf8_next_char (letters), - g_utf8_get_char (letters)); - g_assert (letter_v != NULL && letter_v[0] != NULL); - gstr = g_string_new ("(not (or "); - for (p = letter_v + 1; *p != NULL; p++) { - for (s = *p; *s != '\0'; s = g_utf8_next_char (s)) { - buf [g_unichar_to_utf8 (g_utf8_get_char(s), buf)] = '\0'; - g_string_append_printf (gstr, "(beginswith \"file_as\" \"%s\")", buf); - } - } - g_string_append (gstr, "))"); - query = gstr->str; - g_strfreev (letter_v); - g_string_free (gstr, FALSE); - } else { - GString *gstr; - - gstr = g_string_new ("(or "); - - for (s = l; *s != '\0'; s = g_utf8_next_char (s)) { - buf [g_unichar_to_utf8 (g_utf8_get_char(s), buf)] = '\0'; - g_string_append_printf (gstr, "(beginswith \"file_as\" \"%s\")", buf); - } - - g_string_append (gstr, ")"); - query = gstr->str; - g_string_free (gstr, FALSE); - } - g_object_set (view, - "query", query, - NULL); - g_free (query); -} - -static void -button_toggled(GtkWidget *button, LetterClosure *closure) +render_contact (int row, EABView *view) { - EAddressbookView *view = closure->view; - - if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button))) { - GtkWidget *current = view->current_alphabet_widget; + EContact *contact = eab_model_get_contact (view->model, row); - view->current_alphabet_widget = NULL; - if (current && current != button) - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (current), FALSE); - jump_to_letters (view, closure->letters); - view->current_alphabet_widget = button; - alphabet_state_change (view, g_utf8_get_char(closure->letters)); - } else { - if (view->current_alphabet_widget != NULL && - view->current_alphabet_widget == button) { - view->current_alphabet_widget = NULL; - g_object_set (view, - "query", NULL, - NULL); - alphabet_state_change (view, 0); - } - } + eab_contact_display_render (EAB_CONTACT_DISPLAY (view->contact_display), contact, + EAB_CONTACT_DISPLAY_RENDER_NORMAL); } static void -free_closure(gpointer data, GObject *where_object_was) +selection_changed (GObject *o, EABView *view) { - GtkWidget *button = GTK_WIDGET (where_object_was); - LetterClosure *closure = data; - if (button != NULL && - button == closure->view->current_alphabet_widget) { - closure->view->current_alphabet_widget = NULL; - } - g_free (closure->letters); - g_free (closure); -} - -static GtkWidget * -create_alphabet (EAddressbookView *view) -{ - GtkWidget *widget, *viewport, *vbox; - const char *labels, *letters; - char **label_v, **letter_v; - char **pl, **pc; - gunichar sep; - - widget = gtk_scrolled_window_new (NULL, NULL); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (widget), - GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); - - viewport = gtk_viewport_new (NULL, NULL); - gtk_container_add (GTK_CONTAINER (widget), viewport); - gtk_container_set_border_width (GTK_CONTAINER (viewport), 4); - gtk_viewport_set_shadow_type (GTK_VIEWPORT (viewport), GTK_SHADOW_NONE); - - vbox = gtk_vbox_new (FALSE, 4); - gtk_container_add (GTK_CONTAINER (viewport), vbox); - - labels = _(button_labels); - sep = g_utf8_get_char (labels); - label_v = e_utf8_split (g_utf8_next_char (labels), sep); - letters = _(button_letters); - sep = g_utf8_get_char (letters); - letter_v = e_utf8_split (g_utf8_next_char (letters), sep); - g_assert (label_v != NULL && letter_v != NULL); - for (pl = label_v, pc = letter_v; *pl != NULL && *pc != NULL; pl++, pc++) { - GtkWidget *button; - LetterClosure *closure; - char *label; - - label = *pl; - button = gtk_toggle_button_new_with_label (label); - gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0); - - closure = g_new (LetterClosure, 1); - closure->view = view; - closure->letters = g_strdup (*pc); - closure->button = button; - closure->vbox = vbox; - g_signal_connect(button, "toggled", - G_CALLBACK (button_toggled), closure); - g_object_weak_ref (G_OBJECT (button), free_closure, closure); - - } - g_strfreev (label_v); - g_strfreev (letter_v); - - gtk_widget_show_all (widget); - - return widget; -} + ESelectionModel *selection_model; -static void -selection_changed (GObject *o, EAddressbookView *view) -{ command_state_change (view); -} - -static void -minicard_right_click (EMinicardView *minicard_view_item, GdkEvent *event, EAddressbookView *view) -{ - do_popup_menu(view, event); -} - -static void -create_minicard_view (EAddressbookView *view) -{ - GtkWidget *scrolled_window; - GtkWidget *alphabet; - GtkWidget *minicard_view; - GtkWidget *minicard_hbox; - EAddressbookReflowAdapter *adapter; - - gtk_widget_push_colormap (gdk_rgb_get_cmap ()); - - minicard_hbox = gtk_hbox_new(FALSE, 0); - - adapter = E_ADDRESSBOOK_REFLOW_ADAPTER(e_addressbook_reflow_adapter_new (view->model)); - minicard_view = e_minicard_view_widget_new(adapter); - - /* A hack */ - g_object_set_data (G_OBJECT (adapter), "view", view); - - g_signal_connect(minicard_view, "selection_change", - G_CALLBACK(selection_changed), view); - - g_signal_connect(minicard_view, "right_click", - G_CALLBACK(minicard_right_click), view); - - - view->object = G_OBJECT(minicard_view); - view->widget = minicard_hbox; - - scrolled_window = gtk_scrolled_window_new (NULL, NULL); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), - GTK_POLICY_AUTOMATIC, - GTK_POLICY_AUTOMATIC); - - gtk_container_add (GTK_CONTAINER (scrolled_window), minicard_view); - - gtk_box_pack_start(GTK_BOX(minicard_hbox), scrolled_window, TRUE, TRUE, 0); - - alphabet = create_alphabet(view); - if (alphabet) - gtk_box_pack_start(GTK_BOX(minicard_hbox), alphabet, FALSE, FALSE, 0); - - gtk_table_attach(GTK_TABLE(view), minicard_hbox, - 0, 1, - 0, 1, - GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, - 0, 0); - - gtk_widget_show_all( GTK_WIDGET(minicard_hbox) ); - - gtk_widget_pop_colormap (); - - e_reflow_model_changed (E_REFLOW_MODEL (adapter)); + selection_model = get_selection_model (view); - g_object_unref (adapter); + if (e_selection_model_selected_count (selection_model) == 1) + e_selection_model_foreach (selection_model, + (EForeachFunc)render_contact, view); + else + eab_contact_display_render (EAB_CONTACT_DISPLAY (view->contact_display), NULL, + EAB_CONTACT_DISPLAY_RENDER_NORMAL); + } static void -table_double_click(ETableScrolled *table, gint row, gint col, GdkEvent *event, EAddressbookView *view) +table_double_click(ETableScrolled *table, gint row, gint col, GdkEvent *event, EABView *view) { if (E_IS_ADDRESSBOOK_TABLE_ADAPTER(view->object)) { - EAddressbookModel *model = view->model; - ECard *card = e_addressbook_model_get_card(model, row); + EABModel *model = view->model; + EContact *contact = eab_model_get_contact (model, row); EBook *book; g_object_get(model, @@ -1231,25 +980,25 @@ table_double_click(ETableScrolled *table, gint row, gint col, GdkEvent *event, E g_assert (E_IS_BOOK (book)); - if (e_card_evolution_list (card)) - e_addressbook_show_contact_list_editor (book, card, FALSE, view->editable); + if (e_contact_get (contact, E_CONTACT_IS_LIST)) + eab_show_contact_list_editor (book, contact, FALSE, view->editable); else - e_addressbook_show_contact_editor (book, card, FALSE, view->editable); + eab_show_contact_editor (book, contact, FALSE, view->editable); g_object_unref (book); - g_object_unref (card); + g_object_unref (contact); } } static gint -table_right_click(ETableScrolled *table, gint row, gint col, GdkEvent *event, EAddressbookView *view) +table_right_click(ETableScrolled *table, gint row, gint col, GdkEvent *event, EABView *view) { do_popup_menu(view, event); return TRUE; } static gint -table_white_space_event(ETableScrolled *table, GdkEvent *event, EAddressbookView *view) +table_white_space_event(ETableScrolled *table, GdkEvent *event, EABView *view) { if (event->type == GDK_BUTTON_PRESS && ((GdkEventButton *)event)->button == 3) { do_popup_menu(view, event); @@ -1269,7 +1018,7 @@ table_drag_data_get (ETable *table, guint time, gpointer user_data) { - EAddressbookView *view = user_data; + EABView *view = user_data; if (!E_IS_ADDRESSBOOK_TABLE_ADAPTER(view->object)) return; @@ -1278,7 +1027,7 @@ table_drag_data_get (ETable *table, case DND_TARGET_TYPE_VCARD: { char *value; - value = e_card_get_vcard(view->model->data[row]); + value = e_vcard_to_string (E_VCARD (view->model->data[row]), EVC_FORMAT_VCARD_30); gtk_selection_data_set (selection_data, selection_data->target, @@ -1290,68 +1039,62 @@ table_drag_data_get (ETable *table, } static void -emit_status_message (EAddressbookView *eav, const gchar *status) +emit_status_message (EABView *eav, const gchar *status) { g_signal_emit (eav, - e_addressbook_view_signals [STATUS_MESSAGE], 0, + eab_view_signals [STATUS_MESSAGE], 0, status); } static void -emit_search_result (EAddressbookView *eav, EBookViewStatus status) +emit_search_result (EABView *eav, EBookViewStatus status) { g_signal_emit (eav, - e_addressbook_view_signals [SEARCH_RESULT], 0, + eab_view_signals [SEARCH_RESULT], 0, status); } static void -emit_folder_bar_message (EAddressbookView *eav, const gchar *message) +emit_folder_bar_message (EABView *eav, const gchar *message) { g_signal_emit (eav, - e_addressbook_view_signals [FOLDER_BAR_MESSAGE], 0, + eab_view_signals [FOLDER_BAR_MESSAGE], 0, message); } static void -status_message (GtkObject *object, const gchar *status, EAddressbookView *eav) +status_message (GtkObject *object, const gchar *status, EABView *eav) { emit_status_message (eav, status); } static void -search_result (GtkObject *object, EBookViewStatus status, EAddressbookView *eav) +search_result (GtkObject *object, EBookViewStatus status, EABView *eav) { emit_search_result (eav, status); } static void -folder_bar_message (GtkObject *object, const gchar *status, EAddressbookView *eav) +folder_bar_message (GtkObject *object, const gchar *status, EABView *eav) { emit_folder_bar_message (eav, status); } static void -stop_state_changed (GtkObject *object, EAddressbookView *eav) +stop_state_changed (GtkObject *object, EABView *eav) { command_state_change (eav); } static void -command_state_change (EAddressbookView *eav) +command_state_change (EABView *eav) { /* Reffing during emission is unnecessary. Gtk automatically refs during an emission. */ - g_signal_emit (eav, e_addressbook_view_signals [COMMAND_STATE_CHANGE], 0); + g_signal_emit (eav, eab_view_signals [COMMAND_STATE_CHANGE], 0); } static void -alphabet_state_change (EAddressbookView *eav, gunichar letter) -{ - g_signal_emit (eav, e_addressbook_view_signals [ALPHABET_STATE_CHANGE], 0, letter); -} - -static void -backend_died (GtkObject *object, EAddressbookView *eav) +backend_died (GtkObject *object, EABView *eav) { char *message = g_strdup_printf (_("The addressbook backend for\n%s\nhas crashed. " "You will have to restart Evolution in order " @@ -1362,12 +1105,52 @@ backend_died (GtkObject *object, EAddressbookView *eav) } static void -create_table_view (EAddressbookView *view) +minicard_right_click (EMinicardView *minicard_view_item, GdkEvent *event, EABView *view) +{ + do_popup_menu(view, event); +} + +static void +create_minicard_view (EABView *view) +{ + GtkWidget *scrolled_window; + GtkWidget *minicard_view; + EAddressbookReflowAdapter *adapter; + + adapter = E_ADDRESSBOOK_REFLOW_ADAPTER(e_addressbook_reflow_adapter_new (view->model)); + minicard_view = e_minicard_view_widget_new(adapter); + + g_signal_connect(minicard_view, "selection_change", + G_CALLBACK(selection_changed), view); + + g_signal_connect(minicard_view, "right_click", + G_CALLBACK(minicard_right_click), view); + + scrolled_window = gtk_scrolled_window_new (NULL, NULL); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), + GTK_POLICY_AUTOMATIC, + GTK_POLICY_AUTOMATIC); + + view->object = G_OBJECT(minicard_view); + view->widget = scrolled_window; + + gtk_container_add (GTK_CONTAINER (scrolled_window), minicard_view); + gtk_widget_show (minicard_view); + + gtk_widget_show_all( GTK_WIDGET(scrolled_window) ); + + gtk_paned_add1 (GTK_PANED (view->paned), scrolled_window); + + e_reflow_model_changed (E_REFLOW_MODEL (adapter)); +} + +static void +create_table_view (EABView *view) { ETableModel *adapter; GtkWidget *table; - adapter = e_addressbook_table_adapter_new(view->model); + adapter = eab_table_adapter_new(view->model); /* Here we create the table. We give it the three pieces of the table we've created, the header, the model, and the @@ -1395,11 +1178,7 @@ create_table_view (EAddressbookView *view) G_CALLBACK (table_drag_data_get), view); - gtk_table_attach(GTK_TABLE(view), table, - 0, 1, - 0, 1, - GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, - 0, 0); + gtk_paned_add1 (GTK_PANED (view->paned), table); gtk_widget_show( GTK_WIDGET(table) ); } @@ -1408,11 +1187,11 @@ create_table_view (EAddressbookView *view) static void treeview_row_activated(GtkTreeView *treeview, GtkTreePath *path, GtkTreeViewColumn *column, - EAddressbookView *view) + EABView *view) { - EAddressbookModel *model = view->model; + EABModel *model = view->model; int row = gtk_tree_path_get_indices (path)[0]; - ECard *card = e_addressbook_model_get_card(model, row); + ECard *card = eab_model_get_card(model, row); EBook *book; g_object_get(model, @@ -1422,16 +1201,16 @@ treeview_row_activated(GtkTreeView *treeview, g_assert (E_IS_BOOK (book)); if (e_card_evolution_list (card)) - e_addressbook_show_contact_list_editor (book, card, FALSE, view->editable); + eab_show_contact_list_editor (book, card, FALSE, view->editable); else - e_addressbook_show_contact_editor (book, card, FALSE, view->editable); + eab_show_contact_editor (book, card, FALSE, view->editable); g_object_unref (book); g_object_unref (card); } static void -create_treeview_view (EAddressbookView *view) +create_treeview_view (EABView *view) { GtkTreeModel *adapter; ECardSimple *simple; @@ -1441,7 +1220,7 @@ create_treeview_view (EAddressbookView *view) simple = e_card_simple_new(NULL); - adapter = e_addressbook_treeview_adapter_new(view->model); + adapter = eab_treeview_adapter_new(view->model); scrolled = gtk_scrolled_window_new (NULL, NULL); treeview = gtk_tree_view_new_with_model (adapter); @@ -1490,11 +1269,7 @@ create_treeview_view (EAddressbookView *view) g_signal_connect(e_treeview_get_selection_model (GTK_TREE_VIEW (treeview)), "selection_changed", G_CALLBACK(selection_changed), view); - gtk_table_attach(GTK_TABLE(view), scrolled, - 0, 1, - 0, 1, - GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, - 0, 0); + gtk_paned_add1 (GTK_PANED (view->paned), scrolled); gtk_widget_show( GTK_WIDGET(scrolled) ); @@ -1503,26 +1278,27 @@ create_treeview_view (EAddressbookView *view) #endif static void -change_view_type (EAddressbookView *view, EAddressbookViewType view_type) +change_view_type (EABView *view, EABViewType view_type) { if (view_type == view->view_type) return; if (view->widget) { + gtk_container_remove (GTK_CONTAINER (view->paned), view->widget); gtk_widget_destroy (view->widget); view->widget = NULL; } view->object = NULL; switch (view_type) { - case E_ADDRESSBOOK_VIEW_MINICARD: - create_minicard_view (view); - break; - case E_ADDRESSBOOK_VIEW_TABLE: + case EAB_VIEW_TABLE: create_table_view (view); break; + case EAB_VIEW_MINICARD: + create_minicard_view (view); + break; #ifdef WITH_ADDRESSBOOK_VIEW_TREEVIEW - case E_ADDRESSBOOK_VIEW_TREEVIEW: + case EAB_VIEW_TREEVIEW: create_treeview_view (view); break; #endif @@ -1614,7 +1390,7 @@ e_contact_print_button(GtkDialog *dialog, gint response, gpointer data) } void -e_addressbook_view_setup_menus (EAddressbookView *view, +eab_view_setup_menus (EABView *view, BonoboUIComponent *uic) { @@ -1631,7 +1407,7 @@ e_addressbook_view_setup_menus (EAddressbookView *view, } /** - * e_addressbook_view_discard_menus: + * eab_view_discard_menus: * @view: An addressbook view. * * Makes an addressbook view discard its GAL view menus and its views instance @@ -1639,7 +1415,7 @@ e_addressbook_view_setup_menus (EAddressbookView *view, * deactivated. **/ void -e_addressbook_view_discard_menus (EAddressbookView *view) +eab_view_discard_menus (EABView *view) { g_return_if_fail (view != NULL); g_return_if_fail (E_IS_ADDRESSBOOK_VIEW (view)); @@ -1661,9 +1437,9 @@ e_addressbook_view_discard_menus (EAddressbookView *view) } void -e_addressbook_view_print(EAddressbookView *view) +eab_view_print(EABView *view) { - if (view->view_type == E_ADDRESSBOOK_VIEW_MINICARD) { + if (view->view_type == EAB_VIEW_MINICARD) { char *query; EBook *book; GtkWidget *print; @@ -1673,12 +1449,10 @@ e_addressbook_view_print(EAddressbookView *view) "book", &book, NULL); print = e_contact_print_dialog_new(book, query); - - g_object_unref(book); g_free(query); gtk_widget_show_all(print); } - else if (view->view_type == E_ADDRESSBOOK_VIEW_TABLE) { + else if (view->view_type == EAB_VIEW_TABLE) { GtkWidget *dialog; EPrintable *printable; ETable *etable; @@ -1709,16 +1483,16 @@ e_addressbook_view_print(EAddressbookView *view) gtk_widget_show(dialog); } #ifdef WITH_ADDRESSBOOK_VIEW_TREEVIEW - else if (view->view_type == E_ADDRESSBOOK_VIEW_TREEVIEW) { + else if (view->view_type == EAB_VIEW_TREEVIEW) { /* XXX */ } #endif } void -e_addressbook_view_print_preview(EAddressbookView *view) +eab_view_print_preview(EABView *view) { - if (view->view_type == E_ADDRESSBOOK_VIEW_MINICARD) { + if (view->view_type == EAB_VIEW_MINICARD) { char *query; EBook *book; @@ -1727,10 +1501,9 @@ e_addressbook_view_print_preview(EAddressbookView *view) "book", &book, NULL); e_contact_print_preview(book, query); - g_object_unref(book); g_free(query); } - else if (view->view_type == E_ADDRESSBOOK_VIEW_TABLE) { + else if (view->view_type == EAB_VIEW_TABLE) { EPrintable *printable; ETable *etable; GnomePrintJob *master; @@ -1769,27 +1542,27 @@ e_addressbook_view_print_preview(EAddressbookView *view) g_object_unref (printable); } #ifdef WITH_ADDRESSBOOK_VIEW_TREEVIEW - else if (view->view_type == E_ADDRESSBOOK_VIEW_TREEVIEW) { + else if (view->view_type == EAB_VIEW_TREEVIEW) { /* XXX */ } #endif } void -e_addressbook_view_delete_selection(EAddressbookView *view) +eab_view_delete_selection(EABView *view) { - CardAndBook card_and_book; + ContactAndBook contact_and_book; - memset (&card_and_book, 0, sizeof (card_and_book)); - card_and_book.view = view; + memset (&contact_and_book, 0, sizeof (contact_and_book)); + contact_and_book.view = view; - delete (GTK_WIDGET (view), &card_and_book); + delete (GTK_WIDGET (view), &contact_and_book); } static void invisible_destroyed (gpointer data, GObject *where_object_was) { - EAddressbookView *view = data; + EABView *view = data; view->invisible = NULL; } @@ -1798,11 +1571,11 @@ selection_get (GtkWidget *invisible, GtkSelectionData *selection_data, guint info, guint time_stamp, - EAddressbookView *view) + EABView *view) { char *value; - value = e_card_list_get_vcard(view->clipboard_cards); + value = eab_contact_list_to_string (view->clipboard_contacts); gtk_selection_data_set (selection_data, GDK_SELECTION_TYPE_STRING, 8, value, strlen (value)); @@ -1812,12 +1585,12 @@ selection_get (GtkWidget *invisible, static void selection_clear_event (GtkWidget *invisible, GdkEventSelection *event, - EAddressbookView *view) + EABView *view) { - if (view->clipboard_cards) { - g_list_foreach (view->clipboard_cards, (GFunc)g_object_unref, NULL); - g_list_free (view->clipboard_cards); - view->clipboard_cards = NULL; + if (view->clipboard_contacts) { + g_list_foreach (view->clipboard_contacts, (GFunc)g_object_unref, NULL); + g_list_free (view->clipboard_contacts); + view->clipboard_contacts = NULL; } } @@ -1825,27 +1598,25 @@ static void selection_received (GtkWidget *invisible, GtkSelectionData *selection_data, guint time, - EAddressbookView *view) + EABView *view) { if (selection_data->length < 0 || selection_data->type != GDK_SELECTION_TYPE_STRING) { return; } else { /* XXX make sure selection_data->data = \0 terminated */ - GList *card_list = e_card_load_cards_from_string_with_default_charset (selection_data->data, "ISO-8859-1"); + GList *contact_list = eab_contact_list_from_string (selection_data->data); GList *l; - if (!card_list /* it wasn't a vcard list */) - return; - - for (l = card_list; l; l = l->next) { - ECard *card = l->data; + for (l = contact_list; l; l = l->next) { + EContact *contact = l->data; - e_card_merging_book_add_card (view->book, card, NULL /* XXX */, NULL); + /* XXX NULL for a callback /sigh */ + eab_merging_book_add_contact (view->book, contact, NULL /* XXX */, NULL); } - g_list_foreach (card_list, (GFunc)g_object_unref, NULL); - g_list_free (card_list); + g_list_foreach (contact_list, (GFunc)g_object_unref, NULL); + g_list_free (contact_list); } } @@ -1857,7 +1628,7 @@ add_to_list (int model_row, gpointer closure) } static GList * -get_selected_cards (EAddressbookView *view) +get_selected_contacts (EABView *view) { GList *list; GList *iterator; @@ -1867,66 +1638,64 @@ get_selected_cards (EAddressbookView *view) e_selection_model_foreach (selection, add_to_list, &list); for (iterator = list; iterator; iterator = iterator->next) { - iterator->data = e_addressbook_model_card_at (view->model, GPOINTER_TO_INT (iterator->data)); - if (iterator->data) - g_object_ref (iterator->data); + iterator->data = eab_model_get_contact (view->model, GPOINTER_TO_INT (iterator->data)); } list = g_list_reverse (list); return list; } void -e_addressbook_view_save_as (EAddressbookView *view) +eab_view_save_as (EABView *view) { - GList *list = get_selected_cards (view); + GList *list = get_selected_contacts (view); if (list) - e_contact_list_save_as (_("Save as VCard"), list, NULL); + eab_contact_list_save (_("Save as VCard"), list, NULL); e_free_object_list(list); } void -e_addressbook_view_view (EAddressbookView *view) +eab_view_view (EABView *view) { - GList *list = get_selected_cards (view); - e_addressbook_show_multiple_cards (view->book, list, view->editable); + GList *list = get_selected_contacts (view); + eab_show_multiple_contacts (view->book, list, view->editable); e_free_object_list(list); } void -e_addressbook_view_send (EAddressbookView *view) +eab_view_send (EABView *view) { - GList *list = get_selected_cards (view); + GList *list = get_selected_contacts (view); if (list) - e_addressbook_send_card_list (list, E_ADDRESSBOOK_DISPOSITION_AS_ATTACHMENT); + eab_send_contact_list (list, EAB_DISPOSITION_AS_ATTACHMENT); e_free_object_list(list); } void -e_addressbook_view_send_to (EAddressbookView *view) +eab_view_send_to (EABView *view) { - GList *list = get_selected_cards (view); + GList *list = get_selected_contacts (view); if (list) - e_addressbook_send_card_list (list, E_ADDRESSBOOK_DISPOSITION_AS_TO); + eab_send_contact_list (list, EAB_DISPOSITION_AS_TO); e_free_object_list(list); } void -e_addressbook_view_cut (EAddressbookView *view) +eab_view_cut (EABView *view) { - e_addressbook_view_copy (view); - e_addressbook_view_delete_selection (view); + eab_view_copy (view); + eab_view_delete_selection (view); } void -e_addressbook_view_copy (EAddressbookView *view) +eab_view_copy (EABView *view) { - view->clipboard_cards = get_selected_cards (view); + view->clipboard_contacts = get_selected_contacts (view); gtk_selection_owner_set (view->invisible, clipboard_atom, GDK_CURRENT_TIME); } void -e_addressbook_view_paste (EAddressbookView *view) +eab_view_paste (EABView *view) { gtk_selection_convert (view->invisible, clipboard_atom, GDK_SELECTION_TYPE_STRING, @@ -1934,7 +1703,7 @@ e_addressbook_view_paste (EAddressbookView *view) } void -e_addressbook_view_select_all (EAddressbookView *view) +eab_view_select_all (EABView *view) { ESelectionModel *model = get_selection_model (view); @@ -1944,7 +1713,7 @@ e_addressbook_view_select_all (EAddressbookView *view) } void -e_addressbook_view_show_all(EAddressbookView *view) +eab_view_show_all(EABView *view) { g_object_set(view, "query", NULL, @@ -1952,44 +1721,44 @@ e_addressbook_view_show_all(EAddressbookView *view) } void -e_addressbook_view_stop(EAddressbookView *view) +eab_view_stop(EABView *view) { if (view) - e_addressbook_model_stop (view->model); + eab_model_stop (view->model); } static void -view_transfer_cards (EAddressbookView *view, gboolean delete_from_source) +view_transfer_contacts (EABView *view, gboolean delete_from_source) { EBook *book; - GList *cards; + GList *contacts; GtkWindow *parent_window; g_object_get(view->model, "book", &book, NULL); - cards = get_selected_cards (view); + contacts = get_selected_contacts (view); parent_window = GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (view))); - e_addressbook_transfer_cards (book, cards, delete_from_source, parent_window); + eab_transfer_contacts (book, contacts, delete_from_source, parent_window); g_object_unref(book); } void -e_addressbook_view_copy_to_folder (EAddressbookView *view) +eab_view_copy_to_folder (EABView *view) { - view_transfer_cards (view, FALSE); + view_transfer_contacts (view, FALSE); } void -e_addressbook_view_move_to_folder (EAddressbookView *view) +eab_view_move_to_folder (EABView *view) { - view_transfer_cards (view, TRUE); + view_transfer_contacts (view, TRUE); } static gboolean -e_addressbook_view_selection_nonempty (EAddressbookView *view) +eab_view_selection_nonempty (EABView *view) { ESelectionModel *selection_model; @@ -2001,85 +1770,85 @@ e_addressbook_view_selection_nonempty (EAddressbookView *view) } gboolean -e_addressbook_view_can_create (EAddressbookView *view) +eab_view_can_create (EABView *view) { - return view ? e_addressbook_model_editable (view->model) : FALSE; + return view ? eab_model_editable (view->model) : FALSE; } gboolean -e_addressbook_view_can_print (EAddressbookView *view) +eab_view_can_print (EABView *view) { - return view && view->model ? e_addressbook_model_card_count (view->model) : FALSE; + return view && view->model ? eab_model_contact_count (view->model) : FALSE; } gboolean -e_addressbook_view_can_save_as (EAddressbookView *view) +eab_view_can_save_as (EABView *view) { - return view ? e_addressbook_view_selection_nonempty (view) : FALSE; + return view ? eab_view_selection_nonempty (view) : FALSE; } gboolean -e_addressbook_view_can_view (EAddressbookView *view) +eab_view_can_view (EABView *view) { - return view ? e_addressbook_view_selection_nonempty (view) : FALSE; + return view ? eab_view_selection_nonempty (view) : FALSE; } gboolean -e_addressbook_view_can_send (EAddressbookView *view) +eab_view_can_send (EABView *view) { - return view ? e_addressbook_view_selection_nonempty (view) : FALSE; + return view ? eab_view_selection_nonempty (view) : FALSE; } gboolean -e_addressbook_view_can_send_to (EAddressbookView *view) +eab_view_can_send_to (EABView *view) { - return view ? e_addressbook_view_selection_nonempty (view) : FALSE; + return view ? eab_view_selection_nonempty (view) : FALSE; } gboolean -e_addressbook_view_can_delete (EAddressbookView *view) +eab_view_can_delete (EABView *view) { - return view ? e_addressbook_view_selection_nonempty (view) && e_addressbook_model_editable (view->model) : FALSE; + return view ? eab_view_selection_nonempty (view) && eab_model_editable (view->model) : FALSE; } gboolean -e_addressbook_view_can_cut (EAddressbookView *view) +eab_view_can_cut (EABView *view) { - return view ? e_addressbook_view_selection_nonempty (view) && e_addressbook_model_editable (view->model) : FALSE; + return view ? eab_view_selection_nonempty (view) && eab_model_editable (view->model) : FALSE; } gboolean -e_addressbook_view_can_copy (EAddressbookView *view) +eab_view_can_copy (EABView *view) { - return view ? e_addressbook_view_selection_nonempty (view) : FALSE; + return view ? eab_view_selection_nonempty (view) : FALSE; } gboolean -e_addressbook_view_can_paste (EAddressbookView *view) +eab_view_can_paste (EABView *view) { - return view ? e_addressbook_model_editable (view->model) : FALSE; + return view ? eab_model_editable (view->model) : FALSE; } gboolean -e_addressbook_view_can_select_all (EAddressbookView *view) +eab_view_can_select_all (EABView *view) { - return view ? e_addressbook_model_card_count (view->model) != 0 : FALSE; + return view ? eab_model_contact_count (view->model) != 0 : FALSE; } gboolean -e_addressbook_view_can_stop (EAddressbookView *view) +eab_view_can_stop (EABView *view) { - return view ? e_addressbook_model_can_stop (view->model) : FALSE; + return view ? eab_model_can_stop (view->model) : FALSE; } gboolean -e_addressbook_view_can_copy_to_folder (EAddressbookView *view) +eab_view_can_copy_to_folder (EABView *view) { - return view ? e_addressbook_view_selection_nonempty (view) : FALSE; + return view ? eab_view_selection_nonempty (view) : FALSE; } gboolean -e_addressbook_view_can_move_to_folder (EAddressbookView *view) +eab_view_can_move_to_folder (EABView *view) { - return view ? e_addressbook_view_selection_nonempty (view) && e_addressbook_model_editable (view->model) : FALSE; + return view ? eab_view_selection_nonempty (view) && eab_model_editable (view->model) : FALSE; } diff --git a/addressbook/gui/widgets/e-addressbook-view.etspec b/addressbook/gui/widgets/e-addressbook-view.etspec index a0a0015d75..812a88b060 100644 --- a/addressbook/gui/widgets/e-addressbook-view.etspec +++ b/addressbook/gui/widgets/e-addressbook-view.etspec @@ -1,14 +1,17 @@ - - - + + + + + + + + - - - - - - + + + + + + + diff --git a/addressbook/gui/widgets/e-addressbook-view.h b/addressbook/gui/widgets/e-addressbook-view.h index dbf32811d8..1573f682ed 100644 --- a/addressbook/gui/widgets/e-addressbook-view.h +++ b/addressbook/gui/widgets/e-addressbook-view.h @@ -17,22 +17,20 @@ * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ -#ifndef __E_ADDRESSBOOK_VIEW_H__ -#define __E_ADDRESSBOOK_VIEW_H__ +#ifndef __EAB_VIEW_H__ +#define __EAB_VIEW_H__ -#include +#include #include #include #include "e-addressbook-model.h" +#include "eab-contact-display.h" #include "widgets/menus/gal-view-menus.h" #include "addressbook/backend/ebook/e-book.h" -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus */ +G_BEGIN_DECLS -/* EAddressbookView - A card displaying information about a contact. +/* EABView - A card displaying information about a contact. * * The following arguments are available: * @@ -40,36 +38,36 @@ extern "C" { * -------------------------------------------------------------------------------- */ -#define E_TYPE_ADDRESSBOOK_VIEW (e_addressbook_view_get_type ()) -#define E_ADDRESSBOOK_VIEW(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), E_TYPE_ADDRESSBOOK_VIEW, EAddressbookView)) -#define E_ADDRESSBOOK_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), E_TYPE_ADDRESSBOOK_VIEW, EAddressbookViewClass)) -#define E_IS_ADDRESSBOOK_VIEW(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), E_TYPE_ADDRESSBOOK_VIEW)) -#define E_IS_ADDRESSBOOK_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), E_TYPE_ADDRESSBOOK_VIEW)) +#define E_TYPE_AB_VIEW (eab_view_get_type ()) +#define EAB_VIEW(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), E_TYPE_AB_VIEW, EABView)) +#define EAB_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), E_TYPE_AB_VIEW, EABViewClass)) +#define E_IS_ADDRESSBOOK_VIEW(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), E_TYPE_AB_VIEW)) +#define E_IS_ADDRESSBOOK_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), E_TYPE_AB_VIEW)) typedef enum { - E_ADDRESSBOOK_VIEW_NONE, /* initialized to this */ - E_ADDRESSBOOK_VIEW_TABLE, - E_ADDRESSBOOK_VIEW_MINICARD + EAB_VIEW_NONE, /* initialized to this */ + EAB_VIEW_MINICARD, + EAB_VIEW_TABLE, #ifdef WITH_ADDRESSBOOK_VIEW_TREEVIEW - ,E_ADDRESSBOOK_VIEW_TREEVIEW + ,EAB_VIEW_TREEVIEW #endif -} EAddressbookViewType; +} EABViewType; -typedef struct _EAddressbookView EAddressbookView; -typedef struct _EAddressbookViewClass EAddressbookViewClass; +typedef struct _EABView EABView; +typedef struct _EABViewClass EABViewClass; -struct _EAddressbookView +struct _EABView { - GtkTable parent; + GtkEventBox parent; /* item specific fields */ - EAddressbookViewType view_type; + EABViewType view_type; - EAddressbookModel *model; + EABModel *model; GtkWidget *invisible; - GList *clipboard_cards; + GList *clipboard_contacts; EBook *book; char *query; @@ -77,9 +75,10 @@ struct _EAddressbookView GObject *object; GtkWidget *widget; - GtkWidget *current_alphabet_widget; - GtkWidget *vbox; + GtkWidget *scrolled; + GtkWidget *contact_display; + GtkWidget *paned; /* Menus handler and the view instance */ GalViewInstance *view_instance; @@ -88,62 +87,58 @@ struct _EAddressbookView BonoboUIComponent *uic; }; -struct _EAddressbookViewClass +struct _EABViewClass { - GtkTableClass parent_class; + GtkEventBoxClass parent_class; /* * Signals */ - void (*status_message) (EAddressbookView *view, const gchar *message); - void (*search_result) (EAddressbookView *view, EBookViewStatus status); - void (*folder_bar_message) (EAddressbookView *view, const gchar *message); - void (*command_state_change) (EAddressbookView *view); - void (*alphabet_state_change) (EAddressbookView *view, gunichar letter); + void (*status_message) (EABView *view, const gchar *message); + void (*search_result) (EABView *view, EBookViewStatus status); + void (*folder_bar_message) (EABView *view, const gchar *message); + void (*command_state_change) (EABView *view); }; -GtkWidget *e_addressbook_view_new (void); -GType e_addressbook_view_get_type (void); - -void e_addressbook_view_setup_menus (EAddressbookView *view, - BonoboUIComponent *uic); - -void e_addressbook_view_discard_menus (EAddressbookView *view); - -void e_addressbook_view_save_as (EAddressbookView *view); -void e_addressbook_view_view (EAddressbookView *view); -void e_addressbook_view_send (EAddressbookView *view); -void e_addressbook_view_send_to (EAddressbookView *view); -void e_addressbook_view_print (EAddressbookView *view); -void e_addressbook_view_print_preview (EAddressbookView *view); -void e_addressbook_view_delete_selection (EAddressbookView *view); -void e_addressbook_view_cut (EAddressbookView *view); -void e_addressbook_view_copy (EAddressbookView *view); -void e_addressbook_view_paste (EAddressbookView *view); -void e_addressbook_view_select_all (EAddressbookView *view); -void e_addressbook_view_show_all (EAddressbookView *view); -void e_addressbook_view_stop (EAddressbookView *view); -void e_addressbook_view_copy_to_folder (EAddressbookView *view); -void e_addressbook_view_move_to_folder (EAddressbookView *view); - -gboolean e_addressbook_view_can_create (EAddressbookView *view); -gboolean e_addressbook_view_can_print (EAddressbookView *view); -gboolean e_addressbook_view_can_save_as (EAddressbookView *view); -gboolean e_addressbook_view_can_view (EAddressbookView *view); -gboolean e_addressbook_view_can_send (EAddressbookView *view); -gboolean e_addressbook_view_can_send_to (EAddressbookView *view); -gboolean e_addressbook_view_can_delete (EAddressbookView *view); -gboolean e_addressbook_view_can_cut (EAddressbookView *view); -gboolean e_addressbook_view_can_copy (EAddressbookView *view); -gboolean e_addressbook_view_can_paste (EAddressbookView *view); -gboolean e_addressbook_view_can_select_all (EAddressbookView *view); -gboolean e_addressbook_view_can_stop (EAddressbookView *view); -gboolean e_addressbook_view_can_copy_to_folder (EAddressbookView *view); -gboolean e_addressbook_view_can_move_to_folder (EAddressbookView *view); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - - -#endif /* __E_ADDRESSBOOK_VIEW_H__ */ +GtkWidget *eab_view_new (void); +GType eab_view_get_type (void); + +void eab_view_setup_menus (EABView *view, + BonoboUIComponent *uic); + +void eab_view_discard_menus (EABView *view); + +void eab_view_save_as (EABView *view); +void eab_view_view (EABView *view); +void eab_view_send (EABView *view); +void eab_view_send_to (EABView *view); +void eab_view_print (EABView *view); +void eab_view_print_preview (EABView *view); +void eab_view_delete_selection (EABView *view); +void eab_view_cut (EABView *view); +void eab_view_copy (EABView *view); +void eab_view_paste (EABView *view); +void eab_view_select_all (EABView *view); +void eab_view_show_all (EABView *view); +void eab_view_stop (EABView *view); +void eab_view_copy_to_folder (EABView *view); +void eab_view_move_to_folder (EABView *view); + +gboolean eab_view_can_create (EABView *view); +gboolean eab_view_can_print (EABView *view); +gboolean eab_view_can_save_as (EABView *view); +gboolean eab_view_can_view (EABView *view); +gboolean eab_view_can_send (EABView *view); +gboolean eab_view_can_send_to (EABView *view); +gboolean eab_view_can_delete (EABView *view); +gboolean eab_view_can_cut (EABView *view); +gboolean eab_view_can_copy (EABView *view); +gboolean eab_view_can_paste (EABView *view); +gboolean eab_view_can_select_all (EABView *view); +gboolean eab_view_can_stop (EABView *view); +gboolean eab_view_can_copy_to_folder (EABView *view); +gboolean eab_view_can_move_to_folder (EABView *view); + +G_END_DECLS; + +#endif /* __EAB_VIEW_H__ */ diff --git a/addressbook/gui/widgets/e-minicard-control.c b/addressbook/gui/widgets/e-minicard-control.c deleted file mode 100644 index 7cbcfb028a..0000000000 --- a/addressbook/gui/widgets/e-minicard-control.c +++ /dev/null @@ -1,357 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * e-minicard-control.c - * - * Copyright (C) 1999, 2000, 2001, 2002, Ximian, Inc. - * - * This program 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 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. - * - * Authors: - * Chris Lahey - */ - -#include -#include - -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include "e-minicard-control.h" -#include "e-minicard-widget.h" -#include "e-card-merging.h" - -typedef struct { - EMinicardWidget *minicard; - GList *card_list; - GtkWidget *label; -} EMinicardControl; - -#define MINICARD_CONTROL_ID "OAFIID:GNOME_Evolution_Addressbook_MiniCard_Control" - - -#if 0 -enum { - PROP_RUNNING -} MyArgs; - -#define RUNNING_KEY "Clock::Running" - -static void -get_prop (BonoboPropertyBag *bag, - BonoboArg *arg, - guint arg_id, - CORBA_Environment *ev, - gpointer user_data) -{ - GObject *clock = user_data; - - switch (arg_id) { - - case PROP_RUNNING: - { - gboolean b = GPOINTER_TO_UINT (g_object_get_data (clock, RUNNING_KEY)); - BONOBO_ARG_SET_BOOLEAN (arg, b); - break; - } - - default: - g_warning ("Unhandled arg %d", arg_id); - break; - } -} - -static void -set_prop (BonoboPropertyBag *bag, - const BonoboArg *arg, - guint arg_id, - CORBA_Environment *ev, - gpointer user_data) -{ - GtkClock *clock = user_data; - - switch (arg_id) { - - case PROP_RUNNING: - { - guint i; - - i = BONOBO_ARG_GET_BOOLEAN (arg); - - if (i) - gtk_clock_start (clock); - else - gtk_clock_stop (clock); - - g_object_set_data (clock, RUNNING_KEY, - GUINT_TO_POINTER (i)); - break; - } - - default: - g_warning ("Unhandled arg %d", arg_id); - break; - } -} -#endif - -/* - * Bonobo::PersistStream - * - * These two functions implement the Bonobo::PersistStream load and - * save methods which allow data to be loaded into and out of the - * BonoboObject. - */ -static char * -stream_read (Bonobo_Stream stream) -{ - Bonobo_Stream_iobuf *buffer; - CORBA_Environment ev; - char *data = NULL; - gint length = 0; - - CORBA_exception_init (&ev); - do { -#define READ_CHUNK_SIZE 65536 - Bonobo_Stream_read (stream, READ_CHUNK_SIZE, - &buffer, &ev); - - if (ev._major != CORBA_NO_EXCEPTION) { - CORBA_exception_free (&ev); - return NULL; - } - - if (buffer->_length <= 0) - break; - - data = g_realloc (data, length + buffer->_length + 1); - - memcpy (data + length, buffer->_buffer, buffer->_length); - - length += buffer->_length; - - CORBA_free (buffer); - } while (1); - - CORBA_free (buffer); - CORBA_exception_free (&ev); - - if (data) - data[length] = '\0'; - else - data = g_strdup(""); - - return data; -} /* stream_read */ - -/* - * This function implements the Bonobo::PersistStream:load method. - */ -static void -pstream_load (BonoboPersistStream *ps, const Bonobo_Stream stream, - Bonobo_Persist_ContentType type, void *data, - CORBA_Environment *ev) -{ - GList *list; - char *vcard; - EMinicardControl *minicard_control = data; - - if (type && g_ascii_strcasecmp (type, "text/vCard") != 0 && - g_ascii_strcasecmp (type, "text/x-vCard") != 0) { - CORBA_exception_set (ev, CORBA_USER_EXCEPTION, - ex_Bonobo_Persist_WrongDataType, NULL); - return; - } - - if ((vcard = stream_read (stream)) == NULL) { - CORBA_exception_set (ev, CORBA_USER_EXCEPTION, - ex_Bonobo_Persist_FileNotFound, NULL); - return; - } - - e_free_object_list (minicard_control->card_list); - list = e_card_load_cards_from_string_with_default_charset(vcard, "ISO-8859-1"); - g_free(vcard); - minicard_control->card_list = list; - if (list) - g_object_set(minicard_control->minicard, - "card", list->data, - NULL); - if (list && list->next) { - char *message; - int length = g_list_length (list) - 1; - if (length > 1) { - message = g_strdup_printf (_("and %d other cards."), length); - } else { - message = g_strdup_printf (_("and one other card.")); - } - gtk_label_set_text (GTK_LABEL (minicard_control->label), message); - g_free (message); - gtk_widget_show (minicard_control->label); - } else { - gtk_widget_hide (minicard_control->label); - } -} /* pstream_load */ - -/* - * This function implements the Bonobo::PersistStream:save method. - */ -static void -pstream_save (BonoboPersistStream *ps, const Bonobo_Stream stream, - Bonobo_Persist_ContentType type, void *data, - CORBA_Environment *ev) -{ - EMinicardControl *minicard_control = data; - char *vcard; - int length; - - if (type && g_ascii_strcasecmp (type, "text/vCard") != 0 && - g_ascii_strcasecmp (type, "text/x-vCard") != 0) { - CORBA_exception_set (ev, CORBA_USER_EXCEPTION, - ex_Bonobo_Persist_WrongDataType, NULL); - return; - } - - vcard = e_card_list_get_vcard(minicard_control->card_list); - length = strlen (vcard); - bonobo_stream_client_write (stream, vcard, length, ev); - g_free (vcard); -} /* pstream_save */ - -static Bonobo_Persist_ContentTypeList * -pstream_get_content_types (BonoboPersistStream *ps, void *closure, - CORBA_Environment *ev) -{ - return bonobo_persist_generate_content_types (2, "text/vCard", "text/x-vCard"); -} - -static void -book_open_cb (EBook *book, EBookStatus status, gpointer closure) -{ - GList *list = closure; - if (status == E_BOOK_STATUS_SUCCESS) { - GList *p; - for (p = list; p; p = p->next) { - e_card_merging_book_add_card(book, p->data, NULL, NULL); - } - } - if (book) - g_object_unref (book); - e_free_object_list (list); -} - -static void -save_in_addressbook(GtkWidget *button, gpointer data) -{ - EMinicardControl *minicard_control = data; - GList *list, *p; - EBook *book; - - book = e_book_new (); - - list = g_list_copy (minicard_control->card_list); - - for (p = list; p; p = p->next) - g_object_ref (p->data); - - addressbook_load_default_book (book, book_open_cb, list); -} - -static void -free_struct (gpointer data, GObject *where_object_was) -{ - EMinicardControl *minicard_control = data; - e_free_object_list (minicard_control->card_list); - g_free (minicard_control); -} - -BonoboControl * -e_minicard_control_new (void) -{ -#if 0 - BonoboPropertyBag *pb; -#endif - BonoboControl *control; - BonoboPersistStream *stream; - GtkWidget *minicard; - GtkWidget *button; - GtkWidget *label; - GtkWidget *vbox; - - EMinicardControl *minicard_control = g_new (EMinicardControl, 1); - - - minicard_control->card_list = NULL; - minicard_control->minicard = NULL; - minicard_control->label = NULL; - - /* Create the control. */ - - minicard = e_minicard_widget_new (); - gtk_widget_show (minicard); - minicard_control->minicard = E_MINICARD_WIDGET (minicard); - - /* This is intentionally not shown. */ - label = gtk_label_new (""); - minicard_control->label = label; - - button = gtk_button_new_with_label(_("Save in addressbook")); - g_signal_connect (button, "clicked", - G_CALLBACK (save_in_addressbook), minicard_control); - gtk_widget_show (button); - - vbox = gtk_vbox_new(FALSE, 0); - gtk_box_pack_start(GTK_BOX(vbox), minicard, TRUE, TRUE, 0); - gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); - gtk_box_pack_start(GTK_BOX(vbox), button, FALSE, FALSE, 0); - gtk_widget_show (vbox); - - control = bonobo_control_new (vbox); - - g_object_weak_ref (G_OBJECT (control), free_struct, minicard_control); - - stream = bonobo_persist_stream_new (pstream_load, pstream_save, - pstream_get_content_types, - MINICARD_CONTROL_ID, - minicard_control); - -#if 0 - /* Create the properties. */ - pb = bonobo_property_bag_new (get_prop, set_prop, clock); - bonobo_control_set_properties (control, pb); - - bonobo_property_bag_add (pb, "running", PROP_RUNNING, - BONOBO_ARG_BOOLEAN, NULL, - "Whether or not the clock is running", 0); -#endif - - if (stream == NULL) { - bonobo_object_unref (BONOBO_OBJECT (control)); - return NULL; - } - - bonobo_object_add_interface (BONOBO_OBJECT (control), - BONOBO_OBJECT (stream)); - - return control; -} diff --git a/addressbook/gui/widgets/e-minicard-control.h b/addressbook/gui/widgets/e-minicard-control.h deleted file mode 100644 index bc0d934384..0000000000 --- a/addressbook/gui/widgets/e-minicard-control.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef __E_MINICARD_CONTROL_H__ -#define __E_MINICARD_CONTROL_H__ - -#include - -BonoboControl *e_minicard_control_new (void); - -#endif /* __E_MINICARD_CONTROL_H__ */ diff --git a/addressbook/gui/widgets/e-minicard-label.c b/addressbook/gui/widgets/e-minicard-label.c index 607170aea4..31935164d7 100644 --- a/addressbook/gui/widgets/e-minicard-label.c +++ b/addressbook/gui/widgets/e-minicard-label.c @@ -22,7 +22,7 @@ #include #include "e-minicard-label.h" -#include "e-addressbook-marshal.h" +#include "eab-marshal.h" #include #include @@ -172,7 +172,7 @@ e_minicard_label_class_init (EMinicardLabelClass *klass) G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET (EMinicardLabelClass, style_set), NULL, NULL, - e_addressbook_marshal_VOID__OBJECT, + eab_marshal_VOID__OBJECT, G_TYPE_NONE, 1, GTK_TYPE_STYLE); diff --git a/addressbook/gui/widgets/e-minicard-view-widget.c b/addressbook/gui/widgets/e-minicard-view-widget.c index c90a581975..ff1bdc1f06 100644 --- a/addressbook/gui/widgets/e-minicard-view-widget.c +++ b/addressbook/gui/widgets/e-minicard-view-widget.c @@ -26,7 +26,7 @@ #include #include -#include "e-addressbook-marshal.h" +#include "eab-marshal.h" #include "e-minicard-view-widget.h" static void e_minicard_view_widget_init (EMinicardViewWidget *widget); @@ -38,7 +38,6 @@ static void e_minicard_view_widget_reflow (ECanvas *canvas); static void e_minicard_view_widget_size_allocate (GtkWidget *widget, GtkAllocation *allocation); static void e_minicard_view_widget_style_set (GtkWidget *widget, GtkStyle *previous_style); static void e_minicard_view_widget_realize (GtkWidget *widget); -static gboolean e_minicard_view_widget_real_focus_in_event (GtkWidget *widget, GdkEventFocus *event); static ECanvasClass *parent_class = NULL; @@ -135,7 +134,7 @@ e_minicard_view_widget_class_init (EMinicardViewWidgetClass *klass) G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (EMinicardViewWidgetClass, selection_change), NULL, NULL, - e_addressbook_marshal_NONE__NONE, + eab_marshal_NONE__NONE, G_TYPE_NONE, 0); signals [COLUMN_WIDTH_CHANGED] = @@ -144,7 +143,7 @@ e_minicard_view_widget_class_init (EMinicardViewWidgetClass *klass) G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (EMinicardViewWidgetClass, column_width_changed), NULL, NULL, - e_addressbook_marshal_NONE__DOUBLE, + eab_marshal_NONE__DOUBLE, G_TYPE_NONE, 1, G_TYPE_DOUBLE); signals [RIGHT_CLICK] = @@ -153,42 +152,18 @@ e_minicard_view_widget_class_init (EMinicardViewWidgetClass *klass) G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (EMinicardViewWidgetClass, right_click), NULL, NULL, - e_addressbook_marshal_INT__POINTER, + eab_marshal_INT__POINTER, G_TYPE_INT, 1, G_TYPE_POINTER); widget_class->style_set = e_minicard_view_widget_style_set; widget_class->realize = e_minicard_view_widget_realize; widget_class->size_allocate = e_minicard_view_widget_size_allocate; - widget_class->focus_in_event = e_minicard_view_widget_real_focus_in_event; canvas_class->reflow = e_minicard_view_widget_reflow; klass->selection_change = NULL; klass->column_width_changed = NULL; klass->right_click = NULL; - -} - -static gboolean -e_minicard_view_widget_real_focus_in_event(GtkWidget *widget, GdkEventFocus *event) -{ - GnomeCanvas *canvas; - EMinicardViewWidget *view; - - canvas = GNOME_CANVAS (widget); - view = E_MINICARD_VIEW_WIDGET(widget); - - if (!canvas->focused_item) { - EReflow *reflow = E_REFLOW (view->emv); - if (reflow->count) { - int unsorted = e_sorter_sorted_to_model (E_SORTER (reflow->sorter), 0); - - if (unsorted != -1) - canvas->focused_item = reflow->items [unsorted]; - } - } - - return GTK_WIDGET_CLASS(parent_class)->focus_in_event (widget, event); } static void @@ -325,6 +300,18 @@ selection_change (ESelectionModel *esm, EMinicardViewWidget *widget) signals [SELECTION_CHANGE], 0); } +static void +selection_row_change (ESelectionModel *esm, int row, EMinicardViewWidget *widget) +{ + gboolean selected = e_selection_model_is_row_selected (esm, row); + + /* we only handle the selected case here */ + if (!selected) + return; + + selection_change (esm, widget); +} + static void column_width_changed (ESelectionModel *esm, double width, EMinicardViewWidget *widget) { @@ -356,6 +343,7 @@ e_minicard_view_widget_style_set (GtkWidget *widget, GtkStyle *previous_style) GTK_WIDGET_CLASS(parent_class)->style_set (widget, previous_style); } + static void e_minicard_view_widget_realize (GtkWidget *widget) { @@ -379,6 +367,9 @@ e_minicard_view_widget_realize (GtkWidget *widget) g_signal_connect (E_REFLOW(view->emv)->selection, "selection_changed", G_CALLBACK (selection_change), view); + g_signal_connect (E_REFLOW(view->emv)->selection, + "selection_row_changed", + G_CALLBACK (selection_row_change), view); g_signal_connect (view->emv, "column_width_changed", G_CALLBACK (column_width_changed), view); diff --git a/addressbook/gui/widgets/e-minicard-view.c b/addressbook/gui/widgets/e-minicard-view.c index 18c4049e65..3c588c9ef2 100644 --- a/addressbook/gui/widgets/e-minicard-view.c +++ b/addressbook/gui/widgets/e-minicard-view.c @@ -23,9 +23,10 @@ #include "e-minicard-view.h" -#include "e-addressbook-util.h" +#include "eab-gui-util.h" +#include "eab-marshal.h" +#include "util/eab-book-util.h" -#include "e-addressbook-marshal.h" #include #include #include @@ -83,7 +84,7 @@ e_minicard_view_drag_data_get(GtkWidget *widget, case DND_TARGET_TYPE_VCARD_LIST: { char *value; - value = e_card_list_get_vcard(view->drag_list); + value = eab_contact_list_to_string (view->drag_list); gtk_selection_data_set (selection_data, selection_data->target, @@ -149,7 +150,7 @@ set_empty_message (EMinicardView *view) } static void -writable_status_change (EAddressbookModel *model, gboolean writable, EMinicardView *view) +writable_status_change (EABModel *model, gboolean writable, EMinicardView *view) { set_empty_message (view); } @@ -177,13 +178,12 @@ e_minicard_view_set_property (GObject *object, case PROP_ADAPTER: if (view->adapter) { if (view->writable_status_id) { - EAddressbookModel *model; + EABModel *model; g_object_get (view->adapter, "model", &model, NULL); if (model) { g_signal_handler_disconnect (model, view->writable_status_id); - g_object_unref (model); } } @@ -197,7 +197,7 @@ e_minicard_view_set_property (GObject *object, "model", view->adapter, NULL); if (view->adapter) { - EAddressbookModel *model; + EABModel *model; g_object_get (view->adapter, "model", &model, NULL); @@ -277,13 +277,12 @@ e_minicard_view_dispose (GObject *object) if (view->adapter) { if (view->writable_status_id) { - EAddressbookModel *model; + EABModel *model; g_object_get (view->adapter, "model", &model, NULL); if (model) { g_signal_handler_disconnect (model, view->writable_status_id); - g_object_unref (model); } } @@ -323,10 +322,8 @@ e_minicard_view_event (GnomeCanvasItem *item, GdkEvent *event) EBook *book; g_object_get(view, "book", &book, NULL); - if (book && E_IS_BOOK (book)) { - e_addressbook_show_contact_editor (book, e_card_new(""), TRUE, editable); - g_object_unref (book); - } + if (book && E_IS_BOOK (book)) + eab_show_contact_editor (book, e_contact_new(), TRUE, editable); } return TRUE; } @@ -391,7 +388,7 @@ static void do_remove (int i, gpointer user_data) { EBook *book; - ECard *card; + EContact *contact; ViewCbClosure *viewcbclosure = user_data; EMinicardView *view = viewcbclosure->view; EBookCallback cb = viewcbclosure->cb; @@ -401,12 +398,11 @@ do_remove (int i, gpointer user_data) "book", &book, NULL); - card = e_addressbook_reflow_adapter_get_card (view->adapter, i); + contact = e_addressbook_reflow_adapter_get_contact (view->adapter, i); - e_book_remove_card(book, card, cb, closure); + e_book_async_remove_contact(book, contact, cb, closure); - g_object_unref (card); - g_object_unref (book); + g_object_unref (contact); } #if 0 @@ -425,13 +421,13 @@ compare_to_utf_str (EMinicard *card, const char *utf_str) g_object_get(card->card, "file_as", &file_as, NULL); - if (file_as) { - int cmp = g_utf8_strcasecmp (file_as, utf_str); - g_free (file_as); - return cmp; - } + if (file_as) + return g_utf8_strcasecmp (file_as, utf_str); + else + return 0; + } else { + return 0; } - return 0; } #endif @@ -486,7 +482,7 @@ e_minicard_view_class_init (EMinicardViewClass *klass) G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (EMinicardViewClass, right_click), NULL, NULL, - e_addressbook_marshal_INT__POINTER, + eab_marshal_INT__POINTER, G_TYPE_INT, 1, G_TYPE_POINTER); item_class->event = e_minicard_view_event; @@ -567,7 +563,7 @@ static void add_to_list (int 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_list_prepend (mal->list, e_addressbook_reflow_adapter_get_contact (mal->adapter, index)); } GList * diff --git a/addressbook/gui/widgets/e-minicard-widget-test.c b/addressbook/gui/widgets/e-minicard-widget-test.c deleted file mode 100644 index 9a8d27d21c..0000000000 --- a/addressbook/gui/widgets/e-minicard-widget-test.c +++ /dev/null @@ -1,117 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* test-minicard.c - * - * Copyright (C) 2000 Ximian, Inc. - * Author: Chris Lahey - * - * This program 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 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. - * - */ - -#define TEST_VCARD \ -"BEGIN:VCARD -" \ -"FN:Nat -" \ -"N:Friedman;Nat;D;Mr. -" \ -"ORG:Ximian, Inc. -" \ -"TITLE:Head Geek -" \ -"ROLE:Programmer/Executive -" \ -"BDAY:1977-08-06 -" \ -"TEL;WORK:617 679 1984 -" \ -"TEL;CELL:123 456 7890 -" \ -"EMAIL;INTERNET:nat@nat.org -" \ -"EMAIL;INTERNET:nat@ximian.com -" \ -"ADR;WORK;POSTAL:P.O. Box 101;;;Any Town;CA;91921-1234; -" \ -"ADR;HOME;POSTAL;INTL:P.O. Box 202;;;Any Town 2;MI;12344-4321;USA -" \ -"END:VCARD -" \ -" -" - -#include "config.h" -#include -#include -#include -#include "e-minicard-widget.h" - -/* This is a horrible thing to do, but it is just a test. */ - -static void destroy_callback(gpointer data, GObject *where_object_was) -{ - exit(0); -} - -#if 0 -static void about_callback( GtkWidget *widget, gpointer data ) -{ - - const gchar *authors[] = - { - "Christopher James Lahey ", - NULL - }; - - GtkWidget *about = - gnome_about_new ( _( "Minicard Widget Test" ), VERSION, - _( "Copyright (C) 2000, Ximian, Inc." ), - authors, - _( "This should test the minicard widget" ), - NULL); - gtk_widget_show (about); -} -#endif - -int main( int argc, char *argv[] ) -{ - GtkWidget *app; - GtkWidget *minicard; - ECard *card; - - /* bindtextdomain (PACKAGE, GNOMELOCALEDIR); - textdomain (PACKAGE);*/ - - gnome_init( "Minicard Widget Test", VERSION, argc, argv); - app = gnome_app_new("Minicard Widget Test", NULL); - - minicard = e_minicard_widget_new(); - card = e_card_new(TEST_VCARD); - g_object_set(minicard, - "card", card, - NULL); - - gnome_app_set_contents( GNOME_APP( app ), minicard ); - - /* Connect the signals */ - g_object_weak_ref (app, destroy_callback, app); - - gtk_widget_show_all( app ); - - gtk_main(); - - /* Not reached. */ - return 0; -} diff --git a/addressbook/gui/widgets/e-minicard-widget.c b/addressbook/gui/widgets/e-minicard-widget.c deleted file mode 100644 index e8f33673c3..0000000000 --- a/addressbook/gui/widgets/e-minicard-widget.c +++ /dev/null @@ -1,264 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * e-table-field-chooser.c - * Copyright (C) 2000 Ximian, Inc. - * Author: Chris Lahey - * - * 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 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 library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#include -#include -#include -#include "e-minicard-widget.h" -#include "e-minicard.h" - -static void e_minicard_widget_init (EMinicardWidget *card); -static void e_minicard_widget_class_init (EMinicardWidgetClass *klass); -static void e_minicard_widget_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); -static void e_minicard_widget_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); -static void e_minicard_widget_dispose (GObject *object); -static void e_minicard_widget_size_request (GtkWidget *widget, GtkRequisition *requisition); -static void e_minicard_widget_size_allocate (GtkWidget *widget, GtkAllocation *allocation); -static void e_minicard_widget_reflow (ECanvas *canvas); - -static ECanvasClass *parent_class = NULL; - -/* The arguments we take */ -enum { - PROP_0, - PROP_CARD, -}; - -GType -e_minicard_widget_get_type (void) -{ - static GType type = 0; - - if (!type) { - static const GTypeInfo info = { - sizeof (EMinicardWidgetClass), - NULL, /* base_init */ - NULL, /* base_finalize */ - (GClassInitFunc) e_minicard_widget_class_init, - NULL, /* class_finalize */ - NULL, /* class_data */ - sizeof (EMinicardWidget), - 0, /* n_preallocs */ - (GInstanceInitFunc) e_minicard_widget_init, - }; - - type = g_type_register_static (e_canvas_get_type (), "EMinicardWidget", &info, 0); - } - - return type; -} - -static void -e_minicard_widget_class_init (EMinicardWidgetClass *klass) -{ - GObjectClass *object_class; - GtkWidgetClass *widget_class; - ECanvasClass *ecanvas_class; - - object_class = G_OBJECT_CLASS(klass); - widget_class = GTK_WIDGET_CLASS(klass); - ecanvas_class = E_CANVAS_CLASS(klass); - - parent_class = g_type_class_peek_parent (klass); - - object_class->set_property = e_minicard_widget_set_property; - object_class->get_property = e_minicard_widget_get_property; - object_class->dispose = e_minicard_widget_dispose; - - widget_class->size_request = e_minicard_widget_size_request; - widget_class->size_allocate = e_minicard_widget_size_allocate; - - ecanvas_class->reflow = e_minicard_widget_reflow; - - g_object_class_install_property (object_class, PROP_CARD, - g_param_spec_object ("card", - _("Card"), - /*_( */"XXX blurb" /*)*/, - E_TYPE_CARD, - G_PARAM_READWRITE)); -} - -static void -e_minicard_widget_size_request(GtkWidget *widget, GtkRequisition *requisition) -{ - double height; - EMinicardWidget *emw = E_MINICARD_WIDGET(widget); - g_object_get(emw->item, - "height", &height, - NULL); - if (height <= 0) - height = 1; - widget->requisition.height = height; - widget->requisition.width = 200; - requisition->height = height; - requisition->width = 200; -} - -static void -e_minicard_widget_size_allocate(GtkWidget *widget, GtkAllocation *allocation) -{ - double height; - EMinicardWidget *emw = E_MINICARD_WIDGET(widget); - gnome_canvas_item_set( emw->item, - "width", (double) allocation->width, - NULL ); - g_object_get(emw->item, - "height", &height, - NULL); - height = MAX(height, allocation->height); - gnome_canvas_set_scroll_region(GNOME_CANVAS( emw ), 0, 0, allocation->width - 1, height - 1); - gnome_canvas_item_set( emw->rect, - "x2", (double) allocation->width, - "y2", (double) height, - NULL ); - if (GTK_WIDGET_CLASS(parent_class)->size_allocate) - GTK_WIDGET_CLASS(parent_class)->size_allocate(widget, allocation); -} - -static void e_minicard_widget_reflow(ECanvas *canvas) -{ - double height; - EMinicardWidget *emw = E_MINICARD_WIDGET(canvas); - g_object_get(emw->item, - "height", &height, - NULL); - - height = MAX(height, GTK_WIDGET(emw)->allocation.height); - - gnome_canvas_set_scroll_region (GNOME_CANVAS(emw), 0, 0, GTK_WIDGET(emw)->allocation.width - 1, height - 1); - gnome_canvas_item_set( emw->rect, - "x2", (double) GTK_WIDGET(emw)->allocation.width, - "y2", (double) height, - NULL ); - - gtk_widget_queue_resize(GTK_WIDGET(canvas)); -} - -static void -e_minicard_widget_init (EMinicardWidget *emw) -{ - emw->rect = gnome_canvas_item_new(gnome_canvas_root(GNOME_CANVAS(emw)), - gnome_canvas_rect_get_type(), - "x1", (double) 0, - "y1", (double) 0, - "x2", (double) 100, - "y2", (double) 100, - "fill_color", "white", - NULL ); - - emw->item = gnome_canvas_item_new(gnome_canvas_root(GNOME_CANVAS(emw)), - e_minicard_get_type(), - "width", (double) 100, - NULL ); - -#if PENDING_PORT_WORK - /* XXX this crashes since the canvas has no h/v adjustments. */ - gnome_canvas_set_scroll_region ( GNOME_CANVAS( emw ), - 0, 0, - 100, 100 ); -#endif - emw->card = NULL; -} - -static void -e_minicard_widget_dispose (GObject *object) -{ - EMinicardWidget *emw = E_MINICARD_WIDGET(object); - - if (emw->card) { - g_object_unref (emw->card); - emw->card = NULL; - } - - if (G_OBJECT_CLASS(parent_class)->dispose) - G_OBJECT_CLASS(parent_class)->dispose(object); -} - -GtkWidget* -e_minicard_widget_new (void) -{ - GtkWidget *widget = GTK_WIDGET (g_object_new (E_TYPE_MINICARD_WIDGET, NULL)); - return widget; -} - -static void -e_minicard_widget_set_property (GObject *object, - guint prop_id, - const GValue *value, - GParamSpec *pspec) -{ - EMinicardWidget *emw = E_MINICARD_WIDGET(object); - gpointer ptr; - - switch (prop_id){ - case PROP_CARD: - ptr = g_value_get_object (value); - e_minicard_widget_set_card (emw, ptr ? E_CARD (ptr) : NULL); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -e_minicard_widget_get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec) -{ - EMinicardWidget *emw = E_MINICARD_WIDGET(object); - - switch (prop_id) { - case PROP_CARD: - if (emw->card) - g_value_set_object (value, emw->card); - else - g_value_set_object (value, NULL); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - 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) - g_object_unref (emw->card); - - emw->card = card; - - if (emw->card) - g_object_ref (emw->card); - - if (emw->item) - g_object_set (emw->item, - "card", emw->card, - NULL); - } -} diff --git a/addressbook/gui/widgets/e-minicard-widget.h b/addressbook/gui/widgets/e-minicard-widget.h deleted file mode 100644 index 829ad8f77d..0000000000 --- a/addressbook/gui/widgets/e-minicard-widget.h +++ /dev/null @@ -1,76 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* e-minicard-widget.h - * Copyright (C) 2000 Ximian, Inc. - * Author: Chris Lahey - * - * 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 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 library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ -#ifndef __E_MINICARD_WIDGET_H__ -#define __E_MINICARD_WIDGET_H__ - -#include -#include "addressbook/backend/ebook/e-card.h" - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus */ - -/* EMinicardWidget - A card displaying information about a contact. - * - * The following arguments are available: - * - * name type read/write description - * -------------------------------------------------------------------------------- - */ - -#define E_TYPE_MINICARD_WIDGET (e_minicard_widget_get_type ()) -#define E_MINICARD_WIDGET(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), E_TYPE_MINICARD_WIDGET, EMinicardWidget)) -#define E_MINICARD_WIDGET_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), E_TYPE_MINICARD_WIDGET, EMinicardWidgetClass)) -#define E_IS_MINICARD_WIDGET(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), E_TYPE_MINICARD_WIDGET)) -#define E_IS_MINICARD_WIDGET_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), E_TYPE_MINICARD_WIDGET)) - - -typedef struct _EMinicardWidget EMinicardWidget; -typedef struct _EMinicardWidgetClass EMinicardWidgetClass; - -struct _EMinicardWidget -{ - ECanvas parent; - - /* item specific fields */ - GnomeCanvasItem *item; - - GnomeCanvasItem *rect; - ECard *card; -}; - -struct _EMinicardWidgetClass -{ - ECanvasClass parent_class; -}; - - -GtkWidget *e_minicard_widget_new(void); -GType e_minicard_widget_get_type (void); - -void e_minicard_widget_set_card (EMinicardWidget *, ECard *); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - - -#endif /* __E_MINICARD_WIDGET_H__ */ diff --git a/addressbook/gui/widgets/e-minicard.c b/addressbook/gui/widgets/e-minicard.c index 7ce6d2f518..f9aa893dc3 100644 --- a/addressbook/gui/widgets/e-minicard.c +++ b/addressbook/gui/widgets/e-minicard.c @@ -33,14 +33,13 @@ #include #include #include "addressbook/backend/ebook/e-book.h" -#include "e-addressbook-marshal.h" -#include "e-addressbook-util.h" +#include "eab-marshal.h" +#include "eab-gui-util.h" #include "e-minicard.h" #include "e-minicard-label.h" #include "e-minicard-view.h" #include "e-contact-editor.h" -#include "e-card-merging.h" -#include "ebook/e-destination.h" +#include "util/eab-destination.h" static void e_minicard_init (EMinicard *card); static void e_minicard_class_init (EMinicardClass *klass); @@ -64,7 +63,7 @@ static GnomeCanvasGroupClass *parent_class = NULL; typedef struct _EMinicardField EMinicardField; struct _EMinicardField { - ECardSimpleField field; + EContactField field; GnomeCanvasItem *label; }; @@ -90,7 +89,7 @@ enum { PROP_SELECTED, PROP_HAS_CURSOR, PROP_EDITABLE, - PROP_CARD + PROP_CONTACT }; enum { @@ -185,11 +184,11 @@ e_minicard_class_init (EMinicardClass *klass) FALSE, G_PARAM_READWRITE)); - g_object_class_install_property (object_class, PROP_CARD, - g_param_spec_object ("card", - _("Card"), + g_object_class_install_property (object_class, PROP_CONTACT, + g_param_spec_object ("contact", + _("Contact"), /*_( */"XXX blurb" /*)*/, - E_TYPE_CARD, + E_TYPE_CONTACT, G_PARAM_READWRITE)); e_minicard_signals [SELECTED] = @@ -198,7 +197,7 @@ e_minicard_class_init (EMinicardClass *klass) G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (EMinicardClass, selected), NULL, NULL, - e_addressbook_marshal_INT__POINTER, + eab_marshal_INT__POINTER, G_TYPE_INT, 1, G_TYPE_POINTER); e_minicard_signals [DRAG_BEGIN] = @@ -207,7 +206,7 @@ e_minicard_class_init (EMinicardClass *klass) G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (EMinicardClass, drag_begin), NULL, NULL, - e_addressbook_marshal_INT__POINTER, + eab_marshal_INT__POINTER, G_TYPE_INT, 1, G_TYPE_POINTER); e_minicard_signals [STYLE_SET] = @@ -216,7 +215,7 @@ e_minicard_class_init (EMinicardClass *klass) G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET (EMinicardClass, style_set), NULL, NULL, - e_addressbook_marshal_VOID__OBJECT, + eab_marshal_VOID__OBJECT, G_TYPE_NONE, 1, GTK_TYPE_STYLE); @@ -231,7 +230,6 @@ e_minicard_class_init (EMinicardClass *klass) static void e_minicard_init (EMinicard *minicard) { - /* minicard->card = NULL;*/ minicard->rect = NULL; minicard->fields = NULL; minicard->width = 10; @@ -241,8 +239,7 @@ e_minicard_init (EMinicard *minicard) minicard->editable = FALSE; minicard->has_cursor = FALSE; - minicard->card = NULL; - minicard->simple = e_card_simple_new(NULL); + minicard->contact = NULL; minicard->list_icon_pixbuf = gdk_pixbuf_new_from_file (EVOLUTION_IMAGESDIR "/" LIST_ICON_FILENAME, NULL); minicard->list_icon_size = gdk_pixbuf_get_height (minicard->list_icon_pixbuf); @@ -344,15 +341,12 @@ e_minicard_set_property (GObject *object, guint prop_id, const GValue *value, G if (e_minicard->has_cursor != g_value_get_boolean (value)) set_has_cursor (e_minicard, g_value_get_boolean (value)); break; - case PROP_CARD: - if (e_minicard->card) - g_object_unref (e_minicard->card); - e_minicard->card = E_CARD(g_value_get_object (value)); - if (e_minicard->card) - g_object_ref (e_minicard->card); - g_object_set(e_minicard->simple, - "card", e_minicard->card, - NULL); + case PROP_CONTACT: + if (e_minicard->contact) + g_object_unref (e_minicard->contact); + e_minicard->contact = E_CONTACT(g_value_get_object (value)); + if (e_minicard->contact) + g_object_ref (e_minicard->contact); remodel(e_minicard); e_canvas_item_request_reflow(item); e_minicard->changed = FALSE; @@ -389,9 +383,8 @@ e_minicard_get_property (GObject *object, guint prop_id, GValue *value, GParamS case PROP_EDITABLE: g_value_set_boolean (value, e_minicard->editable); break; - case PROP_CARD: - e_card_simple_sync_card(e_minicard->simple); - g_value_set_object (value, e_minicard->card); + case PROP_CONTACT: + g_value_set_object (value, e_minicard->contact); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); @@ -436,10 +429,8 @@ e_minicard_finalize (GObject *object) e_minicard = E_MINICARD (object); - if (e_minicard->card) - g_object_unref (e_minicard->card); - if (e_minicard->simple) - g_object_unref (e_minicard->simple); + if (e_minicard->contact) + g_object_unref (e_minicard->contact); if (G_OBJECT_CLASS (parent_class)->finalize) (* G_OBJECT_CLASS (parent_class)->finalize) (object); @@ -523,14 +514,6 @@ e_minicard_unrealize (GnomeCanvasItem *item) (* GNOME_CANVAS_ITEM_CLASS(parent_class)->unrealize) (item); } -static void -card_modified_cb (EBook* book, EBookStatus status, gpointer user_data) -{ - d(g_print ("%s: %s(): a card was modified\n", __FILE__, G_GNUC_FUNCTION)); - if (status != E_BOOK_STATUS_SUCCESS) - e_addressbook_error_dialog (_("Error modifying card"), status); -} - /* Callback used when the contact editor is closed */ static void editor_closed_cb (GtkObject *editor, gpointer data) @@ -560,35 +543,8 @@ e_minicard_event (GnomeCanvasItem *item, GdkEvent *event) if (!e_minicard->selected) { e_minicard_selected(e_minicard, event); } - } else { - EBook *book = NULL; - - if (e_minicard->changed) { - - e_card_simple_sync_card(e_minicard->simple); - - if (E_IS_MINICARD_VIEW(GNOME_CANVAS_ITEM(e_minicard)->parent)) { - - g_object_get(GNOME_CANVAS_ITEM(e_minicard)->parent, - "book", &book, - NULL); - - } - - if (book) { - - /* Add the card in the contact editor to our ebook */ - e_card_merging_book_commit_card (book, - e_minicard->card, - card_modified_cb, - NULL); - g_object_unref(book); - } else { - remodel(e_minicard); - e_canvas_item_request_reflow(GNOME_CANVAS_ITEM(e_minicard)); - } - e_minicard->changed = FALSE; - } + } + else { e_minicard->has_focus = FALSE; } } @@ -651,7 +607,7 @@ e_minicard_event (GnomeCanvasItem *item, GdkEvent *event) case GDK_2BUTTON_PRESS: if (event->button.button == 1 && E_IS_MINICARD_VIEW(item->parent)) { if (e_minicard->editor) { - if (e_card_evolution_list (e_minicard->card)) + if (GPOINTER_TO_INT (e_contact_get (e_minicard->contact, E_CONTACT_IS_LIST))) e_contact_list_editor_raise (E_CONTACT_LIST_EDITOR(e_minicard->editor)); else e_contact_editor_raise(E_CONTACT_EDITOR(e_minicard->editor)); @@ -664,14 +620,14 @@ e_minicard_event (GnomeCanvasItem *item, GdkEvent *event) } if (book != NULL) { - if (e_card_evolution_list (e_minicard->card)) { - EContactListEditor *editor = e_addressbook_show_contact_list_editor (book, e_minicard->card, - FALSE, e_minicard->editable); + if (e_contact_get (e_minicard->contact, E_CONTACT_IS_LIST)) { + EContactListEditor *editor = eab_show_contact_list_editor (book, e_minicard->contact, + FALSE, e_minicard->editable); e_minicard->editor = G_OBJECT (editor); } else { - EContactEditor *editor = e_addressbook_show_contact_editor (book, e_minicard->card, - FALSE, e_minicard->editable); + EContactEditor *editor = eab_show_contact_editor (book, e_minicard->contact, + FALSE, e_minicard->editable); e_minicard->editor = G_OBJECT (editor); } g_object_ref (e_minicard->editor); @@ -685,36 +641,6 @@ e_minicard_event (GnomeCanvasItem *item, GdkEvent *event) return TRUE; } break; - case GDK_KEY_PRESS: - if (event->key.keyval == GDK_Tab || - event->key.keyval == GDK_KP_Tab || - event->key.keyval == GDK_ISO_Left_Tab) { - GList *list; - for (list = e_minicard->fields; list; list = list->next) { - EMinicardField *field = E_MINICARD_FIELD(list->data); - GnomeCanvasItem *item = field->label; - EFocus has_focus; - g_object_get(item, - "has_focus", &has_focus, - NULL); - if (has_focus != E_FOCUS_NONE) { - if (event->key.state & GDK_SHIFT_MASK) - list = list->prev; - else - list = list->next; - if (list) { - EMinicardField *field = E_MINICARD_FIELD(list->data); - GnomeCanvasItem *item = field->label; - gnome_canvas_item_set(item, - "has_focus", (event->key.state & GDK_SHIFT_MASK) ? E_FOCUS_END : E_FOCUS_START, - NULL); - return 1; - } else { - return 0; - } - } - } - } default: break; } @@ -729,11 +655,12 @@ static void e_minicard_resize_children( EMinicard *e_minicard ) { GList *list; - + gboolean is_list = GPOINTER_TO_INT (e_contact_get (e_minicard->contact, E_CONTACT_IS_LIST)); + if (e_minicard->header_text) { gnome_canvas_item_set( e_minicard->header_text, "width", ((double) e_minicard->width - 12 - - (e_card_evolution_list (e_minicard->card) ? e_minicard->list_icon_size : 0.0)), + - (is_list ? e_minicard->list_icon_size : 0.0)), NULL ); } if (e_minicard->list_icon) { @@ -749,79 +676,24 @@ e_minicard_resize_children( EMinicard *e_minicard ) } static void -field_changed (EText *text, EMinicard *e_minicard) -{ - ECardSimpleType type; - char *string; - char *new_string; - gboolean is_list = FALSE; - - type = GPOINTER_TO_INT - (g_object_get_data(G_OBJECT(text), - "EMinicard:field")); - g_object_get(text, - "text", &string, - NULL); - - /* - * If the card is coresponding with a contact list and the field be - * changed is e-mail address, should wrap it before write it back. - */ - new_string = (char*)e_card_simple_get_const (e_minicard->simple, - E_CARD_SIMPLE_FIELD_IS_LIST); - - is_list = (NULL != new_string); - - if (is_list && (E_CARD_SIMPLE_FIELD_EMAIL == type || - E_CARD_SIMPLE_FIELD_EMAIL_2 == type || - E_CARD_SIMPLE_FIELD_EMAIL_3 == type)) { - if (string && *string) { - EDestination *dest = e_destination_new (); - if (dest != NULL){ - e_destination_set_email (dest, string); - new_string = e_destination_export(dest); - g_free(string); - string=new_string; - g_object_unref (dest); - } - } - } - - e_card_simple_set(e_minicard->simple, - type, - string); - g_free(string); - e_minicard->changed = TRUE; -} - -static void -field_activated (EText *text, EMinicard *e_minicard) -{ - e_text_stop_editing (text); - e_canvas_item_grab_focus (GNOME_CANVAS_ITEM (e_minicard), FALSE); -} - -static void -add_field (EMinicard *e_minicard, ECardSimpleField field, gdouble left_width) +add_field (EMinicard *e_minicard, EContactField field, gdouble left_width) { GnomeCanvasItem *new_item; GnomeCanvasGroup *group; - ECardSimpleType type; EMinicardField *minicard_field; char *name; char *string; group = GNOME_CANVAS_GROUP( e_minicard ); - type = e_card_simple_type(e_minicard->simple, field); - name = g_strdup_printf("%s:", e_card_simple_get_name(e_minicard->simple, field)); - string = e_card_simple_get(e_minicard->simple, field); + name = g_strdup_printf("%s:", e_contact_pretty_name (field)); + string = e_contact_get (e_minicard->contact, field); /* Magically convert embedded XML into an address. */ if (!strncmp (string, "editable, + "editable", FALSE, NULL ); - g_signal_connect(E_MINICARD_LABEL(new_item)->field, - "changed", G_CALLBACK (field_changed), e_minicard); - g_signal_connect(E_MINICARD_LABEL(new_item)->field, - "activate", G_CALLBACK (field_activated), e_minicard); +#if notyet g_object_set(E_MINICARD_LABEL(new_item)->field, - "allow_newlines", e_card_simple_get_allow_newlines (e_minicard->simple, field), + "allow_newlines", e_card_simple_get_allow_newlines (e_minicard->contact, field), NULL); +#endif g_object_set_data(G_OBJECT (E_MINICARD_LABEL(new_item)->field), "EMinicard:field", GINT_TO_POINTER(field)); @@ -861,14 +731,18 @@ static int get_left_width(EMinicard *e_minicard) { gchar *name; - ECardSimpleField field; + EContactField field; int width = -1; PangoLayout *layout; layout = gtk_widget_create_pango_layout (GTK_WIDGET (GNOME_CANVAS_ITEM (e_minicard)->canvas), ""); - for(field = E_CARD_SIMPLE_FIELD_FULL_NAME; field != E_CARD_SIMPLE_FIELD_LAST; field++) { + for(field = E_CONTACT_FULL_NAME; field != E_CONTACT_LAST_SIMPLE_STRING; field++) { int this_width; - name = g_strdup_printf("%s:", e_card_simple_get_name(e_minicard->simple, field)); + + if (field == E_CONTACT_FAMILY_NAME || field == E_CONTACT_GIVEN_NAME) + continue; + + name = g_strdup_printf("%s:", e_contact_pretty_name (field)); pango_layout_set_text (layout, name, -1); pango_layout_get_pixel_size (layout, &this_width, NULL); if (width < this_width) @@ -885,46 +759,47 @@ remodel( EMinicard *e_minicard ) int count = 0; if ( !(GTK_OBJECT_FLAGS( e_minicard ) & GNOME_CANVAS_ITEM_REALIZED) ) return; - if (e_minicard->simple) { - ECardSimpleField field; + if (e_minicard->contact) { + EContactField field; GList *list; char *file_as; int left_width = -1; if (e_minicard->header_text) { - file_as = e_card_simple_get(e_minicard->simple, E_CARD_SIMPLE_FIELD_FILE_AS); - gnome_canvas_item_set( e_minicard->header_text, + file_as = e_contact_get (e_minicard->contact, E_CONTACT_FILE_AS); + gnome_canvas_item_set (e_minicard->header_text, "text", file_as ? file_as : "", NULL ); g_free(file_as); } - if (e_minicard->card && e_card_evolution_list (e_minicard->card) ) { + if (e_minicard->contact && e_contact_get (e_minicard->contact, E_CONTACT_IS_LIST)) gnome_canvas_item_show (e_minicard->list_icon); - } - else { + else gnome_canvas_item_hide (e_minicard->list_icon); - } list = e_minicard->fields; e_minicard->fields = NULL; - for(field = E_CARD_SIMPLE_FIELD_FULL_NAME; field != E_CARD_SIMPLE_FIELD_LAST_SIMPLE_STRING && count < 5; field++) { + for(field = E_CONTACT_FULL_NAME; field != E_CONTACT_LAST_SIMPLE_STRING && count < 5; field++) { EMinicardField *minicard_field = NULL; + if (field == E_CONTACT_FAMILY_NAME || field == E_CONTACT_GIVEN_NAME) + continue; + if (list) minicard_field = list->data; if (minicard_field && minicard_field->field == field) { GList *this_list = list; char *string; - string = e_card_simple_get(e_minicard->simple, field); + string = e_contact_get(e_minicard->contact, field); if (string && *string) { /* Magically convert embedded XML into an address. */ if (!strncmp (string, "simple, field); + string = e_contact_get(e_minicard->contact, field); if (string && *string) { add_field(e_minicard, field, left_width); count++; @@ -1013,8 +888,8 @@ e_minicard_get_card_id (EMinicard *minicard) g_return_val_if_fail(minicard != NULL, NULL); g_return_val_if_fail(E_IS_MINICARD(minicard), NULL); - if (minicard->card) { - return e_card_get_id(minicard->card); + if (minicard->contact) { + return e_contact_get_const (minicard->contact, E_CONTACT_UID); } else { return ""; } @@ -1030,13 +905,12 @@ e_minicard_compare (EMinicard *minicard1, EMinicard *minicard2) g_return_val_if_fail(minicard2 != NULL, 0); g_return_val_if_fail(E_IS_MINICARD(minicard2), 0); - if (minicard1->card && minicard2->card) { + if (minicard1->contact && minicard2->contact) { char *file_as1, *file_as2; - - g_object_get(minicard1->card, + g_object_get(minicard1->contact, "file_as", &file_as1, NULL); - g_object_get(minicard2->card, + g_object_get(minicard2->contact, "file_as", &file_as2, NULL); diff --git a/addressbook/gui/widgets/e-minicard.h b/addressbook/gui/widgets/e-minicard.h index ac0f82e46c..e4673fe4d9 100644 --- a/addressbook/gui/widgets/e-minicard.h +++ b/addressbook/gui/widgets/e-minicard.h @@ -23,8 +23,7 @@ #include #include "addressbook/gui/contact-editor/e-contact-editor.h" #include -#include "addressbook/backend/ebook/e-card.h" -#include "addressbook/backend/ebook/e-card-simple.h" +#include "addressbook/backend/ebook/e-contact.h" #ifdef __cplusplus extern "C" { @@ -63,8 +62,7 @@ struct _EMinicard GnomeCanvasGroup parent; /* item specific fields */ - ECard *card; - ECardSimple *simple; + EContact *contact; GnomeCanvasItem *rect; GnomeCanvasItem *header_rect; diff --git a/addressbook/gui/widgets/eab-contact-display.c b/addressbook/gui/widgets/eab-contact-display.c new file mode 100644 index 0000000000..3de6eac380 --- /dev/null +++ b/addressbook/gui/widgets/eab-contact-display.c @@ -0,0 +1,486 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * Authors: Chris Toshok + * + * Copyright (C) 2003 Ximian, Inc. (www.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 Street #330, Boston, MA 02111-1307, USA. + * + */ + +#include "eab-contact-display.h" + +#include "e-util/e-html-utils.h" +#include "util/eab-destination.h" + +#include +#include +#include +#include +#include + +#define PARENT_TYPE (gtk_vbox_get_type ()) + +struct _EABContactDisplayPrivate { + GtkHTML *html; + EContact *contact; +}; + + +#define HTML_HEADER "\n\n" \ + "\n\n\n" + +#define MAX_COMPACT_IMAGE_DIMENSION 48 + +static void +on_url_requested (GtkHTML *html, const char *url, GtkHTMLStream *handle, + EABContactDisplay *display) +{ + printf ("on_url_requested (%s)\n", url); + if (!strcmp (url, "internal-contact-photo:")) { + EContactPhoto *photo; + + photo = e_contact_get (display->priv->contact, E_CONTACT_PHOTO); + if (!photo) + photo = e_contact_get (display->priv->contact, E_CONTACT_LOGO); + + printf ("writing a photo of length %d\n", photo->length); + + gtk_html_stream_write (handle, photo->data, photo->length); + + gtk_html_end (html, handle, GTK_HTML_STREAM_OK); + } +} + +static void +on_link_clicked (GtkHTML *html, const char *url, EABContactDisplay *display) +{ + GError *err = NULL; + + gnome_url_show (url, &err); + + if (err) { + g_warning ("gnome_url_show: %s", err->message); + g_error_free (err); + } +} + +static void +render_address (GtkHTMLStream *html_stream, EContact *contact, const char *html_label, EContactField adr_field, EContactField label_field) +{ + EContactAddress *adr; + const char *label; + + label = e_contact_get_const (contact, label_field); + if (label) { + char *html = e_text_to_html (label, E_TEXT_TO_HTML_CONVERT_NL); + + gtk_html_stream_printf (html_stream, "
"); + gtk_html_stream_printf (html_stream, "%s: %s
", html_label, html); + + gtk_html_stream_printf (html_stream, "%s", _("Map It")); + gtk_html_stream_printf (html_stream, "
"); + g_free (html); + return; + } + + adr = e_contact_get (contact, adr_field); + if (adr && + (adr->po || adr->ext || adr->street || adr->locality || adr->region || adr->code || adr->country)) { + + gtk_html_stream_printf (html_stream, "
"); + gtk_html_stream_printf (html_stream, "%s: ", html_label); + + if (adr->po && *adr->po) gtk_html_stream_printf (html_stream, "%s
", adr->po); + if (adr->ext && *adr->ext) gtk_html_stream_printf (html_stream, "%s
", adr->ext); + if (adr->street && *adr->street) gtk_html_stream_printf (html_stream, "%s
", adr->street); + if (adr->locality && *adr->locality) gtk_html_stream_printf (html_stream, "%s
", adr->locality); + if (adr->region && *adr->region) gtk_html_stream_printf (html_stream, "%s
", adr->region); + if (adr->code && *adr->code) gtk_html_stream_printf (html_stream, "%s
", adr->code); + if (adr->country && *adr->country) gtk_html_stream_printf (html_stream, "%s
", adr->country); + + gtk_html_stream_printf (html_stream, "%s", _("Map It")); + gtk_html_stream_printf (html_stream, "
"); + } + if (adr) + e_contact_address_free (adr); +} + +static void +render_string (GtkHTMLStream *html_stream, EContact *contact, const char *html_label, EContactField field) +{ + const char *str; + + str = e_contact_get_const (contact, field); + + if (str && *str) { + char *html = e_text_to_html (str, 0); + gtk_html_stream_printf (html_stream, "%s: %s
", html_label, str); + g_free (html); + } +} + +static void +render_url (GtkHTMLStream *html_stream, EContact *contact, const char *html_label, EContactField field) +{ + const char *str; + str = e_contact_get_const (contact, field); + if (str && *str) { + char *html = e_text_to_html (str, E_TEXT_TO_HTML_CONVERT_URLS); + gtk_html_stream_printf (html_stream, "%s: %s
", + html_label, html); + g_free (html); + } +} + +static void +eab_contact_display_render_normal (EABContactDisplay *display, EContact *contact) +{ + GtkHTMLStream *html_stream; + + if (display->priv->contact) + g_object_unref (display->priv->contact); + display->priv->contact = contact; + if (display->priv->contact) + g_object_ref (display->priv->contact); + + html_stream = gtk_html_begin (display->priv->html); + gtk_html_stream_write (html_stream, HTML_HEADER, sizeof (HTML_HEADER) - 1); + gtk_html_stream_write (html_stream, "\n", 7); + + if (contact) { + char *str, *html; + EContactPhoto *photo; + + gtk_html_stream_printf (html_stream, "
"); + photo = e_contact_get (contact, E_CONTACT_PHOTO); + if (!photo) + photo = e_contact_get (contact, E_CONTACT_LOGO); + if (photo) { + gtk_html_stream_printf (html_stream, ""); + e_contact_photo_free (photo); + } + + gtk_html_stream_printf (html_stream, "\n"); + + str = e_contact_get_const (contact, E_CONTACT_FILE_AS); + if (str) { + html = e_text_to_html (str, 0); + gtk_html_stream_printf (html_stream, "

%s

", html); + g_free (html); + } + else { + str = e_contact_get_const (contact, E_CONTACT_FULL_NAME); + if (str) { + html = e_text_to_html (str, 0); + gtk_html_stream_printf (html_stream, "

%s

", html); + g_free (html); + } + } + + if (e_contact_get (contact, E_CONTACT_IS_LIST)) { + GList *email_list; + GList *l; + + gtk_html_stream_printf (html_stream, "
"); + gtk_html_stream_printf (html_stream, "%s: ", _("List Members")); + + email_list = e_contact_get (contact, E_CONTACT_EMAIL); + for (l = email_list; l; l = l->next) { + EABDestination *dest = eab_destination_import (l->data); + if (dest) { + const char *textrep = eab_destination_get_textrep (dest, TRUE); + char *html = e_text_to_html (textrep, 0); + gtk_html_stream_printf (html_stream, "%s
", html); + g_free (html); + g_object_unref (dest); + } + } + gtk_html_stream_printf (html_stream, "
"); + } + else { + render_string (html_stream, contact, _("Job Title"), E_CONTACT_TITLE); + + render_string (html_stream, contact, _("Email"), E_CONTACT_EMAIL_1); + render_string (html_stream, contact, _("Email"), E_CONTACT_EMAIL_2); + render_string (html_stream, contact, _("Email"), E_CONTACT_EMAIL_3); + + + render_address (html_stream, contact, _("Home Address"), E_CONTACT_ADDRESS_HOME, E_CONTACT_ADDRESS_LABEL_HOME); + render_address (html_stream, contact, _("Work Address"), E_CONTACT_ADDRESS_WORK, E_CONTACT_ADDRESS_LABEL_WORK); + render_address (html_stream, contact, _("Other Address"), E_CONTACT_ADDRESS_OTHER, E_CONTACT_ADDRESS_LABEL_OTHER); + + gtk_html_stream_printf (html_stream, "
"); + + render_url (html_stream, contact, _("Home page"), E_CONTACT_HOMEPAGE_URL); + render_url (html_stream, contact, _("Blog"), E_CONTACT_BLOG_URL); + + } + + gtk_html_stream_printf (html_stream, "
\n"); + } + + gtk_html_stream_write (html_stream, "\n", 15); + gtk_html_end (display->priv->html, html_stream, GTK_HTML_STREAM_OK); +} + +static void +eab_contact_display_render_compact (EABContactDisplay *display, EContact *contact) +{ + GtkHTMLStream *html_stream; + + if (display->priv->contact) + g_object_unref (display->priv->contact); + display->priv->contact = contact; + if (display->priv->contact) + g_object_ref (display->priv->contact); + + html_stream = gtk_html_begin (display->priv->html); + gtk_html_stream_write (html_stream, HTML_HEADER, sizeof (HTML_HEADER) - 1); + gtk_html_stream_write (html_stream, "\n", 7); + + if (contact) { + char *str, *html; + EContactPhoto *photo; + + gtk_html_stream_printf (html_stream, + "" + "
" + "" + "
" + "" + "
"); + + photo = e_contact_get (contact, E_CONTACT_PHOTO); + if (!photo) + photo = e_contact_get (contact, E_CONTACT_LOGO); + if (photo) { + int calced_width = MAX_COMPACT_IMAGE_DIMENSION, calced_height = MAX_COMPACT_IMAGE_DIMENSION; + GdkPixbufLoader *loader = gdk_pixbuf_loader_new (); + GdkPixbuf *pixbuf; + + /* figure out if we need to downscale the + image here. we don't scale the pixbuf + itself, just insert width/height tags in + the html */ + gdk_pixbuf_loader_write (loader, photo->data, photo->length, NULL); + pixbuf = gdk_pixbuf_loader_get_pixbuf (loader); + gdk_pixbuf_loader_close (loader, NULL); + g_object_unref (loader); + if (pixbuf) { + int max_dimension = gdk_pixbuf_get_height (pixbuf); + if (max_dimension < gdk_pixbuf_get_width (pixbuf)) + max_dimension = gdk_pixbuf_get_width (pixbuf); + + calced_width = (float)gdk_pixbuf_get_width (pixbuf) / max_dimension * MAX_COMPACT_IMAGE_DIMENSION; + calced_height = (float)gdk_pixbuf_get_height (pixbuf) / max_dimension * MAX_COMPACT_IMAGE_DIMENSION; + + calced_width = MIN (calced_width, MAX_COMPACT_IMAGE_DIMENSION); + calced_height = MIN (calced_height, MAX_COMPACT_IMAGE_DIMENSION); + } + + gdk_pixbuf_unref (pixbuf); + gtk_html_stream_printf (html_stream, "", + calced_width, calced_height); + e_contact_photo_free (photo); + } + + gtk_html_stream_printf (html_stream, "\n"); + + str = e_contact_get_const (contact, E_CONTACT_FILE_AS); + if (str) { + html = e_text_to_html (str, 0); + gtk_html_stream_printf (html_stream, "%s", html); + g_free (html); + } + else { + str = e_contact_get_const (contact, E_CONTACT_FULL_NAME); + if (str) { + html = e_text_to_html (str, 0); + gtk_html_stream_printf (html_stream, "%s", html); + g_free (html); + } + } + + gtk_html_stream_write (html_stream, "
", 4); + + if (e_contact_get (contact, E_CONTACT_IS_LIST)) { + GList *email_list; + GList *l; + + gtk_html_stream_printf (html_stream, "
"); + gtk_html_stream_printf (html_stream, "%s: ", _("List Members")); + + email_list = e_contact_get (contact, E_CONTACT_EMAIL); + for (l = email_list; l; l = l->next) { + EABDestination *dest = eab_destination_import (l->data); + if (dest) { + const char *textrep = eab_destination_get_textrep (dest, TRUE); + char *html = e_text_to_html (textrep, 0); + gtk_html_stream_printf (html_stream, "%s, ", html); + g_free (html); + g_object_unref (dest); + } + } + gtk_html_stream_printf (html_stream, "
"); + } + else { + gboolean comma = FALSE; + str = e_contact_get_const (contact, E_CONTACT_TITLE); + if (str) { + html = e_text_to_html (str, 0); + gtk_html_stream_printf (html_stream, "%s: %s
", _("Job Title"), str); + g_free (html); + } + + gtk_html_stream_printf (html_stream, "%s: ", _("Email")); + str = e_contact_get_const (contact, E_CONTACT_EMAIL_1); + if (str) { + html = e_text_to_html (str, 0); + gtk_html_stream_printf (html_stream, "%s", str); + g_free (html); + comma = TRUE; + } + str = e_contact_get_const (contact, E_CONTACT_EMAIL_2); + if (str) { + html = e_text_to_html (str, 0); + gtk_html_stream_printf (html_stream, "%s%s", comma ? ", " : "", str); + g_free (html); + comma = TRUE; + } + str = e_contact_get_const (contact, E_CONTACT_EMAIL_3); + if (str) { + html = e_text_to_html (str, 0); + gtk_html_stream_printf (html_stream, "%s%s", comma ? ", " : "", str); + g_free (html); + } + gtk_html_stream_write (html_stream, "
", 4); + + str = e_contact_get_const (contact, E_CONTACT_HOMEPAGE_URL); + if (str) { + html = e_text_to_html (str, E_TEXT_TO_HTML_CONVERT_URLS); + gtk_html_stream_printf (html_stream, "%s: %s
", + _("Home page"), html); + g_free (html); + } + + str = e_contact_get_const (contact, E_CONTACT_BLOG_URL); + if (str) { + html = e_text_to_html (str, E_TEXT_TO_HTML_CONVERT_URLS); + gtk_html_stream_printf (html_stream, "%s: %s
", + _("Blog"), html); + } + } + + gtk_html_stream_printf (html_stream, "
\n"); + } + + gtk_html_stream_write (html_stream, "\n", 15); + gtk_html_end (display->priv->html, html_stream, GTK_HTML_STREAM_OK); +} + +void +eab_contact_display_render (EABContactDisplay *display, EContact *contact, + EABContactDisplayRenderMode mode) +{ + switch (mode) { + case EAB_CONTACT_DISPLAY_RENDER_NORMAL: + eab_contact_display_render_normal (display, contact); + break; + case EAB_CONTACT_DISPLAY_RENDER_COMPACT: + eab_contact_display_render_compact (display, contact); + break; + } +} + +GtkWidget* +eab_contact_display_new (void) +{ + EABContactDisplay *display; + + display = g_object_new (EAB_TYPE_CONTACT_DISPLAY, NULL); + + display->priv = g_new0 (EABContactDisplayPrivate, 1); + + display->priv->html = GTK_HTML (gtk_html_new ()); + + gtk_html_set_default_content_type (display->priv->html, "text/html; charset=utf-8"); + + gtk_html_set_editable (display->priv->html, FALSE); + + + g_signal_connect (display->priv->html, "url_requested", + G_CALLBACK (on_url_requested), + display); + g_signal_connect (display->priv->html, "link_clicked", + G_CALLBACK (on_link_clicked), + display); +#if 0 + g_signal_connect (display->priv->html, "object_requested", + G_CALLBACK (on_object_requested), + mail_display); + g_signal_connect (display->priv->html, "button_press_event", + G_CALLBACK (html_button_press_event), mail_display); + g_signal_connect (display->priv->html, "motion_notify_event", + G_CALLBACK (html_motion_notify_event), mail_display); + g_signal_connect (display->priv->html, "enter_notify_event", + G_CALLBACK (html_enter_notify_event), mail_display); + g_signal_connect (display->priv->html, "iframe_created", + G_CALLBACK (html_iframe_created), mail_display); + g_signal_connect (display->priv->html, "on_url", + G_CALLBACK (html_on_url), mail_display); +#endif + + gtk_box_pack_start_defaults (GTK_BOX (display), GTK_WIDGET (display->priv->html)); + gtk_widget_show (GTK_WIDGET (display->priv->html)); + + return GTK_WIDGET (display); +} + + +static void +eab_contact_display_init (GObject *object) +{ +} + +static void +eab_contact_display_class_init (GtkObjectClass *object_class) +{ + // object_class->destroy = mail_display_destroy; +} + +GType +eab_contact_display_get_type (void) +{ + static GType type = 0; + + if (!type) { + static const GTypeInfo info = { + sizeof (EABContactDisplayClass), + NULL, /* base_init */ + NULL, /* base_finalize */ + (GClassInitFunc) eab_contact_display_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (EABContactDisplay), + 0, /* n_preallocs */ + (GInstanceInitFunc) eab_contact_display_init, + }; + + type = g_type_register_static (PARENT_TYPE, "EABContactDisplay", &info, 0); + } + + return type; +} diff --git a/addressbook/gui/widgets/eab-contact-display.h b/addressbook/gui/widgets/eab-contact-display.h new file mode 100644 index 0000000000..83bad9ae64 --- /dev/null +++ b/addressbook/gui/widgets/eab-contact-display.h @@ -0,0 +1,61 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * Authors: Chris Toshok + * + * Copyright 2003 Ximian, Inc. (www.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 Street #330, Boston, MA 02111-1307, USA. + * + */ + +#ifndef _EAB_CONTACT_DISPLAY_H_ +#define _EAB_CONTACT_DISPLAY_H_ + +#include +#include +#include + +#define EAB_TYPE_CONTACT_DISPLAY (eab_contact_display_get_type ()) +#define EAB_CONTACT_DISPLAY(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), EAB_TYPE_CONTACT_DISPLAY, EABContactDisplay)) +#define EAB_CONTACT_DISPLAY_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), EAB_TYPE_CONTACT_DISPLAY, EABContactDisplayClass)) +#define IS_EAB_CONTACT_DISPLAY(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), EAB_TYPE_CONTACT_DISPLAY)) +#define IS_EAB_CONTACT_DISPLAY_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), EAB_TYPE_CONTACT_DISPLAY)) + +typedef struct _EABContactDisplay EABContactDisplay; +typedef struct _EABContactDisplayPrivate EABContactDisplayPrivate; +typedef struct _EABContactDisplayClass EABContactDisplayClass; + +typedef enum { + EAB_CONTACT_DISPLAY_RENDER_NORMAL, /* for use in the preview pane */ + EAB_CONTACT_DISPLAY_RENDER_COMPACT /* for use with embedded vcards (e.g, the EABVCardControl) */ +} EABContactDisplayRenderMode; + +struct _EABContactDisplay { + GtkVBox parent; + + EABContactDisplayPrivate *priv; +}; + +struct _EABContactDisplayClass { + GtkVBoxClass parent_class; +}; + +GtkType eab_contact_display_get_type (void); +GtkWidget * eab_contact_display_new (void); + +void eab_contact_display_render (EABContactDisplay *display, EContact *contact, + EABContactDisplayRenderMode render_mode); + +#endif /* _EAB_CONTACT_DISPLAY_H_ */ diff --git a/addressbook/gui/widgets/eab-gui-util.c b/addressbook/gui/widgets/eab-gui-util.c new file mode 100644 index 0000000000..666bc976f2 --- /dev/null +++ b/addressbook/gui/widgets/eab-gui-util.c @@ -0,0 +1,823 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * e-table-field-chooser.c + * Copyright (C) 2001 Ximian, Inc. + * Author: Chris Toshok + * + * 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 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 library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include + +#include +#include +#include +#include + +#include +#include "eab-gui-util.h" +#include "util/eab-book-util.h" +#include "util/eab-destination.h" + +#include + +#include + +#include "addressbook/gui/contact-editor/e-contact-editor.h" +#include "addressbook/gui/contact-list-editor/e-contact-list-editor.h" + +void +eab_error_dialog (const gchar *msg, EBookStatus status) +{ + static char *status_to_string[] = { + N_("Success"), + N_("Unknown error"), + N_("Repository offline"), + N_("Permission denied"), + N_("Contact not found"), + N_("Contact ID already exists"), + N_("Protocol not supported"), + N_("Cancelled"), + N_("Authentication Failed"), + N_("Authentication Required"), + N_("TLS not Available"), + N_("Addressbook does not exist"), + N_("Other error") + }; + char *error_msg; + GtkWidget *dialog; + + error_msg = g_strdup_printf ("%s: %s", msg, _(status_to_string [status])); + + dialog = gtk_message_dialog_new (NULL, 0, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, + error_msg); + + g_signal_connect (dialog, "response", G_CALLBACK (gtk_widget_destroy), NULL); + + gtk_widget_show (dialog); + + g_free (error_msg); +} + +gint +eab_prompt_save_dialog (GtkWindow *parent) +{ + GtkWidget *dialog; + gint response; + + dialog = gtk_message_dialog_new (parent, + (GtkDialogFlags)0, + GTK_MESSAGE_QUESTION, + GTK_BUTTONS_NONE, + _("Do you want to save changes?")); + gtk_dialog_add_buttons (GTK_DIALOG (dialog), + _("_Discard"), GTK_RESPONSE_NO, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + GTK_STOCK_SAVE, GTK_RESPONSE_YES, + NULL); + + gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_YES); + + response = gtk_dialog_run (GTK_DIALOG (dialog)); + + gtk_widget_destroy (dialog); + + return response; +} + +static void +added_cb (EBook* book, EBookStatus status, const char *id, + gboolean is_list) +{ + if (status != E_BOOK_ERROR_OK) { + eab_error_dialog (is_list ? _("Error adding list") : _("Error adding contact"), status); + } +} + +static void +modified_cb (EBook* book, EBookStatus status, + gboolean is_list) +{ + if (status != E_BOOK_ERROR_OK) { + eab_error_dialog (is_list ? _("Error modifying list") : _("Error modifying contact"), + status); + } +} + +static void +deleted_cb (EBook* book, EBookStatus status, + gboolean is_list) +{ + if (status != E_BOOK_ERROR_OK) { + eab_error_dialog (is_list ? _("Error removing list") : _("Error removing contact"), + status); + } +} + +static void +editor_closed_cb (GtkObject *editor, gpointer data) +{ + g_object_unref (editor); +} + +EContactEditor * +eab_show_contact_editor (EBook *book, EContact *contact, + gboolean is_new_contact, + gboolean editable) +{ + EContactEditor *ce; + + ce = e_contact_editor_new (book, contact, is_new_contact, editable); + + g_signal_connect (ce, "contact_added", + G_CALLBACK (added_cb), GINT_TO_POINTER (FALSE)); + g_signal_connect (ce, "contact_modified", + G_CALLBACK (modified_cb), GINT_TO_POINTER (FALSE)); + g_signal_connect (ce, "contact_deleted", + G_CALLBACK (deleted_cb), GINT_TO_POINTER (FALSE)); + g_signal_connect (ce, "editor_closed", + G_CALLBACK (editor_closed_cb), NULL); + + return ce; +} + +EContactListEditor * +eab_show_contact_list_editor (EBook *book, EContact *contact, + gboolean is_new_contact, + gboolean editable) +{ + EContactListEditor *ce; + + ce = e_contact_list_editor_new (book, contact, is_new_contact, editable); + + g_signal_connect (ce, "list_added", + G_CALLBACK (added_cb), GINT_TO_POINTER (TRUE)); + g_signal_connect (ce, "list_modified", + G_CALLBACK (modified_cb), GINT_TO_POINTER (TRUE)); + g_signal_connect (ce, "list_deleted", + G_CALLBACK (deleted_cb), GINT_TO_POINTER (TRUE)); + g_signal_connect (ce, "editor_closed", + G_CALLBACK (editor_closed_cb), GINT_TO_POINTER (TRUE)); + + e_contact_list_editor_show (ce); + + return ce; +} + +static void +view_contacts (EBook *book, GList *list, gboolean editable) +{ + for (; list; list = list->next) { + EContact *contact = list->data; + if (e_contact_get (contact, E_CONTACT_IS_LIST)) + eab_show_contact_list_editor (book, contact, FALSE, editable); + else + eab_show_contact_editor (book, contact, FALSE, editable); + } +} + +void +eab_show_multiple_contacts (EBook *book, + GList *list, + gboolean editable) +{ + if (list) { + int length = g_list_length (list); + if (length > 5) { + GtkWidget *dialog; + gint response; + + dialog = gtk_message_dialog_new (NULL, + 0, + GTK_MESSAGE_QUESTION, + GTK_BUTTONS_YES_NO, + _("Opening %d contacts will open %d new windows as well.\n" + "Do you really want to display all of these contacts?"), + length, + length); + + response = gtk_dialog_run (GTK_DIALOG (dialog)); + gtk_widget_destroy (dialog); + if (response == GTK_RESPONSE_YES) + view_contacts (book, list, editable); + } else { + view_contacts (book, list, editable); + } + } +} + + +static gint +file_exists(GtkFileSelection *filesel, const char *filename) +{ + GtkWidget *dialog; + gint response; + + dialog = gtk_message_dialog_new (GTK_WINDOW (filesel), + 0, + GTK_MESSAGE_QUESTION, + GTK_BUTTONS_NONE, + _("%s already exists\nDo you want to overwrite it?"), filename); + + gtk_dialog_add_buttons (GTK_DIALOG (dialog), + GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, + _("Overwrite"), GTK_RESPONSE_ACCEPT, + NULL); + + response = gtk_dialog_run (GTK_DIALOG (dialog)); + gtk_widget_destroy (dialog); + return response; +} + +typedef struct { + GtkFileSelection *filesel; + char *vcard; +} SaveAsInfo; + +static void +save_it(GtkWidget *widget, SaveAsInfo *info) +{ + gint error = 0; + gint response = 0; + + const char *filename = gtk_file_selection_get_filename (info->filesel); + + error = e_write_file (filename, info->vcard, O_WRONLY | O_CREAT | O_EXCL | O_TRUNC); + + if (error == EEXIST) { + response = file_exists(info->filesel, filename); + switch (response) { + case GTK_RESPONSE_ACCEPT : /* Overwrite */ + e_write_file(filename, info->vcard, O_WRONLY | O_CREAT | O_TRUNC); + break; + case GTK_RESPONSE_REJECT : /* cancel */ + return; + } + } else if (error != 0) { + GtkWidget *dialog; + char *str; + + str = g_strdup_printf (_("Error saving %s: %s"), filename, strerror(errno)); + dialog = gtk_message_dialog_new (GTK_WINDOW (info->filesel), + GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_ERROR, + GTK_BUTTONS_OK, + str); + g_free (str); + + gtk_widget_show (dialog); + + return; + } + + gtk_widget_destroy(GTK_WIDGET(info->filesel)); +} + +static void +close_it(GtkWidget *widget, SaveAsInfo *info) +{ + gtk_widget_destroy (GTK_WIDGET (info->filesel)); +} + +static void +destroy_it(void *data, GObject *where_the_object_was) +{ + SaveAsInfo *info = data; + g_free (info->vcard); + g_free (info); +} + +static char * +make_safe_filename (const char *prefix, char *name) +{ + char *safe, *p; + + if (!name) { + /* This is a filename. Translators take note. */ + name = _("card.vcf"); + } + + p = strrchr (name, '/'); + if (p) + safe = g_strdup_printf ("%s%s%s", prefix, p, ".vcf"); + else + safe = g_strdup_printf ("%s/%s%s", prefix, name, ".vcf"); + + p = strrchr (safe, '/') + 1; + if (p) + e_filename_make_safe (p); + + return safe; +} + +void +eab_contact_save (char *title, EContact *contact, GtkWindow *parent_window) +{ + GtkFileSelection *filesel; + char *file; + char *name; + SaveAsInfo *info = g_new(SaveAsInfo, 1); + + filesel = GTK_FILE_SELECTION(gtk_file_selection_new(title)); + + name = e_contact_get (contact, E_CONTACT_FILE_AS); + file = make_safe_filename (g_get_home_dir(), name); + gtk_file_selection_set_filename (filesel, file); + g_free (file); + + info->filesel = filesel; + info->vcard = e_vcard_to_string (E_VCARD (contact), EVC_FORMAT_VCARD_30); + + g_signal_connect(filesel->ok_button, "clicked", + G_CALLBACK (save_it), info); + g_signal_connect(filesel->cancel_button, "clicked", + G_CALLBACK (close_it), info); + g_object_weak_ref (G_OBJECT (filesel), destroy_it, info); + + if (parent_window) { + gtk_window_set_transient_for (GTK_WINDOW (filesel), + parent_window); + gtk_window_set_modal (GTK_WINDOW (filesel), TRUE); + } + + gtk_widget_show(GTK_WIDGET(filesel)); +} + +void +eab_contact_list_save (char *title, GList *list, GtkWindow *parent_window) +{ + GtkFileSelection *filesel; + SaveAsInfo *info = g_new(SaveAsInfo, 1); + + filesel = GTK_FILE_SELECTION(gtk_file_selection_new(title)); + + /* This is a filename. Translators take note. */ + if (list && list->data && list->next == NULL) { + char *name, *file; + name = e_contact_get (E_CONTACT (list->data), E_CONTACT_FILE_AS); + if (!name) + name = e_contact_get (E_CONTACT (list->data), E_CONTACT_FULL_NAME); + + file = make_safe_filename (g_get_home_dir(), name); + gtk_file_selection_set_filename (filesel, file); + g_free (file); + } else { + char *file; + file = make_safe_filename (g_get_home_dir(), _("list")); + gtk_file_selection_set_filename (filesel, file); + g_free (file); + } + + info->filesel = filesel; + info->vcard = eab_contact_list_to_string (list); + + g_signal_connect(filesel->ok_button, "clicked", + G_CALLBACK (save_it), info); + g_signal_connect(filesel->cancel_button, "clicked", + G_CALLBACK (close_it), info); + g_object_weak_ref (G_OBJECT (filesel), destroy_it, info); + + if (parent_window) { + gtk_window_set_transient_for (GTK_WINDOW (filesel), + parent_window); + gtk_window_set_modal (GTK_WINDOW (filesel), TRUE); + } + + gtk_widget_show(GTK_WIDGET(filesel)); +} + +typedef struct ContactCopyProcess_ ContactCopyProcess; + +typedef void (*ContactCopyDone) (ContactCopyProcess *process); + +struct ContactCopyProcess_ { + int count; + GList *contacts; + EBook *source; + EBook *destination; + ContactCopyDone done_cb; +}; + +static void +contact_deleted_cb (EBook* book, EBookStatus status, gpointer user_data) +{ + if (status != E_BOOK_ERROR_OK) { + eab_error_dialog (_("Error removing contact"), status); + } +} + +static void +do_delete (gpointer data, gpointer user_data) +{ + EBook *book = user_data; + EContact *contact = data; + + e_book_async_remove_contact(book, contact, contact_deleted_cb, NULL); +} + +static void +delete_contacts (ContactCopyProcess *process) +{ + g_list_foreach (process->contacts, + do_delete, + process->source); +} + +static void +process_unref (ContactCopyProcess *process) +{ + process->count --; + if (process->count == 0) { + if (process->done_cb) { + process->done_cb (process); + } + e_free_object_list(process->contacts); + g_object_unref (process->source); + g_object_unref (process->destination); + g_free (process); + } +} + +static void +contact_added_cb (EBook* book, EBookStatus status, const char *id, gpointer user_data) +{ + ContactCopyProcess *process = user_data; + + if (status != E_BOOK_ERROR_OK) { + eab_error_dialog (_("Error adding contact"), status); + } else { + process_unref (process); + } +} + +static void +do_copy (gpointer data, gpointer user_data) +{ + EBook *book; + EContact *contact; + ContactCopyProcess *process; + + process = user_data; + contact = data; + + book = process->destination; + + process->count ++; + e_book_async_add_contact(book, contact, contact_added_cb, process); +} + +static void +got_book_cb (EBook *book, EBookStatus status, gpointer closure) +{ + ContactCopyProcess *process; + process = closure; + if (status == E_BOOK_ERROR_OK) { + process->destination = book; + g_object_ref (book); + g_list_foreach (process->contacts, + do_copy, + process); + } + process_unref (process); +} + +void +eab_transfer_contacts (EBook *source, GList *contacts /* adopted */, gboolean delete_from_source, GtkWindow *parent_window) +{ + EBook *dest; + const char *allowed_types[] = { "contacts/*", NULL }; + GNOME_Evolution_Folder *folder; + static char *last_uri = NULL; + ContactCopyProcess *process; + char *desc; + + if (contacts == NULL) + return; + + if (last_uri == NULL) + last_uri = g_strdup (""); + + if (contacts->next == NULL) { + if (delete_from_source) + desc = _("Move contact to"); + else + desc = _("Copy contact to"); + } else { + if (delete_from_source) + desc = _("Move contacts to"); + else + desc = _("Copy contacts to"); + } + +#if 0 /* EPFIXME */ + evolution_shell_client_user_select_folder (global_shell_client, + parent_window, + desc, last_uri, allowed_types, + &folder); +#else + folder = NULL; +#endif + + if (!folder) + return; + + if (strcmp (last_uri, folder->evolutionUri) != 0) { + g_free (last_uri); + last_uri = g_strdup (folder->evolutionUri); + } + + process = g_new (ContactCopyProcess, 1); + process->count = 1; + process->source = source; + g_object_ref (source); + process->contacts = contacts; + process->destination = NULL; + + if (delete_from_source) + process->done_cb = delete_contacts; + else + process->done_cb = NULL; + + dest = e_book_new (); + e_book_async_load_uri (dest, folder->physicalUri, got_book_cb, process); + + CORBA_free (folder); +} + +#include + +#define COMPOSER_OAFID "OAFIID:GNOME_Evolution_Mail_Composer" + +void +eab_send_contact_list (GList *contacts, EABDisposition disposition) +{ +#if notyet + GNOME_Evolution_Composer composer_server; + CORBA_Environment ev; + + if (contacts == NULL) + return; + + CORBA_exception_init (&ev); + + composer_server = bonobo_activation_activate_from_id (COMPOSER_OAFID, 0, NULL, &ev); + + if (disposition == EAB_DISPOSITION_AS_TO) { + GNOME_Evolution_Composer_RecipientList *to_list, *cc_list, *bcc_list; + CORBA_char *subject; + int to_i, bcc_i; + GList *iter; + gint to_length = 0, bcc_length = 0; + + /* Figure out how many addresses of each kind we have. */ + for (iter = contacts; iter != NULL; iter = g_list_next (iter)) { + EContact *contact = E_CONTACT (iter->data); + if (e_contact_get (contact, E_CONTACT_IS_LIST)) { + gint len = card->email ? e_list_length (card->email) : 0; + if (e_card_evolution_list_show_addresses (card)) + to_length += len; + else + bcc_length += len; + } else { + if (card->email != NULL) + ++to_length; + } + } + + /* Now I have to make a CORBA sequences that represents a recipient list with + the right number of entries, for the cards. */ + to_list = GNOME_Evolution_Composer_RecipientList__alloc (); + to_list->_maximum = to_length; + to_list->_length = to_length; + if (to_length > 0) { + to_list->_buffer = CORBA_sequence_GNOME_Evolution_Composer_Recipient_allocbuf (to_length); + } + + cc_list = GNOME_Evolution_Composer_RecipientList__alloc (); + cc_list->_maximum = cc_list->_length = 0; + + bcc_list = GNOME_Evolution_Composer_RecipientList__alloc (); + bcc_list->_maximum = bcc_length; + bcc_list->_length = bcc_length; + if (bcc_length > 0) { + bcc_list->_buffer = CORBA_sequence_GNOME_Evolution_Composer_Recipient_allocbuf (bcc_length); + } + + to_i = 0; + bcc_i = 0; + while (cards != NULL) { + ECard *card = cards->data; + EIterator *iterator; + gchar *name, *addr; + gboolean is_list, is_hidden, free_name_addr; + GNOME_Evolution_Composer_Recipient *recipient; + + if (card->email != NULL) { + + is_list = e_card_evolution_list (card); + is_hidden = is_list && !e_card_evolution_list_show_addresses (card); + + for (iterator = e_list_get_iterator (card->email); e_iterator_is_valid (iterator); e_iterator_next (iterator)) { + + if (is_hidden) { + recipient = &(bcc_list->_buffer[bcc_i]); + ++bcc_i; + } else { + recipient = &(to_list->_buffer[to_i]); + ++to_i; + } + + name = ""; + addr = ""; + free_name_addr = FALSE; + if (e_iterator_is_valid (iterator)) { + + if (is_list) { + /* We need to decode the list entries, which are XMLified EABDestinations. */ + EABDestination *dest = eab_destination_import (e_iterator_get (iterator)); + if (dest != NULL) { + name = g_strdup (eab_destination_get_name (dest)); + addr = g_strdup (eab_destination_get_email (dest)); + free_name_addr = TRUE; + g_object_unref (dest); + } + + } else { /* is just a plain old card */ + if (card->name) + name = e_card_name_to_string (card->name); + addr = g_strdup ((char *) e_iterator_get (iterator)); + free_name_addr = TRUE; + } + } + + recipient->name = CORBA_string_dup (name ? name : ""); + recipient->address = CORBA_string_dup (addr ? addr : ""); + + if (free_name_addr) { + g_free ((gchar *) name); + g_free ((gchar *) addr); + } + + /* If this isn't a list, we quit after the first (i.e. the default) address. */ + if (!is_list) + break; + + } + g_object_unref (iterator); + } + + cards = g_list_next (cards); + } + + subject = CORBA_string_dup (""); + + GNOME_Evolution_Composer_setHeaders (composer_server, "", to_list, cc_list, bcc_list, subject, &ev); + if (ev._major != CORBA_NO_EXCEPTION) { + g_printerr ("gui/e-meeting-edit.c: I couldn't set the composer headers via CORBA! Aagh.\n"); + CORBA_exception_free (&ev); + return; + } + + CORBA_free (to_list); + CORBA_free (cc_list); + CORBA_free (bcc_list); + CORBA_free (subject); + } else if (disposition == EAB_DISPOSITION_AS_ATTACHMENT) { + CORBA_char *content_type, *filename, *description; + GNOME_Evolution_Composer_AttachmentData *attach_data; + CORBA_boolean show_inline; + char *tempstr; + + GNOME_Evolution_Composer_RecipientList *to_list, *cc_list, *bcc_list; + CORBA_char *subject; + + content_type = CORBA_string_dup ("text/x-vcard"); + filename = CORBA_string_dup (""); + + if (cards->next) { + description = CORBA_string_dup (_("Multiple VCards")); + } else { + char *file_as; + + g_object_get(cards->data, + "file_as", &file_as, + NULL); + + tempstr = g_strdup_printf (_("VCard for %s"), file_as); + description = CORBA_string_dup (tempstr); + g_free (tempstr); + } + + show_inline = FALSE; + + tempstr = eab_contact_list_to_string (cards); + attach_data = GNOME_Evolution_Composer_AttachmentData__alloc(); + attach_data->_maximum = attach_data->_length = strlen (tempstr); + attach_data->_buffer = CORBA_sequence_CORBA_char_allocbuf (attach_data->_length); + strcpy (attach_data->_buffer, tempstr); + g_free (tempstr); + + GNOME_Evolution_Composer_attachData (composer_server, + content_type, filename, description, + show_inline, attach_data, + &ev); + + if (ev._major != CORBA_NO_EXCEPTION) { + g_printerr ("gui/e-meeting-edit.c: I couldn't attach data to the composer via CORBA! Aagh.\n"); + CORBA_exception_free (&ev); + return; + } + + CORBA_free (content_type); + CORBA_free (filename); + CORBA_free (description); + CORBA_free (attach_data); + + to_list = GNOME_Evolution_Composer_RecipientList__alloc (); + to_list->_maximum = to_list->_length = 0; + + cc_list = GNOME_Evolution_Composer_RecipientList__alloc (); + cc_list->_maximum = cc_list->_length = 0; + + bcc_list = GNOME_Evolution_Composer_RecipientList__alloc (); + bcc_list->_maximum = bcc_list->_length = 0; + + if (!cards || cards->next) { + subject = CORBA_string_dup ("Contact information"); + } else { + ECard *card = cards->data; + const gchar *tempstr2; + + tempstr2 = NULL; + g_object_get(card, + "file_as", &tempstr2, + NULL); + if (!tempstr2 || !*tempstr2) + g_object_get(card, + "full_name", &tempstr2, + NULL); + if (!tempstr2 || !*tempstr2) + g_object_get(card, + "org", &tempstr2, + NULL); + if (!tempstr2 || !*tempstr2) { + EList *list; + EIterator *iterator; + g_object_get(card, + "email", &list, + NULL); + iterator = e_list_get_iterator (list); + if (e_iterator_is_valid (iterator)) { + tempstr2 = e_iterator_get (iterator); + } + g_object_unref (iterator); + } + + if (!tempstr2 || !*tempstr2) + tempstr = g_strdup_printf ("Contact information"); + else + tempstr = g_strdup_printf ("Contact information for %s", tempstr2); + subject = CORBA_string_dup (tempstr); + g_free (tempstr); + } + + GNOME_Evolution_Composer_setHeaders (composer_server, "", to_list, cc_list, bcc_list, subject, &ev); + + CORBA_free (to_list); + CORBA_free (cc_list); + CORBA_free (bcc_list); + CORBA_free (subject); + } + + GNOME_Evolution_Composer_show (composer_server, &ev); + + if (ev._major != CORBA_NO_EXCEPTION) { + g_printerr ("gui/e-meeting-edit.c: I couldn't show the composer via CORBA! Aagh.\n"); + CORBA_exception_free (&ev); + return; + } + + CORBA_exception_free (&ev); +#endif +} + +void +eab_send_contact (EContact *contact, EABDisposition disposition) +{ + GList *list; + list = g_list_prepend (NULL, contact); + eab_send_contact_list (list, disposition); + g_list_free (list); +} diff --git a/addressbook/gui/widgets/eab-gui-util.h b/addressbook/gui/widgets/eab-gui-util.h new file mode 100644 index 0000000000..71a80bc7a6 --- /dev/null +++ b/addressbook/gui/widgets/eab-gui-util.h @@ -0,0 +1,70 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* eab-gui-util.h + * Copyright (C) 2001-2003 Ximian, Inc. + * Author: Chris Toshok + * + * 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 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 library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ +#ifndef __E_ADDRESSBOOK_UTIL_H__ +#define __E_ADDRESSBOOK_UTIL_H__ + +#include +#include "addressbook/backend/ebook/e-book.h" +#include "addressbook/gui/contact-editor/e-contact-editor.h" +#include "addressbook/gui/contact-list-editor/e-contact-list-editor.h" + +G_BEGIN_DECLS + +void eab_error_dialog (const gchar *msg, + EBookStatus status); +gint eab_prompt_save_dialog (GtkWindow *parent); + +EContactEditor *eab_show_contact_editor (EBook *book, + EContact *contact, + gboolean is_new_contact, + gboolean editable); +EContactListEditor *eab_show_contact_list_editor (EBook *book, + EContact *contact, + gboolean is_new_contact, + gboolean editable); +void eab_show_multiple_contacts (EBook *book, + GList *list, + gboolean editable); +void eab_transfer_contacts (EBook *source, + GList *contacts, /* adopted */ + gboolean delete_from_source, + GtkWindow *parent_window); + +void eab_contact_save (char *title, + EContact *contact, + GtkWindow *parent_window); + +void eab_contact_list_save (char *title, + GList *list, + GtkWindow *parent_window); + +typedef enum { + EAB_DISPOSITION_AS_ATTACHMENT, + EAB_DISPOSITION_AS_TO, +} EABDisposition; + +void eab_send_contact (EContact *contact, + EABDisposition disposition); +void eab_send_contact_list (GList *contacts, + EABDisposition disposition); + +G_END_DECLS + +#endif /* __E_ADDRESSBOOK_UTIL_H__ */ diff --git a/addressbook/gui/widgets/eab-marshal.list b/addressbook/gui/widgets/eab-marshal.list new file mode 100644 index 0000000000..2b34707dbb --- /dev/null +++ b/addressbook/gui/widgets/eab-marshal.list @@ -0,0 +1,11 @@ +INT:POINTER +NONE:NONE +NONE:BOOL +NONE:POINTER +NONE:OBJECT +NONE:ENUM +NONE:INT,INT +NONE:INT +NONE:UINT +NONE:DOUBLE +INT:POINTER diff --git a/addressbook/gui/widgets/eab-popup-control.c b/addressbook/gui/widgets/eab-popup-control.c new file mode 100644 index 0000000000..e2d0299d6e --- /dev/null +++ b/addressbook/gui/widgets/eab-popup-control.c @@ -0,0 +1,1236 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ + +/* + * eab-popup-control.c + * + * Copyright (C) 2001-2003, Ximian, Inc. + * + * Authors: Jon Trowbridge + * Chris Toshok + */ + +/* + * This program 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 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. + */ + +/* + * This file is too big and this widget is too complicated. Forgive me. + */ + +#include +#include +#include "addressbook.h" +#include "eab-popup-control.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "e-util/e-gui-utils.h" + +static void eab_popup_control_set_name (EABPopupControl *pop, const gchar *name); +static void eab_popup_control_set_email (EABPopupControl *pop, const gchar *email); + +/* + * Some general scaffolding for our widgets. Think of this as a really, really + * lame implementation of a wizard (...which is still somewhat more general that + * we really need it to be). + */ + +typedef struct _MiniWizard MiniWizard; +struct _MiniWizard { + GtkWidget *body; + + GtkWidget *vbox; + GtkWidget *ok_button; + GtkWidget *cancel_button; + + void (*ok_cb) (MiniWizard *, gpointer); + void (*cleanup_cb) (gpointer); + gpointer closure; + + void (*destroy_cb) (MiniWizard *, gpointer); + gpointer destroy_closure; +}; + +static void +mini_wizard_container_add (MiniWizard *wiz, GtkWidget *w) +{ + GList *iter = gtk_container_get_children (GTK_CONTAINER (wiz->vbox)); + while (iter != NULL) { + GtkWidget *oldw = (GtkWidget *) iter->data; + iter = g_list_next (iter); + gtk_container_remove (GTK_CONTAINER (wiz->vbox), oldw); + } + gtk_container_add (GTK_CONTAINER (wiz->vbox), w); +} + +static void +mini_wizard_destroy (MiniWizard *wiz) +{ + if (wiz->cleanup_cb) + wiz->cleanup_cb (wiz->closure); + wiz->cleanup_cb = NULL; + + if (wiz->destroy_cb) + wiz->destroy_cb (wiz, wiz->destroy_closure); +} + +static void +mini_wizard_ok_cb (GtkWidget *b, gpointer closure) +{ + MiniWizard *wiz = (MiniWizard *) closure; + + gpointer old_closure = wiz->closure; + void (*old_cleanup) (gpointer) = wiz->cleanup_cb; + + wiz->cleanup_cb = NULL; + + if (wiz->ok_cb) + wiz->ok_cb (wiz, wiz->closure); + + if (old_cleanup) + old_cleanup (old_closure); + +} + +static void +mini_wizard_cancel_cb (GtkWidget *b, gpointer closure) +{ + mini_wizard_destroy ((MiniWizard *) closure); +} + +static void +mini_wizard_destroy_cb (gpointer closure, GObject *where_object_was) +{ + MiniWizard *wiz = (MiniWizard *) closure; + if (wiz->cleanup_cb) + wiz->cleanup_cb (wiz->closure); + g_free (wiz); +} + +static MiniWizard * +mini_wizard_new (void) +{ + MiniWizard *wiz = g_new (MiniWizard, 1); + GtkWidget *bbox; + + wiz->body = gtk_vbox_new (FALSE, 2); + wiz->vbox = gtk_vbox_new (FALSE, 2); + wiz->ok_button = gtk_button_new_from_stock (GTK_STOCK_OK); + wiz->cancel_button = gtk_button_new_from_stock (GTK_STOCK_CANCEL); + + wiz->ok_cb = NULL; + wiz->cleanup_cb = NULL; + wiz->closure = NULL; + + wiz->destroy_cb = NULL; + wiz->destroy_closure = NULL; + + bbox = gtk_hbutton_box_new (); + gtk_button_box_set_layout (GTK_BUTTON_BOX (bbox), + GTK_BUTTONBOX_END); + + gtk_box_pack_start (GTK_BOX (bbox), wiz->cancel_button, FALSE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (bbox), wiz->ok_button, FALSE, TRUE, 0); + + gtk_box_set_spacing (GTK_BOX (bbox), + 10 /* ugh */); + + gtk_box_pack_start (GTK_BOX (wiz->body), wiz->vbox, TRUE, TRUE, 2); + gtk_box_pack_start (GTK_BOX (wiz->body), gtk_hseparator_new (), FALSE, TRUE, 2); + gtk_box_pack_start (GTK_BOX (wiz->body), bbox, FALSE, TRUE, 2); + + gtk_widget_show_all (wiz->body); + + g_signal_connect (wiz->ok_button, + "clicked", + G_CALLBACK (mini_wizard_ok_cb), + wiz); + g_signal_connect (wiz->cancel_button, + "clicked", + G_CALLBACK (mini_wizard_cancel_cb), + wiz); + + g_object_weak_ref (G_OBJECT (wiz->body), + mini_wizard_destroy_cb, + wiz); + + return wiz; + +} + + + +/* + * This is the code for the UI thingie that lets you manipulate the e-mail + * addresses (and *only* the e-mail addresses) associated with an existing + * contact. + */ + +#define EMPTY_ENTRY N_("(none)") + +typedef struct _EMailMenu EMailMenu; +struct _EMailMenu { + GtkWidget *option_menu; + GList *options; + gchar *current_selection; +}; + +static void +email_menu_free (EMailMenu *menu) +{ + if (menu == NULL) + return; + + g_list_foreach (menu->options, (GFunc) g_free, NULL); + g_list_free (menu->options); + g_free (menu); +} + +static EMailMenu * +email_menu_new (void) +{ + EMailMenu *menu = g_new (EMailMenu, 1); + + menu->option_menu = gtk_option_menu_new (); + menu->options = NULL; + menu->current_selection = NULL; + + gtk_option_menu_set_menu (GTK_OPTION_MENU (menu->option_menu), gtk_menu_new ()); + + return menu; +} + +static void +menu_activate_cb (GtkWidget *w, gpointer closure) +{ + EMailMenu *menu = (EMailMenu *) closure; + gchar *addr = (gchar *) g_object_get_data (G_OBJECT (w), "addr"); + + menu->current_selection = addr; +} + +static void +email_menu_add_option (EMailMenu *menu, char *addr) +{ + GtkWidget *menu_item; + + g_return_if_fail (menu != NULL); + if (addr == NULL) + return; + + menu->options = g_list_append (menu->options, addr); + + menu_item = gtk_menu_item_new_with_label (addr); + g_object_set_data (G_OBJECT (menu_item), "addr", addr); + gtk_widget_show_all (menu_item); + gtk_menu_shell_append (GTK_MENU_SHELL (gtk_option_menu_get_menu (GTK_OPTION_MENU (menu->option_menu))), menu_item); + + g_signal_connect (menu_item, + "activate", + G_CALLBACK (menu_activate_cb), + menu); +} + +static void +email_menu_add_options_from_contact (EMailMenu *menu, EContact *contact, const gchar *extra_addr) +{ + g_return_if_fail (contact && E_IS_CONTACT (contact)); + + /* If any of these three e-mail fields are NULL, email_menu_add_option will just + return without doing anything. */ + email_menu_add_option (menu, e_contact_get (contact, E_CONTACT_EMAIL_1)); + email_menu_add_option (menu, e_contact_get (contact, E_CONTACT_EMAIL_2)); + email_menu_add_option (menu, e_contact_get (contact, E_CONTACT_EMAIL_3)); + email_menu_add_option (menu, g_strdup (extra_addr)); + email_menu_add_option (menu, EMPTY_ENTRY); +} + +static void +email_menu_set_option (EMailMenu *menu, const gchar *addr) +{ + guint count = 0; + GList *iter; + + g_return_if_fail (menu != NULL); + + if (addr == NULL) { + email_menu_set_option (menu, EMPTY_ENTRY); + return; + } + + iter = menu->options; + while (iter && strcmp (addr, (gchar *) iter->data)) { + ++count; + iter = g_list_next (iter); + } + + if (iter) { + gtk_option_menu_set_history (GTK_OPTION_MENU (menu->option_menu), count); + menu->current_selection = (gchar *) iter->data; + } +} + +#ifdef UNDEFINED_FUNCTIONS_SHOULD_PLEASE_BE_INCLUDED +static void +email_menu_unset_option (EMailMenu *menu, const gchar *addr) +{ + GList *iter; + + g_return_if_fail (menu != NULL); + g_return_if_fail (addr != NULL); + + if (menu->current_selection == NULL || strcmp (addr, menu->current_selection)) + return; + + iter = menu->options; + while (iter && strcmp (addr, (gchar *) iter->data)) { + iter = g_list_next (iter); + } + if (iter) { + iter = g_list_next (iter); + if (iter) { + email_menu_set_option (menu, (gchar *) iter->data); + } else { + email_menu_set_option (menu, EMPTY_ENTRY); + } + } +} +#endif + + + +typedef struct _EMailTable EMailTable; +struct _EMailTable { + GtkWidget *table; + EContact *contact; + EMailMenu *primary; + EMailMenu *email2; + EMailMenu *email3; +}; + +static void +email_table_cleanup_cb (gpointer closure) +{ + EMailTable *et = (EMailTable *) closure; + + if (et == NULL) + return; + + g_object_unref (et->contact); + email_menu_free (et->primary); + email_menu_free (et->email2); + email_menu_free (et->email3); + + g_free (et); +} + +static void +email_table_from_contact (EMailTable *et) +{ + g_return_if_fail (et != NULL); + + email_menu_set_option (et->primary, e_contact_get_const (et->contact, E_CONTACT_EMAIL_1)); + email_menu_set_option (et->email2, e_contact_get_const (et->contact, E_CONTACT_EMAIL_2)); + email_menu_set_option (et->email3, e_contact_get_const (et->contact, E_CONTACT_EMAIL_3)); +} + +static void +email_table_to_contact (EMailTable *et) +{ + gchar *curr; + + g_return_if_fail (et != NULL); + + curr = et->primary->current_selection; + if (curr && !strcmp (curr, _(EMPTY_ENTRY))) + curr = NULL; + e_contact_set (et->contact, E_CONTACT_EMAIL_1, curr); + + curr = et->email2->current_selection; + if (curr && !strcmp (curr, _(EMPTY_ENTRY))) + curr = NULL; + e_contact_set (et->contact, E_CONTACT_EMAIL_2, curr); + + curr = et->email3->current_selection; + if (curr && !strcmp (curr, _(EMPTY_ENTRY))) + curr = NULL; + e_contact_set (et->contact, E_CONTACT_EMAIL_3, curr); +} + +static void +email_table_save_contact_cb (EBook *book, EBookStatus status, gpointer closure) +{ + EContact *contact = E_CONTACT (closure); + + if (status == E_BOOK_ERROR_OK) { + e_book_async_commit_contact (book, contact, NULL, NULL); + } + if (book) + g_object_unref (book); + g_object_unref (contact); +} + +static void +email_table_ok_cb (MiniWizard *wiz, gpointer closure) +{ + EMailTable *et = (EMailTable *) closure; + + email_table_to_contact (et); + + g_object_ref (et->contact); + + addressbook_load_default_book (email_table_save_contact_cb, et->contact); + + mini_wizard_destroy (wiz); +} + +static void +email_table_init (MiniWizard *wiz, EContact *contact, const gchar *extra_address) +{ + EMailTable *et; + + gchar *name_str; + gint xpad, ypad; + GtkAttachOptions label_x_opts, label_y_opts; + GtkAttachOptions menu_x_opts, menu_y_opts; + + g_return_if_fail (contact && E_IS_CONTACT (contact)); + + et = g_new (EMailTable, 1); + + et->contact = contact; + g_object_ref (et->contact); + + et->table = gtk_table_new (4, 2, FALSE); + + et->primary = email_menu_new (); + et->email2 = email_menu_new (); + et->email3 = email_menu_new (); + + email_menu_add_options_from_contact (et->primary, et->contact, extra_address); + email_menu_add_options_from_contact (et->email2, et->contact, extra_address); + email_menu_add_options_from_contact (et->email3, et->contact, extra_address); + + email_table_from_contact (et); + + label_x_opts = GTK_FILL; + label_y_opts = GTK_FILL; + menu_x_opts = GTK_EXPAND | GTK_FILL; + menu_y_opts = GTK_EXPAND | GTK_FILL; + xpad = 3; + ypad = 3; + + name_str = e_contact_get (et->contact, E_CONTACT_FULL_NAME); + gtk_table_attach (GTK_TABLE (et->table), + gtk_label_new (name_str), + 0, 2, 0, 1, + label_x_opts, label_y_opts, xpad, ypad); + g_free (name_str); + + gtk_table_attach (GTK_TABLE (et->table), + gtk_label_new (_("Primary Email")), + 0, 1, 1, 2, + label_x_opts, label_y_opts, xpad, ypad); + + gtk_table_attach (GTK_TABLE (et->table), + et->primary->option_menu, + 1, 2, 1, 2, + menu_x_opts, menu_y_opts, xpad, ypad); + + gtk_table_attach (GTK_TABLE (et->table), + gtk_label_new (_("Email 2")), + 0, 1, 2, 3, + label_x_opts, label_y_opts, xpad, ypad); + + gtk_table_attach (GTK_TABLE (et->table), + et->email2->option_menu, + 1, 2, 2, 3, + menu_x_opts, menu_y_opts, xpad, ypad); + + gtk_table_attach (GTK_TABLE (et->table), + gtk_label_new (_("Email 3")), + 0, 1, 3, 4, + label_x_opts, label_y_opts, xpad, ypad); + + gtk_table_attach (GTK_TABLE (et->table), + et->email3->option_menu, + 1, 2, 3, 4, + menu_x_opts, menu_y_opts, xpad, ypad); + + gtk_widget_show_all (et->primary->option_menu); + gtk_widget_show_all (et->email2->option_menu); + gtk_widget_show_all (et->email3->option_menu); + + gtk_widget_show_all (et->table); + mini_wizard_container_add (wiz, et->table); + wiz->ok_cb = email_table_ok_cb; + wiz->cleanup_cb = email_table_cleanup_cb; + wiz->closure = et; +} + +/* + * This code is for the little UI thing that lets you pick from a set of contacts + * and decide which one you want to add the e-mail address to. + */ + +typedef struct _ContactPicker ContactPicker; +struct _ContactPicker { + GtkWidget *body; + GtkWidget *list; + GtkListStore *model; + GList *contacts; + gchar *new_name; + gchar *new_email; + + EContact *current_contact; +}; + +enum { + COLUMN_ACTION, + COLUMN_CONTACT +}; + +static void +contact_picker_selection_changed (GtkTreeSelection *selection, gpointer closure) +{ + MiniWizard *wiz = (MiniWizard *) closure; + ContactPicker *pick = (ContactPicker *) wiz->closure; + gboolean selected; + GtkTreeIter iter; + + selected = gtk_tree_selection_get_selected (selection, NULL, &iter); + + gtk_widget_set_sensitive (wiz->ok_button, selected); + + if (selected) { + gtk_tree_model_get (GTK_TREE_MODEL (pick->model), &iter, + COLUMN_CONTACT, &pick->current_contact, + -1); + } + else { + pick->current_contact = NULL; + } +} + +static void +contact_picker_ok_cb (MiniWizard *wiz, gpointer closure) +{ + ContactPicker *pick = (ContactPicker *) closure; + + if (pick->current_contact == NULL) { + e_contact_quick_add (pick->new_name, pick->new_email, NULL, NULL); + mini_wizard_destroy (wiz); + } else { + email_table_init (wiz, pick->current_contact, pick->new_email); + } +} + +static void +contact_picker_cleanup_cb (gpointer closure) +{ + ContactPicker *pick = (ContactPicker *) closure; + + g_list_foreach (pick->contacts, (GFunc) g_object_unref, NULL); + g_list_free (pick->contacts); + + g_free (pick->new_name); + g_free (pick->new_email); +} + +static void +free_str (gpointer data, + GObject *where_the_object_was) +{ + g_free (data); +} + +static void +contact_picker_init (MiniWizard *wiz, const GList *contacts, const gchar *new_name, const gchar *new_email) +{ + ContactPicker *pick; + gchar *str; + GtkWidget *w; + GtkTreeIter iter; + + pick = g_new (ContactPicker, 1); + + pick->body = gtk_vbox_new (FALSE, 2); + + pick->model = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_POINTER); + + pick->list = gtk_tree_view_new_with_model (GTK_TREE_MODEL (pick->model)); + + gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (pick->list), TRUE); + + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (pick->list), + COLUMN_ACTION, + _("Select an Action"), + gtk_cell_renderer_text_new (), + "text", COLUMN_ACTION, + NULL); + + gtk_tree_selection_set_mode (gtk_tree_view_get_selection (GTK_TREE_VIEW (pick->list)), + GTK_SELECTION_SINGLE); + + str = g_strdup_printf (_("Create a new contact \"%s\""), new_name); + gtk_list_store_append (pick->model, &iter); + gtk_list_store_set (pick->model, &iter, + COLUMN_ACTION, str, + COLUMN_CONTACT, NULL, + -1); + g_object_weak_ref (G_OBJECT (pick->model), free_str, str); + + pick->contacts = NULL; + while (contacts) { + EContact *contact = (EContact *) contacts->data; + gchar *name_str = e_contact_get (contact, E_CONTACT_FULL_NAME); + + pick->contacts = g_list_append (pick->contacts, contact); + g_object_ref (contact); + + str = g_strdup_printf (_("Add address to existing contact \"%s\""), name_str); + gtk_list_store_append (pick->model, &iter); + gtk_list_store_set (pick->model, &iter, + COLUMN_ACTION, str, + COLUMN_CONTACT, contact, + -1); + g_free (name_str); + + g_object_weak_ref (G_OBJECT (pick->model), free_str, str); + + contacts = g_list_next (contacts); + } + + pick->new_name = g_strdup (new_name); + pick->new_email = g_strdup (new_email); + + pick->current_contact = NULL; + gtk_widget_set_sensitive (wiz->ok_button, FALSE); + + /* Connect some signals & callbacks */ + + wiz->ok_cb = contact_picker_ok_cb; + wiz->cleanup_cb = contact_picker_cleanup_cb; + + g_signal_connect (gtk_tree_view_get_selection (GTK_TREE_VIEW (pick->list)), + "changed", G_CALLBACK (contact_picker_selection_changed), + wiz); + + /* Build our widget */ + + w = gtk_label_new (new_email); + gtk_box_pack_start (GTK_BOX (pick->body), w, FALSE, TRUE, 3); + + gtk_box_pack_start (GTK_BOX (pick->body), pick->list, TRUE, TRUE, 2); + gtk_widget_show_all (pick->body); + + + /* Put it in our mini-wizard */ + + wiz->closure = pick; + mini_wizard_container_add (wiz, pick->body); +} + +/* ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** */ + +/* + * The code for the actual EABPopupControl widget begins here. + */ + +/* ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** */ + + +static GtkObjectClass *parent_class; + +static void eab_popup_control_dispose (GObject *); +static void eab_popup_control_query (EABPopupControl *); + + +static void +eab_popup_control_class_init (EABPopupControlClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + parent_class = g_type_class_peek_parent (klass); + + object_class->dispose = eab_popup_control_dispose; +} + +static void +eab_popup_control_init (EABPopupControl *pop) +{ + pop->transitory = TRUE; +} + +static void +eab_popup_control_cleanup (EABPopupControl *pop) +{ + if (pop->contact) { + g_object_unref (pop->contact); + pop->contact = NULL; + } + + if (pop->scheduled_refresh) { + g_source_remove (pop->scheduled_refresh); + pop->scheduled_refresh = 0; + } + + if (pop->query_tag) { +#if notyet + e_book_simple_query_cancel (pop->book, pop->query_tag); +#endif + pop->query_tag = 0; + } + + if (pop->book) { + g_object_unref (pop->book); + pop->book = NULL; + } + + g_free (pop->name); + pop->name = NULL; + + g_free (pop->email); + pop->email = NULL; +} + +static void +eab_popup_control_dispose (GObject *obj) +{ + EABPopupControl *pop = EAB_POPUP_CONTROL (obj); + + eab_popup_control_cleanup (pop); + + if (G_OBJECT_CLASS (parent_class)->dispose) + G_OBJECT_CLASS (parent_class)->dispose (obj); +} + +GType +eab_popup_control_get_type (void) +{ + static GType pop_type = 0; + + if (!pop_type) { + static const GTypeInfo pop_info = { + sizeof (EABPopupControlClass), + NULL, /* base_init */ + NULL, /* base_finalize */ + (GClassInitFunc) eab_popup_control_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (EABPopupControl), + 0, /* n_preallocs */ + (GInstanceInitFunc) eab_popup_control_init, + }; + + pop_type = g_type_register_static (gtk_event_box_get_type (), "EABPopupControl", &pop_info, 0); + } + + return pop_type; +} + +static void +eab_popup_control_refresh_names (EABPopupControl *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); + } + } + + eab_popup_control_query (pop); +} + +static gint +refresh_timeout_cb (gpointer ptr) +{ + EABPopupControl *pop = EAB_POPUP_CONTROL (ptr); + eab_popup_control_refresh_names (pop); + pop->scheduled_refresh = 0; + return 0; +} + +static void +eab_popup_control_schedule_refresh (EABPopupControl *pop) +{ + if (pop->scheduled_refresh == 0) + pop->scheduled_refresh = g_timeout_add (20, refresh_timeout_cb, pop); +} + +/* If we are handed something of the form "Foo ", + do the right thing. */ +static gboolean +eab_popup_control_set_free_form (EABPopupControl *pop, const gchar *txt) +{ + gchar *lt, *gt = NULL; + + g_return_val_if_fail (pop && EAB_IS_POPUP_CONTROL (pop), FALSE); + + if (txt == NULL) + return FALSE; + + lt = strchr (txt, '<'); + if (lt) + gt = strchr (txt, '>'); + + if (lt && gt && lt+1 < gt) { + gchar *name = g_strndup (txt, lt-txt); + gchar *email = g_strndup (lt+1, gt-lt-1); + eab_popup_control_set_name (pop, name); + eab_popup_control_set_email (pop, email); + + return TRUE; + } + + return FALSE; +} + +static void +eab_popup_control_set_name (EABPopupControl *pop, const gchar *name) +{ + g_return_if_fail (pop && EAB_IS_POPUP_CONTROL (pop)); + + /* We only allow the name to be set once. */ + if (pop->name) + return; + + if (!eab_popup_control_set_free_form (pop, name)) { + pop->name = g_strdup (name); + if (pop->name) + g_strstrip (pop->name); + } + + eab_popup_control_schedule_refresh (pop); +} + +static void +eab_popup_control_set_email (EABPopupControl *pop, const gchar *email) +{ + g_return_if_fail (pop && EAB_IS_POPUP_CONTROL (pop)); + + /* We only allow the e-mail to be set once. */ + if (pop->email) + return; + + if (!eab_popup_control_set_free_form (pop, email)) { + pop->email = g_strdup (email); + if (pop->email) + g_strstrip (pop->email); + } + + eab_popup_control_schedule_refresh (pop); +} + +void +eab_popup_control_construct (EABPopupControl *pop) +{ + GtkWidget *vbox, *name_holder; + GdkColor color = { 0x0, 0xffff, 0xffff, 0xffff }; + + g_return_if_fail (pop && EAB_IS_POPUP_CONTROL (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); + g_object_unref (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 ContactDisplay */ + pop->contact_display = eab_contact_display_new (); + gtk_box_pack_start (GTK_BOX (pop->main_vbox), pop->contact_display, 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); +} + +static GtkWidget * +eab_popup_new (void) +{ + EABPopupControl *pop = g_object_new (EAB_TYPE_POPUP_CONTROL, NULL); + eab_popup_control_construct (pop); + return GTK_WIDGET (pop); +} + +static void +emit_event (EABPopupControl *pop, const char *event) +{ + if (pop->es) { + BonoboArg *arg; + + arg = bonobo_arg_new (BONOBO_ARG_BOOLEAN); + BONOBO_ARG_SET_BOOLEAN (arg, TRUE); + bonobo_event_source_notify_listeners_full (pop->es, + "GNOME/Evolution/Addressbook/AddressPopup", + "Event", + event, + arg, NULL); + bonobo_arg_release (arg); + } +} + +static void +contact_editor_cb (EBook *book, EBookStatus status, gpointer closure) +{ + if (status == E_BOOK_ERROR_OK) { + EABPopupControl *pop = EAB_POPUP_CONTROL (closure); + EContactEditor *ce = eab_show_contact_editor (book, pop->contact, FALSE, TRUE); + eab_popup_control_cleanup (pop); + emit_event (pop, "Destroy"); + e_contact_editor_raise (ce); + } + + if (book) + g_object_unref (book); +} + +static void +edit_contact_info_cb (GtkWidget *button, EABPopupControl *pop) +{ + emit_event (pop, "Hide"); + + addressbook_load_default_book (contact_editor_cb, pop); +} + +static void +eab_popup_control_display_contact (EABPopupControl *pop, EContact *contact) +{ + GtkWidget *b; + + g_return_if_fail (pop && EAB_IS_POPUP_CONTROL (pop)); + g_return_if_fail (contact && E_IS_CONTACT (contact)); + g_return_if_fail (pop->contact == NULL); + + pop->contact = contact; + g_object_ref (pop->contact); + + eab_contact_display_render (EAB_CONTACT_DISPLAY (pop->contact_display), + contact, + EAB_CONTACT_DISPLAY_RENDER_COMPACT); + gtk_widget_show (pop->contact_display); + 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); + g_signal_connect (b, + "clicked", + G_CALLBACK (edit_contact_info_cb), + pop); + gtk_widget_show (b); +} + +static void +add_contacts_cb (GtkWidget *button, EABPopupControl *pop) +{ + if (pop->email && *pop->email) { + if (pop->name && *pop->name) + e_contact_quick_add (pop->name, pop->email, NULL, NULL); + else + e_contact_quick_add_free_form (pop->email, NULL, NULL); + + } + eab_popup_control_cleanup (pop); + emit_event (pop, "Destroy"); +} + +static void +eab_popup_control_no_matches (EABPopupControl *pop) +{ + GtkWidget *b; + + g_return_if_fail (pop && EAB_IS_POPUP_CONTROL (pop)); + + b = e_button_new_with_stock_icon (_("Add to Contacts"), "gtk-add"); + + gtk_box_pack_start (GTK_BOX (pop->main_vbox), b, TRUE, TRUE, 0); + g_signal_connect (b, + "clicked", + G_CALLBACK (add_contacts_cb), + pop); + gtk_widget_show (b); +} + +static void +wizard_destroy_cb (MiniWizard *wiz, gpointer closure) +{ + gtk_widget_destroy (GTK_WIDGET (closure)); +} + +static void +eab_popup_control_ambiguous_email_add (EABPopupControl *pop, const GList *contacts) +{ + MiniWizard *wiz = mini_wizard_new (); + GtkWidget *win = gtk_window_new (GTK_WINDOW_TOPLEVEL); + + wiz->destroy_cb = wizard_destroy_cb; + wiz->destroy_closure = win; + + gtk_window_set_title (GTK_WINDOW (win), _("Merge E-Mail Address")); + gtk_window_set_position (GTK_WINDOW (win), GTK_WIN_POS_MOUSE); + + contact_picker_init (wiz, contacts, pop->name, pop->email); + + eab_popup_control_cleanup (pop); + emit_event (pop, "Destroy"); + + gtk_container_add (GTK_CONTAINER (win), wiz->body); + gtk_widget_show_all (win); +} + +static void +eab_popup_control_multiple_matches (EABPopupControl *pop, const GList *contacts) +{ + pop->multiple_matches = TRUE; + + eab_popup_control_ambiguous_email_add (pop, contacts); +} + +/** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** **/ + +/* + * Addressbook Query Fun + */ + +static void +name_only_query_cb (EBook *book, EBookStatus status, GList *contacts, gpointer closure) +{ + EABPopupControl *pop; + + if (status != E_BOOK_ERROR_OK) + return; + + pop = EAB_POPUP_CONTROL (closure); + + pop->query_tag = 0; + + if (contacts == NULL) { + eab_popup_control_no_matches (pop); + } else { + eab_popup_control_ambiguous_email_add (pop, contacts); + g_list_foreach (contacts, (GFunc)g_object_unref, NULL); + g_list_free (contacts); + } +} + +static void +query_cb (EBook *book, EBookStatus status, GList *contacts, gpointer closure) +{ + EABPopupControl *pop; + + if (status != E_BOOK_ERROR_OK) + return; + + pop = EAB_POPUP_CONTROL (closure); + + pop->query_tag = 0; + gtk_widget_hide (pop->query_msg); + + if (contacts == NULL) { + + /* Do a name-only query if: + (1) The name is non-empty. + (2) The e-mail is also non-empty (so that the query we just did wasn't actually a name-only query. + */ + if (pop->name && *pop->name && pop->email && *pop->email) { + pop->query_tag = eab_name_and_email_query (book, pop->name, NULL, name_only_query_cb, pop); + } else { + eab_popup_control_no_matches (pop); + } + + } else { + if (g_list_length ((GList *) contacts) == 1) + eab_popup_control_display_contact (pop, E_CONTACT (contacts->data)); + else + eab_popup_control_multiple_matches (pop, contacts); + + g_list_foreach (contacts, (GFunc)g_object_unref, NULL); + g_list_free (contacts); + } +} + +static void +start_query (EBook *book, EBookStatus status, gpointer closure) +{ + EABPopupControl *pop = EAB_POPUP_CONTROL (closure); + + if (status != E_BOOK_ERROR_OK) { + eab_popup_control_no_matches (pop); + if (book) + g_object_unref (book); + return; + } + +#if notyet + if (pop->query_tag) + e_book_simple_query_cancel (book, pop->query_tag); +#endif + + if (pop->book != book) { + g_object_ref (book); + if (pop->book) + g_object_unref (pop->book); + pop->book = book; + } + + pop->query_tag = eab_name_and_email_query (book, pop->name, pop->email, query_cb, pop); + + g_object_unref (pop); +} + +static void +eab_popup_control_query (EABPopupControl *pop) +{ + g_return_if_fail (pop && EAB_IS_POPUP_CONTROL (pop)); + + g_object_ref (pop); + + addressbook_load_default_book (start_query, pop); +} + +/** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** **/ + +enum { + PROPERTY_NAME, + PROPERTY_EMAIL, + PROPERTY_TRANSITORY +}; + +static void +set_prop (BonoboPropertyBag *bag, const BonoboArg *arg, guint arg_id, CORBA_Environment *ev, gpointer user_data) +{ + EABPopupControl *pop = EAB_POPUP_CONTROL (user_data); + + switch (arg_id) { + + case PROPERTY_NAME: + eab_popup_control_set_name (pop, BONOBO_ARG_GET_STRING (arg)); + break; + + case PROPERTY_EMAIL: + eab_popup_control_set_email (pop, BONOBO_ARG_GET_STRING (arg)); + break; + + default: + g_assert_not_reached (); + } +} + +static void +get_prop (BonoboPropertyBag *bag, BonoboArg *arg, guint arg_id, CORBA_Environment *ev, gpointer user_data) +{ + EABPopupControl *pop = EAB_POPUP_CONTROL (user_data); + + switch (arg_id) { + + case PROPERTY_NAME: + BONOBO_ARG_SET_STRING (arg, pop->name); + break; + + case PROPERTY_EMAIL: + BONOBO_ARG_SET_STRING (arg, pop->email); + break; + + case PROPERTY_TRANSITORY: + BONOBO_ARG_SET_BOOLEAN (arg, pop->transitory); + break; + + default: + g_assert_not_reached (); + } +} + +BonoboControl * +eab_popup_control_new (void) +{ + BonoboControl *control; + BonoboPropertyBag *bag; + EABPopupControl *addy; + GtkWidget *w; + + w = eab_popup_new (); + addy = EAB_POPUP_CONTROL (w); + + control = bonobo_control_new (w); + gtk_widget_show (w); + + bag = bonobo_property_bag_new (get_prop, set_prop, w); + bonobo_property_bag_add (bag, "name", PROPERTY_NAME, + BONOBO_ARG_STRING, NULL, NULL, + BONOBO_PROPERTY_WRITEABLE | BONOBO_PROPERTY_READABLE); + + bonobo_property_bag_add (bag, "email", PROPERTY_EMAIL, + BONOBO_ARG_STRING, NULL, NULL, + BONOBO_PROPERTY_WRITEABLE | BONOBO_PROPERTY_READABLE); + + bonobo_property_bag_add (bag, "transitory", PROPERTY_TRANSITORY, + BONOBO_ARG_BOOLEAN, NULL, NULL, + BONOBO_PROPERTY_READABLE); + + bonobo_control_set_properties (control, bonobo_object_corba_objref (BONOBO_OBJECT (bag)), NULL); + bonobo_object_unref (BONOBO_OBJECT (bag)); + + addy->es = bonobo_event_source_new (); + bonobo_object_add_interface (BONOBO_OBJECT (control), + BONOBO_OBJECT (addy->es)); + + return control; +} diff --git a/addressbook/gui/widgets/eab-popup-control.h b/addressbook/gui/widgets/eab-popup-control.h new file mode 100644 index 0000000000..4d223f02cb --- /dev/null +++ b/addressbook/gui/widgets/eab-popup-control.h @@ -0,0 +1,85 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ + +/* + * eab-popup-control.h + * + * Copyright (C) 2001-2003, Ximian, Inc. + * + * Authors: Jon Trowbridge + * Chris Toshok + */ + +/* + * This program 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 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 __EAB_POPUP_CONTROL_H__ +#define __EAB_POPUP_CONTROL_H__ + +#include +#include +#include +#include + +G_BEGIN_DECLS + +#define EAB_TYPE_POPUP_CONTROL (eab_popup_control_get_type ()) +#define EAB_POPUP_CONTROL(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), EAB_TYPE_POPUP_CONTROL, EABPopupControl)) +#define EAB_POPUP_CONTROL_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), EAB_TYPE_POPUP_CONTROL, EABPopupControlClass)) +#define EAB_IS_POPUP_CONTROL(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), EAB_TYPE_POPUP_CONTROL)) +#define EAB_IS_POPUP_CONTROL_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), EAB_TYPE_POPUP_CONTROL)) + +typedef struct _EABPopupControl EABPopupControl; +typedef struct _EABPopupControlClass EABPopupControlClass; + +struct _EABPopupControl { + GtkEventBox parent; + + gchar *name; + gchar *email; + + GtkWidget *name_widget; + GtkWidget *email_widget; + GtkWidget *query_msg; + + GtkWidget *main_vbox; + GtkWidget *generic_view; + GtkWidget *contact_display; + + gboolean transitory; + + guint scheduled_refresh; + EBook *book; + guint query_tag; + gboolean multiple_matches; + EContact *contact; + + BonoboEventSource *es; +}; + +struct _EABPopupControlClass { + GtkEventBoxClass parent_class; +}; + +GType eab_popup_control_get_type (void); + +void eab_popup_control_construct (EABPopupControl *); + +BonoboControl *eab_popup_control_new (void); + +G_END_DECLS + +#endif /* __EAB_POPUP_CONTROL_H__ */ + diff --git a/addressbook/gui/widgets/eab-vcard-control.c b/addressbook/gui/widgets/eab-vcard-control.c new file mode 100644 index 0000000000..82c5fd6032 --- /dev/null +++ b/addressbook/gui/widgets/eab-vcard-control.c @@ -0,0 +1,310 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * eab-vcard-control.c + * + * Copyright (C) 1999, 2000, 2001, 2002, 2003, Ximian, Inc. + * + * This program 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 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. + * + * Authors: + * Chris Lahey + * Chris Toshok + */ + +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "eab-vcard-control.h" +#include "eab-contact-merging.h" + +typedef struct { + EABContactDisplay *display; + GList *card_list; + GtkWidget *label; + EABContactDisplayRenderMode render_mode; +} EABVCardControl; + +#define VCARD_CONTROL_ID "OAFIID:GNOME_Evolution_Addressbook_VCard_Control" + +/* + * Bonobo::PersistStream + * + * These two functions implement the Bonobo::PersistStream load and + * save methods which allow data to be loaded into and out of the + * BonoboObject. + */ +static char * +stream_read (Bonobo_Stream stream) +{ + Bonobo_Stream_iobuf *buffer; + CORBA_Environment ev; + char *data = NULL; + gint length = 0; + + CORBA_exception_init (&ev); + do { +#define READ_CHUNK_SIZE 65536 + Bonobo_Stream_read (stream, READ_CHUNK_SIZE, + &buffer, &ev); + + if (ev._major != CORBA_NO_EXCEPTION) { + CORBA_exception_free (&ev); + return NULL; + } + + if (buffer->_length <= 0) + break; + + data = g_realloc (data, length + buffer->_length + 1); + + memcpy (data + length, buffer->_buffer, buffer->_length); + + length += buffer->_length; + + CORBA_free (buffer); + } while (1); + + CORBA_free (buffer); + CORBA_exception_free (&ev); + + if (data) + data[length] = '\0'; + else + data = g_strdup(""); + + return data; +} /* stream_read */ + +/* + * This function implements the Bonobo::PersistStream:load method. + */ +static void +pstream_load (BonoboPersistStream *ps, const Bonobo_Stream stream, + Bonobo_Persist_ContentType type, void *data, + CORBA_Environment *ev) +{ + GList *list; + char *vcard; + EABVCardControl *vcard_control = data; + + if (type && g_ascii_strcasecmp (type, "text/vCard") != 0 && + g_ascii_strcasecmp (type, "text/x-vCard") != 0) { + CORBA_exception_set (ev, CORBA_USER_EXCEPTION, + ex_Bonobo_Persist_WrongDataType, NULL); + return; + } + + if ((vcard = stream_read (stream)) == NULL) { + CORBA_exception_set (ev, CORBA_USER_EXCEPTION, + ex_Bonobo_Persist_FileNotFound, NULL); + return; + } + + e_free_object_list (vcard_control->card_list); + list = eab_contact_list_from_string (vcard); + g_free(vcard); + vcard_control->card_list = list; + if (list) { + eab_contact_display_render (vcard_control->display, E_CONTACT (list->data), + vcard_control->render_mode); + } + if (list && list->next) { + char *message; + int length = g_list_length (list) - 1; + if (length > 1) { + message = g_strdup_printf (_("and %d other contacts."), length); + } else { + message = g_strdup_printf (_("and one other contact.")); + } + gtk_label_set_text (GTK_LABEL (vcard_control->label), message); + g_free (message); + gtk_widget_show (vcard_control->label); + } else { + gtk_widget_hide (vcard_control->label); + } +} /* pstream_load */ + +/* + * This function implements the Bonobo::PersistStream:save method. + */ +static void +pstream_save (BonoboPersistStream *ps, const Bonobo_Stream stream, + Bonobo_Persist_ContentType type, void *data, + CORBA_Environment *ev) +{ + EABVCardControl *vcard_control = data; + char *vcard; + int length; + + if (type && g_ascii_strcasecmp (type, "text/vCard") != 0 && + g_ascii_strcasecmp (type, "text/x-vCard") != 0) { + CORBA_exception_set (ev, CORBA_USER_EXCEPTION, + ex_Bonobo_Persist_WrongDataType, NULL); + return; + } + + vcard = eab_contact_list_to_string (vcard_control->card_list); + length = strlen (vcard); + bonobo_stream_client_write (stream, vcard, length, ev); + g_free (vcard); +} /* pstream_save */ + +static Bonobo_Persist_ContentTypeList * +pstream_get_content_types (BonoboPersistStream *ps, void *closure, + CORBA_Environment *ev) +{ + return bonobo_persist_generate_content_types (2, "text/vCard", "text/x-vCard"); +} + +static void +book_open_cb (EBook *book, EBookStatus status, gpointer closure) +{ + GList *list = closure; + if (status == E_BOOK_ERROR_OK) { + GList *p; + for (p = list; p; p = p->next) { + /* XXX argh, more passing of NULL's for callbacks */ + eab_merging_book_add_contact (book, E_CONTACT (p->data), NULL, NULL); + } + } + if (book) + g_object_unref (book); + e_free_object_list (list); +} + +static void +save_in_addressbook(GtkWidget *button, gpointer data) +{ + EABVCardControl *vcard_control = data; + GList *list, *p; + + list = g_list_copy (vcard_control->card_list); + + for (p = list; p; p = p->next) + g_object_ref (p->data); + + addressbook_load_default_book (book_open_cb, list); +} + +static void +toggle_full_vcard(GtkWidget *button, gpointer data) +{ + EABVCardControl *vcard_control = data; + char *label; + + if (!vcard_control->card_list) + return; + + if (vcard_control->render_mode == EAB_CONTACT_DISPLAY_RENDER_NORMAL) { + vcard_control->render_mode = EAB_CONTACT_DISPLAY_RENDER_COMPACT; + label = _("Show Full VCard"); + } + else { + vcard_control->render_mode = EAB_CONTACT_DISPLAY_RENDER_NORMAL; + label = _("Show Compact VCard"); + } + + gtk_button_set_label (GTK_BUTTON (button), label); + eab_contact_display_render (vcard_control->display, E_CONTACT (vcard_control->card_list->data), + vcard_control->render_mode); +} + +static void +free_struct (gpointer data, GObject *where_object_was) +{ + EABVCardControl *vcard_control = data; + e_free_object_list (vcard_control->card_list); + g_free (vcard_control); +} + +BonoboControl * +eab_vcard_control_new (void) +{ + BonoboControl *control; + BonoboPersistStream *stream; + GtkWidget *display; + GtkWidget *button1, *button2; + GtkWidget *label; + GtkWidget *table; + + EABVCardControl *vcard_control = g_new (EABVCardControl, 1); + + printf ("inside eab_vcard_control_new\n"); + + vcard_control->card_list = NULL; + vcard_control->display = NULL; + vcard_control->label = NULL; + + vcard_control->render_mode = EAB_CONTACT_DISPLAY_RENDER_COMPACT; + + /* Create the control. */ + + display = eab_contact_display_new (); + gtk_widget_show (display); + vcard_control->display = EAB_CONTACT_DISPLAY (display); + + /* This is intentionally not shown. */ + label = gtk_label_new (""); + vcard_control->label = label; + + button1 = gtk_button_new_with_label(_("Show Full VCard")); + g_signal_connect (button1, "clicked", + G_CALLBACK (toggle_full_vcard), vcard_control); + gtk_widget_show (button1); + + button2 = gtk_button_new_with_label(_("Save in addressbook")); + g_signal_connect (button2, "clicked", + G_CALLBACK (save_in_addressbook), vcard_control); + gtk_widget_show (button2); + + table = gtk_table_new (6, 6, FALSE); + gtk_table_attach (GTK_TABLE (table), display, 0, 6, 3, 6, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0); + gtk_table_attach (GTK_TABLE (table), label, 0, 3, 2, 3, GTK_FILL, 0, 0, 0); + gtk_table_attach (GTK_TABLE (table), button1, 0, 1, 1, 2, 0, 0, 0, 0); + gtk_table_attach (GTK_TABLE (table), button2, 1, 2, 1, 2, 0, 0, 0, 0); + gtk_widget_show (table); + + control = bonobo_control_new (table); + + g_object_weak_ref (G_OBJECT (control), free_struct, vcard_control); + + stream = bonobo_persist_stream_new (pstream_load, pstream_save, + pstream_get_content_types, + VCARD_CONTROL_ID, + vcard_control); + + if (stream == NULL) { + bonobo_object_unref (BONOBO_OBJECT (control)); + return NULL; + } + + bonobo_object_add_interface (BONOBO_OBJECT (control), + BONOBO_OBJECT (stream)); + + return control; +} diff --git a/addressbook/gui/widgets/eab-vcard-control.h b/addressbook/gui/widgets/eab-vcard-control.h new file mode 100644 index 0000000000..5f6643c1ca --- /dev/null +++ b/addressbook/gui/widgets/eab-vcard-control.h @@ -0,0 +1,8 @@ +#ifndef __EAB_VCARD_CONTROL_H__ +#define __EAB_VCARD_CONTROL_H__ + +#include + +BonoboControl *eab_vcard_control_new (void); + +#endif /* __EAB_VCARD_CONTROL_H__ */ diff --git a/addressbook/gui/widgets/test-minicard-label.c b/addressbook/gui/widgets/test-minicard-label.c deleted file mode 100644 index c109497628..0000000000 --- a/addressbook/gui/widgets/test-minicard-label.c +++ /dev/null @@ -1,129 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* test-minicard-label.c - * - * Copyright (C) 2000 Ximian, Inc. - * Author: Chris Lahey - * - * This program 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 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 -#include -#include -#include -#include -#include "e-minicard-label.h" - -/* This is a horrible thing to do, but it is just a test. */ -GnomeCanvasItem *label; -GnomeCanvasItem *rect; - -static void destroy_callback(gpointer data, GObject *where_object_was) -{ - exit(0); -} - -static void allocate_callback(GtkWidget *canvas, GtkAllocation *allocation, gpointer data) -{ - gnome_canvas_set_scroll_region(GNOME_CANVAS( canvas ), 0, 0, allocation->width, allocation->height ); - gnome_canvas_item_set( label, - "width", (double) allocation->width, - "height", (double) allocation->height, - NULL ); - gnome_canvas_item_set( rect, - "x2", (double) allocation->width, - "y2", (double) allocation->height, - NULL ); -} - -#if 0 -static void about_callback( GtkWidget *widget, gpointer data ) -{ - - const gchar *authors[] = - { - "Christopher James Lahey ", - NULL - }; - - GtkWidget *about = - gnome_about_new ( _( "Minicard Label Test" ), VERSION, - _( "Copyright (C) 2000, Ximian, Inc." ), - authors, - _( "This should test the minicard label canvas item" ), - NULL); - gtk_widget_show (about); -} -#endif - -static void button_press_callback( GtkWidget *widget, gpointer data ) -{ - gnome_canvas_item_grab_focus( label ); -} - -int main( int argc, char *argv[] ) -{ - GtkWidget *app; - GtkWidget *canvas; - - /* bindtextdomain (PACKAGE, GNOMELOCALEDIR); - textdomain (PACKAGE);*/ - - gnome_init( "Minicard Label Test", VERSION, argc, argv); - app = gnome_app_new("Minicard Label Test", NULL); - - canvas = e_canvas_new(); - rect = gnome_canvas_item_new( gnome_canvas_root( GNOME_CANVAS( canvas ) ), - gnome_canvas_rect_get_type(), - "x1", (double) 0, - "y1", (double) 0, - "x2", (double) 100, - "y2", (double) 100, - "fill_color", "white", - NULL ); - label = e_minicard_label_new(gnome_canvas_root( GNOME_CANVAS( canvas ) )); - gnome_canvas_item_set( label, - "width", (double) 100, - "height", (double) 100, - "fieldname", "Full Name:", - "field", "Christopher James Lahey", - NULL ); - gnome_canvas_set_scroll_region ( GNOME_CANVAS( canvas ), - 0, 0, - 100, 100 ); - - gnome_app_set_contents( GNOME_APP( app ), canvas ); - - - /* Connect the signals */ - g_object_weak_ref (app, destroy_callback, app); - - g_signal_connect( canvas , "size_allocate", - G_CALLBACK ( allocate_callback ), - ( gpointer ) app ); - - g_signal_connect( canvas , "button_press_event", - G_CALLBACK ( button_press_callback ), - ( gpointer ) app ); - - gtk_widget_show_all( app ); - - gtk_main(); - - /* Not reached. */ - return 0; -} diff --git a/addressbook/gui/widgets/test-minicard-view.c b/addressbook/gui/widgets/test-minicard-view.c deleted file mode 100644 index 14ede54208..0000000000 --- a/addressbook/gui/widgets/test-minicard-view.c +++ /dev/null @@ -1,203 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* test-reflow.c - * - * Copyright (C) 2000 Ximian, Inc. - * Author: Chris Lahey - * - * This program 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 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 -#include -#include "e-minicard-view.h" - -/* This is a horrible thing to do, but it is just a test. */ -GnomeCanvasItem *reflow; -GnomeCanvasItem *rect; -GtkAllocation last_alloc; - -CORBA_Environment ev; -CORBA_ORB orb; - -static void -init_bonobo (int argc, char **argv) -{ - - gnome_CORBA_init_with_popt_table ( - "Reflow Test", VERSION, - &argc, argv, NULL, 0, NULL, GNORBA_INIT_SERVER_FUNC, &ev); - - orb = gnome_CORBA_ORB (); - - if (bonobo_init (orb, NULL, NULL) == FALSE) - g_error (_("Could not initialize Bonobo")); - -} - -static void destroy_callback(gpointer data, GObject *where_object_was) -{ - exit(0); -} - -static void allocate_callback(GtkWidget *canvas, GtkAllocation *allocation, gpointer data) -{ - double width; - last_alloc = *allocation; - gnome_canvas_item_set( reflow, - "height", (double) allocation->height, - NULL ); - gnome_canvas_item_set( reflow, - "minimum_width", (double) allocation->width, - NULL ); - g_object_get(reflow, - "width", &width, - NULL); - width = MAX(width, allocation->width); - gnome_canvas_set_scroll_region(GNOME_CANVAS( canvas ), 0, 0, width, allocation->height ); - gnome_canvas_item_set( rect, - "x2", (double) width, - "y2", (double) allocation->height, - NULL ); -} - -static void resize(GnomeCanvas *canvas, gpointer data) -{ - double width; - g_object_get(reflow, - "width", &width, - NULL); - width = MAX(width, last_alloc.width); - gnome_canvas_set_scroll_region(canvas , 0, 0, width, last_alloc.height ); - gnome_canvas_item_set( rect, - "x2", (double) width, - "y2", (double) last_alloc.height, - NULL ); -} - -#if 0 -static void about_callback( GtkWidget *widget, gpointer data ) -{ - - const gchar *authors[] = - { - "Christopher James Lahey ", - NULL - }; - - GtkWidget *about = - gnome_about_new ( _( "Reflow Test" ), VERSION, - _( "Copyright (C) 2000, Ximian, Inc." ), - authors, - _( "This should test the reflow canvas item" ), - NULL); - gtk_widget_show (about); -} -#endif - -static void -book_open_cb (EBook *book, EBookStatus status, gpointer closure) -{ - if (status == E_BOOK_STATUS_SUCCESS) - gnome_canvas_item_set(reflow, - "book", book, - NULL); -} - -static gboolean -ebook_create (gpointer data) -{ - EBook *book; - - book = e_book_new (); - - if (!book) { - printf ("%s: %s(): Couldn't create EBook, bailing.\n", - __FILE__, - G_GNUC_FUNCTION); - return FALSE; - } - - - e_book_load_uri (book, "file:/tmp/test.db", book_open_cb, NULL); - - return FALSE; -} - -int main( int argc, char *argv[] ) -{ - GtkWidget *app; - GtkWidget *canvas; - GtkWidget *vbox; - GtkWidget *scrollbar; - - /* bindtextdomain (PACKAGE, GNOMELOCALEDIR); - textdomain (PACKAGE);*/ - - CORBA_exception_init (&ev); - init_bonobo (argc, argv); - - app = gnome_app_new("Reflow Test", NULL); - - vbox = gtk_vbox_new(FALSE, 0); - - canvas = e_canvas_new(); - rect = gnome_canvas_item_new( gnome_canvas_root( GNOME_CANVAS( canvas ) ), - gnome_canvas_rect_get_type(), - "x1", (double) 0, - "y1", (double) 0, - "x2", (double) 100, - "y2", (double) 100, - "fill_color", "white", - NULL ); - reflow = gnome_canvas_item_new( gnome_canvas_root( GNOME_CANVAS( canvas ) ), - e_minicard_view_get_type(), - "height", (double) 100, - "minimum_width", (double) 100, - NULL ); - g_signal_connect( canvas, "reflow", - G_CALLBACK ( resize ), - ( gpointer ) app); - - gnome_canvas_set_scroll_region ( GNOME_CANVAS( canvas ), - 0, 0, - 100, 100 ); - - gtk_box_pack_start(GTK_BOX(vbox), canvas, TRUE, TRUE, 0); - - scrollbar = gtk_hscrollbar_new(gtk_layout_get_hadjustment(GTK_LAYOUT(canvas))); - - gtk_box_pack_start(GTK_BOX(vbox), scrollbar, FALSE, FALSE, 0); - - gnome_app_set_contents( GNOME_APP( app ), vbox ); - - /* Connect the signals */ - g_object_weak_ref (app, destroy_callback, app); - - g_signal_connect( canvas, "size_allocate", - G_CALLBACK ( allocate_callback ), - ( gpointer ) app ); - - gtk_widget_show_all( app ); - gdk_window_set_back_pixmap( GTK_LAYOUT(canvas)->bin_window, NULL, FALSE); - - g_idle_add (ebook_create, NULL); - - bonobo_main (); - - /* Not reached. */ - return 0; -} diff --git a/addressbook/gui/widgets/test-minicard.c b/addressbook/gui/widgets/test-minicard.c deleted file mode 100644 index 822362d972..0000000000 --- a/addressbook/gui/widgets/test-minicard.c +++ /dev/null @@ -1,120 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* test-minicard.c - * - * Copyright (C) 2000 Ximian, Inc. - * Author: Chris Lahey - * - * This program 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 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 -#include -#include -#include - -#include "e-minicard.h" - -/* This is a horrible thing to do, but it is just a test. */ -GnomeCanvasItem *card; -GnomeCanvasItem *rect; - -static void destroy_callback(gpointer data, GObject *where_object_was) -{ - exit(0); -} - -static void allocate_callback(GtkWidget *canvas, GtkAllocation *allocation, gpointer data) -{ - gnome_canvas_set_scroll_region(GNOME_CANVAS( canvas ), 0, 0, allocation->width, allocation->height ); - gnome_canvas_item_set( card, - "width", (double) allocation->width, - NULL ); - gnome_canvas_item_set( rect, - "x2", (double) allocation->width, - "y2", (double) allocation->height, - NULL ); -} - -#if 0 -static void about_callback( GtkWidget *widget, gpointer data ) -{ - - const gchar *authors[] = - { - "Christopher James Lahey ", - NULL - }; - - GtkWidget *about = - gnome_about_new ( _( "Minicard Test" ), VERSION, - _( "Copyright (C) 2000, Ximian, Inc." ), - authors, - _( "This should test the minicard canvas item" ), - NULL); - gtk_widget_show (about); -} -#endif - -int main( int argc, char *argv[] ) -{ - GtkWidget *app; - GtkWidget *canvas; - int i; - - /* bindtextdomain (PACKAGE, GNOMELOCALEDIR); - textdomain (PACKAGE);*/ - - gnome_init( "Minicard Test", VERSION, argc, argv); - app = gnome_app_new("Minicard Test", NULL); - - canvas = gnome_canvas_new(); - rect = gnome_canvas_item_new( gnome_canvas_root( GNOME_CANVAS( canvas ) ), - gnome_canvas_rect_get_type(), - "x1", (double) 0, - "y1", (double) 0, - "x2", (double) 100, - "y2", (double) 100, - "fill_color", "white", - NULL ); - for ( i = 0; i < 1; i++ ) - { - card = gnome_canvas_item_new( gnome_canvas_root( GNOME_CANVAS( canvas ) ), - e_minicard_get_type(), - "width", (double) 100, - NULL ); - } - gnome_canvas_set_scroll_region ( GNOME_CANVAS( canvas ), - 0, 0, - 100, 100 ); - - gnome_app_set_contents( GNOME_APP( app ), canvas ); - - /* Connect the signals */ - g_object_weak_ref (app, destroy_callback, app); - - g_signal_connect( canvas, "size_allocate", - G_CALLBACK( allocate_callback ), - ( gpointer ) app ); - - gtk_widget_show_all( app ); - - gtk_main(); - - /* Not reached. */ - return 0; -} -- cgit v1.2.3