diff options
Diffstat (limited to 'addressbook/gui/contact-editor/e-contact-editor-fullname.c')
-rw-r--r-- | addressbook/gui/contact-editor/e-contact-editor-fullname.c | 435 |
1 files changed, 252 insertions, 183 deletions
diff --git a/addressbook/gui/contact-editor/e-contact-editor-fullname.c b/addressbook/gui/contact-editor/e-contact-editor-fullname.c index 8d602657c0..4777091128 100644 --- a/addressbook/gui/contact-editor/e-contact-editor-fullname.c +++ b/addressbook/gui/contact-editor/e-contact-editor-fullname.c @@ -1,260 +1,329 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * e-contact-editor-fullname.c - * Copyright (C) 2000 Ximian, Inc. - * Author: Chris Lahey <clahey@ximian.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with the program; if not, see <http://www.gnu.org/licenses/> + * + * + * Authors: + * Chris Toshok <toshok@ximian.com> + * + * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com) * - * You should have received a copy of the GNU General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. */ +#ifdef HAVE_CONFIG_H #include <config.h> -#include <libgnomeui/gnome-stock.h> -#include <gal/widgets/e-unicode.h> -#include "e-contact-editor-fullname.h" -#include <libgnomeui/gnome-window-icon.h> -#include <libgnome/gnome-util.h> -#include <gtk/gtkcombo.h> +#endif -static void e_contact_editor_fullname_init (EContactEditorFullname *card); -static void e_contact_editor_fullname_class_init (EContactEditorFullnameClass *klass); -static void e_contact_editor_fullname_set_arg (GtkObject *o, GtkArg *arg, guint arg_id); -static void e_contact_editor_fullname_get_arg (GtkObject *object, GtkArg *arg, guint arg_id); -static void e_contact_editor_fullname_destroy (GtkObject *object); +#include <glib/gi18n.h> -static void fill_in_info(EContactEditorFullname *editor); -static void extract_info(EContactEditorFullname *editor); +#include "e-util/e-util.h" +#include "e-util/e-util-private.h" -static GnomeDialogClass *parent_class = NULL; +#include "e-contact-editor-fullname.h" + +static void fill_in_info (EContactEditorFullname *editor); +static void extract_info (EContactEditorFullname *editor); -/* The arguments we take */ enum { - ARG_0, - ARG_NAME, - ARG_IS_READ_ONLY + PROP_0, + PROP_NAME, + PROP_EDITABLE }; -GtkType -e_contact_editor_fullname_get_type (void) -{ - static GtkType contact_editor_fullname_type = 0; - - if (!contact_editor_fullname_type) - { - static const GtkTypeInfo contact_editor_fullname_info = - { - "EContactEditorFullname", - sizeof (EContactEditorFullname), - sizeof (EContactEditorFullnameClass), - (GtkClassInitFunc) e_contact_editor_fullname_class_init, - (GtkObjectInitFunc) e_contact_editor_fullname_init, - /* reserved_1 */ NULL, - /* reserved_2 */ NULL, - (GtkClassInitFunc) NULL, - }; - - contact_editor_fullname_type = gtk_type_unique (gnome_dialog_get_type (), &contact_editor_fullname_info); - } - - return contact_editor_fullname_type; -} +G_DEFINE_TYPE ( + EContactEditorFullname, + e_contact_editor_fullname, + GTK_TYPE_DIALOG) static void -e_contact_editor_fullname_class_init (EContactEditorFullnameClass *klass) +e_contact_editor_fullname_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) { - GtkObjectClass *object_class; - GnomeDialogClass *dialog_class; - - object_class = (GtkObjectClass*) klass; - dialog_class = (GnomeDialogClass *) klass; + EContactEditorFullname *e_contact_editor_fullname; - parent_class = gtk_type_class (gnome_dialog_get_type ()); + e_contact_editor_fullname = E_CONTACT_EDITOR_FULLNAME (object); - gtk_object_add_arg_type ("EContactEditorFullname::name", GTK_TYPE_POINTER, - GTK_ARG_READWRITE, ARG_NAME); + switch (property_id) { + case PROP_NAME: + e_contact_name_free (e_contact_editor_fullname->name); - gtk_object_add_arg_type ("EContactEditorFullname::editable", GTK_TYPE_BOOL, - GTK_ARG_READWRITE, ARG_IS_READ_ONLY); - - object_class->set_arg = e_contact_editor_fullname_set_arg; - object_class->get_arg = e_contact_editor_fullname_get_arg; - object_class->destroy = e_contact_editor_fullname_destroy; -} + if (g_value_get_pointer (value) != NULL) { + e_contact_editor_fullname->name = + e_contact_name_copy ( + g_value_get_pointer (value)); + fill_in_info (e_contact_editor_fullname); + } + else { + e_contact_editor_fullname->name = NULL; + } + break; + case PROP_EDITABLE: { + gboolean editable; + gint i; -static void -e_contact_editor_fullname_init (EContactEditorFullname *e_contact_editor_fullname) -{ - GladeXML *gui; - GtkWidget *widget; - char *icon_path; + const gchar *widget_names[] = { + "comboentry-title", + "comboentry-suffix", + "entry-first", + "entry-middle", + "entry-last", + "label-title", + "label-suffix", + "label-first", + "label-middle", + "label-last", + NULL + }; - gnome_dialog_append_button ( GNOME_DIALOG(e_contact_editor_fullname), - GNOME_STOCK_BUTTON_OK); - - gnome_dialog_append_button ( GNOME_DIALOG(e_contact_editor_fullname), - GNOME_STOCK_BUTTON_CANCEL); + editable = g_value_get_boolean (value); + e_contact_editor_fullname->editable = editable; - gtk_window_set_policy(GTK_WINDOW(e_contact_editor_fullname), TRUE, TRUE, FALSE); + for (i = 0; widget_names[i] != NULL; i++) { + GtkWidget *widget; - e_contact_editor_fullname->name = NULL; - gui = glade_xml_new (EVOLUTION_GLADEDIR "/fullname.glade", NULL); - e_contact_editor_fullname->gui = gui; - - widget = glade_xml_get_widget(gui, "dialog-checkfullname"); - gtk_window_set_title (GTK_WINDOW (e_contact_editor_fullname), - GTK_WINDOW (widget)->title); - - widget = glade_xml_get_widget(gui, "table-checkfullname"); - gtk_widget_ref(widget); - gtk_container_remove(GTK_CONTAINER(widget->parent), widget); - gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (e_contact_editor_fullname)->vbox), widget, TRUE, TRUE, 0); - gtk_widget_unref(widget); - - icon_path = g_concat_dir_and_file (EVOLUTION_ICONSDIR, "evolution-contacts-mini.png"); - gnome_window_icon_set_from_file (GTK_WINDOW (e_contact_editor_fullname), icon_path); - g_free (icon_path); -} + widget = e_builder_get_widget ( + e_contact_editor_fullname->builder, + widget_names[i]); -void -e_contact_editor_fullname_destroy (GtkObject *object) -{ - EContactEditorFullname *e_contact_editor_fullname = E_CONTACT_EDITOR_FULLNAME(object); + if (GTK_IS_ENTRY (widget)) { + gtk_editable_set_editable ( + GTK_EDITABLE (widget), editable); - if (e_contact_editor_fullname->gui) - gtk_object_unref(GTK_OBJECT(e_contact_editor_fullname->gui)); - e_card_name_unref(e_contact_editor_fullname->name); -} + } else if (GTK_IS_COMBO_BOX (widget)) { + GtkWidget *child; -GtkWidget* -e_contact_editor_fullname_new (const ECardName *name) -{ - GtkWidget *widget = GTK_WIDGET (gtk_type_new (e_contact_editor_fullname_get_type ())); - gtk_object_set (GTK_OBJECT(widget), - "name", name, - NULL); - return widget; -} + child = gtk_bin_get_child (GTK_BIN (widget)); -static void -e_contact_editor_fullname_set_arg (GtkObject *o, GtkArg *arg, guint arg_id) -{ - EContactEditorFullname *e_contact_editor_fullname; + gtk_editable_set_editable ( + GTK_EDITABLE (child), editable); + gtk_widget_set_sensitive (widget, editable); - e_contact_editor_fullname = E_CONTACT_EDITOR_FULLNAME (o); - - switch (arg_id){ - case ARG_NAME: - e_card_name_unref(e_contact_editor_fullname->name); - e_contact_editor_fullname->name = e_card_name_copy(GTK_VALUE_POINTER (*arg)); - fill_in_info(e_contact_editor_fullname); - break; - case ARG_IS_READ_ONLY: { - int i; - char *entry_names[] = { - "combo-title", - "combo-suffix", - "entry-first", - "entry-middle", - "entry-last", - NULL - }; - e_contact_editor_fullname->editable = GTK_VALUE_BOOL (*arg) ? TRUE : FALSE; - for (i = 0; entry_names[i] != NULL; i ++) { - GtkWidget *w = glade_xml_get_widget(e_contact_editor_fullname->gui, entry_names[i]); - if (GTK_IS_ENTRY (w)) { - gtk_entry_set_editable (GTK_ENTRY (w), - e_contact_editor_fullname->editable); - } - else if (GTK_IS_COMBO (w)) { - gtk_entry_set_editable (GTK_ENTRY (GTK_COMBO (w)->entry), - e_contact_editor_fullname->editable); - gtk_widget_set_sensitive (GTK_COMBO (w)->button, e_contact_editor_fullname->editable); + } else if (GTK_IS_LABEL (widget)) { + gtk_widget_set_sensitive (widget, editable); } } break; } + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; } } static void -e_contact_editor_fullname_get_arg (GtkObject *object, GtkArg *arg, guint arg_id) +e_contact_editor_fullname_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) { EContactEditorFullname *e_contact_editor_fullname; e_contact_editor_fullname = E_CONTACT_EDITOR_FULLNAME (object); - switch (arg_id) { - case ARG_NAME: - extract_info(e_contact_editor_fullname); - GTK_VALUE_POINTER (*arg) = e_card_name_ref(e_contact_editor_fullname->name); + switch (property_id) { + case PROP_NAME: + extract_info (e_contact_editor_fullname); + g_value_set_pointer ( + value, e_contact_name_copy ( + e_contact_editor_fullname->name)); break; - case ARG_IS_READ_ONLY: - GTK_VALUE_BOOL (*arg) = e_contact_editor_fullname->editable ? TRUE : FALSE; + case PROP_EDITABLE: + g_value_set_boolean ( + value, e_contact_editor_fullname->editable); break; default: - arg->type = GTK_TYPE_INVALID; + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; } } static void -fill_in_field(EContactEditorFullname *editor, char *field, char *string) +e_contact_editor_fullname_dispose (GObject *object) +{ + EContactEditorFullname *e_contact_editor_fullname; + + e_contact_editor_fullname = E_CONTACT_EDITOR_FULLNAME (object); + + if (e_contact_editor_fullname->builder) { + g_object_unref (e_contact_editor_fullname->builder); + e_contact_editor_fullname->builder = NULL; + } + + if (e_contact_editor_fullname->name) { + e_contact_name_free (e_contact_editor_fullname->name); + e_contact_editor_fullname->name = NULL; + } + + /* Chain up to parent's dispose() method. */ + G_OBJECT_CLASS (e_contact_editor_fullname_parent_class)->dispose (object); +} + +static void +e_contact_editor_fullname_class_init (EContactEditorFullnameClass *class) +{ + GObjectClass *object_class; + + object_class = G_OBJECT_CLASS (class); + object_class->set_property = e_contact_editor_fullname_set_property; + object_class->get_property = e_contact_editor_fullname_get_property; + object_class->dispose = e_contact_editor_fullname_dispose; + + g_object_class_install_property ( + object_class, + PROP_NAME, + g_param_spec_pointer ( + "name", + "Name", + NULL, + G_PARAM_READWRITE)); + + g_object_class_install_property ( + object_class, + PROP_EDITABLE, + g_param_spec_boolean ( + "editable", + "Editable", + NULL, + FALSE, + G_PARAM_READWRITE)); +} + +static void +e_contact_editor_fullname_init (EContactEditorFullname *e_contact_editor_fullname) +{ + GtkBuilder *builder; + GtkDialog *dialog; + GtkWidget *parent; + GtkWidget *widget; + GtkWidget *action_area; + GtkWidget *content_area; + const gchar *title; + + dialog = GTK_DIALOG (e_contact_editor_fullname); + action_area = gtk_dialog_get_action_area (dialog); + content_area = gtk_dialog_get_content_area (dialog); + + gtk_widget_realize (GTK_WIDGET (e_contact_editor_fullname)); + gtk_container_set_border_width (GTK_CONTAINER (action_area), 12); + gtk_container_set_border_width (GTK_CONTAINER (content_area), 0); + + gtk_dialog_add_buttons ( + dialog, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + GTK_STOCK_OK, GTK_RESPONSE_OK, NULL); + + gtk_window_set_resizable (GTK_WINDOW (dialog), TRUE); + + e_contact_editor_fullname->name = NULL; + + builder = gtk_builder_new (); + e_load_ui_builder_definition (builder, "fullname.ui"); + + e_contact_editor_fullname->builder = builder; + + widget = e_builder_get_widget (builder, "dialog-checkfullname"); + title = gtk_window_get_title (GTK_WINDOW (widget)); + gtk_window_set_title (GTK_WINDOW (e_contact_editor_fullname), title); + + widget = e_builder_get_widget (builder, "table-checkfullname"); + parent = gtk_widget_get_parent (widget); + g_object_ref (widget); + gtk_container_remove (GTK_CONTAINER (parent), widget); + gtk_box_pack_start (GTK_BOX (content_area), widget, TRUE, TRUE, 0); + g_object_unref (widget); + + gtk_window_set_icon_name ( + GTK_WINDOW (e_contact_editor_fullname), "contact-new"); +} + +GtkWidget * +e_contact_editor_fullname_new (const EContactName *name) +{ + GtkWidget *widget = g_object_new (E_TYPE_CONTACT_EDITOR_FULLNAME, NULL); + + g_object_set ( + widget, + "name", name, + NULL); + return widget; +} + +static void +fill_in_field (EContactEditorFullname *editor, + const gchar *field, + const gchar *string) { - GtkEntry *entry = GTK_ENTRY(glade_xml_get_widget(editor->gui, field)); + GtkWidget *widget = e_builder_get_widget (editor->builder, field); + GtkEntry *entry = NULL; + + if (GTK_IS_ENTRY (widget)) + entry = GTK_ENTRY (widget); + else if (GTK_IS_COMBO_BOX (widget)) + entry = GTK_ENTRY (gtk_bin_get_child (GTK_BIN (widget))); + if (entry) { if (string) - e_utf8_gtk_entry_set_text(entry, string); + gtk_entry_set_text (entry, string); else - gtk_entry_set_text(entry, ""); + gtk_entry_set_text (entry, ""); } } static void -fill_in_info(EContactEditorFullname *editor) +fill_in_info (EContactEditorFullname *editor) { - ECardName *name = editor->name; + EContactName *name = editor->name; if (name) { - fill_in_field(editor, "entry-title", name->prefix); - fill_in_field(editor, "entry-first", name->given); - fill_in_field(editor, "entry-middle", name->additional); - fill_in_field(editor, "entry-last", name->family); - fill_in_field(editor, "entry-suffix", name->suffix); + fill_in_field (editor, "comboentry-title", name->prefixes); + fill_in_field (editor, "entry-first", name->given); + fill_in_field (editor, "entry-middle", name->additional); + fill_in_field (editor, "entry-last", name->family); + fill_in_field (editor, "comboentry-suffix", name->suffixes); } } -static char * -extract_field(EContactEditorFullname *editor, char *field) +static gchar * +extract_field (EContactEditorFullname *editor, + const gchar *field) { - GtkEntry *entry = GTK_ENTRY(glade_xml_get_widget(editor->gui, field)); + GtkWidget *widget = e_builder_get_widget (editor->builder, field); + GtkEntry *entry = NULL; + + if (GTK_IS_ENTRY (widget)) + entry = GTK_ENTRY (widget); + else if (GTK_IS_COMBO_BOX (widget)) + entry = GTK_ENTRY (gtk_bin_get_child (GTK_BIN (widget))); + if (entry) - return e_utf8_gtk_entry_get_text(entry); + return g_strdup (gtk_entry_get_text (entry)); else return NULL; } static void -extract_info(EContactEditorFullname *editor) +extract_info (EContactEditorFullname *editor) { - ECardName *name = editor->name; + EContactName *name = editor->name; if (!name) { - name = e_card_name_new(); + name = e_contact_name_new (); editor->name = name; } - name->prefix = extract_field(editor, "entry-title" ); - name->given = extract_field(editor, "entry-first" ); - name->additional = extract_field(editor, "entry-middle"); - name->family = extract_field(editor, "entry-last" ); - name->suffix = extract_field(editor, "entry-suffix"); + name->prefixes = extract_field (editor, "comboentry-title"); + name->given = extract_field (editor, "entry-first"); + name->additional = extract_field (editor, "entry-middle"); + name->family = extract_field (editor, "entry-last"); + name->suffixes = extract_field (editor, "comboentry-suffix"); } |