aboutsummaryrefslogtreecommitdiffstats
path: root/calendar/gui/e-timezone-entry.c
diff options
context:
space:
mode:
Diffstat (limited to 'calendar/gui/e-timezone-entry.c')
-rw-r--r--calendar/gui/e-timezone-entry.c277
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);
+}