/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* * Author : * Damon Chaplin * * 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 #include #include #include #include #include "dialogs/e-timezone-dialog.h" #include "e-timezone-entry.h" struct _ETimezoneEntryPrivate { GtkWidget *entry; GtkWidget *button; }; 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; 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 (); 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)); } 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); }