diff options
-rw-r--r-- | addressbook/ChangeLog | 6 | ||||
-rw-r--r-- | addressbook/contact-editor/e-contact-editor.c | 102 | ||||
-rw-r--r-- | addressbook/contact-editor/e-contact-editor.h | 2 | ||||
-rw-r--r-- | addressbook/gui/contact-editor/e-contact-editor.c | 102 | ||||
-rw-r--r-- | addressbook/gui/contact-editor/e-contact-editor.h | 2 |
5 files changed, 214 insertions, 0 deletions
diff --git a/addressbook/ChangeLog b/addressbook/ChangeLog index 4b3e2dce9b..637a25858e 100644 --- a/addressbook/ChangeLog +++ b/addressbook/ChangeLog @@ -1,3 +1,9 @@ +2000-05-19 Christopher James Lahey <clahey@helixcode.com> + + * contact-editor/e-contact-editor.c, + contact-editor/e-contact-editor.h: Added support for arbitrary + fields in the contact editor. + 2000-05-18 Christopher James Lahey <clahey@helixcode.com> * backend/ebook/e-card.c: Fixed e_card_name_copy and diff --git a/addressbook/contact-editor/e-contact-editor.c b/addressbook/contact-editor/e-contact-editor.c index 2c13bf5ecd..b665410d0c 100644 --- a/addressbook/contact-editor/e-contact-editor.c +++ b/addressbook/contact-editor/e-contact-editor.c @@ -45,6 +45,7 @@ static void fill_in_info(EContactEditor *editor); static void extract_info(EContactEditor *editor); static void set_fields(EContactEditor *editor); static void set_address_field(EContactEditor *editor, int result); +static void add_field_callback(GtkWidget *widget, EContactEditor *editor); static GtkVBoxClass *parent_class = NULL; @@ -487,6 +488,8 @@ e_contact_editor_init (EContactEditor *e_contact_editor) 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->address_choice = 0; + + e_contact_editor->arbitrary_fields = NULL; e_contact_editor->simple = e_card_simple_new(NULL); @@ -502,6 +505,9 @@ e_contact_editor_init (EContactEditor *e_contact_editor) gtk_widget_reparent(widget, GTK_WIDGET(e_contact_editor)); + if (GTK_IS_CONTAINER(widget)) + e_container_foreach_leaf(GTK_CONTAINER(widget), (GtkCallback) add_field_callback, e_contact_editor); + _replace_buttons(e_contact_editor); set_entry_changed_signals(e_contact_editor); @@ -1014,6 +1020,51 @@ set_address_field(EContactEditor *editor, int 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-contacts", + "entry-file-as", + "dateedit-anniversary", + "dateedit-birthday", + "entry-phone1", + "entry-phone2", + "entry-phone3", + "entry-phone4", + "entry-email1", + "text-address", + "checkbutton-mailingaddress", + "checkbutton-htmlmail", + 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(widget)) { + editor->arbitrary_fields = g_list_prepend(editor->arbitrary_fields, g_strdup(name)); + } + } +} + struct { char *id; char *key; @@ -1057,6 +1108,24 @@ fill_in_card_field(EContactEditor *editor, ECard *card, char *id, char *key) } 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 fill_in_info(EContactEditor *editor) { ECard *card = editor->card; @@ -1067,6 +1136,7 @@ fill_in_info(EContactEditor *editor) const ECardDate *bday; int i; GtkWidget *widget; + GList *list; gtk_object_get(GTK_OBJECT(card), "file_as", &file_as, @@ -1079,6 +1149,10 @@ fill_in_info(EContactEditor *editor) fill_in_card_field(editor, card, field_mapping[i].id, field_mapping[i].key); } + for (list = editor->arbitrary_fields; list; list = list->next) { + fill_in_single_field(editor, list->data); + } + /* 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); @@ -1136,6 +1210,29 @@ extract_field(EContactEditor *editor, ECard *card, char *editable_id, char *key) } 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); + g_free(string); + } +} + +static void extract_info(EContactEditor *editor) { ECard *card = editor->card; @@ -1146,6 +1243,7 @@ extract_info(EContactEditor *editor) time_t time_val; int i; GtkWidget *widget; + GList *list; widget = glade_xml_get_widget(editor->gui, "entry-file-as"); if (widget && GTK_IS_EDITABLE(widget)) { @@ -1162,6 +1260,10 @@ extract_info(EContactEditor *editor) 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); + } + if (editor->name) gtk_object_set(GTK_OBJECT(card), "name", editor->name, diff --git a/addressbook/contact-editor/e-contact-editor.h b/addressbook/contact-editor/e-contact-editor.h index 9bf8c0fdb2..288cec1db0 100644 --- a/addressbook/contact-editor/e-contact-editor.h +++ b/addressbook/contact-editor/e-contact-editor.h @@ -75,6 +75,8 @@ struct _EContactEditor ECardSimpleEmailId email_choice; ECardSimplePhoneId phone_choice[4]; ECardSimpleAddressId address_choice; + + GList *arbitrary_fields; }; struct _EContactEditorClass diff --git a/addressbook/gui/contact-editor/e-contact-editor.c b/addressbook/gui/contact-editor/e-contact-editor.c index 2c13bf5ecd..b665410d0c 100644 --- a/addressbook/gui/contact-editor/e-contact-editor.c +++ b/addressbook/gui/contact-editor/e-contact-editor.c @@ -45,6 +45,7 @@ static void fill_in_info(EContactEditor *editor); static void extract_info(EContactEditor *editor); static void set_fields(EContactEditor *editor); static void set_address_field(EContactEditor *editor, int result); +static void add_field_callback(GtkWidget *widget, EContactEditor *editor); static GtkVBoxClass *parent_class = NULL; @@ -487,6 +488,8 @@ e_contact_editor_init (EContactEditor *e_contact_editor) 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->address_choice = 0; + + e_contact_editor->arbitrary_fields = NULL; e_contact_editor->simple = e_card_simple_new(NULL); @@ -502,6 +505,9 @@ e_contact_editor_init (EContactEditor *e_contact_editor) gtk_widget_reparent(widget, GTK_WIDGET(e_contact_editor)); + if (GTK_IS_CONTAINER(widget)) + e_container_foreach_leaf(GTK_CONTAINER(widget), (GtkCallback) add_field_callback, e_contact_editor); + _replace_buttons(e_contact_editor); set_entry_changed_signals(e_contact_editor); @@ -1014,6 +1020,51 @@ set_address_field(EContactEditor *editor, int 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-contacts", + "entry-file-as", + "dateedit-anniversary", + "dateedit-birthday", + "entry-phone1", + "entry-phone2", + "entry-phone3", + "entry-phone4", + "entry-email1", + "text-address", + "checkbutton-mailingaddress", + "checkbutton-htmlmail", + 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(widget)) { + editor->arbitrary_fields = g_list_prepend(editor->arbitrary_fields, g_strdup(name)); + } + } +} + struct { char *id; char *key; @@ -1057,6 +1108,24 @@ fill_in_card_field(EContactEditor *editor, ECard *card, char *id, char *key) } 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 fill_in_info(EContactEditor *editor) { ECard *card = editor->card; @@ -1067,6 +1136,7 @@ fill_in_info(EContactEditor *editor) const ECardDate *bday; int i; GtkWidget *widget; + GList *list; gtk_object_get(GTK_OBJECT(card), "file_as", &file_as, @@ -1079,6 +1149,10 @@ fill_in_info(EContactEditor *editor) fill_in_card_field(editor, card, field_mapping[i].id, field_mapping[i].key); } + for (list = editor->arbitrary_fields; list; list = list->next) { + fill_in_single_field(editor, list->data); + } + /* 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); @@ -1136,6 +1210,29 @@ extract_field(EContactEditor *editor, ECard *card, char *editable_id, char *key) } 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); + g_free(string); + } +} + +static void extract_info(EContactEditor *editor) { ECard *card = editor->card; @@ -1146,6 +1243,7 @@ extract_info(EContactEditor *editor) time_t time_val; int i; GtkWidget *widget; + GList *list; widget = glade_xml_get_widget(editor->gui, "entry-file-as"); if (widget && GTK_IS_EDITABLE(widget)) { @@ -1162,6 +1260,10 @@ extract_info(EContactEditor *editor) 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); + } + if (editor->name) gtk_object_set(GTK_OBJECT(card), "name", editor->name, diff --git a/addressbook/gui/contact-editor/e-contact-editor.h b/addressbook/gui/contact-editor/e-contact-editor.h index 9bf8c0fdb2..288cec1db0 100644 --- a/addressbook/gui/contact-editor/e-contact-editor.h +++ b/addressbook/gui/contact-editor/e-contact-editor.h @@ -75,6 +75,8 @@ struct _EContactEditor ECardSimpleEmailId email_choice; ECardSimplePhoneId phone_choice[4]; ECardSimpleAddressId address_choice; + + GList *arbitrary_fields; }; struct _EContactEditorClass |