diff options
author | Ettore Perazzoli <ettore@src.gnome.org> | 2003-10-22 02:49:34 +0800 |
---|---|---|
committer | Ettore Perazzoli <ettore@src.gnome.org> | 2003-10-22 02:49:34 +0800 |
commit | 653cfffc0e00dfb59b36813c1b45c53d3f773c65 (patch) | |
tree | 9b486d5e383ec1391d60973d9cc548be0ef6d9d5 /addressbook/gui | |
parent | 0fb08f3ff81575a4749d851404233f34252dd2f2 (diff) | |
download | gsoc2013-evolution-653cfffc0e00dfb59b36813c1b45c53d3f773c65.tar.gz gsoc2013-evolution-653cfffc0e00dfb59b36813c1b45c53d3f773c65.tar.zst gsoc2013-evolution-653cfffc0e00dfb59b36813c1b45c53d3f773c65.zip |
Merge new-ui-branch to the trunk.
svn path=/trunk/; revision=22965
Diffstat (limited to 'addressbook/gui')
92 files changed, 4915 insertions, 6848 deletions
diff --git a/addressbook/gui/component/GNOME_Evolution_Addressbook.server.in.in b/addressbook/gui/component/GNOME_Evolution_Addressbook.server.in.in index 6d46c5fbbe..6b3b252377 100644 --- a/addressbook/gui/component/GNOME_Evolution_Addressbook.server.in.in +++ b/addressbook/gui/component/GNOME_Evolution_Addressbook.server.in.in @@ -1,6 +1,6 @@ <oaf_info> -<oaf_server iid="OAFIID:GNOME_Evolution_Addressbook_Factory" +<oaf_server iid="OAFIID:GNOME_Evolution_Addressbook_Factory_2" type="shlib" location="@COMPONENTDIR@/libevolution-addressbook.so"> @@ -13,9 +13,9 @@ </oaf_server> -<oaf_server iid="OAFIID:GNOME_Evolution_Addressbook_MiniCard_Control" +<oaf_server iid="OAFIID:GNOME_Evolution_Addressbook_VCard_Control" type="factory" - location="OAFIID:GNOME_Evolution_Addressbook_Factory"> + location="OAFIID:GNOME_Evolution_Addressbook_Factory_2"> <oaf_attribute name="repo_ids" type="stringv"> <item value="IDL:Bonobo/Control:1.0"/> @@ -32,9 +32,9 @@ </oaf_server> -<oaf_server iid="OAFIID:GNOME_Evolution_Addressbook_Control" +<oaf_server iid="OAFIID:GNOME_Evolution_Addressbook_Control_2" type="factory" - location="OAFIID:GNOME_Evolution_Addressbook_Factory"> + location="OAFIID:GNOME_Evolution_Addressbook_Factory_2"> <oaf_attribute name="repo_ids" type="stringv"> <item value="IDL:BonoboControl/addressbook-control:1.0"/> @@ -46,27 +46,22 @@ </oaf_server> -<oaf_server iid="OAFIID:GNOME_Evolution_Addressbook_ShellComponent" +<oaf_server iid="OAFIID:GNOME_Evolution_Addressbook_Component" type="factory" - location="OAFIID:GNOME_Evolution_Addressbook_Factory"> + location="OAFIID:GNOME_Evolution_Addressbook_Factory_2"> <oaf_attribute name="repo_ids" type="stringv"> - <item value="IDL:GNOME/Evolution/ShellComponent:1.0"/> + <item value="IDL:GNOME/Evolution/Component:1.0"/> </oaf_attribute> <oaf_attribute name="name" type="string" _value="Evolution Addressbook component"/> - <oaf_attribute name="evolution:shell_component_icon" type="string" - value="evolution-contacts.png"/> - <oaf_attribute name="evolution:shell_component_launch_order" type="number" - value="2"/> - </oaf_server> <oaf_server iid="OAFIID:GNOME_Evolution_Addressbook_AddressWidget" type="factory" - location="OAFIID:GNOME_Evolution_Addressbook_Factory"> + location="OAFIID:GNOME_Evolution_Addressbook_Factory_2"> <oaf_attribute name="repo_ids" type="stringv"> <item value="IDL:BonoboControl/address-widget:1.0"/> @@ -80,7 +75,7 @@ <oaf_server iid="OAFIID:GNOME_Evolution_Addressbook_AddressPopup" type="factory" - location="OAFIID:GNOME_Evolution_Addressbook_Factory"> + location="OAFIID:GNOME_Evolution_Addressbook_Factory_2"> <oaf_attribute name="repo_ids" type="stringv"> <item value="IDL:BonoboControl/address-widget:1.0"/> @@ -94,7 +89,7 @@ <oaf_server iid="OAFIID:GNOME_Evolution_LDAPStorage_ConfigControl" type="factory" - location="OAFIID:GNOME_Evolution_Addressbook_Factory"> + location="OAFIID:GNOME_Evolution_Addressbook_Factory_2"> <oaf_attribute name="repo_ids" type="stringv"> <item value="IDL:GNOME/Evolution/ConfigControl:1.0"/> diff --git a/addressbook/gui/component/Makefile.am b/addressbook/gui/component/Makefile.am index e13f8d853b..4234997e1d 100644 --- a/addressbook/gui/component/Makefile.am +++ b/addressbook/gui/component/Makefile.am @@ -9,7 +9,6 @@ INCLUDES = \ -I$(top_srcdir)/widgets/misc \ -I$(top_srcdir)/addressbook/gui/contact-editor \ -I$(top_srcdir)/addressbook/gui/contact-list-editor \ - -I$(top_srcdir)/addressbook/gui/minicard \ -I$(top_srcdir)/addressbook/gui/widgets \ -I$(top_srcdir)/addressbook/backend \ -I$(top_builddir)/addressbook/backend \ @@ -38,26 +37,22 @@ libevolution_addressbook_la_SOURCES = \ addressbook-storage.h \ addressbook.c \ addressbook.h \ - component-factory.c \ - e-cardlist-model.c \ - e-cardlist-model.h \ - e-address-widget.h \ - e-address-widget.c \ - e-address-popup.h \ - e-address-popup.c + component-factory.c + +# $(top_builddir)/addressbook/printing/libecontactprint.la libevolution_addressbook_la_LIBADD = \ - select-names/libeselectnames.la \ + $(top_builddir)/addressbook/gui/component/select-names/libeselectnames.la \ $(top_builddir)/shell/libeshell.la \ - $(top_builddir)/addressbook/gui/widgets/libeminicard.la \ - $(top_builddir)/addressbook/printing/libecontactprint.la \ + $(top_builddir)/addressbook/gui/merging/libeabbookmerging.la \ + $(top_builddir)/addressbook/gui/widgets/libeabwidgets.la \ $(top_builddir)/addressbook/gui/search/libeaddressbooksearch.la \ $(top_builddir)/filter/libfilter.la \ + $(top_builddir)/addressbook/util/libeabutil.la \ $(top_builddir)/addressbook/backend/ebook/libebook.la \ - $(top_builddir)/addressbook/gui/contact-list-editor/libecontactlisteditor.la \ $(top_builddir)/addressbook/gui/contact-editor/libecontacteditor.la \ + $(top_builddir)/addressbook/gui/contact-list-editor/libecontactlisteditor.la \ $(top_builddir)/widgets/misc/libemiscwidgets.la \ - $(top_builddir)/addressbook/gui/merging/libecardmerging.la \ $(top_builddir)/widgets/menus/libmenus.la \ $(EVOLUTION_ADDRESSBOOK_LIBS) $(LDAP_LIBS) diff --git a/addressbook/gui/component/addressbook-component.c b/addressbook/gui/component/addressbook-component.c index cdfeeb9755..c323a1bd78 100644 --- a/addressbook/gui/component/addressbook-component.c +++ b/addressbook/gui/component/addressbook-component.c @@ -1,7 +1,7 @@ /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ /* addressbook-component.c * - * Copyright (C) 2000 Ximian, Inc. + * Copyright (C) 2003 Ettore Perazzoli * * This program is free software; you can redistribute it and/or * modify it under the terms of version 2 of the GNU General Public @@ -17,633 +17,170 @@ * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. * - * Author: Ettore Perazzoli + * Author: Ettore Perazzoli <ettore@ximian.com> */ -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <libgnomevfs/gnome-vfs-types.h> -#include <libgnomevfs/gnome-vfs-uri.h> -#include <libgnomevfs/gnome-vfs-ops.h> -#include <libgnomevfs/gnome-vfs-directory.h> -#include <libgnomevfs/gnome-vfs-file-info.h> - -#include <sys/types.h> -#include <sys/stat.h> -#include <errno.h> -#include <string.h> -#include <unistd.h> - -#include <bonobo/bonobo-generic-factory.h> -#include <bonobo/bonobo-main.h> - -#include "evolution-shell-component.h" -#include "evolution-shell-component-dnd.h" -#include "evolution-storage.h" -#include "e-folder-list.h" - -#include "ebook/e-book.h" -#include "ebook/e-card.h" -#include "ebook/e-book-util.h" - -#include "addressbook-config.h" -#include "addressbook-storage.h" -#include "addressbook-component.h" -#include "addressbook.h" -#include "addressbook/gui/merging/e-card-merging.h" -#include "addressbook/gui/widgets/e-addressbook-util.h" - - - -#define GNOME_EVOLUTION_ADDRESSBOOK_COMPONENT_ID "OAFIID:GNOME_Evolution_Addressbook_ShellComponent" - -EvolutionShellClient *global_shell_client = NULL; +/* EPFIXME: Add autocompletion setting. */ -EvolutionShellClient * -addressbook_component_get_shell_client (void) -{ - return global_shell_client; -} -static char *accepted_dnd_types[] = { - "text/x-vcard", - NULL -}; +#include <config.h> -static const EvolutionShellComponentFolderType folder_types[] = { - { "contacts", "evolution-contacts.png", N_("Contacts"), N_("Folder containing contact information"), - TRUE, accepted_dnd_types, NULL }, - { "contacts/ldap", "ldap.png", N_("LDAP Server"), N_("LDAP server containing contact information"), - FALSE, accepted_dnd_types, NULL }, - { "contacts/public", "evolution-contacts.png", N_("Public Contacts"), N_("Public folder containing contact information"), - FALSE, accepted_dnd_types, NULL }, - { NULL } -}; +#include "addressbook-component.h" -#define IS_CONTACT_TYPE(x) (g_ascii_strcasecmp((x), "contacts") == 0 || g_ascii_strcasecmp ((x), "contacts/ldap") == 0 || g_ascii_strcasecmp((x), "contacts/public") == 0) - -/* EvolutionShellComponent methods and signals. */ - -static EvolutionShellComponentResult -create_view (EvolutionShellComponent *shell_component, - const char *physical_uri, - const char *type, - const char *view_info, - BonoboControl **control_return, - void *closure) -{ - BonoboControl *control; +#include "addressbook.h" - if (!IS_CONTACT_TYPE (type)) - return EVOLUTION_SHELL_COMPONENT_UNSUPPORTEDTYPE; +#include "widgets/misc/e-source-selector.h" - control = addressbook_new_control (); - bonobo_control_set_property (control, NULL, "folder_uri", TC_CORBA_string, physical_uri, NULL); +#include <gtk/gtkscrolledwindow.h> +#include <gconf/gconf-client.h> - *control_return = control; - return EVOLUTION_SHELL_COMPONENT_OK; -} +#define PARENT_TYPE bonobo_object_get_type () +static BonoboObjectClass *parent_class = NULL; -static void -create_folder (EvolutionShellComponent *shell_component, - const char *physical_uri, - const char *type, - const GNOME_Evolution_ShellComponentListener listener, - void *closure) -{ - CORBA_Environment ev; - GNOME_Evolution_ShellComponentListener_Result result; +struct _AddressbookComponentPrivate { + GConfClient *gconf_client; + ESourceList *source_list; +}; - if (!IS_CONTACT_TYPE (type)) - result = GNOME_Evolution_ShellComponentListener_UNSUPPORTED_TYPE; - else - result = GNOME_Evolution_ShellComponentListener_OK; - CORBA_exception_init(&ev); - GNOME_Evolution_ShellComponentListener_notifyResult(listener, result, &ev); - CORBA_exception_free(&ev); -} +/* Utility functions. */ static void -remove_folder (EvolutionShellComponent *shell_component, - const char *physical_uri, - const char *type, - const GNOME_Evolution_ShellComponentListener listener, - void *closure) +load_uri_for_selection (ESourceSelector *selector, + BonoboControl *view_control) { - CORBA_Environment ev; - char *db_path, *summary_path, *subdir_path; - struct stat sb; - int rv; - - CORBA_exception_init(&ev); - - if (!IS_CONTACT_TYPE (type)) { - GNOME_Evolution_ShellComponentListener_notifyResult (listener, - GNOME_Evolution_ShellComponentListener_UNSUPPORTED_TYPE, - &ev); - CORBA_exception_free(&ev); - return; - } - - if (!strncmp (physical_uri, "ldap://", 7)) { - GNOME_Evolution_ShellComponentListener_notifyResult (listener, - GNOME_Evolution_ShellComponentListener_UNSUPPORTED_OPERATION, - &ev); - CORBA_exception_free(&ev); - return; - } - if (strncmp (physical_uri, "file://", 7)) { - GNOME_Evolution_ShellComponentListener_notifyResult (listener, - GNOME_Evolution_ShellComponentListener_INVALID_URI, - &ev); - CORBA_exception_free(&ev); - return; - } - - subdir_path = g_build_filename (physical_uri + 7, "subfolders", NULL); - rv = stat (subdir_path, &sb); - g_free (subdir_path); - if (rv != -1) { - GNOME_Evolution_ShellComponentListener_notifyResult (listener, - GNOME_Evolution_ShellComponentListener_HAS_SUBFOLDERS, - &ev); - CORBA_exception_free(&ev); - return; - } - - db_path = g_build_filename (physical_uri + 7, "addressbook.db", NULL); - summary_path = g_build_filename (physical_uri + 7, "addressbook.db.summary", NULL); - rv = unlink (db_path); - - if (rv == 0 || (rv == -1 && errno == ENOENT)) - rv = unlink (summary_path); + ESource *selected_source = e_source_selector_peek_primary_selection (E_SOURCE_SELECTOR (selector)); - if (rv == 0 || (rv == -1 && errno == ENOENT)) { - GNOME_Evolution_ShellComponentListener_notifyResult (listener, - GNOME_Evolution_ShellComponentListener_OK, - &ev); - } - else { - GNOME_Evolution_ShellComponentListener_notifyResult (listener, - GNOME_Evolution_ShellComponentListener_PERMISSION_DENIED, - &ev); + if (selected_source != NULL) { + char *uri = e_source_get_uri (selected_source); + bonobo_control_set_property (view_control, NULL, "folder_uri", TC_CORBA_string, uri, NULL); + g_free (uri); } - - g_free (db_path); - g_free (summary_path); - - CORBA_exception_free(&ev); } -/* ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** */ -/* This code is cut & pasted from calendar/gui/component-factory.c */ +/* Callbacks. */ -static GNOME_Evolution_ShellComponentListener_Result -xfer_file (GnomeVFSURI *base_src_uri, - GnomeVFSURI *base_dest_uri, - const char *file_name, - int remove_source) +static void +primary_source_selection_changed_callback (ESourceSelector *selector, + BonoboControl *view_control) { - GnomeVFSURI *src_uri, *dest_uri; - GnomeVFSHandle *hin, *hout; - GnomeVFSResult result; - GnomeVFSFileInfo file_info; - GnomeVFSFileSize size; - char *buffer; - - src_uri = gnome_vfs_uri_append_file_name (base_src_uri, file_name); - - result = gnome_vfs_open_uri (&hin, src_uri, GNOME_VFS_OPEN_READ); - if (result == GNOME_VFS_ERROR_NOT_FOUND) { - gnome_vfs_uri_unref (src_uri); - return GNOME_Evolution_ShellComponentListener_OK; /* No need to xfer anything. */ - } - if (result != GNOME_VFS_OK) { - gnome_vfs_uri_unref (src_uri); - return GNOME_Evolution_ShellComponentListener_PERMISSION_DENIED; - } + load_uri_for_selection (selector, view_control); +} - result = gnome_vfs_get_file_info_uri (src_uri, &file_info, GNOME_VFS_FILE_INFO_DEFAULT); - if (result != GNOME_VFS_OK) { - gnome_vfs_uri_unref (src_uri); - return GNOME_Evolution_ShellComponentListener_PERMISSION_DENIED; - } - dest_uri = gnome_vfs_uri_append_file_name (base_dest_uri, file_name); +/* Evolution::Component CORBA methods. */ - result = gnome_vfs_create_uri (&hout, dest_uri, GNOME_VFS_OPEN_WRITE, FALSE, 0600); - if (result != GNOME_VFS_OK) { - gnome_vfs_close (hin); - gnome_vfs_uri_unref (src_uri); - gnome_vfs_uri_unref (dest_uri); - return GNOME_Evolution_ShellComponentListener_PERMISSION_DENIED; - } +static void +impl_createControls (PortableServer_Servant servant, + Bonobo_Control *corba_sidebar_control, + Bonobo_Control *corba_view_control, + CORBA_Environment *ev) +{ + AddressbookComponent *addressbook_component = ADDRESSBOOK_COMPONENT (bonobo_object_from_servant (servant)); + GtkWidget *selector; + GtkWidget *selector_scrolled_window; + BonoboControl *sidebar_control; + BonoboControl *view_control; - /* write source file to destination file */ - buffer = g_malloc (file_info.size); - result = gnome_vfs_read (hin, buffer, file_info.size, &size); - if (result != GNOME_VFS_OK) { - gnome_vfs_close (hin); - gnome_vfs_close (hout); - gnome_vfs_uri_unref (src_uri); - gnome_vfs_uri_unref (dest_uri); - g_free (buffer); - return GNOME_Evolution_ShellComponentListener_PERMISSION_DENIED; - } + selector = e_source_selector_new (addressbook_component->priv->source_list); + e_source_selector_show_selection (E_SOURCE_SELECTOR (selector), FALSE); + gtk_widget_show (selector); - result = gnome_vfs_write (hout, buffer, file_info.size, &size); - if (result != GNOME_VFS_OK) { - gnome_vfs_close (hin); - gnome_vfs_close (hout); - gnome_vfs_uri_unref (src_uri); - gnome_vfs_uri_unref (dest_uri); - g_free (buffer); - return GNOME_Evolution_ShellComponentListener_PERMISSION_DENIED; - } + selector_scrolled_window = gtk_scrolled_window_new (NULL, NULL); + gtk_container_add (GTK_CONTAINER (selector_scrolled_window), selector); + gtk_widget_show (selector_scrolled_window); - if (remove_source) { - char *text_uri; + sidebar_control = bonobo_control_new (selector_scrolled_window); - /* Sigh, we have to do this as there is no gnome_vfs_unlink_uri(). :-( */ + view_control = addressbook_new_control (); + g_signal_connect_object (selector, "primary_selection_changed", + G_CALLBACK (primary_source_selection_changed_callback), + G_OBJECT (view_control), 0); + load_uri_for_selection (E_SOURCE_SELECTOR (selector), view_control); - text_uri = gnome_vfs_uri_to_string (src_uri, GNOME_VFS_URI_HIDE_NONE); - result = gnome_vfs_unlink (text_uri); - g_free (text_uri); - } + *corba_sidebar_control = CORBA_Object_duplicate (BONOBO_OBJREF (sidebar_control), ev); + *corba_view_control = CORBA_Object_duplicate (BONOBO_OBJREF (view_control), ev); +} - gnome_vfs_close (hin); - gnome_vfs_close (hout); - gnome_vfs_uri_unref (src_uri); - gnome_vfs_uri_unref (dest_uri); - g_free (buffer); - return GNOME_Evolution_ShellComponentListener_OK; -} +/* GObject methods. */ static void -xfer_folder (EvolutionShellComponent *shell_component, - const char *source_physical_uri, - const char *destination_physical_uri, - const char *type, - gboolean remove_source, - const GNOME_Evolution_ShellComponentListener listener, - void *closure) +impl_dispose (GObject *object) { - CORBA_Environment ev; - - GnomeVFSURI *src_uri; - GnomeVFSURI *dest_uri; - GnomeVFSResult result; - GNOME_Evolution_ShellComponentListener_Result e_result; - - CORBA_exception_init (&ev); - - if (!IS_CONTACT_TYPE (type)) { - GNOME_Evolution_ShellComponentListener_notifyResult (listener, - GNOME_Evolution_ShellComponentListener_UNSUPPORTED_TYPE, - &ev); - CORBA_exception_free(&ev); - return; - } - - if (!strncmp (source_physical_uri, "ldap://", 7) - || !strncmp (destination_physical_uri, "ldap://", 7)) { - GNOME_Evolution_ShellComponentListener_notifyResult (listener, - GNOME_Evolution_ShellComponentListener_UNSUPPORTED_OPERATION, - &ev); - CORBA_exception_free(&ev); - return; - } - - if (strncmp (source_physical_uri, "file://", 7) - || strncmp (destination_physical_uri, "file://", 7)) { - GNOME_Evolution_ShellComponentListener_notifyResult (listener, - GNOME_Evolution_ShellComponentListener_INVALID_URI, - &ev); - CORBA_exception_free(&ev); - return; - } + AddressbookComponentPrivate *priv = ADDRESSBOOK_COMPONENT (object)->priv; - /* check URIs */ - src_uri = gnome_vfs_uri_new (source_physical_uri); - dest_uri = gnome_vfs_uri_new (destination_physical_uri); - if (!src_uri || ! dest_uri) { - GNOME_Evolution_ShellComponentListener_notifyResult ( - listener, - GNOME_Evolution_ShellComponentListener_INVALID_URI, - &ev); - gnome_vfs_uri_unref (src_uri); - gnome_vfs_uri_unref (dest_uri); - CORBA_exception_free (&ev); - return; + if (priv->source_list != NULL) { + g_object_unref (priv->source_list); + priv->source_list = NULL; } - e_result = xfer_file (src_uri, dest_uri, "addressbook.db", remove_source); - - if ((e_result == GNOME_Evolution_ShellComponentListener_OK) && remove_source) { - char *summary_uri; - - summary_uri = g_strconcat (source_physical_uri, "/addressbook.db.summary", NULL); - result = gnome_vfs_unlink (summary_uri); - if (result != GNOME_VFS_OK && result != GNOME_VFS_ERROR_NOT_FOUND) - e_result = GNOME_Evolution_ShellComponentListener_PERMISSION_DENIED; - g_free (summary_uri); + if (priv->gconf_client != NULL) { + g_object_unref (priv->gconf_client); + priv->gconf_client = NULL; } - GNOME_Evolution_ShellComponentListener_notifyResult (listener, e_result, &ev); - - gnome_vfs_uri_unref (src_uri); - gnome_vfs_uri_unref (dest_uri); - - CORBA_exception_free (&ev); -} - -static char* -get_dnd_selection (EvolutionShellComponent *shell_component, - const char *physical_uri, - int type, - int *format_return, - const char **selection_return, - int *selection_length_return, - void *closure) -{ - /* g_print ("should get dnd selection for %s\n", physical_uri); */ - return NULL; + (* G_OBJECT_CLASS (parent_class)->dispose) (object); } -static int owner_count = 0; - static void -owner_set_cb (EvolutionShellComponent *shell_component, - EvolutionShellClient *shell_client, - const char *evolution_homedir, - gpointer user_data) +impl_finalize (GObject *object) { - owner_count ++; + AddressbookComponentPrivate *priv = ADDRESSBOOK_COMPONENT (object)->priv; - if (global_shell_client == NULL) - global_shell_client = shell_client; + g_free (priv); - addressbook_storage_setup (shell_component, evolution_homedir); + (* G_OBJECT_CLASS (parent_class)->finalize) (object); } -static void -owner_unset_cb (EvolutionShellComponent *shell_component, - GNOME_Evolution_Shell shell_interface, - gpointer user_data) -{ - owner_count --; - - if (owner_count == 0) - global_shell_client = NULL; - addressbook_storage_cleanup (); -} +/* Initialization. */ -/* FIXME We should perhaps take the time to figure out if the book is editable. */ static void -new_item_cb (EBook *book, gpointer closure) +addressbook_component_class_init (AddressbookComponentClass *class) { - gboolean is_list = GPOINTER_TO_INT (closure); - ECard *card; - - if (book == NULL) - return; - - card = e_card_new (""); - if (is_list) - e_addressbook_show_contact_list_editor (book, card, TRUE, TRUE); - else - e_addressbook_show_contact_editor (book, card, TRUE, TRUE); - g_object_unref (card); -} + POA_GNOME_Evolution_Component__epv *epv = &class->epv; + GObjectClass *object_class = G_OBJECT_CLASS (class); -static void -user_create_new_item_cb (EvolutionShellComponent *shell_component, - const char *id, - const char *parent_folder_physical_uri, - const char *parent_folder_type, - gpointer data) -{ - gboolean is_contact_list; - if (!strcmp (id, "contact")) { - is_contact_list = FALSE; - } else if (!strcmp (id, "contact_list")) { - is_contact_list = TRUE; - } else { - g_warning ("Don't know how to create item of type \"%s\"", id); - return; - } - if (IS_CONTACT_TYPE (parent_folder_type)) { - e_book_use_address_book_by_uri (parent_folder_physical_uri, - new_item_cb, GINT_TO_POINTER (is_contact_list)); - } else { - e_book_use_default_book (new_item_cb, GINT_TO_POINTER (is_contact_list)); - } -} + epv->createControls = impl_createControls; - -/* Destination side DnD */ + object_class->dispose = impl_dispose; + object_class->finalize = impl_finalize; -static CORBA_boolean -destination_folder_handle_motion (EvolutionShellComponentDndDestinationFolder *folder, - const char *physical_uri, - const char *folder_type, - const GNOME_Evolution_ShellComponentDnd_DestinationFolder_Context * destination_context, - GNOME_Evolution_ShellComponentDnd_Action * suggested_action_return, - gpointer user_data) -{ - *suggested_action_return = GNOME_Evolution_ShellComponentDnd_ACTION_MOVE; - return TRUE; + parent_class = g_type_class_peek_parent (class); } static void -dnd_drop_book_open_cb (EBook *book, EBookStatus status, GList *card_list) -{ - GList *l; - - for (l = card_list; l; l = l->next) { - ECard *card = l->data; - - e_card_merging_book_add_card (book, card, NULL /* XXX */, NULL); - } -} - -static CORBA_boolean -destination_folder_handle_drop (EvolutionShellComponentDndDestinationFolder *folder, - const char *physical_uri, - const char *folder_type, - const GNOME_Evolution_ShellComponentDnd_DestinationFolder_Context * destination_context, - const GNOME_Evolution_ShellComponentDnd_Action action, - const GNOME_Evolution_ShellComponentDnd_Data * data, - gpointer user_data) +addressbook_component_init (AddressbookComponent *component) { - EBook *book; - GList *card_list; - char *expanded_uri; - - if (action == GNOME_Evolution_ShellComponentDnd_ACTION_LINK) - return FALSE; /* we can't create links in our addressbook format */ - - /* g_print ("in destination_folder_handle_drop (%s)\n", physical_uri); */ - - card_list = e_card_load_cards_from_string_with_default_charset (data->bytes._buffer, "ISO-8859-1"); - - expanded_uri = e_book_expand_uri (physical_uri); + AddressbookComponentPrivate *priv; - book = e_book_new (); - addressbook_load_uri (book, expanded_uri, - (EBookCallback)dnd_drop_book_open_cb, card_list); + priv = g_new0 (AddressbookComponentPrivate, 1); - g_free (expanded_uri); + /* EPFIXME: Should use a custom one instead? Also we should add + addressbook_component_peek_gconf_client(). */ + priv->gconf_client = gconf_client_get_default (); - return TRUE; -} - - -/* Quitting. */ + priv->source_list = e_source_list_new_for_gconf (priv->gconf_client, + "/apps/evolution/addressbook/sources"); -static gboolean -request_quit (EvolutionShellComponent *shell_component, - void *data) -{ - if (! e_contact_editor_request_close_all () - || ! e_contact_list_editor_request_close_all ()) - return FALSE; - else - return TRUE; + component->priv = priv; } - -/* The factory function. */ - -static void -add_creatable_item (EvolutionShellComponent *shell_component, - const char *id, - const char *description, - const char *menu_description, - const char *tooltip, - char menu_shortcut, - const char *icon_name) -{ - char *icon_path; - GdkPixbuf *icon; - - if (icon_name == NULL) { - icon_path = NULL; - icon = NULL; - } else { - icon_path = g_build_filename (EVOLUTION_IMAGESDIR, icon_name, NULL); - icon = gdk_pixbuf_new_from_file (icon_path, NULL); - } - - evolution_shell_component_add_user_creatable_item (shell_component, - id, - description, - menu_description, - tooltip, - "contacts", - menu_shortcut, - icon); - - if (icon != NULL) - gdk_pixbuf_unref (icon); - g_free (icon_path); -} +/* Public API. */ -static BonoboObject * -create_component (void) +AddressbookComponent * +addressbook_component_peek (void) { - EvolutionShellComponent *shell_component; - EvolutionShellComponentDndDestinationFolder *destination_interface; - - shell_component = evolution_shell_component_new (folder_types, NULL, - create_view, create_folder, - remove_folder, xfer_folder, - NULL, NULL, - get_dnd_selection, - request_quit, - NULL); - - destination_interface = evolution_shell_component_dnd_destination_folder_new (destination_folder_handle_motion, - destination_folder_handle_drop, - shell_component); - - bonobo_object_add_interface (BONOBO_OBJECT (shell_component), - BONOBO_OBJECT (destination_interface)); - - add_creatable_item (shell_component, "contact", - _("New Contact"), _("_Contact"), - _("Create a new contact"), 'c', - "evolution-contacts-mini.png"); - add_creatable_item (shell_component, "contact_list", - _("New Contact List"), _("Contact _List"), - _("Create a new contact list"), 'l', - "contact-list-16.png"); - - g_signal_connect (shell_component, "owner_set", - G_CALLBACK (owner_set_cb), NULL); - g_signal_connect (shell_component, "owner_unset", - G_CALLBACK (owner_unset_cb), NULL); - g_signal_connect (shell_component, "user_create_new_item", - G_CALLBACK (user_create_new_item_cb), NULL); - - return BONOBO_OBJECT (shell_component); -} + static AddressbookComponent *component = NULL; -static void -ensure_completion_uris_exist() -{ - /* Initialize the completion uris if they aren't set yet. The - default set is just the local Contacts folder. */ - EConfigListener *db; - char *val; - - db = e_book_get_config_database (); - - val = e_config_listener_get_string (db, "/apps/evolution/addressbook/completion/uris"); - - if (val && !*val) { - g_free (val); - val = NULL; - } - - if (!val) { - EFolderListItem f[2]; - char *dirname, *uri; - /* in the case where the user is running for the first - time, populate the list with the local contact - folder */ - dirname = g_build_filename (g_get_home_dir (), "evolution/local/Contacts", NULL); - uri = g_strdup_printf ("file://%s", dirname); - - f[0].uri = "evolution:/local/Contacts"; - f[0].physical_uri = uri; - f[0].display_name = _("Contacts"); - - memset (&f[1], 0, sizeof (f[1])); - - val = e_folder_list_create_xml (f); - - g_free (dirname); - g_free (uri); - e_config_listener_set_string (db, "/apps/evolution/addressbook/completion/uris", val); - } + if (component == NULL) + component = g_object_new (addressbook_component_get_type (), NULL); - g_free (val); + return component; } - -/* FIXME this is wrong. */ -BonoboObject * -addressbook_component_init (void) -{ - ensure_completion_uris_exist (); - return create_component (); -} +BONOBO_TYPE_FUNC_FULL (AddressbookComponent, GNOME_Evolution_Component, PARENT_TYPE, addressbook_component) diff --git a/addressbook/gui/component/addressbook-component.h b/addressbook/gui/component/addressbook-component.h index 4c6f0cdd8b..bf72a431d8 100644 --- a/addressbook/gui/component/addressbook-component.h +++ b/addressbook/gui/component/addressbook-component.h @@ -1,7 +1,7 @@ /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ /* addressbook-component.h * - * Copyright (C) 2000 Ximian, Inc. + * Copyright (C) 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 @@ -17,16 +17,43 @@ * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. * - * Author: Ettore Perazzoli + * Author: Ettore Perazzoli <ettore@ximian.com> */ -#ifndef _ADDRESSBOOK_COMPONENT_H -#define _ADDRESSBOOK_COMPONENT_H +#ifndef _ADDRESSBOOK_COMPONENT_H_ +#define _ADDRESSBOOK_COMPONENT_H_ -#include "evolution-shell-component.h" -#include "evolution-storage.h" +#include <bonobo/bonobo-object.h> -BonoboObject *addressbook_component_init (void); -EvolutionShellClient *addressbook_component_get_shell_client (void); +#include "Evolution.h" -#endif /* _ADDRESSBOOK_COMPONENT_H */ +#define ADDRESSBOOK_TYPE_COMPONENT (addressbook_component_get_type ()) +#define ADDRESSBOOK_COMPONENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ADDRESSBOOK_TYPE_COMPONENT, AddressbookComponent)) +#define ADDRESSBOOK_COMPONENT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ADDRESSBOOK_TYPE_COMPONENT, AddressbookComponentClass)) +#define ADDRESSBOOK_IS_COMPONENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ADDRESSBOOK_TYPE_COMPONENT)) +#define ADDRESSBOOK_IS_COMPONENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), ADDRESSBOOK_TYPE_COMPONENT)) + + +typedef struct _AddressbookComponent AddressbookComponent; +typedef struct _AddressbookComponentPrivate AddressbookComponentPrivate; +typedef struct _AddressbookComponentClass AddressbookComponentClass; + +struct _AddressbookComponent { + BonoboObject parent; + + AddressbookComponentPrivate *priv; +}; + +struct _AddressbookComponentClass { + BonoboObjectClass parent_class; + + POA_GNOME_Evolution_Component__epv epv; +}; + + +GType addressbook_component_get_type (void); + +AddressbookComponent *addressbook_component_peek (void); + + +#endif /* _ADDRESSBOOK_COMPONENT_H_ */ diff --git a/addressbook/gui/component/addressbook-config.c b/addressbook/gui/component/addressbook-config.c index e2855ac7f4..c5fc9c127a 100644 --- a/addressbook/gui/component/addressbook-config.c +++ b/addressbook/gui/component/addressbook-config.c @@ -107,7 +107,6 @@ struct _AddressbookDialog { GtkWidget *page; GladeXML *gui; - GNOME_Evolution_Shell shell; GtkWidget *sourcesTable; GtkTreeModel *sourcesModel; @@ -1555,7 +1554,7 @@ sources_table_row_activated (GtkTreeView *tree_view, GtkTreePath *path, static AddressbookDialog * -ldap_dialog_new (GNOME_Evolution_Shell shell) +ldap_dialog_new (void) { AddressbookDialog *dialog; GList *l; @@ -1564,7 +1563,6 @@ ldap_dialog_new (GNOME_Evolution_Shell shell) dialog = g_new0 (AddressbookDialog, 1); dialog->gui = glade_xml_new (EVOLUTION_GLADEDIR "/" GLADE_FILE_NAME, NULL, NULL); - dialog->shell = shell; scrolled = glade_xml_get_widget (dialog->gui, "sourcesTable"); dialog->sourcesTable = g_object_get_data (G_OBJECT (scrolled), "table"); @@ -1657,7 +1655,7 @@ addressbook_dialog_create_sources_table (char *name, char *string1, char *string #endif /* HAVE_LDAP */ static EvolutionConfigControl * -ldap_config_control_new (GNOME_Evolution_Shell shell) +ldap_config_control_new (void) { GtkWidget *control_widget; EvolutionConfigControl *control; @@ -1665,7 +1663,7 @@ ldap_config_control_new (GNOME_Evolution_Shell shell) #ifdef HAVE_LDAP AddressbookDialog *dialog; - dialog = ldap_dialog_new (shell); + dialog = ldap_dialog_new (); control_widget = dialog->page; @@ -1697,13 +1695,7 @@ ldap_config_control_new (GNOME_Evolution_Shell shell) EvolutionConfigControl * addressbook_config_control_new (void) { - GNOME_Evolution_Shell shell; - - shell = evolution_shell_client_corba_objref (addressbook_component_get_shell_client ()); - if (! shell) - return NULL; - - return ldap_config_control_new (shell); + return ldap_config_control_new (); } void diff --git a/addressbook/gui/component/addressbook.c b/addressbook/gui/component/addressbook.c index b21c70a83d..32c5ab1288 100644 --- a/addressbook/gui/component/addressbook.c +++ b/addressbook/gui/component/addressbook.c @@ -24,7 +24,6 @@ #include <string.h> #include <glib.h> -#include <gtk/gtkframe.h> #include <gtk/gtkvbox.h> #include <gtk/gtkwidget.h> #include <gtk/gtkmessagedialog.h> @@ -41,23 +40,20 @@ #include "e-util/e-categories-master-list-wombat.h" #include "e-util/e-sexp.h" #include "e-util/e-passwords.h" -#include "select-names/e-select-names.h" -#include "select-names/e-select-names-manager.h" #include "evolution-shell-component-utils.h" #include "evolution-activity-client.h" #include "e-contact-editor.h" -#include "e-contact-save-as.h" #include "addressbook-config.h" #include "addressbook.h" #include "addressbook-component.h" #include "addressbook/gui/search/e-addressbook-search-dialog.h" #include "addressbook/gui/widgets/e-addressbook-view.h" -#include "addressbook/gui/widgets/e-addressbook-util.h" +#include "addressbook/gui/widgets/eab-gui-util.h" #include "addressbook/printing/e-contact-print.h" +#include "addressbook/util/eab-book-util.h" -#include <ebook/e-book.h> -#include <ebook/e-book-util.h> +#include <ebook/e-book-async.h> #include <widgets/misc/e-search-bar.h> #include <widgets/misc/e-filter-bar.h> @@ -73,7 +69,7 @@ static GdkPixbuf *progress_icon[2] = { NULL, NULL }; typedef struct { gint refs; - EAddressbookView *view; + EABView *view; ESearchBar *search; gint ecml_changed_id; GtkWidget *vbox; @@ -100,7 +96,7 @@ save_contact_cb (BonoboUIComponent *uih, void *user_data, const char *path) { AddressbookView *view = (AddressbookView *) user_data; if (view->view) - e_addressbook_view_save_as(view->view); + eab_view_save_as(view->view); } static void @@ -108,7 +104,7 @@ view_contact_cb (BonoboUIComponent *uih, void *user_data, const char *path) { AddressbookView *view = (AddressbookView *) user_data; if (view->view) - e_addressbook_view_view(view->view); + eab_view_view(view->view); } static void @@ -117,7 +113,7 @@ search_cb (BonoboUIComponent *uih, void *user_data, const char *path) AddressbookView *view = (AddressbookView *) user_data; if (view->view) - gtk_widget_show(e_addressbook_search_dialog_new(view->view)); + gtk_widget_show(eab_search_dialog_new(view->view)); } static void @@ -125,7 +121,7 @@ delete_contact_cb (BonoboUIComponent *uih, void *user_data, const char *path) { AddressbookView *view = (AddressbookView *) user_data; if (view->view) { - e_addressbook_view_delete_selection(view->view); + eab_view_delete_selection(view->view); } } @@ -134,7 +130,7 @@ print_cb (BonoboUIComponent *uih, void *user_data, const char *path) { AddressbookView *view = (AddressbookView *) user_data; if (view->view) - e_addressbook_view_print(view->view); + eab_view_print(view->view); } static void @@ -142,7 +138,7 @@ print_preview_cb (BonoboUIComponent *uih, void *user_data, const char *path) { AddressbookView *view = (AddressbookView *) user_data; if (view->view) - e_addressbook_view_print_preview(view->view); + eab_view_print_preview(view->view); } static void @@ -150,7 +146,7 @@ stop_loading_cb (BonoboUIComponent *uih, void *user_data, const char *path) { AddressbookView *view = (AddressbookView *) user_data; if (view->view) - e_addressbook_view_stop(view->view); + eab_view_stop(view->view); } static void @@ -158,7 +154,7 @@ cut_contacts_cb (BonoboUIComponent *uih, void *user_data, const char *path) { AddressbookView *view = (AddressbookView *) user_data; if (view->view) - e_addressbook_view_cut(view->view); + eab_view_cut(view->view); } static void @@ -166,7 +162,7 @@ copy_contacts_cb (BonoboUIComponent *uih, void *user_data, const char *path) { AddressbookView *view = (AddressbookView *) user_data; if (view->view) - e_addressbook_view_copy(view->view); + eab_view_copy(view->view); } static void @@ -174,7 +170,7 @@ paste_contacts_cb (BonoboUIComponent *uih, void *user_data, const char *path) { AddressbookView *view = (AddressbookView *) user_data; if (view->view) - e_addressbook_view_paste(view->view); + eab_view_paste(view->view); } static void @@ -182,7 +178,7 @@ select_all_contacts_cb (BonoboUIComponent *uih, void *user_data, const char *pat { AddressbookView *view = (AddressbookView *) user_data; if (view->view) - e_addressbook_view_select_all (view->view); + eab_view_select_all (view->view); } static void @@ -190,7 +186,7 @@ send_contact_cb (BonoboUIComponent *uih, void *user_data, const char *path) { AddressbookView *view = (AddressbookView *) user_data; if (view->view) - e_addressbook_view_send (view->view); + eab_view_send (view->view); } static void @@ -198,7 +194,7 @@ send_contact_to_cb (BonoboUIComponent *uih, void *user_data, const char *path) { AddressbookView *view = (AddressbookView *) user_data; if (view->view) - e_addressbook_view_send_to (view->view); + eab_view_send_to (view->view); } static void @@ -206,7 +202,7 @@ copy_contact_to_cb (BonoboUIComponent *uih, void *user_data, const char *path) { AddressbookView *view = (AddressbookView *) user_data; if (view->view) - e_addressbook_view_copy_to_folder (view->view); + eab_view_copy_to_folder (view->view); } static void @@ -214,7 +210,7 @@ move_contact_to_cb (BonoboUIComponent *uih, void *user_data, const char *path) { AddressbookView *view = (AddressbookView *) user_data; if (view->view) - e_addressbook_view_move_to_folder (view->view); + eab_view_move_to_folder (view->view); } static void @@ -224,7 +220,7 @@ forget_passwords_cb (BonoboUIComponent *uih, void *user_data, const char *path) } static void -update_command_state (EAddressbookView *eav, AddressbookView *view) +update_command_state (EABView *eav, AddressbookView *view) { BonoboUIComponent *uic; @@ -239,78 +235,78 @@ update_command_state (EAddressbookView *eav, AddressbookView *view) bonobo_ui_component_set_prop (uic, "/commands/ContactsSaveAsVCard", "sensitive", - e_addressbook_view_can_save_as (view->view) ? "1" : "0", NULL); + eab_view_can_save_as (view->view) ? "1" : "0", NULL); bonobo_ui_component_set_prop (uic, "/commands/ContactsView", "sensitive", - e_addressbook_view_can_view (view->view) ? "1" : "0", NULL); + eab_view_can_view (view->view) ? "1" : "0", NULL); /* Print Contact */ bonobo_ui_component_set_prop (uic, "/commands/ContactsPrint", "sensitive", - e_addressbook_view_can_print (view->view) ? "1" : "0", NULL); + eab_view_can_print (view->view) ? "1" : "0", NULL); /* Print Contact */ bonobo_ui_component_set_prop (uic, "/commands/ContactsPrintPreview", "sensitive", - e_addressbook_view_can_print (view->view) ? "1" : "0", NULL); + eab_view_can_print (view->view) ? "1" : "0", NULL); /* Delete Contact */ bonobo_ui_component_set_prop (uic, "/commands/ContactDelete", "sensitive", - e_addressbook_view_can_delete (view->view) ? "1" : "0", NULL); + eab_view_can_delete (view->view) ? "1" : "0", NULL); bonobo_ui_component_set_prop (uic, "/commands/ContactsCut", "sensitive", - e_addressbook_view_can_cut (view->view) ? "1" : "0", NULL); + eab_view_can_cut (view->view) ? "1" : "0", NULL); bonobo_ui_component_set_prop (uic, "/commands/ContactsCopy", "sensitive", - e_addressbook_view_can_copy (view->view) ? "1" : "0", NULL); + eab_view_can_copy (view->view) ? "1" : "0", NULL); bonobo_ui_component_set_prop (uic, "/commands/ContactsPaste", "sensitive", - e_addressbook_view_can_paste (view->view) ? "1" : "0", NULL); + eab_view_can_paste (view->view) ? "1" : "0", NULL); bonobo_ui_component_set_prop (uic, "/commands/ContactsSelectAll", "sensitive", - e_addressbook_view_can_select_all (view->view) ? "1" : "0", NULL); + eab_view_can_select_all (view->view) ? "1" : "0", NULL); bonobo_ui_component_set_prop (uic, "/commands/ContactsSendContactToOther", "sensitive", - e_addressbook_view_can_send (view->view) ? "1" : "0", NULL); + eab_view_can_send (view->view) ? "1" : "0", NULL); bonobo_ui_component_set_prop (uic, "/commands/ContactsSendMessageToContact", "sensitive", - e_addressbook_view_can_send_to (view->view) ? "1" : "0", NULL); + eab_view_can_send_to (view->view) ? "1" : "0", NULL); bonobo_ui_component_set_prop (uic, "/commands/ContactsMoveToFolder", "sensitive", - e_addressbook_view_can_move_to_folder (view->view) ? "1" : "0", NULL); + eab_view_can_move_to_folder (view->view) ? "1" : "0", NULL); bonobo_ui_component_set_prop (uic, "/commands/ContactsCopyToFolder", "sensitive", - e_addressbook_view_can_copy_to_folder (view->view) ? "1" : "0", NULL); + eab_view_can_copy_to_folder (view->view) ? "1" : "0", NULL); /* Stop */ bonobo_ui_component_set_prop (uic, "/commands/ContactStop", "sensitive", - e_addressbook_view_can_stop (view->view) ? "1" : "0", NULL); + eab_view_can_stop (view->view) ? "1" : "0", NULL); } addressbook_view_unref (view); } static void -change_view_type (AddressbookView *view, EAddressbookViewType view_type) +change_view_type (AddressbookView *view, EABViewType view_type) { g_object_set (view->view, "type", view_type, NULL); } @@ -379,7 +375,7 @@ control_activate (BonoboControl *control, EVOLUTION_UIDIR "/evolution-addressbook.xml", "evolution-addressbook", NULL); - e_addressbook_view_setup_menus (view->view, uic); + eab_view_setup_menus (view->view, uic); e_pixmaps_update (uic, pixmaps); @@ -401,25 +397,21 @@ control_activate_cb (BonoboControl *control, if (activate) { control_activate (control, uic, view); if (activate && view->view && view->view->model) - e_addressbook_model_force_folder_bar_message (view->view->model); + eab_model_force_folder_bar_message (view->view->model); /* if the book failed to load, we kick off another load here */ if (view->failed_to_load && view->uri) { EBook *book; - char *uri_data; book = e_book_new (); - uri_data = e_book_expand_uri (view->uri); - addressbook_load_uri (book, uri_data, book_open_cb, view); - - g_free(uri_data); + addressbook_load_uri (book, view->uri, book_open_cb, view); } } else { bonobo_ui_component_unset_container (uic, NULL); - e_addressbook_view_discard_menus (view->view); + eab_view_discard_menus (view->view); } } @@ -482,7 +474,7 @@ book_open_cb (EBook *book, EBookStatus status, gpointer closure) { AddressbookView *view = closure; - if (status == E_BOOK_STATUS_SUCCESS) { + if (status == E_BOOK_ERROR_OK) { view->failed_to_load = FALSE; g_object_set(view->view, "book", book, @@ -596,8 +588,8 @@ load_uri_auth_cb (EBook *book, EBookStatus status, gpointer closure) { LoadUriData *data = closure; - if (status != E_BOOK_STATUS_SUCCESS) { - if (status == E_BOOK_STATUS_CANCELLED) { + if (status != E_BOOK_ERROR_OK) { + if (status == E_BOOK_ERROR_CANCELLED) { /* the user clicked cancel in the password dialog */ GtkWidget *dialog; dialog = gtk_message_dialog_new (NULL, @@ -607,7 +599,7 @@ load_uri_auth_cb (EBook *book, EBookStatus status, gpointer closure) _("Accessing LDAP Server anonymously")); g_signal_connect (dialog, "response", G_CALLBACK(gtk_widget_destroy), NULL); gtk_widget_show (dialog); - data->cb (book, E_BOOK_STATUS_SUCCESS, data->closure); + data->cb (book, E_BOOK_ERROR_OK, data->closure); g_free (data->clean_uri); g_free (data); return; @@ -682,15 +674,15 @@ addressbook_authenticate (EBook *book, gboolean previous_failure, AddressbookSou user = source->email_addr; if (!user) user = ""; - e_book_authenticate_user (book, user, password ? password : pass_dup, - addressbook_storage_auth_type_to_string (source->auth), - cb, closure); + e_book_async_authenticate_user (book, user, password ? password : pass_dup, + addressbook_storage_auth_type_to_string (source->auth), + cb, closure); g_free (pass_dup); return; } else { /* they hit cancel */ - cb (book, E_BOOK_STATUS_CANCELLED, closure); + cb (book, E_BOOK_ERROR_CANCELLED, closure); } } @@ -699,7 +691,7 @@ load_uri_cb (EBook *book, EBookStatus status, gpointer closure) { LoadUriData *load_uri_data = closure; - if (status == E_BOOK_STATUS_SUCCESS && book != NULL) { + if (status == E_BOOK_ERROR_OK && book != NULL) { /* check if the addressbook needs authentication */ @@ -728,18 +720,18 @@ addressbook_load_uri (EBook *book, const char *uri, load_uri_data->cb = cb; load_uri_data->closure = closure; - e_book_load_uri (book, uri, load_uri_cb, load_uri_data); + e_book_async_load_uri (book, uri, load_uri_cb, load_uri_data); } void -addressbook_load_default_book (EBook *book, EBookCallback cb, gpointer closure) +addressbook_load_default_book (EBookCallback cb, gpointer closure) { LoadUriData *load_uri_data = g_new (LoadUriData, 1); load_uri_data->cb = cb; load_uri_data->closure = closure; - e_book_load_default_book (book, load_uri_cb, load_uri_data); + e_book_async_get_default_addressbook (load_uri_cb, load_uri_data); } static void @@ -751,14 +743,12 @@ set_prop (BonoboPropertyBag *bag, { AddressbookView *view = user_data; - char *uri_data; - switch (arg_id) { case PROPERTY_FOLDER_URI_IDX: if (view->uri) { /* we've already had a uri set on this view, so unload it */ - e_book_unload_uri (view->book); + e_book_async_unload_uri (view->book); g_free (view->uri); } else { view->book = e_book_new (); @@ -768,11 +758,7 @@ set_prop (BonoboPropertyBag *bag, view->uri = g_strdup(BONOBO_ARG_GET_STRING (arg)); - uri_data = e_book_expand_uri (view->uri); - - addressbook_load_uri (view->book, uri_data, book_open_cb, view); - - g_free(uri_data); + addressbook_load_uri (view->book, view->uri, book_open_cb, view); break; @@ -800,19 +786,6 @@ static ESearchBarItem addressbook_search_option_items[] = { }; static void -alphabet_state_changed (EAddressbookView *eav, gunichar letter, AddressbookView *view) -{ - view->ignore_search_changes = TRUE; - if (letter == 0) { - e_search_bar_set_item_id (view->search, ESB_FULL_NAME); - e_search_bar_set_text (view->search, ""); - } else { - e_search_bar_set_item_id (view->search, ESB_FULL_NAME); - } - view->ignore_search_changes = FALSE; -} - -static void addressbook_search_activated (ESearchBar *esb, AddressbookView *view) { ECategoriesMasterList *master_list; @@ -830,7 +803,7 @@ addressbook_search_activated (ESearchBar *esb, AddressbookView *view) NULL); if (search_type == ESB_ADVANCED) { - gtk_widget_show(e_addressbook_search_dialog_new(view->view)); + gtk_widget_show(eab_search_dialog_new(view->view)); } else { if ((search_word && strlen (search_word)) || search_type == ESB_CATEGORY) { @@ -890,7 +863,7 @@ addressbook_query_changed (ESearchBar *esb, AddressbookView *view) NULL); if (search_type == ESB_ADVANCED) { - gtk_widget_show(e_addressbook_search_dialog_new(view->view)); + gtk_widget_show(eab_search_dialog_new(view->view)); } } @@ -916,7 +889,7 @@ retrieve_shell_view_interface_from_control (BonoboControl *control) } static void -set_status_message (EAddressbookView *eav, const char *message, AddressbookView *view) +set_status_message (EABView *eav, const char *message, AddressbookView *view) { if (!message || !*message) { @@ -925,6 +898,7 @@ set_status_message (EAddressbookView *eav, const char *message, AddressbookView view->activity = NULL; } } +#if 0 /* EPFIXME */ else if (!view->activity) { int display; char *clientid = g_strdup_printf ("%p", view); @@ -937,6 +911,7 @@ set_status_message (EAddressbookView *eav, const char *message, AddressbookView g_free (clientid); } +#endif else { evolution_activity_client_update (view->activity, message, -1.0); } @@ -944,12 +919,12 @@ set_status_message (EAddressbookView *eav, const char *message, AddressbookView } static void -search_result (EAddressbookView *eav, EBookViewStatus status, AddressbookView *view) +search_result (EABView *eav, EBookViewStatus status, AddressbookView *view) { char *str = NULL; switch (status) { - case E_BOOK_VIEW_STATUS_SUCCESS: + case E_BOOK_VIEW_STATUS_OK: return; case E_BOOK_VIEW_STATUS_SIZE_LIMIT_EXCEEDED: str = _("More cards matched this query than either the server is \n" @@ -963,14 +938,13 @@ search_result (EAddressbookView *eav, EBookViewStatus status, AddressbookView *v "more specific or raise the time limit in the directory server\n" "preferences for this addressbook."); break; - case E_BOOK_VIEW_STATUS_INVALID_QUERY: + case E_BOOK_VIEW_ERROR_INVALID_QUERY: str = _("The backend for this addressbook was unable to parse this query."); break; - case E_BOOK_VIEW_STATUS_QUERY_REFUSED: + case E_BOOK_VIEW_ERROR_QUERY_REFUSED: str = _("The backend for this addressbook refused to perform this query."); break; - case E_BOOK_VIEW_STATUS_OTHER_ERROR: - case E_BOOK_VIEW_STATUS_UNKNOWN: + case E_BOOK_VIEW_ERROR_OTHER_ERROR: str = _("This query did not complete successfully."); break; } @@ -988,7 +962,7 @@ search_result (EAddressbookView *eav, EBookViewStatus status, AddressbookView *v } static void -set_folder_bar_label (EAddressbookView *eav, const char *message, AddressbookView *view) +set_folder_bar_label (EABView *eav, const char *message, AddressbookView *view) { CORBA_Environment ev; GNOME_Evolution_ShellView shell_view_interface; @@ -1023,18 +997,6 @@ set_folder_bar_label (EAddressbookView *eav, const char *message, AddressbookVie bonobo_object_release_unref (shell_view_interface, NULL); } -/* Our global singleton config database */ -static Bonobo_ConfigDatabase config_db = NULL; - -Bonobo_ConfigDatabase -addressbook_config_database (CORBA_Environment *ev) -{ - if (config_db == NULL) - config_db = bonobo_get_object ("wombat:", "Bonobo/ConfigDatabase", ev); - - return config_db; -} - static int compare_subitems (const void *a, const void *b) { @@ -1098,10 +1060,6 @@ BonoboControl * addressbook_new_control (void) { AddressbookView *view; - GtkWidget *frame; - - frame = gtk_frame_new (NULL); - gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN); view = g_new0 (AddressbookView, 1); view->refs = 1; @@ -1125,15 +1083,13 @@ addressbook_new_control (void) g_signal_connect (view->search, "search_activated", G_CALLBACK (addressbook_search_activated), view); - view->view = E_ADDRESSBOOK_VIEW(e_addressbook_view_new()); - gtk_container_add (GTK_CONTAINER (frame), GTK_WIDGET (view->view)); - gtk_box_pack_start (GTK_BOX (view->vbox), frame, + view->view = EAB_VIEW(eab_view_new()); + gtk_box_pack_start (GTK_BOX (view->vbox), GTK_WIDGET (view->view), TRUE, TRUE, 0); /* create the initial view */ - change_view_type (view, E_ADDRESSBOOK_VIEW_MINICARD); + change_view_type (view, EAB_VIEW_TABLE); - gtk_widget_show (frame); gtk_widget_show (view->vbox); gtk_widget_show (GTK_WIDGET(view->view)); gtk_widget_show (GTK_WIDGET(view->search)); @@ -1142,36 +1098,24 @@ addressbook_new_control (void) bonobo_property_bag_add (view->properties, PROPERTY_FOLDER_URI, PROPERTY_FOLDER_URI_IDX, - BONOBO_ARG_STRING, NULL, _("The URI that the Folder Browser will display"), 0); + BONOBO_ARG_STRING, NULL, + _("URI of the contacts that the control will display"), 0); bonobo_control_set_properties (view->control, bonobo_object_corba_objref (BONOBO_OBJECT (view->properties)), NULL); - g_signal_connect (view->view, - "status_message", - G_CALLBACK(set_status_message), - view); - - g_signal_connect (view->view, - "search_result", - G_CALLBACK(search_result), - view); - - g_signal_connect (view->view, - "folder_bar_message", - G_CALLBACK(set_folder_bar_label), - view); - - g_signal_connect (view->view, - "command_state_change", - G_CALLBACK(update_command_state), - view); - - g_signal_connect (view->view, - "alphabet_state_change", - G_CALLBACK(alphabet_state_changed), - view); + g_signal_connect (view->view, "status_message", + G_CALLBACK(set_status_message), view); + + g_signal_connect (view->view, "search_result", + G_CALLBACK(search_result), view); + + g_signal_connect (view->view, "folder_bar_message", + G_CALLBACK(set_folder_bar_label), view); + + g_signal_connect (view->view, "command_state_change", + G_CALLBACK(update_command_state), view); view->uri = NULL; diff --git a/addressbook/gui/component/addressbook.h b/addressbook/gui/component/addressbook.h index 3d4bba5187..573adbf38d 100644 --- a/addressbook/gui/component/addressbook.h +++ b/addressbook/gui/component/addressbook.h @@ -5,12 +5,12 @@ #include <e-util/e-config-listener.h> #include <bonobo/bonobo-object.h> #include <bonobo/bonobo-moniker-util.h> -#include <ebook/e-book.h> +#include <ebook/e-book-async.h> /* use this instead of e_book_load_uri everywhere where you want the authentication to be handled for you. */ void addressbook_load_uri (EBook *book, const char *uri, EBookCallback cb, gpointer closure); -void addressbook_load_default_book (EBook *book, EBookCallback open_response, gpointer closure); +void addressbook_load_default_book (EBookCallback open_response, gpointer closure); BonoboControl *addressbook_new_control (void); diff --git a/addressbook/gui/component/component-factory.c b/addressbook/gui/component/component-factory.c index 9d5e946dc0..512ab72f2a 100644 --- a/addressbook/gui/component/component-factory.c +++ b/addressbook/gui/component/component-factory.c @@ -26,20 +26,18 @@ #include "addressbook.h" #include "addressbook-component.h" #include "addressbook-config.h" -#include "e-address-popup.h" -#include "e-address-widget.h" -#include "e-minicard-control.h" +#include "eab-popup-control.h" +#include "eab-vcard-control.h" #include "select-names/e-select-names-bonobo.h" #include <bonobo/bonobo-shlib-factory.h> -#define FACTORY_ID "OAFIID:GNOME_Evolution_Addressbook_Factory" +#define FACTORY_ID "OAFIID:GNOME_Evolution_Addressbook_Factory_2" -#define MINICARD_CONTROL_ID "OAFIID:GNOME_Evolution_Addressbook_MiniCard_Control" +#define VCARD_CONTROL_ID "OAFIID:GNOME_Evolution_Addressbook_VCard_Control" #define ADDRESSBOOK_CONTROL_ID "OAFIID:GNOME_Evolution_Addressbook_Control" -#define SHELL_COMPONENT_ID "OAFIID:GNOME_Evolution_Addressbook_ShellComponent" -#define ADDRESS_WIDGET_ID "OAFIID:GNOME_Evolution_Addressbook_AddressWidget" +#define COMPONENT_ID "OAFIID:GNOME_Evolution_Addressbook_Component" #define ADDRESS_POPUP_ID "OAFIID:GNOME_Evolution_Addressbook_AddressPopup" #define SELECT_NAMES_ID "OAFIID:GNOME_Evolution_Addressbook_SelectNames" #define LDAP_STORAGE_CONFIG_CONTROL_ID "OAFIID:GNOME_Evolution_LDAPStorage_ConfigControl" @@ -50,16 +48,19 @@ factory (BonoboGenericFactory *factory, const char *component_id, void *closure) { - if (strcmp (component_id, MINICARD_CONTROL_ID) == 0) - return BONOBO_OBJECT (e_minicard_control_new ()); + printf ("asked to activate component_id `%s'\n", component_id); + + if (strcmp (component_id, VCARD_CONTROL_ID) == 0) + return BONOBO_OBJECT (eab_vcard_control_new ()); if (strcmp (component_id, ADDRESSBOOK_CONTROL_ID) == 0) return BONOBO_OBJECT (addressbook_new_control ()); - if (strcmp (component_id, SHELL_COMPONENT_ID) == 0) - return addressbook_component_init (); - if (strcmp (component_id, ADDRESS_WIDGET_ID) == 0) - return BONOBO_OBJECT (e_address_widget_new_control ()); + if (strcmp (component_id, COMPONENT_ID) == 0) { + BonoboObject *object = BONOBO_OBJECT (addressbook_component_peek ()); + bonobo_object_ref (object); + return object; + } if (strcmp (component_id, ADDRESS_POPUP_ID) == 0) - return BONOBO_OBJECT (e_address_popup_new_control ()); + return BONOBO_OBJECT (eab_popup_control_new ()); if (strcmp (component_id, LDAP_STORAGE_CONFIG_CONTROL_ID) == 0) return BONOBO_OBJECT (addressbook_config_control_new ()); if (strcmp (component_id, SELECT_NAMES_ID) == 0) diff --git a/addressbook/gui/component/e-address-popup.h b/addressbook/gui/component/e-address-popup.h deleted file mode 100644 index b2519b0ee6..0000000000 --- a/addressbook/gui/component/e-address-popup.h +++ /dev/null @@ -1,88 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ - -/* - * e-address-popup.h - * - * Copyright (C) 2001 Ximian, Inc. - * - * Developed by Jon Trowbridge <trow@ximian.com> - */ - -/* - * This program is free software; you can redistribute it and/or - * modify it under the terms of 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 __E_ADDRESS_POPUP_H__ -#define __E_ADDRESS_POPUP_H__ - -#include <gtk/gtk.h> -#include <addressbook/backend/ebook/e-book.h> -#include <addressbook/backend/ebook/e-card.h> -#include <bonobo/bonobo-event-source.h> - -G_BEGIN_DECLS - -#define E_TYPE_ADDRESS_POPUP (e_address_popup_get_type ()) -#define E_ADDRESS_POPUP(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), E_TYPE_ADDRESS_POPUP, EAddressPopup)) -#define E_ADDRESS_POPUP_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), E_TYPE_ADDRESS_POPUP, EAddressPopupClass)) -#define E_IS_ADDRESS_POPUP(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), E_TYPE_ADDRESS_POPUP)) -#define E_IS_ADDRESS_POPUP_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), E_TYPE_ADDRESS_POPUP)) - -typedef struct _EAddressPopup EAddressPopup; -typedef struct _EAddressPopupClass EAddressPopupClass; - -struct _EAddressPopup { - GtkEventBox parent; - - gchar *name; - gchar *email; - - GtkWidget *name_widget; - GtkWidget *email_widget; - GtkWidget *query_msg; - - GtkWidget *main_vbox; - GtkWidget *generic_view; - GtkWidget *minicard_view; - - gboolean transitory; - - guint scheduled_refresh; - EBook *book; - guint query_tag; - gboolean multiple_matches; - ECard *card; - - BonoboEventSource *es; -}; - -struct _EAddressPopupClass { - GtkEventBoxClass parent_class; -}; - -GType e_address_popup_get_type (void); - -void e_address_popup_set_name (EAddressPopup *, const gchar *name); -void e_address_popup_set_email (EAddressPopup *, const gchar *email); - -void e_address_popup_construct (EAddressPopup *); -GtkWidget *e_address_popup_new (void); - -BonoboControl *e_address_popup_new_control (void); - -G_END_DECLS - -#endif /* __E_ADDRESS_POPUP_H__ */ - diff --git a/addressbook/gui/component/e-address-widget.c b/addressbook/gui/component/e-address-widget.c deleted file mode 100644 index 9ec1e6ebba..0000000000 --- a/addressbook/gui/component/e-address-widget.c +++ /dev/null @@ -1,568 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ - -/* - * e-address-widget.c - * - * Copyright (C) 2001 Ximian, Inc. - * - * Developed by Jon Trowbridge <trow@ximian.com> - */ - -/* - * This program is free software; you can redistribute it and/or - * modify it under the terms of 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 <ctype.h> -#include <string.h> -#include <gtk/gtklabel.h> -#include <libgnomeui/gnome-popup-menu.h> -#include <bonobo/bonobo-control.h> -#include <bonobo/bonobo-property-bag.h> -#include <bonobo/bonobo-generic-factory.h> -#include <addressbook/gui/contact-editor/e-contact-quick-add.h> -#include "e-address-widget.h" - -static void e_address_widget_class_init (EAddressWidgetClass *klass); -static void e_address_widget_init (EAddressWidget *obj); -static void e_address_widget_destroy (GtkObject *obj); - -static gint e_address_widget_button_press_handler (GtkWidget *w, GdkEventButton *ev); -static void e_address_widget_popup (EAddressWidget *, GdkEventButton *ev); -static void e_address_widget_schedule_query (EAddressWidget *); - -static GtkObjectClass *parent_class; - -static EBook *common_book = NULL; /* sort of lame */ - -static gboolean doing_queries = FALSE; - -static void -e_address_widget_class_init (EAddressWidgetClass *klass) -{ - GtkObjectClass *object_class = (GtkObjectClass *) klass; - GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); - - parent_class = g_type_class_peek_parent (klass); - - object_class->destroy = e_address_widget_destroy; - - widget_class->button_press_event = e_address_widget_button_press_handler; -} - -static void -e_address_widget_init (EAddressWidget *addr) -{ - -} - -static void -e_address_widget_destroy (GtkObject *obj) -{ - EAddressWidget *addr = E_ADDRESS_WIDGET (obj); - - g_free (addr->name); - addr->name = NULL; - - g_free (addr->email); - addr->email = NULL; - - if (addr->query_tag) { - e_book_simple_query_cancel (common_book, addr->query_tag); - addr->query_tag = 0; - } - - if (addr->query_idle_tag) { - g_source_remove (addr->query_idle_tag); - addr->query_idle_tag = 0; - } - - (* GTK_OBJECT_CLASS (parent_class)->destroy) (obj); -} - -static gint -e_address_widget_button_press_handler (GtkWidget *w, GdkEventButton *ev) -{ - EAddressWidget *addr = E_ADDRESS_WIDGET (w); - if (ev->button == 3 && ev->state == 0) { - e_address_widget_popup (addr, ev); - return TRUE; - } - - return FALSE; -} - -GType -e_address_widget_get_type (void) -{ - static GType aw_type = 0; - - if (!aw_type) { - static const GTypeInfo aw_info = { - sizeof (EAddressWidgetClass), - NULL, /* base_init */ - NULL, /* base_finalize */ - (GClassInitFunc) e_address_widget_class_init, - NULL, /* class_finalize */ - NULL, /* class_data */ - sizeof (EAddressWidget), - 0, /* n_preallocs */ - (GInstanceInitFunc) e_address_widget_init, - }; - - aw_type = g_type_register_static (gtk_event_box_get_type (), "EAddressWidget", &aw_info, 0); - } - - return aw_type; -} - -static void -gtk_widget_visible (GtkWidget *w, gboolean x) -{ - if (x) - gtk_widget_show (w); - else - gtk_widget_hide (w); -} - -static void -e_address_widget_refresh (EAddressWidget *addr) -{ - gchar *str; - gboolean have_name, have_email; - - g_return_if_fail (addr && E_IS_ADDRESS_WIDGET (addr)); - - have_name = addr->name && *addr->name; - have_email = addr->email && *addr->email && (addr->card == NULL || !addr->known_email); - - gtk_label_set_text (GTK_LABEL (addr->name_widget), have_name ? addr->name : ""); - gtk_widget_visible (addr->name_widget, have_name); - if (addr->card) { - gint i, N = strlen (addr->name); - gchar *pattern = g_malloc (N+1); - for (i=0; i<N; ++i) - pattern[i] = '_'; - pattern[i] = '\0'; - gtk_label_set_pattern (GTK_LABEL (addr->name_widget), pattern); - g_free (pattern); - } else { - gtk_label_set_pattern (GTK_LABEL (addr->name_widget), ""); - } - - if (have_email) { - str = g_strdup_printf (have_name ? "<%s>" : "%s", addr->email); - gtk_label_set_text (GTK_LABEL (addr->email_widget), str); - g_free (str); - } else { - gtk_label_set_text (GTK_LABEL (addr->email_widget), ""); - } - gtk_widget_visible (addr->email_widget, have_email); - - gtk_widget_visible (addr->spacer, have_name && have_email); - - /* Launch a query to find the appropriate card, if necessary. */ - if (addr->card == NULL) - e_address_widget_schedule_query (addr); -} - -void -e_address_widget_set_name (EAddressWidget *addr, const gchar *name) -{ - g_return_if_fail (addr && E_IS_ADDRESS_WIDGET (addr)); - - g_free (addr->name); - addr->name = g_strdup (name); - - e_address_widget_refresh (addr); -} - -void -e_address_widget_set_email (EAddressWidget *addr, const gchar *email) -{ - g_return_if_fail (addr && E_IS_ADDRESS_WIDGET (addr)); - - g_free (addr->email); - addr->email = g_strdup (email); - - e_address_widget_refresh (addr); -} - - -void -e_address_widget_set_text (EAddressWidget *addr, const gchar *text) -{ - g_return_if_fail (addr && E_IS_ADDRESS_WIDGET (addr)); - - e_address_widget_set_email (addr, text); /* CRAP */ -} - -void -e_address_widget_construct (EAddressWidget *addr) -{ - GtkWidget *box; - - g_return_if_fail (addr && E_IS_ADDRESS_WIDGET (addr)); - - box = gtk_hbox_new (FALSE, 2); - - addr->name_widget = gtk_label_new (""); - addr->spacer = gtk_label_new (" "); - addr->email_widget = gtk_label_new (""); - - gtk_box_pack_start (GTK_BOX (box), addr->name_widget, FALSE, FALSE, 0); - gtk_box_pack_start (GTK_BOX (box), addr->spacer, FALSE, FALSE, 0); - gtk_box_pack_start (GTK_BOX (box), addr->email_widget, FALSE, FALSE, 0); - - gtk_container_add (GTK_CONTAINER (addr), box); - - gtk_widget_show (box); - gtk_widget_show (addr->name_widget); - gtk_widget_show (addr->email_widget); -} - -GtkWidget * -e_address_widget_new (void) -{ - EAddressWidget *addr = g_object_new (E_TYPE_ADDRESS_WIDGET, NULL); - e_address_widget_construct (addr); - return GTK_WIDGET (addr); -} - -/* - * - * Cardification - * - */ - -static void -e_address_widget_cardify (EAddressWidget *addr, ECard *card, gboolean known_email) -{ - if (addr->card != card || addr->known_email != known_email) { - - if (addr->card != card) { - if (addr->card) - g_object_unref (addr->card); - addr->card = card; - g_object_ref (addr->card); - } - - addr->known_email = known_email; - - if (!(addr->name && *addr->name)) { - gchar *s = e_card_name_to_string (card->name); - e_address_widget_set_name (addr, s); - g_free (s); - } - - e_address_widget_refresh (addr); - } -} - -static void -query_results_cb (EBook *book, EBookSimpleQueryStatus status, const GList *cards, gpointer user_data) -{ - EAddressWidget *addr = user_data; - - if (g_list_length ((GList *) cards) == 1) { - ECard *card = E_CARD (cards->data); - e_address_widget_cardify (addr, card, TRUE); - } - - addr->query_tag = 0; -} - -static void -e_address_widget_do_query (EAddressWidget *addr) -{ - e_book_name_and_email_query (common_book, addr->name, addr->email, query_results_cb, addr); -} - -static void -book_ready_cb (EBook *book, EBookStatus status, gpointer user_data) -{ - EAddressWidget *addr = E_ADDRESS_WIDGET (user_data); - - if (common_book == NULL) { - common_book = book; - g_object_ref (common_book); - } else - g_object_unref (book); - - e_address_widget_do_query (addr); -} - -static gint -query_idle_fn (gpointer ptr) -{ - EAddressWidget *addr = E_ADDRESS_WIDGET (ptr); - - if (common_book) { - e_address_widget_do_query (addr); - } else { - e_book_load_default_book (e_book_new (), book_ready_cb, addr); - } - - addr->query_idle_tag = 0; - return FALSE; -} - -static void -e_address_widget_schedule_query (EAddressWidget *addr) -{ - if (addr->query_idle_tag || !doing_queries) - return; - addr->query_idle_tag = g_idle_add (query_idle_fn, addr); -} - -/* - * - * Popup Menu - * - */ - -#define ARBITRARY_UIINFO_LIMIT 64 - -static gint -popup_add_name_and_address (EAddressWidget *addr, GnomeUIInfo *uiinfo, gint i) -{ - gboolean flag = FALSE; - - if (addr->name && *addr->name) { - uiinfo[i].type = GNOME_APP_UI_ITEM; - uiinfo[i].label = addr->name; - ++i; - flag = TRUE; - } - - if (addr->email && *addr->email) { - uiinfo[i].type = GNOME_APP_UI_ITEM; - uiinfo[i].label = addr->email; - ++i; - flag = TRUE; - } - - if (flag) { - uiinfo[i].type = GNOME_APP_UI_SEPARATOR; - ++i; - } - - return i; -} - -static void -flip_queries_flag_cb (GtkWidget *w, gpointer user_data) -{ - doing_queries = !doing_queries; -} - -static gint -popup_add_query_change (EAddressWidget *addr, GnomeUIInfo *uiinfo, gint i) -{ - uiinfo[i].type = GNOME_APP_UI_SEPARATOR; - ++i; - - uiinfo[i].type = GNOME_APP_UI_ITEM; - uiinfo[i].label = doing_queries ? _("Disable Queries") : _("Enable Queries (Dangerous!)"); - uiinfo[i].moreinfo = flip_queries_flag_cb; - ++i; - - return i; -} - - -static GtkWidget * -popup_menu_card (EAddressWidget *addr) -{ - GnomeUIInfo uiinfo[ARBITRARY_UIINFO_LIMIT]; - GtkWidget *pop; - gint i=0; - ECard *card = E_CARD (addr->card); - - g_return_val_if_fail (card != NULL, NULL); - - memset (uiinfo, 0, sizeof (uiinfo)); - - i = popup_add_name_and_address (addr, uiinfo, i); - - uiinfo[i].type = GNOME_APP_UI_ITEM; - uiinfo[i].label = _("Edit Contact Info"); - ++i; - - i = popup_add_query_change (addr, uiinfo, i); - - uiinfo[i].type = GNOME_APP_UI_ENDOFINFO; - pop = gnome_popup_menu_new (uiinfo); - return pop; -} - -static void -post_quick_add_cb (ECard *card, gpointer user_data) -{ - e_address_widget_cardify (E_ADDRESS_WIDGET (user_data), card, TRUE); -} - -static void -add_contacts_cb (GtkWidget *w, gpointer user_data) -{ - EAddressWidget *addr = E_ADDRESS_WIDGET (user_data); - - e_contact_quick_add (addr->name, addr->email, post_quick_add_cb, addr); -} - -static GtkWidget * -popup_menu_nocard (EAddressWidget *addr) -{ - GnomeUIInfo uiinfo[ARBITRARY_UIINFO_LIMIT]; - GtkWidget *pop; - gint i=0; - - memset (uiinfo, 0, sizeof (uiinfo)); - - i = popup_add_name_and_address (addr, uiinfo, i); - - uiinfo[i].type = GNOME_APP_UI_ITEM; - uiinfo[i].label = _("Add to Contacts"); - uiinfo[i].moreinfo = add_contacts_cb; - ++i; - - i = popup_add_query_change (addr, uiinfo, i); - - uiinfo[i].type = GNOME_APP_UI_ENDOFINFO; - pop = gnome_popup_menu_new (uiinfo); - return pop; -} - -static void -e_address_widget_popup (EAddressWidget *addr, GdkEventButton *ev) -{ - GtkWidget *pop; - - g_return_if_fail (addr && E_IS_ADDRESS_WIDGET (addr)); - - pop = addr->card ? popup_menu_card (addr) : popup_menu_nocard (addr); - - if (pop) - gnome_popup_menu_do_popup (pop, NULL, NULL, ev, addr, GTK_WIDGET (addr)); -} - -/* - * - * Bonobo Control Magic - * - */ - -enum { - ADDRESS_PROPERTY_NAME, - ADDRESS_PROPERTY_EMAIL, - ADDRESS_PROPERTY_TEXT, - ADDRESS_PROPERTY_BACKGROUND_RGB -}; - - -static void -get_prop (BonoboPropertyBag *bag, BonoboArg *arg, guint arg_id, CORBA_Environment *ev, gpointer user_data) -{ - EAddressWidget *addr = E_ADDRESS_WIDGET (user_data); - - switch (arg_id) { - - case ADDRESS_PROPERTY_NAME: - BONOBO_ARG_SET_STRING (arg, addr->name ? addr->name :""); - break; - - case ADDRESS_PROPERTY_EMAIL: - BONOBO_ARG_SET_STRING (arg, addr->email ? addr->email : ""); - break; - - case ADDRESS_PROPERTY_TEXT: - BONOBO_ARG_SET_STRING (arg, "?"); - break; - } -} - -static void -set_prop (BonoboPropertyBag *bag, const BonoboArg *arg, guint arg_id, CORBA_Environment *ev, gpointer user_data) -{ - EAddressWidget *addr = E_ADDRESS_WIDGET (user_data); - - switch (arg_id) { - case ADDRESS_PROPERTY_NAME: - e_address_widget_set_name (addr, BONOBO_ARG_GET_STRING (arg)); - break; - - case ADDRESS_PROPERTY_EMAIL: - e_address_widget_set_email (addr, BONOBO_ARG_GET_STRING (arg)); - break; - - case ADDRESS_PROPERTY_TEXT: - e_address_widget_set_text (addr, BONOBO_ARG_GET_STRING (arg)); - break; - - - case ADDRESS_PROPERTY_BACKGROUND_RGB: - { - gint bg = BONOBO_ARG_GET_INT (arg); - GdkColor color; - - color.red = (bg & 0xff0000) >> 8; - color.green = (bg & 0x00ff00); - color.blue = (bg & 0x0000ff) << 8; - - if (gdk_colormap_alloc_color (gtk_widget_get_colormap (GTK_WIDGET (addr)), &color, FALSE, TRUE)) { - GtkStyle *style = gtk_style_copy (gtk_widget_get_style (GTK_WIDGET (addr))); - style->bg[0] = color; - gtk_widget_set_style (GTK_WIDGET (addr), style); - } - } - - break; - } -} - -BonoboControl * -e_address_widget_factory_new_control (void) -{ - BonoboControl *control; - BonoboPropertyBag *bag; - GtkWidget *w; - - w = e_address_widget_new (); - gtk_widget_show (w); - - control = bonobo_control_new (w); - - bag = bonobo_property_bag_new (get_prop, set_prop, w); - bonobo_property_bag_add (bag, "name", ADDRESS_PROPERTY_NAME, - BONOBO_ARG_STRING, NULL, NULL, - BONOBO_PROPERTY_READABLE | BONOBO_PROPERTY_WRITEABLE); - - bonobo_property_bag_add (bag, "email", ADDRESS_PROPERTY_EMAIL, - BONOBO_ARG_STRING, NULL, NULL, - BONOBO_PROPERTY_READABLE | BONOBO_PROPERTY_WRITEABLE); - - bonobo_property_bag_add (bag, "text", ADDRESS_PROPERTY_TEXT, - BONOBO_ARG_STRING, NULL, NULL, - BONOBO_PROPERTY_READABLE | BONOBO_PROPERTY_WRITEABLE); - - bonobo_property_bag_add (bag, "background_rgb", ADDRESS_PROPERTY_BACKGROUND_RGB, - BONOBO_ARG_INT, NULL, NULL, - BONOBO_PROPERTY_WRITEABLE); - - bonobo_control_set_properties (control, bonobo_object_corba_objref (BONOBO_OBJECT (bag)), NULL); - bonobo_object_unref (BONOBO_OBJECT (bag)); - - return control; -} diff --git a/addressbook/gui/component/e-address-widget.h b/addressbook/gui/component/e-address-widget.h deleted file mode 100644 index 13e4a417d0..0000000000 --- a/addressbook/gui/component/e-address-widget.h +++ /dev/null @@ -1,82 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ - -/* - * e-address-widget.h - * - * Copyright (C) 2001 Ximian, Inc. - * - * Developed by Jon Trowbridge <trow@ximian.com> - */ - -/* - * This program is free software; you can redistribute it and/or - * modify it under the terms of 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 __E_ADDRESS_WIDGET_H__ -#define __E_ADDRESS_WIDGET_H__ - -#include <gtk/gtkeventbox.h> -#include <gtk/gtkhbox.h> -#include <gtk/gtkobject.h> -#include <gtk/gtkwidget.h> -#include <addressbook/backend/ebook/e-book-util.h> -#include <addressbook/backend/ebook/e-card.h> - -G_BEGIN_DECLS - -#define E_TYPE_ADDRESS_WIDGET (e_address_widget_get_type ()) -#define E_ADDRESS_WIDGET(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), E_TYPE_ADDRESS_WIDGET, EAddressWidget)) -#define E_ADDRESS_WIDGET_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), E_TYPE_ADDRESS_WIDGET, EAddressWidgetClass)) -#define E_IS_ADDRESS_WIDGET(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), E_TYPE_ADDRESS_WIDGET)) -#define E_IS_ADDRESS_WIDGET_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), E_TYPE_ADDRESS_WIDGET)) - -typedef struct _EAddressWidget EAddressWidget; -typedef struct _EAddressWidgetClass EAddressWidgetClass; - -struct _EAddressWidget { - GtkEventBox parent; - - gchar *name; - gchar *email; - - GtkWidget *name_widget; - GtkWidget *email_widget; - GtkWidget *spacer; - - guint query_idle_tag; - guint query_tag; - - ECard *card; - gboolean known_email; -}; - -struct _EAddressWidgetClass { - GtkEventBoxClass parent_class; -}; - -GType e_address_widget_get_type (void); - -void e_address_widget_set_name (EAddressWidget *, const gchar *name); -void e_address_widget_set_email (EAddressWidget *, const gchar *email); -void e_address_widget_set_text (EAddressWidget *, const gchar *text); - -void e_address_widget_construct (EAddressWidget *); -GtkWidget *e_address_widget_new (void); - -BonoboControl *e_address_widget_new_control (void); - -G_END_DECLS - -#endif /* __E_ADDRESS_WIDGET_H__ */ diff --git a/addressbook/gui/component/e-cardlist-model.c b/addressbook/gui/component/e-cardlist-model.c deleted file mode 100644 index be1ff3ddd2..0000000000 --- a/addressbook/gui/component/e-cardlist-model.c +++ /dev/null @@ -1,239 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * - * Author: - * Christopher James Lahey <clahey@ximian.com> - * - * (C) 1999 Ximian, Inc. - */ - -#include <config.h> -#include <libxml/tree.h> -#include <libxml/parser.h> -#include <libxml/xmlmemory.h> - -#include <string.h> - -#include "e-cardlist-model.h" - -#define PARENT_TYPE e_table_model_get_type() - -static GObjectClass *parent_class = NULL; - -static void -e_cardlist_model_dispose(GObject *object) -{ - ECardlistModel *model = E_CARDLIST_MODEL(object); - int i; - - if (model->data != NULL) { - for ( i = 0; i < model->data_count; i++ ) { - g_object_unref(model->data[i]); - } - g_free(model->data); - model->data = NULL; - } - - if (G_OBJECT_CLASS (parent_class)->dispose) - (* G_OBJECT_CLASS (parent_class)->dispose) (object); -} - -/* This function returns the number of columns in our ETableModel. */ -static int -e_cardlist_model_col_count (ETableModel *etc) -{ - return E_CARD_SIMPLE_FIELD_LAST; -} - -/* This function returns the number of rows in our ETableModel. */ -static int -e_cardlist_model_row_count (ETableModel *etc) -{ - ECardlistModel *e_cardlist_model = E_CARDLIST_MODEL(etc); - return e_cardlist_model->data_count; -} - -/* This function returns the value at a particular point in our ETableModel. */ -static void * -e_cardlist_model_value_at (ETableModel *etc, int col, int row) -{ - ECardlistModel *e_cardlist_model = E_CARDLIST_MODEL(etc); - const char *value; - if ( col >= E_CARD_SIMPLE_FIELD_LAST - 1|| row >= e_cardlist_model->data_count ) - return NULL; - value = e_card_simple_get_const(e_cardlist_model->data[row], - col + 1); - return (void *)(value ? value : ""); -} - -/* This function sets the value at a particular point in our ETableModel. */ -static void -e_cardlist_model_set_value_at (ETableModel *etc, int col, int row, const void *val) -{ - ECardlistModel *e_cardlist_model = E_CARDLIST_MODEL(etc); - - if ( col >= E_CARD_SIMPLE_FIELD_LAST - 1|| row >= e_cardlist_model->data_count ) - return; - e_table_model_pre_change(etc); - e_card_simple_set(e_cardlist_model->data[row], - col + 1, - val); - - e_table_model_cell_changed(etc, col, row); -} - -/* This function returns whether a particular cell is editable. */ -static gboolean -e_cardlist_model_is_cell_editable (ETableModel *etc, int col, int row) -{ - return TRUE; -} - -/* This function duplicates the value passed to it. */ -static void * -e_cardlist_model_duplicate_value (ETableModel *etc, int col, const void *value) -{ - return g_strdup(value); -} - -/* This function frees the value passed to it. */ -static void -e_cardlist_model_free_value (ETableModel *etc, int col, void *value) -{ - g_free(value); -} - -static void * -e_cardlist_model_initialize_value (ETableModel *etc, int col) -{ - return g_strdup(""); -} - -static gboolean -e_cardlist_model_value_is_empty (ETableModel *etc, int col, const void *value) -{ - return !(value && *(char *)value); -} - -static char * -e_cardlist_model_value_to_string (ETableModel *etc, int col, const void *value) -{ - return g_strdup(value); -} - -void -e_cardlist_model_add(ECardlistModel *model, - ECard **cards, - int count) -{ - int i; - model->data = g_realloc(model->data, model->data_count + count * sizeof(ECard *)); - for (i = 0; i < count; i++) { - gboolean found = FALSE; - const gchar *id = e_card_get_id(cards[i]); - for ( i = 0; i < model->data_count; i++) { - if ( !strcmp(e_card_simple_get_id(model->data[i]), id) ) { - found = TRUE; - break; - } - } - if (!found) { - e_table_model_pre_change(E_TABLE_MODEL(model)); - g_object_ref(cards[i]); - model->data[model->data_count++] = e_card_simple_new (cards[i]); - e_table_model_row_inserted(E_TABLE_MODEL(model), model->data_count - 1); - } - } -} - -void -e_cardlist_model_remove(ECardlistModel *model, - const char *id) -{ - int i; - for ( i = 0; i < model->data_count; i++) { - if ( !strcmp(e_card_simple_get_id(model->data[i]), id) ) { - e_table_model_pre_change(E_TABLE_MODEL(model)); - g_object_unref(model->data[i]); - memmove(model->data + i, model->data + i + 1, (model->data_count - i - 1) * sizeof (ECard *)); - e_table_model_row_deleted(E_TABLE_MODEL(model), i); - } - } -} - -static void -e_cardlist_model_class_init (GObjectClass *object_class) -{ - ETableModelClass *model_class = (ETableModelClass *) object_class; - - parent_class = g_type_class_peek_parent (object_class); - - object_class->dispose = e_cardlist_model_dispose; - - model_class->column_count = e_cardlist_model_col_count; - model_class->row_count = e_cardlist_model_row_count; - model_class->value_at = e_cardlist_model_value_at; - model_class->set_value_at = e_cardlist_model_set_value_at; - model_class->is_cell_editable = e_cardlist_model_is_cell_editable; - model_class->duplicate_value = e_cardlist_model_duplicate_value; - model_class->free_value = e_cardlist_model_free_value; - model_class->initialize_value = e_cardlist_model_initialize_value; - model_class->value_is_empty = e_cardlist_model_value_is_empty; - model_class->value_to_string = e_cardlist_model_value_to_string; -} - -static void -e_cardlist_model_init (GObject *object) -{ - ECardlistModel *model = E_CARDLIST_MODEL(object); - model->data = NULL; - model->data_count = 0; -} - -ECard * -e_cardlist_model_get(ECardlistModel *model, - int row) -{ - if (model->data && row < model->data_count) { - ECard *card; - g_object_get(model->data[row], - "card", &card, - NULL); - return card; - } - return NULL; -} - -GType -e_cardlist_model_get_type (void) -{ - static GType aw_type = 0; - - if (!aw_type) { - static const GTypeInfo aw_info = { - sizeof (ECardlistModelClass), - NULL, /* base_init */ - NULL, /* base_finalize */ - (GClassInitFunc) e_cardlist_model_class_init, - NULL, /* class_finalize */ - NULL, /* class_data */ - sizeof (ECardlistModel), - 0, /* n_preallocs */ - (GInstanceInitFunc) e_cardlist_model_init, - }; - - aw_type = g_type_register_static (PARENT_TYPE, "ECardlistModel", &aw_info, 0); - } - - return aw_type; -} - -ETableModel * -e_cardlist_model_new (void) -{ - ECardlistModel *et; - - et = g_object_new (E_TYPE_CARDLIST_MODEL, NULL); - - return E_TABLE_MODEL(et); -} diff --git a/addressbook/gui/component/e-cardlist-model.h b/addressbook/gui/component/e-cardlist-model.h deleted file mode 100644 index 0968e936fc..0000000000 --- a/addressbook/gui/component/e-cardlist-model.h +++ /dev/null @@ -1,42 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -#ifndef _E_CARDLIST_MODEL_H_ -#define _E_CARDLIST_MODEL_H_ - -#include <gal/e-table/e-table-model.h> -#include <ebook/e-book.h> -#include <ebook/e-book-view.h> -#include <ebook/e-card-simple.h> - -#define E_TYPE_CARDLIST_MODEL (e_cardlist_model_get_type ()) -#define E_CARDLIST_MODEL(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), E_TYPE_CARDLIST_MODEL, ECardlistModel)) -#define E_CARDLIST_MODEL_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), E_TYPE_CARDLIST_MODEL, ECardlistModelClass)) -#define E_IS_CARDLIST_MODEL(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), E_TYPE_CARDLIST_MODEL)) -#define E_IS_CARDLIST_MODEL_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), E_TYPE_CARDLIST_MODEL)) - -typedef struct { - ETableModel parent; - - /* item specific fields */ - ECardSimple **data; - int data_count; -} ECardlistModel; - - -typedef struct { - ETableModelClass parent_class; -} ECardlistModelClass; - - -GType e_cardlist_model_get_type (void); -ETableModel *e_cardlist_model_new (void); - -/* Returns object with an extra ref count. */ -ECard *e_cardlist_model_get (ECardlistModel *model, - int row); -void e_cardlist_model_add (ECardlistModel *model, - ECard **card, - int count); -void e_cardlist_model_remove (ECardlistModel *model, - const char *id); - -#endif /* _E_CARDLIST_MODEL_H_ */ diff --git a/addressbook/gui/component/select-names/Evolution-Addressbook-SelectNames.idl b/addressbook/gui/component/select-names/Evolution-Addressbook-SelectNames.idl index 2959597cc5..6feb6b54bb 100644 --- a/addressbook/gui/component/select-names/Evolution-Addressbook-SelectNames.idl +++ b/addressbook/gui/component/select-names/Evolution-Addressbook-SelectNames.idl @@ -14,78 +14,6 @@ module GNOME { module Evolution { module Addressbook { - interface SimpleCard : Bonobo::Unknown { - struct Arbitrary { - string key; - string type; - string value; - }; - - enum Field { - FileAs, - FullName, - Email, - PhonePrimary, - PhoneAssistant, - PhoneBusiness, - PhoneCallback, - PhoneCompany, - PhoneHome, - Org, - AddressBusiness, - AddressHome, - PhoneMobile, - PhoneCar, - PhoneBusinessFax, - PhoneHomeFax, - PhoneBusiness2, - PhoneHome2, - PhoneIsdn, - PhoneOther, - PhoneOtherFax, - PhonePager, - PhoneRadio, - PhoneTelex, - PhoneTtytdd, - AddressOther, - Email2, - Email3, - Url, - OrgUnit, - Office, - Title, - Role, - Manager, - Assistant, - Nickname, - Spouse, - Note, - Caluri, - Fburl, - Icscalendar, - Anniversary, - BirthDate, - Mailer, - NameOrOrg, - Categories, - FamilyName, - GivenName, - AdditionalName, - NameSuffix, - WantsHtml, - IsList, - Last - }; - - Arbitrary getArbitrary (in string key); - void setArbitrary (in string key, in string type, in string value); - - string get (in Field field); - void set (in Field field, in string value); - }; - - typedef sequence<SimpleCard> SimpleCardList; - interface SelectNames : Bonobo::Unknown { struct Section { string id; diff --git a/addressbook/gui/component/select-names/GNOME_Evolution_Addressbook_SelectNames.server.in.in b/addressbook/gui/component/select-names/GNOME_Evolution_Addressbook_SelectNames.server.in.in index 6e4d156051..80b138f1dc 100644 --- a/addressbook/gui/component/select-names/GNOME_Evolution_Addressbook_SelectNames.server.in.in +++ b/addressbook/gui/component/select-names/GNOME_Evolution_Addressbook_SelectNames.server.in.in @@ -17,7 +17,7 @@ <oaf_server iid="OAFIID:GNOME_Evolution_Addressbook_SelectNames" type="factory" - location="OAFIID:GNOME_Evolution_Addressbook_Factory"> + location="OAFIID:GNOME_Evolution_Addressbook_Factory_2"> <oaf_attribute name="repo_ids" type="stringv"> <item value="IDL:GNOME/Evolution/Addressbook/SelectNames"/> @@ -28,4 +28,4 @@ </oaf_server> -</oaf_info>
\ No newline at end of file +</oaf_info> diff --git a/addressbook/gui/component/select-names/Makefile.am b/addressbook/gui/component/select-names/Makefile.am index 051a168815..b78e5b69fe 100644 --- a/addressbook/gui/component/select-names/Makefile.am +++ b/addressbook/gui/component/select-names/Makefile.am @@ -69,9 +69,7 @@ libeselectnames_la_SOURCES = \ e-select-names-text-model.c \ e-select-names-text-model.h \ e-select-names.c \ - e-select-names.h \ - e-simple-card-bonobo.c \ - e-simple-card-bonobo.h + e-select-names.h libeselectnames_la_LIBADD = \ $(top_builddir)/addressbook/backend/ebook/libebook.la \ diff --git a/addressbook/gui/component/select-names/e-select-names-bonobo.c b/addressbook/gui/component/select-names/e-select-names-bonobo.c index 10fc9caee7..f10fa3b804 100644 --- a/addressbook/gui/component/select-names/e-select-names-bonobo.c +++ b/addressbook/gui/component/select-names/e-select-names-bonobo.c @@ -25,7 +25,6 @@ #endif #include "e-select-names-bonobo.h" -#include "e-simple-card-bonobo.h" #include <bonobo-activation/bonobo-activation-activate.h> @@ -63,7 +62,6 @@ enum _EntryPropertyID { ENTRY_PROPERTY_ID_TEXT, ENTRY_PROPERTY_ID_ADDRESSES, ENTRY_PROPERTY_ID_DESTINATIONS, - ENTRY_PROPERTY_ID_SIMPLE_CARD_LIST, ENTRY_PROPERTY_ID_ALLOW_CONTACT_LISTS, ENTRY_PROPERTY_ID_ENTRY_CHANGED }; @@ -122,38 +120,6 @@ entry_get_property_fn (BonoboPropertyBag *bag, } break; - case ENTRY_PROPERTY_ID_SIMPLE_CARD_LIST: - { - ESelectNamesModel *model; - int count; - int i; - GNOME_Evolution_Addressbook_SimpleCardList *card_list; - - model = E_SELECT_NAMES_MODEL (g_object_get_data (G_OBJECT (w), "select_names_model")); - g_assert (model != NULL); - - count = e_select_names_model_count (model); - - card_list = GNOME_Evolution_Addressbook_SimpleCardList__alloc (); - card_list->_buffer = CORBA_sequence_GNOME_Evolution_Addressbook_SimpleCard_allocbuf (count); - card_list->_maximum = count; - card_list->_length = count; - - for (i = 0; i < count; i++) { - const EDestination *destination = e_select_names_model_get_destination (model, i); - const ECard *card = e_destination_get_card (destination); - ECardSimple *simple = e_card_simple_new ((ECard *) card); - ESimpleCardBonobo *simple_card = e_simple_card_bonobo_new (simple); - g_object_unref (simple); - - card_list->_buffer[i] = bonobo_object_corba_objref (BONOBO_OBJECT (simple_card)); - } - - CORBA_free (*(GNOME_Evolution_Addressbook_SimpleCardList **)arg->_value); - BONOBO_ARG_SET_GENERAL (arg, *card_list, TC_GNOME_Evolution_Addressbook_SimpleCardList, GNOME_Evolution_Addressbook_SimpleCardList, NULL); - } - break; - case ENTRY_PROPERTY_ID_ALLOW_CONTACT_LISTS: { ESelectNamesCompletion *comp; @@ -195,7 +161,7 @@ entry_set_property_fn (BonoboPropertyBag *bag, g_assert (model != NULL); e_entry_set_text (E_ENTRY (w), BONOBO_ARG_GET_STRING (arg)); - e_select_names_model_cardify_all (model, NULL, 0); + e_select_names_model_load_all_contacts (model, NULL); break; } @@ -206,7 +172,7 @@ entry_set_property_fn (BonoboPropertyBag *bag, g_assert (model != NULL); e_select_names_model_import_destinationv (model, BONOBO_ARG_GET_STRING (arg)); - e_select_names_model_cardify_all (model, NULL, 0); + e_select_names_model_load_all_contacts (model, NULL); break; } @@ -499,9 +465,6 @@ impl_SelectNames_get_entry_for_section (PortableServer_Servant servant, bonobo_property_bag_add (property_bag, "destinations", ENTRY_PROPERTY_ID_DESTINATIONS, BONOBO_ARG_STRING, NULL, NULL, BONOBO_PROPERTY_READABLE | BONOBO_PROPERTY_WRITEABLE); - bonobo_property_bag_add (property_bag, "simple_card_list", ENTRY_PROPERTY_ID_SIMPLE_CARD_LIST, - TC_GNOME_Evolution_Addressbook_SimpleCardList, NULL, NULL, - BONOBO_PROPERTY_READABLE); bonobo_property_bag_add (property_bag, "allow_contact_lists", ENTRY_PROPERTY_ID_ALLOW_CONTACT_LISTS, BONOBO_ARG_BOOLEAN, NULL, NULL, BONOBO_PROPERTY_READABLE | BONOBO_PROPERTY_WRITEABLE); diff --git a/addressbook/gui/component/select-names/e-select-names-completion.c b/addressbook/gui/component/select-names/e-select-names-completion.c index 5a9fc2deb4..7bfbfd2a5a 100644 --- a/addressbook/gui/component/select-names/e-select-names-completion.c +++ b/addressbook/gui/component/select-names/e-select-names-completion.c @@ -34,17 +34,17 @@ #include <gtk/gtksignal.h> -#include <addressbook/backend/ebook/e-book-util.h> -#include <addressbook/backend/ebook/e-destination.h> -#include <addressbook/backend/ebook/e-card-simple.h> -#include <addressbook/backend/ebook/e-card-compare.h> +#include <addressbook/util/eab-book-util.h> +#include <addressbook/util/eab-destination.h> +#include <addressbook/gui/merging/eab-contact-compare.h> +#include <addressbook/backend/ebook/e-contact.h> typedef struct { EBook *book; guint book_view_tag; EBookView *book_view; ESelectNamesCompletion *comp; - guint card_added_tag; + guint contacts_added_tag; guint seq_complete_tag; gboolean sequence_complete_received; @@ -76,7 +76,7 @@ static void e_select_names_completion_init (ESelectNamesCompletion *); static void e_select_names_completion_dispose (GObject *object); static void e_select_names_completion_got_book_view_cb (EBook *book, EBookStatus status, EBookView *view, gpointer user_data); -static void e_select_names_completion_card_added_cb (EBookView *, const GList *cards, gpointer user_data); +static void e_select_names_completion_contacts_added_cb (EBookView *, const GList *cards, gpointer user_data); static void e_select_names_completion_seq_complete_cb (EBookView *, EBookViewStatus status, gpointer user_data); static void e_select_names_completion_do_query (ESelectNamesCompletion *, const gchar *query_text, gint pos, gint limit); @@ -95,7 +95,7 @@ static FILE *out; */ typedef gchar *(*BookQuerySExp) (ESelectNamesCompletion *); -typedef ECompletionMatch *(*BookQueryMatchTester) (ESelectNamesCompletion *, EDestination *); +typedef ECompletionMatch *(*BookQueryMatchTester) (ESelectNamesCompletion *, EABDestination *); static int utf8_casefold_collate_len (const gchar *str1, const gchar *str2, int len) @@ -125,14 +125,16 @@ our_match_destroy (ECompletionMatch *match) } static ECompletionMatch * -make_match (EDestination *dest, const gchar *menu_form, double score) +make_match (EABDestination *dest, const gchar *menu_form, double score) { ECompletionMatch *match; - ECard *card = e_destination_get_card (dest); +#if notyet + EContact *contact = eab_destination_get_contact (dest); +#endif - match = e_completion_match_new (e_destination_get_name (dest), menu_form, score); + match = e_completion_match_new (eab_destination_get_name (dest), menu_form, score); - e_completion_match_set_text (match, e_destination_get_name (dest), menu_form); + e_completion_match_set_text (match, eab_destination_get_name (dest), menu_form); /* Reject any match that has null text fields. */ if (! (e_completion_match_get_match_text (match) && e_completion_match_get_menu_text (match))) { @@ -140,10 +142,15 @@ make_match (EDestination *dest, const gchar *menu_form, double score) return NULL; } +#if notyet + /* XXX toshok - EContact doesn't have the use_score stuff */ /* Since we sort low to high, we negate so that larger use scores will come first */ - match->sort_major = card ? -floor (e_card_get_use_score (card)) : 0; + match->sort_major = contact ? -floor (e_contact_get_use_score (contact)) : 0; +#else + match->sort_major = 0; +#endif - match->sort_minor = e_destination_get_email_num (dest); + match->sort_minor = eab_destination_get_email_num (dest); match->user_data = dest; g_object_ref (dest); @@ -166,31 +173,33 @@ sexp_nickname (ESelectNamesCompletion *comp) } static ECompletionMatch * -match_nickname (ESelectNamesCompletion *comp, EDestination *dest) +match_nickname (ESelectNamesCompletion *comp, EABDestination *dest) { ECompletionMatch *match = NULL; gint len; - ECard *card = e_destination_get_card (dest); + EContact *contact = eab_destination_get_contact (dest); double score; + const char *nickname; - if (card->nickname == NULL) + nickname = e_contact_get_const (contact, E_CONTACT_NICKNAME); + if (nickname == NULL) return NULL; len = g_utf8_strlen (comp->priv->query_text, -1); - if (card->nickname && !utf8_casefold_collate_len (comp->priv->query_text, card->nickname, len)) { + if (nickname && !utf8_casefold_collate_len (comp->priv->query_text, nickname, len)) { const gchar *name; gchar *str; score = len * 2; /* nickname gives 2 points per matching character */ - if (len == g_utf8_strlen (card->nickname, -1)) /* boost score on an exact match */ + if (len == g_utf8_strlen (nickname, -1)) /* boost score on an exact match */ score *= 10; - name = e_destination_get_name (dest); + name = eab_destination_get_name (dest); if (name && *name) - str = g_strdup_printf ("'%s' %s <%s>", card->nickname, name, e_destination_get_email (dest)); + str = g_strdup_printf ("'%s' %s <%s>", nickname, name, eab_destination_get_email (dest)); else - str = g_strdup_printf ("'%s' <%s>", card->nickname, e_destination_get_email (dest)); + str = g_strdup_printf ("'%s' <%s>", nickname, eab_destination_get_email (dest)); match = make_match (dest, str, score); g_free (str); @@ -210,17 +219,17 @@ sexp_email (ESelectNamesCompletion *comp) } static ECompletionMatch * -match_email (ESelectNamesCompletion *comp, EDestination *dest) +match_email (ESelectNamesCompletion *comp, EABDestination *dest) { ECompletionMatch *match; gint len = strlen (comp->priv->query_text); - const gchar *name = e_destination_get_name (dest); - const gchar *email = e_destination_get_email (dest); + const gchar *name = eab_destination_get_name (dest); + const gchar *email = eab_destination_get_email (dest); double score; if (email && !utf8_casefold_collate_len (comp->priv->query_text, email, len) - && !e_destination_is_evolution_list (dest)) { + && !eab_destination_is_evolution_list (dest)) { gchar *str; @@ -294,78 +303,82 @@ sexp_name (ESelectNamesCompletion *comp) } static ECompletionMatch * -match_name (ESelectNamesCompletion *comp, EDestination *dest) +match_name (ESelectNamesCompletion *comp, EABDestination *dest) { ECompletionMatch *final_match = NULL; gchar *menu_text = NULL; - ECard *card; + EContact *contact; const gchar *email; gint match_len = 0; - ECardMatchType match; - ECardMatchPart first_match; + EABContactMatchType match; + EABContactMatchPart first_match; double score = 0; gboolean have_given, have_additional, have_family; + EContactName *contact_name; - card = e_destination_get_card (dest); - - if (card->name == NULL) + contact = eab_destination_get_contact (dest); + + contact_name = e_contact_get (contact, E_CONTACT_NAME); + if (!contact_name) return NULL; - email = e_destination_get_email (dest); + email = eab_destination_get_email (dest); - match = e_card_compare_name_to_string_full (card, comp->priv->query_text, TRUE /* yes, allow partial matches */, - NULL, &first_match, &match_len); + match = eab_contact_compare_name_to_string_full (contact, comp->priv->query_text, TRUE /* yes, allow partial matches */, + NULL, &first_match, &match_len); - if (match <= E_CARD_MATCH_NONE) + if (match <= EAB_CONTACT_MATCH_NONE) { + e_contact_name_free (contact_name); return NULL; + } score = match_len * 3; /* three points per match character */ - have_given = card->name->given && *card->name->given; - have_additional = card->name->additional && *card->name->additional; - have_family = card->name->family && *card->name->family; + have_given = contact_name->given && *contact_name->given; + have_additional = contact_name->additional && *contact_name->additional; + have_family = contact_name->family && *contact_name->family; - if (e_card_evolution_list (card)) { + if (e_contact_get (contact, E_CONTACT_IS_LIST)) { - menu_text = e_card_name_to_string (card->name); + menu_text = e_contact_name_to_string (contact_name); - } else if (first_match == E_CARD_MATCH_PART_GIVEN_NAME) { + } else if (first_match == EAB_CONTACT_MATCH_PART_GIVEN_NAME) { if (have_family) - menu_text = g_strdup_printf ("%s %s <%s>", card->name->given, card->name->family, email); + menu_text = g_strdup_printf ("%s %s <%s>", contact_name->given, contact_name->family, email); else - menu_text = g_strdup_printf ("%s <%s>", card->name->given, email); + menu_text = g_strdup_printf ("%s <%s>", contact_name->given, email); - } else if (first_match == E_CARD_MATCH_PART_ADDITIONAL_NAME) { + } else if (first_match == EAB_CONTACT_MATCH_PART_ADDITIONAL_NAME) { if (have_given) { menu_text = g_strdup_printf ("%s%s%s, %s <%s>", - card->name->additional, + contact_name->additional, have_family ? " " : "", - have_family ? card->name->family : "", - card->name->given, + have_family ? contact_name->family : "", + contact_name->given, email); } else { menu_text = g_strdup_printf ("%s%s%s <%s>", - card->name->additional, + contact_name->additional, have_family ? " " : "", - have_family ? card->name->family : "", + have_family ? contact_name->family : "", email); } - } else if (first_match == E_CARD_MATCH_PART_FAMILY_NAME) { + } else if (first_match == EAB_CONTACT_MATCH_PART_FAMILY_NAME) { if (have_given) menu_text = g_strdup_printf ("%s, %s%s%s <%s>", - card->name->family, - card->name->given, + contact_name->family, + contact_name->given, have_additional ? " " : "", - have_additional ? card->name->additional : "", + have_additional ? contact_name->additional : "", email); else - menu_text = g_strdup_printf ("%s <%s>", card->name->family, email); + menu_text = g_strdup_printf ("%s <%s>", contact_name->family, email); } else { /* something funny happened */ @@ -379,6 +392,8 @@ match_name (ESelectNamesCompletion *comp, EDestination *dest) g_free (menu_text); } + e_contact_name_free (contact_name); + return final_match; } @@ -393,7 +408,7 @@ sexp_file_as (ESelectNamesCompletion *comp) } static ECompletionMatch * -match_file_as (ESelectNamesCompletion *comp, EDestination *dest) +match_file_as (ESelectNamesCompletion *comp, EABDestination *dest) { const gchar *name; const gchar *email; @@ -402,8 +417,8 @@ match_file_as (ESelectNamesCompletion *comp, EDestination *dest) double score = 0.00001; ECompletionMatch *match; - name = e_destination_get_name (dest); - email = e_destination_get_email (dest); + name = eab_destination_get_name (dest); + email = eab_destination_get_email (dest); if (!(name && *name)) return NULL; @@ -491,13 +506,13 @@ book_query_sexp (ESelectNamesCompletion *comp) * string that applies to a given destination. */ static ECompletionMatch * -book_query_score (ESelectNamesCompletion *comp, EDestination *dest) +book_query_score (ESelectNamesCompletion *comp, EABDestination *dest) { ECompletionMatch *best_match = NULL; gint i; g_return_val_if_fail (E_IS_SELECT_NAMES_COMPLETION (comp), NULL); - g_return_val_if_fail (E_IS_DESTINATION (dest), NULL); + g_return_val_if_fail (EAB_IS_DESTINATION (dest), NULL); if (! (comp->priv->query_text && *comp->priv->query_text)) return NULL; @@ -506,7 +521,7 @@ book_query_score (ESelectNamesCompletion *comp, EDestination *dest) ECompletionMatch *this_match = NULL; - if (book_queries[i].tester && e_destination_get_card (dest)) { + if (book_queries[i].tester && eab_destination_get_contact (dest)) { this_match = book_queries[i].tester (comp, dest); } @@ -524,18 +539,18 @@ book_query_score (ESelectNamesCompletion *comp, EDestination *dest) } static void -book_query_process_card_list (ESelectNamesCompletion *comp, const GList *cards) +book_query_process_card_list (ESelectNamesCompletion *comp, const GList *contacts) { - while (cards) { - ECard *card = E_CARD (cards->data); + while (contacts) { + EContact *contact = E_CONTACT (contacts->data); - if (e_card_evolution_list (card)) { + if (e_contact_get (contact, E_CONTACT_IS_LIST)) { if (comp->priv->match_contact_lists) { - EDestination *dest = e_destination_new (); + EABDestination *dest = eab_destination_new (); ECompletionMatch *match; - e_destination_set_card (dest, card, 0); + eab_destination_set_contact (dest, contact, 0); match = book_query_score (comp, dest); if (match && match->score > 0) { e_completion_found_match (E_COMPLETION (comp), match); @@ -546,31 +561,38 @@ book_query_process_card_list (ESelectNamesCompletion *comp, const GList *cards) } - } else if (card->email) { - gint i; - for (i=0; i<e_list_length (card->email); ++i) { - EDestination *dest = e_destination_new (); - const gchar *email; - ECompletionMatch *match; + } + else { + GList *email = e_contact_get (contact, E_CONTACT_EMAIL); + if (email) { + GList *iter; + gint i; + for (i=0, iter = email; iter; ++i, iter = iter->next) { + EABDestination *dest = eab_destination_new (); + gchar *e; + ECompletionMatch *match; - e_destination_set_card (dest, card, i); - email = e_destination_get_email (dest); + eab_destination_set_contact (dest, contact, i); + e = iter->data; - if (email && *email) { + if (e && *e) { - match = book_query_score (comp, dest); - if (match && match->score > 0) { - e_completion_found_match (E_COMPLETION (comp), match); - } else { - e_completion_match_unref (match); + match = book_query_score (comp, dest); + if (match && match->score > 0) { + e_completion_found_match (E_COMPLETION (comp), match); + } else { + e_completion_match_unref (match); + } } - } - g_object_unref (dest); + g_object_unref (dest); + } } + g_list_foreach (email, (GFunc)g_free, NULL); + g_list_free (email); } - cards = g_list_next (cards); + contacts = contacts->next; } } @@ -640,9 +662,9 @@ e_select_names_completion_clear_book_data (ESelectNamesCompletion *comp) for (l = comp->priv->book_data; l; l = l->next) { ESelectNamesCompletionBookData *book_data = l->data; - if (book_data->card_added_tag) { - g_signal_handler_disconnect (book_data->book_view, book_data->card_added_tag); - book_data->card_added_tag = 0; + if (book_data->contacts_added_tag) { + g_signal_handler_disconnect (book_data->book_view, book_data->contacts_added_tag); + book_data->contacts_added_tag = 0; } if (book_data->seq_complete_tag) { @@ -756,7 +778,7 @@ e_select_names_completion_got_book_view_cb (EBook *book, EBookStatus status, EBo book_data = (ESelectNamesCompletionBookData*)user_data; comp = book_data->comp; - if (status != E_BOOK_STATUS_SUCCESS) { + if (status != E_BOOK_ERROR_OK) { comp->priv->pending_completion_seq--; if (!comp->priv->pending_completion_seq) e_select_names_completion_done (comp); @@ -765,9 +787,9 @@ e_select_names_completion_got_book_view_cb (EBook *book, EBookStatus status, EBo book_data->book_view_tag = 0; - if (book_data->card_added_tag) { - g_signal_handler_disconnect (book_data->book_view, book_data->card_added_tag); - book_data->card_added_tag = 0; + if (book_data->contacts_added_tag) { + g_signal_handler_disconnect (book_data->book_view, book_data->contacts_added_tag); + book_data->contacts_added_tag = 0; } if (book_data->seq_complete_tag) { g_signal_handler_disconnect (book_data->book_view, book_data->seq_complete_tag); @@ -781,10 +803,10 @@ e_select_names_completion_got_book_view_cb (EBook *book, EBookStatus status, EBo } book_data->book_view = view; - book_data->card_added_tag = + book_data->contacts_added_tag = g_signal_connect (view, - "card_added", - G_CALLBACK (e_select_names_completion_card_added_cb), + "contacts_added", + G_CALLBACK (e_select_names_completion_contacts_added_cb), book_data); book_data->seq_complete_tag = @@ -792,11 +814,14 @@ e_select_names_completion_got_book_view_cb (EBook *book, EBookStatus status, EBo "sequence_complete", G_CALLBACK (e_select_names_completion_seq_complete_cb), book_data); + + e_book_view_start (view); + book_data->sequence_complete_received = FALSE; } static void -e_select_names_completion_card_added_cb (EBookView *book_view, const GList *cards, gpointer user_data) +e_select_names_completion_contacts_added_cb (EBookView *book_view, const GList *cards, gpointer user_data) { ESelectNamesCompletionBookData *book_data = user_data; ESelectNamesCompletion *comp = book_data->comp; @@ -834,7 +859,7 @@ e_select_names_completion_seq_complete_cb (EBookView *book_view, EBookViewStatus } if (book_data->cached_query_text - && status == E_BOOK_STATUS_SUCCESS + && status == E_BOOK_ERROR_OK && !book_data->cache_complete && !strcmp (book_data->cached_query_text, comp->priv->query_text)) book_data->cache_complete = TRUE; @@ -845,9 +870,9 @@ e_select_names_completion_seq_complete_cb (EBookView *book_view, EBookViewStatus if (!book_data->sequence_complete_received) { book_data->sequence_complete_received = TRUE; - if (book_data->card_added_tag) { - g_signal_handler_disconnect (book_data->book_view, book_data->card_added_tag); - book_data->card_added_tag = 0; + if (book_data->contacts_added_tag) { + g_signal_handler_disconnect (book_data->book_view, book_data->contacts_added_tag); + book_data->contacts_added_tag = 0; } if (book_data->seq_complete_tag) { g_signal_handler_disconnect (book_data->book_view, book_data->seq_complete_tag); @@ -888,13 +913,15 @@ e_select_names_completion_stop_query (ESelectNamesCompletion *comp) for (l = comp->priv->book_data; l; l = l->next) { ESelectNamesCompletionBookData *book_data = l->data; if (book_data->book_view_tag) { +#if notyet e_book_cancel (book_data->book, book_data->book_view_tag); +#endif book_data->book_view_tag = 0; } if (book_data->book_view) { - if (book_data->card_added_tag) { - g_signal_handler_disconnect (book_data->book_view, book_data->card_added_tag); - book_data->card_added_tag = 0; + if (book_data->contacts_added_tag) { + g_signal_handler_disconnect (book_data->book_view, book_data->contacts_added_tag); + book_data->contacts_added_tag = 0; } if (book_data->seq_complete_tag) { g_signal_handler_disconnect (book_data->book_view, book_data->seq_complete_tag); @@ -977,13 +1004,10 @@ e_select_names_completion_start_query (ESelectNamesCompletion *comp, const gchar e_select_names_completion_clear_cache (book_data); book_data->cached_query_text = g_strdup (query_text); - book_data->book_view_tag = e_book_get_completion_view (book_data->book, + book_data->book_view_tag = e_book_async_get_book_view (book_data->book, sexp, e_select_names_completion_got_book_view_cb, book_data); - if (! book_data->book_view_tag) - g_warning ("Exception calling e_book_get_completion_view"); - else - comp->priv->pending_completion_seq++; + comp->priv->pending_completion_seq++; } if (out) diff --git a/addressbook/gui/component/select-names/e-select-names-completion.h b/addressbook/gui/component/select-names/e-select-names-completion.h index 6565208378..435fe80041 100644 --- a/addressbook/gui/component/select-names/e-select-names-completion.h +++ b/addressbook/gui/component/select-names/e-select-names-completion.h @@ -28,7 +28,7 @@ #define E_SELECT_NAMES_COMPLETION_H #include <gal/e-text/e-completion.h> -#include <addressbook/backend/ebook/e-book.h> +#include <addressbook/backend/ebook/e-book-async.h> #include "e-select-names-text-model.h" G_BEGIN_DECLS diff --git a/addressbook/gui/component/select-names/e-select-names-manager.c b/addressbook/gui/component/select-names/e-select-names-manager.c index a3875cea97..e095f7308f 100644 --- a/addressbook/gui/component/select-names/e-select-names-manager.c +++ b/addressbook/gui/component/select-names/e-select-names-manager.c @@ -24,8 +24,8 @@ #include "e-select-names-completion.h" #include "e-select-names-popup.h" #include "e-folder-list.h" -#include <addressbook/backend/ebook/e-book-util.h> -#include <addressbook/backend/ebook/e-destination.h> +#include <addressbook/util/eab-book-util.h> +#include <addressbook/util/eab-destination.h> #include "addressbook/gui/component/addressbook.h" #include <bonobo/bonobo-object.h> @@ -175,7 +175,7 @@ focus_in_cb (GtkWidget *w, GdkEventFocus *ev, gpointer user_data) entry->cleaning_tag = 0; } - e_select_names_model_cancel_cardify_all (entry->model); + e_select_names_model_cancel_all_contact_load (entry->model); return FALSE; } @@ -189,7 +189,7 @@ focus_out_cb (GtkWidget *w, GdkEventFocus *ev, gpointer user_data) gboolean visible = e_entry_completion_popup_is_visible (entry->entry); if (! visible) { - e_select_names_model_cardify_all (entry->model, entry->manager->completion_book, 100); + e_select_names_model_load_all_contacts (entry->model, entry->manager->completion_book, 100); if (entry->cleaning_tag == 0) entry->cleaning_tag = gtk_timeout_add (100, clean_cb, entry); } @@ -205,7 +205,7 @@ completion_popup_cb (EEntry *w, gint visible, gpointer user_data) ESelectNamesManagerEntry *entry = user_data; if (!visible && !GTK_WIDGET_HAS_FOCUS (GTK_WIDGET (entry->entry->canvas))) - e_select_names_model_cardify_all (entry->model, entry->manager->completion_book, 0); + e_select_names_model_load_all_contacts (entry->model, entry->manager->completion_book, 0); #endif } @@ -214,14 +214,14 @@ completion_handler (EEntry *entry, ECompletionMatch *match) { ESelectNamesManagerEntry *mgr_entry; ESelectNamesTextModel *text_model; - EDestination *dest; + EABDestination *dest; gint i, pos, start_pos, len; if (match == NULL || match->user_data == NULL) return; mgr_entry = get_entry_info (entry); - dest = E_DESTINATION (match->user_data); + dest = EAB_DESTINATION (match->user_data); /* Sometimes I really long for garbage collection. Reference counting makes you feel 31337, but sometimes it is just a @@ -377,7 +377,7 @@ e_select_names_manager_discard_saved_models (ESelectNamesManager *manager) static void open_book_cb (EBook *book, EBookStatus status, ESelectNamesManager *manager) { - if (status == E_BOOK_STATUS_SUCCESS) { + if (status == E_BOOK_ERROR_OK) { GList *l; for (l = manager->entries; l; l = l->next) { ESelectNamesManagerEntry *entry = l->data; @@ -398,15 +398,10 @@ load_completion_books (ESelectNamesManager *manager) EFolderListItem *f; for (f = folders; f && f->physical_uri; f++) { - char *uri; EBook *book = e_book_new (); g_object_ref (manager); /* ref ourself before our async call */ - uri = e_book_expand_uri (f->physical_uri); - - addressbook_load_uri (book, uri, (EBookCallback)open_book_cb, manager); - - g_free (uri); + addressbook_load_uri (book, f->physical_uri, (EBookCallback)open_book_cb, manager); } e_folder_list_free_items (folders); } @@ -485,7 +480,7 @@ e_select_names_manager_new (void) ESelectNamesManager *manager = g_object_new (E_TYPE_SELECT_NAMES_MANAGER, NULL); EConfigListener *db; - db = e_book_get_config_database(); + db = eab_get_config_database(); manager->listener_id = g_signal_connect (db, "key_changed", @@ -685,7 +680,7 @@ e_select_names_manager_dispose (GObject *object) } if (manager->listener_id) { - g_signal_handler_disconnect (e_book_get_config_database(), manager->listener_id); + g_signal_handler_disconnect (eab_get_config_database(), manager->listener_id); manager->listener_id = 0; } diff --git a/addressbook/gui/component/select-names/e-select-names-model.c b/addressbook/gui/component/select-names/e-select-names-model.c index 6c3cb0f9c6..d95aebde5d 100644 --- a/addressbook/gui/component/select-names/e-select-names-model.c +++ b/addressbook/gui/component/select-names/e-select-names-model.c @@ -19,7 +19,7 @@ #include "e-select-names-model.h" #include "e-select-names-marshal.h" -#include "addressbook/backend/ebook/e-card-simple.h" +#include "addressbook/backend/ebook/e-contact.h" #define MAX_LENGTH 2047 @@ -35,14 +35,14 @@ static guint e_select_names_model_signals[E_SELECT_NAMES_MODEL_LAST_SIGNAL] = { /* Object argument IDs */ enum { ARG_0, - ARG_CARD, + ARG_CONTACT, }; struct _ESelectNamesModelPrivate { gchar *id; gchar *title; - GList *data; /* of EDestination */ + GList *data; /* of EABDestination */ gint limit; @@ -159,7 +159,7 @@ e_select_names_model_changed (ESelectNamesModel *model) } static void -destination_changed_proxy (EDestination *dest, gpointer closure) +destination_changed_proxy (EABDestination *dest, gpointer closure) { e_select_names_model_changed (E_SELECT_NAMES_MODEL (closure)); } @@ -184,7 +184,7 @@ e_select_names_model_duplicate (ESelectNamesModel *old) model->priv->title = g_strdup (old->priv->title); for (iter = old->priv->data; iter != NULL; iter = g_list_next (iter)) { - EDestination *dup = e_destination_copy (E_DESTINATION (iter->data)); + EABDestination *dup = eab_destination_copy (EAB_DESTINATION (iter->data)); e_select_names_model_append (model, dup); } @@ -212,8 +212,8 @@ e_select_names_model_get_textification (ESelectNamesModel *model, const char *se GList *iter = model->priv->data; while (iter) { - EDestination *dest = E_DESTINATION (iter->data); - strv[i] = (gchar *) e_destination_get_textrep (dest, FALSE); + EABDestination *dest = EAB_DESTINATION (iter->data); + strv[i] = (gchar *) eab_destination_get_textrep (dest, FALSE); ++i; iter = g_list_next (iter); } @@ -252,8 +252,8 @@ e_select_names_model_get_address_text (ESelectNamesModel *model, const char *sep GList *iter = model->priv->data; while (iter) { - EDestination *dest = E_DESTINATION (iter->data); - strv[i] = (gchar *) e_destination_get_address (dest); + EABDestination *dest = EAB_DESTINATION (iter->data); + strv[i] = (gchar *) eab_destination_get_address (dest); if (strv[i]) ++i; iter = g_list_next (iter); @@ -304,43 +304,42 @@ e_select_names_model_at_limit (ESelectNamesModel *model) return model->priv->limit >= 0 && g_list_length (model->priv->data) >= model->priv->limit; } -const EDestination * +const EABDestination * e_select_names_model_get_destination (ESelectNamesModel *model, gint index) { g_return_val_if_fail (model && E_IS_SELECT_NAMES_MODEL (model), NULL); g_return_val_if_fail (0 <= index, NULL); g_return_val_if_fail (index < g_list_length (model->priv->data), NULL); - return E_DESTINATION (g_list_nth_data (model->priv->data, index)); + return EAB_DESTINATION (g_list_nth_data (model->priv->data, index)); } gchar * e_select_names_model_export_destinationv (ESelectNamesModel *model) { - EDestination **destv; + EABDestination **destv; gchar *str; gint i, len = 0; GList *j; g_return_val_if_fail (model && E_IS_SELECT_NAMES_MODEL (model), NULL); len = g_list_length (model->priv->data); - destv = g_new0 (EDestination *, len+1); + destv = g_new0 (EABDestination *, len+1); for (i=0, j = model->priv->data; j != NULL; j = g_list_next (j)) { - EDestination *dest = E_DESTINATION (j->data); + EABDestination *dest = EAB_DESTINATION (j->data); if (dest) destv[i++] = dest; } - str = e_destination_exportv (destv); + str = eab_destination_exportv (destv); g_free (destv); return str; } -static -void send_changed (EDestination *dest, ECard *card, gpointer closure) +static void send_changed (EABDestination *dest, EContact *contact, gpointer closure) { ESelectNamesModel *model = closure; e_select_names_model_changed (model); @@ -350,12 +349,12 @@ void e_select_names_model_import_destinationv (ESelectNamesModel *model, gchar *destinationv) { - EDestination **destv; + EABDestination **destv; gint i; g_return_if_fail (model && E_IS_SELECT_NAMES_MODEL (model)); - destv = e_destination_importv (destinationv); + destv = eab_destination_importv (destinationv); e_select_names_model_delete_all (model); @@ -363,30 +362,30 @@ e_select_names_model_import_destinationv (ESelectNamesModel *model, return; for (i = 0; destv[i]; i++) { - e_destination_use_card (destv[i], send_changed, model); + eab_destination_use_contact (destv[i], send_changed, model); e_select_names_model_append (model, destv[i]); } g_free (destv); } -ECard * -e_select_names_model_get_card (ESelectNamesModel *model, gint index) +EContact * +e_select_names_model_get_contact (ESelectNamesModel *model, gint index) { - const EDestination *dest; + const EABDestination *dest; g_return_val_if_fail (model && E_IS_SELECT_NAMES_MODEL (model), NULL); g_return_val_if_fail (0 <= index, NULL); g_return_val_if_fail (index < g_list_length (model->priv->data), NULL); dest = e_select_names_model_get_destination (model, index); - return dest ? e_destination_get_card (dest) : NULL; + return dest ? eab_destination_get_contact (dest) : NULL; } const gchar * e_select_names_model_get_string (ESelectNamesModel *model, gint index) { - const EDestination *dest; + const EABDestination *dest; g_return_val_if_fail (model && E_IS_SELECT_NAMES_MODEL (model), NULL); g_return_val_if_fail (0 <= index, NULL); @@ -394,11 +393,11 @@ e_select_names_model_get_string (ESelectNamesModel *model, gint index) dest = e_select_names_model_get_destination (model, index); - return dest ? e_destination_get_textrep (dest, FALSE) : ""; + return dest ? eab_destination_get_textrep (dest, FALSE) : ""; } static void -connect_destination (ESelectNamesModel *model, EDestination *dest) +connect_destination (ESelectNamesModel *model, EABDestination *dest) { g_signal_connect (dest, "changed", @@ -407,21 +406,21 @@ connect_destination (ESelectNamesModel *model, EDestination *dest) } static void -disconnect_destination (ESelectNamesModel *model, EDestination *dest) +disconnect_destination (ESelectNamesModel *model, EABDestination *dest) { g_signal_handlers_disconnect_by_func (dest, destination_changed_proxy, model); } gboolean -e_select_names_model_contains (ESelectNamesModel *model, const EDestination *dest) +e_select_names_model_contains (ESelectNamesModel *model, const EABDestination *dest) { GList *iter; g_return_val_if_fail (E_IS_SELECT_NAMES_MODEL (model), FALSE); - g_return_val_if_fail (E_IS_DESTINATION (dest), FALSE); + g_return_val_if_fail (EAB_IS_DESTINATION (dest), FALSE); for (iter = model->priv->data; iter != NULL; iter = g_list_next (iter)) { - if (iter->data != NULL && e_destination_equal (dest, E_DESTINATION (iter->data))) + if (iter->data != NULL && eab_destination_equal (dest, EAB_DESTINATION (iter->data))) return TRUE; } @@ -429,12 +428,12 @@ e_select_names_model_contains (ESelectNamesModel *model, const EDestination *des } void -e_select_names_model_insert (ESelectNamesModel *model, gint index, EDestination *dest) +e_select_names_model_insert (ESelectNamesModel *model, gint index, EABDestination *dest) { g_return_if_fail (model != NULL); g_return_if_fail (E_IS_SELECT_NAMES_MODEL (model)); g_return_if_fail (0 <= index && index <= g_list_length (model->priv->data)); - g_return_if_fail (dest && E_IS_DESTINATION (dest)); + g_return_if_fail (dest && EAB_IS_DESTINATION (dest)); if (e_select_names_model_at_limit (model)) { /* FIXME: This is bad. */ @@ -452,10 +451,10 @@ e_select_names_model_insert (ESelectNamesModel *model, gint index, EDestination } void -e_select_names_model_append (ESelectNamesModel *model, EDestination *dest) +e_select_names_model_append (ESelectNamesModel *model, EABDestination *dest) { g_return_if_fail (model && E_IS_SELECT_NAMES_MODEL (model)); - g_return_if_fail (dest && E_IS_DESTINATION (dest)); + g_return_if_fail (dest && EAB_IS_DESTINATION (dest)); if (e_select_names_model_at_limit (model)) { /* FIXME: This is bad. */ @@ -473,7 +472,7 @@ e_select_names_model_append (ESelectNamesModel *model, EDestination *dest) } void -e_select_names_model_replace (ESelectNamesModel *model, gint index, EDestination *dest) +e_select_names_model_replace (ESelectNamesModel *model, gint index, EABDestination *dest) { GList *node; const gchar *new_str, *old_str; @@ -482,9 +481,9 @@ e_select_names_model_replace (ESelectNamesModel *model, gint index, EDestination g_return_if_fail (model != NULL); g_return_if_fail (E_IS_SELECT_NAMES_MODEL (model)); g_return_if_fail (model->priv->data == NULL || (0 <= index && index < g_list_length (model->priv->data))); - g_return_if_fail (dest && E_IS_DESTINATION (dest)); + g_return_if_fail (dest && EAB_IS_DESTINATION (dest)); - new_str = e_destination_get_textrep (dest, FALSE); + new_str = eab_destination_get_textrep (dest, FALSE); new_strlen = new_str ? strlen (new_str) : 0; if (model->priv->data == NULL) { @@ -500,10 +499,10 @@ e_select_names_model_replace (ESelectNamesModel *model, gint index, EDestination if (node->data != dest) { - disconnect_destination (model, E_DESTINATION (node->data)); + disconnect_destination (model, EAB_DESTINATION (node->data)); connect_destination (model, dest); - old_str = e_destination_get_textrep (E_DESTINATION (node->data), FALSE); + old_str = eab_destination_get_textrep (EAB_DESTINATION (node->data), FALSE); old_strlen = old_str ? strlen (old_str) : 0; g_object_unref (node->data); @@ -523,14 +522,14 @@ void e_select_names_model_delete (ESelectNamesModel *model, gint index) { GList *node; - EDestination *dest; + EABDestination *dest; g_return_if_fail (model != NULL); g_return_if_fail (E_IS_SELECT_NAMES_MODEL (model)); g_return_if_fail (0 <= index && index < g_list_length (model->priv->data)); node = g_list_nth (model->priv->data, index); - dest = E_DESTINATION (node->data); + dest = EAB_DESTINATION (node->data); disconnect_destination (model, dest); g_object_unref (dest); @@ -552,16 +551,16 @@ e_select_names_model_clean (ESelectNamesModel *model, gboolean clean_last_entry) iter = model->priv->data; while (iter) { - EDestination *dest; + EABDestination *dest; next = g_list_next (iter); if (next == NULL && !clean_last_entry) break; - dest = iter->data ? E_DESTINATION (iter->data) : NULL; + dest = iter->data ? EAB_DESTINATION (iter->data) : NULL; - if (dest == NULL || e_destination_is_empty (dest)) { + if (dest == NULL || eab_destination_is_empty (dest)) { if (dest) { disconnect_destination (model, dest); g_object_unref (dest); @@ -581,7 +580,7 @@ e_select_names_model_clean (ESelectNamesModel *model, gboolean clean_last_entry) static void delete_all_iter (gpointer data, gpointer closure) { - disconnect_destination (E_SELECT_NAMES_MODEL (closure), E_DESTINATION (data)); + disconnect_destination (E_SELECT_NAMES_MODEL (closure), EAB_DESTINATION (data)); g_object_unref (data); } @@ -611,9 +610,9 @@ e_select_names_model_overwrite_copy (ESelectNamesModel *dest, ESelectNamesModel e_select_names_model_delete_all (dest); len = e_select_names_model_count (src); for (i = 0; i < len; ++i) { - const EDestination *d = e_select_names_model_get_destination (src, i); + const EABDestination *d = e_select_names_model_get_destination (src, i); if (d) - e_select_names_model_append (dest, e_destination_copy (d)); + e_select_names_model_append (dest, eab_destination_copy (d)); } } @@ -630,9 +629,9 @@ e_select_names_model_merge (ESelectNamesModel *dest, ESelectNamesModel *src) len = e_select_names_model_count (src); for (i = 0; i < len; ++i) { - const EDestination *d = e_select_names_model_get_destination (src, i); + const EABDestination *d = e_select_names_model_get_destination (src, i); if (d && !e_select_names_model_contains (dest, d)) - e_select_names_model_append (dest, e_destination_copy (d)); + e_select_names_model_append (dest, eab_destination_copy (d)); } } @@ -650,7 +649,7 @@ e_select_names_model_name_pos (ESelectNamesModel *model, gint seplen, gint index iter = model->priv->data; while (iter && i <= index) { rp += len + (i > 0 ? seplen : 0); - str = e_destination_get_textrep (E_DESTINATION (iter->data), FALSE); + str = eab_destination_get_textrep (EAB_DESTINATION (iter->data), FALSE); len = str ? g_utf8_strlen (str, -1) : 0; ++i; iter = g_list_next (iter); @@ -680,7 +679,7 @@ e_select_names_model_text_pos (ESelectNamesModel *model, gint seplen, gint pos, iter = model->priv->data; while (iter != NULL) { - str = e_destination_get_textrep (E_DESTINATION (iter->data), FALSE); + str = eab_destination_get_textrep (EAB_DESTINATION (iter->data), FALSE); len = str ? g_utf8_strlen (str, -1) : 0; if (sp <= pos && pos <= sp + len + adj) { @@ -719,65 +718,7 @@ e_select_names_model_text_pos (ESelectNamesModel *model, gint seplen, gint pos, } void -e_select_names_model_cardify (ESelectNamesModel *model, EBook *book, gint index, gint delay) -{ - EDestination *dest; - - g_return_if_fail (E_IS_SELECT_NAMES_MODEL (model)); - g_return_if_fail (book == NULL || E_IS_BOOK (book)); - g_return_if_fail (0 <= index && index < g_list_length (model->priv->data)); - - dest = E_DESTINATION (g_list_nth_data (model->priv->data, index)); - - if (!e_destination_is_empty (dest)) { - - if (delay > 0) - e_destination_cardify_delayed (dest, book, delay); - else - e_destination_cardify (dest, book); - } -} - -gboolean -e_select_names_model_uncardify (ESelectNamesModel *model, gint index) -{ - EDestination *dest; - gboolean rv = FALSE; - - g_return_val_if_fail (E_IS_SELECT_NAMES_MODEL (model), FALSE); - g_return_val_if_fail (0 <= index && index < g_list_length (model->priv->data), FALSE); - - dest = E_DESTINATION (g_list_nth_data (model->priv->data, index)); - - if (!e_destination_is_empty (dest)) { - EDestination *cpy_dest = e_destination_copy (dest); - - rv = e_destination_uncardify (cpy_dest); - - if (rv) { - e_select_names_model_replace (model, index, cpy_dest); - } - - } - - return rv; -} - -void -e_select_names_model_cancel_cardify (ESelectNamesModel *model, gint index) -{ - EDestination *dest; - - g_return_if_fail (E_IS_SELECT_NAMES_MODEL (model)); - g_return_if_fail (0 <= index && index < g_list_length (model->priv->data)); - - dest = E_DESTINATION (g_list_nth_data (model->priv->data, index)); - - e_destination_cancel_cardify (dest); -} - -void -e_select_names_model_cardify_all (ESelectNamesModel *model, EBook *book, gint delay) +e_select_names_model_load_all_contacts (ESelectNamesModel *model, EBook *book) { GList *iter; @@ -785,27 +726,27 @@ e_select_names_model_cardify_all (ESelectNamesModel *model, EBook *book, gint de g_return_if_fail (book == NULL || E_IS_BOOK (book)); for (iter = model->priv->data; iter != NULL; iter = g_list_next (iter)) { - EDestination *dest = E_DESTINATION (iter->data); - if (!e_destination_is_empty (dest)) { + EABDestination *dest = EAB_DESTINATION (iter->data); + if (!eab_destination_is_empty (dest)) { - if (delay > 0) - e_destination_cardify_delayed (dest, book, delay); - else - e_destination_cardify (dest, book); + eab_destination_load_contact (dest, book); } } } void -e_select_names_model_cancel_cardify_all (ESelectNamesModel *model) +e_select_names_model_cancel_all_contact_load (ESelectNamesModel *model) { GList *iter; g_return_if_fail (E_IS_SELECT_NAMES_MODEL (model)); for (iter = model->priv->data; iter != NULL; iter = g_list_next (iter)) { - EDestination *dest = E_DESTINATION (iter->data); - e_destination_cancel_cardify (dest); + EABDestination *dest = EAB_DESTINATION (iter->data); + if (!eab_destination_is_empty (dest)) { + + eab_destination_cancel_contact_load (dest); + } } } diff --git a/addressbook/gui/component/select-names/e-select-names-model.h b/addressbook/gui/component/select-names/e-select-names-model.h index 8a3c5381b7..41d5100f59 100644 --- a/addressbook/gui/component/select-names/e-select-names-model.h +++ b/addressbook/gui/component/select-names/e-select-names-model.h @@ -15,8 +15,8 @@ #include <gtk/gtkobject.h> #include <stdio.h> #include <e-util/e-list.h> -#include <addressbook/backend/ebook/e-card.h> -#include <addressbook/backend/ebook/e-destination.h> +#include <addressbook/backend/ebook/e-contact.h> +#include <addressbook/util/eab-destination.h> #define E_TYPE_SELECT_NAMES_MODEL (e_select_names_model_get_type ()) #define E_SELECT_NAMES_MODEL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), E_TYPE_SELECT_NAMES_MODEL, ESelectNamesModel)) @@ -54,18 +54,18 @@ gint e_select_names_model_get_limit (ESelectNamesModel void e_select_names_model_set_limit (ESelectNamesModel *model, gint limit); gboolean e_select_names_model_at_limit (ESelectNamesModel *model); -const EDestination *e_select_names_model_get_destination (ESelectNamesModel *model, gint index); -gchar *e_select_names_model_export_destinationv (ESelectNamesModel *model); -void e_select_names_model_import_destinationv (ESelectNamesModel *model, +const EABDestination *e_select_names_model_get_destination (ESelectNamesModel *model, gint index); +gchar *e_select_names_model_export_destinationv (ESelectNamesModel *model); +void e_select_names_model_import_destinationv (ESelectNamesModel *model, gchar *destinationv); -ECard *e_select_names_model_get_card (ESelectNamesModel *model, gint index); +EContact *e_select_names_model_get_contact (ESelectNamesModel *model, gint index); const gchar *e_select_names_model_get_string (ESelectNamesModel *model, gint index); -gboolean e_select_names_model_contains (ESelectNamesModel *model, const EDestination *dest); +gboolean e_select_names_model_contains (ESelectNamesModel *model, const EABDestination *dest); -void e_select_names_model_insert (ESelectNamesModel *model, gint index, EDestination *dest); -void e_select_names_model_append (ESelectNamesModel *model, EDestination *dest); -void e_select_names_model_replace (ESelectNamesModel *model, gint index, EDestination *dest); +void e_select_names_model_insert (ESelectNamesModel *model, gint index, EABDestination *dest); +void e_select_names_model_append (ESelectNamesModel *model, EABDestination *dest); +void e_select_names_model_replace (ESelectNamesModel *model, gint index, EABDestination *dest); void e_select_names_model_delete (ESelectNamesModel *model, gint index); void e_select_names_model_delete_all (ESelectNamesModel *model); void e_select_names_model_overwrite_copy (ESelectNamesModel *dest, ESelectNamesModel *src); @@ -76,11 +76,8 @@ void e_select_names_model_clean (ESelectNamesModel *model, gboolea void e_select_names_model_name_pos (ESelectNamesModel *model, gint seplen, gint index, gint *pos, gint *length); void e_select_names_model_text_pos (ESelectNamesModel *model, gint seplen, gint pos, gint *index, gint *start_pos, gint *length); -void e_select_names_model_cardify (ESelectNamesModel *model, EBook *book, gint index, gint delay); -gboolean e_select_names_model_uncardify (ESelectNamesModel *model, gint index); -void e_select_names_model_cancel_cardify (ESelectNamesModel *model, gint index); -void e_select_names_model_cardify_all (ESelectNamesModel *model, EBook *book, gint delay); -void e_select_names_model_cancel_cardify_all (ESelectNamesModel *model); +void e_select_names_model_load_all_contacts (ESelectNamesModel *model, EBook *book); +void e_select_names_model_cancel_all_contact_load (ESelectNamesModel *model); /* This is a mildly annoying freeze/thaw pair, in that it only applies to the 'changed' signal and not to 'resized'. This could cause unexpected results in some cases. */ diff --git a/addressbook/gui/component/select-names/e-select-names-popup.c b/addressbook/gui/component/select-names/e-select-names-popup.c index d7fabd9426..bb0f331516 100644 --- a/addressbook/gui/component/select-names/e-select-names-popup.c +++ b/addressbook/gui/component/select-names/e-select-names-popup.c @@ -39,10 +39,11 @@ #include <gtk/gtklabel.h> #include <libgnome/gnome-i18n.h> -#include <addressbook/backend/ebook/e-book-util.h> +#include <addressbook/util/eab-book-util.h> #include <addressbook/gui/contact-editor/e-contact-editor.h> +#include <addressbook/gui/contact-list-editor/e-contact-list-editor.h> #include <addressbook/gui/contact-editor/e-contact-quick-add.h> -#include "e-addressbook-util.h" +#include "eab-gui-util.h" #include "e-select-names-popup.h" #define LIST_ICON_FILENAME "contact-list-16.png" @@ -51,13 +52,13 @@ typedef struct _PopupInfo PopupInfo; struct _PopupInfo { ESelectNamesTextModel *text_model; - EDestination *dest; + EABDestination *dest; gint pos; gint index; }; static PopupInfo * -popup_info_new (ESelectNamesTextModel *text_model, EDestination *dest, gint pos, gint index) +popup_info_new (ESelectNamesTextModel *text_model, EABDestination *dest, gint pos, gint index) { PopupInfo *info = g_new0 (PopupInfo, 1); info->text_model = text_model; @@ -97,29 +98,29 @@ popup_info_cleanup (GtkWidget *w, gpointer info) /* You are in a maze of twisty little callbacks, all alike... */ +#if TOO_MANY_MENU_ITEMS static void make_contact_editor_cb (EBook *book, gpointer user_data) { if (book) { - EDestination *dest = E_DESTINATION (user_data); - ECard *card; + EABDestination *dest = EAB_DESTINATION (user_data); + EContact *contact; - card = (ECard *) e_destination_get_card (dest); - if (e_card_evolution_list (card)) { + contact = (EContact *) eab_destination_get_contact (dest); + if (e_contact_get (contact, E_CONTACT_IS_LIST)) { EContactListEditor *ce; - ce = e_addressbook_show_contact_list_editor (book, card, FALSE, TRUE); + ce = e_addressbook_show_contact_list_editor (book, contact, FALSE, TRUE); e_contact_list_editor_raise (ce); } else { EContactEditor *ce; - ce = e_addressbook_show_contact_editor (book, card, FALSE, TRUE); + ce = e_addressbook_show_contact_editor (book, contact, FALSE, TRUE); e_contact_editor_raise (ce); } g_object_unref (dest); } } -#if TOO_MANY_MENU_ITEMS static void edit_contact_info_cb (GtkWidget *w, gpointer user_data) { @@ -137,7 +138,7 @@ change_email_num_cb (GtkWidget *w, gpointer user_data) { PopupInfo *info = (PopupInfo *) user_data; gint n; - EDestination *dest; + EABDestination *dest; if (info == NULL) return; @@ -147,9 +148,9 @@ change_email_num_cb (GtkWidget *w, gpointer user_data) n = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (w), "number")); - if (n != e_destination_get_email_num (info->dest)) { - dest = e_destination_new (); - e_destination_set_card (dest, e_destination_get_card (info->dest), n); + if (n != eab_destination_get_email_num (info->dest)) { + dest = eab_destination_new (); + eab_destination_set_contact (dest, eab_destination_get_contact (info->dest), n); e_select_names_model_replace (info->text_model->source, info->index, dest); } } @@ -174,7 +175,7 @@ toggle_html_mail_cb (GtkWidget *w, gpointer user_data) { PopupInfo *info = (PopupInfo *) user_data; GtkCheckMenuItem *item = GTK_CHECK_MENU_ITEM (w); - const EDestination *dest; + const EABDestination *dest; if (info == NULL) return; @@ -182,19 +183,19 @@ toggle_html_mail_cb (GtkWidget *w, gpointer user_data) dest = info->dest; item = GTK_CHECK_MENU_ITEM (item); - e_destination_set_html_mail_pref ((EDestination *) dest, item->active); + eab_destination_set_html_mail_pref ((EABDestination *) dest, item->active); } #endif static void -populate_popup_card (GtkWidget *pop, gboolean list, PopupInfo *info) +populate_popup_contact (GtkWidget *pop, gboolean list, PopupInfo *info) { GtkWidget *image; - ECard *card; - EIterator *iterator; + EContact *contact; GtkWidget *menuitem; + GList *email_list; - card = e_destination_get_card (info->dest); + contact = eab_destination_get_contact (info->dest); #if TOO_MANY_MENU_ITEMS menuitem = gtk_separator_menu_item_new(); @@ -224,7 +225,7 @@ populate_popup_card (GtkWidget *pop, gboolean list, PopupInfo *info) menuitem = gtk_check_menu_item_new_with_label (_("Send HTML Mail?")); gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (menuitem), - e_destination_get_html_mail_pref (info->dest)); + eab_destination_get_html_mail_pref (info->dest)); g_signal_connect (menuitem, "toggled", G_CALLBACK (toggle_html_mail_cb), info); @@ -232,25 +233,27 @@ populate_popup_card (GtkWidget *pop, gboolean list, PopupInfo *info) gtk_menu_shell_prepend (GTK_MENU_SHELL (pop), menuitem); #endif - if (card->email) { + email_list = e_contact_get (contact, E_CONTACT_EMAIL); + + if (email_list) { menuitem = gtk_separator_menu_item_new(); gtk_widget_show (menuitem); gtk_menu_shell_prepend (GTK_MENU_SHELL (pop), menuitem); - if (e_list_length (card->email) > 1) { + if (g_list_length (email_list) > 1) { + GList *l; GSList *radiogroup = NULL; - gint n = e_destination_get_email_num (info->dest); - gint j = e_list_length (card->email) - 1; + gint n = eab_destination_get_email_num (info->dest); + gint j = g_list_length (email_list) - 1; - iterator = e_list_get_iterator (card->email); - for (e_iterator_last (iterator); e_iterator_is_valid (iterator); e_iterator_prev (iterator)) { - char *email = (char *)e_iterator_get (iterator); + for (l = g_list_last (email_list); l; l = l->prev) { + char *email = l->data; char *label = NULL; if (!strncmp (email, "<?xml", 5)) { - EDestination *dest = e_destination_import (email); + EABDestination *dest = eab_destination_import (email); if (dest) { - label = g_strdup (e_destination_get_textrep (dest, TRUE)); + label = g_strdup (eab_destination_get_textrep (dest, TRUE)); g_object_unref (dest); } } @@ -280,13 +283,14 @@ populate_popup_card (GtkWidget *pop, gboolean list, PopupInfo *info) g_free (label); } - - g_object_unref (iterator); } else { - menuitem = gtk_menu_item_new_with_label (e_destination_get_email (info->dest)); + menuitem = gtk_menu_item_new_with_label (eab_destination_get_email (info->dest)); gtk_widget_show (menuitem); gtk_menu_shell_prepend (GTK_MENU_SHELL (pop), menuitem); } + + g_list_foreach (email_list, (GFunc)g_free, NULL); + g_list_free (email_list); } menuitem = gtk_separator_menu_item_new (); @@ -297,7 +301,7 @@ populate_popup_card (GtkWidget *pop, gboolean list, PopupInfo *info) ? EVOLUTION_IMAGESDIR "/" LIST_ICON_FILENAME : EVOLUTION_IMAGESDIR "/" CONTACT_ICON_FILENAME); gtk_widget_show (image); - menuitem = gtk_image_menu_item_new_with_label (e_destination_get_name (info->dest)); + menuitem = gtk_image_menu_item_new_with_label (eab_destination_get_name (info->dest)); gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image); gtk_widget_show (menuitem); @@ -308,11 +312,11 @@ static void quick_add_cb (GtkWidget *w, gpointer user_data) { PopupInfo *info = (PopupInfo *) user_data; - e_contact_quick_add_free_form (e_destination_get_address (info->dest), NULL, NULL); + e_contact_quick_add_free_form (eab_destination_get_address (info->dest), NULL, NULL); } static void -populate_popup_nocard (GtkWidget *pop, PopupInfo *info) +populate_popup_nocontact (GtkWidget *pop, PopupInfo *info) { const gchar *str; GtkWidget *menuitem; @@ -331,7 +335,7 @@ populate_popup_nocard (GtkWidget *pop, PopupInfo *info) #if TOO_MANY_MENU_ITEMS menuitem = gtk_check_menu_item_new_with_label (_("Send HTML Mail?")); gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (menuitem), - e_destination_get_html_mail_pref (info->dest)); + eab_destination_get_html_mail_pref (info->dest)); g_signal_connect (menuitem, "toggled", G_CALLBACK (toggle_html_mail_cb), info); @@ -343,9 +347,9 @@ populate_popup_nocard (GtkWidget *pop, PopupInfo *info) gtk_widget_show (menuitem); gtk_menu_shell_prepend (GTK_MENU_SHELL (pop), menuitem); - str = e_destination_get_name (info->dest); + str = eab_destination_get_name (info->dest); if (! (str && *str)) - str = e_destination_get_email (info->dest); + str = eab_destination_get_email (info->dest); if (! (str && *str)) str = _("Unnamed Contact"); @@ -360,7 +364,7 @@ e_select_names_populate_popup (GtkWidget *menu, ESelectNamesTextModel *text_mode { ESelectNamesModel *model; PopupInfo *info; - EDestination *dest; + EABDestination *dest; gint index; g_return_if_fail (GTK_IS_MENU_SHELL (menu)); @@ -375,16 +379,16 @@ e_select_names_populate_popup (GtkWidget *menu, ESelectNamesTextModel *text_mode return; /* XXX yuck, why does this return a const? */ - dest = (EDestination *)e_select_names_model_get_destination (model, index); - if (e_destination_is_empty (dest)) + dest = (EABDestination *)e_select_names_model_get_destination (model, index); + if (eab_destination_is_empty (dest)) return; info = popup_info_new (text_model, dest, pos, index); - if (e_destination_contains_card (dest)) { - populate_popup_card (menu, e_destination_is_evolution_list (dest), info); + if (eab_destination_get_contact (dest)) { + populate_popup_contact (menu, eab_destination_is_evolution_list (dest), info); } else { - populate_popup_nocard (menu, info); + populate_popup_nocontact (menu, info); } /* Clean up our info item after we've made our selection. */ diff --git a/addressbook/gui/component/select-names/e-select-names-table-model.c b/addressbook/gui/component/select-names/e-select-names-table-model.c index 1c55c3804d..14261e9d80 100644 --- a/addressbook/gui/component/select-names/e-select-names-table-model.c +++ b/addressbook/gui/component/select-names/e-select-names-table-model.c @@ -16,7 +16,7 @@ #include <libgnome/gnome-i18n.h> #include "e-select-names-table-model.h" -#include "addressbook/backend/ebook/e-card-simple.h" +#include "addressbook/backend/ebook/e-contact.h" /* Object argument IDs */ enum { @@ -118,21 +118,19 @@ fill_in_info (ESelectNamesTableModel *model) model->data = g_new(ESelectNamesTableModelData, count); for (i = 0; i < count; ++i) { - const EDestination *dest = e_select_names_model_get_destination (model->source, i); - ECard *card = dest ? e_destination_get_card (dest) : NULL; + const EABDestination *dest = e_select_names_model_get_destination (model->source, i); + EContact *contact = dest ? eab_destination_get_contact (dest) : NULL; - if (card) { - ECardSimple *simple = e_card_simple_new(card); - model->data[i].name = e_card_simple_get(simple, E_CARD_SIMPLE_FIELD_NAME_OR_ORG); + if (contact) { + model->data[i].name = e_contact_get(contact, E_CONTACT_FULL_NAME); if (model->data[i].name == 0) model->data[i].name = g_strdup(""); - model->data[i].email = e_card_simple_get(simple, E_CARD_SIMPLE_FIELD_EMAIL); + model->data[i].email = e_contact_get(contact, E_CONTACT_EMAIL_1); if (model->data[i].email == 0) model->data[i].email = g_strdup(""); - g_object_unref(simple); } else { - const gchar *name = e_destination_get_name (dest); - const gchar *email = e_destination_get_email (dest); + const gchar *name = eab_destination_get_name (dest); + const gchar *email = eab_destination_get_email (dest); model->data[i].name = g_strdup (name && *name ? name : email); model->data[i].email = g_strdup (email); diff --git a/addressbook/gui/component/select-names/e-select-names-text-model.c b/addressbook/gui/component/select-names/e-select-names-text-model.c index 7859d5b056..e885de5bf6 100644 --- a/addressbook/gui/component/select-names/e-select-names-text-model.c +++ b/addressbook/gui/component/select-names/e-select-names-text-model.c @@ -19,7 +19,7 @@ #include <addressbook/gui/contact-editor/e-contact-editor.h> #include "e-select-names-text-model.h" -#include "e-addressbook-util.h" +#include "eab-gui-util.h" static FILE *out = NULL; /* stream for debugging spew */ @@ -137,7 +137,7 @@ dump_model (ESelectNamesTextModel *text_model) for (i=0; i<e_select_names_model_count (model); ++i) fprintf (out, "[%d] \"%s\" %s\n", i, e_select_names_model_get_string (model, i), - e_select_names_model_get_card (model, i) ? "<card>" : ""); + e_select_names_model_get_contact (model, i) ? "<contact>" : ""); fprintf (out, "\n"); } @@ -372,9 +372,9 @@ e_select_names_text_model_insert_length (ETextModel *model, gint pos, const gcha /* Is this a quoted or an unquoted separator we are dealing with? */ if (ut == g_utf8_get_char(text_model->sep) && index >= 0) { - const EDestination *dest = e_select_names_model_get_destination (source, index); + const EABDestination *dest = e_select_names_model_get_destination (source, index); if (dest) { - const gchar *str = e_destination_get_textrep (dest, FALSE); + const gchar *str = eab_destination_get_textrep (dest, FALSE); int j; const char *jp; @@ -400,8 +400,8 @@ e_select_names_text_model_insert_length (ETextModel *model, gint pos, const gcha if (index == -1) { EReposAbsolute repos; - e_select_names_model_insert (source, 0, e_destination_new ()); - e_select_names_model_insert (source, 0, e_destination_new ()); + e_select_names_model_insert (source, 0, eab_destination_new ()); + e_select_names_model_insert (source, 0, eab_destination_new ()); repos.model = model; repos.pos = -1; /* At end */ @@ -420,7 +420,7 @@ e_select_names_text_model_insert_length (ETextModel *model, gint pos, const gcha (e_select_names_model_get_string (source, ins_point) == NULL)) || (ins_point > 0 && (e_select_names_model_get_string (source, ins_point-1) == NULL)))) { - e_select_names_model_insert (source, ins_point, e_destination_new ()); + e_select_names_model_insert (source, ins_point, eab_destination_new ()); repos.model = model; repos.pos = pos; @@ -435,10 +435,10 @@ e_select_names_text_model_insert_length (ETextModel *model, gint pos, const gcha const gchar *str = e_select_names_model_get_string (source, index); gchar *str1 = g_strndup (str, offset); gchar *str2 = g_strdup (str+offset); - EDestination *d1 = e_destination_new (), *d2 = e_destination_new (); + EABDestination *d1 = eab_destination_new (), *d2 = eab_destination_new (); - e_destination_set_raw (d1, str1); - e_destination_set_raw (d2, str2); + eab_destination_set_raw (d1, str1); + eab_destination_set_raw (d2, str2); e_select_names_model_replace (source, index, d1); e_select_names_model_insert (source, index+1, d2); @@ -498,9 +498,9 @@ e_select_names_text_model_insert_length (ETextModel *model, gint pos, const gcha if (new_str->len) { - EDestination *dest; - dest = index >= 0 ? e_destination_copy (e_select_names_model_get_destination (source, index)) : e_destination_new (); - e_destination_set_raw (dest, new_str->str); + EABDestination *dest; + dest = index >= 0 ? eab_destination_copy (e_select_names_model_get_destination (source, index)) : eab_destination_new (); + eab_destination_set_raw (dest, new_str->str); e_select_names_model_replace (source, index, dest); /* e_select_names_model_replace (source, index, dest); */ @@ -589,7 +589,7 @@ e_select_names_text_model_delete (ETextModel *model, gint pos, gint length) if (index+1 < e_select_names_model_count (source)) { EReposDeleteShift repos; - EDestination *new_dest; + EABDestination *new_dest; const gchar *str1 = e_select_names_model_get_string (source, index); const gchar *str2 = e_select_names_model_get_string (source, index+1); gchar *new_str; @@ -613,8 +613,8 @@ e_select_names_text_model_delete (ETextModel *model, gint pos, gint length) e_select_names_model_delete (source, index+1); - new_dest = e_destination_new (); - e_destination_set_raw (new_dest, new_str); + new_dest = eab_destination_new (); + eab_destination_set_raw (new_dest, new_str); e_select_names_model_replace (source, index, new_dest); g_free (new_str); @@ -689,7 +689,7 @@ e_select_names_text_model_delete (ETextModel *model, gint pos, gint length) char *np; int i; EReposDeleteShift repos; - EDestination *dest; + EABDestination *dest; new_str = g_new0 (char, strlen (str) * 6 + 1); /* worse case it can't be any longer than this */ @@ -718,8 +718,8 @@ e_select_names_text_model_delete (ETextModel *model, gint pos, gint length) np = g_utf8_next_char (np); } - dest = index >= 0 ? e_destination_copy (e_select_names_model_get_destination (source, index)) : e_destination_new (); - e_destination_set_raw (dest, new_str); + dest = index >= 0 ? eab_destination_copy (e_select_names_model_get_destination (source, index)) : eab_destination_new (); + eab_destination_set_raw (dest, new_str); e_select_names_model_replace (source, index, dest); if (out) @@ -764,10 +764,10 @@ e_select_names_text_model_obj_count (ETextModel *model) count = i = e_select_names_model_count (source); while (i > 0) { - const EDestination *dest; + const EABDestination *dest; --i; dest = e_select_names_model_get_destination (source, i); - if (e_destination_get_card (dest) == NULL) + if (eab_destination_get_contact (dest) == NULL) --count; } @@ -783,8 +783,8 @@ nth_obj_index (ESelectNamesModel *source, gint n) N = e_select_names_model_count (source); do { - const EDestination *dest = e_select_names_model_get_destination (source, i); - if (e_destination_get_card (dest)) + const EABDestination *dest = e_select_names_model_get_destination (source, i); + if (eab_destination_get_contact (dest)) --n; ++i; } while (n >= 0 && i < N); @@ -820,27 +820,32 @@ e_select_names_text_model_get_nth_obj (ETextModel *model, gint n, gint *len) static void e_select_names_text_model_activate_obj (ETextModel *model, gint n) { +#if notyet + /* XXX the new ebook doesn't have e_contact_get_book, and we + don't really want to add it, so this can't be implemented + this simply anymore */ ESelectNamesModel *source = E_SELECT_NAMES_TEXT_MODEL (model)->source; - ECard *card; + EContact *contact; gint i; i = nth_obj_index (source, n); g_return_if_fail (i >= 0); - card = e_select_names_model_get_card (source, i); - g_return_if_fail (card != NULL); + contact = e_select_names_model_get_contact (source, i); + g_return_if_fail (contact != NULL); /* present read-only contact editor when someone double clicks from here */ - if (e_card_evolution_list (card)) { + if (e_contact_get (contact, E_CONTACT_IS_LIST)) { EContactListEditor *ce; - ce = e_addressbook_show_contact_list_editor (e_card_get_book(card), card, FALSE, FALSE); + ce = e_addressbook_show_contact_list_editor (e_contact_get_book(contact), contact, FALSE, FALSE); e_contact_list_editor_raise (ce); } else { - EContactEditor *ce; - ce = e_addressbook_show_contact_editor (e_card_get_book(card), card, FALSE, FALSE); + EABContactEditor *ce; + ce = e_addressbook_show_contact_editor (e_contact_get_book(contact), contact, FALSE, FALSE); e_contact_editor_raise (ce); } +#endif } diff --git a/addressbook/gui/component/select-names/e-select-names.c b/addressbook/gui/component/select-names/e-select-names.c index f009fbbd63..b50a6d0ca0 100644 --- a/addressbook/gui/component/select-names/e-select-names.c +++ b/addressbook/gui/component/select-names/e-select-names.c @@ -30,9 +30,8 @@ #include <addressbook/gui/widgets/e-addressbook-model.h> #include <addressbook/gui/widgets/e-addressbook-table-adapter.h> -#include <addressbook/gui/component/e-cardlist-model.h> -#include <addressbook/backend/ebook/e-book.h> -#include <addressbook/backend/ebook/e-book-util.h> +#include <addressbook/backend/ebook/e-book-async.h> +#include <addressbook/util/eab-book-util.h> #include <addressbook/gui/component/addressbook-component.h> #include <addressbook/gui/component/addressbook-storage.h> #include <addressbook/gui/component/addressbook.h> @@ -40,7 +39,7 @@ #include <shell/evolution-folder-selector-button.h> #include "e-select-names.h" -#include <addressbook/backend/ebook/e-card-simple.h> +#include <addressbook/backend/ebook/e-contact.h> #include "e-select-names-table-model.h" #include <gal/widgets/e-categories-master-list-option-menu.h> #include <gal/e-text/e-entry.h> @@ -113,7 +112,7 @@ GtkWidget *e_addressbook_create_ebook_table(char *name, char *string1, char *str GtkWidget *e_addressbook_create_folder_selector(char *name, char *string1, char *string2, int num1, int num2); static void -search_result (EAddressbookModel *model, EBookViewStatus status, ESelectNames *esn) +search_result (EABModel *model, EBookViewStatus status, ESelectNames *esn) { sync_table_and_models (NULL, esn); } @@ -131,19 +130,15 @@ set_book(EBook *book, EBookStatus status, ESelectNames *esn) } static void -addressbook_model_set_uri(ESelectNames *e_select_names, EAddressbookModel *model, const char *uri) +addressbook_model_set_uri(ESelectNames *e_select_names, EABModel *model, const char *uri) { EBook *book; - char *book_uri; - - book_uri = e_book_expand_uri (uri); /* If uri == the current uri, then we don't have to do anything */ - book = e_addressbook_model_get_ebook (model); + book = eab_model_get_ebook (model); if (book) { const gchar *current_uri = e_book_get_uri (book); - if (current_uri && !strcmp (book_uri, current_uri)) { - g_free (book_uri); + if (current_uri && !strcmp (uri, current_uri)) { return; } } @@ -152,25 +147,28 @@ addressbook_model_set_uri(ESelectNames *e_select_names, EAddressbookModel *model g_object_ref(e_select_names); g_object_ref(model); - addressbook_load_uri(book, book_uri, (EBookCallback) set_book, e_select_names); - - g_free (book_uri); + addressbook_load_uri(book, uri, (EBookCallback) set_book, e_select_names); } static void * -card_key (ECard *card) +contact_key (const EContact *contact) { - EBook *book; + EBook *book = NULL; const gchar *book_uri; - if (card == NULL) + if (contact == NULL) return NULL; - g_assert (E_IS_CARD (card)); + g_assert (E_IS_CONTACT (contact)); - book = e_card_get_book (card); +#if notyet + /* XXX we need a way to reproduce this here somehow.. or at + least make sure we never collide between two contacts in + different books. */ + book = e_contact_get_book (contact); +#endif book_uri = book ? e_book_get_uri (book) : "NoBook"; - return g_strdup_printf ("%s|%s", book_uri ? book_uri : "NoURI", e_card_get_id (card)); + return g_strdup_printf ("%s|%s", book_uri ? book_uri : "NoURI", (char*)e_contact_get_const ((EContact*)contact, E_CONTACT_UID)); } static void @@ -180,14 +178,14 @@ sync_one_model (gpointer k, gpointer val, gpointer closure) ESelectNamesChild *child = val; ESelectNamesModel *model = child->source; gint i, count; - ECard *card; + EContact *contact; void *key; count = e_select_names_model_count (model); for (i = 0; i < count; ++i) { - card = e_select_names_model_get_card (model, i); - if (card) { - key = card_key (card); + contact = e_select_names_model_get_contact (model, i); + if (contact) { + key = contact_key (contact); e_table_without_hide (etw, key); g_free (key); } @@ -206,21 +204,19 @@ real_add_address_cb (int model_row, gpointer closure) { ESelectNamesChild *child = closure; ESelectNames *names = child->names; - ECard *card; - EDestination *dest = e_destination_new (); + const EContact *contact; + EABDestination *dest = eab_destination_new (); gint mapped_row; mapped_row = e_table_subset_view_to_model_row (E_TABLE_SUBSET (names->without), model_row); - card = e_addressbook_model_get_card (E_ADDRESSBOOK_MODEL(names->model), mapped_row); + contact = eab_model_contact_at (EAB_MODEL(names->model), mapped_row); - if (card != NULL) { - e_destination_set_card (dest, card, 0); + if (contact != NULL) { + eab_destination_set_contact (dest, (EContact*)contact, 0); e_select_names_model_append (child->source, dest); e_select_names_model_clean (child->source, FALSE); - - g_object_unref(card); } } @@ -266,10 +262,9 @@ selection_change (ETable *table, ESelectNames *names) static void * esn_get_key_fn (ETableModel *source, int row, void *closure) { - EAddressbookModel *model = E_ADDRESSBOOK_MODEL (closure); - ECard *card = e_addressbook_model_get_card (model, row); - void *key = card_key (card); - g_object_unref (card); + EABModel *model = EAB_MODEL (closure); + const EContact *contact = eab_model_contact_at (model, row); + void *key = contact_key (contact); return key; } @@ -297,11 +292,11 @@ e_addressbook_create_ebook_table(char *name, char *string1, char *string2, int n { ETableModel *adapter; ETableModel *without; - EAddressbookModel *model; + EABModel *model; GtkWidget *table; - model = e_addressbook_model_new (); - adapter = E_TABLE_MODEL (e_addressbook_table_adapter_new (model)); + model = eab_model_new (); + adapter = E_TABLE_MODEL (eab_table_adapter_new (model)); g_object_set(model, "editable", FALSE, @@ -340,7 +335,7 @@ folder_selected (EvolutionFolderSelectorButton *button, GNOME_Evolution_Folder * { addressbook_model_set_uri(e_select_names, e_select_names->model, folder->physicalUri); - e_config_listener_set_string (e_book_get_config_database(), + e_config_listener_set_string (eab_get_config_database(), "/apps/evolution/addressbook/select_names/last_used_uri", folder->physicalUri); } @@ -392,7 +387,7 @@ update_query (GtkWidget *widget, ESelectNames *e_select_names) } static void -status_message (EAddressbookModel *model, const gchar *message, ESelectNames *e_select_names) +status_message (EABModel *model, const gchar *message, ESelectNames *e_select_names) { if (message == NULL) gtk_label_set_text (GTK_LABEL (e_select_names->status_message), ""); @@ -424,7 +419,7 @@ select_entry_changed (GtkWidget *widget, ESelectNames *e_select_names) int model_row = e_table_view_to_model_row (table, i); char *row_strcoll_string = g_utf8_collate_key (e_table_model_value_at (e_select_names->without, - E_CARD_SIMPLE_FIELD_NAME_OR_ORG, + E_CONTACT_FULL_NAME, model_row), -1); if (g_utf8_collate (select_strcoll_string, row_strcoll_string) <= 0) { @@ -637,12 +632,14 @@ e_select_names_new (EvolutionShellClient *shell_client) e_select_names = g_object_new (E_TYPE_SELECT_NAMES, NULL); - db = e_book_get_config_database (); + db = eab_get_config_database (); contacts_uri = e_config_listener_get_string_with_default ( db, "/apps/evolution/addressbook/select_names/last_used_uri", NULL, NULL); +#if notyet if (!contacts_uri) contacts_uri = g_strdup (e_book_get_default_book_uri ()); +#endif button = glade_xml_get_widget (e_select_names->gui, "folder-selector"); evolution_folder_selector_button_construct (EVOLUTION_FOLDER_SELECTOR_BUTTON (button), diff --git a/addressbook/gui/component/select-names/e-select-names.h b/addressbook/gui/component/select-names/e-select-names.h index 8e672da92a..e67f64b70b 100644 --- a/addressbook/gui/component/select-names/e-select-names.h +++ b/addressbook/gui/component/select-names/e-select-names.h @@ -67,7 +67,7 @@ struct _ESelectNames ETableScrolled *table; ETableModel *adapter; ETableModel *without; - EAddressbookModel *model; + EABModel *model; GtkWidget *categories; GtkWidget *select_entry; GtkWidget *status_message; diff --git a/addressbook/gui/component/select-names/e-simple-card-bonobo.c b/addressbook/gui/component/select-names/e-simple-card-bonobo.c deleted file mode 100644 index 07203618b3..0000000000 --- a/addressbook/gui/component/select-names/e-simple-card-bonobo.c +++ /dev/null @@ -1,216 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-simple-card-bonobo.c - * - * Copyright (C) 2000 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: - * Ettore Perazzoli <ettore@ximian.com> - * Chris Lahey <clahey@ximian.com> - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include "e-simple-card-bonobo.h" - -#include <gal/util/e-util.h> - -#include "Evolution-Addressbook-SelectNames.h" - - -#define PARENT_TYPE BONOBO_TYPE_OBJECT -static BonoboObjectClass *parent_class = NULL; - -struct _ESimpleCardBonoboPrivate { - ECardSimple *card_simple; -}; - - - -static GNOME_Evolution_Addressbook_SimpleCard_Arbitrary * -impl_SimpleCard_get_arbitrary (PortableServer_Servant servant, - const CORBA_char *key, - CORBA_Environment *ev) -{ - ESimpleCardBonobo *simple_card; - ESimpleCardBonoboPrivate *priv; - GNOME_Evolution_Addressbook_SimpleCard_Arbitrary *ret_val = GNOME_Evolution_Addressbook_SimpleCard_Arbitrary__alloc (); - - simple_card = E_SIMPLE_CARD_BONOBO (bonobo_object (servant)); - priv = simple_card->priv; - - if (priv->card_simple) { - const ECardArbitrary *arbitrary = e_card_simple_get_arbitrary (priv->card_simple, key); - ret_val->key = CORBA_string_dup (arbitrary->key); - ret_val->value = CORBA_string_dup (arbitrary->value); - ret_val->type = CORBA_string_dup (arbitrary->type); - } else { - ret_val->key = CORBA_string_dup (""); - ret_val->value = CORBA_string_dup (""); - ret_val->type = CORBA_string_dup (""); - } - - return ret_val; -} - -static void -impl_SimpleCard_set_arbitrary (PortableServer_Servant servant, - const CORBA_char *key, - const CORBA_char *type, - const CORBA_char *value, - CORBA_Environment *ev) -{ - ESimpleCardBonobo *simple_card; - ESimpleCardBonoboPrivate *priv; - - simple_card = E_SIMPLE_CARD_BONOBO (bonobo_object (servant)); - priv = simple_card->priv; - - if (priv->card_simple) { - e_card_simple_set_arbitrary (priv->card_simple, key, type, value); - } -} - -static CORBA_char * -impl_SimpleCard_get (PortableServer_Servant servant, - GNOME_Evolution_Addressbook_SimpleCard_Field field, - CORBA_Environment *ev) -{ - ESimpleCardBonobo *simple_card; - ESimpleCardBonoboPrivate *priv; - - simple_card = E_SIMPLE_CARD_BONOBO (bonobo_object (servant)); - priv = simple_card->priv; - - if (priv->card_simple) { - char *value = e_card_simple_get (priv->card_simple, - field); - char *ret_val = CORBA_string_dup (value ? value : ""); - g_free (value); - return ret_val; - } else { - return CORBA_string_dup (""); - } -} - -static void -impl_SimpleCard_set (PortableServer_Servant servant, - GNOME_Evolution_Addressbook_SimpleCard_Field field, - const CORBA_char *value, - CORBA_Environment *ev) -{ - - ESimpleCardBonobo *simple_card; - ESimpleCardBonoboPrivate *priv; - - simple_card = E_SIMPLE_CARD_BONOBO (bonobo_object (servant)); - priv = simple_card->priv; - - if (priv->card_simple) { - e_card_simple_set (priv->card_simple, - field, - value); - } -} - - -/* GtkObject methods. */ - -static void -impl_dispose (GObject *object) -{ - ESimpleCardBonobo *simple_card; - ESimpleCardBonoboPrivate *priv; - - simple_card = E_SIMPLE_CARD_BONOBO (object); - priv = simple_card->priv; - - if (priv) { - if (priv->card_simple) { - g_object_unref (priv->card_simple); - } - - g_free (priv); - simple_card->priv = NULL; - } - - if (G_OBJECT_CLASS(parent_class)->dispose) - G_OBJECT_CLASS(parent_class)->dispose(object); -} - - -static void -e_simple_card_bonobo_class_init (ESimpleCardBonoboClass *klass) -{ - GObjectClass *object_class; - POA_GNOME_Evolution_Addressbook_SimpleCard__epv *epv; - - object_class = G_OBJECT_CLASS (klass); - parent_class = g_type_class_ref (BONOBO_TYPE_OBJECT); - - object_class->dispose = impl_dispose; - - epv = &klass->epv; - epv->getArbitrary = impl_SimpleCard_get_arbitrary; - epv->setArbitrary = impl_SimpleCard_set_arbitrary; - epv->get = impl_SimpleCard_get; - epv->set = impl_SimpleCard_set; -} - -static void -e_simple_card_bonobo_init (ESimpleCardBonobo *simple_card) -{ - ESimpleCardBonoboPrivate *priv; - - priv = g_new (ESimpleCardBonoboPrivate, 1); - - priv->card_simple = NULL; - - simple_card->priv = priv; -} - - -void -e_simple_card_bonobo_construct (ESimpleCardBonobo *simple_card, - ECardSimple *card_simple) -{ - g_return_if_fail (simple_card != NULL); - g_return_if_fail (E_IS_SIMPLE_CARD_BONOBO (simple_card)); - - simple_card->priv->card_simple = card_simple; - g_object_ref (card_simple); -} - -ESimpleCardBonobo * -e_simple_card_bonobo_new (ECardSimple *card_simple) -{ - ESimpleCardBonobo *simple_card; - - simple_card = g_object_new (E_TYPE_SIMPLE_CARD_BONOBO, NULL); - - e_simple_card_bonobo_construct (simple_card, card_simple); - - return simple_card; -} - - -BONOBO_TYPE_FUNC_FULL ( - ESimpleCardBonobo, - GNOME_Evolution_Addressbook_SimpleCard, - PARENT_TYPE, - e_simple_card_bonobo); diff --git a/addressbook/gui/component/select-names/e-simple-card-bonobo.h b/addressbook/gui/component/select-names/e-simple-card-bonobo.h deleted file mode 100644 index 7bc2d65830..0000000000 --- a/addressbook/gui/component/select-names/e-simple-card-bonobo.h +++ /dev/null @@ -1,71 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-simple-card-bonobo.h - * - * Copyright (C) 2000 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: - * Ettore Perazzoli <ettore@ximian.com> - * Chris Lahey <clahey@ximian.com> - */ - -#ifndef __E_SIMPLE_CARD_BONOBO_H__ -#define __E_SIMPLE_CARD_BONOBO_H__ - -#include <bonobo/bonobo-object.h> - -#include "Evolution-Addressbook-SelectNames.h" -#include <addressbook/backend/ebook/e-card-simple.h> - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus */ - -#define E_TYPE_SIMPLE_CARD_BONOBO (e_simple_card_bonobo_get_type ()) -#define E_SIMPLE_CARD_BONOBO(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), E_TYPE_SIMPLE_CARD_BONOBO, ESimpleCardBonobo)) -#define E_SIMPLE_CARD_BONOBO_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), E_TYPE_SIMPLE_CARD_BONOBO, ESimpleCardBonoboClass)) -#define E_IS_SIMPLE_CARD_BONOBO(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), E_TYPE_SIMPLE_CARD_BONOBO)) -#define E_IS_SIMPLE_CARD_BONOBO_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), E_TYPE_SIMPLE_CARD_BONOBO)) - - -typedef struct _ESimpleCardBonobo ESimpleCardBonobo; -typedef struct _ESimpleCardBonoboPrivate ESimpleCardBonoboPrivate; -typedef struct _ESimpleCardBonoboClass ESimpleCardBonoboClass; - -struct _ESimpleCardBonobo { - BonoboObject parent; - - ESimpleCardBonoboPrivate *priv; -}; - -struct _ESimpleCardBonoboClass { - BonoboObjectClass parent_class; - - POA_GNOME_Evolution_Addressbook_SimpleCard__epv epv; -}; - - -GType e_simple_card_bonobo_get_type (void); -ESimpleCardBonobo *e_simple_card_bonobo_new (ECardSimple *card_simple); -void e_simple_card_bonobo_construct (ESimpleCardBonobo *simple_card, - ECardSimple *card_simple); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* __E_SIMPLE_CARD_BONOBO_H__ */ diff --git a/addressbook/gui/contact-editor/Makefile.am b/addressbook/gui/contact-editor/Makefile.am index fc3a0a71d0..ae9f99cd35 100644 --- a/addressbook/gui/contact-editor/Makefile.am +++ b/addressbook/gui/contact-editor/Makefile.am @@ -29,8 +29,6 @@ libecontacteditor_la_SOURCES = \ e-contact-editor-marshal.c \ e-contact-editor.c \ e-contact-editor.h \ - e-contact-save-as.c \ - e-contact-save-as.h \ e-contact-quick-add.c \ e-contact-quick-add.h diff --git a/addressbook/gui/contact-editor/contact-editor.glade b/addressbook/gui/contact-editor/contact-editor.glade index 2ef6954d10..10b05c27b4 100644 --- a/addressbook/gui/contact-editor/contact-editor.glade +++ b/addressbook/gui/contact-editor/contact-editor.glade @@ -1478,6 +1478,49 @@ <property name="y_options">fill</property> </packing> </child> + + <child> + <widget class="GtkLabel" id="accellabel-blog"> + <property name="visible">True</property> + <property name="label" translatable="yes">Blog address:</property> + <property name="use_underline">True</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_CENTER</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">1</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="mnemonic_widget">entry-web</property> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">3</property> + <property name="top_attach">9</property> + <property name="bottom_attach">10</property> + <property name="x_options">fill</property> + <property name="y_options"></property> + </packing> + </child> + + <child> + <widget class="Custom" id="entry-blog"> + <property name="visible">True</property> + <property name="creation_function">e_contact_editor_create_web</property> + <property name="int1">0</property> + <property name="int2">0</property> + <property name="last_modification_time">Sat, 08 Feb 2003 09:14:46 GMT</property> + </widget> + <packing> + <property name="left_attach">3</property> + <property name="right_attach">4</property> + <property name="top_attach">9</property> + <property name="bottom_attach">10</property> + <property name="x_options">fill</property> + <property name="y_options">fill</property> + </packing> + </child> </widget> <packing> <property name="tab_expand">False</property> diff --git a/addressbook/gui/contact-editor/e-contact-editor-address.c b/addressbook/gui/contact-editor/e-contact-editor-address.c index da8bb5421f..34977e3fb7 100644 --- a/addressbook/gui/contact-editor/e-contact-editor-address.c +++ b/addressbook/gui/contact-editor/e-contact-editor-address.c @@ -420,7 +420,9 @@ e_contact_editor_address_init (EContactEditorAddress *e_contact_editor_address) gtk_window_set_resizable(GTK_WINDOW(e_contact_editor_address), TRUE); +#if notyet e_contact_editor_address->address = NULL; +#endif gui = glade_xml_new (EVOLUTION_GLADEDIR "/fulladdr.glade", NULL, NULL); e_contact_editor_address->gui = gui; @@ -453,22 +455,26 @@ e_contact_editor_address_dispose (GObject *object) e_contact_editor_address->gui = NULL; } +#if notyet if (e_contact_editor_address->address) { e_card_delivery_address_unref(e_contact_editor_address->address); e_contact_editor_address->address = NULL; } +#endif if (G_OBJECT_CLASS (parent_class)->dispose) (* G_OBJECT_CLASS (parent_class)->dispose) (object); } GtkWidget* -e_contact_editor_address_new (const ECardDeliveryAddress *address) +e_contact_editor_address_new (/* XXX notyet const ECardDeliveryAddress *address*/) { GtkWidget *widget = g_object_new (E_TYPE_CONTACT_EDITOR_ADDRESS, NULL); +#if notyet g_object_set (widget, "address", address, NULL); +#endif return widget; } @@ -482,9 +488,11 @@ e_contact_editor_address_set_property (GObject *object, guint prop_id, switch (prop_id){ case PROP_ADDRESS: +#if notyet e_card_delivery_address_unref(e_contact_editor_address->address); e_contact_editor_address->address = e_card_delivery_address_copy(g_value_get_pointer (value)); fill_in_info(e_contact_editor_address); +#endif break; case PROP_EDITABLE: { int i; @@ -540,7 +548,9 @@ e_contact_editor_address_get_property (GObject *object, guint prop_id, switch (prop_id) { case PROP_ADDRESS: extract_info(e_contact_editor_address); +#if notyet g_value_set_pointer (value, e_card_delivery_address_ref(e_contact_editor_address->address)); +#endif break; case PROP_EDITABLE: g_value_set_boolean (value, e_contact_editor_address->editable ? TRUE : FALSE); @@ -566,6 +576,7 @@ fill_in_field(EContactEditorAddress *editor, char *field, char *string) static void fill_in_info(EContactEditorAddress *editor) { +#if notyet ECardDeliveryAddress *address = editor->address; if (address) { fill_in_field(editor, "entry-street" , address->street ); @@ -576,6 +587,7 @@ fill_in_info(EContactEditorAddress *editor) fill_in_field(editor, "entry-code" , address->code ); fill_in_field(editor, "entry-country", address->country); } +#endif } static char * @@ -591,6 +603,7 @@ extract_field(EContactEditorAddress *editor, char *field) static void extract_info(EContactEditorAddress *editor) { +#if notyet ECardDeliveryAddress *address = editor->address; if (!address) { address = e_card_delivery_address_new(); @@ -603,4 +616,5 @@ extract_info(EContactEditorAddress *editor) address->region = extract_field(editor, "entry-region" ); address->code = extract_field(editor, "entry-code" ); address->country = extract_field(editor, "entry-country"); +#endif } diff --git a/addressbook/gui/contact-editor/e-contact-editor-address.h b/addressbook/gui/contact-editor/e-contact-editor-address.h index 7faab47a4f..c20f020152 100644 --- a/addressbook/gui/contact-editor/e-contact-editor-address.h +++ b/addressbook/gui/contact-editor/e-contact-editor-address.h @@ -22,7 +22,7 @@ #include <gtk/gtkdialog.h> #include <glade/glade.h> -#include <ebook/e-card.h> +#include <ebook/e-contact.h> G_BEGIN_DECLS @@ -49,8 +49,10 @@ struct _EContactEditorAddress { GtkDialog parent; +#if notyet /* item specific fields */ ECardDeliveryAddress *address; +#endif guint editable : 1; @@ -63,7 +65,7 @@ struct _EContactEditorAddressClass }; -GtkWidget *e_contact_editor_address_new(const ECardDeliveryAddress *name); +GtkWidget *e_contact_editor_address_new(/* XXX not yet const ECardDeliveryAddress *name*/); GType e_contact_editor_address_get_type (void); G_END_DECLS diff --git a/addressbook/gui/contact-editor/e-contact-editor-fullname.c b/addressbook/gui/contact-editor/e-contact-editor-fullname.c index 4a7d6cec1b..c37f4cc8b7 100644 --- a/addressbook/gui/contact-editor/e-contact-editor-fullname.c +++ b/addressbook/gui/contact-editor/e-contact-editor-fullname.c @@ -1,8 +1,8 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* - * e-contact-editor-fullname.c - * Copyright (C) 2000 Ximian, Inc. - * Author: Chris Lahey <clahey@ximian.com> + * eab-contact-editor-phones.c + * Copyright (C) 2003 Ximian, Inc. + * Author: Chris Toshok <toshok@ximian.com> * * This library is free software; you can redistribute it and/or * modify it under the terms of version 2 of the GNU General Public @@ -142,7 +142,7 @@ e_contact_editor_fullname_dispose (GObject *object) } if (e_contact_editor_fullname->name) { - e_card_name_unref(e_contact_editor_fullname->name); + e_contact_name_free(e_contact_editor_fullname->name); e_contact_editor_fullname->name = NULL; } @@ -151,12 +151,12 @@ e_contact_editor_fullname_dispose (GObject *object) } GtkWidget* -e_contact_editor_fullname_new (const ECardName *name) +e_contact_editor_fullname_new (const EContactName *name) { GtkWidget *widget = g_object_new (E_TYPE_CONTACT_EDITOR_FULLNAME, NULL); g_object_set (widget, - "name", name, - NULL); + "name", name, + NULL); return widget; } @@ -170,8 +170,8 @@ e_contact_editor_fullname_set_property (GObject *object, guint prop_id, switch (prop_id){ case PROP_NAME: - e_card_name_unref(e_contact_editor_fullname->name); - e_contact_editor_fullname->name = e_card_name_copy(g_value_get_pointer (value)); + e_contact_name_free(e_contact_editor_fullname->name); + e_contact_editor_fullname->name = e_contact_name_copy(g_value_get_pointer (value)); fill_in_info(e_contact_editor_fullname); break; case PROP_EDITABLE: { @@ -224,7 +224,7 @@ e_contact_editor_fullname_get_property (GObject *object, guint prop_id, switch (prop_id) { case PROP_NAME: extract_info(e_contact_editor_fullname); - g_value_set_pointer (value, e_card_name_ref(e_contact_editor_fullname->name)); + g_value_set_pointer (value, e_contact_name_copy(e_contact_editor_fullname->name)); break; case PROP_EDITABLE: g_value_set_boolean (value, e_contact_editor_fullname->editable ? TRUE : FALSE); @@ -250,13 +250,13 @@ fill_in_field(EContactEditorFullname *editor, char *field, char *string) static void fill_in_info(EContactEditorFullname *editor) { - ECardName *name = editor->name; + EContactName *name = editor->name; if (name) { - fill_in_field(editor, "entry-title", name->prefix); + fill_in_field(editor, "entry-title", name->prefixes); fill_in_field(editor, "entry-first", name->given); fill_in_field(editor, "entry-middle", name->additional); fill_in_field(editor, "entry-last", name->family); - fill_in_field(editor, "entry-suffix", name->suffix); + fill_in_field(editor, "entry-suffix", name->suffixes); } } @@ -273,15 +273,15 @@ extract_field(EContactEditorFullname *editor, char *field) static void extract_info(EContactEditorFullname *editor) { - ECardName *name = editor->name; + EContactName *name = editor->name; if (!name) { - name = e_card_name_new(); + name = e_contact_name_new(); editor->name = name; } - name->prefix = extract_field(editor, "entry-title" ); + name->prefixes = extract_field(editor, "entry-title" ); name->given = extract_field(editor, "entry-first" ); name->additional = extract_field(editor, "entry-middle"); name->family = extract_field(editor, "entry-last" ); - name->suffix = extract_field(editor, "entry-suffix"); + name->suffixes = extract_field(editor, "entry-suffix"); } diff --git a/addressbook/gui/contact-editor/e-contact-editor-fullname.h b/addressbook/gui/contact-editor/e-contact-editor-fullname.h index 3c8e055a96..408fcffdc3 100644 --- a/addressbook/gui/contact-editor/e-contact-editor-fullname.h +++ b/addressbook/gui/contact-editor/e-contact-editor-fullname.h @@ -22,7 +22,7 @@ #include <gtk/gtkdialog.h> #include <glade/glade.h> -#include <ebook/e-card.h> +#include <ebook/e-contact.h> G_BEGIN_DECLS @@ -50,7 +50,7 @@ struct _EContactEditorFullname GtkDialog parent; /* item specific fields */ - ECardName *name; + EContactName *name; GladeXML *gui; /* Whether the dialog will accept modifications */ @@ -63,7 +63,7 @@ struct _EContactEditorFullnameClass }; -GtkWidget *e_contact_editor_fullname_new(const ECardName *name); +GtkWidget *e_contact_editor_fullname_new(const EContactName *name); GType e_contact_editor_fullname_get_type (void); G_END_DECLS diff --git a/addressbook/gui/contact-editor/e-contact-editor.c b/addressbook/gui/contact-editor/e-contact-editor.c index 2330daf063..1391ccf1b0 100644 --- a/addressbook/gui/contact-editor/e-contact-editor.c +++ b/addressbook/gui/contact-editor/e-contact-editor.c @@ -49,29 +49,28 @@ #include "addressbook/printing/e-contact-print.h" #include "addressbook/printing/e-contact-print-envelope.h" -#include "addressbook/gui/widgets/e-addressbook-util.h" +#include "addressbook/gui/widgets/eab-gui-util.h" #include "e-util/e-gui-utils.h" #include "widgets/misc/e-dateedit.h" #include "widgets/misc/e-url-entry.h" #include "shell/evolution-shell-component-utils.h" -#include "e-card-merging.h" +#include "eab-contact-merging.h" #include "e-contact-editor-address.h" #include "e-contact-editor-fullname.h" #include "e-contact-editor-marshal.h" -#include "e-contact-save-as.h" /* Signal IDs */ enum { - CARD_ADDED, - CARD_MODIFIED, - CARD_DELETED, + CONTACT_ADDED, + CONTACT_MODIFIED, + CONTACT_DELETED, EDITOR_CLOSED, LAST_SIGNAL }; -static void e_contact_editor_init (EContactEditor *card); +static void e_contact_editor_init (EContactEditor *editor); static void e_contact_editor_class_init (EContactEditorClass *klass); static void e_contact_editor_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); static void e_contact_editor_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); @@ -85,9 +84,10 @@ static void enable_writable_fields(EContactEditor *editor); static void set_editable(EContactEditor *editor); static void fill_in_info(EContactEditor *editor); static void extract_info(EContactEditor *editor); -static void set_fields(EContactEditor *editor); +static void set_field(EContactEditor *editor, GtkEntry *entry, const char *string); static void set_address_field(EContactEditor *editor, int result); -static void add_field_callback(GtkWidget *widget, EContactEditor *editor); +static void set_phone_field(EContactEditor *editor, GtkWidget *entry, const char *phone_number); +static void set_fields(EContactEditor *editor); static void command_state_changed (EContactEditor *ce); static void widget_changed (GtkWidget *widget, EContactEditor *editor); static void close_dialog (EContactEditor *ce); @@ -101,8 +101,8 @@ static guint contact_editor_signals[LAST_SIGNAL]; enum { PROP_0, PROP_BOOK, - PROP_CARD, - PROP_IS_NEW_CARD, + PROP_CONTACT, + PROP_IS_NEW_CONTACT, PROP_EDITABLE, PROP_CHANGED, PROP_WRITABLE_FIELDS @@ -114,6 +114,34 @@ enum { DYNAMIC_LIST_ADDRESS }; +static EContactField phones[] = { + E_CONTACT_PHONE_ASSISTANT, + E_CONTACT_PHONE_BUSINESS, + E_CONTACT_PHONE_BUSINESS_2, + E_CONTACT_PHONE_BUSINESS_FAX, + E_CONTACT_PHONE_CALLBACK, + E_CONTACT_PHONE_CAR, + E_CONTACT_PHONE_COMPANY, + E_CONTACT_PHONE_HOME, + E_CONTACT_PHONE_HOME_2, + E_CONTACT_PHONE_HOME_FAX, + E_CONTACT_PHONE_ISDN, + E_CONTACT_PHONE_MOBILE, + E_CONTACT_PHONE_OTHER, + E_CONTACT_PHONE_OTHER_FAX, + E_CONTACT_PHONE_PAGER, + E_CONTACT_PHONE_PRIMARY, + E_CONTACT_PHONE_RADIO, + E_CONTACT_PHONE_TELEX, + E_CONTACT_PHONE_TTYTDD, +}; + +static EContactField emails[] = { + E_CONTACT_EMAIL_1, + E_CONTACT_EMAIL_2, + E_CONTACT_EMAIL_3 +}; + static GSList *all_contact_editors = NULL; GType @@ -158,16 +186,16 @@ e_contact_editor_class_init (EContactEditorClass *klass) E_TYPE_BOOK, 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)); - g_object_class_install_property (object_class, PROP_IS_NEW_CARD, - g_param_spec_boolean ("is_new_card", - _("Is New Card"), + g_object_class_install_property (object_class, PROP_IS_NEW_CONTACT, + g_param_spec_boolean ("is_new_contact", + _("Is New Contact"), /*_( */"XXX blurb" /*)*/, FALSE, G_PARAM_READWRITE)); @@ -193,31 +221,31 @@ e_contact_editor_class_init (EContactEditorClass *klass) FALSE, G_PARAM_READWRITE)); - contact_editor_signals[CARD_ADDED] = - g_signal_new ("card_added", + contact_editor_signals[CONTACT_ADDED] = + g_signal_new ("contact_added", G_OBJECT_CLASS_TYPE (object_class), G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (EContactEditorClass, card_added), + G_STRUCT_OFFSET (EContactEditorClass, contact_added), NULL, NULL, e_contact_editor_marshal_NONE__INT_OBJECT, G_TYPE_NONE, 2, G_TYPE_INT, G_TYPE_OBJECT); - contact_editor_signals[CARD_MODIFIED] = - g_signal_new ("card_modified", + contact_editor_signals[CONTACT_MODIFIED] = + g_signal_new ("contact_modified", G_OBJECT_CLASS_TYPE (object_class), G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (EContactEditorClass, card_modified), + G_STRUCT_OFFSET (EContactEditorClass, contact_modified), NULL, NULL, e_contact_editor_marshal_NONE__INT_OBJECT, G_TYPE_NONE, 2, G_TYPE_INT, G_TYPE_OBJECT); - contact_editor_signals[CARD_DELETED] = - g_signal_new ("card_deleted", + contact_editor_signals[CONTACT_DELETED] = + g_signal_new ("contact_deleted", G_OBJECT_CLASS_TYPE (object_class), G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (EContactEditorClass, card_deleted), + G_STRUCT_OFFSET (EContactEditorClass, contact_deleted), NULL, NULL, e_contact_editor_marshal_NONE__INT_OBJECT, G_TYPE_NONE, 2, @@ -259,11 +287,10 @@ wants_html_changed (GtkWidget *widget, EContactEditor *editor) { gboolean wants_html; g_object_get (widget, - "active", &wants_html, - NULL); - g_object_set (editor->card, - "wants_html", wants_html, - NULL); + "active", &wants_html, + NULL); + + e_contact_set (editor->contact, E_CONTACT_WANTS_HTML, GINT_TO_POINTER (wants_html)); widget_changed (widget, editor); } @@ -273,23 +300,20 @@ phone_entry_changed (GtkWidget *widget, EContactEditor *editor) { int which; GtkEntry *entry = GTK_ENTRY(widget); - ECardPhone *phone; - if ( widget == glade_xml_get_widget(editor->gui, "entry-phone1") ) { + if ( widget == glade_xml_get_widget(editor->gui, "entry-phone1") ) which = 1; - } else if ( widget == glade_xml_get_widget(editor->gui, "entry-phone2") ) { + else if ( widget == glade_xml_get_widget(editor->gui, "entry-phone2") ) which = 2; - } else if ( widget == glade_xml_get_widget(editor->gui, "entry-phone3") ) { + else if ( widget == glade_xml_get_widget(editor->gui, "entry-phone3") ) which = 3; - } else if ( widget == glade_xml_get_widget(editor->gui, "entry-phone4") ) { + else if ( widget == glade_xml_get_widget(editor->gui, "entry-phone4") ) which = 4; - } else + else return; - phone = e_card_phone_new(); - phone->number = g_strdup (gtk_entry_get_text(entry)); - e_card_simple_set_phone(editor->simple, editor->phone_choice[which - 1], phone); - e_card_phone_unref(phone); - set_fields(editor); + + printf ("gtk_entry_get_text(entry) == %s\n", (char*)gtk_entry_get_text(entry)); + e_contact_set(editor->contact, editor->phone_choice[which - 1], (char*)gtk_entry_get_text(entry)); widget_changed (widget, editor); } @@ -297,12 +321,9 @@ phone_entry_changed (GtkWidget *widget, EContactEditor *editor) static void email_entry_changed (GtkWidget *widget, EContactEditor *editor) { - const gchar *string; GtkEntry *entry = GTK_ENTRY(widget); - string = gtk_entry_get_text(entry); - - e_card_simple_set_email(editor->simple, editor->email_choice, string); + e_contact_set (editor->contact, editor->email_choice, (char*)gtk_entry_get_text(entry)); widget_changed (widget, editor); } @@ -310,6 +331,7 @@ email_entry_changed (GtkWidget *widget, EContactEditor *editor) static void address_text_changed (GtkTextBuffer *buffer, EContactEditor *editor) { +#if notyet ECardAddrLabel *address; GtkTextIter start_iter, end_iter; @@ -346,12 +368,14 @@ address_text_changed (GtkTextBuffer *buffer, EContactEditor *editor) e_card_address_label_unref(address); widget_changed (NULL, editor); +#endif } static void address_mailing_changed (GtkWidget *widget, EContactEditor *editor) { +#if notyet const ECardDeliveryAddress *curr; ECardDeliveryAddress *address; gboolean mailing_address; @@ -399,12 +423,13 @@ address_mailing_changed (GtkWidget *widget, EContactEditor *editor) editor->address_mailing = -1; widget_changed (widget, editor); +#endif } /* This function tells you whether name_to_style will make sense. */ static gboolean -style_makes_sense(const ECardName *name, char *company, int style) +style_makes_sense(const EContactName *name, char *company, int style) { switch (style) { case 0: /* Fall Through */ @@ -427,7 +452,7 @@ style_makes_sense(const ECardName *name, char *company, int style) } static char * -name_to_style(const ECardName *name, char *company, int style) +name_to_style(const EContactName *name, char *company, int style) { char *string; char *strings[4], **stringptr; @@ -489,7 +514,7 @@ file_as_get_style (EContactEditor *editor) GtkEntry *file_as = GTK_ENTRY(glade_xml_get_widget(editor->gui, "entry-file-as")); char *filestring; char *trystring; - ECardName *name = editor->name; + EContactName *name = editor->name; int i; int style; @@ -561,11 +586,12 @@ name_entry_changed (GtkWidget *widget, EContactEditor *editor) const char *string; style = file_as_get_style(editor); - - e_card_name_unref(editor->name); + + e_contact_name_free (editor->name); string = gtk_entry_get_text (GTK_ENTRY(widget)); - editor->name = e_card_name_from_string(string); + + editor->name = e_contact_name_from_string(string); file_as_set_style(editor, style); @@ -680,6 +706,7 @@ set_entry_changed_signals(EContactEditor *editor) } set_urlentry_changed_signal_field (editor, "entry-web"); + set_urlentry_changed_signal_field (editor, "entry-blog"); set_urlentry_changed_signal_field (editor, "entry-caluri"); set_urlentry_changed_signal_field (editor, "entry-fburl"); @@ -719,32 +746,32 @@ full_name_clicked(GtkWidget *button, EContactEditor *editor) int result; g_object_set (dialog, - "editable", editor->fullname_editable, - NULL); + "editable", editor->fullname_editable, + NULL); gtk_widget_show(GTK_WIDGET(dialog)); result = gtk_dialog_run (dialog); gtk_widget_hide (GTK_WIDGET (dialog)); if (editor->fullname_editable && result == GTK_RESPONSE_OK) { - ECardName *name; + EContactName *name; GtkWidget *fname_widget; int style = 0; g_object_get (dialog, - "name", &name, - NULL); + "name", &name, + NULL); style = file_as_get_style(editor); fname_widget = glade_xml_get_widget(editor->gui, "entry-fullname"); if (fname_widget && GTK_IS_ENTRY(fname_widget)) { - char *full_name = e_card_name_to_string(name); + char *full_name = e_contact_name_to_string(name); gtk_entry_set_text(GTK_ENTRY(fname_widget), full_name); g_free(full_name); } - e_card_name_unref(editor->name); - editor->name = e_card_name_ref(name); + e_contact_name_free(editor->name); + editor->name = name; file_as_set_style(editor, style); } @@ -754,6 +781,7 @@ full_name_clicked(GtkWidget *button, EContactEditor *editor) static void full_addr_clicked(GtkWidget *button, EContactEditor *editor) { +#if notyet GtkDialog *dialog; int result; const ECardDeliveryAddress *address; @@ -802,6 +830,7 @@ full_addr_clicked(GtkWidget *button, EContactEditor *editor) widget_changed (NULL, editor); } gtk_widget_destroy (GTK_WIDGET (dialog)); +#endif } static void @@ -814,10 +843,9 @@ categories_clicked(GtkWidget *button, EContactEditor *editor) ECategoriesMasterList *ecml; if (entry && GTK_IS_ENTRY(entry)) categories = g_strdup (gtk_entry_get_text(GTK_ENTRY(entry))); - else if (editor->card) - g_object_get (editor->card, - "categories", &categories, - NULL); + else if (editor->contact) + categories = e_contact_get (editor->contact, E_CONTACT_CATEGORIES); + dialog = GTK_DIALOG(e_categories_new(categories)); if (dialog == NULL) { @@ -841,14 +869,13 @@ categories_clicked(GtkWidget *button, EContactEditor *editor) g_free (categories); if (result == GTK_RESPONSE_OK) { g_object_get (dialog, - "categories", &categories, - NULL); + "categories", &categories, + NULL); if (entry && GTK_IS_ENTRY(entry)) gtk_entry_set_text(GTK_ENTRY(entry), categories); else - g_object_set (editor->card, - "categories", categories, - NULL); + e_contact_set (editor->contact, E_CONTACT_CATEGORIES, categories); + g_free(categories); } gtk_widget_destroy(GTK_WIDGET(dialog)); @@ -860,7 +887,7 @@ typedef struct { } EditorCloseStruct; static void -card_added_cb (EBook *book, EBookStatus status, const char *id, EditorCloseStruct *ecs) +contact_added_cb (EBook *book, EBookStatus status, const char *id, EditorCloseStruct *ecs) { EContactEditor *ce = ecs->ce; gboolean should_close = ecs->should_close; @@ -868,13 +895,13 @@ card_added_cb (EBook *book, EBookStatus status, const char *id, EditorCloseStruc gtk_widget_set_sensitive (ce->app, TRUE); ce->in_async_call = FALSE; - e_card_set_id (ce->card, id); + e_contact_set (ce->contact, E_CONTACT_UID, (char*)id); - g_signal_emit (ce, contact_editor_signals[CARD_ADDED], 0, - status, ce->card); + g_signal_emit (ce, contact_editor_signals[CONTACT_ADDED], 0, + status, ce->contact); - if (status == E_BOOK_STATUS_SUCCESS) { - ce->is_new_card = FALSE; + if (status == E_BOOK_ERROR_OK) { + ce->is_new_contact = FALSE; if (should_close) { close_dialog (ce); @@ -890,7 +917,7 @@ card_added_cb (EBook *book, EBookStatus status, const char *id, EditorCloseStruc } static void -card_modified_cb (EBook *book, EBookStatus status, EditorCloseStruct *ecs) +contact_modified_cb (EBook *book, EBookStatus status, EditorCloseStruct *ecs) { EContactEditor *ce = ecs->ce; gboolean should_close = ecs->should_close; @@ -898,10 +925,10 @@ card_modified_cb (EBook *book, EBookStatus status, EditorCloseStruct *ecs) gtk_widget_set_sensitive (ce->app, TRUE); ce->in_async_call = FALSE; - g_signal_emit (ce, contact_editor_signals[CARD_MODIFIED], 0, - status, ce->card); + g_signal_emit (ce, contact_editor_signals[CONTACT_MODIFIED], 0, + status, ce->contact); - if (status == E_BOOK_STATUS_SUCCESS) { + if (status == E_BOOK_ERROR_OK) { if (should_close) { close_dialog (ce); } @@ -915,12 +942,11 @@ card_modified_cb (EBook *book, EBookStatus status, EditorCloseStruct *ecs) g_free (ecs); } -/* Emits the signal to request saving a card */ +/* Emits the signal to request saving a contact */ static void -save_card (EContactEditor *ce, gboolean should_close) +save_contact (EContactEditor *ce, gboolean should_close) { extract_info (ce); - e_card_simple_sync_card (ce->simple); if (ce->book) { EditorCloseStruct *ecs = g_new(EditorCloseStruct, 1); @@ -933,10 +959,10 @@ save_card (EContactEditor *ce, gboolean should_close) gtk_widget_set_sensitive (ce->app, FALSE); ce->in_async_call = TRUE; - if (ce->is_new_card) - e_card_merging_book_add_card (ce->book, ce->card, (EBookIdCallback)card_added_cb, ecs); + if (ce->is_new_contact) + eab_merging_book_add_contact (ce->book, ce->contact, (EBookIdCallback)contact_added_cb, ecs); else - e_card_merging_book_commit_card (ce->book, ce->card, (EBookCallback)card_modified_cb, ecs); + eab_merging_book_commit_contact (ce->book, ce->contact, (EBookCallback)contact_modified_cb, ecs); } } @@ -957,9 +983,9 @@ prompt_to_save_changes (EContactEditor *editor) if (!editor->changed) return TRUE; - switch (e_addressbook_prompt_save_dialog (GTK_WINDOW(editor->app))) { + switch (eab_prompt_save_dialog (GTK_WINDOW(editor->app))) { case GTK_RESPONSE_YES: - save_card (editor, FALSE); + save_contact (editor, FALSE); return TRUE; case GTK_RESPONSE_NO: return TRUE; @@ -978,7 +1004,7 @@ file_save_cb (GtkWidget *widget, gpointer data) EContactEditor *ce; ce = E_CONTACT_EDITOR (data); - save_card (ce, FALSE); + save_contact (ce, FALSE); } /* File/Close callback */ @@ -998,45 +1024,38 @@ static void file_save_as_cb (GtkWidget *widget, gpointer data) { EContactEditor *ce; - ECard *card; + EContact *contact; ce = E_CONTACT_EDITOR (data); extract_info (ce); - e_card_simple_sync_card (ce->simple); - card = ce->card; - e_contact_save_as(_("Save Contact as VCard"), card, GTK_WINDOW (ce->app)); + contact = ce->contact; + eab_contact_save(_("Save Contact as VCard"), contact, GTK_WINDOW (ce->app)); } static void file_send_as_cb (GtkWidget *widget, gpointer data) { EContactEditor *ce; - ECard *card; ce = E_CONTACT_EDITOR (data); extract_info (ce); - e_card_simple_sync_card (ce->simple); - card = ce->card; - e_addressbook_send_card(card, E_ADDRESSBOOK_DISPOSITION_AS_ATTACHMENT); + eab_send_contact(ce->contact, EAB_DISPOSITION_AS_ATTACHMENT); } static void file_send_to_cb (GtkWidget *widget, gpointer data) { EContactEditor *ce; - ECard *card; ce = E_CONTACT_EDITOR (data); extract_info (ce); - e_card_simple_sync_card (ce->simple); - card = ce->card; - e_addressbook_send_card(card, E_ADDRESSBOOK_DISPOSITION_AS_TO); + eab_send_contact(ce->contact, EAB_DISPOSITION_AS_TO); } gboolean @@ -1071,16 +1090,16 @@ e_contact_editor_confirm_delete (GtkWindow *parent) } static void -card_deleted_cb (EBook *book, EBookStatus status, EContactEditor *ce) +contact_deleted_cb (EBook *book, EBookStatus status, EContactEditor *ce) { gtk_widget_set_sensitive (ce->app, TRUE); ce->in_async_call = FALSE; - g_signal_emit (ce, contact_editor_signals[CARD_DELETED], 0, - status, ce->card); + g_signal_emit (ce, contact_editor_signals[CONTACT_DELETED], 0, + status, ce->contact); /* always close the dialog after we successfully delete a card */ - if (status == E_BOOK_STATUS_SUCCESS) + if (status == E_BOOK_ERROR_OK) close_dialog (ce); } @@ -1088,27 +1107,23 @@ static void delete_cb (GtkWidget *widget, gpointer data) { EContactEditor *ce = E_CONTACT_EDITOR (data); - ECard *card = ce->card; - ECardSimple *simple = ce->simple; + EContact *contact = ce->contact; - g_object_ref(card); - g_object_ref(simple); + g_object_ref(contact); if (e_contact_editor_confirm_delete(GTK_WINDOW(ce->app))) { extract_info (ce); - e_card_simple_sync_card (simple); - if (!ce->is_new_card && ce->book) { + if (!ce->is_new_contact && ce->book) { gtk_widget_set_sensitive (ce->app, FALSE); ce->in_async_call = TRUE; - e_book_remove_card (ce->book, card, (EBookCallback)card_deleted_cb, ce); + e_book_async_remove_contact (ce->book, contact, (EBookCallback)contact_deleted_cb, ce); } } - g_object_unref(card); - g_object_unref(simple); + g_object_unref(contact); } /* Emits the signal to request printing a card */ @@ -1120,9 +1135,8 @@ print_cb (BonoboUIComponent *uih, void *data, const char *path) ce = E_CONTACT_EDITOR (data); extract_info (ce); - e_card_simple_sync_card (ce->simple); - gtk_widget_show(e_contact_print_card_dialog_new(ce->card)); + gtk_widget_show(e_contact_print_contact_dialog_new(ce->contact)); } #if 0 /* Envelope printing is disabled for Evolution 1.0. */ @@ -1148,7 +1162,7 @@ tb_save_and_close_cb (BonoboUIComponent *uih, void *data, const char *path) EContactEditor *ce; ce = E_CONTACT_EDITOR (data); - save_card (ce, TRUE); + save_contact (ce, TRUE); } static @@ -1244,6 +1258,7 @@ setup_tab_order(GladeXML *gui) list = add_to_tab_order(list, gui, "entry-email1"); list = add_to_tab_order(list, gui, "alignment-htmlmail"); list = add_to_tab_order(list, gui, "entry-web"); + list = add_to_tab_order(list, gui, "entry-blog"); list = add_to_tab_order(list, gui, "button-fulladdr"); list = add_to_tab_order(list, gui, "text-address"); list = g_list_reverse(list); @@ -1271,22 +1286,20 @@ e_contact_editor_init (EContactEditor *e_contact_editor) e_contact_editor->email_list = NULL; e_contact_editor->phone_list = NULL; e_contact_editor->address_list = NULL; - e_contact_editor->name = e_card_name_new(); + e_contact_editor->name = e_contact_name_new(); e_contact_editor->company = g_strdup(""); - e_contact_editor->email_choice = 0; - e_contact_editor->phone_choice[0] = E_CARD_SIMPLE_PHONE_ID_BUSINESS; - e_contact_editor->phone_choice[1] = E_CARD_SIMPLE_PHONE_ID_HOME; - e_contact_editor->phone_choice[2] = E_CARD_SIMPLE_PHONE_ID_BUSINESS_FAX; - e_contact_editor->phone_choice[3] = E_CARD_SIMPLE_PHONE_ID_MOBILE; + e_contact_editor->email_choice = E_CONTACT_EMAIL_1; + e_contact_editor->phone_choice[0] = E_CONTACT_PHONE_BUSINESS; + e_contact_editor->phone_choice[1] = E_CONTACT_PHONE_HOME; + e_contact_editor->phone_choice[2] = E_CONTACT_PHONE_BUSINESS_FAX; + e_contact_editor->phone_choice[3] = E_CONTACT_PHONE_MOBILE; +#if 0 e_contact_editor->address_choice = 0; e_contact_editor->address_mailing = -1; +#endif - e_contact_editor->arbitrary_fields = NULL; - - e_contact_editor->simple = e_card_simple_new(NULL); - - e_contact_editor->card = NULL; + e_contact_editor->contact = NULL; e_contact_editor->changed = FALSE; e_contact_editor->in_async_call = FALSE; e_contact_editor->editable = TRUE; @@ -1298,10 +1311,6 @@ e_contact_editor_init (EContactEditor *e_contact_editor) e_contact_editor->app = glade_xml_get_widget (gui, "contact editor"); - e_container_foreach_leaf (GTK_CONTAINER (e_contact_editor->app), - (GtkCallback) add_field_callback, - e_contact_editor); - connect_arrow_button_signals(e_contact_editor); set_entry_changed_signals(e_contact_editor); @@ -1429,23 +1438,18 @@ e_contact_editor_dispose (GObject *object) { e_contact_editor->address_popup = NULL; } - if (e_contact_editor->simple) { - g_object_unref(e_contact_editor->simple); - e_contact_editor->simple = NULL; + if (e_contact_editor->contact) { + g_object_unref(e_contact_editor->contact); + e_contact_editor->contact = NULL; } - if (e_contact_editor->card) { - g_object_unref(e_contact_editor->card); - e_contact_editor->card = NULL; - } - if (e_contact_editor->book) { g_object_unref(e_contact_editor->book); e_contact_editor->book = NULL; } if (e_contact_editor->name) { - e_card_name_unref(e_contact_editor->name); + e_contact_name_free(e_contact_editor->name); e_contact_editor->name = NULL; } @@ -1474,7 +1478,7 @@ command_state_changed (EContactEditor *ce) bonobo_ui_component_set_prop (ce->uic, "/commands/ContactEditorDelete", "sensitive", - (ce->editable && !ce->is_new_card) ? "1" : "0", NULL); + (ce->editable && !ce->is_new_contact) ? "1" : "0", NULL); } static void @@ -1506,14 +1510,14 @@ contact_editor_destroy_notify (void *data, EContactEditor * e_contact_editor_new (EBook *book, - ECard *card, - gboolean is_new_card, + EContact *contact, + gboolean is_new_contact, gboolean editable) { EContactEditor *ce; g_return_val_if_fail (E_IS_BOOK (book), NULL); - g_return_val_if_fail (E_IS_CARD (card), NULL); + g_return_val_if_fail (E_IS_CONTACT (contact), NULL); ce = g_object_new (E_TYPE_CONTACT_EDITOR, NULL); @@ -1525,13 +1529,13 @@ e_contact_editor_new (EBook *book, g_object_set (ce, "book", book, - "card", card, - "is_new_card", is_new_card, + "contact", contact, + "is_new_contact", is_new_contact, "editable", editable, NULL); if (book) - e_book_get_supported_fields (book, (EBookFieldsCallback)supported_fields_cb, ce); + e_book_async_get_supported_fields (book, (EBookFieldsCallback)supported_fields_cb, ce); return ce; } @@ -1551,19 +1555,16 @@ e_contact_editor_set_property (GObject *object, guint prop_id, const GValue *val g_object_ref (editor->book); /* XXX more here about editable/etc. */ break; - case PROP_CARD: - if (editor->card) - g_object_unref(editor->card); - editor->card = e_card_duplicate(E_CARD(g_value_get_object (value))); - g_object_set(editor->simple, - "card", editor->card, - NULL); + case PROP_CONTACT: + if (editor->contact) + g_object_unref(editor->contact); + editor->contact = e_contact_duplicate(E_CONTACT(g_value_get_object (value))); fill_in_info(editor); editor->changed = FALSE; break; - case PROP_IS_NEW_CARD: - editor->is_new_card = g_value_get_boolean (value) ? TRUE : FALSE; + case PROP_IS_NEW_CONTACT: + editor->is_new_contact = g_value_get_boolean (value) ? TRUE : FALSE; break; case PROP_EDITABLE: { @@ -1617,14 +1618,13 @@ e_contact_editor_get_property (GObject *object, guint prop_id, GValue *value, GP g_value_set_object (value, e_contact_editor->book); break; - case PROP_CARD: - e_card_simple_sync_card(e_contact_editor->simple); + case PROP_CONTACT: extract_info(e_contact_editor); - g_value_set_object (value, e_contact_editor->card); + g_value_set_object (value, e_contact_editor->contact); break; - case PROP_IS_NEW_CARD: - g_value_set_boolean (value, e_contact_editor->is_new_card ? TRUE : FALSE); + case PROP_IS_NEW_CONTACT: + g_value_set_boolean (value, e_contact_editor->is_new_contact ? TRUE : FALSE); break; case PROP_EDITABLE: @@ -1730,33 +1730,11 @@ e_contact_editor_build_ui_info(GList *list, GnomeUIInfo **infop) static void e_contact_editor_build_phone_ui (EContactEditor *editor) { - int i; - if (editor->phone_list == NULL) { - static char *info[] = { - N_("Assistant"), - N_("Business"), - N_("Business 2"), - N_("Business Fax"), - N_("Callback"), - N_("Car"), - N_("Company"), - N_("Home"), - N_("Home 2"), - N_("Home Fax"), - N_("ISDN"), - N_("Mobile"), - N_("Other"), - N_("Other Fax"), - N_("Pager"), - N_("Primary"), - N_("Radio"), - N_("Telex"), - N_("TTY/TDD") - }; - - for (i = 0; i < sizeof(info) / sizeof(info[0]); i++) { - editor->phone_list = g_list_append(editor->phone_list, g_strdup(info[i])); + int i; + + for (i = 0; i < G_N_ELEMENTS (phones); i ++) { + editor->phone_list = g_list_append(editor->phone_list, g_strdup(e_contact_pretty_name (phones[i]))); } } if (editor->phone_info == NULL) { @@ -1777,15 +1755,8 @@ e_contact_editor_build_email_ui (EContactEditor *editor) int i; if (editor->email_list == NULL) { - static char *info[] = { - N_("Primary Email"), - N_("Email 2"), - N_("Email 3") - }; - - for (i = 0; i < sizeof(info) / sizeof(info[0]); i++) { - editor->email_list = g_list_append(editor->email_list, g_strdup(info[i])); - } + for (i = 0; i < G_N_ELEMENTS (emails); i++) + editor->email_list = g_list_append(editor->email_list, g_strdup(e_contact_pretty_name (emails[i]))); } if (editor->email_info == NULL) { e_contact_editor_build_ui_info(editor->email_list, &editor->email_info); @@ -1851,21 +1822,21 @@ _phone_arrow_pressed (GtkWidget *widget, GdkEventButton *button, EContactEditor e_contact_editor_build_phone_ui (editor); - for(i = 0; i < E_CARD_SIMPLE_PHONE_ID_LAST; i++) { - const ECardPhone *phone = e_card_simple_get_phone(editor->simple, i); - gboolean checked; - checked = phone && phone->number && *phone->number; + for(i = 0; i < G_N_ELEMENTS (phones); i++) { + char *phone = e_contact_get (editor->contact, phones[i]); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(editor->phone_info[i].widget), - checked); + phone && *phone); + g_free (phone); } result = _arrow_pressed (widget, button, editor, editor->phone_popup, &editor->phone_list, &editor->phone_info, label); if (result != -1) { - editor->phone_choice[which - 1] = result; - set_fields(editor); + GtkWidget *w = glade_xml_get_widget (editor->gui, entry); + editor->phone_choice[which - 1] = phones[result]; + set_fields (editor); enable_widget (glade_xml_get_widget (editor->gui, label), TRUE); - enable_widget (glade_xml_get_widget (editor->gui, entry), editor->editable); + enable_widget (w, editor->editable); } g_free(label); @@ -1880,23 +1851,26 @@ _email_arrow_pressed (GtkWidget *widget, GdkEventButton *button, EContactEditor e_contact_editor_build_email_ui (editor); - for(i = 0; i < E_CARD_SIMPLE_EMAIL_ID_LAST; i++) { - const char *string = e_card_simple_get_email(editor->simple, i); + for(i = 0; i < G_N_ELEMENTS (emails); i++) { + char *string = e_contact_get (editor->contact, emails[i]); gboolean checked; checked = string && *string; gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(editor->email_info[i].widget), checked); + g_free (string); } result = _arrow_pressed (widget, button, editor, editor->email_popup, &editor->email_list, &editor->email_info, "label-email1"); if (result != -1) { + GtkWidget *entry = glade_xml_get_widget (editor->gui, "entry-email1"); editor->email_choice = result; - set_fields(editor); + + set_fields (editor); /* make sure the buttons/entry is/are sensitive */ enable_widget (glade_xml_get_widget (editor->gui, "label-email1"), TRUE); - enable_widget (glade_xml_get_widget (editor->gui, "entry-email1"), editor->editable); + enable_widget (entry, editor->editable); enable_widget (glade_xml_get_widget (editor->gui, "checkbutton-htmlmail"), editor->editable); } } @@ -1904,6 +1878,7 @@ _email_arrow_pressed (GtkWidget *widget, GdkEventButton *button, EContactEditor static void _address_arrow_pressed (GtkWidget *widget, GdkEventButton *button, EContactEditor *editor) { +#if notyet int i; int result; @@ -1927,11 +1902,13 @@ _address_arrow_pressed (GtkWidget *widget, GdkEventButton *button, EContactEdito enable_widget (glade_xml_get_widget (editor->gui, "text-address"), editor->address_editable[result]); enable_widget (glade_xml_get_widget (editor->gui, "checkbutton-mailingaddress"), editor->address_editable[result]); } +#endif } static void find_address_mailing (EContactEditor *editor) { +#if notyet const ECardDeliveryAddress *address; int i; @@ -1951,6 +1928,7 @@ find_address_mailing (EContactEditor *editor) } } } +#endif } static void @@ -1971,9 +1949,9 @@ set_field(EContactEditor *editor, GtkEntry *entry, const char *string) } static void -set_phone_field(EContactEditor *editor, GtkWidget *entry, const ECardPhone *phone) +set_phone_field(EContactEditor *editor, GtkWidget *entry, const char *phone_number) { - set_field(editor, GTK_ENTRY(entry), phone ? phone->number : ""); + set_field(editor, GTK_ENTRY(entry), phone_number ? phone_number : ""); } static void @@ -1985,28 +1963,28 @@ set_fields(EContactEditor *editor) entry = glade_xml_get_widget(editor->gui, "entry-phone1"); if (entry && GTK_IS_ENTRY(entry)) - set_phone_field(editor, entry, e_card_simple_get_phone(editor->simple, editor->phone_choice[0])); + set_phone_field(editor, entry, e_contact_get_const(editor->contact, editor->phone_choice[0])); entry = glade_xml_get_widget(editor->gui, "entry-phone2"); if (entry && GTK_IS_ENTRY(entry)) - set_phone_field(editor, entry, e_card_simple_get_phone(editor->simple, editor->phone_choice[1])); + set_phone_field(editor, entry, e_contact_get_const(editor->contact, editor->phone_choice[1])); entry = glade_xml_get_widget(editor->gui, "entry-phone3"); if (entry && GTK_IS_ENTRY(entry)) - set_phone_field(editor, entry, e_card_simple_get_phone(editor->simple, editor->phone_choice[2])); + set_phone_field(editor, entry, e_contact_get_const(editor->contact, editor->phone_choice[2])); entry = glade_xml_get_widget(editor->gui, "entry-phone4"); if (entry && GTK_IS_ENTRY(entry)) - set_phone_field(editor, entry, e_card_simple_get_phone(editor->simple, editor->phone_choice[3])); + set_phone_field(editor, entry, e_contact_get_const(editor->contact, editor->phone_choice[3])); entry = glade_xml_get_widget(editor->gui, "entry-email1"); if (entry && GTK_IS_ENTRY(entry)) - set_field(editor, GTK_ENTRY(entry), e_card_simple_get_email(editor->simple, editor->email_choice)); - + set_field(editor, GTK_ENTRY(entry), e_contact_get_const(editor->contact, editor->email_choice)); e_contact_editor_build_address_ui (editor); +#if notyet for (i = 0; i < E_CARD_SIMPLE_ADDRESS_ID_LAST; i++) { const ECardAddrLabel *address = e_card_simple_get_address(editor->simple, i); @@ -2024,11 +2002,13 @@ set_fields(EContactEditor *editor) } set_address_field(editor, i); +#endif } static void set_address_field(EContactEditor *editor, int result) { +#if notyet GtkWidget *text, *check; text = glade_xml_get_widget(editor->gui, "text-address"); @@ -2064,73 +2044,29 @@ set_address_field(EContactEditor *editor, int result) editor->address_choice = result; } -} - -static void -add_field_callback(GtkWidget *widget, EContactEditor *editor) -{ - const char *name; - int i; - static const char *builtins[] = { - "entry-fullname", - "entry-web", - "entry-company", - "entry-department", - "entry-office", - "entry-jobtitle", - "entry-profession", - "entry-manager", - "entry-assistant", - "entry-nickname", - "entry-spouse", - "text-comments", - "entry-categories", - "entry-file-as", - "dateedit-anniversary", - "dateedit-birthday", - "entry-phone1", - "entry-phone2", - "entry-phone3", - "entry-phone4", - "entry-email1", - "text-address", - "checkbutton-mailingaddress", - "checkbutton-htmlmail", - "entry-caluri", - "entry-fburl", - NULL - }; - name = glade_get_widget_name(widget); - if (name) { - for (i = 0; builtins[i]; i++) { - if (!strcmp(name, builtins[i])) - return; - } - if (GTK_IS_ENTRY(widget) || GTK_IS_TEXT_VIEW(widget)) { - editor->arbitrary_fields = g_list_prepend(editor->arbitrary_fields, g_strdup(name)); - } - } +#endif } static struct { char *id; - char *key; + EContactField field; } field_mapping [] = { - { "entry-fullname", "full_name" }, - { "entry-web", "url" }, - { "entry-company", "org" }, - { "entry-department", "org_unit" }, - { "entry-office", "office" }, - { "entry-jobtitle", "title" }, - { "entry-profession", "role" }, - { "entry-manager", "manager" }, - { "entry-assistant", "assistant" }, - { "entry-nickname", "nickname" }, - { "entry-spouse", "spouse" }, - { "text-comments", "note" }, - { "entry-categories", "categories" }, - { "entry-caluri", "caluri" }, - { "entry-fburl", "fburl" }, + { "entry-fullname", E_CONTACT_FULL_NAME }, + { "entry-web", E_CONTACT_HOMEPAGE_URL }, + { "entry-blog", E_CONTACT_BLOG_URL }, + { "entry-company", E_CONTACT_ORG }, + { "entry-department", E_CONTACT_ORG_UNIT }, + { "entry-office", E_CONTACT_OFFICE }, + { "entry-jobtitle", E_CONTACT_TITLE }, + { "entry-profession", E_CONTACT_ROLE }, + { "entry-manager", E_CONTACT_MANAGER }, + { "entry-assistant", E_CONTACT_ASSISTANT }, + { "entry-nickname", E_CONTACT_NICKNAME }, + { "entry-spouse", E_CONTACT_SPOUSE }, + { "text-comments", E_CONTACT_NOTE }, + { "entry-categories", E_CONTACT_CATEGORIES }, + { "entry-caluri", E_CONTACT_CALENDAR_URI }, + { "entry-fburl", E_CONTACT_FREEBUSY_URL }, }; static void @@ -2159,36 +2095,6 @@ fill_in_field(EContactEditor *editor, char *id, char *value) } static void -fill_in_card_field(EContactEditor *editor, ECard *card, char *id, char *key) -{ - char *string; - g_object_get (card, - key, &string, - NULL); - fill_in_field(editor, id, string); - g_free (string); -} - -static void -fill_in_single_field(EContactEditor *editor, char *name) -{ - ECardSimple *simple = editor->simple; - GtkWidget *widget = glade_xml_get_widget(editor->gui, name); - - if (widget && GTK_IS_EDITABLE(widget)) { - int position = 0; - GtkEditable *editable = GTK_EDITABLE(widget); - const ECardArbitrary *arbitrary; - - gtk_editable_delete_text(editable, 0, -1); - arbitrary = e_card_simple_get_arbitrary(simple, - name); - if (arbitrary && arbitrary->value) - gtk_editable_insert_text(editable, arbitrary->value, strlen(arbitrary->value), &position); - } -} - -static void disable_widget_foreach (char *key, GtkWidget *widget, gpointer closure) { enable_widget (widget, FALSE); @@ -2196,62 +2102,65 @@ disable_widget_foreach (char *key, GtkWidget *widget, gpointer closure) static struct { char *widget_name; - ECardSimpleField field_id; + EContactField field_id; gboolean desensitize_for_read_only; } widget_field_mappings[] = { - { "entry-web", E_CARD_SIMPLE_FIELD_URL, TRUE }, - { "accellabel-web", E_CARD_SIMPLE_FIELD_URL }, + { "entry-web", E_CONTACT_HOMEPAGE_URL, TRUE }, + { "accellabel-web", E_CONTACT_HOMEPAGE_URL }, - { "entry-jobtitle", E_CARD_SIMPLE_FIELD_TITLE, TRUE }, - { "label-jobtitle", E_CARD_SIMPLE_FIELD_TITLE }, + { "entry-blog", E_CONTACT_BLOG_URL, TRUE }, + { "accellabel-blog", E_CONTACT_BLOG_URL }, - { "entry-company", E_CARD_SIMPLE_FIELD_ORG, TRUE }, - { "label-company", E_CARD_SIMPLE_FIELD_ORG }, + { "entry-jobtitle", E_CONTACT_TITLE, TRUE }, + { "label-jobtitle", E_CONTACT_TITLE }, - { "combo-file-as", E_CARD_SIMPLE_FIELD_FILE_AS, TRUE }, - { "entry-file-as", E_CARD_SIMPLE_FIELD_FILE_AS, TRUE }, - { "accellabel-fileas", E_CARD_SIMPLE_FIELD_FILE_AS }, + { "entry-company", E_CONTACT_ORG, TRUE }, + { "label-company", E_CONTACT_ORG }, - { "label-department", E_CARD_SIMPLE_FIELD_ORG_UNIT }, - { "entry-department", E_CARD_SIMPLE_FIELD_ORG_UNIT, TRUE }, + { "combo-file-as", E_CONTACT_FILE_AS, TRUE }, + { "entry-file-as", E_CONTACT_FILE_AS, TRUE }, + { "accellabel-fileas", E_CONTACT_FILE_AS }, - { "label-office", E_CARD_SIMPLE_FIELD_OFFICE }, - { "entry-office", E_CARD_SIMPLE_FIELD_OFFICE, TRUE }, + { "label-department", E_CONTACT_ORG_UNIT }, + { "entry-department", E_CONTACT_ORG_UNIT, TRUE }, - { "label-profession", E_CARD_SIMPLE_FIELD_ROLE }, - { "entry-profession", E_CARD_SIMPLE_FIELD_ROLE, TRUE }, + { "label-office", E_CONTACT_OFFICE }, + { "entry-office", E_CONTACT_OFFICE, TRUE }, - { "label-manager", E_CARD_SIMPLE_FIELD_MANAGER }, - { "entry-manager", E_CARD_SIMPLE_FIELD_MANAGER, TRUE }, + { "label-profession", E_CONTACT_ROLE }, + { "entry-profession", E_CONTACT_ROLE, TRUE }, - { "label-assistant", E_CARD_SIMPLE_FIELD_ASSISTANT }, - { "entry-assistant", E_CARD_SIMPLE_FIELD_ASSISTANT, TRUE }, + { "label-manager", E_CONTACT_MANAGER }, + { "entry-manager", E_CONTACT_MANAGER, TRUE }, - { "label-nickname", E_CARD_SIMPLE_FIELD_NICKNAME }, - { "entry-nickname", E_CARD_SIMPLE_FIELD_NICKNAME, TRUE }, + { "label-assistant", E_CONTACT_ASSISTANT }, + { "entry-assistant", E_CONTACT_ASSISTANT, TRUE }, - { "label-spouse", E_CARD_SIMPLE_FIELD_SPOUSE }, - { "entry-spouse", E_CARD_SIMPLE_FIELD_SPOUSE, TRUE }, + { "label-nickname", E_CONTACT_NICKNAME }, + { "entry-nickname", E_CONTACT_NICKNAME, TRUE }, - { "label-birthday", E_CARD_SIMPLE_FIELD_BIRTH_DATE }, - { "dateedit-birthday", E_CARD_SIMPLE_FIELD_BIRTH_DATE, TRUE }, + { "label-spouse", E_CONTACT_SPOUSE }, + { "entry-spouse", E_CONTACT_SPOUSE, TRUE }, - { "label-anniversary", E_CARD_SIMPLE_FIELD_ANNIVERSARY }, - { "dateedit-anniversary", E_CARD_SIMPLE_FIELD_ANNIVERSARY, TRUE }, + { "label-birthday", E_CONTACT_BIRTH_DATE }, + { "dateedit-birthday", E_CONTACT_BIRTH_DATE, TRUE }, - { "label-comments", E_CARD_SIMPLE_FIELD_NOTE }, - { "text-comments", E_CARD_SIMPLE_FIELD_NOTE, TRUE }, + { "label-anniversary", E_CONTACT_ANNIVERSARY }, + { "dateedit-anniversary", E_CONTACT_ANNIVERSARY, TRUE }, - { "entry-fullname", E_CARD_SIMPLE_FIELD_FULL_NAME, TRUE }, + { "label-comments", E_CONTACT_NOTE }, + { "text-comments", E_CONTACT_NOTE, TRUE }, - { "button-categories", E_CARD_SIMPLE_FIELD_CATEGORIES, TRUE }, - { "entry-categories", E_CARD_SIMPLE_FIELD_CATEGORIES, TRUE }, + { "entry-fullname", E_CONTACT_FULL_NAME, TRUE }, - { "label-caluri", E_CARD_SIMPLE_FIELD_CALURI }, - { "entry-caluri", E_CARD_SIMPLE_FIELD_CALURI, TRUE }, + { "button-categories", E_CONTACT_CATEGORIES, TRUE }, + { "entry-categories", E_CONTACT_CATEGORIES, TRUE }, - { "label-fburl", E_CARD_SIMPLE_FIELD_FBURL }, - { "entry-fburl", E_CARD_SIMPLE_FIELD_FBURL, TRUE } + { "label-caluri", E_CONTACT_CALENDAR_URI }, + { "entry-caluri", E_CONTACT_CALENDAR_URI, TRUE }, + + { "label-fburl", E_CONTACT_FREEBUSY_URL }, + { "entry-fburl", E_CONTACT_FREEBUSY_URL, TRUE } }; static int num_widget_field_mappings = sizeof(widget_field_mappings) / sizeof (widget_field_mappings[0]); @@ -2262,35 +2171,32 @@ enable_writable_fields(EContactEditor *editor) EIterator *iter; GHashTable *dropdown_hash, *supported_hash; int i; - ECardSimple *simple; - ECard *card; char *widget_name; if (!fields) return; - card = e_card_new (""); - simple = e_card_simple_new (card); - dropdown_hash = g_hash_table_new (g_str_hash, g_str_equal); supported_hash = g_hash_table_new (g_str_hash, g_str_equal); /* build our hashtable of the drop down menu items */ e_contact_editor_build_phone_ui (editor); - for (i = 0; i < E_CARD_SIMPLE_PHONE_ID_LAST; i ++) + for (i = 0; i < G_N_ELEMENTS (phones); i ++) g_hash_table_insert (dropdown_hash, - (char*)e_card_simple_get_ecard_field(simple, e_card_simple_map_phone_to_field (i)), + (char*)e_contact_field_name(phones[i]), editor->phone_info[i].widget); e_contact_editor_build_email_ui (editor); - for (i = 0; i < E_CARD_SIMPLE_EMAIL_ID_LAST; i ++) + for (i = 0; i < G_N_ELEMENTS (emails); i ++) g_hash_table_insert (dropdown_hash, - (char*)e_card_simple_get_ecard_field(simple, e_card_simple_map_email_to_field (i)), + (char*)e_contact_field_name(phones[i]), editor->email_info[i].widget); +#if notyet e_contact_editor_build_address_ui (editor); for (i = 0; i < E_CARD_SIMPLE_ADDRESS_ID_LAST; i ++) g_hash_table_insert (dropdown_hash, (char*)e_card_simple_get_ecard_field(simple, e_card_simple_map_address_to_field (i)), editor->address_info[i].widget); +#endif /* then disable them all */ g_hash_table_foreach (dropdown_hash, (GHFunc)disable_widget_foreach, NULL); @@ -2332,28 +2238,30 @@ enable_writable_fields(EContactEditor *editor) g_hash_table_insert (supported_hash, field, field); } +#if notyet for (i = 0; i < E_CARD_SIMPLE_ADDRESS_ID_LAST; i ++) { if (!strcmp (field, e_card_simple_get_ecard_field (simple, e_card_simple_map_address_to_field(i)))) { editor->address_editable [i] = TRUE; } } +#endif /* ugh - this is needed to make sure we don't have a disabled label next to a drop down when the item in the menu (the one reflected in the label) is enabled. */ - if (!strcmp (field, e_card_simple_get_ecard_field (simple, e_card_simple_map_email_to_field(editor->email_choice)))) { + if (!strcmp (field, e_contact_field_name (editor->email_choice))) { enable_widget (glade_xml_get_widget (editor->gui, "label-email1"), TRUE); enable_widget (glade_xml_get_widget (editor->gui, "entry-email1"), editor->editable); enable_widget (glade_xml_get_widget (editor->gui, "checkbutton-htmlmail"), editor->editable); } - else if (!strcmp (field, e_card_simple_get_ecard_field (simple, e_card_simple_map_address_to_field(editor->address_choice)))) { + else if (!strcmp (field, e_contact_field_name (editor->address_choice))) { enable_widget (glade_xml_get_widget (editor->gui, "label-address"), TRUE); enable_widget (glade_xml_get_widget (editor->gui, "checkbutton-mailingaddress"), editor->editable); enable_widget (glade_xml_get_widget (editor->gui, "text-address"), editor->editable); } else for (i = 0; i < 4; i ++) { - if (!strcmp (field, e_card_simple_get_ecard_field (simple, e_card_simple_map_phone_to_field(editor->phone_choice[i])))) { + if (!strcmp (field, e_contact_field_name (editor->phone_choice[i]))) { widget_name = g_strdup_printf ("label-phone%d", i+1); enable_widget (glade_xml_get_widget (editor->gui, widget_name), TRUE); g_free (widget_name); @@ -2377,8 +2285,7 @@ enable_writable_fields(EContactEditor *editor) widget_field_mappings[i].widget_name); continue; } - field = e_card_simple_get_ecard_field (simple, - widget_field_mappings[i].field_id); + field = e_contact_field_name (widget_field_mappings[i].field_id); enabled = (g_hash_table_lookup (supported_hash, field) != NULL); @@ -2393,8 +2300,6 @@ enable_writable_fields(EContactEditor *editor) g_hash_table_destroy (dropdown_hash); g_hash_table_destroy (supported_hash); - g_object_unref (simple); - g_object_unref (card); } static void @@ -2436,51 +2341,46 @@ set_editable (EContactEditor *editor) static void fill_in_info(EContactEditor *editor) { - ECard *card = editor->card; - if (card) { + EContact *contact = editor->contact; + if (contact) { char *file_as; - ECardName *name; - const ECardDate *anniversary; - const ECardDate *bday; + EContactName *name; + EContactDate *anniversary; + EContactDate *bday; int i; GtkWidget *widget; - GList *list; - gboolean wants_html, wants_html_set; - - g_object_get (card, - "file_as", &file_as, - "name", &name, - "anniversary", &anniversary, - "birth_date", &bday, - "wants_html_set", &wants_html_set, - "wants_html", &wants_html, - NULL); - - for (i = 0; i < sizeof(field_mapping) / sizeof(field_mapping[0]); i++) { - fill_in_card_field(editor, card, field_mapping[i].id, field_mapping[i].key); - } + gboolean wants_html; + + g_object_get (contact, + "file_as", &file_as, + "name", &name, + "anniversary", &anniversary, + "birth_date", &bday, + "wants_html", &wants_html, + NULL); - for (list = editor->arbitrary_fields; list; list = list->next) { - fill_in_single_field(editor, list->data); + for (i = 0; i < sizeof(field_mapping) / sizeof(field_mapping[0]); i++) { + char *string = e_contact_get (contact, field_mapping[i].field); + fill_in_field(editor, field_mapping[i].id, string); + g_free (string); } find_address_mailing (editor); - if (wants_html_set) { - GtkWidget *widget = glade_xml_get_widget(editor->gui, "checkbutton-htmlmail"); - if (widget && GTK_IS_CHECK_BUTTON(widget)) { - g_object_set (widget, - "active", wants_html, - NULL); - } + widget = glade_xml_get_widget(editor->gui, "checkbutton-htmlmail"); + if (widget && GTK_IS_CHECK_BUTTON(widget)) { + g_object_set (widget, + "active", wants_html, + NULL); } /* File as has to come after company and name or else it'll get messed up when setting them. */ fill_in_field(editor, "entry-file-as", file_as); - g_free (file_as); - e_card_name_unref(editor->name); - editor->name = e_card_name_ref(name); + g_free (file_as); + if (editor->name) + e_contact_name_free(editor->name); + editor->name = name; widget = glade_xml_get_widget(editor->gui, "dateedit-anniversary"); if (widget && E_IS_DATE_EDIT(widget)) { @@ -2508,12 +2408,15 @@ fill_in_info(EContactEditor *editor) e_date_edit_set_time (dateedit, -1); } + e_contact_date_free (anniversary); + e_contact_date_free (bday); + set_fields(editor); } } static void -extract_field(EContactEditor *editor, ECard *card, char *editable_id, char *key) +extract_field(EContactEditor *editor, EContact *contact, char *editable_id, EContactField field) { GtkWidget *widget = glade_xml_get_widget(editor->gui, editable_id); char *string = NULL; @@ -2538,50 +2441,22 @@ extract_field(EContactEditor *editor, ECard *card, char *editable_id, char *key) } if (string && *string) - g_object_set (card, - key, string, - NULL); + e_contact_set (contact, field, string); else - g_object_set (card, - key, NULL, - NULL); + e_contact_set (contact, field, NULL); if (string) g_free(string); } static void -extract_single_field(EContactEditor *editor, char *name) -{ - GtkWidget *widget = glade_xml_get_widget(editor->gui, name); - ECardSimple *simple = editor->simple; - if (widget && GTK_IS_EDITABLE(widget)) { - GtkEditable *editable = GTK_EDITABLE(widget); - char *string = gtk_editable_get_chars(editable, 0, -1); - - if (string && *string) - e_card_simple_set_arbitrary(simple, - name, - NULL, - string); - else - e_card_simple_set_arbitrary(simple, - name, - NULL, - NULL); - if (string) g_free(string); - } -} - -static void extract_info(EContactEditor *editor) { - ECard *card = editor->card; - if (card) { - ECardDate anniversary; - ECardDate bday; + EContact *contact = editor->contact; + if (contact) { + EContactDate anniversary; + EContactDate bday; int i; GtkWidget *widget; - GList *list; widget = glade_xml_get_widget(editor->gui, "entry-file-as"); if (widget && GTK_IS_EDITABLE(widget)) { @@ -2589,25 +2464,17 @@ extract_info(EContactEditor *editor) char *string = gtk_editable_get_chars(editable, 0, -1); if (string && *string) - g_object_set (card, - "file_as", string, - NULL); + e_contact_set (contact, E_CONTACT_FILE_AS, string); - if (string) g_free(string); + g_free(string); } for (i = 0; i < sizeof(field_mapping) / sizeof(field_mapping[0]); i++) { - extract_field(editor, card, field_mapping[i].id, field_mapping[i].key); - } - - for (list = editor->arbitrary_fields; list; list = list->next) { - extract_single_field(editor, list->data); + extract_field(editor, contact, field_mapping[i].id, field_mapping[i].field); } if (editor->name) - g_object_set (card, - "name", editor->name, - NULL); + e_contact_set (contact, E_CONTACT_NAME, editor->name); widget = glade_xml_get_widget(editor->gui, "dateedit-anniversary"); if (widget && E_IS_DATE_EDIT(widget)) { @@ -2616,13 +2483,9 @@ extract_info(EContactEditor *editor) &anniversary.month, &anniversary.day)) { /* g_print ("%d %d %d\n", anniversary.year, anniversary.month, anniversary.day); */ - g_object_set (card, - "anniversary", &anniversary, - NULL); + e_contact_set (contact, E_CONTACT_ANNIVERSARY, &anniversary); } else - g_object_set (card, - "anniversary", NULL, - NULL); + e_contact_set (contact, E_CONTACT_ANNIVERSARY, NULL); } widget = glade_xml_get_widget(editor->gui, "dateedit-birthday"); @@ -2632,13 +2495,9 @@ extract_info(EContactEditor *editor) &bday.month, &bday.day)) { /* g_print ("%d %d %d\n", bday.year, bday.month, bday.day); */ - g_object_set (card, - "birth_date", &bday, - NULL); + e_contact_set (contact, E_CONTACT_BIRTH_DATE, &bday); } else - g_object_set (card, - "birth_date", NULL, - NULL); + e_contact_set (contact, E_CONTACT_BIRTH_DATE, NULL); } } } diff --git a/addressbook/gui/contact-editor/e-contact-editor.h b/addressbook/gui/contact-editor/e-contact-editor.h index 8642aecac1..efee496539 100644 --- a/addressbook/gui/contact-editor/e-contact-editor.h +++ b/addressbook/gui/contact-editor/e-contact-editor.h @@ -25,9 +25,8 @@ #include <bonobo/bonobo-ui-component.h> #include <glade/glade.h> -#include "addressbook/backend/ebook/e-book.h" -#include "addressbook/backend/ebook/e-card.h" -#include "addressbook/backend/ebook/e-card-simple.h" +#include "addressbook/backend/ebook/e-book-async.h" +#include "addressbook/backend/ebook/e-contact.h" G_BEGIN_DECLS @@ -56,8 +55,7 @@ struct _EContactEditor /* item specific fields */ EBook *book; - ECard *card; - ECardSimple *simple; + EContact *contact; /* UI handler */ BonoboUIComponent *uic; @@ -74,20 +72,18 @@ struct _EContactEditor GList *phone_list; GList *address_list; - ECardName *name; + EContactName *name; char *company; - ECardSimpleEmailId email_choice; - ECardSimplePhoneId phone_choice[4]; - ECardSimpleAddressId address_choice; - ECardSimpleAddressId address_mailing; + EContactField email_choice; + EContactField phone_choice[4]; + EContactField address_choice; + EContactField address_mailing; - GList *arbitrary_fields; + /* Whether we are editing a new contact or an existing one */ + guint is_new_contact : 1; - /* Whether we are editing a new card or an existing one */ - guint is_new_card : 1; - - /* Whether the card has been changed since bringing up the contact editor */ + /* Whether the contact has been changed since bringing up the contact editor */ guint changed : 1; /* Whether the contact editor will accept modifications */ @@ -96,8 +92,10 @@ struct _EContactEditor /* Whether the fullname will accept modifications */ guint fullname_editable : 1; +#if notyet /* Whether each of the addresses are editable */ gboolean address_editable[E_CARD_SIMPLE_ADDRESS_ID_LAST]; +#endif /* Whether an async wombat call is in progress */ guint in_async_call : 1; @@ -111,15 +109,15 @@ struct _EContactEditorClass /* Notification signals */ - void (* card_added) (EContactEditor *ce, EBookStatus status, ECard *card); - void (* card_modified) (EContactEditor *ce, EBookStatus status, ECard *card); - void (* card_deleted) (EContactEditor *ce, EBookStatus status, ECard *card); - void (* editor_closed) (EContactEditor *ce); + void (* contact_added) (EContactEditor *ce, EBookStatus status, EContact *contact); + void (* contact_modified) (EContactEditor *ce, EBookStatus status, EContact *contact); + void (* contact_deleted) (EContactEditor *ce, EBookStatus status, EContact *contact); + void (* editor_closed) (EContactEditor *ce); }; EContactEditor *e_contact_editor_new (EBook *book, - ECard *card, - gboolean is_new_card, + EContact *contact, + gboolean is_new_contact, gboolean editable); GType e_contact_editor_get_type (void); diff --git a/addressbook/gui/contact-editor/e-contact-quick-add.c b/addressbook/gui/contact-editor/e-contact-quick-add.c index 703996ee07..65b321c997 100644 --- a/addressbook/gui/contact-editor/e-contact-quick-add.c +++ b/addressbook/gui/contact-editor/e-contact-quick-add.c @@ -37,17 +37,17 @@ #include <libgnomeui/gnome-app.h> #include <addressbook/gui/component/addressbook.h> #include <addressbook/backend/ebook/e-book.h> -#include <addressbook/backend/ebook/e-book-util.h> -#include <addressbook/backend/ebook/e-card.h> +#include <addressbook/util/eab-book-util.h> +#include <addressbook/backend/ebook/e-contact.h> #include "e-contact-editor.h" #include "e-contact-quick-add.h" -#include "e-card-merging.h" +#include "eab-contact-merging.h" typedef struct _QuickAdd QuickAdd; struct _QuickAdd { gchar *name; gchar *email; - ECard *card; + EContact *contact; EContactQuickAddCallback cb; gpointer closure; @@ -63,7 +63,7 @@ static QuickAdd * quick_add_new (void) { QuickAdd *qa = g_new0 (QuickAdd, 1); - qa->card = e_card_new (""); + qa->contact = e_contact_new (); qa->refs = 1; return qa; } @@ -84,7 +84,7 @@ quick_add_unref (QuickAdd *qa) if (qa->refs == 0) { g_free (qa->name); g_free (qa->email); - g_object_unref (qa->card); + g_object_unref (qa->contact); g_free (qa); } } @@ -93,7 +93,8 @@ quick_add_unref (QuickAdd *qa) static void quick_add_set_name (QuickAdd *qa, const gchar *name) { - ECardName *card_name; +#if notyet + EContactName *card_name; if (name == qa->name) return; @@ -108,23 +109,19 @@ quick_add_set_name (QuickAdd *qa, const gchar *name) NULL); e_card_name_unref (card_name); +#endif } static void quick_add_set_email (QuickAdd *qa, const gchar *email) { - ECardSimple *simple; - if (email == qa->email) return; g_free (qa->email); qa->email = g_strdup (email); - simple = e_card_simple_new (qa->card); - e_card_simple_set (simple, E_CARD_SIMPLE_FIELD_EMAIL, email); - e_card_simple_sync_card (simple); - g_object_unref (simple); + e_contact_set (qa->contact, E_CONTACT_EMAIL_1, (char*)email); } static void @@ -132,10 +129,10 @@ merge_cb (EBook *book, EBookStatus status, gpointer closure) { QuickAdd *qa = (QuickAdd *) closure; - if (status == E_BOOK_STATUS_SUCCESS) { - e_card_merging_book_add_card (book, qa->card, NULL, NULL); + if (status == E_BOOK_ERROR_OK) { + eab_merging_book_add_contact (book, qa->contact, NULL, NULL); if (qa->cb) - qa->cb (qa->card, qa->closure); + qa->cb (qa->contact, qa->closure); g_object_unref (book); } else { /* Something went wrong. */ @@ -149,14 +146,11 @@ merge_cb (EBook *book, EBookStatus status, gpointer closure) } static void -quick_add_merge_card (QuickAdd *qa) +quick_add_merge_contact (QuickAdd *qa) { - EBook *book; - quick_add_ref (qa); - book = e_book_new (); - addressbook_load_default_book (book, merge_cb, qa); + addressbook_load_default_book (merge_cb, qa); } @@ -165,14 +159,14 @@ quick_add_merge_card (QuickAdd *qa) */ static void -card_added_cb (EContactEditor *ce, EBookStatus status, ECard *card, gpointer closure) +contact_added_cb (EContactEditor *ce, EBookStatus status, EContact *contact, gpointer closure) { QuickAdd *qa = (QuickAdd *) g_object_get_data (G_OBJECT (ce), "quick_add"); if (qa) { if (qa->cb) - qa->cb (qa->card, qa->closure); + qa->cb (qa->contact, qa->closure); /* We don't need to unref qa because we set_data_full below */ g_object_set_data (G_OBJECT (ce), "quick_add", NULL); @@ -196,13 +190,13 @@ ce_have_book (EBook *book, EBookStatus status, gpointer closure) { QuickAdd *qa = (QuickAdd *) closure; - if (status != E_BOOK_STATUS_SUCCESS) { + if (status != E_BOOK_ERROR_OK) { if (book) g_object_unref (book); g_warning ("Couldn't open local address book."); quick_add_unref (qa); } else { - EContactEditor *contact_editor = e_contact_editor_new (book, qa->card, TRUE, TRUE /* XXX */); + EContactEditor *contact_editor = e_contact_editor_new (book, qa->contact, TRUE, TRUE /* XXX */); /* mark it as changed so the Save buttons are enabled when we bring up the dialog. */ g_object_set (contact_editor, @@ -210,14 +204,14 @@ ce_have_book (EBook *book, EBookStatus status, gpointer closure) NULL); /* We pass this via object data, so that we don't get a dangling pointer referenced if both - the "card_added" and "editor_closed" get emitted. (Which, based on a backtrace in bugzilla, + the "contact_added" and "editor_closed" get emitted. (Which, based on a backtrace in bugzilla, I think can happen and cause a crash. */ g_object_set_data_full (G_OBJECT (contact_editor), "quick_add", qa, (GDestroyNotify) quick_add_unref); g_signal_connect (contact_editor, - "card_added", - G_CALLBACK (card_added_cb), + "contact_added", + G_CALLBACK (contact_added_cb), NULL); g_signal_connect (contact_editor, "editor_closed", @@ -229,11 +223,9 @@ ce_have_book (EBook *book, EBookStatus status, gpointer closure) } static void -edit_card (QuickAdd *qa) +edit_contact (QuickAdd *qa) { - EBook *book; - book = e_book_new (); - addressbook_load_default_book (book, ce_have_book, qa); + addressbook_load_default_book (ce_have_book, qa); } #define QUICK_ADD_RESPONSE_EDIT_FULL 2 @@ -272,12 +264,12 @@ clicked_cb (GtkWidget *w, gint button, gpointer closure) if (button == GTK_RESPONSE_OK) { /* OK */ - quick_add_merge_card (qa); + quick_add_merge_contact (qa); } else if (button == QUICK_ADD_RESPONSE_EDIT_FULL) { /* EDIT FULL */ - edit_card (qa); + edit_contact (qa); } else { /* CANCEL */ diff --git a/addressbook/gui/contact-editor/e-contact-quick-add.h b/addressbook/gui/contact-editor/e-contact-quick-add.h index 1bf69ee114..ad98c73c23 100644 --- a/addressbook/gui/contact-editor/e-contact-quick-add.h +++ b/addressbook/gui/contact-editor/e-contact-quick-add.h @@ -27,9 +27,9 @@ #ifndef __E_CONTACT_QUICK_ADD_H__ #define __E_CONTACT_QUICK_ADD_H__ -#include <addressbook/backend/ebook/e-card.h> +#include <addressbook/backend/ebook/e-contact.h> -typedef void (*EContactQuickAddCallback) (ECard *new_card, gpointer closure); +typedef void (*EContactQuickAddCallback) (EContact *new_contact, gpointer closure); void e_contact_quick_add (const gchar *name, const gchar *email, EContactQuickAddCallback cb, gpointer closure); diff --git a/addressbook/gui/contact-editor/e-contact-save-as.c b/addressbook/gui/contact-editor/e-contact-save-as.c deleted file mode 100644 index a141560763..0000000000 --- a/addressbook/gui/contact-editor/e-contact-save-as.c +++ /dev/null @@ -1,218 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* e-contact-editor.h - * Copyright (C) 2000 Ximian, Inc. - * Author: Chris Lahey <clahey@ximian.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is 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 <config.h> - -#include "e-contact-save-as.h" - -#include <unistd.h> -#include <fcntl.h> -#include <gtk/gtkfilesel.h> -#include <gtk/gtksignal.h> -#include <gtk/gtkmessagedialog.h> -#include <gal/util/e-util.h> -#include <libgnome/gnome-i18n.h> -#include <errno.h> -#include <string.h> -#include <libgnomeui/gnome-messagebox.h> - -static gint file_exists(GtkFileSelection *filesel, const char *filename); - -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 -e_contact_save_as(char *title, ECard *card, GtkWindow *parent_window) -{ - GtkFileSelection *filesel; - char *file; - char *name; - SaveAsInfo *info = g_new(SaveAsInfo, 1); - - filesel = GTK_FILE_SELECTION(gtk_file_selection_new(title)); - - g_object_get (card, - "file_as", &name, - NULL); - file = make_safe_filename (g_get_home_dir(), name); - gtk_file_selection_set_filename (filesel, file); - g_free (file); - g_free (name); - - info->filesel = filesel; - info->vcard = e_card_get_vcard(card); - - 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 -e_contact_list_save_as(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; - g_object_get (list->data, - "file_as", &name, - NULL); - file = make_safe_filename (g_get_home_dir(), name); - gtk_file_selection_set_filename (filesel, file); - g_free (file); - g_free (name); - } 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 = e_card_list_get_vcard (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)); -} - -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; -} diff --git a/addressbook/gui/contact-editor/e-contact-save-as.h b/addressbook/gui/contact-editor/e-contact-save-as.h deleted file mode 100644 index 2b01ad8435..0000000000 --- a/addressbook/gui/contact-editor/e-contact-save-as.h +++ /dev/null @@ -1,41 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* e-contact-save-as.h - * Copyright (C) 2000 Ximian, Inc. - * Author: Chris Lahey <clahey@ximian.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is 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_CONTACT_SAVE_AS_H__ -#define __E_CONTACT_SAVE_AS_H__ - -#include <gtk/gtkwindow.h> -#include <glade/glade.h> -#include "addressbook/backend/ebook/e-card.h" -#include "addressbook/backend/ebook/e-card-simple.h" - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus */ - -void e_contact_save_as (gchar *title, ECard *card, GtkWindow *parent_window); -void e_contact_list_save_as (gchar *title, GList *list, GtkWindow *parent_window); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - - -#endif /* __E_CONTACT_EDITOR_H__ */ diff --git a/addressbook/gui/contact-list-editor/contact-list-editor.glade b/addressbook/gui/contact-list-editor/contact-list-editor.glade index c64eebd520..002e697105 100644 --- a/addressbook/gui/contact-list-editor/contact-list-editor.glade +++ b/addressbook/gui/contact-list-editor/contact-list-editor.glade @@ -78,7 +78,7 @@ </child> <child> - <widget class="Custom" id="custom7"> + <widget class="Custom" id="list-image"> <property name="visible">True</property> <property name="creation_function">e_create_image_widget</property> <property name="string1">evolution-contacts-plain.png</property> diff --git a/addressbook/gui/contact-list-editor/e-contact-list-editor.c b/addressbook/gui/contact-list-editor/e-contact-list-editor.c index 39f251f5ee..a475d15cd6 100644 --- a/addressbook/gui/contact-list-editor/e-contact-list-editor.c +++ b/addressbook/gui/contact-list-editor/e-contact-list-editor.c @@ -30,12 +30,13 @@ #include <bonobo/bonobo-ui-util.h> #include <bonobo/bonobo-window.h> #include <gal/e-table/e-table-scrolled.h> +#include <libgnomevfs/gnome-vfs-ops.h> #include "shell/evolution-shell-component-utils.h" -#include "addressbook/gui/widgets/e-addressbook-util.h" +#include "addressbook/gui/widgets/eab-gui-util.h" +#include "addressbook/util/eab-book-util.h" #include "e-contact-editor.h" -#include "e-contact-save-as.h" #include "e-contact-list-model.h" #include "e-contact-list-editor-marshal.h" @@ -76,6 +77,17 @@ static void table_drag_data_received_cb (ETable *table, int row, int col, gint x, gint y, GtkSelectionData *selection_data, guint info, guint time, EContactListEditor *editor); +static gboolean image_drag_motion_cb (GtkWidget *widget, + GdkDragContext *context, + gint x, gint y, guint time, EContactListEditor *editor); +static gboolean image_drag_drop_cb (GtkWidget *widget, + GdkDragContext *context, + gint x, gint y, guint time, EContactListEditor *editor); +static void image_drag_data_received_cb (GtkWidget *widget, + GdkDragContext *context, + gint x, gint y, + GtkSelectionData *selection_data, + guint info, guint time, EContactListEditor *editor); static GtkObjectClass *parent_class = NULL; @@ -83,18 +95,26 @@ static guint contact_list_editor_signals[LAST_SIGNAL]; enum DndTargetType { DND_TARGET_TYPE_VCARD, + DND_TARGET_TYPE_URI_LIST }; #define VCARD_TYPE "text/x-vcard" -static GtkTargetEntry drag_types[] = { +#define URI_LIST_TYPE "text/uri-list" + +static GtkTargetEntry list_drag_types[] = { { VCARD_TYPE, 0, DND_TARGET_TYPE_VCARD }, }; -static const int num_drag_types = sizeof (drag_types) / sizeof (drag_types[0]); +static const int num_list_drag_types = sizeof (list_drag_types) / sizeof (list_drag_types[0]); + +static GtkTargetEntry image_drag_types[] = { + { URI_LIST_TYPE, 0, DND_TARGET_TYPE_URI_LIST }, +}; +static const int num_image_drag_types = sizeof (image_drag_types) / sizeof (image_drag_types[0]); /* The arguments we take */ enum { PROP_0, PROP_BOOK, - PROP_CARD, + PROP_CONTACT, PROP_IS_NEW_LIST, PROP_EDITABLE }; @@ -144,11 +164,11 @@ e_contact_list_editor_class_init (EContactListEditorClass *klass) E_TYPE_BOOK, 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)); g_object_class_install_property (object_class, PROP_IS_NEW_LIST, @@ -212,8 +232,10 @@ e_contact_list_editor_init (EContactListEditor *editor) GtkWidget *bonobo_win; BonoboUIContainer *container; char *icon_path; + GdkPixbuf *pixbuf; - editor->card = NULL; + editor->image_buf = NULL; + editor->contact = NULL; editor->changed = FALSE; editor->editable = TRUE; editor->in_async_call = FALSE; @@ -235,9 +257,17 @@ e_contact_list_editor_init (EContactListEditor *editor) editor->email_entry = glade_xml_get_widget (gui, "email-entry"); editor->list_name_entry = glade_xml_get_widget (gui, "list-name-entry"); - + editor->list_image = glade_xml_get_widget (gui, "list-image"); + if (GTK_IS_ALIGNMENT (editor->list_image)) { + /* deal with the e_create_image_widget code, that wraps the image in an alignment */ + editor->list_image = GTK_BIN (editor->list_image)->child; + } editor->visible_addrs_checkbutton = glade_xml_get_widget (gui, "visible-addrs-checkbutton"); + pixbuf = gtk_image_get_pixbuf (GTK_IMAGE (editor->list_image)); + editor->list_image_width = gdk_pixbuf_get_width (pixbuf); + editor->list_image_height = gdk_pixbuf_get_height (pixbuf); + /* Construct the app */ bonobo_win = bonobo_window_new ("contact-list-editor", _("Contact List Editor")); @@ -286,7 +316,7 @@ e_contact_list_editor_init (EContactListEditor *editor) "toggled", G_CALLBACK(visible_addrs_toggled_cb), editor); e_table_drag_dest_set (e_table_scrolled_get_table (E_TABLE_SCROLLED (editor->table)), - 0, drag_types, num_drag_types, GDK_ACTION_LINK); + 0, list_drag_types, num_list_drag_types, GDK_ACTION_LINK); g_signal_connect (e_table_scrolled_get_table (E_TABLE_SCROLLED (editor->table)), "table_drag_motion", G_CALLBACK(table_drag_motion_cb), editor); @@ -295,6 +325,14 @@ e_contact_list_editor_init (EContactListEditor *editor) g_signal_connect (e_table_scrolled_get_table (E_TABLE_SCROLLED (editor->table)), "table_drag_data_received", G_CALLBACK(table_drag_data_received_cb), editor); + gtk_drag_dest_set (editor->list_image, 0, image_drag_types, num_image_drag_types, GDK_ACTION_COPY); + g_signal_connect (editor->list_image, + "drag_motion", G_CALLBACK (image_drag_motion_cb), editor); + g_signal_connect (editor->list_image, + "drag_drop", G_CALLBACK (image_drag_drop_cb), editor); + g_signal_connect (editor->list_image, + "drag_data_received", G_CALLBACK (image_drag_data_received_cb), editor); + command_state_changed (editor); /* Connect to the deletion of the dialog */ @@ -311,6 +349,13 @@ e_contact_list_editor_init (EContactListEditor *editor) static void e_contact_list_editor_dispose (GObject *object) { + EContactListEditor *cle = E_CONTACT_LIST_EDITOR (object); + + if (cle->image_buf) { + g_free (cle->image_buf); + cle->image_buf = NULL; + } + if (G_OBJECT_CLASS (parent_class)->dispose) (* G_OBJECT_CLASS (parent_class)->dispose) (object); } @@ -330,12 +375,12 @@ list_added_cb (EBook *book, EBookStatus status, const char *id, EditorCloseStruc gtk_widget_set_sensitive (cle->app, TRUE); cle->in_async_call = FALSE; - e_card_set_id (cle->card, id); + e_contact_set (cle->contact, E_CONTACT_UID, (char*)id); g_signal_emit (cle, contact_list_editor_signals[LIST_ADDED], 0, - status, cle->card); + status, cle->contact); - if (status == E_BOOK_STATUS_SUCCESS) { + if (status == E_BOOK_ERROR_OK) { cle->is_new_list = FALSE; if (should_close) @@ -359,9 +404,9 @@ list_modified_cb (EBook *book, EBookStatus status, EditorCloseStruct *ecs) cle->in_async_call = FALSE; g_signal_emit (cle, contact_list_editor_signals[LIST_MODIFIED], 0, - status, cle->card); + status, cle->contact); - if (status == E_BOOK_STATUS_SUCCESS) { + if (status == E_BOOK_ERROR_OK) { if (should_close) close_dialog (cle); } @@ -371,7 +416,7 @@ list_modified_cb (EBook *book, EBookStatus status, EditorCloseStruct *ecs) } static void -save_card (EContactListEditor *cle, gboolean should_close) +save_contact (EContactListEditor *cle, gboolean should_close) { extract_info (cle); @@ -387,9 +432,9 @@ save_card (EContactListEditor *cle, gboolean should_close) cle->in_async_call = TRUE; if (cle->is_new_list) - e_book_add_card (cle->book, cle->card, (EBookIdCallback)list_added_cb, ecs); + e_book_async_add_contact (cle->book, cle->contact, (EBookIdCallback)list_added_cb, ecs); else - e_book_commit_card (cle->book, cle->card, (EBookCallback)list_modified_cb, ecs); + e_book_async_commit_contact (cle->book, cle->contact, (EBookCallback)list_modified_cb, ecs); cle->changed = FALSE; } @@ -416,9 +461,9 @@ prompt_to_save_changes (EContactListEditor *editor) if (!editor->changed || !is_named (editor)) return TRUE; - switch (e_addressbook_prompt_save_dialog (GTK_WINDOW(editor->app))) { + switch (eab_prompt_save_dialog (GTK_WINDOW(editor->app))) { case GTK_RESPONSE_YES: - save_card (editor, FALSE); + save_contact (editor, FALSE); return TRUE; case GTK_RESPONSE_NO: return TRUE; @@ -444,7 +489,7 @@ file_save_cb (GtkWidget *widget, gpointer data) { EContactListEditor *cle = E_CONTACT_LIST_EDITOR (data); - save_card (cle, FALSE); + save_contact (cle, FALSE); } static void @@ -454,7 +499,7 @@ file_save_as_cb (GtkWidget *widget, gpointer data) extract_info (cle); - e_contact_save_as(_("Save List as VCard"), cle->card, GTK_WINDOW (cle->app)); + eab_contact_save(_("Save List as VCard"), cle->contact, GTK_WINDOW (cle->app)); } static void @@ -464,7 +509,7 @@ file_send_as_cb (GtkWidget *widget, gpointer data) extract_info (cle); - e_addressbook_send_card(cle->card, E_ADDRESSBOOK_DISPOSITION_AS_ATTACHMENT); + eab_send_contact(cle->contact, EAB_DISPOSITION_AS_ATTACHMENT); } static void @@ -474,14 +519,14 @@ file_send_to_cb (GtkWidget *widget, gpointer data) extract_info (cle); - e_addressbook_send_card(cle->card, E_ADDRESSBOOK_DISPOSITION_AS_TO); + eab_send_contact(cle->contact, EAB_DISPOSITION_AS_TO); } static void tb_save_and_close_cb (GtkWidget *widget, gpointer data) { EContactListEditor *cle = E_CONTACT_LIST_EDITOR (data); - save_card (cle, TRUE); + save_contact (cle, TRUE); } static void @@ -492,10 +537,10 @@ list_deleted_cb (EBook *book, EBookStatus status, EContactListEditor *cle) cle->in_async_call = FALSE; g_signal_emit (cle, contact_list_editor_signals[LIST_DELETED], 0, - status, cle->card); + status, cle->contact); /* always close the dialog after we successfully delete a list */ - if (status == E_BOOK_STATUS_SUCCESS) + if (status == E_BOOK_ERROR_OK) close_dialog (cle); g_object_unref (cle); /* release reference held for callback */ @@ -505,9 +550,9 @@ static void delete_cb (GtkWidget *widget, gpointer data) { EContactListEditor *cle = E_CONTACT_LIST_EDITOR (data); - ECard *card = cle->card; + EContact *contact = cle->contact; - g_object_ref (card); + g_object_ref (contact); if (e_contact_editor_confirm_delete(GTK_WINDOW(cle->app))) { @@ -518,11 +563,11 @@ delete_cb (GtkWidget *widget, gpointer data) cle->in_async_call = TRUE; g_object_ref (cle); /* hold reference for callback */ - e_book_remove_card (cle->book, card, (EBookCallback)list_deleted_cb, cle); + e_book_async_remove_contact (cle->book, contact, (EBookCallback)list_deleted_cb, cle); } } - g_object_unref (card); + g_object_unref (contact); } static @@ -578,7 +623,7 @@ contact_list_editor_destroy_notify (gpointer data, EContactListEditor * e_contact_list_editor_new (EBook *book, - ECard *list_card, + EContact *list_contact, gboolean is_new_list, gboolean editable) { @@ -592,7 +637,7 @@ e_contact_list_editor_new (EBook *book, g_object_set (ce, "book", book, - "card", list_card, + "contact", list_contact, "is_new_list", is_new_list, "editable", editable, NULL); @@ -616,10 +661,10 @@ e_contact_list_editor_set_property (GObject *object, guint prop_id, g_object_ref (editor->book); /* XXX more here about editable/etc. */ break; - case PROP_CARD: - if (editor->card) - g_object_unref (editor->card); - editor->card = e_card_duplicate(E_CARD(g_value_get_object (value))); + case PROP_CONTACT: + if (editor->contact) + g_object_unref (editor->contact); + editor->contact = e_contact_duplicate(E_CONTACT(g_value_get_object (value))); fill_in_info(editor); editor->changed = FALSE; command_state_changed (editor); @@ -665,9 +710,9 @@ e_contact_list_editor_get_property (GObject *object, guint prop_id, g_value_set_object (value, editor->book); break; - case PROP_CARD: + case PROP_CONTACT: extract_info(editor); - g_value_set_object (value, editor->card); + g_value_set_object (value, editor->contact); break; case PROP_IS_NEW_LIST: @@ -822,7 +867,7 @@ table_drag_motion_cb (ETable *table, int row, int col, for (p = context->targets; p != NULL; p = p->next) { char *possible_type; - possible_type = gdk_atom_name ((GdkAtom) p->data); + possible_type = gdk_atom_name (GDK_POINTER_TO_ATOM (p->data)); if (!strcmp (possible_type, VCARD_TYPE)) { g_free (possible_type); gdk_drag_status (context, GDK_ACTION_LINK, time); @@ -866,28 +911,24 @@ table_drag_data_received_cb (ETable *table, int row, int col, if (!strcmp (target_type, VCARD_TYPE)) { - 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 *c; - if (card_list) + if (contact_list) handled = TRUE; - for (c = card_list; c; c = c->next) { - ECard *ecard = c->data; - - if (!e_card_evolution_list (ecard)) { - ECardSimple *simple = e_card_simple_new (ecard); + for (c = contact_list; c; c = c->next) { + EContact *contact = c->data; - e_contact_list_model_add_card (E_CONTACT_LIST_MODEL (editor->model), - simple); - - g_object_unref (simple); + if (!e_contact_get (contact, E_CONTACT_IS_LIST)) { + e_contact_list_model_add_contact (E_CONTACT_LIST_MODEL (editor->model), + contact); changed = TRUE; } } - 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); /* Skip to the end of the list */ if (adj->upper - adj->lower > adj->page_size) @@ -902,6 +943,219 @@ table_drag_data_received_cb (ETable *table, int row, int col, gtk_drag_finish (context, handled, FALSE, time); } +static gboolean +set_image_from_data (EContactListEditor *editor, + char *data, int length) +{ + gboolean rv = FALSE; + GdkPixbufLoader *loader = gdk_pixbuf_loader_new (); + GdkPixbuf *pixbuf; + + gdk_pixbuf_loader_write (loader, data, length, NULL); + + pixbuf = gdk_pixbuf_loader_get_pixbuf (loader); + if (pixbuf) + gdk_pixbuf_ref (pixbuf); + gdk_pixbuf_loader_close (loader, NULL); + g_object_unref (loader); + + if (pixbuf) { + GdkPixbuf *scaled; + GdkPixbuf *composite; + + float scale; + int new_height, new_width; + + new_height = gdk_pixbuf_get_height (pixbuf); + new_width = gdk_pixbuf_get_width (pixbuf); + + printf ("new dimensions = (%d,%d)\n", new_width, new_height); + + if (editor->list_image_height < new_height + || editor->list_image_width < new_width) { + /* we need to scale down */ + printf ("we need to scale down\n"); + if (new_height > new_width) + scale = (float)editor->list_image_height / new_height; + else + scale = (float)editor->list_image_width / new_width; + } + else { + /* we need to scale up */ + printf ("we need to scale up\n"); + if (new_height > new_width) + scale = (float)new_height / editor->list_image_height; + else + scale = (float)new_width / editor->list_image_width; + } + + printf ("scale = %g\n", scale); + + new_width *= scale; + new_height *= scale; + new_width = MIN (new_width, editor->list_image_width); + new_height = MIN (new_height, editor->list_image_height); + + printf ("new scaled dimensions = (%d,%d)\n", new_width, new_height); + + scaled = gdk_pixbuf_scale_simple (pixbuf, + new_width, new_height, + GDK_INTERP_BILINEAR); + + composite = gdk_pixbuf_new (GDK_COLORSPACE_RGB, TRUE, gdk_pixbuf_get_bits_per_sample (pixbuf), + editor->list_image_width, editor->list_image_height); + + gdk_pixbuf_fill (composite, 0x00000000); + + gdk_pixbuf_copy_area (scaled, 0, 0, new_width, new_height, + composite, + editor->list_image_width / 2 - new_width / 2, + editor->list_image_height / 2 - new_height / 2); + + gtk_image_set_from_pixbuf (GTK_IMAGE (editor->list_image), composite); + gdk_pixbuf_unref (pixbuf); + gdk_pixbuf_unref (scaled); + gdk_pixbuf_unref (composite); + + rv = TRUE; + } + + return rv; +} + +static gboolean +image_drag_motion_cb (GtkWidget *widget, + GdkDragContext *context, + gint x, gint y, guint time, EContactListEditor *editor) +{ + GList *p; + + for (p = context->targets; p != NULL; p = p->next) { + char *possible_type; + + possible_type = gdk_atom_name (GDK_POINTER_TO_ATOM (p->data)); + if (!strcmp (possible_type, URI_LIST_TYPE)) { + g_free (possible_type); + gdk_drag_status (context, GDK_ACTION_COPY, time); + return TRUE; + } + + g_free (possible_type); + } + + return FALSE; +} + +static gboolean +image_drag_drop_cb (GtkWidget *widget, + GdkDragContext *context, + gint x, gint y, guint time, EContactListEditor *editor) +{ + GList *p; + + if (context->targets == NULL) + return FALSE; + + + for (p = context->targets; p != NULL; p = p->next) { + char *possible_type; + + possible_type = gdk_atom_name (GDK_POINTER_TO_ATOM (p->data)); + if (!strcmp (possible_type, URI_LIST_TYPE)) { + g_free (possible_type); + gtk_drag_get_data (widget, context, + GDK_POINTER_TO_ATOM (p->data), + time); + return TRUE; + } + + g_free (possible_type); + } + + return FALSE; +} + +static void +image_drag_data_received_cb (GtkWidget *widget, + GdkDragContext *context, + gint x, gint y, + GtkSelectionData *selection_data, + guint info, guint time, EContactListEditor *editor) +{ + char *target_type; + gboolean changed = FALSE; + gboolean handled = FALSE; + + target_type = gdk_atom_name (selection_data->target); + + printf ("target_type == %s\n", target_type); + + if (!strcmp (target_type, URI_LIST_TYPE)) { + GnomeVFSResult result; + GnomeVFSHandle *handle; + char *uri; + char *nl = strstr (selection_data->data, "\r\n"); + char *buf = NULL; + GnomeVFSFileInfo info; + + if (nl) + uri = g_strndup (selection_data->data, nl - (char*)selection_data->data); + else + uri = g_strdup (selection_data->data); + + printf ("uri == %s\n", uri); + + result = gnome_vfs_open (&handle, uri, GNOME_VFS_OPEN_READ); + if (result == GNOME_VFS_OK) { + result = gnome_vfs_get_file_info_from_handle (handle, &info, GNOME_VFS_FILE_INFO_DEFAULT); + if (result == GNOME_VFS_OK) { + GnomeVFSFileSize num_left; + GnomeVFSFileSize num_read; + GnomeVFSFileSize total_read; + + printf ("file size = %d\n", (int)info.size); + buf = g_malloc (info.size); + + num_left = info.size; + total_read = 0; + + while ((result = gnome_vfs_read (handle, buf + total_read, num_left, &num_read)) == GNOME_VFS_OK) { + num_left -= num_read; + total_read += num_read; + } + + printf ("read %d bytes\n", (int)total_read); + if (set_image_from_data (editor, buf, total_read)) { + changed = TRUE; + handled = TRUE; + g_free (editor->image_buf); + editor->image_buf = buf; + editor->image_buf_size = total_read; + } + else { + /* XXX we should pop up a + warning dialog here */ + g_free (buf); + } + } + + gnome_vfs_close (handle); + } + else { + printf ("gnome_vfs_open failed (%s)\n", gnome_vfs_result_to_string (result)); + } + + g_free (uri); + + if (changed) { + editor->changed = TRUE; + command_state_changed (editor); + } + } + + gtk_drag_finish (context, handled, FALSE, time); +} + static void command_state_changed (EContactListEditor *editor) { @@ -926,48 +1180,43 @@ command_state_changed (EContactListEditor *editor) static void extract_info(EContactListEditor *editor) { - ECard *card = editor->card; - if (card) { + EContact *contact = editor->contact; + if (contact) { int i; - EList *email_list; - EIterator *email_iter; + GList *email_list; char *string = gtk_editable_get_chars(GTK_EDITABLE (editor->list_name_entry), 0, -1); - if (string && *string) - g_object_set (card, - "file_as", string, - "full_name", string, - NULL); + if (string && *string) { + e_contact_set (contact, E_CONTACT_FILE_AS, string); + e_contact_set (contact, E_CONTACT_FULL_NAME, string); + } g_free (string); - - g_object_set (card, - "list", GINT_TO_POINTER (TRUE), - "list_show_addresses", - GINT_TO_POINTER (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(editor->visible_addrs_checkbutton))), - NULL); - - g_object_get (card, - "email", &email_list, - NULL); - - /* clear the email list */ - email_iter = e_list_get_iterator (email_list); - e_iterator_last (email_iter); - while (e_iterator_is_valid (E_ITERATOR (email_iter))) { - e_iterator_delete (E_ITERATOR (email_iter)); - } - g_object_unref (email_iter); + e_contact_set (contact, E_CONTACT_IS_LIST, GINT_TO_POINTER (TRUE)); + e_contact_set (contact, E_CONTACT_LIST_SHOW_ADDRESSES, + GINT_TO_POINTER (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(editor->visible_addrs_checkbutton)))); + email_list = NULL; /* then refill it from the contact list model */ for (i = 0; i < e_table_model_row_count (editor->model); i ++) { - const EDestination *dest = e_contact_list_model_get_destination (E_CONTACT_LIST_MODEL (editor->model), i); - gchar *dest_xml = e_destination_export (dest); - if (dest_xml) { - e_list_append (email_list, dest_xml); - } - g_free (dest_xml); + const EABDestination *dest = e_contact_list_model_get_destination (E_CONTACT_LIST_MODEL (editor->model), i); + gchar *dest_xml = eab_destination_export (dest); + if (dest_xml) + email_list = g_list_append (email_list, dest_xml); + } + + e_contact_set (contact, E_CONTACT_EMAIL, email_list); + + /* XXX free email_list? */ + + if (editor->image_buf) { + EContactPhoto photo; + + photo.data = editor->image_buf; + photo.length = editor->image_buf_size; + + e_contact_set (contact, E_CONTACT_LOGO, &photo); } g_object_unref (email_list); } @@ -976,19 +1225,18 @@ extract_info(EContactListEditor *editor) static void fill_in_info(EContactListEditor *editor) { - if (editor->card) { + if (editor->contact) { + EContactPhoto *photo; char *file_as; gboolean show_addresses = FALSE; gboolean is_evolution_list = FALSE; - EList *email_list; - EIterator *email_iter; + GList *email_list; + GList *iter; - g_object_get (editor->card, - "file_as", &file_as, - "email", &email_list, - "list", &is_evolution_list, - "list_show_addresses", &show_addresses, - NULL); + file_as = e_contact_get_const (editor->contact, E_CONTACT_FILE_AS); + email_list = e_contact_get (editor->contact, E_CONTACT_EMAIL); + is_evolution_list = GPOINTER_TO_INT (e_contact_get (editor->contact, E_CONTACT_IS_LIST)); + show_addresses = GPOINTER_TO_INT (e_contact_get (editor->contact, E_CONTACT_LIST_SHOW_ADDRESSES)); gtk_editable_delete_text (GTK_EDITABLE (editor->list_name_entry), 0, -1); if (file_as) { @@ -1001,20 +1249,24 @@ fill_in_info(EContactListEditor *editor) e_contact_list_model_remove_all (E_CONTACT_LIST_MODEL (editor->model)); - email_iter = e_list_get_iterator (email_list); - - while (e_iterator_is_valid (email_iter)) { - const char *dest_xml = e_iterator_get (email_iter); - EDestination *dest; + for (iter = email_list; iter; iter = iter->next) { + char *dest_xml = iter->data; + EABDestination *dest; /* g_message ("incoming xml: [%s]", dest_xml); */ - dest = e_destination_import (dest_xml); + dest = eab_destination_import (dest_xml); if (dest != NULL) { e_contact_list_model_add_destination (E_CONTACT_LIST_MODEL (editor->model), dest); } + } + + /* XXX free email_list */ - e_iterator_next (email_iter); + photo = e_contact_get (editor->contact, E_CONTACT_LOGO); + if (photo) { + set_image_from_data (editor, photo->data, photo->length); + e_contact_photo_free (photo); } g_object_unref (email_list); } diff --git a/addressbook/gui/contact-list-editor/e-contact-list-editor.h b/addressbook/gui/contact-list-editor/e-contact-list-editor.h index 184145a0f7..62334c17bf 100644 --- a/addressbook/gui/contact-list-editor/e-contact-list-editor.h +++ b/addressbook/gui/contact-list-editor/e-contact-list-editor.h @@ -26,9 +26,8 @@ #include <glade/glade.h> #include <gal/e-table/e-table-model.h> -#include "addressbook/backend/ebook/e-book.h" -#include "addressbook/backend/ebook/e-card.h" -#include "addressbook/backend/ebook/e-card-simple.h" +#include "addressbook/backend/ebook/e-book-async.h" +#include "addressbook/backend/ebook/e-contact.h" G_BEGIN_DECLS @@ -48,7 +47,7 @@ struct _EContactListEditor /* item specific fields */ EBook *book; - ECard *card; + EContact *contact; /* UI handler */ BonoboUIComponent *uic; @@ -62,12 +61,19 @@ struct _EContactListEditor GtkWidget *list_name_entry; GtkWidget *add_button; GtkWidget *remove_button; + GtkWidget *list_image_button; GtkWidget *visible_addrs_checkbutton; + GtkWidget *list_image; + int list_image_width; + int list_image_height; - /* Whether we are editing a new card or an existing one */ + char *image_buf; + int image_buf_size; + + /* Whether we are editing a new contact or an existing one */ guint is_new_list : 1; - /* Whether the card has been changed since bringing up the contact editor */ + /* Whether the contact has been changed since bringing up the contact editor */ guint changed : 1; /* Whether the contact editor will accept modifications */ @@ -83,14 +89,14 @@ struct _EContactListEditorClass /* Notification signals */ - void (* list_added) (EContactListEditor *cle, EBookStatus status, ECard *card); - void (* list_modified) (EContactListEditor *cle, EBookStatus status, ECard *card); - void (* list_deleted) (EContactListEditor *cle, EBookStatus status, ECard *card); + void (* list_added) (EContactListEditor *cle, EBookStatus status, EContact *contact); + void (* list_modified) (EContactListEditor *cle, EBookStatus status, EContact *contact); + void (* list_deleted) (EContactListEditor *cle, EBookStatus status, EContact *contact); void (* editor_closed) (EContactListEditor *cle); }; EContactListEditor *e_contact_list_editor_new (EBook *book, - ECard *list_card, + EContact *list_contact, gboolean is_new_list, gboolean editable); GType e_contact_list_editor_get_type (void); diff --git a/addressbook/gui/contact-list-editor/e-contact-list-model.c b/addressbook/gui/contact-list-editor/e-contact-list-model.c index 89354aaece..80bc29b7a9 100644 --- a/addressbook/gui/contact-list-editor/e-contact-list-model.c +++ b/addressbook/gui/contact-list-editor/e-contact-list-model.c @@ -30,7 +30,7 @@ contact_list_value_at (ETableModel *etc, int col, int row) { EContactListModel *model = E_CONTACT_LIST_MODEL (etc); - return (void *) e_destination_get_textrep (model->data[row], TRUE); + return (void *) eab_destination_get_textrep (model->data[row], TRUE); } /* This function sets the value at a particular point in our ETableModel. */ @@ -127,7 +127,7 @@ e_contact_list_model_init (GtkObject *object) model->data_alloc = 10; model->data_count = 0; - model->data = g_new (EDestination*, model->data_alloc); + model->data = g_new (EABDestination*, model->data_alloc); } GType @@ -172,16 +172,16 @@ e_contact_list_model_new () } void -e_contact_list_model_add_destination (EContactListModel *model, EDestination *dest) +e_contact_list_model_add_destination (EContactListModel *model, EABDestination *dest) { g_return_if_fail (E_IS_CONTACT_LIST_MODEL (model)); - g_return_if_fail (E_IS_DESTINATION (dest)); + g_return_if_fail (EAB_IS_DESTINATION (dest)); e_table_model_pre_change (E_TABLE_MODEL (model)); if (model->data_count + 1 >= model->data_alloc) { model->data_alloc *= 2; - model->data = g_renew (EDestination*, model->data, model->data_alloc); + model->data = g_renew (EABDestination*, model->data, model->data_alloc); } model->data[model->data_count ++] = dest; @@ -194,28 +194,28 @@ void e_contact_list_model_add_email (EContactListModel *model, const char *email) { - EDestination *new_dest; + EABDestination *new_dest; g_return_if_fail (E_IS_CONTACT_LIST_MODEL (model)); g_return_if_fail (email != NULL); - new_dest = e_destination_new (); - e_destination_set_email (new_dest, email); + new_dest = eab_destination_new (); + eab_destination_set_email (new_dest, email); e_contact_list_model_add_destination (model, new_dest); } void -e_contact_list_model_add_card (EContactListModel *model, - ECardSimple *simple) +e_contact_list_model_add_contact (EContactListModel *model, + EContact *contact) { - EDestination *new_dest; + EABDestination *new_dest; g_return_if_fail (E_IS_CONTACT_LIST_MODEL (model)); - g_return_if_fail (E_IS_CARD_SIMPLE (simple)); + g_return_if_fail (E_IS_CONTACT (contact)); - new_dest = e_destination_new (); - e_destination_set_card (new_dest, simple->card, 0); /* Hard-wired for default e-mail */ + new_dest = eab_destination_new (); + eab_destination_set_contact (new_dest, contact, 0); /* Hard-wired for default e-mail */ e_contact_list_model_add_destination (model, new_dest); } @@ -229,7 +229,7 @@ e_contact_list_model_remove_row (EContactListModel *model, int row) e_table_model_pre_change (E_TABLE_MODEL (model)); g_object_unref (model->data[row]); - memmove (model->data + row, model->data + row + 1, sizeof (EDestination*) * (model->data_count - row - 1)); + memmove (model->data + row, model->data + row + 1, sizeof (EABDestination*) * (model->data_count - row - 1)); model->data_count --; e_table_model_row_deleted (E_TABLE_MODEL (model), row); @@ -255,7 +255,7 @@ e_contact_list_model_remove_all (EContactListModel *model) } -const EDestination * +const EABDestination * e_contact_list_model_get_destination (EContactListModel *model, int row) { g_return_val_if_fail (E_IS_CONTACT_LIST_MODEL (model), NULL); diff --git a/addressbook/gui/contact-list-editor/e-contact-list-model.h b/addressbook/gui/contact-list-editor/e-contact-list-model.h index bb07d83544..92d3d9bc60 100644 --- a/addressbook/gui/contact-list-editor/e-contact-list-model.h +++ b/addressbook/gui/contact-list-editor/e-contact-list-model.h @@ -4,10 +4,9 @@ #include <gtk/gtk.h> #include <gal/e-table/e-table-model.h> -#include "addressbook/backend/ebook/e-book.h" -#include "addressbook/backend/ebook/e-book-view.h" -#include "addressbook/backend/ebook/e-card-simple.h" -#include "addressbook/backend/ebook/e-destination.h" +#include "addressbook/backend/ebook/e-book-async.h" +#include "addressbook/backend/ebook/e-contact.h" +#include "addressbook/util/eab-destination.h" G_BEGIN_DECLS @@ -23,7 +22,7 @@ typedef struct _EContactListModelClass EContactListModelClass; struct _EContactListModel { ETableModel parent; - EDestination **data; + EABDestination **data; int data_count; int data_alloc; }; @@ -38,14 +37,14 @@ GType e_contact_list_model_get_type (void); void e_contact_list_model_construct (EContactListModel *model); ETableModel *e_contact_list_model_new (void); -void e_contact_list_model_add_destination (EContactListModel *model, EDestination *dest); +void e_contact_list_model_add_destination (EContactListModel *model, EABDestination *dest); void e_contact_list_model_add_email (EContactListModel *model, const char *email); -void e_contact_list_model_add_card (EContactListModel *model, ECardSimple *simple); +void e_contact_list_model_add_contact (EContactListModel *model, EContact *contact); void e_contact_list_model_remove_row (EContactListModel *model, int row); void e_contact_list_model_remove_all (EContactListModel *model); -const EDestination *e_contact_list_model_get_destination (EContactListModel *model, int row); +const EABDestination *e_contact_list_model_get_destination (EContactListModel *model, int row); G_END_DECLS diff --git a/addressbook/gui/merging/.cvsignore b/addressbook/gui/merging/.cvsignore index d6c55c7345..b6fa83ca4c 100644 --- a/addressbook/gui/merging/.cvsignore +++ b/addressbook/gui/merging/.cvsignore @@ -5,3 +5,4 @@ Makefile Makefile.in *.lo *.la +*.gladep diff --git a/addressbook/gui/merging/Makefile.am b/addressbook/gui/merging/Makefile.am index f30edd5745..4627f30594 100644 --- a/addressbook/gui/merging/Makefile.am +++ b/addressbook/gui/merging/Makefile.am @@ -1,7 +1,8 @@ INCLUDES = \ - -DG_LOG_DOMAIN=\"e-card-gui\" \ + -DG_LOG_DOMAIN=\"eab-contact-merging\" \ -DEVOLUTION_GLADEDIR=\""$(gladedir)"\" \ -I$(top_srcdir) \ + -I$(top_srcdir)/addressbook \ -I$(top_srcdir)/addressbook/backend \ -I$(top_builddir)/addressbook/backend \ -DG_DISABLE_DEPRECATED \ @@ -11,15 +12,17 @@ INCLUDES = \ $(EVOLUTION_ADDRESSBOOK_CFLAGS) noinst_LTLIBRARIES = \ - libecardmerging.la + libeabbookmerging.la -libecardmerging_la_SOURCES = \ - e-card-merging.c \ - e-card-merging.h +libeabbookmerging_la_SOURCES = \ + eab-contact-compare.c \ + eab-contact-compare.h \ + eab-contact-merging.c \ + eab-contact-merging.h -glade_DATA = e-card-duplicate-detected.glade \ - e-card-merging-book-commit-duplicate-detected.glade +glade_DATA = eab-contact-duplicate-detected.glade \ + eab-contact-commit-duplicate-detected.glade EXTRA_DIST = \ $(glade_DATA) diff --git a/addressbook/gui/merging/e-card-merging.c b/addressbook/gui/merging/e-card-merging.c deleted file mode 100644 index f2322e772c..0000000000 --- a/addressbook/gui/merging/e-card-merging.c +++ /dev/null @@ -1,198 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * Code for checking for duplicates when doing ECard work. - * - * Author: - * Christopher James Lahey <clahey@ximian.com> - * - * Copyright 2001, Ximian, Inc. - */ - -#include <config.h> - -#include "e-card-merging.h" -#include <ebook/e-card-compare.h> -#include <glade/glade.h> -#include <gtk/gtksignal.h> -#include "addressbook/gui/widgets/e-minicard-widget.h" - -typedef enum { - E_CARD_MERGING_ADD, - E_CARD_MERGING_COMMIT -} ECardMergingOpType; - -typedef struct { - ECardMergingOpType op; - EBook *book; - ECard *card; - EBookIdCallback id_cb; - EBookCallback cb; - gpointer closure; -} ECardMergingLookup; - -static void -free_lookup (ECardMergingLookup *lookup) -{ - g_object_unref (lookup->book); - g_object_unref (lookup->card); - - g_free (lookup); -} - -static void -final_id_cb (EBook *book, EBookStatus status, const char *id, gpointer closure) -{ - ECardMergingLookup *lookup = closure; - - if (lookup->id_cb) - lookup->id_cb (lookup->book, status, id, lookup->closure); - - free_lookup (lookup); -} - -static void -final_cb (EBook *book, EBookStatus status, gpointer closure) -{ - ECardMergingLookup *lookup = closure; - - if (lookup->cb) - lookup->cb (lookup->book, status, lookup->closure); - - free_lookup (lookup); -} - -static void -doit (ECardMergingLookup *lookup) -{ - if (lookup->op == E_CARD_MERGING_ADD) - e_book_add_card (lookup->book, lookup->card, final_id_cb, lookup); - else if (lookup->op == E_CARD_MERGING_COMMIT) - e_book_commit_card (lookup->book, lookup->card, final_cb, lookup); -} - -static void -cancelit (ECardMergingLookup *lookup) -{ - if (lookup->op == E_CARD_MERGING_ADD) { - if (lookup->id_cb) - final_id_cb (lookup->book, E_BOOK_STATUS_CANCELLED, NULL, lookup); - } else if (lookup->op == E_CARD_MERGING_COMMIT) { - if (lookup->cb) - final_cb (lookup->book, E_BOOK_STATUS_CANCELLED, lookup); - } -} - -static void -response (GtkWidget *dialog, int response, ECardMergingLookup *lookup) -{ - gtk_widget_destroy (dialog); - - switch (response) { - case 0: - doit (lookup); - break; - case 1: - cancelit (lookup); - break; - } -} - -static void -match_query_callback (ECard *card, ECard *match, ECardMatchType type, gpointer closure) -{ - ECardMergingLookup *lookup = closure; - - if ((gint) type <= (gint) E_CARD_MATCH_VAGUE) { - doit (lookup); - } else { - GladeXML *ui; - - GtkWidget *widget; - - if (lookup->op == E_CARD_MERGING_ADD) - ui = glade_xml_new (EVOLUTION_GLADEDIR "/e-card-duplicate-detected.glade", NULL, NULL); - else if (lookup->op == E_CARD_MERGING_COMMIT) - ui = glade_xml_new (EVOLUTION_GLADEDIR "/e-card-merging-book-commit-duplicate-detected.glade", NULL, NULL); - else { - doit (lookup); - return; - } - - widget = glade_xml_get_widget (ui, "custom-old-card"); - g_object_set (widget, - "card", match, - NULL); - - widget = glade_xml_get_widget (ui, "custom-new-card"); - g_object_set (widget, - "card", card, - NULL); - - widget = glade_xml_get_widget (ui, "dialog-duplicate-contact"); - - g_signal_connect (widget, "response", - G_CALLBACK (response), lookup); - - gtk_widget_show_all (widget); - } -} - -gboolean -e_card_merging_book_add_card (EBook *book, - ECard *card, - EBookIdCallback cb, - gpointer closure) -{ - ECardMergingLookup *lookup; - - lookup = g_new (ECardMergingLookup, 1); - - lookup->op = E_CARD_MERGING_ADD; - lookup->book = g_object_ref (book); - lookup->card = g_object_ref (card); - lookup->id_cb = cb; - lookup->closure = closure; - - e_card_locate_match_full (book, card, NULL, match_query_callback, lookup); - - return TRUE; -} - -gboolean -e_card_merging_book_commit_card (EBook *book, - ECard *card, - EBookCallback cb, - gpointer closure) -{ - ECardMergingLookup *lookup; - GList *avoid; - - lookup = g_new (ECardMergingLookup, 1); - - lookup->op = E_CARD_MERGING_COMMIT; - lookup->book = g_object_ref (book); - lookup->card = g_object_ref (card); - lookup->cb = cb; - lookup->closure = closure; - - avoid = g_list_append (NULL, card); - - e_card_locate_match_full (book, card, avoid, match_query_callback, lookup); - - g_list_free (avoid); - - return TRUE; -} - -GtkWidget * -e_card_merging_create_old_card(gchar *name, - gchar *string1, gchar *string2, - gint int1, gint int2); - -GtkWidget * -e_card_merging_create_old_card(gchar *name, - gchar *string1, gchar *string2, - gint int1, gint int2) -{ - return e_minicard_widget_new (); -} diff --git a/addressbook/gui/merging/e-card-merging.h b/addressbook/gui/merging/e-card-merging.h deleted file mode 100644 index 8ea1f9f018..0000000000 --- a/addressbook/gui/merging/e-card-merging.h +++ /dev/null @@ -1,29 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * The Evolution addressbook client object. - * - * Author: - * Christopher James Lahey <clahey@ximian.com> - * - * Copyright 2001, Ximian, Inc. - */ - -#ifndef __E_CARD_MERGING_H__ -#define __E_CARD_MERGING_H__ - -#include <addressbook/backend/ebook/e-book.h> - -G_BEGIN_DECLS - -gboolean e_card_merging_book_add_card (EBook *book, - ECard *card, - EBookIdCallback cb, - gpointer closure); -gboolean e_card_merging_book_commit_card (EBook *book, - ECard *card, - EBookCallback cb, - gpointer closure); - -G_END_DECLS - -#endif /* ! __E_CARD_MERGING_H__ */ diff --git a/addressbook/gui/merging/e-card-merging-book-commit-duplicate-detected.glade b/addressbook/gui/merging/eab-contact-commit-duplicate-detected.glade index f7cfd259e5..789c465d92 100644 --- a/addressbook/gui/merging/e-card-merging-book-commit-duplicate-detected.glade +++ b/addressbook/gui/merging/eab-contact-commit-duplicate-detected.glade @@ -68,12 +68,12 @@ <property name="column_spacing">6</property> <child> - <widget class="Custom" id="custom-old-card"> + <widget class="Custom" id="custom-old-contact"> <property name="visible">True</property> - <property name="creation_function">e_card_merging_create_old_card</property> + <property name="creation_function">_eab_contact_merging_create_contact_display</property> <property name="int1">0</property> <property name="int2">0</property> - <property name="last_modification_time">Fri, 08 Jun 2001 01:33:22 GMT</property> + <property name="last_modification_time">Sun, 05 Oct 2003 03:54:20 GMT</property> </widget> <packing> <property name="left_attach">1</property> @@ -155,12 +155,12 @@ exists in this folder. Would you like to add it anyway?</property> </child> <child> - <widget class="Custom" id="custom-new-card"> + <widget class="Custom" id="custom-new-contact"> <property name="visible">True</property> - <property name="creation_function">e_card_merging_create_old_card</property> + <property name="creation_function">_eab_contact_merging_create_contact_display</property> <property name="int1">0</property> <property name="int2">0</property> - <property name="last_modification_time">Fri, 08 Jun 2001 01:33:22 GMT</property> + <property name="last_modification_time">Sun, 05 Oct 2003 03:53:42 GMT</property> </widget> <packing> <property name="left_attach">1</property> diff --git a/addressbook/gui/merging/eab-contact-compare.c b/addressbook/gui/merging/eab-contact-compare.c new file mode 100644 index 0000000000..409b1bce81 --- /dev/null +++ b/addressbook/gui/merging/eab-contact-compare.c @@ -0,0 +1,736 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ + +/* + * eab-contact-compare.c + * + * Copyright (C) 2001, 2002, 2003 Ximian, Inc. + * + * Authors: Jon Trowbridge <trow@ximian.com> + * Chris Toshok <toshok@ximian.com> + */ + +/* + * 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 <ctype.h> +#include <string.h> +#include "util/eab-book-util.h" +#include "eab-contact-compare.h" + +/* This is an "optimistic" combiner: the best of the two outcomes is + selected. */ +static EABContactMatchType +combine_comparisons (EABContactMatchType prev, + EABContactMatchType new_info) +{ + if (new_info == EAB_CONTACT_MATCH_NOT_APPLICABLE) + return prev; + return (EABContactMatchType) MAX ((gint) prev, (gint) new_info); +} + + +/*** Name comparisons ***/ + +/* This *so* doesn't belong here... at least not implemented in a + sucky way like this. But it can be fixed later. */ + +/* This is very Anglocentric. */ +static gchar *name_synonyms[][2] = { + { "jon", "john" }, /* Ah, the hacker's perogative */ + { "joseph", "joe" }, + { "robert", "bob" }, + { "gene", "jean" }, + { "jesse", "jessie" }, + { "ian", "iain" }, + { "richard", "dick" }, + { "william", "bill" }, + { "william", "will" }, + { "anthony", "tony" }, + { "michael", "mike" }, + { "eric", "erik" }, + { "elizabeth", "liz" }, + { "jeff", "geoff" }, + { "jeff", "geoffrey" }, + { "tom", "thomas" }, + { "dave", "david" }, + { "jim", "james" }, + { "abigal", "abby" }, + { "amanda", "amy" }, + { "amanda", "manda" }, + { "jennifer", "jenny" }, + { "christopher", "chris" }, + { "rebecca", "becca" }, + { "rebecca", "becky" }, + { "anderson", "andersen" }, + { "johnson", "johnsen" }, + /* We could go on and on... */ + /* We should add soundex here. */ + { NULL, NULL } +}; + +static gboolean +name_fragment_match (const gchar *a, const gchar *b, gboolean strict) +{ + gint len; + + if (!(a && b && *a && *b)) + return FALSE; + + /* If we are in 'strict' mode, b must match the beginning of a. + So "Robert", "Rob" would match, but "Robert", "Robbie" wouldn't. + + If strict is FALSE, it is sufficient for the strings to share + some leading characters. In this case, "Robert" and "Robbie" + would match, as would "Dave" and "Dan". */ + + if (strict) { + len = g_utf8_strlen (b, -1); + } else { + len = MIN (g_utf8_strlen (a, -1), g_utf8_strlen (b, -1)); + } + + return !e_utf8_casefold_collate_len (a, b, len); +} + +static gboolean +name_fragment_match_with_synonyms (const gchar *a, const gchar *b, gboolean strict) +{ + gint i; + + if (!(a && b && *a && *b)) + return FALSE; + + if (name_fragment_match (a, b, strict)) + return TRUE; + + /* Check for nicknames. Yes, the linear search blows. */ + for (i=0; name_synonyms[i][0]; ++i) { + + if (!e_utf8_casefold_collate (name_synonyms[i][0], a) + && !e_utf8_casefold_collate (name_synonyms[i][1], b)) + return TRUE; + + if (!e_utf8_casefold_collate (name_synonyms[i][0], b) + && !e_utf8_casefold_collate (name_synonyms[i][1], a)) + return TRUE; + } + + return FALSE; +} + +EABContactMatchType +eab_contact_compare_name_to_string (EContact *contact, const gchar *str) +{ + return eab_contact_compare_name_to_string_full (contact, str, FALSE, NULL, NULL, NULL); +} + +EABContactMatchType +eab_contact_compare_name_to_string_full (EContact *contact, const gchar *str, gboolean allow_partial_matches, + gint *matched_parts_out, EABContactMatchPart *first_matched_part_out, gint *matched_character_count_out) +{ + gchar **namev, **givenv = NULL, **addv = NULL, **familyv = NULL; + + gint matched_parts = EAB_CONTACT_MATCH_PART_NONE; + EABContactMatchPart first_matched_part = EAB_CONTACT_MATCH_PART_NONE; + EABContactMatchPart this_part_match = EAB_CONTACT_MATCH_PART_NOT_APPLICABLE; + EABContactMatchType match_type; + EContactName *contact_name; + + gint match_count = 0, matched_character_count = 0, fragment_count; + gint i, j; + gchar *str_cpy, *s; + + g_return_val_if_fail (E_IS_CONTACT (contact), EAB_CONTACT_MATCH_NOT_APPLICABLE); + + if (!e_contact_get_const (contact, E_CONTACT_FULL_NAME)) + return EAB_CONTACT_MATCH_NOT_APPLICABLE; + if (str == NULL) + return EAB_CONTACT_MATCH_NOT_APPLICABLE; + + str_cpy = s = g_strdup (str); + while (*s) { + if (*s == ',' || *s == '"') + *s = ' '; + ++s; + } + namev = g_strsplit (str_cpy, " ", 0); + g_free (str_cpy); + + contact_name = e_contact_get (contact, E_CONTACT_NAME); + + if (contact_name->given) + givenv = g_strsplit (contact_name->given, " ", 0); + if (contact_name->additional) + addv = g_strsplit (contact_name->additional, " ", 0); + if (contact_name->family) + familyv = g_strsplit (contact_name->family, " ", 0); + + e_contact_name_free (contact_name); + + fragment_count = 0; + for (i = 0; givenv && givenv[i]; ++i) + ++fragment_count; + for (i = 0; addv && addv[i]; ++i) + ++fragment_count; + for (i = 0; familyv && familyv[i]; ++i) + ++fragment_count; + + for (i = 0; namev[i] && this_part_match != EAB_CONTACT_MATCH_PART_NONE; ++i) { + + if (*namev[i]) { + + this_part_match = EAB_CONTACT_MATCH_PART_NONE; + + /* When we are allowing partials, we are strict about the matches we allow. + Does this make sense? Not really, but it does the right thing for the purposes + of completion. */ + + if (givenv && this_part_match == EAB_CONTACT_MATCH_PART_NONE) { + for (j = 0; givenv[j]; ++j) { + if (name_fragment_match_with_synonyms (givenv[j], namev[i], allow_partial_matches)) { + + this_part_match = EAB_CONTACT_MATCH_PART_GIVEN_NAME; + + /* We remove a piece of a name once it has been matched against, so + that "john john" won't match "john doe". */ + g_free (givenv[j]); + givenv[j] = g_strdup (""); + break; + } + } + } + + if (addv && this_part_match == EAB_CONTACT_MATCH_PART_NONE) { + for (j = 0; addv[j]; ++j) { + if (name_fragment_match_with_synonyms (addv[j], namev[i], allow_partial_matches)) { + + this_part_match = EAB_CONTACT_MATCH_PART_ADDITIONAL_NAME; + + g_free (addv[j]); + addv[j] = g_strdup (""); + break; + } + } + } + + if (familyv && this_part_match == EAB_CONTACT_MATCH_PART_NONE) { + for (j = 0; familyv[j]; ++j) { + if (allow_partial_matches ? name_fragment_match_with_synonyms (familyv[j], namev[i], allow_partial_matches) + : !e_utf8_casefold_collate (familyv[j], namev[i])) { + + this_part_match = EAB_CONTACT_MATCH_PART_FAMILY_NAME; + + g_free (familyv[j]); + familyv[j] = g_strdup (""); + break; + } + } + } + + if (this_part_match != EAB_CONTACT_MATCH_PART_NONE) { + ++match_count; + matched_character_count += g_utf8_strlen (namev[i], -1); + matched_parts |= this_part_match; + if (first_matched_part == EAB_CONTACT_MATCH_PART_NONE) + first_matched_part = this_part_match; + } + } + } + + match_type = EAB_CONTACT_MATCH_NONE; + + if (this_part_match != EAB_CONTACT_MATCH_PART_NONE) { + + if (match_count > 0) + match_type = EAB_CONTACT_MATCH_VAGUE; + + if (fragment_count == match_count) { + + match_type = EAB_CONTACT_MATCH_EXACT; + + } else if (fragment_count == match_count + 1) { + + match_type = EAB_CONTACT_MATCH_PARTIAL; + + } + } + + if (matched_parts_out) + *matched_parts_out = matched_parts; + if (first_matched_part_out) + *first_matched_part_out = first_matched_part; + if (matched_character_count_out) + *matched_character_count_out = matched_character_count; + + g_strfreev (namev); + g_strfreev (givenv); + g_strfreev (addv); + g_strfreev (familyv); + + return match_type; +} + +EABContactMatchType +eab_contact_compare_name (EContact *contact1, EContact *contact2) +{ + EContactName *a, *b; + gint matches=0, possible=0; + gboolean given_match = FALSE, additional_match = FALSE, family_match = FALSE; + + g_return_val_if_fail (E_IS_CONTACT (contact1), EAB_CONTACT_MATCH_NOT_APPLICABLE); + g_return_val_if_fail (E_IS_CONTACT (contact2), EAB_CONTACT_MATCH_NOT_APPLICABLE); + + a = e_contact_get (contact1, E_CONTACT_NAME); + b = e_contact_get (contact2, E_CONTACT_NAME); + + if (a == NULL || b == NULL) + return EAB_CONTACT_MATCH_NOT_APPLICABLE; + + if (a->given && b->given) { + ++possible; + if (name_fragment_match_with_synonyms (a->given, b->given, FALSE /* both inputs are complete */)) { + ++matches; + given_match = TRUE; + } + } + + if (a->additional && b->additional) { + ++possible; + if (name_fragment_match_with_synonyms (a->additional, b->additional, FALSE /* both inputs are complete */)) { + ++matches; + additional_match = TRUE; + } + } + + if (a->family && b->family) { + ++possible; + /* We don't allow "loose matching" (i.e. John vs. Jon) on family names */ + if (! e_utf8_casefold_collate (a->family, b->family)) { + ++matches; + family_match = TRUE; + } + } + + e_contact_name_free (a); + e_contact_name_free (b); + + /* Now look at the # of matches and try to intelligently map + an EAB_CONTACT_MATCH_* type to it. Special consideration is given + to family-name matches. */ + + if (possible == 0) + return EAB_CONTACT_MATCH_NOT_APPLICABLE; + + if (possible == 1) + return family_match ? EAB_CONTACT_MATCH_VAGUE : EAB_CONTACT_MATCH_NONE; + + if (possible == matches) + return family_match ? EAB_CONTACT_MATCH_EXACT : EAB_CONTACT_MATCH_PARTIAL; + + if (possible == matches+1) + return family_match ? EAB_CONTACT_MATCH_VAGUE : EAB_CONTACT_MATCH_NONE; + + return EAB_CONTACT_MATCH_NONE; +} + + +/*** Nickname Comparisons ***/ + +EABContactMatchType +eab_contact_compare_nickname (EContact *contact1, EContact *contact2) +{ + g_return_val_if_fail (contact1 && E_IS_CONTACT (contact1), EAB_CONTACT_MATCH_NOT_APPLICABLE); + g_return_val_if_fail (contact2 && E_IS_CONTACT (contact2), EAB_CONTACT_MATCH_NOT_APPLICABLE); + + return EAB_CONTACT_MATCH_NOT_APPLICABLE; +} + + + +/*** E-mail Comparisons ***/ + +static gboolean +match_email_username (const gchar *addr1, const gchar *addr2) +{ + gint c1, c2; + if (addr1 == NULL || addr2 == NULL) + return FALSE; + + while (*addr1 && *addr2 && *addr1 != '@' && *addr2 != '@') { + c1 = isupper (*addr1) ? tolower (*addr1) : *addr1; + c2 = isupper (*addr2) ? tolower (*addr2) : *addr2; + if (c1 != c2) + return FALSE; + ++addr1; + ++addr2; + } + + return *addr1 == *addr2; +} + +static gboolean +match_email_hostname (const gchar *addr1, const gchar *addr2) +{ + gint c1, c2; + gboolean seen_at1, seen_at2; + if (addr1 == NULL || addr2 == NULL) + return FALSE; + + /* Walk to the end of each string. */ + seen_at1 = FALSE; + if (*addr1) { + while (*addr1) { + if (*addr1 == '@') + seen_at1 = TRUE; + ++addr1; + } + --addr1; + } + + seen_at2 = FALSE; + if (*addr2) { + while (*addr2) { + if (*addr2 == '@') + seen_at2 = TRUE; + ++addr2; + } + --addr2; + } + + if (!seen_at1 && !seen_at2) + return TRUE; + if (!seen_at1 || !seen_at2) + return FALSE; + + while (*addr1 != '@' && *addr2 != '@') { + c1 = isupper (*addr1) ? tolower (*addr1) : *addr1; + c2 = isupper (*addr2) ? tolower (*addr2) : *addr2; + if (c1 != c2) + return FALSE; + --addr1; + --addr2; + } + + /* This will match bob@foo.ximian.com and bob@ximian.com */ + return *addr1 == '.' || *addr2 == '.'; +} + +static EABContactMatchType +compare_email_addresses (const gchar *addr1, const gchar *addr2) +{ + if (addr1 == NULL || *addr1 == 0 || + addr2 == NULL || *addr2 == 0) + return EAB_CONTACT_MATCH_NOT_APPLICABLE; + + if (match_email_username (addr1, addr2)) + return match_email_hostname (addr1, addr2) ? EAB_CONTACT_MATCH_EXACT : EAB_CONTACT_MATCH_VAGUE; + + return EAB_CONTACT_MATCH_NONE; +} + +EABContactMatchType +eab_contact_compare_email (EContact *contact1, EContact *contact2) +{ + EABContactMatchType match = EAB_CONTACT_MATCH_NOT_APPLICABLE; + GList *contact1_email, *contact2_email; + GList *i1, *i2; + + g_return_val_if_fail (contact1 && E_IS_CONTACT (contact1), EAB_CONTACT_MATCH_NOT_APPLICABLE); + g_return_val_if_fail (contact2 && E_IS_CONTACT (contact2), EAB_CONTACT_MATCH_NOT_APPLICABLE); + + contact1_email = e_contact_get (contact1, E_CONTACT_EMAIL); + contact2_email = e_contact_get (contact2, E_CONTACT_EMAIL); + + if (contact1_email == NULL || contact2_email == NULL) { + g_list_foreach (contact1_email, (GFunc)g_free, NULL); + g_list_free (contact1_email); + + g_list_foreach (contact2_email, (GFunc)g_free, NULL); + g_list_free (contact2_email); + return EAB_CONTACT_MATCH_NOT_APPLICABLE; + } + + i1 = contact1_email; + + /* Do pairwise-comparisons on all of the e-mail addresses. If + we find an exact match, there is no reason to keep + checking. */ + while (i1 && match != EAB_CONTACT_MATCH_EXACT) { + char *addr1 = (char *) i1->data; + + i2 = contact2_email; + while (i2 && match != EAB_CONTACT_MATCH_EXACT) { + char *addr2 = (char *) i2->data; + + match = combine_comparisons (match, compare_email_addresses (addr1, addr2)); + + i2 = i2->next; + } + + i1 = i1->next; + } + + g_list_foreach (contact1_email, (GFunc)g_free, NULL); + g_list_free (contact1_email); + + g_list_foreach (contact2_email, (GFunc)g_free, NULL); + g_list_free (contact2_email); + + return match; +} + +EABContactMatchType +eab_contact_compare_address (EContact *contact1, EContact *contact2) +{ + g_return_val_if_fail (contact1 && E_IS_CONTACT (contact1), EAB_CONTACT_MATCH_NOT_APPLICABLE); + g_return_val_if_fail (contact2 && E_IS_CONTACT (contact2), EAB_CONTACT_MATCH_NOT_APPLICABLE); + + /* Unimplemented */ + + return EAB_CONTACT_MATCH_NOT_APPLICABLE; +} + +EABContactMatchType +eab_contact_compare_telephone (EContact *contact1, EContact *contact2) +{ + g_return_val_if_fail (contact1 && E_IS_CONTACT (contact1), EAB_CONTACT_MATCH_NOT_APPLICABLE); + g_return_val_if_fail (contact2 && E_IS_CONTACT (contact2), EAB_CONTACT_MATCH_NOT_APPLICABLE); + + /* Unimplemented */ + + return EAB_CONTACT_MATCH_NOT_APPLICABLE; +} + +EABContactMatchType +eab_contact_compare (EContact *contact1, EContact *contact2) +{ + EABContactMatchType result; + + g_return_val_if_fail (contact1 && E_IS_CONTACT (contact1), EAB_CONTACT_MATCH_NOT_APPLICABLE); + g_return_val_if_fail (contact2 && E_IS_CONTACT (contact2), EAB_CONTACT_MATCH_NOT_APPLICABLE); + + result = EAB_CONTACT_MATCH_NONE; + result = combine_comparisons (result, eab_contact_compare_name (contact1, contact2)); + result = combine_comparisons (result, eab_contact_compare_nickname (contact1, contact2)); + result = combine_comparisons (result, eab_contact_compare_email (contact1, contact2)); + result = combine_comparisons (result, eab_contact_compare_address (contact1, contact2)); + result = combine_comparisons (result, eab_contact_compare_telephone (contact1, contact2)); + + return result; +} + +typedef struct _MatchSearchInfo MatchSearchInfo; +struct _MatchSearchInfo { + EContact *contact; + GList *avoid; + EABContactMatchQueryCallback cb; + gpointer closure; +}; + +static void +match_search_info_free (MatchSearchInfo *info) +{ + if (info) { + g_object_unref (info->contact); + + /* This should already have been deallocated, but just in case... */ + if (info->avoid) { + g_list_foreach (info->avoid, (GFunc) g_object_unref, NULL); + g_list_free (info->avoid); + info->avoid = NULL; + } + + g_free (info); + } +} + +static void +query_cb (EBook *book, EBookStatus status, GList *contacts, gpointer closure) +{ + /* XXX we need to free contacts */ + MatchSearchInfo *info = (MatchSearchInfo *) closure; + EABContactMatchType best_match = EAB_CONTACT_MATCH_NONE; + EContact *best_contact = NULL; + GList *remaining_contacts = NULL; + const GList *i; + + if (status != E_BOOK_ERROR_OK) { + info->cb (info->contact, NULL, EAB_CONTACT_MATCH_NONE, info->closure); + match_search_info_free (info); + return; + } + + /* remove the contacts we're to avoid from the list, if they're present */ + for (i = contacts; i != NULL; i = g_list_next (i)) { + EContact *this_contact = E_CONTACT (i->data); + GList *iterator; + gboolean avoid = FALSE; + for (iterator = info->avoid; iterator; iterator = iterator->next) { + if (!strcmp (e_contact_get_const (iterator->data, E_CONTACT_UID), + e_contact_get_const (this_contact, E_CONTACT_UID))) { + avoid = TRUE; + break; + } + } + if (!avoid) + remaining_contacts = g_list_prepend (remaining_contacts, this_contact); + } + + remaining_contacts = g_list_reverse (remaining_contacts); + + for (i = remaining_contacts; i != NULL; i = g_list_next (i)) { + EContact *this_contact = E_CONTACT (i->data); + EABContactMatchType this_match = eab_contact_compare (info->contact, this_contact); + if ((gint)this_match > (gint)best_match) { + best_match = this_match; + best_contact = this_contact; + } + } + + g_list_free (remaining_contacts); + + info->cb (info->contact, best_contact, best_match, info->closure); + match_search_info_free (info); +} + +#define MAX_QUERY_PARTS 10 +static void +use_common_book_cb (EBook *book, gpointer closure) +{ + MatchSearchInfo *info = (MatchSearchInfo *) closure; + EContact *contact = info->contact; + EContactName *contact_name; + GList *contact_email; + gchar *query_parts[MAX_QUERY_PARTS]; + gint p=0; + gchar *query, *qj; + int i; + + if (book == NULL) { + info->cb (info->contact, NULL, EAB_CONTACT_MATCH_NONE, info->closure); + match_search_info_free (info); + return; + } + + contact_name = e_contact_get (contact, E_CONTACT_NAME); + if (contact_name) { + if (contact_name->given && *contact_name->given) + query_parts[p++] = g_strdup_printf ("(contains \"full_name\" \"%s\")", contact_name->given); + + if (contact_name->additional && *contact_name->additional) + query_parts[p++] = g_strdup_printf ("(contains \"full_name\" \"%s\")", contact_name->additional); + + if (contact_name->family && *contact_name->family) + query_parts[p++] = g_strdup_printf ("(contains \"full_name\" \"%s\")", contact_name->family); + + e_contact_name_free (contact_name); + } + + contact_email = e_contact_get (contact, E_CONTACT_EMAIL); + if (contact_email) { + GList *iter; + for (iter = contact_email; iter && p < MAX_QUERY_PARTS; iter = iter->next) { + gchar *addr = g_strdup (iter->data); + if (addr && *addr) { + gchar *s = addr; + while (*s) { + if (*s == '@') { + *s = '\0'; + break; + } + ++s; + } + query_parts[p++] = g_strdup_printf ("(beginswith \"email\" \"%s\")", addr); + g_free (addr); + } + } + } + g_list_foreach (contact_email, (GFunc)g_free, NULL); + g_list_free (contact_email); + + + /* Build up our full query from the parts. */ + query_parts[p] = NULL; + qj = g_strjoinv (" ", query_parts); + for(i = 0; query_parts[i] != NULL; i++) + g_free(query_parts[i]); + if (p > 0) { + query = g_strdup_printf ("(or %s)", qj); + g_free (qj); + } else { + query = qj; + } + + if (query && *query) + e_book_async_get_contacts (book, query, query_cb, info); + else + query_cb (book, E_BOOK_ERROR_OK, NULL, info); + + g_free (query); +} + +void +eab_contact_locate_match (EContact *contact, EABContactMatchQueryCallback cb, gpointer closure) +{ + MatchSearchInfo *info; + + g_return_if_fail (contact && E_IS_CONTACT (contact)); + g_return_if_fail (cb != NULL); + + info = g_new (MatchSearchInfo, 1); + info->contact = contact; + g_object_ref (contact); + info->cb = cb; + info->closure = closure; + info->avoid = NULL; + + addressbook_load_default_book (use_common_book_cb, info); +} + +/** + * e_contact_locate_match_full: + * @book: The book to look in. If this is NULL, use the default + * addressbook. + * @contact: The contact to compare to. + * @avoid: A list of contacts to not match. These will not show up in the search. + * @cb: The function to call. + * @closure: The closure to add to the call. + * + * Look for the best match and return it using the EABContactMatchQueryCallback. + **/ +void +eab_contact_locate_match_full (EBook *book, EContact *contact, GList *avoid, EABContactMatchQueryCallback cb, gpointer closure) +{ + MatchSearchInfo *info; + + g_return_if_fail (contact && E_IS_CONTACT (contact)); + g_return_if_fail (cb != NULL); + + info = g_new (MatchSearchInfo, 1); + info->contact = contact; + g_object_ref (contact); + info->cb = cb; + info->closure = closure; + info->avoid = g_list_copy (avoid); + g_list_foreach (info->avoid, (GFunc) g_object_ref, NULL); + + if (book) + use_common_book_cb (book, info); + else + addressbook_load_default_book (use_common_book_cb, info); +} + diff --git a/addressbook/gui/merging/eab-contact-compare.h b/addressbook/gui/merging/eab-contact-compare.h new file mode 100644 index 0000000000..07a9cd7e35 --- /dev/null +++ b/addressbook/gui/merging/eab-contact-compare.h @@ -0,0 +1,73 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ + +/* + * eab-contact-compare.h + * + * Copyright (C) 2001,2002,2003 Ximian, Inc. + * + * Authors: Jon Trowbridge <trow@ximian.com> + * Chris Toshok <toshok@ximian.com> + */ + +/* + * 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_CONTACT_COMPARE_H__ +#define __EAB_CONTACT_COMPARE_H__ + +#include "ebook/e-book.h" +#include "ebook/e-contact.h" + +typedef enum { + EAB_CONTACT_MATCH_NOT_APPLICABLE = 0, + EAB_CONTACT_MATCH_NONE = 1, + EAB_CONTACT_MATCH_VAGUE = 2, + EAB_CONTACT_MATCH_PARTIAL = 3, + EAB_CONTACT_MATCH_EXACT = 4 +} EABContactMatchType; + +typedef enum { + EAB_CONTACT_MATCH_PART_NOT_APPLICABLE = -1, + EAB_CONTACT_MATCH_PART_NONE = 0, + EAB_CONTACT_MATCH_PART_GIVEN_NAME = 1<<0, + EAB_CONTACT_MATCH_PART_ADDITIONAL_NAME = 1<<2, + EAB_CONTACT_MATCH_PART_FAMILY_NAME = 1<<3 +} EABContactMatchPart; + +typedef void (*EABContactMatchQueryCallback) (EContact *contact, EContact *match, EABContactMatchType type, gpointer closure); + +EABContactMatchType eab_contact_compare_name_to_string (EContact *contact, const gchar *str); + +EABContactMatchType eab_contact_compare_name_to_string_full (EContact *contact, const gchar *str, + gboolean allow_partial_matches, + gint *matched_parts, EABContactMatchPart *first_matched_part, + gint *matched_character_count); + +EABContactMatchType eab_contact_compare_name (EContact *contact1, EContact *contact2); +EABContactMatchType eab_contact_compare_nickname (EContact *contact1, EContact *contact2); +EABContactMatchType eab_contact_compare_email (EContact *contact1, EContact *contact2); +EABContactMatchType eab_contact_compare_address (EContact *contact1, EContact *contact2); +EABContactMatchType eab_contact_compare_telephone (EContact *contact1, EContact *contact2); + +EABContactMatchType eab_contact_compare (EContact *contact1, EContact *contact2); + +void eab_contact_locate_match (EContact *contact, EABContactMatchQueryCallback cb, gpointer closure); +void eab_contact_locate_match_full (EBook *book, EContact *contact, GList *avoid, EABContactMatchQueryCallback cb, gpointer closure); + + + +#endif /* __E_CONTACT_COMPARE_H__ */ + diff --git a/addressbook/gui/merging/e-card-duplicate-detected.glade b/addressbook/gui/merging/eab-contact-duplicate-detected.glade index 5c287cd163..c44547fb92 100644 --- a/addressbook/gui/merging/e-card-duplicate-detected.glade +++ b/addressbook/gui/merging/eab-contact-duplicate-detected.glade @@ -68,12 +68,12 @@ <property name="column_spacing">6</property> <child> - <widget class="Custom" id="custom-old-card"> + <widget class="Custom" id="custom-old-contact"> <property name="visible">True</property> - <property name="creation_function">e_card_merging_create_old_card</property> + <property name="creation_function">_eab_contact_merging_create_contact_display</property> <property name="int1">0</property> <property name="int2">0</property> - <property name="last_modification_time">Fri, 08 Jun 2001 01:33:22 GMT</property> + <property name="last_modification_time">Sun, 05 Oct 2003 03:55:10 GMT</property> </widget> <packing> <property name="left_attach">1</property> @@ -155,12 +155,12 @@ in this folder. Would you like to add it anyway?</property> </child> <child> - <widget class="Custom" id="custom-new-card"> + <widget class="Custom" id="custom-new-contact"> <property name="visible">True</property> - <property name="creation_function">e_card_merging_create_old_card</property> + <property name="creation_function">_eab_contact_merging_create_contact_display</property> <property name="int1">0</property> <property name="int2">0</property> - <property name="last_modification_time">Fri, 08 Jun 2001 01:33:22 GMT</property> + <property name="last_modification_time">Sun, 05 Oct 2003 03:54:50 GMT</property> </widget> <packing> <property name="left_attach">1</property> diff --git a/addressbook/gui/merging/eab-contact-merging.c b/addressbook/gui/merging/eab-contact-merging.c new file mode 100644 index 0000000000..38a3c188b2 --- /dev/null +++ b/addressbook/gui/merging/eab-contact-merging.c @@ -0,0 +1,197 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * Code for checking for duplicates when doing EContact work. + * + * Authors: + * Christopher James Lahey <clahey@ximian.com> + * Chris Toshok <toshok@ximian.com> + * + * Copyright (C) 2001, 2002, 2003, Ximian, Inc. + */ + +#include <config.h> + +#include "eab-contact-merging.h" +#include "eab-contact-compare.h" +#include <glade/glade.h> +#include <gtk/gtksignal.h> +#include "addressbook/gui/widgets/eab-contact-display.h" + +typedef enum { + E_CONTACT_MERGING_ADD, + E_CONTACT_MERGING_COMMIT +} EContactMergingOpType; + +typedef struct { + EContactMergingOpType op; + EBook *book; + EContact *contact; + EBookIdCallback id_cb; + EBookCallback cb; + gpointer closure; +} EContactMergingLookup; + +static void +free_lookup (EContactMergingLookup *lookup) +{ + g_object_unref (lookup->book); + g_object_unref (lookup->contact); + + g_free (lookup); +} + +static void +final_id_cb (EBook *book, EBookStatus status, const char *id, gpointer closure) +{ + EContactMergingLookup *lookup = closure; + + if (lookup->id_cb) + lookup->id_cb (lookup->book, status, id, lookup->closure); + + free_lookup (lookup); +} + +static void +final_cb (EBook *book, EBookStatus status, gpointer closure) +{ + EContactMergingLookup *lookup = closure; + + if (lookup->cb) + lookup->cb (lookup->book, status, lookup->closure); + + free_lookup (lookup); +} + +static void +doit (EContactMergingLookup *lookup) +{ + if (lookup->op == E_CONTACT_MERGING_ADD) + e_book_async_add_contact (lookup->book, lookup->contact, final_id_cb, lookup); + else if (lookup->op == E_CONTACT_MERGING_COMMIT) + e_book_async_commit_contact (lookup->book, lookup->contact, final_cb, lookup); +} + +static void +cancelit (EContactMergingLookup *lookup) +{ + if (lookup->op == E_CONTACT_MERGING_ADD) { + if (lookup->id_cb) + final_id_cb (lookup->book, E_BOOK_ERROR_CANCELLED, NULL, lookup); + } else if (lookup->op == E_CONTACT_MERGING_COMMIT) { + if (lookup->cb) + final_cb (lookup->book, E_BOOK_ERROR_CANCELLED, lookup); + } +} + +static void +response (GtkWidget *dialog, int response, EContactMergingLookup *lookup) +{ + gtk_widget_destroy (dialog); + + switch (response) { + case 0: + doit (lookup); + break; + case 1: + cancelit (lookup); + break; + } +} + +static void +match_query_callback (EContact *contact, EContact *match, EABContactMatchType type, gpointer closure) +{ + EContactMergingLookup *lookup = closure; + + if ((gint) type <= (gint) EAB_CONTACT_MATCH_VAGUE) { + doit (lookup); + } else { + GladeXML *ui; + + GtkWidget *widget; + + if (lookup->op == E_CONTACT_MERGING_ADD) + ui = glade_xml_new (EVOLUTION_GLADEDIR "/eab-contact-duplicate-detected.glade", NULL, NULL); + else if (lookup->op == E_CONTACT_MERGING_COMMIT) + ui = glade_xml_new (EVOLUTION_GLADEDIR "/eab-contact-merging-commit-duplicate-detected.glade", NULL, NULL); + else { + doit (lookup); + return; + } + + widget = glade_xml_get_widget (ui, "custom-old-contact"); + eab_contact_display_render (EAB_CONTACT_DISPLAY (widget), + match, EAB_CONTACT_DISPLAY_RENDER_COMPACT); + + widget = glade_xml_get_widget (ui, "custom-new-contact"); + eab_contact_display_render (EAB_CONTACT_DISPLAY (widget), + contact, EAB_CONTACT_DISPLAY_RENDER_COMPACT); + + widget = glade_xml_get_widget (ui, "dialog-duplicate-contact"); + + g_signal_connect (widget, "response", + G_CALLBACK (response), lookup); + + gtk_widget_show_all (widget); + } +} + +gboolean +eab_merging_book_add_contact (EBook *book, + EContact *contact, + EBookIdCallback cb, + gpointer closure) +{ + EContactMergingLookup *lookup; + + lookup = g_new (EContactMergingLookup, 1); + + lookup->op = E_CONTACT_MERGING_ADD; + lookup->book = g_object_ref (book); + lookup->contact = g_object_ref (contact); + lookup->id_cb = cb; + lookup->closure = closure; + + eab_contact_locate_match_full (book, contact, NULL, match_query_callback, lookup); + + return TRUE; +} + +gboolean +eab_merging_book_commit_contact (EBook *book, + EContact *contact, + EBookCallback cb, + gpointer closure) +{ + EContactMergingLookup *lookup; + GList *avoid; + + lookup = g_new (EContactMergingLookup, 1); + + lookup->op = E_CONTACT_MERGING_COMMIT; + lookup->book = g_object_ref (book); + lookup->contact = g_object_ref (contact); + lookup->cb = cb; + lookup->closure = closure; + + avoid = g_list_append (NULL, contact); + + eab_contact_locate_match_full (book, contact, avoid, match_query_callback, lookup); + + g_list_free (avoid); + + return TRUE; +} + +GtkWidget * +_eab_contact_merging_create_contact_display(gchar *name, + gchar *string1, gchar *string2, + gint int1, gint int2); + +GtkWidget * +_eab_contact_merging_create_contact_display(gchar *name, + gchar *string1, gchar *string2, + gint int1, gint int2) +{ + return eab_contact_display_new(); +} diff --git a/addressbook/gui/merging/eab-contact-merging.h b/addressbook/gui/merging/eab-contact-merging.h new file mode 100644 index 0000000000..6011263f31 --- /dev/null +++ b/addressbook/gui/merging/eab-contact-merging.h @@ -0,0 +1,30 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * The Evolution addressbook client object. + * + * Authors: + * Christopher James Lahey <clahey@ximian.com> + * Chris Toshok <toshok@ximian.com> + * + * Copyright (C) 2001, 2002, 2003 Ximian, Inc. + */ + +#ifndef __E_CONTACT_MERGING_H__ +#define __E_CONTACT_MERGING_H__ + +#include <addressbook/backend/ebook/e-book-async.h> + +G_BEGIN_DECLS + +gboolean eab_merging_book_add_contact (EBook *book, + EContact *contact, + EBookIdCallback cb, + gpointer closure); +gboolean eab_merging_book_commit_contact (EBook *book, + EContact *contact, + EBookCallback cb, + gpointer closure); + +G_END_DECLS + +#endif /* ! __EAB_CONTACT_MERGING_H__ */ diff --git a/addressbook/gui/search/e-addressbook-search-dialog.c b/addressbook/gui/search/e-addressbook-search-dialog.c index eefd170a73..a8621bf5a7 100644 --- a/addressbook/gui/search/e-addressbook-search-dialog.c +++ b/addressbook/gui/search/e-addressbook-search-dialog.c @@ -30,23 +30,23 @@ #include "e-addressbook-search-dialog.h" -static void e_addressbook_search_dialog_init (EAddressbookSearchDialog *widget); -static void e_addressbook_search_dialog_class_init (EAddressbookSearchDialogClass *klass); -static void e_addressbook_search_dialog_dispose (GObject *object); +static void eab_search_dialog_init (EABSearchDialog *widget); +static void eab_search_dialog_class_init (EABSearchDialogClass *klass); +static void eab_search_dialog_dispose (GObject *object); static GtkDialog *parent_class = NULL; #define PARENT_TYPE GTK_TYPE_DIALOG -E_MAKE_TYPE (e_addressbook_search_dialog, - "EAddressbookSearchDialog", - EAddressbookSearchDialog, - e_addressbook_search_dialog_class_init, - e_addressbook_search_dialog_init, +E_MAKE_TYPE (eab_search_dialog, + "EABSearchDialog", + EABSearchDialog, + eab_search_dialog_class_init, + eab_search_dialog_init, PARENT_TYPE) static void -e_addressbook_search_dialog_class_init (EAddressbookSearchDialogClass *klass) +eab_search_dialog_class_init (EABSearchDialogClass *klass) { GObjectClass *object_class; @@ -54,11 +54,11 @@ e_addressbook_search_dialog_class_init (EAddressbookSearchDialogClass *klass) parent_class = g_type_class_ref (PARENT_TYPE); - object_class->dispose = e_addressbook_search_dialog_dispose; + object_class->dispose = eab_search_dialog_dispose; } static GtkWidget * -get_widget (EAddressbookSearchDialog *view) +get_widget (EABSearchDialog *view) { FilterPart *part; @@ -79,7 +79,7 @@ get_widget (EAddressbookSearchDialog *view) } static char * -get_query (EAddressbookSearchDialog *view) +get_query (EABSearchDialog *view) { GString *out = g_string_new(""); char *ret; @@ -92,7 +92,7 @@ get_query (EAddressbookSearchDialog *view) } static void -dialog_response (GtkWidget *widget, int response_id, EAddressbookSearchDialog *dialog) +dialog_response (GtkWidget *widget, int response_id, EABSearchDialog *dialog) { char *query; @@ -108,7 +108,7 @@ dialog_response (GtkWidget *widget, int response_id, EAddressbookSearchDialog *d } static void -e_addressbook_search_dialog_init (EAddressbookSearchDialog *view) +eab_search_dialog_init (EABSearchDialog *view) { GtkDialog *dialog = GTK_DIALOG (view); @@ -131,19 +131,19 @@ e_addressbook_search_dialog_init (EAddressbookSearchDialog *view) } GtkWidget * -e_addressbook_search_dialog_new (EAddressbookView *addr_view) +eab_search_dialog_new (EABView *addr_view) { - EAddressbookSearchDialog *view = g_object_new (E_ADDRESSBOOK_SEARCH_DIALOG_TYPE, NULL); + EABSearchDialog *view = g_object_new (EAB_SEARCH_DIALOG_TYPE, NULL); view->view = addr_view; return GTK_WIDGET(view); } static void -e_addressbook_search_dialog_dispose (GObject *object) +eab_search_dialog_dispose (GObject *object) { - EAddressbookSearchDialog *view; + EABSearchDialog *view; - view = E_ADDRESSBOOK_SEARCH_DIALOG (object); + view = EAB_SEARCH_DIALOG (object); if (view->context) { g_object_unref(view->context); diff --git a/addressbook/gui/search/e-addressbook-search-dialog.h b/addressbook/gui/search/e-addressbook-search-dialog.h index 4be0050ca0..ef501766ea 100644 --- a/addressbook/gui/search/e-addressbook-search-dialog.h +++ b/addressbook/gui/search/e-addressbook-search-dialog.h @@ -17,8 +17,9 @@ * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ -#ifndef __E_ADDRESSBOOK_SEARCH_DIALOG_H__ -#define __E_ADDRESSBOOK_SEARCH_DIALOG_H__ + +#ifndef __EAB_SEARCH_DIALOG_H__ +#define __EAB_SEARCH_DIALOG_H__ #include <ebook/e-book.h> @@ -29,37 +30,37 @@ G_BEGIN_DECLS -#define E_ADDRESSBOOK_SEARCH_DIALOG_TYPE (e_addressbook_search_dialog_get_type ()) -#define E_ADDRESSBOOK_SEARCH_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), E_ADDRESSBOOK_SEARCH_DIALOG_TYPE, EAddressbookSearchDialog)) -#define E_ADDRESSBOOK_SEARCH_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), E_ADDRESSBOOK_SEARCH_DIALOG_TYPE, EAddressbookSearchDialogClass)) -#define E_IS_ADDRESSBOOK_SEARCH_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), E_ADDRESSBOOK_SEARCH_DIALOG_TYPE)) -#define E_IS_ADDRESSBOOK_SEARCH_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), E_ADDRESSBOOK_SEARCH_DIALOG_TYPE)) +#define EAB_SEARCH_DIALOG_TYPE (eab_search_dialog_get_type ()) +#define EAB_SEARCH_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EAB_SEARCH_DIALOG_TYPE, EABSearchDialog)) +#define EAB_SEARCH_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EAB_SEARCH_DIALOG_TYPE, EABSearchDialogClass)) +#define E_IS_ADDRESSBOOK_SEARCH_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EAB_SEARCH_DIALOG_TYPE)) +#define E_IS_ADDRESSBOOK_SEARCH_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), EAB_SEARCH_DIALOG_TYPE)) -typedef struct _EAddressbookSearchDialog EAddressbookSearchDialog; -typedef struct _EAddressbookSearchDialogClass EAddressbookSearchDialogClass; +typedef struct _EABSearchDialog EABSearchDialog; +typedef struct _EABSearchDialogClass EABSearchDialogClass; -struct _EAddressbookSearchDialog +struct _EABSearchDialog { GtkDialog parent; GtkWidget *search; - EAddressbookView *view; + EABView *view; RuleContext *context; FilterRule *rule; }; -struct _EAddressbookSearchDialogClass +struct _EABSearchDialogClass { GtkDialogClass parent_class; }; -GType e_addressbook_search_dialog_get_type (void); +GType eab_search_dialog_get_type (void); -GtkWidget *e_addressbook_search_dialog_new (EAddressbookView *view); +GtkWidget *eab_search_dialog_new (EABView *view); G_END_DECLS -#endif /* __E_ADDRESSBOOK_SEARCH_DIALOG_H__ */ +#endif /* __EAB_SEARCH_DIALOG_H__ */ 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-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 <config.h> -#include "e-addressbook-marshal.h" +#include "eab-marshal.h" #include "e-addressbook-model.h" #include <libxml/tree.h> #include <libxml/parser.h> #include <libxml/xmlmemory.h> #include <gnome.h> #include <gal/widgets/e-gui-utils.h> -#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 <glib.h> #include <glib-object.h> -#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 <string.h> #include <libgnome/gnome-i18n.h> -#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 <gal/widgets/e-popup-menu.h> #include <gal/widgets/e-gui-utils.h> -#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 <gal/widgets/e-reflow-model.h> -#include <gal/widgets/e-selection-model.h> #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 <config.h> #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 <libxml/tree.h> #include <libxml/parser.h> #include <libxml/xmlmemory.h> #include <gnome.h> 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, "<?xml", 5)) { - EDestination *dest = e_destination_import (value); + EABDestination *dest = eab_destination_import (value); if (dest) { /* XXX blech, we leak this */ - value = g_strdup (e_destination_get_textrep (dest, TRUE)); + value = g_strdup (eab_destination_get_textrep (dest, TRUE)); g_object_unref (dest); } } @@ -140,22 +105,26 @@ addressbook_value_at (ETableModel *etc, int col, int row) } /* This function sets the value at a particular point in our ETableModel. */ +#if 0 static void card_modified_cb (EBook* book, EBookStatus status, gpointer user_data) { - if (status != E_BOOK_STATUS_SUCCESS) - e_addressbook_error_dialog (_("Error modifying card"), status); + if (status != E_BOOK_ERROR_OK) + eab_error_dialog (_("Error modifying card"), status); } +#endif + static void addressbook_set_value_at (ETableModel *etc, int col, int row, const void *val) { - EAddressbookTableAdapter *adapter = E_ADDRESSBOOK_TABLE_ADAPTER(etc); +#if 0 + EAddressbookTableAdapter *adapter = EAB_TABLE_ADAPTER(etc); EAddressbookTableAdapterPrivate *priv = adapter->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 <gal/e-table/e-table-model.h> #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 <gtk/gtktreednd.h> #include <libxml/tree.h> #include <libxml/parser.h> @@ -380,10 +380,10 @@ adapter_get_value (GtkTreeModel *tree_model, v = e_card_simple_get_const(simple, column); if (v && !strncmp (v, "<?xml", 5)) { - EDestination *dest = e_destination_import (v); + EABDestination *dest = eab_destination_import (v); if (dest) { /* XXX blech, we leak this */ - v = g_strdup (e_destination_get_textrep (dest, TRUE)); + v = g_strdup (eab_destination_get_textrep (dest, TRUE)); g_object_unref (dest); } } 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 <toshok@ximian.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is 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 <gal/widgets/e-treeview-selection-model.h> #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 <gdk/gdkkeysyms.h> @@ -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 @@ <ETableSpecification click-to-add="true" draw-grid="true" _click-to-add-message="* Click here to add a contact *"> - <ETableColumn model_col= "0" _title="File As" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/> - <ETableColumn model_col= "1" _title="Full Name" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/> - <ETableColumn model_col= "2" _title="Email" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/> + <ETableColumn model_col= "2" _title="File As" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/> + <ETableColumn model_col= "3" _title="Full Name" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/> + <ETableColumn model_col= "7" _title="Email" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/> +<!-- <ETableColumn model_col= "3" _title="Primary Phone" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/> <ETableColumn model_col= "4" _title="Assistant Phone" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/> <ETableColumn model_col= "5" _title="Business Phone" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/> <ETableColumn model_col= "6" _title="Callback Phone" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/> <ETableColumn model_col= "7" _title="Company Phone" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/> <ETableColumn model_col= "8" _title="Home Phone" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/> - <ETableColumn model_col= "9" _title="Organization" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/> +--> + <ETableColumn model_col="21" _title="Organization" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/> +<!-- <ETableColumn model_col="10" _title="Business Address" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/> <ETableColumn model_col="11" _title="Home Address" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/> <ETableColumn model_col="12" _title="Mobile Phone" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/> @@ -25,19 +28,22 @@ <ETableColumn model_col="23" _title="Telex" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/> <ETableColumn model_col="24" _title="TTY" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/> <ETableColumn model_col="25" _title="Other Address" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/> - <ETableColumn model_col="26" _title="Email 2" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/> - <ETableColumn model_col="27" _title="Email 3" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/> +--> + <ETableColumn model_col="8" _title="Email 2" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/> + <ETableColumn model_col="9" _title="Email 3" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/> <ETableColumn model_col="28" _title="Web Site" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/> - <ETableColumn model_col="29" _title="Department" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/> - <ETableColumn model_col="30" _title="Office" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/> - <ETableColumn model_col="31" _title="Title" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/> - <ETableColumn model_col="32" _title="Profession" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/> - <ETableColumn model_col="33" _title="Manager" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/> - <ETableColumn model_col="34" _title="Assistant" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/> + <ETableColumn model_col="22" _title="Department" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/> + <ETableColumn model_col="23" _title="Office" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/> + <ETableColumn model_col="24" _title="Title" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/> + <ETableColumn model_col="25" _title="Profession" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/> + <ETableColumn model_col="26" _title="Manager" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/> + <ETableColumn model_col="27" _title="Assistant" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/> <ETableColumn model_col="35" _title="Nickname" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/> +<!-- <ETableColumn model_col="36" _title="Spouse" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/> <ETableColumn model_col="37" _title="Note" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/> <ETableColumn model_col="38" _title="Free-busy URL" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/> +--> <ETableState> <column source="0"/> <column source="1"/> 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 <gtk/gtktable.h> +#include <gtk/gtkeventbox.h> #include <bonobo/bonobo-ui-component.h> #include <gal/menus/gal-view-instance.h> #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.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 <bonobo/bonobo-control.h> - -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 <config.h> #include "e-minicard-label.h" -#include "e-addressbook-marshal.h" +#include "eab-marshal.h" #include <gtk/gtksignal.h> #include <libgnomecanvas/gnome-canvas-rect-ellipse.h> @@ -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 <gal/widgets/e-canvas.h> #include <libgnome/gnome-i18n.h> -#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 @@ -326,6 +301,18 @@ selection_change (ESelectionModel *esm, EMinicardViewWidget *widget) } 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) { g_signal_emit (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 <gtk/gtkselection.h> #include <gtk/gtkdnd.h> #include <gal/widgets/e-canvas.h> @@ -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 <clahey@ximian.com> - * - * 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 <gtk/gtkmain.h> -#include <libgnomeui/gnome-app.h> -#include <libgnomeui/gnome-init.h> -#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 <clahey@umich.edu>", - 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 <clahey@ximian.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is 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 <config.h> -#include <libgnome/gnome-i18n.h> -#include <libgnomecanvas/gnome-canvas-rect-ellipse.h> -#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 <clahey@ximian.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is 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 <gal/widgets/e-canvas.h> -#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 <gal/widgets/e-canvas-utils.h> #include <gal/widgets/e-canvas.h> #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, "<?xml", 5)) { - EDestination *dest = e_destination_import (string); + EABDestination *dest = eab_destination_import (string); if (dest != NULL) { - gchar *new_string = g_strdup (e_destination_get_textrep (dest, TRUE)); + gchar *new_string = g_strdup (eab_destination_get_textrep (dest, TRUE)); g_free (string); string = new_string; g_object_unref (dest); @@ -834,15 +706,13 @@ add_field (EMinicard *e_minicard, ECardSimpleField field, gdouble left_width) "fieldname", name, "field", string, "max_field_name_length", left_width, - "editable", e_minicard->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, "<?xml", 4)) { - EDestination *dest = e_destination_import (string); + EABDestination *dest = eab_destination_import (string); if (dest != NULL) { - gchar *new_string = g_strdup (e_destination_get_textrep (dest, TRUE)); + gchar *new_string = g_strdup (eab_destination_get_textrep (dest, TRUE)); g_free (string); string = new_string; g_object_unref (dest); @@ -948,7 +823,7 @@ remodel( EMinicard *e_minicard ) left_width = get_left_width(e_minicard); } - string = e_card_simple_get(e_minicard->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 <gdk-pixbuf/gdk-pixbuf.h> #include "addressbook/gui/contact-editor/e-contact-editor.h" #include <libgnomecanvas/gnome-canvas.h> -#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 <toshok@ximian.com> + * + * 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 <string.h> +#include <libgnome/gnome-i18n.h> +#include <libgnome/gnome-url.h> +#include <gtkhtml/gtkhtml.h> +#include <gtkhtml/gtkhtml-stream.h> + +#define PARENT_TYPE (gtk_vbox_get_type ()) + +struct _EABContactDisplayPrivate { + GtkHTML *html; + EContact *contact; +}; + + +#define HTML_HEADER "<!doctype html public \"-//W3C//DTD HTML 4.0 TRANSITIONAL//EN\">\n<html>\n" \ + "<head>\n<meta name=\"generator\" content=\"Evolution Addressbook Component\">\n</head>\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, "<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\"><tr valign=\"top\"><td>"); + gtk_html_stream_printf (html_stream, "<b>%s:</b> <td>%s<br>", html_label, html); + + gtk_html_stream_printf (html_stream, "<a href=\"http://www.mapquest.com/\">%s</a>", _("Map It")); + gtk_html_stream_printf (html_stream, "</td></tr></table>"); + 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, "<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\"><tr valign=\"top\"><td>"); + gtk_html_stream_printf (html_stream, "<b>%s:</b> <td>", html_label); + + if (adr->po && *adr->po) gtk_html_stream_printf (html_stream, "%s<br>", adr->po); + if (adr->ext && *adr->ext) gtk_html_stream_printf (html_stream, "%s<br>", adr->ext); + if (adr->street && *adr->street) gtk_html_stream_printf (html_stream, "%s<br>", adr->street); + if (adr->locality && *adr->locality) gtk_html_stream_printf (html_stream, "%s<br>", adr->locality); + if (adr->region && *adr->region) gtk_html_stream_printf (html_stream, "%s<br>", adr->region); + if (adr->code && *adr->code) gtk_html_stream_printf (html_stream, "%s<br>", adr->code); + if (adr->country && *adr->country) gtk_html_stream_printf (html_stream, "%s<br>", adr->country); + + gtk_html_stream_printf (html_stream, "<a href=\"http://www.mapquest.com/\">%s</a>", _("Map It")); + gtk_html_stream_printf (html_stream, "</td></tr></table>"); + } + 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, "<b>%s:</b> %s<br>", 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, "<b>%s:</b> %s<br>", + 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, "<body>\n", 7); + + if (contact) { + char *str, *html; + EContactPhoto *photo; + + gtk_html_stream_printf (html_stream, "<table border=\"0\" valign=\"top\"><tr valign=\"top\"><td>"); + 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, "<img src=\"internal-contact-photo:\">"); + e_contact_photo_free (photo); + } + + gtk_html_stream_printf (html_stream, "</td><td>\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, "<h2>%s</h2>", 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, "<h2>%s</h2>", html); + g_free (html); + } + } + + if (e_contact_get (contact, E_CONTACT_IS_LIST)) { + GList *email_list; + GList *l; + + gtk_html_stream_printf (html_stream, "<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\"><tr valign=\"top\"><td>"); + gtk_html_stream_printf (html_stream, "<b>%s:</b> <td>", _("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<br>", html); + g_free (html); + g_object_unref (dest); + } + } + gtk_html_stream_printf (html_stream, "</td></tr></table>"); + } + 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, "<hr>"); + + 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, "</td></tr></table>\n"); + } + + gtk_html_stream_write (html_stream, "</body></html>\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, "<body>\n", 7); + + if (contact) { + char *str, *html; + EContactPhoto *photo; + + gtk_html_stream_printf (html_stream, + "<table width=\"100%%\" cellpadding=1 cellspacing=0 bgcolor=\"#000000\">" + "<tr><td>" + "<table width=\"100%%\" cellpadding=0 cellspacing=0 bgcolor=\"#eeeeee\">" + "<tr><td>" + "<table>" + "<tr valign=\"top\"><td>"); + + 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, "<img width=\"%d\" height=\"%d\" src=\"internal-contact-photo:\">", + calced_width, calced_height); + e_contact_photo_free (photo); + } + + gtk_html_stream_printf (html_stream, "</td><td>\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, "<b>%s</b>", 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, "<b>%s</b>", html); + g_free (html); + } + } + + gtk_html_stream_write (html_stream, "<hr>", 4); + + if (e_contact_get (contact, E_CONTACT_IS_LIST)) { + GList *email_list; + GList *l; + + gtk_html_stream_printf (html_stream, "<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\"><tr valign=\"top\"><td>"); + gtk_html_stream_printf (html_stream, "<b>%s:</b> <td>", _("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, "</td></tr></table>"); + } + 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, "<b>%s:</b> %s<br>", _("Job Title"), str); + g_free (html); + } + + gtk_html_stream_printf (html_stream, "<b>%s:</b> ", _("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, "<br>", 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, "<b>%s:</b> %s<br>", + _("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, "<b>%s:</b> %s<br>", + _("Blog"), html); + } + } + + gtk_html_stream_printf (html_stream, "</td></tr></table></td></tr></table></td></tr></table>\n"); + } + + gtk_html_stream_write (html_stream, "</body></html>\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 <toshok@ximian.com> + * + * 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 <gtk/gtkvbox.h> +#include <gtkhtml/gtkhtml.h> +#include <ebook/e-contact.h> + +#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/e-addressbook-util.c b/addressbook/gui/widgets/eab-gui-util.c index 1ddb6812a2..666bc976f2 100644 --- a/addressbook/gui/widgets/e-addressbook-util.c +++ b/addressbook/gui/widgets/eab-gui-util.c @@ -20,26 +20,34 @@ */ #include <config.h> -#include "e-addressbook-util.h" -#include "ebook/e-destination.h" -#include <gnome.h> +#include <unistd.h> +#include <fcntl.h> +#include <errno.h> +#include <string.h> + #include <gal/util/e-util.h> +#include "eab-gui-util.h" +#include "util/eab-book-util.h" +#include "util/eab-destination.h" + +#include <gnome.h> -#include "e-card-merging.h" #include <shell/evolution-shell-client.h> -#include <addressbook/backend/ebook/e-book-util.h> + +#include "addressbook/gui/contact-editor/e-contact-editor.h" +#include "addressbook/gui/contact-list-editor/e-contact-list-editor.h" void -e_addressbook_error_dialog (const gchar *msg, EBookStatus status) +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_("Card not found"), - N_("Card ID already exists"), + N_("Contact not found"), + N_("Contact ID already exists"), N_("Protocol not supported"), N_("Cancelled"), N_("Authentication Failed"), @@ -64,7 +72,7 @@ e_addressbook_error_dialog (const gchar *msg, EBookStatus status) } gint -e_addressbook_prompt_save_dialog (GtkWindow *parent) +eab_prompt_save_dialog (GtkWindow *parent) { GtkWidget *dialog; gint response; @@ -93,8 +101,8 @@ 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); + if (status != E_BOOK_ERROR_OK) { + eab_error_dialog (is_list ? _("Error adding list") : _("Error adding contact"), status); } } @@ -102,9 +110,9 @@ 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); + if (status != E_BOOK_ERROR_OK) { + eab_error_dialog (is_list ? _("Error modifying list") : _("Error modifying contact"), + status); } } @@ -112,9 +120,9 @@ 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); + if (status != E_BOOK_ERROR_OK) { + eab_error_dialog (is_list ? _("Error removing list") : _("Error removing contact"), + status); } } @@ -125,19 +133,19 @@ editor_closed_cb (GtkObject *editor, gpointer data) } EContactEditor * -e_addressbook_show_contact_editor (EBook *book, ECard *card, - gboolean is_new_card, - gboolean editable) +eab_show_contact_editor (EBook *book, EContact *contact, + gboolean is_new_contact, + gboolean editable) { EContactEditor *ce; - ce = e_contact_editor_new (book, card, is_new_card, editable); + ce = e_contact_editor_new (book, contact, is_new_contact, editable); - g_signal_connect (ce, "card_added", + g_signal_connect (ce, "contact_added", G_CALLBACK (added_cb), GINT_TO_POINTER (FALSE)); - g_signal_connect (ce, "card_modified", + g_signal_connect (ce, "contact_modified", G_CALLBACK (modified_cb), GINT_TO_POINTER (FALSE)); - g_signal_connect (ce, "card_deleted", + 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); @@ -146,13 +154,13 @@ e_addressbook_show_contact_editor (EBook *book, ECard *card, } EContactListEditor * -e_addressbook_show_contact_list_editor (EBook *book, ECard *card, - gboolean is_new_card, - gboolean editable) +eab_show_contact_list_editor (EBook *book, EContact *contact, + gboolean is_new_contact, + gboolean editable) { EContactListEditor *ce; - ce = e_contact_list_editor_new (book, card, is_new_card, editable); + 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)); @@ -169,21 +177,21 @@ e_addressbook_show_contact_list_editor (EBook *book, ECard *card, } static void -view_cards (EBook *book, GList *list, gboolean editable) +view_contacts (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); + EContact *contact = list->data; + if (e_contact_get (contact, E_CONTACT_IS_LIST)) + eab_show_contact_list_editor (book, contact, FALSE, editable); else - e_addressbook_show_contact_editor (book, card, FALSE, editable); + eab_show_contact_editor (book, contact, FALSE, editable); } } void -e_addressbook_show_multiple_cards (EBook *book, - GList *list, - gboolean editable) +eab_show_multiple_contacts (EBook *book, + GList *list, + gboolean editable) { if (list) { int length = g_list_length (list); @@ -195,40 +203,218 @@ e_addressbook_show_multiple_cards (EBook *book, 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?"), + _("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_cards (book, list, editable); + view_contacts (book, list, editable); } else { - view_cards (book, list, editable); + 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)); +} -typedef struct CardCopyProcess_ CardCopyProcess; +static void +destroy_it(void *data, GObject *where_the_object_was) +{ + SaveAsInfo *info = data; + g_free (info->vcard); + g_free (info); +} -typedef void (*CardCopyDone) (CardCopyProcess *process); +static char * +make_safe_filename (const char *prefix, char *name) +{ + char *safe, *p; -struct CardCopyProcess_ { + 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 *cards; + GList *contacts; EBook *source; EBook *destination; - CardCopyDone done_cb; + ContactCopyDone done_cb; }; static void -card_deleted_cb (EBook* book, EBookStatus status, gpointer user_data) +contact_deleted_cb (EBook* book, EBookStatus status, gpointer user_data) { - if (status != E_BOOK_STATUS_SUCCESS) { - e_addressbook_error_dialog (_("Error removing card"), status); + if (status != E_BOOK_ERROR_OK) { + eab_error_dialog (_("Error removing contact"), status); } } @@ -236,28 +422,28 @@ static void do_delete (gpointer data, gpointer user_data) { EBook *book = user_data; - ECard *card = data; + EContact *contact = data; - e_book_remove_card(book, card, card_deleted_cb, NULL); + e_book_async_remove_contact(book, contact, contact_deleted_cb, NULL); } static void -delete_cards (CardCopyProcess *process) +delete_contacts (ContactCopyProcess *process) { - g_list_foreach (process->cards, + g_list_foreach (process->contacts, do_delete, process->source); } static void -process_unref (CardCopyProcess *process) +process_unref (ContactCopyProcess *process) { process->count --; if (process->count == 0) { if (process->done_cb) { process->done_cb (process); } - e_free_object_list(process->cards); + e_free_object_list(process->contacts); g_object_unref (process->source); g_object_unref (process->destination); g_free (process); @@ -265,12 +451,12 @@ process_unref (CardCopyProcess *process) } static void -card_added_cb (EBook* book, EBookStatus status, const char *id, gpointer user_data) +contact_added_cb (EBook* book, EBookStatus status, const char *id, gpointer user_data) { - CardCopyProcess *process = user_data; + ContactCopyProcess *process = user_data; - if (status != E_BOOK_STATUS_SUCCESS) { - e_addressbook_error_dialog (_("Error adding card"), status); + if (status != E_BOOK_ERROR_OK) { + eab_error_dialog (_("Error adding contact"), status); } else { process_unref (process); } @@ -280,66 +466,70 @@ static void do_copy (gpointer data, gpointer user_data) { EBook *book; - ECard *card; - CardCopyProcess *process; + EContact *contact; + ContactCopyProcess *process; process = user_data; - card = data; + contact = data; book = process->destination; process->count ++; - e_book_add_card(book, card, card_added_cb, process); + e_book_async_add_contact(book, contact, contact_added_cb, process); } static void -got_book_cb (EBook *book, gpointer closure) +got_book_cb (EBook *book, EBookStatus status, gpointer closure) { - CardCopyProcess *process; + ContactCopyProcess *process; process = closure; - if (book) { + if (status == E_BOOK_ERROR_OK) { process->destination = book; g_object_ref (book); - g_list_foreach (process->cards, + g_list_foreach (process->contacts, 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) +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; - CardCopyProcess *process; + ContactCopyProcess *process; char *desc; - if (cards == NULL) + if (contacts == NULL) return; if (last_uri == NULL) last_uri = g_strdup (""); - if (cards->next == NULL) { + if (contacts->next == NULL) { if (delete_from_source) - desc = _("Move card to"); + desc = _("Move contact to"); else - desc = _("Copy card to"); + desc = _("Copy contact to"); } else { if (delete_from_source) - desc = _("Move cards to"); + desc = _("Move contacts to"); else - desc = _("Copy cards to"); + 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; @@ -348,19 +538,20 @@ e_addressbook_transfer_cards (EBook *source, GList *cards /* adopted */, gboolea last_uri = g_strdup (folder->evolutionUri); } - process = g_new (CardCopyProcess, 1); + process = g_new (ContactCopyProcess, 1); process->count = 1; process->source = source; g_object_ref (source); - process->cards = cards; + process->contacts = contacts; process->destination = NULL; if (delete_from_source) - process->done_cb = delete_cards; + process->done_cb = delete_contacts; else process->done_cb = NULL; - e_book_use_address_book_by_uri (folder->physicalUri, got_book_cb, process); + dest = e_book_new (); + e_book_async_load_uri (dest, folder->physicalUri, got_book_cb, process); CORBA_free (folder); } @@ -370,19 +561,20 @@ e_addressbook_transfer_cards (EBook *source, GList *cards /* adopted */, gboolea #define COMPOSER_OAFID "OAFIID:GNOME_Evolution_Mail_Composer" void -e_addressbook_send_card_list (GList *cards, EAddressbookDisposition disposition) +eab_send_contact_list (GList *contacts, EABDisposition disposition) { +#if notyet GNOME_Evolution_Composer composer_server; CORBA_Environment ev; - if (cards == NULL) + if (contacts == 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) { + if (disposition == EAB_DISPOSITION_AS_TO) { GNOME_Evolution_Composer_RecipientList *to_list, *cc_list, *bcc_list; CORBA_char *subject; int to_i, bcc_i; @@ -390,9 +582,9 @@ e_addressbook_send_card_list (GList *cards, EAddressbookDisposition disposition) 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)) { + 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; @@ -453,11 +645,11 @@ e_addressbook_send_card_list (GList *cards, EAddressbookDisposition disposition) 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)); + /* 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 (e_destination_get_name (dest)); - addr = g_strdup (e_destination_get_email (dest)); + name = g_strdup (eab_destination_get_name (dest)); + addr = g_strdup (eab_destination_get_email (dest)); free_name_addr = TRUE; g_object_unref (dest); } @@ -502,7 +694,7 @@ e_addressbook_send_card_list (GList *cards, EAddressbookDisposition disposition) CORBA_free (cc_list); CORBA_free (bcc_list); CORBA_free (subject); - } else if (disposition == E_ADDRESSBOOK_DISPOSITION_AS_ATTACHMENT) { + } else if (disposition == EAB_DISPOSITION_AS_ATTACHMENT) { CORBA_char *content_type, *filename, *description; GNOME_Evolution_Composer_AttachmentData *attach_data; CORBA_boolean show_inline; @@ -526,16 +718,15 @@ e_addressbook_send_card_list (GList *cards, EAddressbookDisposition disposition) 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); + 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); - memcpy(attach_data->_buffer, tempstr, attach_data->_length); + strcpy (attach_data->_buffer, tempstr); g_free (tempstr); GNOME_Evolution_Composer_attachData (composer_server, @@ -573,17 +764,15 @@ e_addressbook_send_card_list (GList *cards, EAddressbookDisposition disposition) g_object_get(card, "file_as", &tempstr2, NULL); - if (!tempstr2 || !*tempstr2) { - g_free (tempstr2); + if (!tempstr2 || !*tempstr2) g_object_get(card, "full_name", &tempstr2, NULL); - } if (!tempstr2 || !*tempstr2) { - g_free (tempstr2); + if (!tempstr2 || !*tempstr2) g_object_get(card, "org", &tempstr2, NULL); - } if (!tempstr2 || !*tempstr2) { + if (!tempstr2 || !*tempstr2) { EList *list; EIterator *iterator; g_object_get(card, @@ -594,7 +783,6 @@ e_addressbook_send_card_list (GList *cards, EAddressbookDisposition disposition) tempstr2 = e_iterator_get (iterator); } g_object_unref (iterator); - g_object_unref (list); } if (!tempstr2 || !*tempstr2) @@ -602,7 +790,6 @@ e_addressbook_send_card_list (GList *cards, EAddressbookDisposition disposition) else tempstr = g_strdup_printf ("Contact information for %s", tempstr2); subject = CORBA_string_dup (tempstr); - g_free (tempstr2); g_free (tempstr); } @@ -623,14 +810,14 @@ e_addressbook_send_card_list (GList *cards, EAddressbookDisposition disposition) } CORBA_exception_free (&ev); +#endif } void -e_addressbook_send_card (ECard *card, EAddressbookDisposition disposition) +eab_send_contact (EContact *contact, EABDisposition disposition) { GList *list; - list = g_list_prepend (NULL, card); - e_addressbook_send_card_list (list, disposition); + 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 <toshok@ximian.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of version 2 of the GNU General Public + * License as published by the Free Software Foundation. + * + * This program is 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 <gtk/gtkwindow.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" + +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/e-addressbook-marshal.list b/addressbook/gui/widgets/eab-marshal.list index 2b34707dbb..2b34707dbb 100644 --- a/addressbook/gui/widgets/e-addressbook-marshal.list +++ b/addressbook/gui/widgets/eab-marshal.list diff --git a/addressbook/gui/component/e-address-popup.c b/addressbook/gui/widgets/eab-popup-control.c index 9d87fd0fb3..e2d0299d6e 100644 --- a/addressbook/gui/component/e-address-popup.c +++ b/addressbook/gui/widgets/eab-popup-control.c @@ -1,11 +1,12 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* - * e-address-popup.c + * eab-popup-control.c * - * Copyright (C) 2001 Ximian, Inc. + * Copyright (C) 2001-2003, Ximian, Inc. * - * Developed by Jon Trowbridge <trow@ximian.com> + * Authors: Jon Trowbridge <trow@ximian.com> + * Chris Toshok <toshok@ximian.com> */ /* @@ -31,19 +32,22 @@ #include <config.h> #include <string.h> #include "addressbook.h" -#include "e-address-popup.h" +#include "eab-popup-control.h" #include <bonobo/bonobo-control.h> #include <bonobo/bonobo-property-bag.h> #include <bonobo/bonobo-generic-factory.h> #include <gal/widgets/e-popup-menu.h> -#include <addressbook/backend/ebook/e-book.h> -#include <addressbook/backend/ebook/e-book-util.h> +#include <addressbook/backend/ebook/e-book-async.h> +#include <addressbook/util/eab-book-util.h> #include <addressbook/gui/contact-editor/e-contact-editor.h> #include <addressbook/gui/contact-editor/e-contact-quick-add.h> -#include <addressbook/gui/widgets/e-minicard-widget.h> -#include <addressbook/gui/widgets/e-addressbook-util.h> +#include <addressbook/gui/widgets/eab-contact-display.h> +#include <addressbook/gui/widgets/eab-gui-util.h> #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 @@ -178,7 +182,7 @@ mini_wizard_new (void) /* * 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 - * card. + * contact. */ #define EMPTY_ENTRY N_("(none)") @@ -225,20 +229,18 @@ menu_activate_cb (GtkWidget *w, gpointer closure) } static void -email_menu_add_option (EMailMenu *menu, const gchar *addr) +email_menu_add_option (EMailMenu *menu, char *addr) { GtkWidget *menu_item; - gchar *addr_cpy; g_return_if_fail (menu != NULL); if (addr == NULL) return; - addr_cpy = g_strdup (addr); - menu->options = g_list_append (menu->options, addr_cpy); + 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_cpy); + 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); @@ -249,23 +251,17 @@ email_menu_add_option (EMailMenu *menu, const gchar *addr) } static void -email_menu_add_options_from_card (EMailMenu *menu, ECard *card, const gchar *extra_addr) +email_menu_add_options_from_contact (EMailMenu *menu, EContact *contact, const gchar *extra_addr) { - ECardSimple *simple; - - g_return_if_fail (card && E_IS_CARD (card)); - - simple = e_card_simple_new (card); + 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_card_simple_get_email (simple, E_CARD_SIMPLE_EMAIL_ID_EMAIL)); - email_menu_add_option (menu, e_card_simple_get_email (simple, E_CARD_SIMPLE_EMAIL_ID_EMAIL_2)); - email_menu_add_option (menu, e_card_simple_get_email (simple, E_CARD_SIMPLE_EMAIL_ID_EMAIL_3)); - email_menu_add_option (menu, extra_addr); + 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); - - g_object_unref (simple); } static void @@ -325,7 +321,7 @@ email_menu_unset_option (EMailMenu *menu, const gchar *addr) typedef struct _EMailTable EMailTable; struct _EMailTable { GtkWidget *table; - ECard *card; + EContact *contact; EMailMenu *primary; EMailMenu *email2; EMailMenu *email3; @@ -339,7 +335,7 @@ email_table_cleanup_cb (gpointer closure) if (et == NULL) return; - g_object_unref (et->card); + g_object_unref (et->contact); email_menu_free (et->primary); email_menu_free (et->email2); email_menu_free (et->email3); @@ -348,74 +344,49 @@ email_table_cleanup_cb (gpointer closure) } static void -email_table_from_card (EMailTable *et) +email_table_from_contact (EMailTable *et) { - ECardSimple *simple; - g_return_if_fail (et != NULL); - simple = e_card_simple_new (et->card); - email_menu_set_option (et->primary, e_card_simple_get_email (simple, E_CARD_SIMPLE_EMAIL_ID_EMAIL)); - email_menu_set_option (et->email2, e_card_simple_get_email (simple, E_CARD_SIMPLE_EMAIL_ID_EMAIL_2)); - email_menu_set_option (et->email3, e_card_simple_get_email (simple, E_CARD_SIMPLE_EMAIL_ID_EMAIL_3)); - g_object_unref (simple); + 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_card (EMailTable *et) +email_table_to_contact (EMailTable *et) { - ECardSimple *simple; gchar *curr; g_return_if_fail (et != NULL); - simple = e_card_simple_new (et->card); - curr = et->primary->current_selection; if (curr && !strcmp (curr, _(EMPTY_ENTRY))) curr = NULL; - e_card_simple_set_email (simple, E_CARD_SIMPLE_EMAIL_ID_EMAIL, curr); + e_contact_set (et->contact, E_CONTACT_EMAIL_1, curr); curr = et->email2->current_selection; if (curr && !strcmp (curr, _(EMPTY_ENTRY))) curr = NULL; - e_card_simple_set_email (simple, E_CARD_SIMPLE_EMAIL_ID_EMAIL_2, curr); + e_contact_set (et->contact, E_CONTACT_EMAIL_2, curr); curr = et->email3->current_selection; if (curr && !strcmp (curr, _(EMPTY_ENTRY))) curr = NULL; - e_card_simple_set_email (simple, E_CARD_SIMPLE_EMAIL_ID_EMAIL_3, curr); - - e_card_simple_sync_card (simple); - g_object_unref (simple); + e_contact_set (et->contact, E_CONTACT_EMAIL_3, curr); } static void -email_table_save_card_cb (EBook *book, EBookStatus status, gpointer closure) +email_table_save_contact_cb (EBook *book, EBookStatus status, gpointer closure) { - ECard *card = E_CARD (closure); + EContact *contact = E_CONTACT (closure); - if (status == E_BOOK_STATUS_SUCCESS) { - e_book_commit_card (book, card, NULL, NULL); + if (status == E_BOOK_ERROR_OK) { + e_book_async_commit_contact (book, contact, NULL, NULL); } if (book) g_object_unref (book); - g_object_unref (card); -} - -/* - * We have to do this in an idle function because of what might be a - * re-entrancy problems with EBook. - */ -static gint -add_card_idle_cb (gpointer closure) -{ - EBook *book; - - book = e_book_new (); - addressbook_load_default_book (book, email_table_save_card_cb, closure); - - return 0; + g_object_unref (contact); } static void @@ -423,16 +394,17 @@ email_table_ok_cb (MiniWizard *wiz, gpointer closure) { EMailTable *et = (EMailTable *) closure; - email_table_to_card (et); + email_table_to_contact (et); + + g_object_ref (et->contact); - g_object_ref (et->card); - gtk_idle_add (add_card_idle_cb, et->card); + addressbook_load_default_book (email_table_save_contact_cb, et->contact); mini_wizard_destroy (wiz); } static void -email_table_init (MiniWizard *wiz, ECard *card, const gchar *extra_address) +email_table_init (MiniWizard *wiz, EContact *contact, const gchar *extra_address) { EMailTable *et; @@ -441,12 +413,12 @@ email_table_init (MiniWizard *wiz, ECard *card, const gchar *extra_address) GtkAttachOptions label_x_opts, label_y_opts; GtkAttachOptions menu_x_opts, menu_y_opts; - g_return_if_fail (card && E_IS_CARD (card)); + g_return_if_fail (contact && E_IS_CONTACT (contact)); et = g_new (EMailTable, 1); - et->card = card; - g_object_ref (et->card); + et->contact = contact; + g_object_ref (et->contact); et->table = gtk_table_new (4, 2, FALSE); @@ -454,11 +426,11 @@ email_table_init (MiniWizard *wiz, ECard *card, const gchar *extra_address) et->email2 = email_menu_new (); et->email3 = email_menu_new (); - email_menu_add_options_from_card (et->primary, et->card, extra_address); - email_menu_add_options_from_card (et->email2, et->card, extra_address); - email_menu_add_options_from_card (et->email3, et->card, extra_address); + 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_card (et); + email_table_from_contact (et); label_x_opts = GTK_FILL; label_y_opts = GTK_FILL; @@ -467,7 +439,7 @@ email_table_init (MiniWizard *wiz, ECard *card, const gchar *extra_address) xpad = 3; ypad = 3; - name_str = e_card_name_to_string (et->card->name); + 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, @@ -516,32 +488,32 @@ email_table_init (MiniWizard *wiz, ECard *card, const gchar *extra_address) } /* - * This code is for the little UI thing that lets you pick from a set of cards + * 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 _CardPicker CardPicker; -struct _CardPicker { +typedef struct _ContactPicker ContactPicker; +struct _ContactPicker { GtkWidget *body; GtkWidget *list; GtkListStore *model; - GList *cards; + GList *contacts; gchar *new_name; gchar *new_email; - ECard *current_card; + EContact *current_contact; }; enum { COLUMN_ACTION, - COLUMN_CARD + COLUMN_CONTACT }; static void -card_picker_selection_changed (GtkTreeSelection *selection, gpointer closure) +contact_picker_selection_changed (GtkTreeSelection *selection, gpointer closure) { MiniWizard *wiz = (MiniWizard *) closure; - CardPicker *pick = (CardPicker *) wiz->closure; + ContactPicker *pick = (ContactPicker *) wiz->closure; gboolean selected; GtkTreeIter iter; @@ -551,34 +523,34 @@ card_picker_selection_changed (GtkTreeSelection *selection, gpointer closure) if (selected) { gtk_tree_model_get (GTK_TREE_MODEL (pick->model), &iter, - COLUMN_CARD, &pick->current_card, + COLUMN_CONTACT, &pick->current_contact, -1); } else { - pick->current_card = NULL; + pick->current_contact = NULL; } } static void -card_picker_ok_cb (MiniWizard *wiz, gpointer closure) +contact_picker_ok_cb (MiniWizard *wiz, gpointer closure) { - CardPicker *pick = (CardPicker *) closure; + ContactPicker *pick = (ContactPicker *) closure; - if (pick->current_card == NULL) { + 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_card, pick->new_email); + email_table_init (wiz, pick->current_contact, pick->new_email); } } static void -card_picker_cleanup_cb (gpointer closure) +contact_picker_cleanup_cb (gpointer closure) { - CardPicker *pick = (CardPicker *) closure; + ContactPicker *pick = (ContactPicker *) closure; - g_list_foreach (pick->cards, (GFunc) g_object_unref, NULL); - g_list_free (pick->cards); + 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); @@ -592,14 +564,14 @@ free_str (gpointer data, } static void -card_picker_init (MiniWizard *wiz, const GList *cards, const gchar *new_name, const gchar *new_email) +contact_picker_init (MiniWizard *wiz, const GList *contacts, const gchar *new_name, const gchar *new_email) { - CardPicker *pick; + ContactPicker *pick; gchar *str; GtkWidget *w; GtkTreeIter iter; - pick = g_new (CardPicker, 1); + pick = g_new (ContactPicker, 1); pick->body = gtk_vbox_new (FALSE, 2); @@ -623,44 +595,44 @@ card_picker_init (MiniWizard *wiz, const GList *cards, const gchar *new_name, co gtk_list_store_append (pick->model, &iter); gtk_list_store_set (pick->model, &iter, COLUMN_ACTION, str, - COLUMN_CARD, NULL, + COLUMN_CONTACT, NULL, -1); g_object_weak_ref (G_OBJECT (pick->model), free_str, str); - pick->cards = NULL; - while (cards) { - ECard *card = (ECard *) cards->data; - gchar *name_str = e_card_name_to_string (card->name); + pick->contacts = NULL; + while (contacts) { + EContact *contact = (EContact *) contacts->data; + gchar *name_str = e_contact_get (contact, E_CONTACT_FULL_NAME); - pick->cards = g_list_append (pick->cards, card); - g_object_ref (card); + 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_CARD, card, + COLUMN_CONTACT, contact, -1); g_free (name_str); g_object_weak_ref (G_OBJECT (pick->model), free_str, str); - cards = g_list_next (cards); + contacts = g_list_next (contacts); } pick->new_name = g_strdup (new_name); pick->new_email = g_strdup (new_email); - pick->current_card = NULL; + pick->current_contact = NULL; gtk_widget_set_sensitive (wiz->ok_button, FALSE); /* Connect some signals & callbacks */ - wiz->ok_cb = card_picker_ok_cb; - wiz->cleanup_cb = card_picker_cleanup_cb; + 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 (card_picker_selection_changed), + "changed", G_CALLBACK (contact_picker_selection_changed), wiz); /* Build our widget */ @@ -681,7 +653,7 @@ card_picker_init (MiniWizard *wiz, const GList *cards, const gchar *new_name, co /* ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** */ /* - * The code for the actual EAddressPopup widget begins here. + * The code for the actual EABPopupControl widget begins here. */ /* ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** */ @@ -689,41 +661,43 @@ card_picker_init (MiniWizard *wiz, const GList *cards, const gchar *new_name, co static GtkObjectClass *parent_class; -static void e_address_popup_dispose (GObject *); -static void e_address_popup_query (EAddressPopup *); +static void eab_popup_control_dispose (GObject *); +static void eab_popup_control_query (EABPopupControl *); static void -e_address_popup_class_init (EAddressPopupClass *klass) +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 = e_address_popup_dispose; + object_class->dispose = eab_popup_control_dispose; } static void -e_address_popup_init (EAddressPopup *pop) +eab_popup_control_init (EABPopupControl *pop) { pop->transitory = TRUE; } static void -e_address_popup_cleanup (EAddressPopup *pop) +eab_popup_control_cleanup (EABPopupControl *pop) { - if (pop->card) { - g_object_unref (pop->card); - pop->card = NULL; + if (pop->contact) { + g_object_unref (pop->contact); + pop->contact = NULL; } if (pop->scheduled_refresh) { - gtk_timeout_remove (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; } @@ -740,42 +714,42 @@ e_address_popup_cleanup (EAddressPopup *pop) } static void -e_address_popup_dispose (GObject *obj) +eab_popup_control_dispose (GObject *obj) { - EAddressPopup *pop = E_ADDRESS_POPUP (obj); + EABPopupControl *pop = EAB_POPUP_CONTROL (obj); - e_address_popup_cleanup (pop); + eab_popup_control_cleanup (pop); if (G_OBJECT_CLASS (parent_class)->dispose) G_OBJECT_CLASS (parent_class)->dispose (obj); } GType -e_address_popup_get_type (void) +eab_popup_control_get_type (void) { static GType pop_type = 0; if (!pop_type) { static const GTypeInfo pop_info = { - sizeof (EAddressPopupClass), + sizeof (EABPopupControlClass), NULL, /* base_init */ NULL, /* base_finalize */ - (GClassInitFunc) e_address_popup_class_init, + (GClassInitFunc) eab_popup_control_class_init, NULL, /* class_finalize */ NULL, /* class_data */ - sizeof (EAddressPopup), + sizeof (EABPopupControl), 0, /* n_preallocs */ - (GInstanceInitFunc) e_address_popup_init, + (GInstanceInitFunc) eab_popup_control_init, }; - pop_type = g_type_register_static (gtk_event_box_get_type (), "EAddressPopup", &pop_info, 0); + pop_type = g_type_register_static (gtk_event_box_get_type (), "EABPopupControl", &pop_info, 0); } return pop_type; } static void -e_address_popup_refresh_names (EAddressPopup *pop) +eab_popup_control_refresh_names (EABPopupControl *pop) { if (pop->name_widget) { if (pop->name && *pop->name) { @@ -795,33 +769,33 @@ e_address_popup_refresh_names (EAddressPopup *pop) } } - e_address_popup_query (pop); + eab_popup_control_query (pop); } static gint refresh_timeout_cb (gpointer ptr) { - EAddressPopup *pop = E_ADDRESS_POPUP (ptr); - e_address_popup_refresh_names (pop); + EABPopupControl *pop = EAB_POPUP_CONTROL (ptr); + eab_popup_control_refresh_names (pop); pop->scheduled_refresh = 0; return 0; } static void -e_address_popup_schedule_refresh (EAddressPopup *pop) +eab_popup_control_schedule_refresh (EABPopupControl *pop) { if (pop->scheduled_refresh == 0) - pop->scheduled_refresh = gtk_timeout_add (20, refresh_timeout_cb, pop); + pop->scheduled_refresh = g_timeout_add (20, refresh_timeout_cb, pop); } /* If we are handed something of the form "Foo <bar@bar.com>", do the right thing. */ static gboolean -e_address_popup_set_free_form (EAddressPopup *pop, const gchar *txt) +eab_popup_control_set_free_form (EABPopupControl *pop, const gchar *txt) { gchar *lt, *gt = NULL; - g_return_val_if_fail (pop && E_IS_ADDRESS_POPUP (pop), FALSE); + g_return_val_if_fail (pop && EAB_IS_POPUP_CONTROL (pop), FALSE); if (txt == NULL) return FALSE; @@ -833,11 +807,8 @@ e_address_popup_set_free_form (EAddressPopup *pop, const gchar *txt) if (lt && gt && lt+1 < gt) { gchar *name = g_strndup (txt, lt-txt); gchar *email = g_strndup (lt+1, gt-lt-1); - e_address_popup_set_name (pop, name); - e_address_popup_set_email (pop, email); - - g_free (name); - g_free (email); + eab_popup_control_set_name (pop, name); + eab_popup_control_set_email (pop, email); return TRUE; } @@ -845,49 +816,49 @@ e_address_popup_set_free_form (EAddressPopup *pop, const gchar *txt) return FALSE; } -void -e_address_popup_set_name (EAddressPopup *pop, const gchar *name) +static void +eab_popup_control_set_name (EABPopupControl *pop, const gchar *name) { - g_return_if_fail (pop && E_IS_ADDRESS_POPUP (pop)); + g_return_if_fail (pop && EAB_IS_POPUP_CONTROL (pop)); /* We only allow the name to be set once. */ if (pop->name) return; - if (!e_address_popup_set_free_form (pop, name)) { + if (!eab_popup_control_set_free_form (pop, name)) { pop->name = g_strdup (name); if (pop->name) g_strstrip (pop->name); } - e_address_popup_schedule_refresh (pop); + eab_popup_control_schedule_refresh (pop); } -void -e_address_popup_set_email (EAddressPopup *pop, const gchar *email) +static void +eab_popup_control_set_email (EABPopupControl *pop, const gchar *email) { - g_return_if_fail (pop && E_IS_ADDRESS_POPUP (pop)); + 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 (!e_address_popup_set_free_form (pop, email)) { + if (!eab_popup_control_set_free_form (pop, email)) { pop->email = g_strdup (email); if (pop->email) g_strstrip (pop->email); } - e_address_popup_schedule_refresh (pop); + eab_popup_control_schedule_refresh (pop); } void -e_address_popup_construct (EAddressPopup *pop) +eab_popup_control_construct (EABPopupControl *pop) { GtkWidget *vbox, *name_holder; GdkColor color = { 0x0, 0xffff, 0xffff, 0xffff }; - g_return_if_fail (pop && E_IS_ADDRESS_POPUP (pop)); + g_return_if_fail (pop && EAB_IS_POPUP_CONTROL (pop)); pop->main_vbox = gtk_vbox_new (FALSE, 0); @@ -918,9 +889,9 @@ e_address_popup_construct (EAddressPopup *pop) gtk_box_pack_start (GTK_BOX (pop->main_vbox), pop->query_msg, TRUE, TRUE, 0); gtk_widget_show (pop->query_msg); - /* Build Minicard View */ - pop->minicard_view = e_minicard_widget_new (); - gtk_box_pack_start (GTK_BOX (pop->main_vbox), pop->minicard_view, TRUE, TRUE, 0); + /* 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 */ @@ -932,16 +903,16 @@ e_address_popup_construct (EAddressPopup *pop) gtk_container_set_border_width (GTK_CONTAINER (pop), 2); } -GtkWidget * -e_address_popup_new (void) +static GtkWidget * +eab_popup_new (void) { - EAddressPopup *pop = g_object_new (E_TYPE_ADDRESS_POPUP, NULL); - e_address_popup_construct (pop); + EABPopupControl *pop = g_object_new (EAB_TYPE_POPUP_CONTROL, NULL); + eab_popup_control_construct (pop); return GTK_WIDGET (pop); } static void -emit_event (EAddressPopup *pop, const char *event) +emit_event (EABPopupControl *pop, const char *event) { if (pop->es) { BonoboArg *arg; @@ -960,10 +931,10 @@ emit_event (EAddressPopup *pop, const char *event) static void contact_editor_cb (EBook *book, EBookStatus status, gpointer closure) { - if (status == E_BOOK_STATUS_SUCCESS) { - EAddressPopup *pop = E_ADDRESS_POPUP (closure); - EContactEditor *ce = e_addressbook_show_contact_editor (book, pop->card, FALSE, TRUE); - e_address_popup_cleanup (pop); + 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); } @@ -973,29 +944,29 @@ contact_editor_cb (EBook *book, EBookStatus status, gpointer closure) } static void -edit_contact_info_cb (GtkWidget *button, EAddressPopup *pop) +edit_contact_info_cb (GtkWidget *button, EABPopupControl *pop) { - EBook *book; emit_event (pop, "Hide"); - book = e_book_new (); - addressbook_load_default_book (book, contact_editor_cb, pop); + addressbook_load_default_book (contact_editor_cb, pop); } static void -e_address_popup_cardify (EAddressPopup *pop, ECard *card) +eab_popup_control_display_contact (EABPopupControl *pop, EContact *contact) { GtkWidget *b; - g_return_if_fail (pop && E_IS_ADDRESS_POPUP (pop)); - g_return_if_fail (card && E_IS_CARD (card)); - g_return_if_fail (pop->card == NULL); + 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->card = card; - g_object_ref (pop->card); + pop->contact = contact; + g_object_ref (pop->contact); - e_minicard_widget_set_card (E_MINICARD_WIDGET (pop->minicard_view), card); - gtk_widget_show (pop->minicard_view); + 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")); @@ -1008,7 +979,7 @@ e_address_popup_cardify (EAddressPopup *pop, ECard *card) } static void -add_contacts_cb (GtkWidget *button, EAddressPopup *pop) +add_contacts_cb (GtkWidget *button, EABPopupControl *pop) { if (pop->email && *pop->email) { if (pop->name && *pop->name) @@ -1017,16 +988,16 @@ add_contacts_cb (GtkWidget *button, EAddressPopup *pop) e_contact_quick_add_free_form (pop->email, NULL, NULL); } - e_address_popup_cleanup (pop); + eab_popup_control_cleanup (pop); emit_event (pop, "Destroy"); } static void -e_address_popup_no_matches (EAddressPopup *pop) +eab_popup_control_no_matches (EABPopupControl *pop) { GtkWidget *b; - g_return_if_fail (pop && E_IS_ADDRESS_POPUP (pop)); + g_return_if_fail (pop && EAB_IS_POPUP_CONTROL (pop)); b = e_button_new_with_stock_icon (_("Add to Contacts"), "gtk-add"); @@ -1045,7 +1016,7 @@ wizard_destroy_cb (MiniWizard *wiz, gpointer closure) } static void -e_address_popup_ambiguous_email_add (EAddressPopup *pop, const GList *cards) +eab_popup_control_ambiguous_email_add (EABPopupControl *pop, const GList *contacts) { MiniWizard *wiz = mini_wizard_new (); GtkWidget *win = gtk_window_new (GTK_WINDOW_TOPLEVEL); @@ -1056,9 +1027,9 @@ e_address_popup_ambiguous_email_add (EAddressPopup *pop, const GList *cards) gtk_window_set_title (GTK_WINDOW (win), _("Merge E-Mail Address")); gtk_window_set_position (GTK_WINDOW (win), GTK_WIN_POS_MOUSE); - card_picker_init (wiz, cards, pop->name, pop->email); + contact_picker_init (wiz, contacts, pop->name, pop->email); - e_address_popup_cleanup (pop); + eab_popup_control_cleanup (pop); emit_event (pop, "Destroy"); gtk_container_add (GTK_CONTAINER (win), wiz->body); @@ -1066,11 +1037,11 @@ e_address_popup_ambiguous_email_add (EAddressPopup *pop, const GList *cards) } static void -e_address_popup_multiple_matches (EAddressPopup *pop, const GList *cards) +eab_popup_control_multiple_matches (EABPopupControl *pop, const GList *contacts) { pop->multiple_matches = TRUE; - e_address_popup_ambiguous_email_add (pop, cards); + eab_popup_control_ambiguous_email_add (pop, contacts); } /** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** **/ @@ -1080,71 +1051,78 @@ e_address_popup_multiple_matches (EAddressPopup *pop, const GList *cards) */ static void -name_only_query_cb (EBook *book, EBookSimpleQueryStatus status, const GList *cards, gpointer closure) +name_only_query_cb (EBook *book, EBookStatus status, GList *contacts, gpointer closure) { - EAddressPopup *pop; + EABPopupControl *pop; - if (status != E_BOOK_SIMPLE_QUERY_STATUS_SUCCESS) + if (status != E_BOOK_ERROR_OK) return; - pop = E_ADDRESS_POPUP (closure); + pop = EAB_POPUP_CONTROL (closure); pop->query_tag = 0; - if (cards == NULL) { - e_address_popup_no_matches (pop); + if (contacts == NULL) { + eab_popup_control_no_matches (pop); } else { - e_address_popup_ambiguous_email_add (pop, cards); + 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, EBookSimpleQueryStatus status, const GList *cards, gpointer closure) +query_cb (EBook *book, EBookStatus status, GList *contacts, gpointer closure) { - EAddressPopup *pop; + EABPopupControl *pop; - if (status != E_BOOK_SIMPLE_QUERY_STATUS_SUCCESS) + if (status != E_BOOK_ERROR_OK) return; - pop = E_ADDRESS_POPUP (closure); + pop = EAB_POPUP_CONTROL (closure); pop->query_tag = 0; gtk_widget_hide (pop->query_msg); - if (cards == NULL) { + 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 = e_book_name_and_email_query (book, pop->name, NULL, name_only_query_cb, pop); + pop->query_tag = eab_name_and_email_query (book, pop->name, NULL, name_only_query_cb, pop); } else { - e_address_popup_no_matches (pop); + eab_popup_control_no_matches (pop); } } else { - if (g_list_length ((GList *) cards) == 1) - e_address_popup_cardify (pop, E_CARD (cards->data)); + if (g_list_length ((GList *) contacts) == 1) + eab_popup_control_display_contact (pop, E_CONTACT (contacts->data)); else - e_address_popup_multiple_matches (pop, cards); + 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) { - EAddressPopup *pop = E_ADDRESS_POPUP (closure); + EABPopupControl *pop = EAB_POPUP_CONTROL (closure); - if (status != E_BOOK_STATUS_SUCCESS) { - e_address_popup_no_matches (pop); + 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); @@ -1153,22 +1131,19 @@ start_query (EBook *book, EBookStatus status, gpointer closure) pop->book = book; } - pop->query_tag = e_book_name_and_email_query (book, pop->name, pop->email, query_cb, pop); + pop->query_tag = eab_name_and_email_query (book, pop->name, pop->email, query_cb, pop); g_object_unref (pop); } static void -e_address_popup_query (EAddressPopup *pop) +eab_popup_control_query (EABPopupControl *pop) { - EBook *book; - - g_return_if_fail (pop && E_IS_ADDRESS_POPUP (pop)); + g_return_if_fail (pop && EAB_IS_POPUP_CONTROL (pop)); - book = e_book_new (); g_object_ref (pop); - addressbook_load_default_book (book, start_query, pop); + addressbook_load_default_book (start_query, pop); } /** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** **/ @@ -1182,16 +1157,16 @@ enum { static void set_prop (BonoboPropertyBag *bag, const BonoboArg *arg, guint arg_id, CORBA_Environment *ev, gpointer user_data) { - EAddressPopup *pop = E_ADDRESS_POPUP (user_data); + EABPopupControl *pop = EAB_POPUP_CONTROL (user_data); switch (arg_id) { case PROPERTY_NAME: - e_address_popup_set_name (pop, BONOBO_ARG_GET_STRING (arg)); + eab_popup_control_set_name (pop, BONOBO_ARG_GET_STRING (arg)); break; case PROPERTY_EMAIL: - e_address_popup_set_email (pop, BONOBO_ARG_GET_STRING (arg)); + eab_popup_control_set_email (pop, BONOBO_ARG_GET_STRING (arg)); break; default: @@ -1202,7 +1177,7 @@ set_prop (BonoboPropertyBag *bag, const BonoboArg *arg, guint arg_id, CORBA_Envi static void get_prop (BonoboPropertyBag *bag, BonoboArg *arg, guint arg_id, CORBA_Environment *ev, gpointer user_data) { - EAddressPopup *pop = E_ADDRESS_POPUP (user_data); + EABPopupControl *pop = EAB_POPUP_CONTROL (user_data); switch (arg_id) { @@ -1224,15 +1199,15 @@ get_prop (BonoboPropertyBag *bag, BonoboArg *arg, guint arg_id, CORBA_Environmen } BonoboControl * -e_address_popup_new_control (void) +eab_popup_control_new (void) { BonoboControl *control; BonoboPropertyBag *bag; - EAddressPopup *addy; + EABPopupControl *addy; GtkWidget *w; - w = e_address_popup_new (); - addy = E_ADDRESS_POPUP (w); + w = eab_popup_new (); + addy = EAB_POPUP_CONTROL (w); control = bonobo_control_new (w); gtk_widget_show (w); 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 <trow@ximian.com> + * Chris Toshok <toshok@ximian.com> + */ + +/* + * 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 <gtk/gtk.h> +#include <addressbook/backend/ebook/e-book-async.h> +#include <addressbook/backend/ebook/e-contact.h> +#include <bonobo/bonobo-event-source.h> + +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/e-minicard-control.c b/addressbook/gui/widgets/eab-vcard-control.c index 7cbcfb028a..82c5fd6032 100644 --- a/addressbook/gui/widgets/e-minicard-control.c +++ b/addressbook/gui/widgets/eab-vcard-control.c @@ -1,8 +1,8 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* - * e-minicard-control.c + * eab-vcard-control.c * - * Copyright (C) 1999, 2000, 2001, 2002, Ximian, Inc. + * 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 @@ -20,6 +20,7 @@ * * Authors: * Chris Lahey <clahey@ximian.com> + * Chris Toshok <toshok@ximian.com> */ #include <config.h> @@ -33,87 +34,22 @@ #include <gal/util/e-util.h> #include <addressbook/gui/component/addressbook.h> -#include <addressbook/backend/ebook/e-book.h> -#include <addressbook/backend/ebook/e-book-util.h> -#include <addressbook/backend/ebook/e-card.h> +#include <addressbook/gui/widgets/eab-contact-display.h> +#include <addressbook/backend/ebook/e-book-async.h> +#include <addressbook/backend/ebook/e-contact.h> +#include <addressbook/util/eab-book-util.h> -#include "e-minicard-control.h" -#include "e-minicard-widget.h" -#include "e-card-merging.h" +#include "eab-vcard-control.h" +#include "eab-contact-merging.h" typedef struct { - EMinicardWidget *minicard; + EABContactDisplay *display; GList *card_list; GtkWidget *label; -} EMinicardControl; + EABContactDisplayRenderMode render_mode; +} EABVCardControl; -#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 +#define VCARD_CONTROL_ID "OAFIID:GNOME_Evolution_Addressbook_VCard_Control" /* * Bonobo::PersistStream @@ -174,7 +110,7 @@ pstream_load (BonoboPersistStream *ps, const Bonobo_Stream stream, { GList *list; char *vcard; - EMinicardControl *minicard_control = data; + EABVCardControl *vcard_control = data; if (type && g_ascii_strcasecmp (type, "text/vCard") != 0 && g_ascii_strcasecmp (type, "text/x-vCard") != 0) { @@ -189,27 +125,27 @@ pstream_load (BonoboPersistStream *ps, const Bonobo_Stream stream, return; } - e_free_object_list (minicard_control->card_list); - list = e_card_load_cards_from_string_with_default_charset(vcard, "ISO-8859-1"); + e_free_object_list (vcard_control->card_list); + list = eab_contact_list_from_string (vcard); g_free(vcard); - minicard_control->card_list = list; - if (list) - g_object_set(minicard_control->minicard, - "card", list->data, - NULL); + 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 cards."), length); + message = g_strdup_printf (_("and %d other contacts."), length); } else { - message = g_strdup_printf (_("and one other card.")); + message = g_strdup_printf (_("and one other contact.")); } - gtk_label_set_text (GTK_LABEL (minicard_control->label), message); + gtk_label_set_text (GTK_LABEL (vcard_control->label), message); g_free (message); - gtk_widget_show (minicard_control->label); + gtk_widget_show (vcard_control->label); } else { - gtk_widget_hide (minicard_control->label); + gtk_widget_hide (vcard_control->label); } } /* pstream_load */ @@ -221,7 +157,7 @@ pstream_save (BonoboPersistStream *ps, const Bonobo_Stream stream, Bonobo_Persist_ContentType type, void *data, CORBA_Environment *ev) { - EMinicardControl *minicard_control = data; + EABVCardControl *vcard_control = data; char *vcard; int length; @@ -232,7 +168,7 @@ pstream_save (BonoboPersistStream *ps, const Bonobo_Stream stream, return; } - vcard = e_card_list_get_vcard(minicard_control->card_list); + vcard = eab_contact_list_to_string (vcard_control->card_list); length = strlen (vcard); bonobo_stream_client_write (stream, vcard, length, ev); g_free (vcard); @@ -249,10 +185,11 @@ static void book_open_cb (EBook *book, EBookStatus status, gpointer closure) { GList *list = closure; - if (status == E_BOOK_STATUS_SUCCESS) { + if (status == E_BOOK_ERROR_OK) { GList *p; for (p = list; p; p = p->next) { - e_card_merging_book_add_card(book, p->data, NULL, NULL); + /* XXX argh, more passing of NULL's for callbacks */ + eab_merging_book_add_contact (book, E_CONTACT (p->data), NULL, NULL); } } if (book) @@ -263,87 +200,103 @@ book_open_cb (EBook *book, EBookStatus status, gpointer closure) static void save_in_addressbook(GtkWidget *button, gpointer data) { - EMinicardControl *minicard_control = data; + EABVCardControl *vcard_control = data; GList *list, *p; - EBook *book; - - book = e_book_new (); - list = g_list_copy (minicard_control->card_list); + 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, book_open_cb, list); + 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) { - EMinicardControl *minicard_control = data; - e_free_object_list (minicard_control->card_list); - g_free (minicard_control); + EABVCardControl *vcard_control = data; + e_free_object_list (vcard_control->card_list); + g_free (vcard_control); } BonoboControl * -e_minicard_control_new (void) +eab_vcard_control_new (void) { -#if 0 - BonoboPropertyBag *pb; -#endif BonoboControl *control; BonoboPersistStream *stream; - GtkWidget *minicard; - GtkWidget *button; + GtkWidget *display; + GtkWidget *button1, *button2; GtkWidget *label; - GtkWidget *vbox; + GtkWidget *table; - EMinicardControl *minicard_control = g_new (EMinicardControl, 1); + EABVCardControl *vcard_control = g_new (EABVCardControl, 1); + printf ("inside eab_vcard_control_new\n"); - minicard_control->card_list = NULL; - minicard_control->minicard = NULL; - minicard_control->label = NULL; + 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. */ - minicard = e_minicard_widget_new (); - gtk_widget_show (minicard); - minicard_control->minicard = E_MINICARD_WIDGET (minicard); + 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 (""); - minicard_control->label = label; + 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); - 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); + 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); - 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); + 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 (vbox); + control = bonobo_control_new (table); - g_object_weak_ref (G_OBJECT (control), free_struct, minicard_control); + g_object_weak_ref (G_OBJECT (control), free_struct, vcard_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 + VCARD_CONTROL_ID, + vcard_control); if (stream == NULL) { bonobo_object_unref (BONOBO_OBJECT (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 <bonobo/bonobo-control.h> + +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 <clahey@ximian.com> - * - * 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 <gtk/gtkmain.h> -#include <libgnomeui/gnome-app.h> -#include <libgnomeui/gnome-canvas-rect-ellipse.h> -#include <libgnomeui/gnome-init.h> -#include <gal/widgets/e-canvas.h> -#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 <clahey@umich.edu>", - 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 <clahey@ximian.com> - * - * 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 <libgnorba/gnorba.h> -#include <e-util/e-canvas.h> -#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 <clahey@umich.edu>", - 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 <clahey@ximian.com> - * - * 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 <gtk/gtkmain.h> -#include <libgnomeui/gnome-app.h> -#include <libgnomeui/gnome-init.h> -#include <libgnomeui/gnome-canvas-rect-ellipse.h> - -#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 <clahey@umich.edu>", - 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; -} |