diff options
Diffstat (limited to 'addressbook/backend')
-rw-r--r-- | addressbook/backend/ebook/Makefile.am | 8 | ||||
-rw-r--r-- | addressbook/backend/ebook/e-address-completion.c | 315 | ||||
-rw-r--r-- | addressbook/backend/ebook/e-address-completion.h | 65 | ||||
-rw-r--r-- | addressbook/backend/ebook/e-destination.c | 284 | ||||
-rw-r--r-- | addressbook/backend/ebook/e-destination.h | 73 |
5 files changed, 361 insertions, 384 deletions
diff --git a/addressbook/backend/ebook/Makefile.am b/addressbook/backend/ebook/Makefile.am index 207a87256e..fbba0c98d0 100644 --- a/addressbook/backend/ebook/Makefile.am +++ b/addressbook/backend/ebook/Makefile.am @@ -39,19 +39,18 @@ lib_LTLIBRARIES = libebook.la libebook_la_SOURCES = \ $(CORBA_SOURCE) \ - e-address-completion.c \ e-book-listener.c \ e-book-view-listener.c \ e-book-view.c \ e-book.c \ e-card-cursor.c \ e-card-simple.c \ - e-card.c + e-card.c \ + e-destination.c libebookincludedir = $(includedir)/evolution/ebook libebookinclude_HEADERS = \ - e-address-completion.h \ e-book-listener.h \ e-book-types.h \ e-book-view-listener.h \ @@ -61,7 +60,8 @@ libebookinclude_HEADERS = \ e-card-pairs.h \ e-card-simple.h \ e-card-types.h \ - e-card.h + e-card.h \ + e-destination.h # diff --git a/addressbook/backend/ebook/e-address-completion.c b/addressbook/backend/ebook/e-address-completion.c deleted file mode 100644 index 398782e13e..0000000000 --- a/addressbook/backend/ebook/e-address-completion.c +++ /dev/null @@ -1,315 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * An auto-completer for addresses from the address book. - * - * Author: - * Jon Trowbridge <trow@ximian.com> - * - * Copyright (C) 2001 Ximian, Inc. - */ - -/* - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#include <config.h> -#include "e-address-completion.h" - -static void e_address_completion_class_init (EAddressCompletionClass *klass); -static void e_address_completion_init (EAddressCompletion *addr_comp); -static void e_address_completion_destroy (GtkObject *object); - -static GtkObjectClass *parent_class; - -typedef struct _BookQuery BookQuery; -struct _BookQuery { - EAddressCompletion *completion; - guint seq_no; - - gchar *text; - - EBookView *book_view; - guint card_added_id; - guint sequence_complete_id; -}; - -static BookQuery *book_query_new (EAddressCompletion *, const gchar *query_text); -static void book_query_attach_book_view (BookQuery *, EBookView *); -static void book_query_free (BookQuery *); -static gboolean book_query_has_expired (BookQuery *); -static double book_query_score_e_card (BookQuery *, ECard *); -static void book_query_book_view_cb (EBook *, EBookStatus, EBookView *, gpointer book_query); -static void book_query_card_added_cb (EBookView *, const GList *cards, gpointer book_query); -static void book_query_sequence_complete_cb (EBookView *, gpointer book_query); - - - -GtkType -e_address_completion_get_type (void) -{ - static GtkType address_completion_type = 0; - - if (!address_completion_type) { - GtkTypeInfo address_completion_info = { - "EAddressCompletion", - sizeof (EAddressCompletion), - sizeof (EAddressCompletionClass), - (GtkClassInitFunc) e_address_completion_class_init, - (GtkObjectInitFunc) e_address_completion_init, - NULL, NULL, - (GtkClassInitFunc) NULL - }; - address_completion_type = gtk_type_unique (e_completion_get_type (), - &address_completion_info); - } - - return address_completion_type; -} - -static void -e_address_completion_class_init (EAddressCompletionClass *klass) -{ - GtkObjectClass *object_class = (GtkObjectClass *) klass; - - parent_class = GTK_OBJECT_CLASS (gtk_type_class (e_completion_get_type ())); - - object_class->destroy = e_address_completion_destroy; -} - -static void -e_address_completion_init (EAddressCompletion *addr_comp) -{ - -} - -static void -e_address_completion_destroy (GtkObject *object) -{ - EAddressCompletion *addr_comp = E_ADDRESS_COMPLETION (object); - - gtk_object_unref (GTK_OBJECT (addr_comp->book)); -} - -static BookQuery * -book_query_new (EAddressCompletion *comp, const gchar *text) -{ - BookQuery *q = g_new0 (BookQuery, 1); - - q->completion = comp; - gtk_object_ref (GTK_OBJECT (comp)); - - q->seq_no = comp->seq_no; - - q->text = g_strdup (text); - - return q; -} - -static void -book_query_attach_book_view (BookQuery *q, EBookView *book_view) -{ - g_return_if_fail (q); - - g_assert (q->book_view == NULL); - q->book_view = book_view; - gtk_object_ref (GTK_OBJECT (book_view)); - - q->card_added_id = gtk_signal_connect (GTK_OBJECT (book_view), - "card_added", - GTK_SIGNAL_FUNC (book_query_card_added_cb), - q); - q->sequence_complete_id = gtk_signal_connect (GTK_OBJECT (book_view), - "sequence_complete", - GTK_SIGNAL_FUNC (book_query_sequence_complete_cb), - q); -} - -static void -book_query_free (BookQuery *q) -{ - if (q) { - if (q->book_view) { - gtk_signal_disconnect (GTK_OBJECT (q->book_view), q->card_added_id); - gtk_signal_disconnect (GTK_OBJECT (q->book_view), q->sequence_complete_id); - gtk_object_unref (GTK_OBJECT (q->book_view)); - } - - gtk_object_unref (GTK_OBJECT (q->completion)); - - g_free (q->text); - - g_free (q); - } -} - -static gboolean -book_query_has_expired (BookQuery *q) -{ - g_return_val_if_fail (q != NULL, FALSE); - return q->seq_no != q->completion->seq_no; -} - -static double -book_query_score_e_card (BookQuery *q, ECard *card) -{ - gint len; - - g_return_val_if_fail (q != NULL, -1); - g_return_val_if_fail (card != NULL && E_IS_CARD (card), -1); - - len = strlen (q->text); - - if (card->name->given && !g_strncasecmp (card->name->given, q->text, len)) - return len; - - if (card->name->additional && !g_strncasecmp (card->name->additional, q->text, len)) - return len; - - if (card->name->family && !g_strncasecmp (card->name->family, q->text, len)) - return len; - - return 0.5; /* Not good, but we'll leave them in anyway for now... */ -} - -static gchar* -book_query_card_text (ECard *card) -{ - if (card->name) { - /* Sort of a lame hack. */ - return g_strdup_printf ("%s %s%s%s", - card->name->given ? card->name->given : "", - card->name->additional ? card->name->additional : "", - card->name->additional ? " " : "", - card->name->family ? card->name->family : ""); - } else if (card->fname) { - return g_strdup (card->fname); - } else if (card->file_as) { - return g_strdup (card->file_as); - } - - return NULL; -} - -static void -book_query_book_view_cb (EBook *book, EBookStatus status, EBookView *book_view, gpointer user_data) -{ - BookQuery *q = (BookQuery *) user_data; - - if (book_query_has_expired (q)) { - book_query_free (q); - return; - } - - book_query_attach_book_view (q, book_view); -} - -static void -book_query_card_added_cb (EBookView *book_view, const GList *cards, gpointer user_data) -{ - BookQuery *q = (BookQuery *) user_data; - - if (book_query_has_expired (q)) { - book_query_free (q); - return; - } - - while (cards) { - ECard *card = (ECard *) cards->data; - double score; - - if (card && (score = book_query_score_e_card (q, card)) >= 0) { - gchar *str = book_query_card_text (card); - - if (str) { - gtk_object_ref (GTK_OBJECT (card)); - e_completion_found_match_full (E_COMPLETION (q->completion), str, score, - card, (GtkDestroyNotify)gtk_object_unref); - } - } - - cards = g_list_next (cards); - } -} - -static void -book_query_sequence_complete_cb (EBookView *book_view, gpointer user_data) -{ - BookQuery *q = (BookQuery *) user_data; - - if (! book_query_has_expired (q)) { - e_completion_end_search (E_COMPLETION (q->completion)); - } - - book_query_free (q); -} - -static void -e_address_completion_begin (ECompletion *comp, const gchar *text, gint pos, gint limit, gpointer user_data) -{ - EAddressCompletion *addr_comp = E_ADDRESS_COMPLETION (comp); - BookQuery *q; - gchar *query; - - ++addr_comp->seq_no; /* Paranoia, in case completion_begin were to be called twice in a row - without an intervening completion_end. (Of course, this shouldn't - happen...) */ - q = book_query_new (addr_comp, text); - - query = g_strdup_printf ("(contains \"x-evolution-any-field\" \"%s\")", text); - e_book_get_book_view (addr_comp->book, query, book_query_book_view_cb, q); - g_free (query); -} - -static void -e_address_completion_end (ECompletion *comp, gboolean finished, gpointer user_data) -{ - EAddressCompletion *addr_comp = E_ADDRESS_COMPLETION (comp); - - ++addr_comp->seq_no; -} - -void -e_address_completion_construct (EAddressCompletion *addr_comp, EBook *book) -{ - g_return_if_fail (addr_comp != NULL); - g_return_if_fail (E_IS_ADDRESS_COMPLETION (addr_comp)); - g_return_if_fail (book != NULL); - g_return_if_fail (E_IS_BOOK (book)); - - /* No switching books mid-stream. */ - g_return_if_fail (addr_comp->book == NULL); - - e_completion_construct (E_COMPLETION (addr_comp), - e_address_completion_begin, - e_address_completion_end, - NULL); - - addr_comp->book = book; - gtk_object_ref (GTK_OBJECT (book)); -} - -ECompletion * -e_address_completion_new (EBook *book) -{ - gpointer ptr; - - g_return_val_if_fail (book != NULL, NULL); - g_return_val_if_fail (E_IS_BOOK (book), NULL); - - ptr = gtk_type_new (e_address_completion_get_type ()); - e_address_completion_construct (E_ADDRESS_COMPLETION (ptr), book); - return E_COMPLETION (ptr); -} diff --git a/addressbook/backend/ebook/e-address-completion.h b/addressbook/backend/ebook/e-address-completion.h deleted file mode 100644 index d0fca50cda..0000000000 --- a/addressbook/backend/ebook/e-address-completion.h +++ /dev/null @@ -1,65 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * An auto-completer for addresses from the address book. - * - * Author: - * Jon Trowbridge <trow@ximian.com> - * - * Copyright (C) 2001 Ximian, Inc. - */ - -/* - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#ifndef E_ADDRESS_COMPLETION_H -#define E_ADDRESS_COMPLETION_H - -#include "e-book.h" -#include <gal/e-text/e-completion.h> - -BEGIN_GNOME_DECLS - -#define E_ADDRESS_COMPLETION_TYPE (e_address_completion_get_type ()) -#define E_ADDRESS_COMPLETION(o) (GTK_CHECK_CAST ((o), E_ADDRESS_COMPLETION_TYPE, EAddressCompletion)) -#define E_ADDRESS_COMPLETION_CLASS(k) (GTK_CHECK_CLASS_CAST ((k), E_ADDRESS_COMPLETION_TYPE, EAddressCompletionClass)) -#define E_IS_ADDRESS_COMPLETION(o) (GTK_CHECK_TYPE ((o), E_ADDRESS_COMPLETION_TYPE)) -#define E_IS_ADDRESS_COMPLETION_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_ADDRESS_COMPLETION_TYPE)) - -typedef struct _EAddressCompletion EAddressCompletion; -typedef struct _EAddressCompletionClass EAddressCompletionClass; - -struct _EAddressCompletion { - ECompletion parent; - - EBook *book; - guint seq_no; -}; - -struct _EAddressCompletionClass { - ECompletionClass parent_class; -}; - -GtkType e_address_completion_get_type (void); - -void e_address_completion_construct (EAddressCompletion *addr_comp, EBook *book); -ECompletion *e_address_completion_new (EBook *book); - - - - -#endif /* E_ADDRESS_COMPLETION_H */ - diff --git a/addressbook/backend/ebook/e-destination.c b/addressbook/backend/ebook/e-destination.c new file mode 100644 index 0000000000..92aed64715 --- /dev/null +++ b/addressbook/backend/ebook/e-destination.c @@ -0,0 +1,284 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ + +/* + * e-destination.c + * + * Copyright (C) 2001 Ximian, Inc. + * + * Developed by Jon Trowbridge <trow@ximian.com> + */ + +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + * USA. + */ + +#include <config.h> +#include <gtk/gtk.h> +#include <libgnome/gnome-defs.h> +#include <libgnome/gnome-i18n.h> +#include "e-destination.h" + +struct _EDestinationPrivate { + ECard *card; + gint card_email_num; + + gchar *string; + gchar *string_email; + gchar *string_email_verbose; +}; + +static void e_destination_clear_card (EDestination *); +static void e_destination_clear_strings (EDestination *); + +static GtkObjectClass *parent_class; + +static void +e_destination_destroy (GtkObject *obj) +{ + EDestination *dest = E_DESTINATION (obj); + + e_destination_clear_card (dest); + e_destination_clear_strings (dest); + + g_free (dest->priv); + + if (parent_class->destroy) + parent_class->destroy (obj); +} + +static void +e_destination_class_init (EDestinationClass *klass) +{ + GtkObjectClass *object_class = GTK_OBJECT_CLASS (klass); + + parent_class = GTK_OBJECT_CLASS (gtk_type_class (GTK_TYPE_OBJECT)); + + object_class->destroy = e_destination_destroy; +} + +static void +e_destination_init (EDestination *dest) +{ + dest->priv = g_new0 (struct _EDestinationPrivate, 1); +} + +GtkType +e_destination_get_type (void) +{ + static GtkType dest_type = 0; + + if (!dest_type) { + GtkTypeInfo dest_info = { + "EDestination", + sizeof (EDestination), + sizeof (EDestinationClass), + (GtkClassInitFunc) e_destination_class_init, + (GtkObjectInitFunc) e_destination_init, + NULL, NULL, /* reserved */ + (GtkClassInitFunc) NULL + }; + + dest_type = gtk_type_unique (gtk_object_get_type (), &dest_info); + } + + return dest_type; +} + +EDestination * +e_destination_new (void) +{ + return E_DESTINATION (gtk_type_new (E_TYPE_DESTINATION)); +} + +EDestination * +e_destination_copy (EDestination *dest) +{ + EDestination *new_dest; + + g_return_val_if_fail (dest && E_IS_DESTINATION (dest), NULL); + + new_dest = e_destination_new (); + + new_dest->priv->card = dest->priv->card; + if (new_dest->priv->card) + gtk_object_ref (GTK_OBJECT (new_dest->priv->card)); + + new_dest->priv->card_email_num = dest->priv->card_email_num; + + new_dest->priv->string = g_strdup (dest->priv->string); + new_dest->priv->string_email = g_strdup (dest->priv->string_email); + new_dest->priv->string_email_verbose = g_strdup (dest->priv->string_email_verbose); + + return new_dest; +} + +static void +e_destination_clear_card (EDestination *dest) +{ + if (dest->priv->card) + gtk_object_unref (GTK_OBJECT (dest->priv->card)); + dest->priv->card = NULL; + + dest->priv->card_email_num = -1; +} + +static void +e_destination_clear_strings (EDestination *dest) +{ + g_free (dest->priv->string); + g_free (dest->priv->string_email); + g_free (dest->priv->string_email_verbose); + + dest->priv->string = NULL; + dest->priv->string_email = NULL; + dest->priv->string_email_verbose = NULL; +} + +void +e_destination_set_card (EDestination *dest, ECard *card, gint email_num) +{ + g_return_if_fail (dest && E_IS_DESTINATION (dest)); + g_return_if_fail (card && E_IS_CARD (card)); + + if (dest->priv->card != card) { + if (dest->priv->card) + gtk_object_unref (GTK_OBJECT (dest->priv->card)); + dest->priv->card = card; + gtk_object_ref (GTK_OBJECT (card)); + } + + dest->priv->card_email_num = email_num; + + e_destination_clear_strings (dest); +} + +void +e_destination_set_string (EDestination *dest, const gchar *string) +{ + g_return_if_fail (dest && E_IS_DESTINATION (dest)); + g_return_if_fail (string != NULL); + + g_free (dest->priv->string); + dest->priv->string = g_strdup (string); +} + +ECard * +e_destination_get_card (const EDestination *dest) +{ + g_return_val_if_fail (dest && E_IS_DESTINATION (dest), NULL); + + return dest->priv->card; +} + +const gchar * +e_destination_get_string (const EDestination *dest) +{ + struct _EDestinationPrivate *priv; + + g_return_val_if_fail (dest && E_IS_DESTINATION (dest), NULL); + + priv = (struct _EDestinationPrivate *)dest->priv; /* cast out const */ + + if (priv->string == NULL) { + + if (priv->card) { + + priv->string = e_card_name_to_string (priv->card->name); + + } + } + + return priv->string; +} + +gint +e_destination_get_strlen (const EDestination *dest) +{ + const gchar *str; + + g_return_val_if_fail (dest && E_IS_DESTINATION (dest), 0); + + str = e_destination_get_string (dest); + return str ? strlen (str) : 0; +} + +const gchar * +e_destination_get_email (const EDestination *dest) +{ + struct _EDestinationPrivate *priv; + + g_return_val_if_fail (dest && E_IS_DESTINATION (dest), NULL); + + priv = (struct _EDestinationPrivate *)dest->priv; /* cast out const */ + + if (priv->string_email == NULL) { + + if (priv->card) { /* Pull the address out of the card. */ + + EIterator *iter = e_list_get_iterator (priv->card->email); + gint n = priv->card_email_num; + + if (n >= 0) { + while (n > 0) { + e_iterator_next (iter); + --n; + } + + if (e_iterator_is_valid (iter)) { + gconstpointer ptr = e_iterator_get (iter); + priv->string_email = g_strdup ((gchar *) ptr); + } + } + + } else if (priv->string) { /* Use the string as an e-mail address */ + return priv->string; + } + + /* else we just return NULL */ + } + + return priv->string_email; +} + +const gchar * +e_destination_get_email_verbose (const EDestination *dest) +{ + struct _EDestinationPrivate *priv; + + g_return_val_if_fail (dest && E_IS_DESTINATION (dest), NULL); + + priv = (struct _EDestinationPrivate *)dest->priv; /* cast out const */ + + if (priv->string_email_verbose == NULL) { + + const gchar *email = e_destination_get_email (dest); + + if (priv->card) { + + priv->string_email_verbose = g_strdup_printf ("%s <%s>", + e_card_name_to_string (priv->card->name), + email); + } else { + + return email; + } + + } + + return priv->string_email_verbose; +} + + diff --git a/addressbook/backend/ebook/e-destination.h b/addressbook/backend/ebook/e-destination.h new file mode 100644 index 0000000000..509a351f1d --- /dev/null +++ b/addressbook/backend/ebook/e-destination.h @@ -0,0 +1,73 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ + +/* + * e-destination.h + * + * Copyright (C) 2001 Ximian, Inc. + * + * Developed by Jon Trowbridge <trow@ximian.com> + */ + +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + * USA. + */ + +#ifndef __E_DESTINATION_H__ +#define __E_DESTINATION_H__ + +#include <gtk/gtk.h> +#include <addressbook/backend/ebook/e-card.h> + +#define E_TYPE_DESTINATION (e_destination_get_type ()) +#define E_DESTINATION(o) (GTK_CHECK_CAST ((o), E_TYPE_DESTINATION, EDestination)) +#define E_DESTINATION_CLASS(k) (GTK_CHECK_CLASS_CAST ((k), E_TYPE_DESTINATION, EDestinationClass)) +#define E_IS_DESTINATION(o) (GTK_CHECK_TYPE ((o), E_TYPE_DESTINATION)) +#define E_IS_DESTINATION_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_TYPE_DESTINATION)) + +typedef struct _EDestination EDestination; +typedef struct _EDestinationClass EDestinationClass; + +struct _EDestinationPrivate; + +struct _EDestination { + GtkObject object; + + struct _EDestinationPrivate *priv; +}; + +struct _EDestinationClass { + GtkObjectClass parent_class; +}; + +GtkType e_destination_get_type (void); + +EDestination *e_destination_new (void); +EDestination *e_destination_copy (EDestination *); + +void e_destination_set_card (EDestination *, ECard *card, gint email_num); +void e_destination_set_string (EDestination *, const gchar *string); + +ECard *e_destination_get_card (const EDestination *); +const gchar *e_destination_get_string (const EDestination *); +gint e_destination_get_strlen (const EDestination *); /* a convenience function... */ + +const gchar *e_destination_get_email (const EDestination *); +const gchar *e_destination_get_email_verbose (const EDestination *); + + + +#endif /* __E_DESTINATION_H__ */ + |