diff options
Diffstat (limited to 'addressbook/gui/contact-editor/e-contact-editor.c')
-rw-r--r-- | addressbook/gui/contact-editor/e-contact-editor.c | 1053 |
1 files changed, 583 insertions, 470 deletions
diff --git a/addressbook/gui/contact-editor/e-contact-editor.c b/addressbook/gui/contact-editor/e-contact-editor.c index 3af7fa3ab6..8d6a5782d1 100644 --- a/addressbook/gui/contact-editor/e-contact-editor.c +++ b/addressbook/gui/contact-editor/e-contact-editor.c @@ -27,21 +27,20 @@ #include <gtk/gtkcheckbutton.h> #include <gtk/gtkcheckmenuitem.h> #include <gtk/gtkcombo.h> -#include <gtk/gtktextview.h> -#include <gtk/gtkmessagedialog.h> -#include <gtk/gtkstock.h> -#include <gtk/gtkentry.h> -#include <gtk/gtklabel.h> +#include <gtk/gtktext.h> #include <libgnomeui/gnome-popup-menu.h> +#include <libgnomeui/gnome-dialog-util.h> #include <libgnomeui/gnome-window-icon.h> +#include <libgnomeui/gnome-stock.h> #include <libgnome/gnome-i18n.h> #include <bonobo/bonobo-ui-container.h> #include <bonobo/bonobo-ui-util.h> -#include <bonobo/bonobo-window.h> #include <gdk-pixbuf/gdk-pixbuf.h> +#include <gdk-pixbuf/gnome-canvas-pixbuf.h> #include <gal/widgets/e-categories.h> #include <gal/widgets/e-gui-utils.h> +#include <gal/widgets/e-unicode.h> #include <gal/e-text/e-entry.h> #include <e-util/e-categories-master-list-wombat.h> @@ -57,7 +56,6 @@ #include "e-contact-editor-address.h" #include "e-contact-editor-fullname.h" -#include "e-contact-editor-marshal.h" #include "e-contact-save-as.h" /* Signal IDs */ @@ -71,9 +69,9 @@ enum { static void e_contact_editor_init (EContactEditor *card); static void e_contact_editor_class_init (EContactEditorClass *klass); -static void e_contact_editor_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); -static void e_contact_editor_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); -static void e_contact_editor_dispose (GObject *object); +static void e_contact_editor_set_arg (GtkObject *o, GtkArg *arg, guint arg_id); +static void e_contact_editor_get_arg (GtkObject *object, GtkArg *arg, guint arg_id); +static void e_contact_editor_destroy (GtkObject *object); #if 0 static GtkWidget *e_contact_editor_build_dialog(EContactEditor *editor, gchar *entry_id, gchar *label_id, gchar *title, GList **list, GnomeUIInfo **info); @@ -100,13 +98,13 @@ static guint contact_editor_signals[LAST_SIGNAL]; /* The arguments we take */ enum { - PROP_0, - PROP_BOOK, - PROP_CARD, - PROP_IS_NEW_CARD, - PROP_EDITABLE, - PROP_CHANGED, - PROP_WRITABLE_FIELDS + ARG_0, + ARG_BOOK, + ARG_CARD, + ARG_IS_NEW_CARD, + ARG_EDITABLE, + ARG_CHANGED, + ARG_WRITABLE_FIELDS }; enum { @@ -117,125 +115,115 @@ enum { static GSList *all_contact_editors = NULL; -GType +GtkType e_contact_editor_get_type (void) { - static GType contact_editor_type = 0; - - if (!contact_editor_type) { - static const GTypeInfo contact_editor_info = { - sizeof (EContactEditorClass), - NULL, /* base_init */ - NULL, /* base_finalize */ - (GClassInitFunc) e_contact_editor_class_init, - NULL, /* class_finalize */ - NULL, /* class_data */ - sizeof (EContactEditor), - 0, /* n_preallocs */ - (GInstanceInitFunc) e_contact_editor_init, - }; + static GtkType contact_editor_type = 0; - contact_editor_type = g_type_register_static (GTK_TYPE_OBJECT, "EContactEditor", &contact_editor_info, 0); - } + if (!contact_editor_type) + { + static const GtkTypeInfo contact_editor_info = + { + "EContactEditor", + sizeof (EContactEditor), + sizeof (EContactEditorClass), + (GtkClassInitFunc) e_contact_editor_class_init, + (GtkObjectInitFunc) e_contact_editor_init, + /* reserved_1 */ NULL, + /* reserved_2 */ NULL, + (GtkClassInitFunc) NULL, + }; + + contact_editor_type = gtk_type_unique (GTK_TYPE_OBJECT, &contact_editor_info); + } + + return contact_editor_type; +} - return contact_editor_type; +typedef void (*GtkSignal_NONE__INT_OBJECT) (GtkObject * object, + gint arg1, + GtkObject *arg2, + gpointer user_data); + +static void +e_marshal_NONE__INT_OBJECT (GtkObject * object, + GtkSignalFunc func, + gpointer func_data, GtkArg * args) +{ + GtkSignal_NONE__INT_OBJECT rfunc; + rfunc = (GtkSignal_NONE__INT_OBJECT) func; + (*rfunc) (object, + GTK_VALUE_INT (args[0]), + GTK_VALUE_OBJECT (args[1]), + func_data); } static void e_contact_editor_class_init (EContactEditorClass *klass) { - GObjectClass *object_class = G_OBJECT_CLASS (klass); - - parent_class = g_type_class_ref (GTK_TYPE_OBJECT); - - object_class->set_property = e_contact_editor_set_property; - object_class->get_property = e_contact_editor_get_property; - object_class->dispose = e_contact_editor_dispose; - - g_object_class_install_property (object_class, PROP_BOOK, - g_param_spec_object ("book", - _("Book"), - /*_( */"XXX blurb" /*)*/, - E_TYPE_BOOK, - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, PROP_CARD, - g_param_spec_object ("card", - _("Card"), - /*_( */"XXX blurb" /*)*/, - E_TYPE_CARD, - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, PROP_IS_NEW_CARD, - g_param_spec_boolean ("is_new_card", - _("Is New Card"), - /*_( */"XXX blurb" /*)*/, - FALSE, - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, PROP_WRITABLE_FIELDS, - g_param_spec_object ("writable_fields", - _("Writable Fields"), - /*_( */"XXX blurb" /*)*/, - E_TYPE_LIST, - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, PROP_EDITABLE, - g_param_spec_boolean ("editable", - _("Editable"), - /*_( */"XXX blurb" /*)*/, - FALSE, - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, PROP_CHANGED, - g_param_spec_boolean ("changed", - _("Changed"), - /*_( */"XXX blurb" /*)*/, - FALSE, - G_PARAM_READWRITE)); + GtkObjectClass *object_class; + + object_class = (GtkObjectClass*) klass; + + parent_class = gtk_type_class (GTK_TYPE_OBJECT); + + gtk_object_add_arg_type ("EContactEditor::book", GTK_TYPE_OBJECT, + GTK_ARG_READWRITE, ARG_BOOK); + gtk_object_add_arg_type ("EContactEditor::card", GTK_TYPE_OBJECT, + 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); + gtk_object_add_arg_type ("EContactEditor::editable", GTK_TYPE_BOOL, + GTK_ARG_READWRITE, ARG_EDITABLE); + gtk_object_add_arg_type ("EContactEditor::changed", GTK_TYPE_BOOL, + GTK_ARG_READWRITE, ARG_CHANGED); contact_editor_signals[CARD_ADDED] = - g_signal_new ("card_added", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (EContactEditorClass, card_added), - NULL, NULL, - ece_marshal_NONE__INT_OBJECT, - G_TYPE_NONE, 2, - G_TYPE_INT, G_TYPE_OBJECT); + gtk_signal_new ("card_added", + GTK_RUN_FIRST, + object_class->type, + GTK_SIGNAL_OFFSET (EContactEditorClass, card_added), + e_marshal_NONE__INT_OBJECT, + GTK_TYPE_NONE, 2, + GTK_TYPE_INT, GTK_TYPE_OBJECT); contact_editor_signals[CARD_MODIFIED] = - g_signal_new ("card_modified", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (EContactEditorClass, card_modified), - NULL, NULL, - ece_marshal_NONE__INT_OBJECT, - G_TYPE_NONE, 2, - G_TYPE_INT, G_TYPE_OBJECT); + gtk_signal_new ("card_modified", + GTK_RUN_FIRST, + object_class->type, + GTK_SIGNAL_OFFSET (EContactEditorClass, card_modified), + e_marshal_NONE__INT_OBJECT, + GTK_TYPE_NONE, 2, + GTK_TYPE_INT, GTK_TYPE_OBJECT); contact_editor_signals[CARD_DELETED] = - g_signal_new ("card_deleted", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (EContactEditorClass, card_deleted), - NULL, NULL, - ece_marshal_NONE__INT_OBJECT, - G_TYPE_NONE, 2, - G_TYPE_INT, G_TYPE_OBJECT); + gtk_signal_new ("card_deleted", + GTK_RUN_FIRST, + object_class->type, + GTK_SIGNAL_OFFSET (EContactEditorClass, card_deleted), + e_marshal_NONE__INT_OBJECT, + GTK_TYPE_NONE, 2, + GTK_TYPE_INT, GTK_TYPE_OBJECT); contact_editor_signals[EDITOR_CLOSED] = - g_signal_new ("editor_closed", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (EContactEditorClass, editor_closed), - NULL, NULL, - ece_marshal_NONE__NONE, - G_TYPE_NONE, 0); + gtk_signal_new ("editor_closed", + GTK_RUN_FIRST, + object_class->type, + GTK_SIGNAL_OFFSET (EContactEditorClass, editor_closed), + gtk_marshal_NONE__NONE, + GTK_TYPE_NONE, 0); + + gtk_object_class_add_signals (object_class, contact_editor_signals, LAST_SIGNAL); + + object_class->set_arg = e_contact_editor_set_arg; + object_class->get_arg = e_contact_editor_get_arg; + object_class->destroy = e_contact_editor_destroy; } static void -_replace_button(EContactEditor *editor, gchar *button_xml, gchar *image, GCallback func) +_replace_button(EContactEditor *editor, gchar *button_xml, gchar *image, GtkSignalFunc func) { GladeXML *gui = editor->gui; GtkWidget *button = glade_xml_get_widget(gui, button_xml); @@ -248,29 +236,29 @@ _replace_button(EContactEditor *editor, gchar *button_xml, gchar *image, GCallba pixmap); g_free(image_temp); gtk_widget_show(pixmap); - g_signal_connect(button, "button_press_event", func, editor); + gtk_signal_connect(GTK_OBJECT(button), "button_press_event", func, editor); } } static void _replace_buttons(EContactEditor *editor) { - _replace_button(editor, "button-phone1", "arrow.png", G_CALLBACK (_phone_arrow_pressed)); - _replace_button(editor, "button-phone2", "arrow.png", G_CALLBACK (_phone_arrow_pressed)); - _replace_button(editor, "button-phone3", "arrow.png", G_CALLBACK (_phone_arrow_pressed)); - _replace_button(editor, "button-phone4", "arrow.png", G_CALLBACK (_phone_arrow_pressed)); - _replace_button(editor, "button-address", "arrow.png", G_CALLBACK (_address_arrow_pressed)); - _replace_button(editor, "button-email1", "arrow.png", G_CALLBACK (_email_arrow_pressed)); + _replace_button(editor, "button-phone1", "arrow.png", _phone_arrow_pressed); + _replace_button(editor, "button-phone2", "arrow.png", _phone_arrow_pressed); + _replace_button(editor, "button-phone3", "arrow.png", _phone_arrow_pressed); + _replace_button(editor, "button-phone4", "arrow.png", _phone_arrow_pressed); + _replace_button(editor, "button-address", "arrow.png", _address_arrow_pressed); + _replace_button(editor, "button-email1", "arrow.png", _email_arrow_pressed); } static void wants_html_changed (GtkWidget *widget, EContactEditor *editor) { gboolean wants_html; - g_object_get (widget, + gtk_object_get(GTK_OBJECT(widget), "active", &wants_html, NULL); - g_object_set (editor->card, + gtk_object_set(GTK_OBJECT(editor->card), "wants_html", wants_html, NULL); @@ -295,7 +283,7 @@ phone_entry_changed (GtkWidget *widget, EContactEditor *editor) } else return; phone = e_card_phone_new(); - phone->number = g_strdup (gtk_entry_get_text(entry)); + phone->number = e_utf8_gtk_entry_get_text(entry); e_card_simple_set_phone(editor->simple, editor->phone_choice[which - 1], phone); e_card_phone_unref(phone); set_fields(editor); @@ -306,21 +294,23 @@ phone_entry_changed (GtkWidget *widget, EContactEditor *editor) static void email_entry_changed (GtkWidget *widget, EContactEditor *editor) { - const gchar *string; + gchar *string; GtkEntry *entry = GTK_ENTRY(widget); - string = gtk_entry_get_text(entry); + string = e_utf8_gtk_entry_get_text(entry); e_card_simple_set_email(editor->simple, editor->email_choice, string); + g_free (string); + widget_changed (widget, editor); } static void -address_text_changed (GtkTextBuffer *buffer, EContactEditor *editor) +address_text_changed (GtkWidget *widget, EContactEditor *editor) { + GtkEditable *editable = GTK_EDITABLE(widget); ECardAddrLabel *address; - GtkTextIter start_iter, end_iter; if (editor->address_choice == -1) return; @@ -334,27 +324,18 @@ address_text_changed (GtkTextBuffer *buffer, EContactEditor *editor) check = glade_xml_get_widget(editor->gui, "checkbutton-mailingaddress"); if (check && GTK_IS_CHECK_BUTTON (check)) { - g_signal_handlers_block_matched (check, - G_SIGNAL_MATCH_DATA, - 0, 0, - NULL, NULL, editor); + gtk_signal_handler_block_by_data (GTK_OBJECT (check), editor); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check), TRUE); - g_signal_handlers_unblock_matched (check, - G_SIGNAL_MATCH_DATA, - 0, 0, - NULL, NULL, editor); + gtk_signal_handler_unblock_by_data (GTK_OBJECT (check), editor); } } - gtk_text_buffer_get_start_iter (GTK_TEXT_BUFFER (buffer), &start_iter); - gtk_text_buffer_get_end_iter (GTK_TEXT_BUFFER (buffer), &end_iter); - - address->data = gtk_text_buffer_get_text (GTK_TEXT_BUFFER (buffer), &start_iter, &end_iter, FALSE); + address->data = e_utf8_gtk_editable_get_chars(editable, 0, -1); e_card_simple_set_address(editor->simple, editor->address_choice, address); e_card_address_label_unref(address); - widget_changed (NULL, editor); + widget_changed (widget, editor); } @@ -372,9 +353,7 @@ address_mailing_changed (GtkWidget *widget, EContactEditor *editor) /* Mark the current address as the mailing address */ text = glade_xml_get_widget(editor->gui, "text-address"); - if (text && GTK_IS_TEXT_VIEW(text)) { - GtkTextBuffer *buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text)); - GtkTextIter start_iter, end_iter; + if (text && GTK_IS_TEXT(text)) { address = e_card_address_label_new(); @@ -382,12 +361,8 @@ address_mailing_changed (GtkWidget *widget, EContactEditor *editor) address->flags |= E_CARD_ADDR_DEFAULT; else address->flags &= ~E_CARD_ADDR_DEFAULT; - - gtk_text_buffer_get_start_iter (GTK_TEXT_BUFFER (buffer), &start_iter); - gtk_text_buffer_get_end_iter (GTK_TEXT_BUFFER (buffer), &end_iter); - - address->data = gtk_text_buffer_get_text (buffer, &start_iter, &end_iter, FALSE); - + address->data = e_utf8_gtk_editable_get_chars(GTK_EDITABLE (text), 0, -1); + e_card_simple_set_address(editor->simple, editor->address_choice, address); e_card_address_label_unref(address); } @@ -509,7 +484,7 @@ file_as_get_style (EContactEditor *editor) if (!(file_as && GTK_IS_ENTRY(file_as))) return -1; - filestring = g_strdup (gtk_entry_get_text(file_as)); + filestring = e_utf8_gtk_entry_get_text(file_as); style = -1; for (i = 0; i < 5; i++) { @@ -539,7 +514,7 @@ file_as_set_style(EContactEditor *editor, int style) return; if (style == -1) { - string = g_strdup (gtk_entry_get_text(file_as)); + string = e_utf8_gtk_entry_get_text(file_as); strings = g_list_append(strings, string); } @@ -549,7 +524,9 @@ file_as_set_style(EContactEditor *editor, int style) if (style_makes_sense(editor->name, editor->company, i)) { char *u; u = name_to_style(editor->name, editor->company, i); - if (u) strings = g_list_append(strings, u); + string = e_utf8_to_gtk_string (widget, u); + g_free (u); + if (string) strings = g_list_append(strings, string); } } @@ -562,7 +539,7 @@ file_as_set_style(EContactEditor *editor, int style) if (style != -1) { string = name_to_style(editor->name, editor->company, style); - gtk_entry_set_text(file_as, string); + e_utf8_gtk_entry_set_text(file_as, string); g_free(string); } } @@ -571,14 +548,15 @@ static void name_entry_changed (GtkWidget *widget, EContactEditor *editor) { int style = 0; - const char *string; + char *string; style = file_as_get_style(editor); e_card_name_unref(editor->name); - string = gtk_entry_get_text (GTK_ENTRY(widget)); + string = e_utf8_gtk_entry_get_text (GTK_ENTRY(widget)); editor->name = e_card_name_from_string(string); + g_free (string); file_as_set_style(editor, style); @@ -594,7 +572,7 @@ company_entry_changed (GtkWidget *widget, EContactEditor *editor) g_free(editor->company); - editor->company = g_strdup (gtk_entry_get_text(GTK_ENTRY(widget))); + editor->company = e_utf8_gtk_entry_get_text(GTK_ENTRY(widget)); file_as_set_style(editor, style); @@ -615,8 +593,8 @@ set_entry_changed_signal_phone(EContactEditor *editor, char *id) { GtkWidget *widget = glade_xml_get_widget(editor->gui, id); if (widget && GTK_IS_ENTRY(widget)) - g_signal_connect(widget, "changed", - G_CALLBACK (phone_entry_changed), editor); + gtk_signal_connect(GTK_OBJECT(widget), "changed", + phone_entry_changed, editor); } static void @@ -638,8 +616,8 @@ set_entry_changed_signal_field(EContactEditor *editor, char *id) { GtkWidget *widget = glade_xml_get_widget(editor->gui, id); if (widget && GTK_IS_ENTRY(widget)) - g_signal_connect(widget, "changed", - G_CALLBACK (field_changed), editor); + gtk_signal_connect(GTK_OBJECT(widget), "changed", + field_changed, editor); } static void @@ -650,81 +628,122 @@ set_entry_changed_signals(EContactEditor *editor) set_entry_changed_signal_phone(editor, "entry-phone2"); set_entry_changed_signal_phone(editor, "entry-phone3"); set_entry_changed_signal_phone(editor, "entry-phone4"); - - set_entry_changed_signal_field(editor, "entry-email1"); - + widget = glade_xml_get_widget(editor->gui, "entry-email1"); + if (widget && GTK_IS_ENTRY(widget)) { + gtk_signal_connect(GTK_OBJECT(widget), "changed", + email_entry_changed, editor); + } widget = glade_xml_get_widget(editor->gui, "text-address"); - if (widget && GTK_IS_TEXT_VIEW(widget)) { - GtkTextBuffer *buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (widget)); - g_signal_connect(buffer, "changed", - G_CALLBACK (address_text_changed), editor); + if (widget && GTK_IS_TEXT(widget)) { + gtk_signal_connect(GTK_OBJECT(widget), "changed", + address_text_changed, editor); } - widget = glade_xml_get_widget(editor->gui, "entry-fullname"); if (widget && GTK_IS_ENTRY(widget)) { - g_signal_connect (widget, "changed", - G_CALLBACK (name_entry_changed), editor); + gtk_signal_connect(GTK_OBJECT(widget), "changed", + name_entry_changed, editor); } - widget = glade_xml_get_widget(editor->gui, "entry-company"); if (widget && GTK_IS_ENTRY(widget)) { - g_signal_connect (widget, "changed", - G_CALLBACK (company_entry_changed), editor); - } - - set_entry_changed_signal_field(editor, "entry-web"); - set_entry_changed_signal_field(editor, "entry-categories"); - set_entry_changed_signal_field(editor, "entry-jobtitle"); - set_entry_changed_signal_field(editor, "entry-file-as"); - set_entry_changed_signal_field(editor, "entry-manager"); - set_entry_changed_signal_field(editor, "entry-assistant"); - set_entry_changed_signal_field(editor, "entry-office"); - set_entry_changed_signal_field(editor, "entry-department"); - set_entry_changed_signal_field(editor, "entry-profession"); - set_entry_changed_signal_field(editor, "entry-nickname"); - set_entry_changed_signal_field(editor, "entry-spouse"); - + gtk_signal_connect(GTK_OBJECT(widget), "changed", + company_entry_changed, editor); + } + widget = glade_xml_get_widget(editor->gui, "entry-web"); + if (widget && GTK_IS_ENTRY(widget)) { + gtk_signal_connect(GTK_OBJECT(widget), "changed", + widget_changed, editor); + } + widget = glade_xml_get_widget(editor->gui, "entry-categories"); + if (widget && GTK_IS_ENTRY(widget)) { + gtk_signal_connect(GTK_OBJECT(widget), "changed", + widget_changed, editor); + } + widget = glade_xml_get_widget(editor->gui, "entry-jobtitle"); + if (widget && GTK_IS_ENTRY(widget)) { + gtk_signal_connect(GTK_OBJECT(widget), "changed", + widget_changed, editor); + } + widget = glade_xml_get_widget(editor->gui, "entry-file-as"); + if (widget && GTK_IS_ENTRY(widget)) { + gtk_signal_connect(GTK_OBJECT(widget), "changed", + widget_changed, editor); + } + widget = glade_xml_get_widget(editor->gui, "entry-manager"); + if (widget && GTK_IS_ENTRY(widget)) { + gtk_signal_connect(GTK_OBJECT(widget), "changed", + widget_changed, editor); + } + widget = glade_xml_get_widget(editor->gui, "entry-assistant"); + if (widget && GTK_IS_ENTRY(widget)) { + gtk_signal_connect(GTK_OBJECT(widget), "changed", + widget_changed, editor); + } + widget = glade_xml_get_widget(editor->gui, "entry-office"); + if (widget && GTK_IS_ENTRY(widget)) { + gtk_signal_connect(GTK_OBJECT(widget), "changed", + widget_changed, editor); + } + widget = glade_xml_get_widget(editor->gui, "entry-department"); + if (widget && GTK_IS_ENTRY(widget)) { + gtk_signal_connect(GTK_OBJECT(widget), "changed", + widget_changed, editor); + } + widget = glade_xml_get_widget(editor->gui, "entry-profession"); + if (widget && GTK_IS_ENTRY(widget)) { + gtk_signal_connect(GTK_OBJECT(widget), "changed", + widget_changed, editor); + } + widget = glade_xml_get_widget(editor->gui, "entry-nickname"); + if (widget && GTK_IS_ENTRY(widget)) { + gtk_signal_connect(GTK_OBJECT(widget), "changed", + widget_changed, editor); + } + widget = glade_xml_get_widget(editor->gui, "entry-spouse"); + if (widget && GTK_IS_ENTRY(widget)) { + gtk_signal_connect(GTK_OBJECT(widget), "changed", + widget_changed, editor); + } widget = glade_xml_get_widget(editor->gui, "text-comments"); - if (widget && GTK_IS_TEXT_VIEW(widget)) { - GtkTextBuffer *buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (widget)); - g_signal_connect (buffer, "changed", - G_CALLBACK (widget_changed), editor); + if (widget && GTK_IS_TEXT(widget)) { + gtk_signal_connect(GTK_OBJECT(widget), "changed", + widget_changed, editor); } widget = glade_xml_get_widget(editor->gui, "dateedit-birthday"); if (widget && E_IS_DATE_EDIT(widget)) { - g_signal_connect (widget, "changed", - G_CALLBACK (widget_changed), editor); + gtk_signal_connect(GTK_OBJECT(widget), "changed", + widget_changed, editor); } widget = glade_xml_get_widget(editor->gui, "dateedit-anniversary"); if (widget && E_IS_DATE_EDIT(widget)) { - g_signal_connect (widget, "changed", - G_CALLBACK (widget_changed), editor); + gtk_signal_connect(GTK_OBJECT(widget), "changed", + widget_changed, editor); + } + widget = glade_xml_get_widget(editor->gui, "entry-web"); + if (widget && GTK_IS_ENTRY(widget)) { + gtk_signal_connect(GTK_OBJECT(widget), "changed", + widget_changed, editor); } - - set_entry_changed_signal_field(editor, "entry-caluri"); - set_entry_changed_signal_field(editor, "entry-fburl"); } static void full_name_clicked(GtkWidget *button, EContactEditor *editor) { - GtkDialog *dialog = GTK_DIALOG(e_contact_editor_fullname_new(editor->name)); + GnomeDialog *dialog = GNOME_DIALOG(e_contact_editor_fullname_new(editor->name)); int result; - g_object_set (dialog, + gtk_object_set (GTK_OBJECT (dialog), "editable", editor->fullname_editable, NULL); gtk_widget_show(GTK_WIDGET(dialog)); - result = gtk_dialog_run (dialog); - gtk_widget_hide (GTK_WIDGET (dialog)); + result = gnome_dialog_run (dialog); - if (editor->fullname_editable && result == GTK_RESPONSE_OK) { + if (editor->fullname_editable && result == 0) { ECardName *name; GtkWidget *fname_widget; int style = 0; - g_object_get (dialog, + gtk_object_get(GTK_OBJECT(dialog), "name", &name, NULL); @@ -733,7 +752,7 @@ full_name_clicked(GtkWidget *button, EContactEditor *editor) fname_widget = glade_xml_get_widget(editor->gui, "entry-fullname"); if (fname_widget && GTK_IS_ENTRY(fname_widget)) { char *full_name = e_card_name_to_string(name); - gtk_entry_set_text(GTK_ENTRY(fname_widget), full_name); + e_utf8_gtk_entry_set_text(GTK_ENTRY(fname_widget), full_name); g_free(full_name); } @@ -742,51 +761,37 @@ full_name_clicked(GtkWidget *button, EContactEditor *editor) file_as_set_style(editor, style); } - gtk_widget_destroy (GTK_WIDGET (dialog)); + gtk_object_unref(GTK_OBJECT(dialog)); } static void full_addr_clicked(GtkWidget *button, EContactEditor *editor) { - GtkDialog *dialog; + GnomeDialog *dialog; int result; const ECardDeliveryAddress *address; address = e_card_simple_get_delivery_address(editor->simple, editor->address_choice); - dialog = GTK_DIALOG(e_contact_editor_address_new(address)); - g_object_set (dialog, - "editable", editor->address_editable[editor->address_choice], - NULL); + dialog = GNOME_DIALOG(e_contact_editor_address_new(address)); + gtk_object_set (GTK_OBJECT (dialog), + "editable", editor->address_editable[editor->address_choice], + NULL); gtk_widget_show(GTK_WIDGET(dialog)); - result = gtk_dialog_run (dialog); - - gtk_widget_hide (GTK_WIDGET (dialog)); - - if (editor->address_editable[editor->address_choice] && result == GTK_RESPONSE_OK) { + result = gnome_dialog_run (dialog); + if (editor->address_editable[editor->address_choice] && result == 0) { ECardDeliveryAddress *new_address; GtkWidget *address_widget; - g_object_get (dialog, + gtk_object_get(GTK_OBJECT(dialog), "address", &new_address, NULL); address_widget = glade_xml_get_widget(editor->gui, "text-address"); - if (address_widget && GTK_IS_TEXT_VIEW(address_widget)) { - GtkTextBuffer *buffer; - GtkTextIter start_iter, end_iter; + if (address_widget && GTK_IS_EDITABLE(address_widget)) { char *string = e_card_delivery_address_to_string(new_address); - - buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (address_widget)); - - gtk_text_buffer_get_start_iter (buffer, &start_iter); - gtk_text_buffer_get_end_iter (buffer, &end_iter); - - gtk_text_buffer_delete (buffer, &start_iter, &end_iter); - - gtk_text_buffer_insert (buffer, &start_iter, string, strlen (string)); - + e_utf8_gtk_editable_set_text(GTK_EDITABLE(address_widget), string); g_free(string); } else { ECardAddrLabel *address = e_card_delivery_address_to_label(new_address); @@ -798,59 +803,95 @@ full_addr_clicked(GtkWidget *button, EContactEditor *editor) e_card_delivery_address_unref(new_address); } - gtk_widget_destroy (GTK_WIDGET (dialog)); + gtk_object_unref(GTK_OBJECT(dialog)); } static void categories_clicked(GtkWidget *button, EContactEditor *editor) { char *categories = NULL; - GtkDialog *dialog; + GnomeDialog *dialog; int result; GtkWidget *entry = glade_xml_get_widget(editor->gui, "entry-categories"); ECategoriesMasterList *ecml; if (entry && GTK_IS_ENTRY(entry)) - categories = g_strdup (gtk_entry_get_text(GTK_ENTRY(entry))); + categories = e_utf8_gtk_entry_get_text(GTK_ENTRY(entry)); else if (editor->card) - g_object_get (editor->card, + gtk_object_get(GTK_OBJECT(editor->card), "categories", &categories, NULL); - dialog = GTK_DIALOG(e_categories_new(categories)); + dialog = GNOME_DIALOG(e_categories_new(categories)); if (dialog == NULL) { - GtkWidget *uh_oh = gtk_message_dialog_new (NULL, - 0, GTK_MESSAGE_ERROR, - GTK_RESPONSE_OK, - _("Category editor not available.")); - g_free (categories); + GtkWidget *uh_oh = gnome_error_dialog (_("Category editor not available.")); gtk_widget_show (uh_oh); return; } ecml = e_categories_master_list_wombat_new (); - g_object_set (dialog, + gtk_object_set(GTK_OBJECT(dialog), "header", _("This contact belongs to these categories:"), "ecml", ecml, NULL); - g_object_unref (ecml); + gtk_object_unref (GTK_OBJECT (ecml)); gtk_widget_show(GTK_WIDGET(dialog)); - result = gtk_dialog_run (dialog); + result = gnome_dialog_run (dialog); g_free (categories); - if (result == GTK_RESPONSE_OK) { - g_object_get (dialog, + if (result == 0) { + gtk_object_get(GTK_OBJECT(dialog), "categories", &categories, NULL); if (entry && GTK_IS_ENTRY(entry)) - gtk_entry_set_text(GTK_ENTRY(entry), categories); + e_utf8_gtk_entry_set_text(GTK_ENTRY(entry), categories); else - g_object_set (editor->card, + gtk_object_set(GTK_OBJECT(editor->card), "categories", categories, NULL); g_free(categories); } - gtk_widget_destroy(GTK_WIDGET(dialog)); + gtk_object_destroy(GTK_OBJECT(dialog)); +} + +static void +ensure_select_names_contact (EContactEditor *editor) +{ + if (editor->select_names_contacts == NULL) { + editor->select_names_contacts = e_select_names_manager_new (); + e_select_names_manager_add_section (editor->select_names_contacts, + "contacts", + "Related Contacts"); + } + + set_entry_changed_signal_field(editor, "entry-caluri"); + set_entry_changed_signal_field(editor, "entry-fburl"); } +static void +contacts_clicked (GtkWidget *button, EContactEditor *editor) +{ + ensure_select_names_contact (editor); + e_select_names_manager_activate_dialog (editor->select_names_contacts, + "contacts"); +} + +static void +add_lists (EContactEditor *editor) +{ + GtkWidget *table = glade_xml_get_widget (editor->gui, "table-contacts"); + if (table && GTK_IS_TABLE (table)) { + GtkWidget *entry; + + ensure_select_names_contact (editor); + entry = e_select_names_manager_create_entry (editor->select_names_contacts, + "contacts"); + gtk_signal_connect(GTK_OBJECT(entry), "changed", + widget_changed, editor); + gtk_table_attach_defaults (GTK_TABLE (table), entry, 0, 1, 0, 1); + gtk_widget_show (entry); + } +} + + typedef struct { EContactEditor *ce; gboolean should_close; @@ -867,8 +908,8 @@ card_added_cb (EBook *book, EBookStatus status, const char *id, EditorCloseStruc e_card_set_id (ce->card, id); - g_signal_emit (ce, contact_editor_signals[CARD_ADDED], 0, - status, ce->card); + gtk_signal_emit (GTK_OBJECT (ce), contact_editor_signals[CARD_ADDED], + status, ce->card); if (status == E_BOOK_STATUS_SUCCESS) { ce->is_new_card = FALSE; @@ -882,7 +923,7 @@ card_added_cb (EBook *book, EBookStatus status, const char *id, EditorCloseStruc } } - g_object_unref (ce); + gtk_object_unref (GTK_OBJECT (ce)); g_free (ecs); } @@ -895,8 +936,8 @@ card_modified_cb (EBook *book, EBookStatus status, EditorCloseStruct *ecs) gtk_widget_set_sensitive (ce->app, TRUE); ce->in_async_call = FALSE; - g_signal_emit (ce, contact_editor_signals[CARD_MODIFIED], 0, - status, ce->card); + gtk_signal_emit (GTK_OBJECT (ce), contact_editor_signals[CARD_MODIFIED], + status, ce->card); if (status == E_BOOK_STATUS_SUCCESS) { if (should_close) { @@ -908,7 +949,7 @@ card_modified_cb (EBook *book, EBookStatus status, EditorCloseStruct *ecs) } } - g_object_unref (ce); + gtk_object_unref (GTK_OBJECT (ce)); g_free (ecs); } @@ -923,7 +964,7 @@ save_card (EContactEditor *ce, gboolean should_close) EditorCloseStruct *ecs = g_new(EditorCloseStruct, 1); ecs->ce = ce; - g_object_ref (ecs->ce); + gtk_object_ref (GTK_OBJECT (ecs->ce)); ecs->should_close = should_close; @@ -931,9 +972,9 @@ save_card (EContactEditor *ce, gboolean should_close) ce->in_async_call = TRUE; if (ce->is_new_card) - e_card_merging_book_add_card (ce->book, ce->card, (EBookIdCallback)card_added_cb, ecs); + e_card_merging_book_add_card (ce->book, ce->card, GTK_SIGNAL_FUNC(card_added_cb), ecs); else - e_card_merging_book_commit_card (ce->book, ce->card, (EBookCallback)card_modified_cb, ecs); + e_card_merging_book_commit_card (ce->book, ce->card, GTK_SIGNAL_FUNC(card_modified_cb), ecs); } } @@ -944,7 +985,7 @@ close_dialog (EContactEditor *ce) if (ce->app != NULL) { gtk_widget_destroy (ce->app); ce->app = NULL; - g_signal_emit (ce, contact_editor_signals[EDITOR_CLOSED], 0); + gtk_signal_emit (GTK_OBJECT (ce), contact_editor_signals[EDITOR_CLOSED]); } } @@ -955,12 +996,12 @@ prompt_to_save_changes (EContactEditor *editor) return TRUE; switch (e_addressbook_prompt_save_dialog (GTK_WINDOW(editor->app))) { - case GTK_RESPONSE_YES: + case 0: /* Save */ save_card (editor, FALSE); return TRUE; - case GTK_RESPONSE_NO: + case 1: /* Discard */ return TRUE; - case GTK_RESPONSE_CANCEL: + case 2: /* Cancel */ default: return FALSE; } @@ -1037,34 +1078,23 @@ file_send_to_cb (GtkWidget *widget, gpointer data) } gboolean -e_contact_editor_confirm_delete (GtkWindow *parent) -{ - GtkWidget *dialog; - gint result; - - dialog = gtk_message_dialog_new (parent, - 0, - GTK_MESSAGE_QUESTION, - GTK_BUTTONS_NONE, -#if notyet - /* XXX we really need to handle the plural case here.. */ - (plural - ? _("Are you sure you want\n" - "to delete these contacts?")) -#endif - _("Are you sure you want\n" - "to delete this contact?")); +e_contact_editor_confirm_delete(GtkWindow *parent) +{ + GnomeDialog *dialog; + GladeXML *gui; + int result; - gtk_dialog_add_buttons (GTK_DIALOG (dialog), - GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, - GTK_STOCK_DELETE, GTK_RESPONSE_ACCEPT, - NULL); + gui = glade_xml_new (EVOLUTION_GLADEDIR "/e-contact-editor-confirm-delete.glade", NULL); - result = gtk_dialog_run(GTK_DIALOG (dialog)); + dialog = GNOME_DIALOG(glade_xml_get_widget(gui, "confirm-dialog")); - gtk_widget_destroy (dialog); + gnome_dialog_set_parent(dialog, parent); + + result = gnome_dialog_run_and_close(dialog); - return (result == GTK_RESPONSE_ACCEPT); + gtk_object_unref(GTK_OBJECT(gui)); + + return !result; } static void @@ -1073,8 +1103,8 @@ card_deleted_cb (EBook *book, EBookStatus status, EContactEditor *ce) gtk_widget_set_sensitive (ce->app, TRUE); ce->in_async_call = FALSE; - g_signal_emit (ce, contact_editor_signals[CARD_DELETED], 0, - status, ce->card); + gtk_signal_emit (GTK_OBJECT (ce), contact_editor_signals[CARD_DELETED], + status, ce->card); /* always close the dialog after we successfully delete a card */ if (status == E_BOOK_STATUS_SUCCESS) @@ -1088,8 +1118,8 @@ delete_cb (GtkWidget *widget, gpointer data) ECard *card = ce->card; ECardSimple *simple = ce->simple; - g_object_ref(card); - g_object_ref(simple); + gtk_object_ref(GTK_OBJECT(card)); + gtk_object_ref(GTK_OBJECT(simple)); if (e_contact_editor_confirm_delete(GTK_WINDOW(ce->app))) { @@ -1100,12 +1130,12 @@ delete_cb (GtkWidget *widget, gpointer data) gtk_widget_set_sensitive (ce->app, FALSE); ce->in_async_call = TRUE; - e_book_remove_card (ce->book, card, (EBookCallback)card_deleted_cb, ce); + e_book_remove_card (ce->book, card, GTK_SIGNAL_FUNC(card_deleted_cb), ce); } } - g_object_unref(card); - g_object_unref(simple); + gtk_object_unref(GTK_OBJECT(card)); + gtk_object_unref(GTK_OBJECT(simple)); } /* Emits the signal to request printing a card */ @@ -1188,8 +1218,8 @@ create_ui (EContactEditor *ce) bonobo_ui_component_add_verb_list_with_data (ce->uic, verbs, ce); bonobo_ui_util_set_ui (ce->uic, EVOLUTION_DATADIR, - EVOLUTION_UIDIR "/evolution-contact-editor.xml", - "evolution-contact-editor", NULL); + "evolution-contact-editor.xml", + "evolution-contact-editor"); e_pixmaps_update (ce->uic, pixmaps); } @@ -1243,6 +1273,7 @@ setup_tab_order(GladeXML *gui) list = add_to_tab_order(list, gui, "entry-web"); list = add_to_tab_order(list, gui, "button-fulladdr"); list = add_to_tab_order(list, gui, "text-address"); + list = add_to_tab_order(list, gui, "alignment-contacts"); list = g_list_reverse(list); e_container_change_tab_order(GTK_CONTAINER(container), list); g_list_free(list); @@ -1288,7 +1319,7 @@ e_contact_editor_init (EContactEditor *e_contact_editor) e_contact_editor->in_async_call = FALSE; e_contact_editor->editable = TRUE; - gui = glade_xml_new (EVOLUTION_GLADEDIR "/contact-editor.glade", NULL, NULL); + gui = glade_xml_new (EVOLUTION_GLADEDIR "/contact-editor.glade", NULL); e_contact_editor->gui = gui; setup_tab_order(gui); @@ -1300,32 +1331,39 @@ e_contact_editor_init (EContactEditor *e_contact_editor) e_contact_editor); _replace_buttons(e_contact_editor); + add_lists (e_contact_editor); set_entry_changed_signals(e_contact_editor); wants_html = glade_xml_get_widget(e_contact_editor->gui, "checkbutton-htmlmail"); if (wants_html && GTK_IS_TOGGLE_BUTTON(wants_html)) - g_signal_connect (wants_html, "toggled", - G_CALLBACK (wants_html_changed), e_contact_editor); + gtk_signal_connect(GTK_OBJECT(wants_html), "toggled", + wants_html_changed, e_contact_editor); widget = glade_xml_get_widget(e_contact_editor->gui, "checkbutton-mailingaddress"); if (widget && GTK_IS_TOGGLE_BUTTON(widget)) - g_signal_connect (widget, "toggled", - G_CALLBACK (address_mailing_changed), e_contact_editor); + gtk_signal_connect(GTK_OBJECT(widget), "toggled", + address_mailing_changed, e_contact_editor); widget = glade_xml_get_widget(e_contact_editor->gui, "button-fullname"); if (widget && GTK_IS_BUTTON(widget)) - g_signal_connect (widget, "clicked", - G_CALLBACK (full_name_clicked), e_contact_editor); + gtk_signal_connect(GTK_OBJECT(widget), "clicked", + full_name_clicked, e_contact_editor); widget = glade_xml_get_widget(e_contact_editor->gui, "button-fulladdr"); if (widget && GTK_IS_BUTTON(widget)) - g_signal_connect (widget, "clicked", - G_CALLBACK (full_addr_clicked), e_contact_editor); + gtk_signal_connect(GTK_OBJECT(widget), "clicked", + full_addr_clicked, e_contact_editor); widget = glade_xml_get_widget(e_contact_editor->gui, "button-categories"); if (widget && GTK_IS_BUTTON(widget)) - g_signal_connect (widget, "clicked", - G_CALLBACK (categories_clicked), e_contact_editor); + gtk_signal_connect(GTK_OBJECT(widget), "clicked", + categories_clicked, e_contact_editor); + + widget = glade_xml_get_widget(e_contact_editor->gui, "button-contacts"); + if (widget && GTK_IS_BUTTON(widget)) + gtk_signal_connect(GTK_OBJECT(widget), "clicked", + contacts_clicked, e_contact_editor); + /* Construct the app */ bonobo_win = bonobo_window_new ("contact-editor-dialog", _("Contact Editor")); @@ -1334,13 +1372,13 @@ e_contact_editor_init (EContactEditor *e_contact_editor) { GtkWidget *contents; - contents = bonobo_dock_get_client_area (gnome_app_get_dock (GNOME_APP(e_contact_editor->app))); - + contents = gnome_dock_get_client_area ( + GNOME_DOCK (GNOME_APP (e_contact_editor->app)->dock)); if (!contents) { g_message ("contact_editor_construct(): Could not get contents"); return; } - g_object_ref (contents); + gtk_widget_ref (contents); gtk_container_remove (GTK_CONTAINER (contents->parent), contents); bonobo_window_set_contents (BONOBO_WINDOW (bonobo_win), contents); gtk_widget_destroy (e_contact_editor->app); @@ -1348,7 +1386,9 @@ e_contact_editor_init (EContactEditor *e_contact_editor) } /* Build the menu and toolbar */ - container = bonobo_window_get_ui_container (BONOBO_WINDOW (e_contact_editor->app)); + + container = bonobo_ui_container_new (); + bonobo_ui_container_set_win (container, BONOBO_WINDOW (e_contact_editor->app)); e_contact_editor->uic = bonobo_ui_component_new_default (); if (!e_contact_editor->uic) { @@ -1356,8 +1396,8 @@ e_contact_editor_init (EContactEditor *e_contact_editor) return; } bonobo_ui_component_set_container (e_contact_editor->uic, - bonobo_object_corba_objref (BONOBO_OBJECT (container)), - NULL); + bonobo_object_corba_objref ( + BONOBO_OBJECT (container))); create_ui (e_contact_editor); @@ -1367,89 +1407,68 @@ e_contact_editor_init (EContactEditor *e_contact_editor) /* Connect to the deletion of the dialog */ - g_signal_connect (e_contact_editor->app, "delete_event", + gtk_signal_connect (GTK_OBJECT (e_contact_editor->app), "delete_event", GTK_SIGNAL_FUNC (app_delete_event_cb), e_contact_editor); /* set the icon */ - icon_path = g_build_filename (EVOLUTION_ICONSDIR, "evolution-contacts-mini.png", NULL); + icon_path = g_concat_dir_and_file (EVOLUTION_ICONSDIR, "evolution-contacts-mini.png"); gnome_window_icon_set_from_file (GTK_WINDOW (e_contact_editor->app), icon_path); g_free (icon_path); } void -e_contact_editor_dispose (GObject *object) { +e_contact_editor_destroy (GtkObject *object) { EContactEditor *e_contact_editor = E_CONTACT_EDITOR(object); if (e_contact_editor->writable_fields) { - g_object_unref(e_contact_editor->writable_fields); - e_contact_editor->writable_fields = NULL; + 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); - e_contact_editor->email_list = NULL; } if (e_contact_editor->email_info) { g_free(e_contact_editor->email_info); - e_contact_editor->email_info = NULL; } if (e_contact_editor->email_popup) { - g_object_unref(e_contact_editor->email_popup); - e_contact_editor->email_popup = NULL; + gtk_widget_unref(e_contact_editor->email_popup); } if (e_contact_editor->phone_list) { g_list_foreach(e_contact_editor->phone_list, (GFunc) g_free, NULL); g_list_free(e_contact_editor->phone_list); - e_contact_editor->phone_list = NULL; } if (e_contact_editor->phone_info) { g_free(e_contact_editor->phone_info); - e_contact_editor->phone_info = NULL; } if (e_contact_editor->phone_popup) { - g_object_unref(e_contact_editor->phone_popup); - e_contact_editor->phone_popup = NULL; + gtk_widget_unref(e_contact_editor->phone_popup); } if (e_contact_editor->address_list) { g_list_foreach(e_contact_editor->address_list, (GFunc) g_free, NULL); g_list_free(e_contact_editor->address_list); - e_contact_editor->address_list = NULL; } if (e_contact_editor->address_info) { g_free(e_contact_editor->address_info); - e_contact_editor->address_info = NULL; } if (e_contact_editor->address_popup) { - g_object_unref(e_contact_editor->address_popup); - e_contact_editor->address_popup = NULL; + gtk_widget_unref(e_contact_editor->address_popup); } - if (e_contact_editor->simple) { - g_object_unref(e_contact_editor->simple); - e_contact_editor->simple = NULL; - } + if (e_contact_editor->simple) + gtk_object_unref(GTK_OBJECT(e_contact_editor->simple)); - if (e_contact_editor->book) { - g_object_unref(e_contact_editor->book); - e_contact_editor->book = NULL; - } + if (e_contact_editor->book) + gtk_object_unref(GTK_OBJECT(e_contact_editor->book)); - if (e_contact_editor->name) { - e_card_name_unref(e_contact_editor->name); - e_contact_editor->name = NULL; - } + if (e_contact_editor->select_names_contacts) + gtk_object_unref(GTK_OBJECT(e_contact_editor->select_names_contacts)); - if (e_contact_editor->company) { - g_free (e_contact_editor->company); - e_contact_editor->company = NULL; - } + e_card_name_unref(e_contact_editor->name); + g_free (e_contact_editor->company); - if (e_contact_editor->gui) { - g_object_unref(e_contact_editor->gui); - e_contact_editor->gui = NULL; - } + gtk_object_unref(GTK_OBJECT(e_contact_editor->gui)); } static void @@ -1478,7 +1497,7 @@ supported_fields_cb (EBook *book, EBookStatus status, return; } - g_object_set (ce, + gtk_object_set (GTK_OBJECT (ce), "writable_fields", fields, NULL); @@ -1488,8 +1507,7 @@ supported_fields_cb (EBook *book, EBookStatus status, } static void -contact_editor_destroy_notify (void *data, - GObject *where_the_object_was) +contact_editor_destroy_notify (void *data) { EContactEditor *ce = E_CONTACT_EDITOR (data); @@ -1507,20 +1525,17 @@ e_contact_editor_new (EBook *book, g_return_val_if_fail (E_IS_BOOK (book), NULL); g_return_val_if_fail (E_IS_CARD (card), NULL); - ce = g_object_new (E_TYPE_CONTACT_EDITOR, NULL); + ce = E_CONTACT_EDITOR (gtk_type_new (E_CONTACT_EDITOR_TYPE)); all_contact_editors = g_slist_prepend (all_contact_editors, ce); - g_object_weak_ref (G_OBJECT (ce), contact_editor_destroy_notify, ce); + gtk_object_weakref (GTK_OBJECT (ce), contact_editor_destroy_notify, ce); - gtk_object_ref (GTK_OBJECT (ce)); - gtk_object_sink (GTK_OBJECT (ce)); - - g_object_set (ce, - "book", book, - "card", card, - "is_new_card", is_new_card, - "editable", editable, - NULL); + gtk_object_set (GTK_OBJECT (ce), + "book", book, + "card", card, + "is_new_card", is_new_card, + "editable", editable, + NULL); if (book) e_book_get_supported_fields (book, (EBookFieldsCallback)supported_fields_cb, ce); @@ -1529,37 +1544,37 @@ e_contact_editor_new (EBook *book, } static void -e_contact_editor_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) +e_contact_editor_set_arg (GtkObject *o, GtkArg *arg, guint arg_id) { EContactEditor *editor; - editor = E_CONTACT_EDITOR (object); + editor = E_CONTACT_EDITOR (o); - switch (prop_id){ - case PROP_BOOK: + switch (arg_id){ + case ARG_BOOK: if (editor->book) - g_object_unref(editor->book); - editor->book = E_BOOK(g_value_get_object (value)); - g_object_ref (editor->book); + gtk_object_unref(GTK_OBJECT(editor->book)); + editor->book = E_BOOK(GTK_VALUE_OBJECT (*arg)); + gtk_object_ref (GTK_OBJECT (editor->book)); /* XXX more here about editable/etc. */ break; - case PROP_CARD: + case ARG_CARD: if (editor->card) - g_object_unref(editor->card); - editor->card = e_card_duplicate(E_CARD(g_value_get_object (value))); - g_object_set(editor->simple, - "card", editor->card, - NULL); + gtk_object_unref(GTK_OBJECT(editor->card)); + editor->card = e_card_duplicate(E_CARD(GTK_VALUE_OBJECT (*arg))); + gtk_object_set(GTK_OBJECT(editor->simple), + "card", editor->card, + NULL); fill_in_info(editor); editor->changed = FALSE; break; - case PROP_IS_NEW_CARD: - editor->is_new_card = g_value_get_boolean (value) ? TRUE : FALSE; + case ARG_IS_NEW_CARD: + editor->is_new_card = GTK_VALUE_BOOL (*arg) ? TRUE : FALSE; break; - case PROP_EDITABLE: { - gboolean new_value = g_value_get_boolean (value) ? TRUE : FALSE; + case ARG_EDITABLE: { + gboolean new_value = GTK_VALUE_BOOL (*arg) ? TRUE : FALSE; gboolean changed = (editor->editable != new_value); editor->editable = new_value; @@ -1571,8 +1586,8 @@ e_contact_editor_set_property (GObject *object, guint prop_id, const GValue *val break; } - case PROP_CHANGED: { - gboolean new_value = g_value_get_boolean (value) ? TRUE : FALSE; + case ARG_CHANGED: { + gboolean new_value = GTK_VALUE_BOOL (*arg) ? TRUE : FALSE; gboolean changed = (editor->changed != new_value); editor->changed = new_value; @@ -1581,60 +1596,57 @@ e_contact_editor_set_property (GObject *object, guint prop_id, const GValue *val command_state_changed (editor); break; } - case PROP_WRITABLE_FIELDS: + case ARG_WRITABLE_FIELDS: if (editor->writable_fields) - g_object_unref(editor->writable_fields); - editor->writable_fields = g_value_get_object (value); + gtk_object_unref(GTK_OBJECT(editor->writable_fields)); + editor->writable_fields = GTK_VALUE_POINTER (*arg); if (editor->writable_fields) - g_object_ref (editor->writable_fields); + gtk_object_ref (GTK_OBJECT (editor->writable_fields)); else editor->writable_fields = e_list_new(NULL, NULL, NULL); enable_writable_fields (editor); break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; } } static void -e_contact_editor_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) +e_contact_editor_get_arg (GtkObject *object, GtkArg *arg, guint arg_id) { EContactEditor *e_contact_editor; e_contact_editor = E_CONTACT_EDITOR (object); - switch (prop_id) { - case PROP_BOOK: - g_value_set_object (value, e_contact_editor->book); + switch (arg_id) { + case ARG_BOOK: + GTK_VALUE_OBJECT (*arg) = GTK_OBJECT(e_contact_editor->book); break; - case PROP_CARD: + case ARG_CARD: e_card_simple_sync_card(e_contact_editor->simple); extract_info(e_contact_editor); - g_value_set_object (value, e_contact_editor->card); + GTK_VALUE_OBJECT (*arg) = GTK_OBJECT(e_contact_editor->card); break; - case PROP_IS_NEW_CARD: - g_value_set_boolean (value, e_contact_editor->is_new_card ? TRUE : FALSE); + case ARG_IS_NEW_CARD: + GTK_VALUE_BOOL (*arg) = e_contact_editor->is_new_card ? TRUE : FALSE; break; - case PROP_EDITABLE: - g_value_set_boolean (value, e_contact_editor->editable ? TRUE : FALSE); + case ARG_EDITABLE: + GTK_VALUE_BOOL (*arg) = e_contact_editor->editable ? TRUE : FALSE; break; - case PROP_CHANGED: - g_value_set_boolean (value, e_contact_editor->changed ? TRUE : FALSE); + case ARG_CHANGED: + GTK_VALUE_BOOL (*arg) = e_contact_editor->changed ? TRUE : FALSE; break; - case PROP_WRITABLE_FIELDS: + case ARG_WRITABLE_FIELDS: if (e_contact_editor->writable_fields) - g_value_set_object (value, e_list_duplicate (e_contact_editor->writable_fields)); + GTK_VALUE_POINTER (*arg) = e_list_duplicate (e_contact_editor->writable_fields); else - g_value_set_object (value, NULL); + GTK_VALUE_POINTER (*arg) = NULL; break; default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + arg->type = GTK_TYPE_INVALID; break; } } @@ -1643,15 +1655,14 @@ static void _popup_position(GtkMenu *menu, gint *x, gint *y, - gboolean *push_in, gpointer data) { GtkWidget *button = GTK_WIDGET(data); GtkRequisition request; int mh, mw; gdk_window_get_origin (button->window, x, y); - *x += button->allocation.x; - *y += button->allocation.y; + *x += button->allocation.width; + *y += button->allocation.height; gtk_widget_size_request(GTK_WIDGET(menu), &request); @@ -1670,19 +1681,15 @@ _popup_position(GtkMenu *menu, if ((*y + mh) > gdk_screen_height ()) *y = gdk_screen_height () - mh; - - *push_in = FALSE; } static gint _arrow_pressed (GtkWidget *widget, GdkEventButton *button, EContactEditor *editor, GtkWidget *popup, GList **list, GnomeUIInfo **info, gchar *label, gchar *entry, gchar *dialog_title) { gint menu_item; - - g_signal_stop_emission_by_name (widget, "button_press_event"); - + gtk_signal_emit_stop_by_name(GTK_OBJECT(widget), "button_press_event"); gtk_widget_realize(popup); - menu_item = gnome_popup_menu_do_popup_modal(popup, _popup_position, widget, button, editor, widget); + menu_item = gnome_popup_menu_do_popup_modal(popup, _popup_position, widget, button, editor); if ( menu_item != -1 ) { #if 0 if (menu_item == g_list_length (*list)) { @@ -1691,7 +1698,7 @@ _arrow_pressed (GtkWidget *widget, GdkEventButton *button, EContactEditor *edito #endif GtkWidget *label_widget = glade_xml_get_widget(editor->gui, label); if (label_widget && GTK_IS_LABEL(label_widget)) { - g_object_set (label_widget, + gtk_object_set(GTK_OBJECT(label_widget), "label", _(g_list_nth_data(*list, menu_item)), NULL); } @@ -1763,11 +1770,9 @@ e_contact_editor_build_phone_ui (EContactEditor *editor) e_contact_editor_build_ui_info(editor->phone_list, &editor->phone_info); if ( editor->phone_popup ) - g_object_unref(editor->phone_popup); + gtk_widget_unref(editor->phone_popup); editor->phone_popup = gnome_popup_menu_new(editor->phone_info); - g_object_ref (editor->phone_popup); - gtk_object_sink (GTK_OBJECT (editor->phone_popup)); } } @@ -1791,11 +1796,9 @@ e_contact_editor_build_email_ui (EContactEditor *editor) e_contact_editor_build_ui_info(editor->email_list, &editor->email_info); if ( editor->email_popup ) - g_object_unref(editor->email_popup); + gtk_widget_unref(editor->email_popup); editor->email_popup = gnome_popup_menu_new(editor->email_info); - g_object_ref (editor->email_popup); - gtk_object_sink (GTK_OBJECT (editor->email_popup)); } } @@ -1819,13 +1822,96 @@ e_contact_editor_build_address_ui (EContactEditor *editor) e_contact_editor_build_ui_info(editor->address_list, &editor->address_info); if ( editor->address_popup ) - g_object_unref(editor->address_popup); + gtk_widget_unref(editor->address_popup); editor->address_popup = gnome_popup_menu_new(editor->address_info); - g_object_ref (editor->address_popup); - gtk_object_sink (GTK_OBJECT (editor->address_popup)); } } +#if 0 +static void +_dialog_clicked(GtkWidget *dialog, gint button, EContactEditor *editor) +{ + GtkWidget *label = gtk_object_get_data(GTK_OBJECT(dialog), + "e_contact_editor_label"); + + GtkWidget *dialog_entry = gtk_object_get_data(GTK_OBJECT(dialog), + "e_contact_editor_dialog_entry"); + + GList **list = gtk_object_get_data(GTK_OBJECT(dialog), + "e_contact_editor_list"); + GList **info = gtk_object_get_data(GTK_OBJECT(dialog), + "e_contact_editor_info"); + switch (button) { + case 0: + if (label && GTK_IS_LABEL(label)) { + gtk_object_set(GTK_OBJECT(label), + "label", gtk_entry_get_text(GTK_ENTRY(dialog_entry)), + NULL); + *list = g_list_append(*list, e_utf8_gtk_entry_get_text(GTK_ENTRY(dialog_entry))); + g_free(*info); + *info = NULL; + } + break; + } + gnome_dialog_close(GNOME_DIALOG(dialog)); +} + +static void +_dialog_destroy(EContactEditor *editor, GtkWidget *dialog) +{ + gnome_dialog_close(GNOME_DIALOG(dialog)); +} + +static GtkWidget * +e_contact_editor_build_dialog(EContactEditor *editor, gchar *entry_id, gchar *label_id, gchar *title, GList **list, GnomeUIInfo **info) +{ + GtkWidget *dialog_entry = gtk_entry_new(); + GtkWidget *entry = glade_xml_get_widget(editor->gui, entry_id); + GtkWidget *label = glade_xml_get_widget(editor->gui, label_id); + + GtkWidget *dialog = gnome_dialog_new(title, + NULL); + + gtk_container_add(GTK_CONTAINER(GNOME_DIALOG(dialog)->vbox), + gtk_widget_new (gtk_frame_get_type(), + "border_width", 4, + "label", title, + "child", gtk_widget_new(gtk_alignment_get_type(), + "child", dialog_entry, + "xalign", .5, + "yalign", .5, + "xscale", 1.0, + "yscale", 1.0, + "border_width", 9, + NULL), + NULL)); + + gnome_dialog_append_button_with_pixmap(GNOME_DIALOG(dialog), + "Add", + GNOME_STOCK_PIXMAP_ADD); + gnome_dialog_append_button(GNOME_DIALOG(dialog), GNOME_STOCK_BUTTON_CANCEL); + gnome_dialog_set_default(GNOME_DIALOG(dialog), 0); + + gtk_signal_connect(GTK_OBJECT(dialog), "clicked", + _dialog_clicked, editor); + gtk_signal_connect_while_alive(GTK_OBJECT(editor), "destroy", + _dialog_destroy, GTK_OBJECT(dialog), GTK_OBJECT(dialog)); + + gtk_object_set_data(GTK_OBJECT(dialog), + "e_contact_editor_entry", entry); + gtk_object_set_data(GTK_OBJECT(dialog), + "e_contact_editor_label", label); + gtk_object_set_data(GTK_OBJECT(dialog), + "e_contact_editor_dialog_entry", dialog_entry); + gtk_object_set_data(GTK_OBJECT(dialog), + "e_contact_editor_list", list); + gtk_object_set_data(GTK_OBJECT(dialog), + "e_contact_editor_info", info); + + gtk_widget_show_all(dialog); + return dialog; +} +#endif static void _phone_arrow_pressed (GtkWidget *widget, GdkEventButton *button, EContactEditor *editor) @@ -1962,11 +2048,12 @@ find_address_mailing (EContactEditor *editor) static void set_field(GtkEntry *entry, const char *string) { - const char *oldstring = gtk_entry_get_text(entry); + char *oldstring = e_utf8_gtk_entry_get_text(entry); if (!string) string = ""; if (strcmp(string, oldstring)) - gtk_entry_set_text(entry, string); + e_utf8_gtk_entry_set_text(entry, string); + g_free (oldstring); } static void @@ -2017,7 +2104,7 @@ set_fields(EContactEditor *editor) label_widget = glade_xml_get_widget(editor->gui, "label-address"); if (label_widget && GTK_IS_LABEL(label_widget)) { - g_object_set (label_widget, + gtk_object_set(GTK_OBJECT(label_widget), "label", _(g_list_nth_data(editor->address_list, i)), NULL); } @@ -2032,26 +2119,25 @@ set_address_field(EContactEditor *editor, int result) text = glade_xml_get_widget(editor->gui, "text-address"); - if (text && GTK_IS_TEXT_VIEW(text)) { - GtkTextView *text_view = GTK_TEXT_VIEW (text); - GtkTextBuffer *buffer; - GtkTextIter start_iter, end_iter; + if (text && GTK_IS_TEXT(text)) { + int position; + GtkEditable *editable; const ECardAddrLabel *address; if (result == -1) result = editor->address_choice; editor->address_choice = -1; - buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text)); - - gtk_text_buffer_get_start_iter (buffer, &start_iter); - gtk_text_buffer_get_end_iter (buffer, &end_iter); - - gtk_text_buffer_delete (buffer, &start_iter, &end_iter); + position = 0; + editable = GTK_EDITABLE(text); + gtk_editable_delete_text(editable, 0, -1); address = e_card_simple_get_address(editor->simple, result); - if (address && address->data) - gtk_text_buffer_insert (buffer, &start_iter, address->data, strlen (address->data)); + if (address && address->data) { + gchar *u = e_utf8_to_gtk_string ((GtkWidget *) editable, address->data); + gtk_editable_insert_text(editable, u, strlen(u), &position); + g_free (u); + } check = glade_xml_get_widget(editor->gui, "checkbutton-mailingaddress"); if (check && GTK_IS_CHECK_BUTTON (check)) { @@ -2085,6 +2171,7 @@ add_field_callback(GtkWidget *widget, EContactEditor *editor) "entry-spouse", "text-comments", "entry-categories", + "entry-contacts", "entry-file-as", "dateedit-anniversary", "dateedit-birthday", @@ -2106,7 +2193,7 @@ add_field_callback(GtkWidget *widget, EContactEditor *editor) if (!strcmp(name, builtins[i])) return; } - if (GTK_IS_ENTRY(widget) || GTK_IS_TEXT_VIEW(widget)) { + if (GTK_IS_ENTRY(widget) || GTK_IS_TEXT(widget)) { editor->arbitrary_fields = g_list_prepend(editor->arbitrary_fields, g_strdup(name)); } } @@ -2141,8 +2228,11 @@ fill_in_field(EContactEditor *editor, char *id, char *value) int position = 0; GtkEditable *editable = GTK_EDITABLE(widget); gtk_editable_delete_text(editable, 0, -1); - if (value) - gtk_editable_insert_text(editable, value, strlen(value), &position); + if (value) { + gchar *u = e_utf8_to_gtk_string ((GtkWidget *) editable, value); + gtk_editable_insert_text(editable, u, strlen(u), &position); + g_free (u); + } } } @@ -2150,7 +2240,7 @@ static void fill_in_card_field(EContactEditor *editor, ECard *card, char *id, char *key) { char *string; - g_object_get (card, + gtk_object_get(GTK_OBJECT(card), key, &string, NULL); fill_in_field(editor, id, string); @@ -2169,8 +2259,11 @@ fill_in_single_field(EContactEditor *editor, char *name) 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); + if (arbitrary && arbitrary->value) { + gchar *u = e_utf8_to_gtk_string ((GtkWidget *) editable, arbitrary->value); + gtk_editable_insert_text(editable, u, strlen(u), &position); + g_free (u); + } } } @@ -2379,8 +2472,8 @@ enable_writable_fields(EContactEditor *editor) g_hash_table_destroy (dropdown_hash); g_hash_table_destroy (supported_hash); - g_object_unref (simple); - g_object_unref (card); + gtk_object_unref (GTK_OBJECT(simple)); + gtk_object_unref (GTK_OBJECT(card)); } static void @@ -2434,7 +2527,7 @@ fill_in_info(EContactEditor *editor) GList *list; gboolean wants_html, wants_html_set; - g_object_get (card, + gtk_object_get(GTK_OBJECT(card), "file_as", &file_as, "related_contacts", &related_contacts, "name", &name, @@ -2457,7 +2550,7 @@ fill_in_info(EContactEditor *editor) if (wants_html_set) { GtkWidget *widget = glade_xml_get_widget(editor->gui, "checkbutton-htmlmail"); if (widget && GTK_IS_CHECK_BUTTON(widget)) { - g_object_set (widget, + gtk_object_set(GTK_OBJECT(widget), "active", wants_html, NULL); } @@ -2495,6 +2588,12 @@ fill_in_info(EContactEditor *editor) e_date_edit_set_time (dateedit, -1); } + if (editor->select_names_contacts && related_contacts && *related_contacts) { + ESelectNamesModel *model = e_select_names_manager_get_source (editor->select_names_contacts, + "contacts"); + e_select_names_model_import_destinationv (model, related_contacts); + } + set_fields(editor); } } @@ -2503,19 +2602,18 @@ static void extract_field(EContactEditor *editor, ECard *card, char *editable_id, char *key) { GtkWidget *widget = glade_xml_get_widget(editor->gui, editable_id); - - if (widget && GTK_IS_EDITABLE (widget)) { + if (widget && GTK_IS_EDITABLE(widget)) { GtkEditable *editable = GTK_EDITABLE(widget); - char *string = gtk_editable_get_chars(editable, 0, -1); + char *string = e_utf8_gtk_editable_get_chars(editable, 0, -1); if (string && *string) - g_object_set (card, - key, string, - NULL); + gtk_object_set(GTK_OBJECT(card), + key, string, + NULL); else - g_object_set (card, - key, NULL, - NULL); + gtk_object_set(GTK_OBJECT(card), + key, NULL, + NULL); if (string) g_free(string); } @@ -2528,7 +2626,7 @@ extract_single_field(EContactEditor *editor, char *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); + char *string = e_utf8_gtk_editable_get_chars(editable, 0, -1); if (string && *string) e_card_simple_set_arbitrary(simple, @@ -2558,10 +2656,10 @@ extract_info(EContactEditor *editor) widget = glade_xml_get_widget(editor->gui, "entry-file-as"); if (widget && GTK_IS_EDITABLE(widget)) { GtkEditable *editable = GTK_EDITABLE(widget); - char *string = gtk_editable_get_chars(editable, 0, -1); + char *string = e_utf8_gtk_editable_get_chars(editable, 0, -1); if (string && *string) - g_object_set (card, + gtk_object_set(GTK_OBJECT(card), "file_as", string, NULL); @@ -2576,8 +2674,23 @@ extract_info(EContactEditor *editor) extract_single_field(editor, list->data); } + if (editor->select_names_contacts) { + ESelectNamesModel *model = e_select_names_manager_get_source (editor->select_names_contacts, + "contacts"); + char *string = e_select_names_model_export_destinationv (model); + if (string && *string) + gtk_object_set (GTK_OBJECT (card), + "related_contacts", string, + NULL); + else + gtk_object_set (GTK_OBJECT (card), + "related_contacts", NULL, + NULL); + g_free (string); + } + if (editor->name) - g_object_set (card, + gtk_object_set(GTK_OBJECT(card), "name", editor->name, NULL); @@ -2588,11 +2701,11 @@ extract_info(EContactEditor *editor) &anniversary.month, &anniversary.day)) { /* g_print ("%d %d %d\n", anniversary.year, anniversary.month, anniversary.day); */ - g_object_set (card, + gtk_object_set(GTK_OBJECT(card), "anniversary", &anniversary, NULL); } else - g_object_set (card, + gtk_object_set(GTK_OBJECT(card), "anniversary", NULL, NULL); } @@ -2604,11 +2717,11 @@ extract_info(EContactEditor *editor) &bday.month, &bday.day)) { /* g_print ("%d %d %d\n", bday.year, bday.month, bday.day); */ - g_object_set (card, + gtk_object_set(GTK_OBJECT(card), "birth_date", &bday, NULL); } else - g_object_set (card, + gtk_object_set(GTK_OBJECT(card), "birth_date", NULL, NULL); } @@ -2665,8 +2778,8 @@ enable_widget (GtkWidget *widget, gboolean enabled) if (GTK_IS_ENTRY (widget)) { gtk_entry_set_editable (GTK_ENTRY (widget), enabled); } - else if (GTK_IS_TEXT_VIEW (widget)) { - gtk_text_view_set_editable (GTK_TEXT_VIEW (widget), enabled); + else if (GTK_IS_TEXT (widget)) { + gtk_text_set_editable (GTK_TEXT (widget), enabled); } else if (GTK_IS_COMBO (widget)) { gtk_entry_set_editable (GTK_ENTRY (GTK_COMBO (widget)->entry), |