From 5938953eeaf3ccb311b6d24dc0cd70c88de815c9 Mon Sep 17 00:00:00 2001 From: Damon Chaplin Date: Thu, 14 Jun 2001 06:21:38 +0000 Subject: new widget to enter a timezone. 2001-06-14 Damon Chaplin * gui/e-timezone-entry.[hc]: new widget to enter a timezone. * gui/Makefile.am (evolution_calendar_SOURCES): added the above. * gui/Makefile.am (evolution_calendar_LDADD): had to move libcal-dialogs.a above libmiscwidgets.a to get it to compile. svn path=/trunk/; revision=10228 --- calendar/ChangeLog | 8 ++ calendar/gui/Makefile.am | 6 +- calendar/gui/e-timezone-entry.c | 277 ++++++++++++++++++++++++++++++++++++++++ calendar/gui/e-timezone-entry.h | 79 ++++++++++++ 4 files changed, 368 insertions(+), 2 deletions(-) create mode 100644 calendar/gui/e-timezone-entry.c create mode 100644 calendar/gui/e-timezone-entry.h (limited to 'calendar') diff --git a/calendar/ChangeLog b/calendar/ChangeLog index f25155b5d0..cf5ff30325 100644 --- a/calendar/ChangeLog +++ b/calendar/ChangeLog @@ -1,3 +1,11 @@ +2001-06-14 Damon Chaplin + + * gui/e-timezone-entry.[hc]: new widget to enter a timezone. + + * gui/Makefile.am (evolution_calendar_SOURCES): added the above. + * gui/Makefile.am (evolution_calendar_LDADD): had to move + libcal-dialogs.a above libmiscwidgets.a to get it to compile. + 2001-06-14 Damon Chaplin * gui/dialogs/e-timezone-dialog.[hc]: diff --git a/calendar/gui/Makefile.am b/calendar/gui/Makefile.am index 59850d48f5..6c6b52302a 100644 --- a/calendar/gui/Makefile.am +++ b/calendar/gui/Makefile.am @@ -87,6 +87,8 @@ evolution_calendar_SOURCES = \ e-week-view.h \ e-tasks.c \ e-tasks.h \ + e-timezone-entry.c \ + e-timezone-entry.h \ gnome-cal.c \ gnome-cal.h \ goto.c \ @@ -118,9 +120,9 @@ evolution_calendar_LDADD = \ $(top_builddir)/libversit/libversit.la \ $(top_builddir)/libical/src/libical/libical.la \ $(top_builddir)/widgets/meeting-time-sel/libevolutionmtsel.a \ - $(top_builddir)/widgets/misc/libemiscwidgets.a \ - $(EXTRA_GNOME_LIBS) \ dialogs/libcal-dialogs.a \ + $(top_builddir)/widgets/misc/libemiscwidgets.a \ + $(EXTRA_GNOME_LIBS) \ $(BONOBO_HTML_GNOME_LIBS) \ $(GNOME_VFS_LIBS) \ $(GAL_LIBS) \ 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 + * + * 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; + + 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); +} diff --git a/calendar/gui/e-timezone-entry.h b/calendar/gui/e-timezone-entry.h new file mode 100644 index 0000000000..f5a32915a2 --- /dev/null +++ b/calendar/gui/e-timezone-entry.h @@ -0,0 +1,79 @@ +/* -*- 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. + */ + +#ifndef __E_TIMEZONE_ENTRY_H_ +#define __E_TIMEZONE_ENTRY_H_ + +#include +#include +#include + +BEGIN_GNOME_DECLS + + +#define E_TYPE_TIMEZONE_ENTRY (e_timezone_entry_get_type ()) +#define E_TIMEZONE_ENTRY(obj) (GTK_CHECK_CAST ((obj), E_TYPE_TIMEZONE_ENTRY, ETimezoneEntry)) +#define E_TIMEZONE_ENTRY_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_TIMEZONE_ENTRY, ETimezoneEntryClass)) +#define E_IS_TIMEZONE_ENTRY(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_TIMEZONE_ENTRY)) +#define E_IS_TIMEZONE_ENTRY_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), E_TYPE_TIMEZONE_ENTRY)) + + +typedef struct _ETimezoneEntry ETimezoneEntry; +typedef struct _ETimezoneEntryPrivate ETimezoneEntryPrivate; +typedef struct _ETimezoneEntryClass ETimezoneEntryClass; + +struct _ETimezoneEntry { + GtkHBox hbox; + + /*< private >*/ + ETimezoneEntryPrivate *priv; +}; + +struct _ETimezoneEntryClass { + GtkHBoxClass parent_class; + + void (* changed) (ETimezoneEntry *tentry); +}; + +guint e_timezone_entry_get_type (void); +GtkWidget* e_timezone_entry_new (void); + +void e_timezone_entry_set_cal_client (ETimezoneEntry *tentry, + CalClient *client); + +char* e_timezone_entry_get_timezone (ETimezoneEntry *tentry); +void e_timezone_entry_set_timezone (ETimezoneEntry *tentry, + char *timezone); + +END_GNOME_DECLS + +#endif /* __E_TIMEZONE_ENTRY_H_ */ -- cgit v1.2.3