added functions to set a callback to get the current time, which is used

2001-07-02  Damon Chaplin  <damon@ximian.com>

	* 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
This commit is contained in:
Damon Chaplin
2001-07-03 04:12:17 +00:00
committed by Damon Chaplin
parent 0e27010e0b
commit bacd3a85a4
7 changed files with 230 additions and 50 deletions

View File

@ -1,3 +1,11 @@
2001-07-02 Damon Chaplin <damon@ximian.com>
* 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 <fejj@ximian.com>
* e-charset-picker.c (e_charset_picker_bonobo_ui_populate): Take a

View File

@ -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;
}

View File

@ -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 */

View File

@ -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;
}

View File

@ -30,6 +30,7 @@
#ifndef _E_CELL_DATE_EDIT_H_
#define _E_CELL_DATE_EDIT_H_
#include <time.h>
#include <gal/e-table/e-cell-popup.h>
#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_ */

View File

@ -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;
}

View File

@ -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