/*
* 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
* 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
*
*
* Authors:
* Chris Toshok
*
* Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
*
*/
#ifdef HAVE_CONFIG_H
#include
#endif
#include
#include "e-util/e-util.h"
#include "e-util/e-util-private.h"
#include "e-contact-editor-fullname.h"
static void fill_in_info (EContactEditorFullname *editor);
static void extract_info (EContactEditorFullname *editor);
/* The arguments we take */
enum {
PROP_0,
PROP_NAME,
PROP_EDITABLE
};
G_DEFINE_TYPE (
EContactEditorFullname,
e_contact_editor_fullname,
GTK_TYPE_DIALOG)
static void
e_contact_editor_fullname_set_property (GObject *object,
guint property_id,
const GValue *value,
GParamSpec *pspec)
{
EContactEditorFullname *e_contact_editor_fullname;
e_contact_editor_fullname = E_CONTACT_EDITOR_FULLNAME (object);
switch (property_id) {
case PROP_NAME:
e_contact_name_free (e_contact_editor_fullname->name);
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;
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
};
editable = g_value_get_boolean (value);
e_contact_editor_fullname->editable = editable;
for (i = 0; widget_names[i] != NULL; i++) {
GtkWidget *widget;
widget = e_builder_get_widget (
e_contact_editor_fullname->builder,
widget_names[i]);
if (GTK_IS_ENTRY (widget)) {
gtk_editable_set_editable (
GTK_EDITABLE (widget), editable);
} else if (GTK_IS_COMBO_BOX (widget)) {
GtkWidget *child;
child = gtk_bin_get_child (GTK_BIN (widget));
gtk_editable_set_editable (
GTK_EDITABLE (child), editable);
gtk_widget_set_sensitive (widget, 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_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 (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 PROP_EDITABLE:
g_value_set_boolean (
value, e_contact_editor_fullname->editable);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
break;
}
}
static void
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)
{
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)
gtk_entry_set_text (entry, string);
else
gtk_entry_set_text(entry, "");
}
}
static void
fill_in_info (EContactEditorFullname *editor)
{
EContactName *name = editor->name;
if (name) {
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 gchar *
extract_field (EContactEditorFullname *editor,
const gchar *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 g_strdup (gtk_entry_get_text (entry));
else
return NULL;
}
static void
extract_info (EContactEditorFullname *editor)
{
EContactName *name = editor->name;
if (!name) {
name = e_contact_name_new ();
editor->name = name;
}
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");
}