From bacd3a85a434032316b3e63b95282175ce2b0659 Mon Sep 17 00:00:00 2001 From: Damon Chaplin Date: Tue, 3 Jul 2001 04:12:17 +0000 Subject: added functions to set a callback to get the current time, which is used 2001-07-02 Damon Chaplin * e-calendar-item.c: * e-cell-date-edit.c: * e-dateedit.c: added functions to set a callback to get the current time, which is used instead of localtime(). We need this as we have to use our own timezones. svn path=/trunk/; revision=10728 --- widgets/misc/ChangeLog | 8 +++ widgets/misc/e-calendar-item.c | 43 +++++++++++++--- widgets/misc/e-calendar-item.h | 19 +++++++ widgets/misc/e-cell-date-edit.c | 57 ++++++++++++++++----- widgets/misc/e-cell-date-edit.h | 31 ++++++++++-- widgets/misc/e-dateedit.c | 106 ++++++++++++++++++++++++++++++---------- widgets/misc/e-dateedit.h | 16 +++++- 7 files changed, 230 insertions(+), 50 deletions(-) (limited to 'widgets') diff --git a/widgets/misc/ChangeLog b/widgets/misc/ChangeLog index 5066477a8c..e992692c71 100644 --- a/widgets/misc/ChangeLog +++ b/widgets/misc/ChangeLog @@ -1,3 +1,11 @@ +2001-07-02 Damon Chaplin + + * e-calendar-item.c: + * e-cell-date-edit.c: + * e-dateedit.c: added functions to set a callback to get the current + time, which is used instead of localtime(). We need this as we have to + use our own timezones. + 2001-07-02 Jeffrey Stedfast * e-charset-picker.c (e_charset_picker_bonobo_ui_populate): Take a diff --git a/widgets/misc/e-calendar-item.c b/widgets/misc/e-calendar-item.c index c2f13ca1a6..c5399c14f8 100644 --- a/widgets/misc/e-calendar-item.c +++ b/widgets/misc/e-calendar-item.c @@ -415,8 +415,13 @@ e_calendar_item_init (ECalendarItem *calitem) calitem->date_range_changed = FALSE; calitem->style_callback = NULL; + calitem->style_callback_data = NULL; calitem->style_callback_destroy = NULL; + calitem->time_callback = NULL; + calitem->time_callback_data = NULL; + calitem->time_callback_destroy = NULL; + /* Translators: These are the first characters of each day of the week, 'M' for 'Monday', 'T' for Tuesday etc. */ calitem->days = _("MTWTFSS"); @@ -433,6 +438,7 @@ e_calendar_item_destroy (GtkObject *o) calitem = E_CALENDAR_ITEM (o); e_calendar_item_set_style_callback (calitem, NULL, NULL, NULL); + e_calendar_item_set_get_time_callback (calitem, NULL, NULL, NULL); g_free (calitem->styles); @@ -1162,7 +1168,7 @@ e_calendar_item_draw_day_numbers (ECalendarItem *calitem, GdkFont *font, *wkfont; GdkGC *fg_gc; GdkColor *bg_color, *fg_color, *box_color; - struct tm *today_tm; + struct tm today_tm; time_t t; gint char_height, min_cell_width, min_cell_height; gint day_num, drow, dcol, day_x, day_y; @@ -1235,11 +1241,15 @@ e_calendar_item_draw_day_numbers (ECalendarItem *calitem, } /* Get today's date, so we can highlight it. */ - t = time (NULL); - today_tm = localtime (&t); - today_year = today_tm->tm_year + 1900; - today_month = today_tm->tm_mon; - today_mday = today_tm->tm_mday; + if (calitem->time_callback) { + today_tm = (*calitem->time_callback) (calitem, calitem->time_callback_data); + } else { + t = time (NULL); + today_tm = *localtime (&t); + } + today_year = today_tm.tm_year + 1900; + today_month = today_tm.tm_mon; + today_mday = today_tm.tm_mday; /* We usually skip the last days of the previous month (mon = 0), except for the top-left month displayed. */ @@ -2827,7 +2837,7 @@ e_calendar_item_set_style_callback (ECalendarItem *calitem, { g_return_if_fail (E_IS_CALENDAR_ITEM (calitem)); - if (calitem->style_callback_data) + if (calitem->style_callback_data && calitem->style_callback_destroy) (*calitem->style_callback_destroy) (calitem->style_callback_data); calitem->style_callback = cb; @@ -2884,3 +2894,22 @@ e_calendar_item_signal_emission_idle_cb (gpointer data) return FALSE; } + +/* Sets a callback to use to get the current time. This is useful if the + application needs to use its own timezone data rather than rely on the + Unix timezone. */ +void +e_calendar_item_set_get_time_callback (ECalendarItem *calitem, + ECalendarItemGetTimeCallback cb, + gpointer data, + GtkDestroyNotify destroy) +{ + g_return_if_fail (E_IS_CALENDAR_ITEM (calitem)); + + if (calitem->time_callback_data && calitem->time_callback_destroy) + (*calitem->time_callback_destroy) (calitem->time_callback_data); + + calitem->time_callback = cb; + calitem->time_callback_data = data; + calitem->time_callback_destroy = destroy; +} diff --git a/widgets/misc/e-calendar-item.h b/widgets/misc/e-calendar-item.h index 3d4e582e39..0ef25ed62a 100644 --- a/widgets/misc/e-calendar-item.h +++ b/widgets/misc/e-calendar-item.h @@ -55,6 +55,8 @@ typedef enum typedef struct _ECalendarItem ECalendarItem; typedef struct _ECalendarItemClass ECalendarItemClass; +/* The type of the callback function optionally used to get the colors to + use for each day. */ typedef void (*ECalendarItemStyleCallback) (ECalendarItem *calitem, gint year, gint month, @@ -71,6 +73,11 @@ typedef void (*ECalendarItemStyleCallback) (ECalendarItem *calitem, gboolean *bold, gpointer data); +/* The type of the callback function optionally used to get the current time. + */ +typedef struct tm (*ECalendarItemGetTimeCallback) (ECalendarItem *calitem, + gpointer data); + #define E_CALENDAR_ITEM(obj) (GTK_CHECK_CAST((obj), \ e_calendar_item_get_type (), ECalendarItem)) @@ -199,6 +206,10 @@ struct _ECalendarItem gpointer style_callback_data; GtkDestroyNotify style_callback_destroy; + ECalendarItemGetTimeCallback time_callback; + gpointer time_callback_data; + GtkDestroyNotify time_callback_destroy; + /* Colors for drawing. */ GdkColor colors[E_CALENDAR_ITEM_COLOR_LAST]; @@ -313,6 +324,14 @@ void e_calendar_item_set_style_callback (ECalendarItem *calitem, gpointer data, GtkDestroyNotify destroy); +/* Sets a callback to use to get the current time. This is useful if the + application needs to use its own timezone data rather than rely on the + Unix timezone. */ +void e_calendar_item_set_get_time_callback (ECalendarItem *calitem, + ECalendarItemGetTimeCallback cb, + gpointer data, + GtkDestroyNotify destroy); + #ifdef __cplusplus } #endif /* __cplusplus */ diff --git a/widgets/misc/e-cell-date-edit.c b/widgets/misc/e-cell-date-edit.c index 6f572f2cd0..f6670c844e 100644 --- a/widgets/misc/e-cell-date-edit.c +++ b/widgets/misc/e-cell-date-edit.c @@ -155,6 +155,9 @@ e_cell_date_edit_init (ECellDateEdit *ecde) ecde->use_24_hour_format = TRUE; ecde->need_time_list_rebuild = TRUE; ecde->freeze_count = 0; + ecde->time_callback = NULL; + ecde->time_callback_data = NULL; + ecde->time_callback_destroy = NULL; /* We create one popup window for the ECell, since there will only ever be one popup in use at a time. */ @@ -281,6 +284,8 @@ e_cell_date_edit_destroy (GtkObject *object) { ECellDateEdit *ecde = E_CELL_DATE_EDIT (object); + e_cell_date_edit_set_get_time_callback (ecde, NULL, NULL, NULL); + gtk_widget_unref (ecde->popup_window); GTK_OBJECT_CLASS (parent_class)->destroy (object); @@ -742,15 +747,19 @@ static void e_cell_date_edit_on_now_clicked (GtkWidget *button, ECellDateEdit *ecde) { - struct tm *tmp_tm; + struct tm tmp_tm; time_t t; char buffer[64]; g_print ("In e_cell_date_edit_on_now_clicked\n"); - t = time (NULL); - tmp_tm = localtime (&t); - e_time_format_date_and_time (tmp_tm, + if (ecde->time_callback) { + tmp_tm = (*ecde->time_callback) (ecde, ecde->time_callback_data); + } else { + t = time (NULL); + tmp_tm = *localtime (&t); + } + e_time_format_date_and_time (&tmp_tm, ecde->use_24_hour_format, TRUE, FALSE, buffer, sizeof (buffer)); @@ -775,18 +784,23 @@ static void e_cell_date_edit_on_today_clicked (GtkWidget *button, ECellDateEdit *ecde) { - struct tm *tmp_tm; + struct tm tmp_tm; time_t t; char buffer[64]; g_print ("In e_cell_date_edit_on_today_clicked\n"); - t = time (NULL); - tmp_tm = localtime (&t); - tmp_tm->tm_hour = 0; - tmp_tm->tm_min = 0; - tmp_tm->tm_sec = 0; - e_time_format_date_and_time (tmp_tm, + if (ecde->time_callback) { + tmp_tm = (*ecde->time_callback) (ecde, ecde->time_callback_data); + } else { + t = time (NULL); + tmp_tm = *localtime (&t); + } + + tmp_tm.tm_hour = 0; + tmp_tm.tm_min = 0; + tmp_tm.tm_sec = 0; + e_time_format_date_and_time (&tmp_tm, ecde->use_24_hour_format, FALSE, FALSE, buffer, sizeof (buffer)); @@ -873,3 +887,24 @@ e_cell_date_edit_thaw (ECellDateEdit *ecde) } } + +/* Sets a callback to use to get the current time. This is useful if the + application needs to use its own timezone data rather than rely on the + Unix timezone. */ +void +e_cell_date_edit_set_get_time_callback (ECellDateEdit *ecde, + ECellDateEditGetTimeCallback cb, + gpointer data, + GtkDestroyNotify destroy) +{ + g_return_if_fail (E_IS_CELL_DATE_EDIT (ecde)); + + if (ecde->time_callback_data && ecde->time_callback_destroy) + (*ecde->time_callback_destroy) (ecde->time_callback_data); + + ecde->time_callback = cb; + ecde->time_callback_data = data; + ecde->time_callback_destroy = destroy; +} + + diff --git a/widgets/misc/e-cell-date-edit.h b/widgets/misc/e-cell-date-edit.h index f3f8beb02b..67af112c94 100644 --- a/widgets/misc/e-cell-date-edit.h +++ b/widgets/misc/e-cell-date-edit.h @@ -30,6 +30,7 @@ #ifndef _E_CELL_DATE_EDIT_H_ #define _E_CELL_DATE_EDIT_H_ +#include #include #define E_CELL_DATE_EDIT_TYPE (e_cell_date_edit_get_type ()) @@ -39,7 +40,15 @@ #define E_IS_CELL_DATE_EDIT_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_CELL_DATE_EDIT_TYPE)) -typedef struct { +typedef struct _ECellDateEdit ECellDateEdit; +typedef struct _ECellDateEditClass ECellDateEditClass; + +/* The type of the callback function optionally used to get the current time. + */ +typedef struct tm (*ECellDateEditGetTimeCallback) (ECellDateEdit *ecde, + gpointer data); + +struct _ECellDateEdit { ECellPopup parent; GtkWidget *popup_window; @@ -64,11 +73,15 @@ typedef struct { /* The freeze count for rebuilding the time list. We only rebuild when this is 0. */ gint freeze_count; -} ECellDateEdit; -typedef struct { + ECellDateEditGetTimeCallback time_callback; + gpointer time_callback_data; + GtkDestroyNotify time_callback_destroy; +}; + +struct _ECellDateEditClass { ECellPopupClass parent_class; -} ECellDateEditClass; +}; GtkType e_cell_date_edit_get_type (void); @@ -81,4 +94,14 @@ ECell *e_cell_date_edit_new (void); void e_cell_date_edit_freeze (ECellDateEdit *ecde); void e_cell_date_edit_thaw (ECellDateEdit *ecde); + +/* Sets a callback to use to get the current time. This is useful if the + application needs to use its own timezone data rather than rely on the + Unix timezone. */ +void e_cell_date_edit_set_get_time_callback(ECellDateEdit *ecde, + ECellDateEditGetTimeCallback cb, + gpointer data, + GtkDestroyNotify destroy); + + #endif /* _E_CELL_DATE_EDIT_H_ */ diff --git a/widgets/misc/e-dateedit.c b/widgets/misc/e-dateedit.c index bcd1dc18ea..6abd74eb71 100644 --- a/widgets/misc/e-dateedit.c +++ b/widgets/misc/e-dateedit.c @@ -117,6 +117,10 @@ struct _EDateEditPrivate { gboolean time_set_to_none; gint hour; gint minute; + + EDateEditGetTimeCallback time_callback; + gpointer time_callback_data; + GtkDestroyNotify time_callback_destroy; }; enum { @@ -275,6 +279,9 @@ e_date_edit_init (EDateEdit *dedit) priv->date_set_to_none = TRUE; priv->time_is_valid = TRUE; priv->time_set_to_none = TRUE; + priv->time_callback = NULL; + priv->time_callback_data = NULL; + priv->time_callback_destroy = NULL; create_children (dedit); @@ -445,6 +452,8 @@ e_date_edit_destroy (GtkObject *object) dedit = E_DATE_EDIT (object); + e_date_edit_set_get_time_callback (dedit, NULL, NULL, NULL); + gtk_widget_destroy (dedit->priv->cal_popup); dedit->priv->cal_popup = NULL; @@ -530,13 +539,17 @@ e_date_edit_get_time (EDateEdit *dedit) * Description: Changes the displayed date and time in the EDateEdit * widget to be the one represented by @the_time. If @the_time is 0 * then current time is used. If it is -1, then the date is set to None. + * + * Note that the time is converted to local time using the Unix timezone, + * so if you are using your own timezones then you should use + * e_date_edit_set_date() and e_date_edit_set_time_of_day() instead. */ void e_date_edit_set_time (EDateEdit *dedit, time_t the_time) { EDateEditPrivate *priv; - struct tm *tmp_tm; + struct tm tmp_tm; gboolean date_changed = FALSE, time_changed = FALSE; g_return_if_fail (E_IS_DATE_EDIT (dedit)); @@ -549,20 +562,26 @@ e_date_edit_set_time (EDateEdit *dedit, time_changed = e_date_edit_set_time_internal (dedit, TRUE, TRUE, 0, 0); } else { - if (the_time == 0) - the_time = time (NULL); - - tmp_tm = localtime (&the_time); + if (the_time == 0) { + if (priv->time_callback) { + tmp_tm = (*priv->time_callback) (dedit, priv->time_callback_data); + } else { + the_time = time (NULL); + tmp_tm = *localtime (&the_time); + } + } else { + tmp_tm = *localtime (&the_time); + } date_changed = e_date_edit_set_date_internal (dedit, TRUE, FALSE, - tmp_tm->tm_year, - tmp_tm->tm_mon, - tmp_tm->tm_mday); + tmp_tm.tm_year, + tmp_tm.tm_mon, + tmp_tm.tm_mday); time_changed = e_date_edit_set_time_internal (dedit, TRUE, FALSE, - tmp_tm->tm_hour, - tmp_tm->tm_min); + tmp_tm.tm_hour, + tmp_tm.tm_min); } e_date_edit_update_date_entry (dedit); @@ -651,8 +670,8 @@ e_date_edit_set_date (EDateEdit *dedit, /** * e_date_edit_get_time_of_day: * @dedit: an #EDateEdit widget. - * @hour: returns the hour set. - * @minute: returns the minute set. + * @hour: returns the hour set, or 0 if the time isn't set. + * @minute: returns the minute set, or 0 if the time isn't set. * @Returns: TRUE if a time was set, or FALSE if the field is empty or 'None'. * * Returns the last valid time entered into the time field. @@ -671,13 +690,15 @@ e_date_edit_get_time_of_day (EDateEdit *dedit, /* Try to parse any new value now. */ e_date_edit_check_time_changed (dedit); - if (priv->time_set_to_none) + if (priv->time_set_to_none) { + *hour = 0; + *minute = 0; return FALSE; - - *hour = priv->hour; - *minute = priv->minute; - - return TRUE; + } else { + *hour = priv->hour; + *minute = priv->minute; + return TRUE; + } } @@ -951,10 +972,10 @@ e_date_edit_set_allow_no_date_set (EDateEdit *dedit, time is showing we make sure it isn't 'None'. */ if (dedit->priv->show_date) { if (dedit->priv->date_set_to_none) - e_date_edit_set_time (dedit, time (NULL)); + e_date_edit_set_time (dedit, 0); } else { if (dedit->priv->time_set_to_none) - e_date_edit_set_time (dedit, time (NULL)); + e_date_edit_set_time (dedit, 0); } } } @@ -1110,7 +1131,7 @@ on_date_popup_now_button_clicked (GtkWidget *button, EDateEdit *dedit) { hide_date_popup (dedit); - e_date_edit_set_time (dedit, time (NULL)); + e_date_edit_set_time (dedit, 0); } @@ -1118,16 +1139,23 @@ static void on_date_popup_today_button_clicked (GtkWidget *button, EDateEdit *dedit) { - struct tm *tmp_tm; + EDateEditPrivate *priv; + struct tm tmp_tm; time_t t; + priv = dedit->priv; + hide_date_popup (dedit); - t = time (NULL); - tmp_tm = localtime (&t); + if (priv->time_callback) { + tmp_tm = (*priv->time_callback) (dedit, priv->time_callback_data); + } else { + t = time (NULL); + tmp_tm = *localtime (&t); + } - e_date_edit_set_date (dedit, tmp_tm->tm_year + 1900, - tmp_tm->tm_mon + 1, tmp_tm->tm_mday); + e_date_edit_set_date (dedit, tmp_tm.tm_year + 1900, + tmp_tm.tm_mon + 1, tmp_tm.tm_mday); } @@ -1731,3 +1759,29 @@ e_date_edit_set_time_internal (EDateEdit *dedit, return time_changed; } + + +/* Sets a callback to use to get the current time. This is useful if the + application needs to use its own timezone data rather than rely on the + Unix timezone. */ +void +e_date_edit_set_get_time_callback (EDateEdit *dedit, + EDateEditGetTimeCallback cb, + gpointer data, + GtkDestroyNotify destroy) +{ + EDateEditPrivate *priv; + + g_return_if_fail (E_IS_DATE_EDIT (dedit)); + + priv = dedit->priv; + + if (priv->time_callback_data && priv->time_callback_destroy) + (*priv->time_callback_destroy) (priv->time_callback_data); + + priv->time_callback = cb; + priv->time_callback_data = data; + priv->time_callback_destroy = destroy; + +} + diff --git a/widgets/misc/e-dateedit.h b/widgets/misc/e-dateedit.h index 87a40b8d10..022cf1fd5f 100644 --- a/widgets/misc/e-dateedit.h +++ b/widgets/misc/e-dateedit.h @@ -56,11 +56,15 @@ BEGIN_GNOME_DECLS #define E_IS_DATE_EDIT(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_DATE_EDIT)) #define E_IS_DATE_EDIT_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), E_TYPE_DATE_EDIT)) - typedef struct _EDateEdit EDateEdit; typedef struct _EDateEditPrivate EDateEditPrivate; typedef struct _EDateEditClass EDateEditClass; +/* The type of the callback function optionally used to get the current time. + */ +typedef struct tm (*EDateEditGetTimeCallback) (EDateEdit *dedit, + gpointer data); + struct _EDateEdit { GtkHBox hbox; @@ -91,7 +95,7 @@ void e_date_edit_set_time (EDateEdit *dedit, /* This returns the last valid date set, without the time. It returns TRUE if a date is set, or FALSE if the date is set to 'None' and this is - permitted via e_date_edit_set_allow_no_date_set. */ + permitted via e_date_edit_set_allow_no_date_set. (Month is 1 - 12). */ gboolean e_date_edit_get_date (EDateEdit *dedit, gint *year, gint *month, @@ -150,6 +154,14 @@ void e_date_edit_set_time_popup_range (EDateEdit *dedit, gint lower_hour, gint upper_hour); +/* Sets a callback to use to get the current time. This is useful if the + application needs to use its own timezone data rather than rely on the + Unix timezone. */ +void e_date_edit_set_get_time_callback (EDateEdit *dedit, + EDateEditGetTimeCallback cb, + gpointer data, + GtkDestroyNotify destroy); + END_GNOME_DECLS #endif -- cgit