diff options
Diffstat (limited to 'calendar/gui/e-timezone-entry.c')
-rw-r--r-- | calendar/gui/e-timezone-entry.c | 277 |
1 files changed, 277 insertions, 0 deletions
diff --git a/calendar/gui/e-timezone-entry.c b/calendar/gui/e-timezone-entry.c new file mode 100644 index 0000000000..6bf7625c32 --- /dev/null +++ b/calendar/gui/e-timezone-entry.c @@ -0,0 +1,277 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ + +/* + * Author : + * Damon Chaplin <damon@ximian.com> + * + * Copyright 2001, Ximian, Inc. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * 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. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + * USA + */ + +/* + * ETimezoneEntry - a field for setting a timezone. It shows the timezone in + * a GtkEntry with a '...' button beside it which shows a dialog for changing + * the timezone. The dialog contains a map of the world with a point for each + * timezone, and an option menu as an alternative way of selecting the + * timezone. + */ + +#include <config.h> +#include <gtk/gtkbutton.h> +#include <gtk/gtkentry.h> +#include <gtk/gtksignal.h> +#include <gnome.h> +#include "dialogs/e-timezone-dialog.h" +#include "e-timezone-entry.h" + + +struct _ETimezoneEntryPrivate { + GtkWidget *entry; + GtkWidget *button; + + CalClient *client; +}; + + +enum { + CHANGED, + LAST_SIGNAL +}; + + +static void e_timezone_entry_class_init (ETimezoneEntryClass *class); +static void e_timezone_entry_init (ETimezoneEntry *tentry); +static void e_timezone_entry_destroy (GtkObject *object); + +static void on_entry_changed (GtkEntry *entry, + ETimezoneEntry *tentry); +static void on_button_clicked (GtkWidget *widget, + ETimezoneEntry *tentry); + + +static GtkHBoxClass *parent_class; +static guint timezone_entry_signals[LAST_SIGNAL] = { 0 }; + + +/** + * e_timezone_entry_get_type: + * + * Returns the GtkType for the ETimezoneEntry widget + */ +guint +e_timezone_entry_get_type (void) +{ + static guint timezone_entry_type = 0; + + if (!timezone_entry_type){ + GtkTypeInfo timezone_entry_info = { + "ETimezoneEntry", + sizeof (ETimezoneEntry), + sizeof (ETimezoneEntryClass), + (GtkClassInitFunc) e_timezone_entry_class_init, + (GtkObjectInitFunc) e_timezone_entry_init, + NULL, + NULL, + }; + + timezone_entry_type = gtk_type_unique (gtk_hbox_get_type (), &timezone_entry_info); + } + + return timezone_entry_type; +} + + +static void +e_timezone_entry_class_init (ETimezoneEntryClass *class) +{ + GtkObjectClass *object_class = (GtkObjectClass *) class; + + object_class = (GtkObjectClass*) class; + + parent_class = gtk_type_class (gtk_hbox_get_type ()); + + timezone_entry_signals[CHANGED] = + gtk_signal_new ("changed", + GTK_RUN_LAST, + object_class->type, + GTK_SIGNAL_OFFSET (ETimezoneEntryClass, + changed), + gtk_marshal_NONE__NONE, + GTK_TYPE_NONE, 0); + + gtk_object_class_add_signals (object_class, timezone_entry_signals, + LAST_SIGNAL); + + object_class->destroy = e_timezone_entry_destroy; + + class->changed = NULL; +} + + +static void +e_timezone_entry_init (ETimezoneEntry *tentry) +{ + ETimezoneEntryPrivate *priv; + + tentry->priv = priv = g_new0 (ETimezoneEntryPrivate, 1); + + priv->entry = gtk_entry_new (); + gtk_entry_set_editable (GTK_ENTRY (priv->entry), FALSE); + /*gtk_widget_set_usize (priv->date_entry, 90, 0);*/ + gtk_box_pack_start (GTK_BOX (tentry), priv->entry, TRUE, TRUE, 0); + gtk_widget_show (priv->entry); + gtk_signal_connect (GTK_OBJECT (priv->entry), "changed", + GTK_SIGNAL_FUNC (on_entry_changed), tentry); + + priv->button = gtk_button_new_with_label ("..."); + gtk_signal_connect (GTK_OBJECT (priv->button), "clicked", + GTK_SIGNAL_FUNC (on_button_clicked), tentry); + gtk_box_pack_start (GTK_BOX (tentry), priv->button, FALSE, FALSE, 0); + gtk_widget_show (priv->button); +} + + +/** + * e_timezone_entry_new: + * + * Description: Creates a new #ETimezoneEntry widget which can be used + * to provide an easy to use way for entering dates and times. + * + * Returns: a new #ETimezoneEntry widget. + */ +GtkWidget * +e_timezone_entry_new (void) +{ + ETimezoneEntry *tentry; + + tentry = gtk_type_new (e_timezone_entry_get_type ()); + + return GTK_WIDGET (tentry); +} + + +static void +e_timezone_entry_destroy (GtkObject *object) +{ + ETimezoneEntry *tentry; + ETimezoneEntryPrivate *priv; + + g_return_if_fail (E_IS_TIMEZONE_ENTRY (object)); + + tentry = E_TIMEZONE_ENTRY (object); + priv = tentry->priv; + + if (priv->client) { + gtk_object_unref (GTK_OBJECT (priv->client)); + priv->client = NULL; + } + + g_free (tentry->priv); + tentry->priv = NULL; + + if (GTK_OBJECT_CLASS (parent_class)->destroy) + (* GTK_OBJECT_CLASS (parent_class)->destroy) (object); +} + + +/* The arrow button beside the date field has been clicked, so we show the + popup with the ECalendar in. */ +static void +on_button_clicked (GtkWidget *widget, + ETimezoneEntry *tentry) +{ + ETimezoneEntryPrivate *priv; + ETimezoneDialog *timezone_dialog; + GtkWidget *dialog; + char *zone; + + priv = tentry->priv; + + timezone_dialog = e_timezone_dialog_new (); + e_timezone_dialog_set_cal_client (timezone_dialog, priv->client); + zone = e_timezone_entry_get_timezone (tentry); + e_timezone_dialog_set_timezone (timezone_dialog, zone); + + dialog = e_timezone_dialog_get_toplevel (timezone_dialog); + + if (gnome_dialog_run_and_close (GNOME_DIALOG (dialog)) == 0) { + zone = e_timezone_dialog_get_timezone (E_TIMEZONE_DIALOG (timezone_dialog)); + e_timezone_entry_set_timezone (tentry, zone); + } + + gtk_object_unref (GTK_OBJECT (timezone_dialog)); +} + + +/** + * e_timezone_entry_set_cal_client: + * @tentry: An #ETimezoneEntry. + * @client: Calendar client. + * + * Sets the calendar client that the timezone entry uses to get the timezone + * information. + **/ +void +e_timezone_entry_set_cal_client (ETimezoneEntry *tentry, CalClient *client) +{ + ETimezoneEntryPrivate *priv; + + g_return_if_fail (tentry != NULL); + g_return_if_fail (E_IS_TIMEZONE_ENTRY (tentry)); + + priv = tentry->priv; + + if (client == priv->client) + return; + + if (client) { + g_return_if_fail (IS_CAL_CLIENT (client)); + gtk_object_ref (GTK_OBJECT (client)); + } + + if (priv->client) + gtk_object_unref (GTK_OBJECT (priv->client)); + + priv->client = client; +} + + +static void +on_entry_changed (GtkEntry *entry, + ETimezoneEntry *tentry) +{ + gtk_signal_emit (GTK_OBJECT (tentry), timezone_entry_signals[CHANGED]); +} + + +char* +e_timezone_entry_get_timezone (ETimezoneEntry *tentry) +{ + g_return_val_if_fail (E_IS_TIMEZONE_ENTRY (tentry), NULL); + + return gtk_entry_get_text (GTK_ENTRY (tentry->priv->entry)); +} + + +void +e_timezone_entry_set_timezone (ETimezoneEntry *tentry, + char *timezone) +{ + g_return_if_fail (E_IS_TIMEZONE_ENTRY (tentry)); + + gtk_entry_set_text (GTK_ENTRY (tentry->priv->entry), timezone); +} |