listen for changes in the date editors (schedule_page_set_dates): update

2001-10-21  JP Rosevear  <jpr@ximian.com>

	* gui/dialogs/schedule-page.c (init_widgets): listen for changes
	in the date editors
	(schedule_page_set_dates): update the times when they change
	elsewhere
	(update_time): set the time in the dialog
	(time_changed_cb): notify of changed times

	* gui/dialogs/comp-editor.c (page_dates_changed_cb): don't call
	the set dates function on the page that noted the change
	(page_summary_changed_cb): same for set summary function

	* gui/dialogs/event-page.c (update_time): move time setting stuff
	to util function
	(event_page_set_dates): use it
	(event_page_fill_component): ditto

	* gui/e-meeting-time-sel.h: fix comment

svn path=/trunk/; revision=13863
This commit is contained in:
JP Rosevear
2001-10-22 03:51:41 +00:00
committed by JP Rosevear
parent b1c2896995
commit d6e71d2ad9
5 changed files with 261 additions and 84 deletions

View File

@ -1,3 +1,23 @@
2001-10-21 JP Rosevear <jpr@ximian.com>
* gui/dialogs/schedule-page.c (init_widgets): listen for changes
in the date editors
(schedule_page_set_dates): update the times when they change
elsewhere
(update_time): set the time in the dialog
(time_changed_cb): notify of changed times
* gui/dialogs/comp-editor.c (page_dates_changed_cb): don't call
the set dates function on the page that noted the change
(page_summary_changed_cb): same for set summary function
* gui/dialogs/event-page.c (update_time): move time setting stuff
to util function
(event_page_set_dates): use it
(event_page_fill_component): ditto
* gui/e-meeting-time-sel.h: fix comment
2001-10-19 Federico Mena Quintero <federico@ximian.com>
* gui/alarm-notify/alarm-notify.c (add_uri_to_load): Do not assert

View File

