From 0d345b68bf4ab7f2d21f3387f11e1c42c335e0b4 Mon Sep 17 00:00:00 2001 From: Chris Toshok Date: Fri, 2 Mar 2001 11:02:33 +0000 Subject: new function. (e_minicard_view_event): split out the creation of the 2001-03-02 Chris Toshok * gui/widgets/e-minicard-view.c (supported_fields_cb): new function. (e_minicard_view_event): split out the creation of the contact editor to the supported_fields callback. * gui/widgets/e-minicard.c (supported_fields_cb): new function. (e_minicard_event): split out the creation of the contact editor to the supported_fields callback. * gui/widgets/e-addressbook-view.c (table_double_click): split function into two functions, since e_book_get_supported_fields requires a callback now. (supported_fields_cb): new function. * gui/component/addressbook.c (new_contact_cb): split this into two functions, since e_book_get_supported_fields requires a callback now. (supported_fields_cb): new function. * contact-editor/test-editor.c (main): track change to e_contact_editor_new (pass NULL for the writable_fields arg.) * contact-editor/contact-editor.glade: fix several labels so they make better sense (since we look them up in e-contact-editor.c.) * contact-editor/e-contact-editor.h (struct _EContactEditor): add writable_fields. also, add it to e_contact_editor_new. * contact-editor/e-contact-editor.c (e_contact_editor_class_init): add writable_fields arg. (e_contact_editor_destroy): unref the writable_fields list. (e_contact_editor_new): pass @fields as the writable_fields arg. (e_contact_editor_set_arg): add writable_fields support. (enable_writable_fields): new (very hairy) function, to disable everything and reenable just the fields listed in the writable_fields list. (_email_arrow_pressed): set label-email1, entry-email1, and checkbutton-htmlmail to be sensitive since the only way to get here is to activate a writable field in the menu. (_address_arrow_pressed): set label-address, button-fulladdr, and text-address to be sensitive for the same reason. (_phone_arrow_pressed): sensitize the label and entry for the same reason. svn path=/trunk/; revision=8516 --- addressbook/ChangeLog | 46 +++ addressbook/contact-editor/contact-editor.glade | 24 +- addressbook/contact-editor/e-contact-editor.c | 370 ++++++++++++++++----- addressbook/contact-editor/e-contact-editor.h | 5 +- addressbook/contact-editor/test-editor.c | 4 +- addressbook/gui/component/addressbook.c | 29 +- .../gui/contact-editor/contact-editor.glade | 24 +- addressbook/gui/contact-editor/e-contact-editor.c | 370 ++++++++++++++++----- addressbook/gui/contact-editor/e-contact-editor.h | 5 +- addressbook/gui/contact-editor/test-editor.c | 4 +- addressbook/gui/widgets/e-addressbook-view.c | 33 +- addressbook/gui/widgets/e-minicard-view.c | 38 ++- addressbook/gui/widgets/e-minicard.c | 31 +- 13 files changed, 753 insertions(+), 230 deletions(-) (limited to 'addressbook') diff --git a/addressbook/ChangeLog b/addressbook/ChangeLog index 6e9a3b786e..05553b6f2b 100644 --- a/addressbook/ChangeLog +++ b/addressbook/ChangeLog @@ -1,3 +1,49 @@ +2001-03-02 Chris Toshok + + * gui/widgets/e-minicard-view.c (supported_fields_cb): new + function. + (e_minicard_view_event): split out the creation of the contact + editor to the supported_fields callback. + + * gui/widgets/e-minicard.c (supported_fields_cb): new function. + (e_minicard_event): split out the creation of the contact editor + to the supported_fields callback. + + * gui/widgets/e-addressbook-view.c (table_double_click): split + function into two functions, since e_book_get_supported_fields + requires a callback now. + (supported_fields_cb): new function. + + * gui/component/addressbook.c (new_contact_cb): split this into + two functions, since e_book_get_supported_fields requires a + callback now. + (supported_fields_cb): new function. + + * contact-editor/test-editor.c (main): track change to + e_contact_editor_new (pass NULL for the writable_fields arg.) + + * contact-editor/contact-editor.glade: fix several labels so they + make better sense (since we look them up in e-contact-editor.c.) + + * contact-editor/e-contact-editor.h (struct _EContactEditor): add + writable_fields. also, add it to e_contact_editor_new. + + * contact-editor/e-contact-editor.c (e_contact_editor_class_init): + add writable_fields arg. + (e_contact_editor_destroy): unref the writable_fields list. + (e_contact_editor_new): pass @fields as the writable_fields arg. + (e_contact_editor_set_arg): add writable_fields support. + (enable_writable_fields): new (very hairy) function, to disable + everything and reenable just the fields listed in the + writable_fields list. + (_email_arrow_pressed): set label-email1, entry-email1, and + checkbutton-htmlmail to be sensitive since the only way to get + here is to activate a writable field in the menu. + (_address_arrow_pressed): set label-address, button-fulladdr, and + text-address to be sensitive for the same reason. + (_phone_arrow_pressed): sensitize the label and entry for the same + reason. + 2001-03-02 Chris Toshok * backend/ebook/e-card-simple.c (field_data): add new entries for diff --git a/addressbook/contact-editor/contact-editor.glade b/addressbook/contact-editor/contact-editor.glade index ddcc058ab2..30f7feb1a5 100644 --- a/addressbook/contact-editor/contact-editor.glade +++ b/addressbook/contact-editor/contact-editor.glade @@ -1494,7 +1494,7 @@ GtkLabel - label34 + label-jobtitle True GTK_JUSTIFY_CENTER @@ -1691,7 +1691,7 @@ GtkLabel - label35 + label-company True GTK_JUSTIFY_CENTER @@ -1767,7 +1767,7 @@ GtkLabel - label21 + label-department True GTK_JUSTIFY_CENTER @@ -1795,7 +1795,7 @@ GtkLabel - label22 + label-office True GTK_JUSTIFY_CENTER @@ -1823,7 +1823,7 @@ GtkLabel - label23 + label-profession True GTK_JUSTIFY_CENTER @@ -1851,7 +1851,7 @@ GtkLabel - label24 + label-nickname True GTK_JUSTIFY_CENTER @@ -1879,7 +1879,7 @@ GtkLabel - label25 + label-spouse True GTK_JUSTIFY_CENTER @@ -1907,7 +1907,7 @@ GtkLabel - label31 + label-birthday True GTK_JUSTIFY_CENTER @@ -1934,7 +1934,7 @@ GtkLabel - label30 + label-assistant True GTK_JUSTIFY_CENTER @@ -1962,7 +1962,7 @@ GtkLabel - label29 + label-manager True GTK_JUSTIFY_CENTER @@ -1990,7 +1990,7 @@ GtkLabel - label32 + label-anniversary True GTK_JUSTIFY_CENTER @@ -2262,7 +2262,7 @@ GtkLabel - label33 + label-comments True GTK_JUSTIFY_CENTER diff --git a/addressbook/contact-editor/e-contact-editor.c b/addressbook/contact-editor/e-contact-editor.c index e65e9b9efb..006f1ba150 100644 --- a/addressbook/contact-editor/e-contact-editor.c +++ b/addressbook/contact-editor/e-contact-editor.c @@ -56,6 +56,7 @@ static GtkWidget *e_contact_editor_build_dialog(EContactEditor *editor, gchar *e static void _email_arrow_pressed (GtkWidget *widget, GdkEventButton *button, EContactEditor *editor); static void _phone_arrow_pressed (GtkWidget *widget, GdkEventButton *button, EContactEditor *editor); static void _address_arrow_pressed (GtkWidget *widget, GdkEventButton *button, EContactEditor *editor); +static void enable_writable_fields(EContactEditor *editor); static void fill_in_info(EContactEditor *editor); static void extract_info(EContactEditor *editor); static void set_fields(EContactEditor *editor); @@ -70,7 +71,8 @@ static guint contact_editor_signals[LAST_SIGNAL]; enum { ARG_0, ARG_CARD, - ARG_IS_NEW_CARD + ARG_IS_NEW_CARD, + ARG_WRITABLE_FIELDS }; enum { @@ -117,6 +119,8 @@ e_contact_editor_class_init (EContactEditorClass *klass) GTK_ARG_READWRITE, ARG_CARD); gtk_object_add_arg_type ("EContactEditor::is_new_card", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_IS_NEW_CARD); + gtk_object_add_arg_type ("EContactEditor::writable_fields", GTK_TYPE_POINTER, + GTK_ARG_READWRITE, ARG_WRITABLE_FIELDS); contact_editor_signals[ADD_CARD] = gtk_signal_new ("add_card", @@ -972,7 +976,10 @@ e_contact_editor_init (EContactEditor *e_contact_editor) void e_contact_editor_destroy (GtkObject *object) { EContactEditor *e_contact_editor = E_CONTACT_EDITOR(object); - + + if (e_contact_editor->writable_fields) { + gtk_object_unref(GTK_OBJECT(e_contact_editor->writable_fields)); + } if (e_contact_editor->email_list) { g_list_foreach(e_contact_editor->email_list, (GFunc) g_free, NULL); g_list_free(e_contact_editor->email_list); @@ -1018,7 +1025,7 @@ e_contact_editor_destroy (GtkObject *object) { } EContactEditor * -e_contact_editor_new (ECard *card, gboolean is_new_card) +e_contact_editor_new (ECard *card, gboolean is_new_card, EList *fields) { EContactEditor *ce; @@ -1027,6 +1034,7 @@ e_contact_editor_new (ECard *card, gboolean is_new_card) gtk_object_set (GTK_OBJECT (ce), "card", card, "is_new_card", is_new_card, + "writable_fields", fields, NULL); gtk_widget_show (ce->app); @@ -1054,6 +1062,12 @@ e_contact_editor_set_arg (GtkObject *o, GtkArg *arg, guint arg_id) case ARG_IS_NEW_CARD: editor->is_new_card = GTK_VALUE_BOOL (*arg) ? TRUE : FALSE; break; + + case ARG_WRITABLE_FIELDS: + editor->writable_fields = GTK_VALUE_POINTER (*arg); + gtk_object_ref (GTK_OBJECT (editor->writable_fields)); + enable_writable_fields (editor); + break; } } @@ -1164,6 +1178,99 @@ e_contact_editor_build_ui_info(GList *list, GnomeUIInfo **infop) *infop = info; } +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])); + } + } + if (editor->phone_info == NULL) { + e_contact_editor_build_ui_info(editor->phone_list, &editor->phone_info); + + if ( editor->phone_popup ) + gtk_widget_unref(editor->phone_popup); + + editor->phone_popup = gnome_popup_menu_new(editor->phone_info); + } +} + +static void +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])); + } + } + if (editor->email_info == NULL) { + e_contact_editor_build_ui_info(editor->email_list, &editor->email_info); + + if ( editor->email_popup ) + gtk_widget_unref(editor->email_popup); + + editor->email_popup = gnome_popup_menu_new(editor->email_info); + } +} + +static void +e_contact_editor_build_address_ui (EContactEditor *editor) +{ + int i; + + if (editor->address_list == NULL) { + static char *info[] = { + N_("Business"), + N_("Home"), + N_("Other") + }; + + for (i = 0; i < sizeof(info) / sizeof(info[0]); i++) { + editor->address_list = g_list_append(editor->address_list, g_strdup(info[i])); + } + } + if (editor->address_info == NULL) { + e_contact_editor_build_ui_info(editor->address_list, &editor->address_info); + + if ( editor->address_popup ) + gtk_widget_unref(editor->address_popup); + + editor->address_popup = gnome_popup_menu_new(editor->address_info); + } +} #if 0 static void _dialog_clicked(GtkWidget *dialog, gint button, EContactEditor *editor) @@ -1272,41 +1379,7 @@ _phone_arrow_pressed (GtkWidget *widget, GdkEventButton *button, EContactEditor label = g_strdup_printf("label-phone%d", which); entry = g_strdup_printf("entry-phone%d", which); - 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])); - } - } - if (editor->phone_info == NULL) { - e_contact_editor_build_ui_info(editor->phone_list, &editor->phone_info); - - if ( editor->phone_popup ) - gtk_widget_unref(editor->phone_popup); - - editor->phone_popup = gnome_popup_menu_new(editor->phone_info); - } + 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); @@ -1323,6 +1396,8 @@ _phone_arrow_pressed (GtkWidget *widget, GdkEventButton *button, EContactEditor if (result != -1) { editor->phone_choice[which - 1] = result; set_fields(editor); + gtk_widget_set_sensitive (glade_xml_get_widget (editor->gui, label), TRUE); + gtk_widget_set_sensitive (glade_xml_get_widget (editor->gui, entry), TRUE); } g_free(label); @@ -1334,26 +1409,9 @@ _email_arrow_pressed (GtkWidget *widget, GdkEventButton *button, EContactEditor { int i; int result; - 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])); - } - } - if (editor->email_info == NULL) { - e_contact_editor_build_ui_info(editor->email_list, &editor->email_info); - if ( editor->email_popup ) - gtk_widget_unref(editor->email_popup); - - editor->email_popup = gnome_popup_menu_new(editor->email_info); - } - + 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); gboolean checked; @@ -1369,6 +1427,11 @@ _email_arrow_pressed (GtkWidget *widget, GdkEventButton *button, EContactEditor if (result != -1) { editor->email_choice = result; set_fields(editor); + + /* make sure the buttons/entry is/are sensitive */ + gtk_widget_set_sensitive (glade_xml_get_widget (editor->gui, "label-email1"), TRUE); + gtk_widget_set_sensitive (glade_xml_get_widget (editor->gui, "entry-email1"), TRUE); + gtk_widget_set_sensitive (glade_xml_get_widget (editor->gui, "checkbutton-htmlmail"), TRUE); } } @@ -1377,26 +1440,9 @@ _address_arrow_pressed (GtkWidget *widget, GdkEventButton *button, EContactEdito { int i; int result; - if (editor->address_list == NULL) { - static char *info[] = { - N_("Business"), - N_("Home"), - N_("Other") - }; - - for (i = 0; i < sizeof(info) / sizeof(info[0]); i++) { - editor->address_list = g_list_append(editor->address_list, g_strdup(info[i])); - } - } - if (editor->address_info == NULL) { - e_contact_editor_build_ui_info(editor->address_list, &editor->address_info); - if ( editor->address_popup ) - gtk_widget_unref(editor->address_popup); - - editor->address_popup = gnome_popup_menu_new(editor->address_info); - } - + e_contact_editor_build_address_ui (editor); + for(i = 0; i < E_CARD_SIMPLE_ADDRESS_ID_LAST; i++) { const ECardAddrLabel *address = e_card_simple_get_address(editor->simple, i); gboolean checked; @@ -1411,6 +1457,11 @@ _address_arrow_pressed (GtkWidget *widget, GdkEventButton *button, EContactEdito if (result != -1) { set_address_field(editor, result); + + /* make sure the buttons/entry is/are sensitive */ + gtk_widget_set_sensitive (glade_xml_get_widget (editor->gui, "label-address"), TRUE); + gtk_widget_set_sensitive (glade_xml_get_widget (editor->gui, "button-fulladdr"), TRUE); + gtk_widget_set_sensitive (glade_xml_get_widget (editor->gui, "text-address"), TRUE); } } @@ -1600,6 +1651,173 @@ fill_in_single_field(EContactEditor *editor, char *name) } } +static void +disable_widget_foreach (char *key, GtkWidget *widget, gpointer closure) +{ + gtk_widget_set_sensitive (widget, FALSE); +} + +static struct { + char *widget_name; + ECardSimpleField field_id; +} widget_field_mappings[] = { + { "entry-web", E_CARD_SIMPLE_FIELD_URL }, + { "accellabel-web", E_CARD_SIMPLE_FIELD_URL }, + + { "entry-jobtitle", E_CARD_SIMPLE_FIELD_TITLE }, + { "label-jobtitle", E_CARD_SIMPLE_FIELD_TITLE }, + + { "entry-company", E_CARD_SIMPLE_FIELD_ORG }, + { "label-company", E_CARD_SIMPLE_FIELD_ORG }, + + { "combo-file-as", E_CARD_SIMPLE_FIELD_FILE_AS }, + { "entry-file-as", E_CARD_SIMPLE_FIELD_FILE_AS }, + { "accellabel-fileas", E_CARD_SIMPLE_FIELD_FILE_AS }, + + { "label-department", E_CARD_SIMPLE_FIELD_ORG_UNIT }, + { "entry-department", E_CARD_SIMPLE_FIELD_ORG_UNIT }, + + { "label-office", E_CARD_SIMPLE_FIELD_OFFICE }, + { "entry-office", E_CARD_SIMPLE_FIELD_OFFICE }, + + { "label-profession", E_CARD_SIMPLE_FIELD_ROLE }, + { "entry-profession", E_CARD_SIMPLE_FIELD_ROLE }, + + { "label-manager", E_CARD_SIMPLE_FIELD_MANAGER }, + { "entry-manager", E_CARD_SIMPLE_FIELD_MANAGER }, + + { "label-assistant", E_CARD_SIMPLE_FIELD_ASSISTANT }, + { "entry-assistant", E_CARD_SIMPLE_FIELD_ASSISTANT }, + + { "label-nickname", E_CARD_SIMPLE_FIELD_NICKNAME }, + { "entry-nickname", E_CARD_SIMPLE_FIELD_NICKNAME }, + + { "label-spouse", E_CARD_SIMPLE_FIELD_SPOUSE }, + { "entry-spouse", E_CARD_SIMPLE_FIELD_SPOUSE }, + + { "label-birthday", E_CARD_SIMPLE_FIELD_BIRTH_DATE }, + { "dateedit-birthday", E_CARD_SIMPLE_FIELD_BIRTH_DATE }, + + { "label-anniversary", E_CARD_SIMPLE_FIELD_ANNIVERSARY }, + { "dateedit-anniversary", E_CARD_SIMPLE_FIELD_ANNIVERSARY }, + + { "label-comments", E_CARD_SIMPLE_FIELD_NOTE }, + { "text-comments", E_CARD_SIMPLE_FIELD_NOTE }, + + { "button-fullname", E_CARD_SIMPLE_FIELD_FULL_NAME }, + { "entry-fullname", E_CARD_SIMPLE_FIELD_FULL_NAME } +}; +static int num_widget_field_mappings = sizeof(widget_field_mappings) / sizeof (widget_field_mappings[0]); + +static void +enable_writable_fields(EContactEditor *editor) +{ + EList *fields = editor->writable_fields; + EIterator *iter; + GHashTable *dropdown_hash, *supported_hash; + int i; + ECardSimple *card; + char *widget_name; + + if (!fields) + return; + + card = e_card_simple_new (e_card_new ("")); + + 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 ++) + g_hash_table_insert (dropdown_hash, + (char*)e_card_simple_get_ecard_field(card, e_card_simple_map_phone_to_field (i)), + editor->phone_info[i].widget); + e_contact_editor_build_email_ui (editor); + for (i = 0; i < E_CARD_SIMPLE_EMAIL_ID_LAST; i ++) + g_hash_table_insert (dropdown_hash, + (char*)e_card_simple_get_ecard_field(card, e_card_simple_map_email_to_field (i)), + editor->email_info[i].widget); + 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(card, e_card_simple_map_address_to_field (i)), + editor->address_info[i].widget); + + /* then disable them all */ + g_hash_table_foreach (dropdown_hash, (GHFunc)disable_widget_foreach, NULL); + + /* disable the label widgets for the dropdowns (4 phone, 1 + email and the toggle button, and 1 address and one for + the full adress button */ + for (i = 0; i < 4; i ++) { + widget_name = g_strdup_printf ("label-phone%d", i+1); + gtk_widget_set_sensitive (glade_xml_get_widget (editor->gui, widget_name), FALSE); + g_free (widget_name); + widget_name = g_strdup_printf ("entry-phone%d", i+1); + gtk_widget_set_sensitive (glade_xml_get_widget (editor->gui, widget_name), FALSE); + g_free (widget_name); + } + gtk_widget_set_sensitive (glade_xml_get_widget (editor->gui, "label-email1"), FALSE); + gtk_widget_set_sensitive (glade_xml_get_widget (editor->gui, "entry-email1"), FALSE); + gtk_widget_set_sensitive (glade_xml_get_widget (editor->gui, "checkbutton-htmlmail"), FALSE); + gtk_widget_set_sensitive (glade_xml_get_widget (editor->gui, "label-address"), FALSE); + gtk_widget_set_sensitive (glade_xml_get_widget (editor->gui, "button-fulladdr"), FALSE); + gtk_widget_set_sensitive (glade_xml_get_widget (editor->gui, "text-address"), FALSE); + + /* enable widgets that map directly from a field to a widget (the drop down items) */ + iter = e_list_get_iterator (fields); + for (; e_iterator_is_valid (iter); e_iterator_next (iter)) { + char *field = (char*)e_iterator_get (iter); + GtkWidget *widget = g_hash_table_lookup (dropdown_hash, field); + + if (widget) { + gtk_widget_set_sensitive (widget, TRUE); + } + else { + /* if it's not a field that's handled by the + dropdown items, add it to the has to be + used in the second step */ + g_hash_table_insert (supported_hash, field, field); + } + + /* 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 (card, e_card_simple_map_email_to_field(editor->email_choice)))) { + gtk_widget_set_sensitive (glade_xml_get_widget (editor->gui, "label-email1"), TRUE); + gtk_widget_set_sensitive (glade_xml_get_widget (editor->gui, "entry-email1"), TRUE); + gtk_widget_set_sensitive (glade_xml_get_widget (editor->gui, "checkbutton-htmlmail"), TRUE); + } + else if (!strcmp (field, e_card_simple_get_ecard_field (card, e_card_simple_map_address_to_field(editor->address_choice)))) { + gtk_widget_set_sensitive (glade_xml_get_widget (editor->gui, "label-address"), TRUE); + gtk_widget_set_sensitive (glade_xml_get_widget (editor->gui, "button-fulladdr"), TRUE); + gtk_widget_set_sensitive (glade_xml_get_widget (editor->gui, "text-address"), TRUE); + } + else for (i = 0; i < 4; i ++) { + if (!strcmp (field, e_card_simple_get_ecard_field (card, e_card_simple_map_phone_to_field(editor->phone_choice[i])))) { + widget_name = g_strdup_printf ("label-phone%d", i+1); + gtk_widget_set_sensitive (glade_xml_get_widget (editor->gui, widget_name), TRUE); + g_free (widget_name); + widget_name = g_strdup_printf ("entry-phone%d", i+1); + gtk_widget_set_sensitive (glade_xml_get_widget (editor->gui, widget_name), TRUE); + g_free (widget_name); + } + } + } + + /* handle the label next to the dropdown widgets */ + + for (i = 0; i < num_widget_field_mappings; i ++) { + gboolean enabled = g_hash_table_lookup (supported_hash, + e_card_simple_get_ecard_field (card, + widget_field_mappings[i].field_id)) != NULL; + gtk_widget_set_sensitive (glade_xml_get_widget(editor->gui, + widget_field_mappings[i].widget_name), enabled); + } +} + static void fill_in_info(EContactEditor *editor) { diff --git a/addressbook/contact-editor/e-contact-editor.h b/addressbook/contact-editor/e-contact-editor.h index a2067b1a88..ef2b1238df 100644 --- a/addressbook/contact-editor/e-contact-editor.h +++ b/addressbook/contact-editor/e-contact-editor.h @@ -85,6 +85,8 @@ struct _EContactEditor /* Whether we are editing a new card or an existing one */ guint is_new_card : 1; + + EList *writable_fields; }; struct _EContactEditorClass @@ -100,7 +102,8 @@ struct _EContactEditorClass }; EContactEditor *e_contact_editor_new (ECard *card, - gboolean is_new_card); + gboolean is_new_card, + EList *writable_fields); GtkType e_contact_editor_get_type (void); void e_contact_editor_raise (EContactEditor *editor); diff --git a/addressbook/contact-editor/test-editor.c b/addressbook/contact-editor/test-editor.c index 80db2fe848..e9060b3e25 100644 --- a/addressbook/contact-editor/test-editor.c +++ b/addressbook/contact-editor/test-editor.c @@ -127,11 +127,11 @@ int main( int argc, char *argv[] ) if (cardstr == NULL) cardstr = TEST_VCARD; - ce = e_contact_editor_new (e_card_new (cardstr), TRUE); + ce = e_contact_editor_new (e_card_new (cardstr), TRUE, NULL); gtk_signal_connect (GTK_OBJECT (ce), "editor_closed", GTK_SIGNAL_FUNC (editor_closed_cb), NULL); - ce = e_contact_editor_new (e_card_new (cardstr), TRUE); + ce = e_contact_editor_new (e_card_new (cardstr), TRUE, NULL); gtk_signal_connect (GTK_OBJECT (ce), "editor_closed", GTK_SIGNAL_FUNC (editor_closed_cb), NULL); diff --git a/addressbook/gui/component/addressbook.c b/addressbook/gui/component/addressbook.c index 1cea4c21f2..b80a2b80d7 100644 --- a/addressbook/gui/component/addressbook.c +++ b/addressbook/gui/component/addressbook.c @@ -98,22 +98,14 @@ editor_closed_cb (EContactEditor *ce, gpointer data) } static void -new_contact_cb (BonoboUIComponent *uih, void *user_data, const char *path) +supported_fields_cb (EBook *book, EBookStatus status, EList *fields, gpointer closure) { - ECard *card; - EBook *book; EContactEditor *ce; - AddressbookView *view = (AddressbookView *) user_data; + ECard *card; card = e_card_new(""); - gtk_object_get(GTK_OBJECT(view->view), - "book", &book, - NULL); - - g_assert (E_IS_BOOK (book)); - - ce = e_contact_editor_new (card, TRUE); + ce = e_contact_editor_new (card, TRUE, fields); gtk_signal_connect (GTK_OBJECT (ce), "add_card", GTK_SIGNAL_FUNC (add_card_cb), book); @@ -127,6 +119,21 @@ new_contact_cb (BonoboUIComponent *uih, void *user_data, const char *path) gtk_object_sink(GTK_OBJECT(card)); } +static void +new_contact_cb (BonoboUIComponent *uih, void *user_data, const char *path) +{ + EBook *book; + AddressbookView *view = (AddressbookView *) user_data; + + gtk_object_get(GTK_OBJECT(view->view), + "book", &book, + NULL); + + g_assert (E_IS_BOOK (book)); + + e_book_get_supported_fields (book, supported_fields_cb, view); +} + static void config_cb (BonoboUIComponent *uih, void *user_data, const char *path) { diff --git a/addressbook/gui/contact-editor/contact-editor.glade b/addressbook/gui/contact-editor/contact-editor.glade index ddcc058ab2..30f7feb1a5 100644 --- a/addressbook/gui/contact-editor/contact-editor.glade +++ b/addressbook/gui/contact-editor/contact-editor.glade @@ -1494,7 +1494,7 @@ GtkLabel - label34 + label-jobtitle True GTK_JUSTIFY_CENTER @@ -1691,7 +1691,7 @@ GtkLabel - label35 + label-company True GTK_JUSTIFY_CENTER @@ -1767,7 +1767,7 @@ GtkLabel - label21 + label-department True GTK_JUSTIFY_CENTER @@ -1795,7 +1795,7 @@ GtkLabel - label22 + label-office True GTK_JUSTIFY_CENTER @@ -1823,7 +1823,7 @@ GtkLabel - label23 + label-profession True GTK_JUSTIFY_CENTER @@ -1851,7 +1851,7 @@ GtkLabel - label24 + label-nickname True GTK_JUSTIFY_CENTER @@ -1879,7 +1879,7 @@ GtkLabel - label25 + label-spouse True GTK_JUSTIFY_CENTER @@ -1907,7 +1907,7 @@ GtkLabel - label31 + label-birthday True GTK_JUSTIFY_CENTER @@ -1934,7 +1934,7 @@ GtkLabel - label30 + label-assistant True GTK_JUSTIFY_CENTER @@ -1962,7 +1962,7 @@ GtkLabel - label29 + label-manager True GTK_JUSTIFY_CENTER @@ -1990,7 +1990,7 @@ GtkLabel - label32 + label-anniversary True GTK_JUSTIFY_CENTER @@ -2262,7 +2262,7 @@ GtkLabel - label33 + label-comments True GTK_JUSTIFY_CENTER diff --git a/addressbook/gui/contact-editor/e-contact-editor.c b/addressbook/gui/contact-editor/e-contact-editor.c index e65e9b9efb..006f1ba150 100644 --- a/addressbook/gui/contact-editor/e-contact-editor.c +++ b/addressbook/gui/contact-editor/e-contact-editor.c @@ -56,6 +56,7 @@ static GtkWidget *e_contact_editor_build_dialog(EContactEditor *editor, gchar *e static void _email_arrow_pressed (GtkWidget *widget, GdkEventButton *button, EContactEditor *editor); static void _phone_arrow_pressed (GtkWidget *widget, GdkEventButton *button, EContactEditor *editor); static void _address_arrow_pressed (GtkWidget *widget, GdkEventButton *button, EContactEditor *editor); +static void enable_writable_fields(EContactEditor *editor); static void fill_in_info(EContactEditor *editor); static void extract_info(EContactEditor *editor); static void set_fields(EContactEditor *editor); @@ -70,7 +71,8 @@ static guint contact_editor_signals[LAST_SIGNAL]; enum { ARG_0, ARG_CARD, - ARG_IS_NEW_CARD + ARG_IS_NEW_CARD, + ARG_WRITABLE_FIELDS }; enum { @@ -117,6 +119,8 @@ e_contact_editor_class_init (EContactEditorClass *klass) GTK_ARG_READWRITE, ARG_CARD); gtk_object_add_arg_type ("EContactEditor::is_new_card", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_IS_NEW_CARD); + gtk_object_add_arg_type ("EContactEditor::writable_fields", GTK_TYPE_POINTER, + GTK_ARG_READWRITE, ARG_WRITABLE_FIELDS); contact_editor_signals[ADD_CARD] = gtk_signal_new ("add_card", @@ -972,7 +976,10 @@ e_contact_editor_init (EContactEditor *e_contact_editor) void e_contact_editor_destroy (GtkObject *object) { EContactEditor *e_contact_editor = E_CONTACT_EDITOR(object); - + + if (e_contact_editor->writable_fields) { + gtk_object_unref(GTK_OBJECT(e_contact_editor->writable_fields)); + } if (e_contact_editor->email_list) { g_list_foreach(e_contact_editor->email_list, (GFunc) g_free, NULL); g_list_free(e_contact_editor->email_list); @@ -1018,7 +1025,7 @@ e_contact_editor_destroy (GtkObject *object) { } EContactEditor * -e_contact_editor_new (ECard *card, gboolean is_new_card) +e_contact_editor_new (ECard *card, gboolean is_new_card, EList *fields) { EContactEditor *ce; @@ -1027,6 +1034,7 @@ e_contact_editor_new (ECard *card, gboolean is_new_card) gtk_object_set (GTK_OBJECT (ce), "card", card, "is_new_card", is_new_card, + "writable_fields", fields, NULL); gtk_widget_show (ce->app); @@ -1054,6 +1062,12 @@ e_contact_editor_set_arg (GtkObject *o, GtkArg *arg, guint arg_id) case ARG_IS_NEW_CARD: editor->is_new_card = GTK_VALUE_BOOL (*arg) ? TRUE : FALSE; break; + + case ARG_WRITABLE_FIELDS: + editor->writable_fields = GTK_VALUE_POINTER (*arg); + gtk_object_ref (GTK_OBJECT (editor->writable_fields)); + enable_writable_fields (editor); + break; } } @@ -1164,6 +1178,99 @@ e_contact_editor_build_ui_info(GList *list, GnomeUIInfo **infop) *infop = info; } +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])); + } + } + if (editor->phone_info == NULL) { + e_contact_editor_build_ui_info(editor->phone_list, &editor->phone_info); + + if ( editor->phone_popup ) + gtk_widget_unref(editor->phone_popup); + + editor->phone_popup = gnome_popup_menu_new(editor->phone_info); + } +} + +static void +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])); + } + } + if (editor->email_info == NULL) { + e_contact_editor_build_ui_info(editor->email_list, &editor->email_info); + + if ( editor->email_popup ) + gtk_widget_unref(editor->email_popup); + + editor->email_popup = gnome_popup_menu_new(editor->email_info); + } +} + +static void +e_contact_editor_build_address_ui (EContactEditor *editor) +{ + int i; + + if (editor->address_list == NULL) { + static char *info[] = { + N_("Business"), + N_("Home"), + N_("Other") + }; + + for (i = 0; i < sizeof(info) / sizeof(info[0]); i++) { + editor->address_list = g_list_append(editor->address_list, g_strdup(info[i])); + } + } + if (editor->address_info == NULL) { + e_contact_editor_build_ui_info(editor->address_list, &editor->address_info); + + if ( editor->address_popup ) + gtk_widget_unref(editor->address_popup); + + editor->address_popup = gnome_popup_menu_new(editor->address_info); + } +} #if 0 static void _dialog_clicked(GtkWidget *dialog, gint button, EContactEditor *editor) @@ -1272,41 +1379,7 @@ _phone_arrow_pressed (GtkWidget *widget, GdkEventButton *button, EContactEditor label = g_strdup_printf("label-phone%d", which); entry = g_strdup_printf("entry-phone%d", which); - 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])); - } - } - if (editor->phone_info == NULL) { - e_contact_editor_build_ui_info(editor->phone_list, &editor->phone_info); - - if ( editor->phone_popup ) - gtk_widget_unref(editor->phone_popup); - - editor->phone_popup = gnome_popup_menu_new(editor->phone_info); - } + 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); @@ -1323,6 +1396,8 @@ _phone_arrow_pressed (GtkWidget *widget, GdkEventButton *button, EContactEditor if (result != -1) { editor->phone_choice[which - 1] = result; set_fields(editor); + gtk_widget_set_sensitive (glade_xml_get_widget (editor->gui, label), TRUE); + gtk_widget_set_sensitive (glade_xml_get_widget (editor->gui, entry), TRUE); } g_free(label); @@ -1334,26 +1409,9 @@ _email_arrow_pressed (GtkWidget *widget, GdkEventButton *button, EContactEditor { int i; int result; - 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])); - } - } - if (editor->email_info == NULL) { - e_contact_editor_build_ui_info(editor->email_list, &editor->email_info); - if ( editor->email_popup ) - gtk_widget_unref(editor->email_popup); - - editor->email_popup = gnome_popup_menu_new(editor->email_info); - } - + 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); gboolean checked; @@ -1369,6 +1427,11 @@ _email_arrow_pressed (GtkWidget *widget, GdkEventButton *button, EContactEditor if (result != -1) { editor->email_choice = result; set_fields(editor); + + /* make sure the buttons/entry is/are sensitive */ + gtk_widget_set_sensitive (glade_xml_get_widget (editor->gui, "label-email1"), TRUE); + gtk_widget_set_sensitive (glade_xml_get_widget (editor->gui, "entry-email1"), TRUE); + gtk_widget_set_sensitive (glade_xml_get_widget (editor->gui, "checkbutton-htmlmail"), TRUE); } } @@ -1377,26 +1440,9 @@ _address_arrow_pressed (GtkWidget *widget, GdkEventButton *button, EContactEdito { int i; int result; - if (editor->address_list == NULL) { - static char *info[] = { - N_("Business"), - N_("Home"), - N_("Other") - }; - - for (i = 0; i < sizeof(info) / sizeof(info[0]); i++) { - editor->address_list = g_list_append(editor->address_list, g_strdup(info[i])); - } - } - if (editor->address_info == NULL) { - e_contact_editor_build_ui_info(editor->address_list, &editor->address_info); - if ( editor->address_popup ) - gtk_widget_unref(editor->address_popup); - - editor->address_popup = gnome_popup_menu_new(editor->address_info); - } - + e_contact_editor_build_address_ui (editor); + for(i = 0; i < E_CARD_SIMPLE_ADDRESS_ID_LAST; i++) { const ECardAddrLabel *address = e_card_simple_get_address(editor->simple, i); gboolean checked; @@ -1411,6 +1457,11 @@ _address_arrow_pressed (GtkWidget *widget, GdkEventButton *button, EContactEdito if (result != -1) { set_address_field(editor, result); + + /* make sure the buttons/entry is/are sensitive */ + gtk_widget_set_sensitive (glade_xml_get_widget (editor->gui, "label-address"), TRUE); + gtk_widget_set_sensitive (glade_xml_get_widget (editor->gui, "button-fulladdr"), TRUE); + gtk_widget_set_sensitive (glade_xml_get_widget (editor->gui, "text-address"), TRUE); } } @@ -1600,6 +1651,173 @@ fill_in_single_field(EContactEditor *editor, char *name) } } +static void +disable_widget_foreach (char *key, GtkWidget *widget, gpointer closure) +{ + gtk_widget_set_sensitive (widget, FALSE); +} + +static struct { + char *widget_name; + ECardSimpleField field_id; +} widget_field_mappings[] = { + { "entry-web", E_CARD_SIMPLE_FIELD_URL }, + { "accellabel-web", E_CARD_SIMPLE_FIELD_URL }, + + { "entry-jobtitle", E_CARD_SIMPLE_FIELD_TITLE }, + { "label-jobtitle", E_CARD_SIMPLE_FIELD_TITLE }, + + { "entry-company", E_CARD_SIMPLE_FIELD_ORG }, + { "label-company", E_CARD_SIMPLE_FIELD_ORG }, + + { "combo-file-as", E_CARD_SIMPLE_FIELD_FILE_AS }, + { "entry-file-as", E_CARD_SIMPLE_FIELD_FILE_AS }, + { "accellabel-fileas", E_CARD_SIMPLE_FIELD_FILE_AS }, + + { "label-department", E_CARD_SIMPLE_FIELD_ORG_UNIT }, + { "entry-department", E_CARD_SIMPLE_FIELD_ORG_UNIT }, + + { "label-office", E_CARD_SIMPLE_FIELD_OFFICE }, + { "entry-office", E_CARD_SIMPLE_FIELD_OFFICE }, + + { "label-profession", E_CARD_SIMPLE_FIELD_ROLE }, + { "entry-profession", E_CARD_SIMPLE_FIELD_ROLE }, + + { "label-manager", E_CARD_SIMPLE_FIELD_MANAGER }, + { "entry-manager", E_CARD_SIMPLE_FIELD_MANAGER }, + + { "label-assistant", E_CARD_SIMPLE_FIELD_ASSISTANT }, + { "entry-assistant", E_CARD_SIMPLE_FIELD_ASSISTANT }, + + { "label-nickname", E_CARD_SIMPLE_FIELD_NICKNAME }, + { "entry-nickname", E_CARD_SIMPLE_FIELD_NICKNAME }, + + { "label-spouse", E_CARD_SIMPLE_FIELD_SPOUSE }, + { "entry-spouse", E_CARD_SIMPLE_FIELD_SPOUSE }, + + { "label-birthday", E_CARD_SIMPLE_FIELD_BIRTH_DATE }, + { "dateedit-birthday", E_CARD_SIMPLE_FIELD_BIRTH_DATE }, + + { "label-anniversary", E_CARD_SIMPLE_FIELD_ANNIVERSARY }, + { "dateedit-anniversary", E_CARD_SIMPLE_FIELD_ANNIVERSARY }, + + { "label-comments", E_CARD_SIMPLE_FIELD_NOTE }, + { "text-comments", E_CARD_SIMPLE_FIELD_NOTE }, + + { "button-fullname", E_CARD_SIMPLE_FIELD_FULL_NAME }, + { "entry-fullname", E_CARD_SIMPLE_FIELD_FULL_NAME } +}; +static int num_widget_field_mappings = sizeof(widget_field_mappings) / sizeof (widget_field_mappings[0]); + +static void +enable_writable_fields(EContactEditor *editor) +{ + EList *fields = editor->writable_fields; + EIterator *iter; + GHashTable *dropdown_hash, *supported_hash; + int i; + ECardSimple *card; + char *widget_name; + + if (!fields) + return; + + card = e_card_simple_new (e_card_new ("")); + + 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 ++) + g_hash_table_insert (dropdown_hash, + (char*)e_card_simple_get_ecard_field(card, e_card_simple_map_phone_to_field (i)), + editor->phone_info[i].widget); + e_contact_editor_build_email_ui (editor); + for (i = 0; i < E_CARD_SIMPLE_EMAIL_ID_LAST; i ++) + g_hash_table_insert (dropdown_hash, + (char*)e_card_simple_get_ecard_field(card, e_card_simple_map_email_to_field (i)), + editor->email_info[i].widget); + 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(card, e_card_simple_map_address_to_field (i)), + editor->address_info[i].widget); + + /* then disable them all */ + g_hash_table_foreach (dropdown_hash, (GHFunc)disable_widget_foreach, NULL); + + /* disable the label widgets for the dropdowns (4 phone, 1 + email and the toggle button, and 1 address and one for + the full adress button */ + for (i = 0; i < 4; i ++) { + widget_name = g_strdup_printf ("label-phone%d", i+1); + gtk_widget_set_sensitive (glade_xml_get_widget (editor->gui, widget_name), FALSE); + g_free (widget_name); + widget_name = g_strdup_printf ("entry-phone%d", i+1); + gtk_widget_set_sensitive (glade_xml_get_widget (editor->gui, widget_name), FALSE); + g_free (widget_name); + } + gtk_widget_set_sensitive (glade_xml_get_widget (editor->gui, "label-email1"), FALSE); + gtk_widget_set_sensitive (glade_xml_get_widget (editor->gui, "entry-email1"), FALSE); + gtk_widget_set_sensitive (glade_xml_get_widget (editor->gui, "checkbutton-htmlmail"), FALSE); + gtk_widget_set_sensitive (glade_xml_get_widget (editor->gui, "label-address"), FALSE); + gtk_widget_set_sensitive (glade_xml_get_widget (editor->gui, "button-fulladdr"), FALSE); + gtk_widget_set_sensitive (glade_xml_get_widget (editor->gui, "text-address"), FALSE); + + /* enable widgets that map directly from a field to a widget (the drop down items) */ + iter = e_list_get_iterator (fields); + for (; e_iterator_is_valid (iter); e_iterator_next (iter)) { + char *field = (char*)e_iterator_get (iter); + GtkWidget *widget = g_hash_table_lookup (dropdown_hash, field); + + if (widget) { + gtk_widget_set_sensitive (widget, TRUE); + } + else { + /* if it's not a field that's handled by the + dropdown items, add it to the has to be + used in the second step */ + g_hash_table_insert (supported_hash, field, field); + } + + /* 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 (card, e_card_simple_map_email_to_field(editor->email_choice)))) { + gtk_widget_set_sensitive (glade_xml_get_widget (editor->gui, "label-email1"), TRUE); + gtk_widget_set_sensitive (glade_xml_get_widget (editor->gui, "entry-email1"), TRUE); + gtk_widget_set_sensitive (glade_xml_get_widget (editor->gui, "checkbutton-htmlmail"), TRUE); + } + else if (!strcmp (field, e_card_simple_get_ecard_field (card, e_card_simple_map_address_to_field(editor->address_choice)))) { + gtk_widget_set_sensitive (glade_xml_get_widget (editor->gui, "label-address"), TRUE); + gtk_widget_set_sensitive (glade_xml_get_widget (editor->gui, "button-fulladdr"), TRUE); + gtk_widget_set_sensitive (glade_xml_get_widget (editor->gui, "text-address"), TRUE); + } + else for (i = 0; i < 4; i ++) { + if (!strcmp (field, e_card_simple_get_ecard_field (card, e_card_simple_map_phone_to_field(editor->phone_choice[i])))) { + widget_name = g_strdup_printf ("label-phone%d", i+1); + gtk_widget_set_sensitive (glade_xml_get_widget (editor->gui, widget_name), TRUE); + g_free (widget_name); + widget_name = g_strdup_printf ("entry-phone%d", i+1); + gtk_widget_set_sensitive (glade_xml_get_widget (editor->gui, widget_name), TRUE); + g_free (widget_name); + } + } + } + + /* handle the label next to the dropdown widgets */ + + for (i = 0; i < num_widget_field_mappings; i ++) { + gboolean enabled = g_hash_table_lookup (supported_hash, + e_card_simple_get_ecard_field (card, + widget_field_mappings[i].field_id)) != NULL; + gtk_widget_set_sensitive (glade_xml_get_widget(editor->gui, + widget_field_mappings[i].widget_name), enabled); + } +} + static void fill_in_info(EContactEditor *editor) { diff --git a/addressbook/gui/contact-editor/e-contact-editor.h b/addressbook/gui/contact-editor/e-contact-editor.h index a2067b1a88..ef2b1238df 100644 --- a/addressbook/gui/contact-editor/e-contact-editor.h +++ b/addressbook/gui/contact-editor/e-contact-editor.h @@ -85,6 +85,8 @@ struct _EContactEditor /* Whether we are editing a new card or an existing one */ guint is_new_card : 1; + + EList *writable_fields; }; struct _EContactEditorClass @@ -100,7 +102,8 @@ struct _EContactEditorClass }; EContactEditor *e_contact_editor_new (ECard *card, - gboolean is_new_card); + gboolean is_new_card, + EList *writable_fields); GtkType e_contact_editor_get_type (void); void e_contact_editor_raise (EContactEditor *editor); diff --git a/addressbook/gui/contact-editor/test-editor.c b/addressbook/gui/contact-editor/test-editor.c index 80db2fe848..e9060b3e25 100644 --- a/addressbook/gui/contact-editor/test-editor.c +++ b/addressbook/gui/contact-editor/test-editor.c @@ -127,11 +127,11 @@ int main( int argc, char *argv[] ) if (cardstr == NULL) cardstr = TEST_VCARD; - ce = e_contact_editor_new (e_card_new (cardstr), TRUE); + ce = e_contact_editor_new (e_card_new (cardstr), TRUE, NULL); gtk_signal_connect (GTK_OBJECT (ce), "editor_closed", GTK_SIGNAL_FUNC (editor_closed_cb), NULL); - ce = e_contact_editor_new (e_card_new (cardstr), TRUE); + ce = e_contact_editor_new (e_card_new (cardstr), TRUE, NULL); gtk_signal_connect (GTK_OBJECT (ce), "editor_closed", GTK_SIGNAL_FUNC (editor_closed_cb), NULL); diff --git a/addressbook/gui/widgets/e-addressbook-view.c b/addressbook/gui/widgets/e-addressbook-view.c index 24070181f3..bc22ff65d6 100644 --- a/addressbook/gui/widgets/e-addressbook-view.c +++ b/addressbook/gui/widgets/e-addressbook-view.c @@ -391,6 +391,25 @@ editor_closed_cb (EContactEditor *ce, gpointer data) gtk_object_unref (GTK_OBJECT (ce)); } +static void +supported_fields_cb (EBook *book, EBookStatus status, EList *fields, ECard *card) +{ + EContactEditor *ce; + + ce = e_contact_editor_new (card, FALSE, fields); + + gtk_signal_connect (GTK_OBJECT (ce), "add_card", + GTK_SIGNAL_FUNC (add_card_cb), book); + gtk_signal_connect (GTK_OBJECT (ce), "commit_card", + GTK_SIGNAL_FUNC (commit_card_cb), book); + gtk_signal_connect (GTK_OBJECT (ce), "delete_card", + GTK_SIGNAL_FUNC (delete_card_cb), book); + gtk_signal_connect (GTK_OBJECT (ce), "editor_closed", + GTK_SIGNAL_FUNC (editor_closed_cb), NULL); + + gtk_object_unref(GTK_OBJECT(card)); +} + static void table_double_click(ETableScrolled *table, gint row, EAddressbookView *view) { @@ -398,7 +417,6 @@ table_double_click(ETableScrolled *table, gint row, EAddressbookView *view) EAddressbookModel *model = E_ADDRESSBOOK_MODEL(view->object); ECard *card = e_addressbook_model_get_card(model, row); EBook *book; - EContactEditor *ce; gtk_object_get(GTK_OBJECT(model), "book", &book, @@ -406,18 +424,7 @@ table_double_click(ETableScrolled *table, gint row, EAddressbookView *view) g_assert (E_IS_BOOK (book)); - ce = e_contact_editor_new (card, FALSE); - - gtk_signal_connect (GTK_OBJECT (ce), "add_card", - GTK_SIGNAL_FUNC (add_card_cb), book); - gtk_signal_connect (GTK_OBJECT (ce), "commit_card", - GTK_SIGNAL_FUNC (commit_card_cb), book); - gtk_signal_connect (GTK_OBJECT (ce), "delete_card", - GTK_SIGNAL_FUNC (delete_card_cb), book); - gtk_signal_connect (GTK_OBJECT (ce), "editor_closed", - GTK_SIGNAL_FUNC (editor_closed_cb), NULL); - - gtk_object_unref(GTK_OBJECT(card)); + e_book_get_supported_fields (book, (EBookFieldsCallback)supported_fields_cb, card); } } diff --git a/addressbook/gui/widgets/e-minicard-view.c b/addressbook/gui/widgets/e-minicard-view.c index 3e3b1ceaf0..e503d54d1f 100644 --- a/addressbook/gui/widgets/e-minicard-view.c +++ b/addressbook/gui/widgets/e-minicard-view.c @@ -401,6 +401,26 @@ editor_closed_cb (EContactEditor *ce, gpointer data) gtk_object_unref (GTK_OBJECT (ce)); } +static void +supported_fields_cb (EBook *book, EBookStatus status, EList *fields, EMinicard *e_minicard) +{ + ECard *card; + EContactEditor *ce; + + card = e_card_new(""); + + ce = e_contact_editor_new (card, TRUE, fields); + + gtk_signal_connect (GTK_OBJECT (ce), "add_card", + GTK_SIGNAL_FUNC (add_card_cb), book); + gtk_signal_connect (GTK_OBJECT (ce), "commit_card", + GTK_SIGNAL_FUNC (commit_card_cb), book); + gtk_signal_connect (GTK_OBJECT (ce), "editor_closed", + GTK_SIGNAL_FUNC (editor_closed_cb), NULL); + + gtk_object_sink(GTK_OBJECT(card)); +} + static gboolean e_minicard_view_event (GnomeCanvasItem *item, GdkEvent *event) { @@ -412,25 +432,15 @@ e_minicard_view_event (GnomeCanvasItem *item, GdkEvent *event) case GDK_2BUTTON_PRESS: if (((GdkEventButton *)event)->button == 1) { - ECard *card; - EContactEditor *ce; EBook *book; - card = e_card_new(""); - gtk_object_get(GTK_OBJECT(view), "book", &book, NULL); - g_assert (E_IS_BOOK (book)); - - ce = e_contact_editor_new (card, TRUE); - gtk_signal_connect (GTK_OBJECT (ce), "add_card", - GTK_SIGNAL_FUNC (add_card_cb), book); - gtk_signal_connect (GTK_OBJECT (ce), "commit_card", - GTK_SIGNAL_FUNC (commit_card_cb), book); - gtk_signal_connect (GTK_OBJECT (ce), "editor_closed", - GTK_SIGNAL_FUNC (editor_closed_cb), NULL); + g_assert (E_IS_BOOK (book)); - gtk_object_sink(GTK_OBJECT(card)); + e_book_get_supported_fields (book, + (EBookFieldsCallback)supported_fields_cb, + NULL); } return TRUE; default: diff --git a/addressbook/gui/widgets/e-minicard.c b/addressbook/gui/widgets/e-minicard.c index 6208f1f23f..22566ec749 100644 --- a/addressbook/gui/widgets/e-minicard.c +++ b/addressbook/gui/widgets/e-minicard.c @@ -557,6 +557,24 @@ editor_closed_cb (EContactEditor *ce, gpointer data) minicard->editor = NULL; } +static void +supported_fields_cb (EBook *book, EBookStatus status, EList *fields, EMinicard *e_minicard) +{ + e_minicard->editor = e_contact_editor_new (e_minicard->card, FALSE, fields); + + if (book != NULL) { + gtk_signal_connect (GTK_OBJECT (e_minicard->editor), "add_card", + GTK_SIGNAL_FUNC (add_card_cb), book); + gtk_signal_connect (GTK_OBJECT (e_minicard->editor), "commit_card", + GTK_SIGNAL_FUNC (commit_card_cb), book); + gtk_signal_connect (GTK_OBJECT (e_minicard->editor), "delete_card", + GTK_SIGNAL_FUNC (delete_card_cb), book); + } + + gtk_signal_connect (GTK_OBJECT (e_minicard->editor), "editor_closed", + GTK_SIGNAL_FUNC (editor_closed_cb), e_minicard); +} + static gboolean e_minicard_event (GnomeCanvasItem *item, GdkEvent *event) { @@ -641,19 +659,12 @@ e_minicard_event (GnomeCanvasItem *item, GdkEvent *event) "book", &book, NULL); } - e_minicard->editor = e_contact_editor_new (e_minicard->card, FALSE); if (book != NULL) { - gtk_signal_connect (GTK_OBJECT (e_minicard->editor), "add_card", - GTK_SIGNAL_FUNC (add_card_cb), book); - gtk_signal_connect (GTK_OBJECT (e_minicard->editor), "commit_card", - GTK_SIGNAL_FUNC (commit_card_cb), book); - gtk_signal_connect (GTK_OBJECT (e_minicard->editor), "delete_card", - GTK_SIGNAL_FUNC (delete_card_cb), book); + e_book_get_supported_fields (book, + (EBookFieldsCallback)supported_fields_cb, + e_minicard); } - - gtk_signal_connect (GTK_OBJECT (e_minicard->editor), "editor_closed", - GTK_SIGNAL_FUNC (editor_closed_cb), e_minicard); } return TRUE; } -- cgit v1.2.3