diff options
author | Christopher James Lahey <clahey@helixcode.com> | 2000-05-01 01:03:06 +0800 |
---|---|---|
committer | Chris Lahey <clahey@src.gnome.org> | 2000-05-01 01:03:06 +0800 |
commit | d87a10196cd82a391f9c2f937ee91dd9f06e5abe (patch) | |
tree | 0f39e8ecfe6495db3d32716ce5b20ffd50d9bca2 /addressbook | |
parent | edf876f544a5f2010f117b0b609b557f9d2b1e04 (diff) | |
download | gsoc2013-evolution-d87a10196cd82a391f9c2f937ee91dd9f06e5abe.tar gsoc2013-evolution-d87a10196cd82a391f9c2f937ee91dd9f06e5abe.tar.gz gsoc2013-evolution-d87a10196cd82a391f9c2f937ee91dd9f06e5abe.tar.bz2 gsoc2013-evolution-d87a10196cd82a391f9c2f937ee91dd9f06e5abe.tar.lz gsoc2013-evolution-d87a10196cd82a391f9c2f937ee91dd9f06e5abe.tar.xz gsoc2013-evolution-d87a10196cd82a391f9c2f937ee91dd9f06e5abe.tar.zst gsoc2013-evolution-d87a10196cd82a391f9c2f937ee91dd9f06e5abe.zip |
From addressbook/ChangeLog
2000-04-30 Christopher James Lahey <clahey@helixcode.com>
* backend/ebook/e-card.c: Make file as not have the : after it if
it's empty. If there's no name, or file_as, fill in these fields
with defaults based on full_name or name respectively.
* backend/ebook/load-pine-addressbook.c: New file to do import of
pine .addressbook files.
* backend/pas/pas-backend-file.c: Made empty fields act as the
empty string for searches.
* contact-editor/e-contact-editor.c,
contact-editor/e-contact-editor.h: Made the File As field update
properly as you edit the name and company fields. Added the pull
down list of File As choices. Made sure that all fields will
be set to NULL if they are deleted to the empty string.
* gui/minicard/e-minicard.c: Use the File As field instead of the
Full Name field for the header. Make identical compares on the
File As field do a compare on the uid.
From wombat/ChangeLog
2000-04-30 Christopher James Lahey <clahey@helixcode.com>
* Makefile.am: Added ename libs to LDADD.
svn path=/trunk/; revision=2696
Diffstat (limited to 'addressbook')
-rw-r--r-- | addressbook/ChangeLog | 22 | ||||
-rw-r--r-- | addressbook/backend/ebook/e-card.c | 27 | ||||
-rw-r--r-- | addressbook/backend/ebook/load-pine-addressbook.c | 147 | ||||
-rw-r--r-- | addressbook/backend/pas/pas-backend-file.c | 3 | ||||
-rw-r--r-- | addressbook/contact-editor/e-contact-editor.c | 240 | ||||
-rw-r--r-- | addressbook/contact-editor/e-contact-editor.h | 1 | ||||
-rw-r--r-- | addressbook/gui/contact-editor/e-contact-editor.c | 240 | ||||
-rw-r--r-- | addressbook/gui/contact-editor/e-contact-editor.h | 1 | ||||
-rw-r--r-- | addressbook/gui/minicard/e-minicard.c | 36 | ||||
-rw-r--r-- | addressbook/gui/widgets/e-minicard.c | 36 |
10 files changed, 693 insertions, 60 deletions
diff --git a/addressbook/ChangeLog b/addressbook/ChangeLog index a0e59a5574..57c10947a5 100644 --- a/addressbook/ChangeLog +++ b/addressbook/ChangeLog @@ -1,5 +1,27 @@ 2000-04-30 Christopher James Lahey <clahey@helixcode.com> + * backend/ebook/e-card.c: Make file as not have the : after it if + it's empty. If there's no name, or file_as, fill in these fields + with defaults based on full_name or name respectively. + + * backend/ebook/load-pine-addressbook.c: New file to do import of + pine .addressbook files. + + * backend/pas/pas-backend-file.c: Made empty fields act as the + empty string for searches. + + * contact-editor/e-contact-editor.c, + contact-editor/e-contact-editor.h: Made the File As field update + properly as you edit the name and company fields. Added the pull + down list of File As choices. Made sure that all fields will + be set to NULL if they are deleted to the empty string. + + * gui/minicard/e-minicard.c: Use the File As field instead of the + Full Name field for the header. Make identical compares on the + File As field do a compare on the uid. + +2000-04-30 Christopher James Lahey <clahey@helixcode.com> + * contact-editor/e-contact-editor-fullname.c, contact-editor/fullname.glade: Fixed a string mismatch. diff --git a/addressbook/backend/ebook/e-card.c b/addressbook/backend/ebook/e-card.c index 2f0f05b97f..2eeec38b73 100644 --- a/addressbook/backend/ebook/e-card.c +++ b/addressbook/backend/ebook/e-card.c @@ -227,13 +227,15 @@ char vobj = newVObject (VCCardProp); - if ( card->file_as ) + if ( card->file_as && *card->file_as ) addPropValue(vobj, "X-EVOLUTION-FILE-AS", card->file_as); + else if (card->file_as) + addProp(vobj, "X-EVOLUTION-FILE_AS"); if ( card->fname ) addPropValue(vobj, VCFullNameProp, card->fname); - if ( card->name ) { + if ( card->name && (card->name->prefix || card->name->given || card->name->additional || card->name->family || card->name->suffix) ) { VObject *nameprop; nameprop = addProp(vobj, VCNameProp); if ( card->name->prefix ) @@ -705,6 +707,27 @@ parse(ECard *card, VObject *vobj) while(moreIteration (&iterator)) { parse_attribute(card, nextVObject(&iterator)); } + if (!card->name) { + if (card->fname) { + card->name = e_card_name_from_string(card->fname); + } + } + if (!card->file_as) { + if (card->name) { + ECardName *name = card->name; + char *strings[3], **stringptr; + char *string; + stringptr = strings; + if (name->family && *name->family) + *(stringptr++) = name->family; + if (name->given && *name->given) + *(stringptr++) = name->given; + *stringptr = NULL; + string = g_strjoinv(", ", strings); + card->file_as = string; + } else + card->file_as = g_strdup(""); + } } static void diff --git a/addressbook/backend/ebook/load-pine-addressbook.c b/addressbook/backend/ebook/load-pine-addressbook.c new file mode 100644 index 0000000000..8837a11a9a --- /dev/null +++ b/addressbook/backend/ebook/load-pine-addressbook.c @@ -0,0 +1,147 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +#include <config.h> +#include <bonobo.h> +#include <gnome.h> +#include <stdio.h> + +#include <e-book.h> + +static CORBA_Environment ev; + +#ifdef USING_OAF + +#include <liboaf/liboaf.h> + +static void +init_corba (int *argc, char **argv) +{ + gnome_init_with_popt_table("blah", "0.0", *argc, argv, NULL, 0, NULL); + + oaf_init (*argc, argv); +} + +#else + +#include <libgnorba/gnorba.h> + +static void +init_corba (int *argc, char **argv) +{ + gnome_CORBA_init_with_popt_table ( + "blah", "0.0", + argc, argv, NULL, 0, NULL, GNORBA_INIT_SERVER_FUNC, &ev); +} + +#endif + +static void +init_bonobo (int argc, char **argv) +{ + if (bonobo_init (CORBA_OBJECT_NIL, CORBA_OBJECT_NIL, CORBA_OBJECT_NIL) == FALSE) + g_error (_("Could not initialize Bonobo")); +} + +static void +add_card_cb (EBook *book, EBookStatus status, const gchar *id, gpointer closure) +{ + ECard *card = E_CARD(closure); + char *vcard = e_card_get_vcard(card); + g_print ("Saved card: %s\n", vcard); + g_free(vcard); + gtk_object_unref(GTK_OBJECT(card)); +} + +static void +book_open_cb (EBook *book, EBookStatus status, gpointer closure) +{ + FILE *fp = fopen (".addressbook", "r"); + char line[1024]; + while(fgets(line, 1024, fp)) { + int length = strlen(line); + char **strings; + ECardName *name; + ECard *card; + ECardList *list; + if (line[length - 1] == '\n') + line[--length] = 0; + + card = e_card_new(""); + strings = g_strsplit(line, "\t", 3); + name = e_card_name_from_string(strings[1]); + gtk_object_set(GTK_OBJECT(card), + "nickname", strings[0], + "full_name", strings[1], + "name", name, + NULL); + gtk_object_get(GTK_OBJECT(card), + "email", &list, + NULL); + e_card_list_append(list, strings[2]); + g_strfreev(strings); + e_book_add_card(book, card, add_card_cb, card); + } +} + +static guint +ebook_create (void) +{ + EBook *book; + + book = e_book_new (); + + if (!book) { + printf ("%s: %s(): Couldn't create EBook, bailing.\n", + __FILE__, + __FUNCTION__); + return FALSE; + } + + + if (! e_book_load_uri (book, "file:/tmp/test.db", book_open_cb, NULL)) { + printf ("error calling load_uri!\n"); + } + + + return FALSE; +} + +#if 0 +static char * +read_file (char *name) +{ + int len; + char buff[65536]; + char line[1024]; + FILE *f; + + f = fopen (name, "r"); + if (f == NULL) + g_error ("Unable to open %s!\n", name); + + len = 0; + while (fgets (line, sizeof (line), f) != NULL) { + strcpy (buff + len, line); + len += strlen (line); + } + + fclose (f); + + return g_strdup (buff); +} +#endif + +int +main (int argc, char **argv) +{ + + CORBA_exception_init (&ev); + + init_corba (&argc, argv); + init_bonobo (argc, argv); + + gtk_idle_add ((GtkFunction) ebook_create, NULL); + + bonobo_main (); + + return 0; +} diff --git a/addressbook/backend/pas/pas-backend-file.c b/addressbook/backend/pas/pas-backend-file.c index cbe75a5aba..20de42808c 100644 --- a/addressbook/backend/pas/pas-backend-file.c +++ b/addressbook/backend/pas/pas-backend-file.c @@ -287,6 +287,9 @@ entry_compare(PASBackendFileSearchContext *ctx, struct _ESExp *f, if (prop && compare(prop, argv[1]->value.string)) { truth = TRUE; } + if ((!prop) && compare("", argv[1]->value.string)) { + truth = TRUE; + } } else if (info->prop_type == PROP_TYPE_LIST) { /* the special searches that match any of the list elements */ diff --git a/addressbook/contact-editor/e-contact-editor.c b/addressbook/contact-editor/e-contact-editor.c index 3d25e8a1a9..b4c20987f9 100644 --- a/addressbook/contact-editor/e-contact-editor.c +++ b/addressbook/contact-editor/e-contact-editor.c @@ -253,14 +253,149 @@ address_text_changed (GtkWidget *widget, EContactEditor *editor) editor->address[editor->address_choice]->data = string; } +/* This function tells you whether name_to_style will make sense. */ +static gboolean +style_makes_sense(const ECardName *name, char *company, int style) +{ + switch (style) { + case 0: /* Fall Through */ + case 1: + return TRUE; + case 2: + if (company && *company) + return TRUE; + else + return FALSE; + case 3: /* Fall Through */ + case 4: + if (company && *company && ((name->given && *name->given) || (name->family && *name->family))) + return TRUE; + else + return FALSE; + default: + return FALSE; + } +} + +static char * +name_to_style(const ECardName *name, char *company, int style) +{ + char *string; + char *strings[4], **stringptr; + char *substring; + switch (style) { + case 0: + stringptr = strings; + if (name->family && *name->family) + *(stringptr++) = name->family; + if (name->given && *name->given) + *(stringptr++) = name->given; + *stringptr = NULL; + string = g_strjoinv(", ", strings); + break; + case 1: + stringptr = strings; + if (name->given && *name->given) + *(stringptr++) = name->given; + if (name->family && *name->family) + *(stringptr++) = name->family; + *stringptr = NULL; + string = g_strjoinv(" ", strings); + break; + case 2: + string = g_strdup(company); + break; + case 3: /* Fall Through */ + case 4: + stringptr = strings; + if (name->family && *name->family) + *(stringptr++) = name->family; + if (name->given && *name->given) + *(stringptr++) = name->given; + *stringptr = NULL; + substring = g_strjoinv(", ", strings); + if (!(company && *company)) + company = ""; + if (style == 3) + string = g_strdup_printf("%s (%s)", substring, company); + else + string = g_strdup_printf("%s (%s)", company, substring); + g_free(substring); + break; + default: + string = g_strdup(""); + } + return string; +} + +static int +file_as_get_style (EContactEditor *editor) +{ + GtkEntry *file_as = GTK_ENTRY(glade_xml_get_widget(editor->gui, "entry-file-as")); + char *filestring = gtk_entry_get_text(file_as); + char *trystring; + ECardName *name = editor->name; + int i; + int style; + + if (!name) return 0; + + style = -1; + for (i = 0; i < 5; i++) { + trystring = name_to_style(name, editor->company, i); + if (!strcmp(trystring, filestring)) { + g_free(trystring); + return i; + } + g_free(trystring); + } + return -1; +} + static void -name_entry_changed (GtkWidget *widget, EContactEditor *editor) +file_as_set_style(EContactEditor *editor, int style) { char *string; + int i; + GList *strings = NULL; + GtkCombo *combo = GTK_COMBO(glade_xml_get_widget(editor->gui, "combo-file-as")); + GtkEntry *file_as = GTK_ENTRY(glade_xml_get_widget(editor->gui, "entry-file-as")); + + if (style == -1) { + string = g_strdup(gtk_entry_get_text(file_as)); + strings = g_list_append(strings, string); + } + + for (i = 0; i < 5; i++) { + if (style_makes_sense(editor->name, editor->company, i)) { + string = name_to_style(editor->name, editor->company, i); + strings = g_list_append(strings, string); + } + } + + gtk_combo_set_popdown_strings(combo, strings); + g_list_foreach(strings, (GFunc) g_free, NULL); + g_list_free(strings); + + if (style != -1) { + string = name_to_style(editor->name, editor->company, style); + gtk_entry_set_text(file_as, string); + g_free(string); + } +} + +static void +name_entry_changed (GtkWidget *widget, EContactEditor *editor) +{ ECardName *name; + char *string; GtkEntry *entry = GTK_ENTRY(widget); + int style = 0; + + style = file_as_get_style(editor); name = editor->name; + if (name) e_card_name_free(name); @@ -269,6 +404,23 @@ name_entry_changed (GtkWidget *widget, EContactEditor *editor) name = e_card_name_from_string(string); editor->name = name; + + file_as_set_style(editor, style); +} + +static void +company_entry_changed (GtkWidget *widget, EContactEditor *editor) +{ + GtkEntry *entry = GTK_ENTRY(widget); + int style = 0; + + style = file_as_get_style(editor); + + g_free(editor->company); + + editor->company = g_strdup(gtk_entry_get_text(entry)); + + file_as_set_style(editor, style); } static void @@ -296,6 +448,9 @@ set_entry_changed_signals(EContactEditor *editor) widget = glade_xml_get_widget(editor->gui, "entry-fullname"); gtk_signal_connect(GTK_OBJECT(widget), "changed", name_entry_changed, editor); + widget = glade_xml_get_widget(editor->gui, "entry-company"); + gtk_signal_connect(GTK_OBJECT(widget), "changed", + company_entry_changed, editor); } static void @@ -358,6 +513,7 @@ e_contact_editor_init (EContactEditor *e_contact_editor) e_contact_editor->phone_list = NULL; e_contact_editor->address_list = NULL; e_contact_editor->name = NULL; + e_contact_editor->company = g_strdup(""); for (i = 0; i < E_CONTACT_EDITOR_PHONE_ID_LAST; i++) { e_contact_editor->phone[i] = NULL; @@ -414,6 +570,8 @@ e_contact_editor_destroy (GtkObject *object) { gtk_widget_unref(e_contact_editor->address_popup); } + g_free (e_contact_editor->company); + gtk_object_unref(GTK_OBJECT(e_contact_editor->gui)); } @@ -884,14 +1042,6 @@ fill_in_info(EContactEditor *editor) if (fname) gtk_editable_insert_text(editable, fname, strlen(fname), &position); - - - position = 0; - editable = GTK_EDITABLE(glade_xml_get_widget(editor->gui, "entry-file-as")); - gtk_editable_delete_text(editable, 0, -1); - if (file_as) - gtk_editable_insert_text(editable, file_as, strlen(file_as), &position); - for (iterator = e_card_list_get_iterator(phone_list); e_card_iterator_is_valid(iterator); e_card_iterator_next(iterator)) { int i; phone = e_card_iterator_get(iterator); @@ -1023,6 +1173,14 @@ fill_in_info(EContactEditor *editor) dateedit = GNOME_DATE_EDIT(glade_xml_get_widget(editor->gui, "dateedit-birthday")); gnome_date_edit_set_time(dateedit, time_val); } + + /* File as has to come after company and name or else it'll get messed up when setting them. */ + position = 0; + editable = GTK_EDITABLE(glade_xml_get_widget(editor->gui, "entry-file-as")); + gtk_editable_delete_text(editable, 0, -1); + if (file_as) + gtk_editable_insert_text(editable, file_as, strlen(file_as), &position); + set_fields(editor); } } @@ -1073,10 +1231,9 @@ extract_info(EContactEditor *editor) position = 0; editable = GTK_EDITABLE(glade_xml_get_widget(editor->gui, "entry-file-as")); file_as = gtk_editable_get_chars(editable, 0, -1); - if (file_as && *file_as) - gtk_object_set(GTK_OBJECT(card), - "file_as", file_as, - NULL); + gtk_object_set(GTK_OBJECT(card), + "file_as", file_as, + NULL); g_free(file_as); position = 0; @@ -1086,8 +1243,17 @@ extract_info(EContactEditor *editor) gtk_object_set(GTK_OBJECT(card), "full_name", fname, NULL); + else + gtk_object_set(GTK_OBJECT(card), + "full_name", NULL, + NULL); g_free(fname); + if (editor->name) + gtk_object_set(GTK_OBJECT(card), + "name", editor->name, + NULL); + for (iterator = e_card_list_get_iterator(phone_list); e_card_iterator_is_valid(iterator); iterator_next ? e_card_iterator_next(iterator) : FALSE ) { int i; phone = e_card_iterator_get(iterator); @@ -1182,6 +1348,10 @@ extract_info(EContactEditor *editor) gtk_object_set(GTK_OBJECT(card), "url", url, NULL); + else + gtk_object_set(GTK_OBJECT(card), + "url", NULL, + NULL); g_free(url); editable = GTK_EDITABLE(glade_xml_get_widget(editor->gui, "entry-company")); @@ -1190,6 +1360,10 @@ extract_info(EContactEditor *editor) gtk_object_set(GTK_OBJECT(card), "org", org, NULL); + else + gtk_object_set(GTK_OBJECT(card), + "org", NULL, + NULL); g_free(org); editable = GTK_EDITABLE(glade_xml_get_widget(editor->gui, "entry-department")); @@ -1198,6 +1372,10 @@ extract_info(EContactEditor *editor) gtk_object_set(GTK_OBJECT(card), "org_unit", org_unit, NULL); + else + gtk_object_set(GTK_OBJECT(card), + "org_unit", NULL, + NULL); g_free(org_unit); position = 0; @@ -1207,6 +1385,10 @@ extract_info(EContactEditor *editor) gtk_object_set(GTK_OBJECT(card), "office", office, NULL); + else + gtk_object_set(GTK_OBJECT(card), + "office", NULL, + NULL); g_free(office); editable = GTK_EDITABLE(glade_xml_get_widget(editor->gui, "entry-jobtitle")); @@ -1215,6 +1397,10 @@ extract_info(EContactEditor *editor) gtk_object_set(GTK_OBJECT(card), "title", title, NULL); + else + gtk_object_set(GTK_OBJECT(card), + "title", NULL, + NULL); g_free(title); editable = GTK_EDITABLE(glade_xml_get_widget(editor->gui, "entry-profession")); @@ -1223,6 +1409,10 @@ extract_info(EContactEditor *editor) gtk_object_set(GTK_OBJECT(card), "role", role, NULL); + else + gtk_object_set(GTK_OBJECT(card), + "role", NULL, + NULL); g_free(role); position = 0; @@ -1232,6 +1422,10 @@ extract_info(EContactEditor *editor) gtk_object_set(GTK_OBJECT(card), "manager", manager, NULL); + else + gtk_object_set(GTK_OBJECT(card), + "manager", NULL, + NULL); g_free(manager); position = 0; @@ -1241,6 +1435,10 @@ extract_info(EContactEditor *editor) gtk_object_set(GTK_OBJECT(card), "assistant", assistant, NULL); + else + gtk_object_set(GTK_OBJECT(card), + "assistant", NULL, + NULL); g_free(assistant); editable = GTK_EDITABLE(glade_xml_get_widget(editor->gui, "entry-nickname")); @@ -1249,6 +1447,10 @@ extract_info(EContactEditor *editor) gtk_object_set(GTK_OBJECT(card), "nickname", nickname, NULL); + else + gtk_object_set(GTK_OBJECT(card), + "nickname", NULL, + NULL); g_free(nickname); position = 0; @@ -1258,6 +1460,10 @@ extract_info(EContactEditor *editor) gtk_object_set(GTK_OBJECT(card), "spouse", spouse, NULL); + else + gtk_object_set(GTK_OBJECT(card), + "spouse", NULL, + NULL); g_free(spouse); dateedit = GNOME_DATE_EDIT(glade_xml_get_widget(editor->gui, "dateedit-anniversary")); @@ -1278,6 +1484,10 @@ extract_info(EContactEditor *editor) gtk_object_set(GTK_OBJECT(card), "fburl", fburl, NULL); + else + gtk_object_set(GTK_OBJECT(card), + "fburl", NULL, + NULL); g_free(fburl); editable = GTK_EDITABLE(glade_xml_get_widget(editor->gui, "text-comments")); @@ -1286,6 +1496,10 @@ extract_info(EContactEditor *editor) gtk_object_set(GTK_OBJECT(card), "note", note, NULL); + else + gtk_object_set(GTK_OBJECT(card), + "note", NULL, + NULL); g_free(note); dateedit = GNOME_DATE_EDIT(glade_xml_get_widget(editor->gui, "dateedit-birthday")); diff --git a/addressbook/contact-editor/e-contact-editor.h b/addressbook/contact-editor/e-contact-editor.h index fa31e73bde..a0bad6e1f9 100644 --- a/addressbook/contact-editor/e-contact-editor.h +++ b/addressbook/contact-editor/e-contact-editor.h @@ -115,6 +115,7 @@ struct _EContactEditor ECardAddrLabel *address[E_CONTACT_EDITOR_ADDRESS_ID_LAST]; ECardName *name; + char *company; EContactEditorEmailId email_choice; EContactEditorPhoneId phone_choice[4]; diff --git a/addressbook/gui/contact-editor/e-contact-editor.c b/addressbook/gui/contact-editor/e-contact-editor.c index 3d25e8a1a9..b4c20987f9 100644 --- a/addressbook/gui/contact-editor/e-contact-editor.c +++ b/addressbook/gui/contact-editor/e-contact-editor.c @@ -253,14 +253,149 @@ address_text_changed (GtkWidget *widget, EContactEditor *editor) editor->address[editor->address_choice]->data = string; } +/* This function tells you whether name_to_style will make sense. */ +static gboolean +style_makes_sense(const ECardName *name, char *company, int style) +{ + switch (style) { + case 0: /* Fall Through */ + case 1: + return TRUE; + case 2: + if (company && *company) + return TRUE; + else + return FALSE; + case 3: /* Fall Through */ + case 4: + if (company && *company && ((name->given && *name->given) || (name->family && *name->family))) + return TRUE; + else + return FALSE; + default: + return FALSE; + } +} + +static char * +name_to_style(const ECardName *name, char *company, int style) +{ + char *string; + char *strings[4], **stringptr; + char *substring; + switch (style) { + case 0: + stringptr = strings; + if (name->family && *name->family) + *(stringptr++) = name->family; + if (name->given && *name->given) + *(stringptr++) = name->given; + *stringptr = NULL; + string = g_strjoinv(", ", strings); + break; + case 1: + stringptr = strings; + if (name->given && *name->given) + *(stringptr++) = name->given; + if (name->family && *name->family) + *(stringptr++) = name->family; + *stringptr = NULL; + string = g_strjoinv(" ", strings); + break; + case 2: + string = g_strdup(company); + break; + case 3: /* Fall Through */ + case 4: + stringptr = strings; + if (name->family && *name->family) + *(stringptr++) = name->family; + if (name->given && *name->given) + *(stringptr++) = name->given; + *stringptr = NULL; + substring = g_strjoinv(", ", strings); + if (!(company && *company)) + company = ""; + if (style == 3) + string = g_strdup_printf("%s (%s)", substring, company); + else + string = g_strdup_printf("%s (%s)", company, substring); + g_free(substring); + break; + default: + string = g_strdup(""); + } + return string; +} + +static int +file_as_get_style (EContactEditor *editor) +{ + GtkEntry *file_as = GTK_ENTRY(glade_xml_get_widget(editor->gui, "entry-file-as")); + char *filestring = gtk_entry_get_text(file_as); + char *trystring; + ECardName *name = editor->name; + int i; + int style; + + if (!name) return 0; + + style = -1; + for (i = 0; i < 5; i++) { + trystring = name_to_style(name, editor->company, i); + if (!strcmp(trystring, filestring)) { + g_free(trystring); + return i; + } + g_free(trystring); + } + return -1; +} + static void -name_entry_changed (GtkWidget *widget, EContactEditor *editor) +file_as_set_style(EContactEditor *editor, int style) { char *string; + int i; + GList *strings = NULL; + GtkCombo *combo = GTK_COMBO(glade_xml_get_widget(editor->gui, "combo-file-as")); + GtkEntry *file_as = GTK_ENTRY(glade_xml_get_widget(editor->gui, "entry-file-as")); + + if (style == -1) { + string = g_strdup(gtk_entry_get_text(file_as)); + strings = g_list_append(strings, string); + } + + for (i = 0; i < 5; i++) { + if (style_makes_sense(editor->name, editor->company, i)) { + string = name_to_style(editor->name, editor->company, i); + strings = g_list_append(strings, string); + } + } + + gtk_combo_set_popdown_strings(combo, strings); + g_list_foreach(strings, (GFunc) g_free, NULL); + g_list_free(strings); + + if (style != -1) { + string = name_to_style(editor->name, editor->company, style); + gtk_entry_set_text(file_as, string); + g_free(string); + } +} + +static void +name_entry_changed (GtkWidget *widget, EContactEditor *editor) +{ ECardName *name; + char *string; GtkEntry *entry = GTK_ENTRY(widget); + int style = 0; + + style = file_as_get_style(editor); name = editor->name; + if (name) e_card_name_free(name); @@ -269,6 +404,23 @@ name_entry_changed (GtkWidget *widget, EContactEditor *editor) name = e_card_name_from_string(string); editor->name = name; + + file_as_set_style(editor, style); +} + +static void +company_entry_changed (GtkWidget *widget, EContactEditor *editor) +{ + GtkEntry *entry = GTK_ENTRY(widget); + int style = 0; + + style = file_as_get_style(editor); + + g_free(editor->company); + + editor->company = g_strdup(gtk_entry_get_text(entry)); + + file_as_set_style(editor, style); } static void @@ -296,6 +448,9 @@ set_entry_changed_signals(EContactEditor *editor) widget = glade_xml_get_widget(editor->gui, "entry-fullname"); gtk_signal_connect(GTK_OBJECT(widget), "changed", name_entry_changed, editor); + widget = glade_xml_get_widget(editor->gui, "entry-company"); + gtk_signal_connect(GTK_OBJECT(widget), "changed", + company_entry_changed, editor); } static void @@ -358,6 +513,7 @@ e_contact_editor_init (EContactEditor *e_contact_editor) e_contact_editor->phone_list = NULL; e_contact_editor->address_list = NULL; e_contact_editor->name = NULL; + e_contact_editor->company = g_strdup(""); for (i = 0; i < E_CONTACT_EDITOR_PHONE_ID_LAST; i++) { e_contact_editor->phone[i] = NULL; @@ -414,6 +570,8 @@ e_contact_editor_destroy (GtkObject *object) { gtk_widget_unref(e_contact_editor->address_popup); } + g_free (e_contact_editor->company); + gtk_object_unref(GTK_OBJECT(e_contact_editor->gui)); } @@ -884,14 +1042,6 @@ fill_in_info(EContactEditor *editor) if (fname) gtk_editable_insert_text(editable, fname, strlen(fname), &position); - - - position = 0; - editable = GTK_EDITABLE(glade_xml_get_widget(editor->gui, "entry-file-as")); - gtk_editable_delete_text(editable, 0, -1); - if (file_as) - gtk_editable_insert_text(editable, file_as, strlen(file_as), &position); - for (iterator = e_card_list_get_iterator(phone_list); e_card_iterator_is_valid(iterator); e_card_iterator_next(iterator)) { int i; phone = e_card_iterator_get(iterator); @@ -1023,6 +1173,14 @@ fill_in_info(EContactEditor *editor) dateedit = GNOME_DATE_EDIT(glade_xml_get_widget(editor->gui, "dateedit-birthday")); gnome_date_edit_set_time(dateedit, time_val); } + + /* File as has to come after company and name or else it'll get messed up when setting them. */ + position = 0; + editable = GTK_EDITABLE(glade_xml_get_widget(editor->gui, "entry-file-as")); + gtk_editable_delete_text(editable, 0, -1); + if (file_as) + gtk_editable_insert_text(editable, file_as, strlen(file_as), &position); + set_fields(editor); } } @@ -1073,10 +1231,9 @@ extract_info(EContactEditor *editor) position = 0; editable = GTK_EDITABLE(glade_xml_get_widget(editor->gui, "entry-file-as")); file_as = gtk_editable_get_chars(editable, 0, -1); - if (file_as && *file_as) - gtk_object_set(GTK_OBJECT(card), - "file_as", file_as, - NULL); + gtk_object_set(GTK_OBJECT(card), + "file_as", file_as, + NULL); g_free(file_as); position = 0; @@ -1086,8 +1243,17 @@ extract_info(EContactEditor *editor) gtk_object_set(GTK_OBJECT(card), "full_name", fname, NULL); + else + gtk_object_set(GTK_OBJECT(card), + "full_name", NULL, + NULL); g_free(fname); + if (editor->name) + gtk_object_set(GTK_OBJECT(card), + "name", editor->name, + NULL); + for (iterator = e_card_list_get_iterator(phone_list); e_card_iterator_is_valid(iterator); iterator_next ? e_card_iterator_next(iterator) : FALSE ) { int i; phone = e_card_iterator_get(iterator); @@ -1182,6 +1348,10 @@ extract_info(EContactEditor *editor) gtk_object_set(GTK_OBJECT(card), "url", url, NULL); + else + gtk_object_set(GTK_OBJECT(card), + "url", NULL, + NULL); g_free(url); editable = GTK_EDITABLE(glade_xml_get_widget(editor->gui, "entry-company")); @@ -1190,6 +1360,10 @@ extract_info(EContactEditor *editor) gtk_object_set(GTK_OBJECT(card), "org", org, NULL); + else + gtk_object_set(GTK_OBJECT(card), + "org", NULL, + NULL); g_free(org); editable = GTK_EDITABLE(glade_xml_get_widget(editor->gui, "entry-department")); @@ -1198,6 +1372,10 @@ extract_info(EContactEditor *editor) gtk_object_set(GTK_OBJECT(card), "org_unit", org_unit, NULL); + else + gtk_object_set(GTK_OBJECT(card), + "org_unit", NULL, + NULL); g_free(org_unit); position = 0; @@ -1207,6 +1385,10 @@ extract_info(EContactEditor *editor) gtk_object_set(GTK_OBJECT(card), "office", office, NULL); + else + gtk_object_set(GTK_OBJECT(card), + "office", NULL, + NULL); g_free(office); editable = GTK_EDITABLE(glade_xml_get_widget(editor->gui, "entry-jobtitle")); @@ -1215,6 +1397,10 @@ extract_info(EContactEditor *editor) gtk_object_set(GTK_OBJECT(card), "title", title, NULL); + else + gtk_object_set(GTK_OBJECT(card), + "title", NULL, + NULL); g_free(title); editable = GTK_EDITABLE(glade_xml_get_widget(editor->gui, "entry-profession")); @@ -1223,6 +1409,10 @@ extract_info(EContactEditor *editor) gtk_object_set(GTK_OBJECT(card), "role", role, NULL); + else + gtk_object_set(GTK_OBJECT(card), + "role", NULL, + NULL); g_free(role); position = 0; @@ -1232,6 +1422,10 @@ extract_info(EContactEditor *editor) gtk_object_set(GTK_OBJECT(card), "manager", manager, NULL); + else + gtk_object_set(GTK_OBJECT(card), + "manager", NULL, + NULL); g_free(manager); position = 0; @@ -1241,6 +1435,10 @@ extract_info(EContactEditor *editor) gtk_object_set(GTK_OBJECT(card), "assistant", assistant, NULL); + else + gtk_object_set(GTK_OBJECT(card), + "assistant", NULL, + NULL); g_free(assistant); editable = GTK_EDITABLE(glade_xml_get_widget(editor->gui, "entry-nickname")); @@ -1249,6 +1447,10 @@ extract_info(EContactEditor *editor) gtk_object_set(GTK_OBJECT(card), "nickname", nickname, NULL); + else + gtk_object_set(GTK_OBJECT(card), + "nickname", NULL, + NULL); g_free(nickname); position = 0; @@ -1258,6 +1460,10 @@ extract_info(EContactEditor *editor) gtk_object_set(GTK_OBJECT(card), "spouse", spouse, NULL); + else + gtk_object_set(GTK_OBJECT(card), + "spouse", NULL, + NULL); g_free(spouse); dateedit = GNOME_DATE_EDIT(glade_xml_get_widget(editor->gui, "dateedit-anniversary")); @@ -1278,6 +1484,10 @@ extract_info(EContactEditor *editor) gtk_object_set(GTK_OBJECT(card), "fburl", fburl, NULL); + else + gtk_object_set(GTK_OBJECT(card), + "fburl", NULL, + NULL); g_free(fburl); editable = GTK_EDITABLE(glade_xml_get_widget(editor->gui, "text-comments")); @@ -1286,6 +1496,10 @@ extract_info(EContactEditor *editor) gtk_object_set(GTK_OBJECT(card), "note", note, NULL); + else + gtk_object_set(GTK_OBJECT(card), + "note", NULL, + NULL); g_free(note); dateedit = GNOME_DATE_EDIT(glade_xml_get_widget(editor->gui, "dateedit-birthday")); diff --git a/addressbook/gui/contact-editor/e-contact-editor.h b/addressbook/gui/contact-editor/e-contact-editor.h index fa31e73bde..a0bad6e1f9 100644 --- a/addressbook/gui/contact-editor/e-contact-editor.h +++ b/addressbook/gui/contact-editor/e-contact-editor.h @@ -115,6 +115,7 @@ struct _EContactEditor ECardAddrLabel *address[E_CONTACT_EDITOR_ADDRESS_ID_LAST]; ECardName *name; + char *company; EContactEditorEmailId email_choice; EContactEditorPhoneId phone_choice[4]; diff --git a/addressbook/gui/minicard/e-minicard.c b/addressbook/gui/minicard/e-minicard.c index 1b6138c87c..6ff1d94aeb 100644 --- a/addressbook/gui/minicard/e-minicard.c +++ b/addressbook/gui/minicard/e-minicard.c @@ -449,6 +449,7 @@ remodel( EMinicard *e_minicard ) { if (e_minicard->card) { char *fname; + char *file_as; char *url; char *org; char *title; @@ -469,6 +470,7 @@ remodel( EMinicard *e_minicard ) gtk_object_get(GTK_OBJECT(e_minicard->card), "full_name", &fname, + "file_as", &file_as, "address", &address_list, "phone", &phone_list, "email", &email_list, @@ -478,17 +480,19 @@ remodel( EMinicard *e_minicard ) "role", &role, NULL); - if (fname) { - add_field(e_minicard, "Name:", fname); - if (e_minicard->header_text) - gnome_canvas_item_set(e_minicard->header_text, - "text", fname, + if (e_minicard->header_text) { + if (file_as) + gnome_canvas_item_set(e_minicard->header_text, + "text", file_as, NULL); - } else - if (e_minicard->header_text) + else gnome_canvas_item_set(e_minicard->header_text, "text", "", NULL); + } + + if (fname) + add_field(e_minicard, "Name:", fname); if (org) add_field(e_minicard, "Company:", org); @@ -592,7 +596,7 @@ e_minicard_get_card_id (EMinicard *minicard) if (minicard->card) { return e_card_get_id(minicard->card); } else { - return NULL; + return ""; } } @@ -605,20 +609,20 @@ e_minicard_compare (EMinicard *minicard1, EMinicard *minicard2) g_return_val_if_fail(E_IS_MINICARD(minicard2), 0); if (minicard1->card && minicard2->card) { - char *fname1, *fname2; + char *file_as1, *file_as2; gtk_object_get(GTK_OBJECT(minicard1->card), - "full_name", &fname1, + "file_as", &file_as1, NULL); gtk_object_get(GTK_OBJECT(minicard2->card), - "full_name", &fname2, + "file_as", &file_as2, NULL); - if (fname1 && fname2) - return strcmp(fname1, fname2); - if (fname1) + if (file_as1 && file_as2) + return strcmp(file_as1, file_as2); + if (file_as1) return -1; - if (fname2) + if (file_as2) return 1; - return 0; + return strcmp(e_minicard_get_card_id(minicard1), e_minicard_get_card_id(minicard2)); } else { return 0; } diff --git a/addressbook/gui/widgets/e-minicard.c b/addressbook/gui/widgets/e-minicard.c index 1b6138c87c..6ff1d94aeb 100644 --- a/addressbook/gui/widgets/e-minicard.c +++ b/addressbook/gui/widgets/e-minicard.c @@ -449,6 +449,7 @@ remodel( EMinicard *e_minicard ) { if (e_minicard->card) { char *fname; + char *file_as; char *url; char *org; char *title; @@ -469,6 +470,7 @@ remodel( EMinicard *e_minicard ) gtk_object_get(GTK_OBJECT(e_minicard->card), "full_name", &fname, + "file_as", &file_as, "address", &address_list, "phone", &phone_list, "email", &email_list, @@ -478,17 +480,19 @@ remodel( EMinicard *e_minicard ) "role", &role, NULL); - if (fname) { - add_field(e_minicard, "Name:", fname); - if (e_minicard->header_text) - gnome_canvas_item_set(e_minicard->header_text, - "text", fname, + if (e_minicard->header_text) { + if (file_as) + gnome_canvas_item_set(e_minicard->header_text, + "text", file_as, NULL); - } else - if (e_minicard->header_text) + else gnome_canvas_item_set(e_minicard->header_text, "text", "", NULL); + } + + if (fname) + add_field(e_minicard, "Name:", fname); if (org) add_field(e_minicard, "Company:", org); @@ -592,7 +596,7 @@ e_minicard_get_card_id (EMinicard *minicard) if (minicard->card) { return e_card_get_id(minicard->card); } else { - return NULL; + return ""; } } @@ -605,20 +609,20 @@ e_minicard_compare (EMinicard *minicard1, EMinicard *minicard2) g_return_val_if_fail(E_IS_MINICARD(minicard2), 0); if (minicard1->card && minicard2->card) { - char *fname1, *fname2; + char *file_as1, *file_as2; gtk_object_get(GTK_OBJECT(minicard1->card), - "full_name", &fname1, + "file_as", &file_as1, NULL); gtk_object_get(GTK_OBJECT(minicard2->card), - "full_name", &fname2, + "file_as", &file_as2, NULL); - if (fname1 && fname2) - return strcmp(fname1, fname2); - if (fname1) + if (file_as1 && file_as2) + return strcmp(file_as1, file_as2); + if (file_as1) return -1; - if (fname2) + if (file_as2) return 1; - return 0; + return strcmp(e_minicard_get_card_id(minicard1), e_minicard_get_card_id(minicard2)); } else { return 0; } |