@ -83,10 +83,10 @@ static void real_send_comp (CompEditor *editor, CalComponentItipMethod method);
static void delete_comp (CompEditor *editor);
static void close_dialog (CompEditor *editor);
static void page_changed_cb (GtkWidget *widget, gpointer data);
static void page_needs_send_cb (GtkWidget *widget, gpointer data);
static void page_summary_changed_cb (GtkWidget *widget, const char *summary, gpointer data);
static void page_dates_changed_cb (GtkWidget *widget, CompEditorPageDates *dates, gpointer data);
static void page_changed_cb (GtkObject *obj, gpointer data);
static void page_needs_send_cb (GtkObject *obj, gpointer data);
static void page_summary_changed_cb (GtkObject *obj, const char *summary, gpointer data);
static void page_dates_changed_cb (GtkObject *obj, CompEditorPageDates *dates, gpointer data);
static void obj_updated_cb (CalClient *client, const char *uid, gpointer data);
static void obj_removed_cb (CalClient *client, const char *uid, gpointer data);
@ -1147,7 +1147,7 @@ close_cmd (GtkWidget *widget, gpointer data)
}
static void
page_changed_cb (GtkWidget *widget, gpointer data)
page_changed_cb (GtkObject *obj, gpointer data)
{
CompEditor *editor = COMP_EDITOR (data);
CompEditorPrivate *priv;
@ -1158,7 +1158,7 @@ page_changed_cb (GtkWidget *widget, gpointer data)
}
static void
page_needs_send_cb (GtkWidget *widget, gpointer data)
page_needs_send_cb (GtkObject *obj, gpointer data)
{
CompEditor *editor = COMP_EDITOR (data);
CompEditorPrivate *priv;
@ -1170,7 +1170,7 @@ page_needs_send_cb (GtkWidget *widget, gpointer data)
/* Page signal callbacks */
static void
page_summary_changed_cb (GtkWidget *widget, const char *summary, gpointer data)
page_summary_changed_cb (GtkObject *obj, const char *summary, gpointer data)
{
CompEditor *editor = COMP_EDITOR (data);
CompEditorPrivate *priv;
@ -1179,13 +1179,14 @@ page_summary_changed_cb (GtkWidget *widget, const char *summary, gpointer data)
priv = editor->priv;
for (l = priv->pages; l != NULL; l = l->next)
comp_editor_page_set_summary (l->data, summary);
if (obj != l->data)
comp_editor_page_set_summary (l->data, summary);
priv->changed = TRUE;
}
static void
page_dates_changed_cb (GtkWidget *widget,
page_dates_changed_cb (GtkObject *obj,
CompEditorPageDates *dates,
gpointer data)
{
@ -1196,7 +1197,8 @@ page_dates_changed_cb (GtkWidget *widget,
priv = editor->priv;
for (l = priv->pages; l != NULL; l = l->next)
comp_editor_page_set_dates (l->data, dates);
if (obj != l->data)
comp_editor_page_set_dates (l->data, dates);
priv->changed = TRUE;
}

View File

@ -311,6 +311,81 @@ check_all_day (EventPage *epage)
}
}
static void
update_time (EventPage *epage, CalComponentDateTime *start_date, CalComponentDateTime *end_date)
{
EventPagePrivate *priv;
struct icaltimetype *start_tt, *end_tt;
icaltimezone *start_zone = NULL, *end_zone = NULL;
CalClientGetStatus status;
priv = epage->priv;
/* Note that if we are creating a new event, the timezones may not be
on the server, so we try to get the builtin timezone with the TZID
first. */
start_zone = icaltimezone_get_builtin_timezone_from_tzid (start_date->tzid);
if (!start_zone) {
status = cal_client_get_timezone (COMP_EDITOR_PAGE (epage)->client,
start_date->tzid,
&start_zone);
/* FIXME: Handle error better. */
if (status != CAL_CLIENT_GET_SUCCESS)
g_warning ("Couldn't get timezone from server: %s",
start_date->tzid ? start_date->tzid : "");
}
end_zone = icaltimezone_get_builtin_timezone_from_tzid (end_date->tzid);
if (!end_zone) {
status = cal_client_get_timezone (COMP_EDITOR_PAGE (epage)->client,
end_date->tzid,
&end_zone);
/* FIXME: Handle error better. */
if (status != CAL_CLIENT_GET_SUCCESS)
g_warning ("Couldn't get timezone from server: %s",
end_date->tzid ? end_date->tzid : "");
}
/* All-day events are inclusive, i.e. if the end date shown is 2nd Feb
then the event includes all of the 2nd Feb. We would normally show
3rd Feb as the end date, since it really ends at midnight on 3rd,
so we have to subtract a day so we only show the 2nd. */
start_tt = start_date->value;
end_tt = end_date->value;
if (start_tt->hour == 0 && start_tt->minute == 0 && start_tt->second == 0
&& end_tt->hour == 0 && end_tt->minute == 0 && end_tt->second == 0)
icaltime_adjust (end_tt, -1, 0, 0, 0);
gtk_signal_handler_block_by_data (GTK_OBJECT (priv->start_time),
epage);
gtk_signal_handler_block_by_data (GTK_OBJECT (priv->end_time), epage);
e_date_edit_set_date (E_DATE_EDIT (priv->start_time), start_tt->year,
start_tt->month, start_tt->day);
e_date_edit_set_time_of_day (E_DATE_EDIT (priv->start_time),
start_tt->hour, start_tt->minute);
e_date_edit_set_date (E_DATE_EDIT (priv->end_time), end_tt->year,
end_tt->month, end_tt->day);
e_date_edit_set_time_of_day (E_DATE_EDIT (priv->end_time),
end_tt->hour, end_tt->minute);
gtk_signal_handler_unblock_by_data (GTK_OBJECT (priv->start_time),
epage);
gtk_signal_handler_unblock_by_data (GTK_OBJECT (priv->end_time),
epage);
/* Set the timezones, and set sync_timezones to TRUE if both timezones
are the same. */
if (start_zone && end_zone) {
e_timezone_entry_set_timezone (E_TIMEZONE_ENTRY (priv->start_timezone),
start_zone);
e_timezone_entry_set_timezone (E_TIMEZONE_ENTRY (priv->end_timezone),
end_zone);
priv->sync_timezones = (start_zone == end_zone) ? TRUE : FALSE;
}
}
/* Fills the widgets with default values */
static void
clear_widgets (EventPage *epage)
@ -381,11 +456,8 @@ event_page_fill_widgets (CompEditorPage *page, CalComponent *comp)
CalComponentClassification cl;
CalComponentTransparency transparency;
CalComponentDateTime start_date, end_date;
GSList *l;
const char *categories;
CalClientGetStatus status;
struct icaltimetype *start_tt, *end_tt;
icaltimezone *start_zone = NULL, *end_zone = NULL;
GSList *l;
g_return_if_fail (page->client != NULL);
@ -413,76 +485,14 @@ event_page_fill_widgets (CompEditorPage *page, CalComponent *comp)
/* Start and end times */
cal_component_get_dtstart (comp, &start_date);
/* Note that if we are creating a new event, the timezones may not be
on the server, so we try to get the builtin timezone with the TZID
first. */
start_zone = icaltimezone_get_builtin_timezone_from_tzid (start_date.tzid);
if (!start_zone) {
status = cal_client_get_timezone (page->client,
start_date.tzid,
&start_zone);
/* FIXME: Handle error better. */
if (status != CAL_CLIENT_GET_SUCCESS)
g_warning ("Couldn't get timezone from server: %s",
start_date.tzid ? start_date.tzid : "");
}
cal_component_get_dtend (comp, &end_date);
end_zone = icaltimezone_get_builtin_timezone_from_tzid (end_date.tzid);
if (!end_zone) {
status = cal_client_get_timezone (page->client,
end_date.tzid,
&end_zone);
/* FIXME: Handle error better. */
if (status != CAL_CLIENT_GET_SUCCESS)
g_warning ("Couldn't get timezone from server: %s",
end_date.tzid ? end_date.tzid : "");
}
/* All-day events are inclusive, i.e. if the end date shown is 2nd Feb
then the event includes all of the 2nd Feb. We would normally show
3rd Feb as the end date, since it really ends at midnight on 3rd,
so we have to subtract a day so we only show the 2nd. */
start_tt = start_date.value;
end_tt = end_date.value;
if (start_tt->hour == 0 && start_tt->minute == 0 && start_tt->second == 0
&& end_tt->hour == 0 && end_tt->minute == 0 && end_tt->second == 0)
icaltime_adjust (end_tt, -1, 0, 0, 0);
gtk_signal_handler_block_by_data (GTK_OBJECT (priv->start_time),
epage);
gtk_signal_handler_block_by_data (GTK_OBJECT (priv->end_time), epage);
e_date_edit_set_date (E_DATE_EDIT (priv->start_time), start_tt->year,
start_tt->month, start_tt->day);
e_date_edit_set_time_of_day (E_DATE_EDIT (priv->start_time),
start_tt->hour, start_tt->minute);
e_date_edit_set_date (E_DATE_EDIT (priv->end_time), end_tt->year,
end_tt->month, end_tt->day);
e_date_edit_set_time_of_day (E_DATE_EDIT (priv->end_time),
end_tt->hour, end_tt->minute);
gtk_signal_handler_unblock_by_data (GTK_OBJECT (priv->start_time),
epage);
gtk_signal_handler_unblock_by_data (GTK_OBJECT (priv->end_time),
epage);
update_time (epage, &start_date, &end_date);
cal_component_free_datetime (&start_date);
cal_component_free_datetime (&end_date);
check_all_day (epage);
/* Set the timezones, and set sync_timezones to TRUE if both timezones
are the same. */
e_timezone_entry_set_timezone (E_TIMEZONE_ENTRY (priv->start_timezone),
start_zone);
e_timezone_entry_set_timezone (E_TIMEZONE_ENTRY (priv->end_timezone),
end_zone);
priv->sync_timezones = (start_zone == end_zone) ? TRUE : FALSE;
/* Classification */
cal_component_get_classification (comp, &cl);
@ -697,8 +707,8 @@ event_page_set_summary (CompEditorPage *page, const char *summary)
static void
event_page_set_dates (CompEditorPage *page, CompEditorPageDates *dates)
{
/* nothing */
{
update_time (EVENT_PAGE (page), dates->start, dates->end);
}
@ -795,7 +805,7 @@ notify_dates_changed (EventPage *epage, struct icaltimetype *start_tt,
icaltimezone *start_zone, *end_zone;
priv = epage->priv;
all_day_event = e_dialog_toggle_get (priv->all_day_event);
start_dt.value = start_tt;

View File

@ -80,6 +80,9 @@ static GtkWidget *schedule_page_get_widget (CompEditorPage *page);
static void schedule_page_focus_main_widget (CompEditorPage *page);
static void schedule_page_fill_widgets (CompEditorPage *page, CalComponent *comp);
static gboolean schedule_page_fill_component (CompEditorPage *page, CalComponent *comp);
static void schedule_page_set_dates (CompEditorPage *page, CompEditorPageDates *dates);
static void time_changed_cb (GtkWidget *widget, gpointer data);
static CompEditorPageClass *parent_class = NULL;
@ -135,7 +138,7 @@ schedule_page_class_init (SchedulePageClass *class)
editor_page_class->fill_widgets = schedule_page_fill_widgets;
editor_page_class->fill_component = schedule_page_fill_component;
editor_page_class->set_summary = NULL;
editor_page_class->set_dates = NULL;
editor_page_class->set_dates = schedule_page_set_dates;
object_class->destroy = schedule_page_destroy;
}
@ -211,6 +214,57 @@ schedule_page_focus_main_widget (CompEditorPage *page)
gtk_widget_grab_focus (GTK_WIDGET (priv->sel));
}
/* Set date/time */
static void
update_time (SchedulePage *spage, CalComponentDateTime *start_date, CalComponentDateTime *end_date)
{
SchedulePagePrivate *priv;
struct icaltimetype *start_tt, *end_tt;
icaltimezone *start_zone = NULL, *end_zone = NULL;
CalClientGetStatus status;
priv = spage->priv;
/* Note that if we are creating a new event, the timezones may not be
on the server, so we try to get the builtin timezone with the TZID
first. */
start_zone = icaltimezone_get_builtin_timezone_from_tzid (start_date->tzid);
if (!start_zone) {
status = cal_client_get_timezone (COMP_EDITOR_PAGE (spage)->client,
start_date->tzid,
&start_zone);
/* FIXME: Handle error better. */
if (status != CAL_CLIENT_GET_SUCCESS)
g_warning ("Couldn't get timezone from server: %s",
start_date->tzid ? start_date->tzid : "");
}
end_zone = icaltimezone_get_builtin_timezone_from_tzid (end_date->tzid);
if (!end_zone) {
status = cal_client_get_timezone (COMP_EDITOR_PAGE (spage)->client,
end_date->tzid,
&end_zone);
/* FIXME: Handle error better. */
if (status != CAL_CLIENT_GET_SUCCESS)
g_warning ("Couldn't get timezone from server: %s",
end_date->tzid ? end_date->tzid : "");
}
start_tt = start_date->value;
end_tt = end_date->value;
e_date_edit_set_date (E_DATE_EDIT (priv->sel->start_date_edit), start_tt->year,
start_tt->month, start_tt->day);
e_date_edit_set_time_of_day (E_DATE_EDIT (priv->sel->start_date_edit),
start_tt->hour, start_tt->minute);
e_date_edit_set_date (E_DATE_EDIT (priv->sel->end_date_edit), end_tt->year,
end_tt->month, end_tt->day);
e_date_edit_set_time_of_day (E_DATE_EDIT (priv->sel->end_date_edit),
end_tt->hour, end_tt->minute);
}
/* Fills the widgets with default values */
static void
clear_widgets (SchedulePage *spage)
@ -226,7 +280,8 @@ schedule_page_fill_widgets (CompEditorPage *page, CalComponent *comp)
{
SchedulePage *spage;
SchedulePagePrivate *priv;
CalComponentDateTime start_date, end_date;
spage = SCHEDULE_PAGE (page);
priv = spage->priv;
@ -235,6 +290,14 @@ schedule_page_fill_widgets (CompEditorPage *page, CalComponent *comp)
/* Clean the screen */
clear_widgets (spage);
/* Start and end times */
cal_component_get_dtstart (comp, &start_date);
cal_component_get_dtend (comp, &end_date);
update_time (spage, &start_date, &end_date);
cal_component_free_datetime (&start_date);
cal_component_free_datetime (&end_date);
priv->updating = FALSE;
}
@ -251,6 +314,22 @@ schedule_page_fill_component (CompEditorPage *page, CalComponent *comp)
return TRUE;
}
static void
schedule_page_set_dates (CompEditorPage *page, CompEditorPageDates *dates)
{
SchedulePage *spage;
SchedulePagePrivate *priv;
spage = SCHEDULE_PAGE (page);
priv = spage->priv;
priv->updating = TRUE;
update_time (spage, dates->start, dates->end);
priv->updating = FALSE;
}
/* Gets the widgets from the XML file and returns if they are all available. */
@ -275,6 +354,22 @@ get_widgets (SchedulePage *spage)
return TRUE;
}
static gboolean
init_widgets (SchedulePage *spage)
{
SchedulePagePrivate *priv;
priv = spage->priv;
gtk_signal_connect (GTK_OBJECT (priv->sel->start_date_edit),
"changed", time_changed_cb, spage);
gtk_signal_connect (GTK_OBJECT (priv->sel->end_date_edit),
"changed", time_changed_cb, spage);
return TRUE;
}
/**
@ -316,6 +411,12 @@ schedule_page_construct (SchedulePage *spage, EMeetingModel *emm)
gtk_widget_show (GTK_WIDGET (priv->sel));
gtk_box_pack_start (GTK_BOX (priv->main), GTK_WIDGET (priv->sel), TRUE, TRUE, 2);
if (!init_widgets (spage)) {
g_message ("schedule_page_construct(): "
"Could not initialize the widgets!");
return NULL;
}
return spage;
}
@ -340,3 +441,47 @@ schedule_page_new (EMeetingModel *emm)
return spage;
}
static void
time_changed_cb (GtkWidget *widget, gpointer data)
{
SchedulePage *spage = data;
SchedulePagePrivate *priv;
CompEditorPageDates dates;
CalComponentDateTime start_dt, end_dt;
struct icaltimetype start_tt, end_tt;
priv = spage->priv;
if (priv->updating)
return;
e_date_edit_get_date (E_DATE_EDIT (priv->sel->start_date_edit),
&start_tt.year,
&start_tt.month,
&start_tt.day);
e_date_edit_get_time_of_day (E_DATE_EDIT (priv->sel->start_date_edit),
&start_tt.hour,
&start_tt.minute);
e_date_edit_get_date (E_DATE_EDIT (priv->sel->end_date_edit),
&end_tt.year,
&end_tt.month,
&end_tt.day);
e_date_edit_get_time_of_day (E_DATE_EDIT (priv->sel->end_date_edit),
&end_tt.hour,
&end_tt.minute);
start_dt.value = &start_tt;
end_dt.value = &end_tt;
start_dt.tzid = NULL;
end_dt.tzid = NULL;
dates.start = &start_dt;
dates.end = &end_dt;
dates.due = NULL;
dates.complete = NULL;
comp_editor_page_notify_dates_changed (COMP_EDITOR_PAGE (spage),
&dates);
}

View File

@ -151,7 +151,7 @@ struct _EMeetingTimeSelector
/* The vertical scrollbar which scrolls attendees & display_main. */
GtkWidget *vscrollbar;
/* The 2 GnomeDateEdit widgets for the meeting start & end times. */
/* The 2 EDateEdit widgets for the meeting start & end times. */
GtkWidget *start_date_edit;
GtkWidget *end_date_edit;