aboutsummaryrefslogtreecommitdiffstats
path: root/addressbook/contact-editor/e-contact-quick-add.c
diff options
context:
space:
mode:
authorJon Trowbridge <trow@ximian.com>2001-03-09 07:15:20 +0800
committerJon Trowbridge <trow@src.gnome.org>2001-03-09 07:15:20 +0800
commitafe6fc18fc95f00efdbd3ea7f5ebd6c7fd64330d (patch)
treecce5d4763c2eda00558c1d6a0b38861417befc91 /addressbook/contact-editor/e-contact-quick-add.c
parenta9c279d8a69c93d00d0c8eb5c876f42e8a99682f (diff)
downloadgsoc2013-evolution-afe6fc18fc95f00efdbd3ea7f5ebd6c7fd64330d.tar
gsoc2013-evolution-afe6fc18fc95f00efdbd3ea7f5ebd6c7fd64330d.tar.gz
gsoc2013-evolution-afe6fc18fc95f00efdbd3ea7f5ebd6c7fd64330d.tar.bz2
gsoc2013-evolution-afe6fc18fc95f00efdbd3ea7f5ebd6c7fd64330d.tar.lz
gsoc2013-evolution-afe6fc18fc95f00efdbd3ea7f5ebd6c7fd64330d.tar.xz
gsoc2013-evolution-afe6fc18fc95f00efdbd3ea7f5ebd6c7fd64330d.tar.zst
gsoc2013-evolution-afe6fc18fc95f00efdbd3ea7f5ebd6c7fd64330d.zip
Switched to use e_contact_quick_add_free_form. Removed debugging code,
2001-03-08 Jon Trowbridge <trow@ximian.com> * gui/component/select-names/e-select-names-popup.c (quick_add_cb): Switched to use e_contact_quick_add_free_form. Removed debugging code, hopefully without introducing any bugs in the process. * gui/component/select-names/e-select-names-text-model.c (e_select_names_text_model_insert_length): Fix bug with commas inside of name/address combos. As long as the comma is inside of quotes, it will be treated as part of the name rather than as a break between addresses. * gui/component/select-names/e-select-names-completion.c (match_nickname): Use e_card_name_to_string for nickname match strings. (match_email): Use e_card_name_to_string for email match strings. (e_select_names_completion_begin): Strip quotes out of query text, so we don't produce malformed sexps. Added William Blake quote easter egg. * contact-editor/e-contact-quick-add.c: Further attempts to fix... mostly unsuccessful. (e_contact_quick_add_free_form): Added. Takes a single string and tries to parse out (using some simple, loose rules) the name and e-mail -- then calls e_contact_quick_add. An attempt to get the computer to automatically Do The Right Thing. * backend/ebook/e-book.c: Fixed some broken indentation. Yes, I'm anal. * gui/component/GNOME_Evolution_Addressbook.oafinfo: Added oaf_server info for EAddressWidget. * gui/component/GNOME_Evolution_Addressbook.oaf.in: Added oaf_server info for EAddressWidget. * gui/component/addressbook-factory.c (main): Add call to e_address_widget_factory_init. * gui/component/e-address-widget.h: * gui/component/e-address-widget.c: Added. A little widget (and a Bonobo control, BTW) for displaying addresses, with a left-click menu. Used to display addresses in the mail viewer (as embedded GtkHTML objects, replacing the text previously used). Still quite incomplete. 2001-03-08 Jon Trowbridge <trow@ximian.com> * mail-format.c (write_field_row_begin): Added. Table row HTML broken out into its own function. (write_subject): Added. Emits the proper HTML for the subject line. (write_field_to_stream): #ifdef-ed out of existence. (write_address): Take a CamelInternetAddress and spit out an <object> tag with the appropriate <param>s. * mail-display.c (on_object_requested): Check for an "address" object. If found, call... (handle_embedded_address_object): ...this function, which creates an AddressWidget bonobo control and passes in the necessary info. I never really realized just quite how much GtkHTML kicks ass until I figured out how to make this work. svn path=/trunk/; revision=8607
Diffstat (limited to 'addressbook/contact-editor/e-contact-quick-add.c')
-rw-r--r--addressbook/contact-editor/e-contact-quick-add.c218
1 files changed, 160 insertions, 58 deletions
diff --git a/addressbook/contact-editor/e-contact-quick-add.c b/addressbook/contact-editor/e-contact-quick-add.c
index 8445542975..2592f797a5 100644
--- a/addressbook/contact-editor/e-contact-quick-add.c
+++ b/addressbook/contact-editor/e-contact-quick-add.c
@@ -26,79 +26,78 @@
*/
#include <config.h>
+#include <ctype.h>
#include <gnome.h>
#include <addressbook/backend/ebook/e-book.h>
#include <addressbook/backend/ebook/e-card.h>
#include "e-contact-editor.h"
#include "e-contact-quick-add.h"
-static FILE *out = NULL;
-
static void
e_card_quick_set_name (ECard *card, const gchar *str)
{
+ ECardSimple *simple;
+
g_return_if_fail (card && E_IS_CARD (card));
if (str == NULL)
return;
- if (out)
- fprintf (out, "quick-set name to \"%s\"\n", str);
-
- if (card->name)
- e_card_name_free (card->name);
- card->name = e_card_name_from_string (str);
+ simple = e_card_simple_new (card);
+ e_card_simple_set (simple, E_CARD_SIMPLE_FIELD_FULL_NAME, str);
+ e_card_simple_sync_card (simple);
+ gtk_object_unref (GTK_OBJECT (simple));
}
static void
e_card_quick_set_email (ECard *card, const gchar *str)
{
+ ECardSimple *simple;
+
g_return_if_fail (card && E_IS_CARD (card));
if (str == NULL)
return;
- if (out)
- fprintf (out, "quick-set email to \"%s\"\n", str);
-
- if (card->email == NULL) {
- card->email = e_list_new ((EListCopyFunc) g_strdup,
- (EListFreeFunc) g_free,
- NULL);
- e_list_append (card->email, str);
- } else {
- EIterator *iter = e_list_get_iterator (card->email);
- e_iterator_reset (iter);
- if (e_iterator_is_valid (iter)) {
- e_iterator_set (iter, str);
- }
- }
+ simple = e_card_simple_new (card);
+ e_card_simple_set (simple, E_CARD_SIMPLE_FIELD_EMAIL, str);
+ e_card_simple_sync_card (simple);
+ gtk_object_unref (GTK_OBJECT (simple));
}
static void
book_ready_cb (EBook *book, EBookStatus status, gpointer user_data)
{
- if (status == E_BOOK_STATUS_SUCCESS)
- e_book_add_card (book, E_CARD (user_data), NULL, NULL);
- gtk_object_unref (GTK_OBJECT (book));
+ ECard *card = E_CARD (user_data);
+
+ EContactQuickAddCallback cb = gtk_object_get_data (GTK_OBJECT (card), "e-contact-quick-add-cb");
+ gpointer cb_user_data = gtk_object_get_data (GTK_OBJECT (card), "e-contact-quick-add-user-data");
+
+ if (status == E_BOOK_STATUS_SUCCESS) {
+ e_book_add_card (book, card, NULL, NULL);
+ if (cb)
+ cb (card, cb_user_data);
+ } else {
+ /* Something went wrong... */
+ if (cb)
+ cb (NULL, cb_user_data);
+
+ gtk_object_unref (GTK_OBJECT (book));
+ }
}
static void
add_card (ECard *card)
{
EBook *book = e_book_new ();
- gchar *filename, *uri;
-
- filename = gnome_util_prepend_user_home ("evolution/local/Contacts/addressbook.db");
- uri = g_strdup_printf ("file://%s", filename);
-
- e_book_load_uri (book, uri, book_ready_cb, card);
-
- g_free (filename);
- g_free (uri);
+ e_book_load_local_address_book (book, book_ready_cb, card);
}
+/*
+ * Raise a contact editor with all fields editable, and hook up all signals accordingly.
+ */
+
static void
add_card_cb (EContactEditor *ce, ECard *card, gpointer user_data)
{
@@ -108,12 +107,55 @@ add_card_cb (EContactEditor *ce, ECard *card, gpointer user_data)
static void
editor_closed_cb (GtkWidget *w, gpointer user_data)
{
+ /* w is the contact editor, user_data is an ECard. */
if (user_data)
gtk_object_unref (user_data);
gtk_object_unref (GTK_OBJECT (w));
}
static void
+ce_book_found_fields (EBook *book, EBookStatus status, EList *fields, gpointer user_data)
+{
+ ECard *card = E_CARD (user_data);
+ EContactEditor *contact_editor;
+
+ if (status != E_BOOK_STATUS_SUCCESS) {
+ g_warning ("Couldn't find supported fields for local address book.");
+ return;
+ }
+
+ contact_editor = e_contact_editor_new (card, TRUE, fields);
+
+ gtk_signal_connect (GTK_OBJECT (contact_editor),
+ "add_card",
+ GTK_SIGNAL_FUNC (add_card_cb),
+ NULL);
+ gtk_signal_connect (GTK_OBJECT (contact_editor),
+ "editor_closed",
+ GTK_SIGNAL_FUNC (editor_closed_cb),
+ user_data);
+
+ e_contact_editor_raise (contact_editor);
+}
+
+static void
+ce_book_ready (EBook *book, EBookStatus status, gpointer user_data)
+{
+ if (status != E_BOOK_STATUS_SUCCESS) {
+ g_warning ("Couldn't open local address book.");
+ return;
+ }
+
+ e_book_get_supported_fields (book, ce_book_found_fields, user_data);
+}
+
+static void
+edit_card (ECard *card)
+{
+ e_book_load_local_address_book (e_book_new (), ce_book_ready, card);
+}
+
+static void
clicked_cb (GtkWidget *w, gint button, gpointer user_data)
{
ECard *card = E_CARD (user_data);
@@ -149,19 +191,7 @@ clicked_cb (GtkWidget *w, gint button, gpointer user_data)
} else if (button == 1) {
/* EDIT FULL */
- EContactEditor *contact_editor;
- contact_editor = e_contact_editor_new (card, TRUE, NULL);
-
- gtk_signal_connect (GTK_OBJECT (contact_editor),
- "add_card",
- GTK_SIGNAL_FUNC (add_card_cb),
- NULL);
- gtk_signal_connect (GTK_OBJECT (contact_editor),
- "editor_closed",
- GTK_SIGNAL_FUNC (editor_closed_cb),
- user_data);
-
- e_contact_editor_raise (contact_editor);
+ edit_card (card);
} else {
/* CANCEL */
@@ -249,16 +279,6 @@ e_contact_quick_add (const gchar *name, const gchar *email,
ECard *new_card;
GtkWidget *dialog;
- if (out == NULL) {
- out = fopen ("/tmp/barnass", "w");
- if (out)
- setvbuf (out, NULL, _IONBF, 0);
- }
-
- if (out)
- fprintf (out, "\n name: %s\nemail: %s\n", name, email);
-
-
/* We need to have *something* to work with. */
if (name == NULL && email == NULL) {
if (cb)
@@ -280,3 +300,85 @@ e_contact_quick_add (const gchar *name, const gchar *email,
gtk_widget_show_all (dialog);
}
+
+void
+e_contact_quick_add_free_form (const gchar *text, EContactQuickAddCallback cb, gpointer user_data)
+{
+ gchar *name=NULL, *email=NULL;
+ const gchar *last_at, *s;
+ gboolean in_quote;
+
+ if (text == NULL) {
+ e_contact_quick_add (NULL, NULL, cb, user_data);
+ return;
+ }
+
+ /* Look for things that look like e-mail addresses embedded in text */
+ in_quote = FALSE;
+ last_at = NULL;
+ for (s = text; *s; ++s) {
+ if (*s == '@' && !in_quote)
+ last_at = s;
+ else if (*s == '"')
+ in_quote = !in_quote;
+ }
+
+
+ if (last_at == NULL) {
+ /* No at sign, so we treat it all as the name */
+ name = g_strdup (text);
+ } else {
+ gboolean bad_char = FALSE;
+
+ /* walk backwards to whitespace or a < or a quote... */
+ while (last_at >= text && !bad_char
+ && !(isspace ((gint) *last_at) || *last_at == '<' || *last_at == '"')) {
+ /* Check for some stuff that can't appear in a legal e-mail address. */
+ if (*last_at == '['
+ || *last_at == ']'
+ || *last_at == '('
+ || *last_at == ')')
+ bad_char = TRUE;
+ --last_at;
+ }
+ if (last_at < text)
+ last_at = text;
+
+ /* ...and then split the text there */
+ if (!bad_char) {
+ if (text < last_at)
+ name = g_strndup (text, last_at-text);
+ email = g_strdup (last_at);
+ }
+ }
+
+ /* If all else has failed, make it the name. */
+ if (name == NULL && email == NULL)
+ name = g_strdup (text);
+
+
+ /* Clean up name */
+ if (name && *name)
+ g_strstrip (name);
+
+ /* Clean up email, remove bracketing <>s */
+ if (email && *email) {
+ gboolean changed = FALSE;
+ g_strstrip (email);
+ if (*email == '<') {
+ *email = ' ';
+ changed = TRUE;
+ }
+ if (email[strlen (email)-1] == '>') {
+ email[strlen (email)-1] = ' ';
+ changed = TRUE;
+ }
+ if (changed)
+ g_strstrip (email);
+ }
+
+
+ e_contact_quick_add (name, email, cb, user_data);
+ g_free (name);
+ g_free (email);
+}