aboutsummaryrefslogtreecommitdiffstats
path: root/calendar/gui
diff options
context:
space:
mode:
Diffstat (limited to 'calendar/gui')
-rw-r--r--calendar/gui/event-editor.c131
1 files changed, 45 insertions, 86 deletions
diff --git a/calendar/gui/event-editor.c b/calendar/gui/event-editor.c
index 19a170a90f..d5e687ccbc 100644
--- a/calendar/gui/event-editor.c
+++ b/calendar/gui/event-editor.c
@@ -157,8 +157,7 @@ static void append_exception (EventEditor *ee, time_t t);
static void check_all_day (EventEditor *ee);
static void set_all_day (GtkWidget *toggle, EventEditor *ee);
static void alarm_toggle (GtkWidget *toggle, EventEditor *ee);
-static void check_dates (EDateEdit *dedit, EventEditor *ee);
-static void check_times (EDateEdit *dedit, EventEditor *ee);
+static void date_changed_cb (EDateEdit *dedit, gpointer data);
static void recurrence_exception_add_cb (GtkWidget *widget, EventEditor *ee);
static void recurrence_exception_modify_cb (GtkWidget *widget, EventEditor *ee);
static void recurrence_exception_delete_cb (GtkWidget *widget, EventEditor *ee);
@@ -812,15 +811,10 @@ init_widgets (EventEditor *ee)
/* Start and end times */
- gtk_signal_connect (GTK_OBJECT (priv->start_time), "date_changed",
- GTK_SIGNAL_FUNC (check_dates), ee);
- gtk_signal_connect (GTK_OBJECT (priv->start_time), "time_changed",
- GTK_SIGNAL_FUNC (check_times), ee);
-
- gtk_signal_connect (GTK_OBJECT (priv->end_time), "date_changed",
- GTK_SIGNAL_FUNC (check_dates), ee);
- gtk_signal_connect (GTK_OBJECT (priv->end_time), "time_changed",
- GTK_SIGNAL_FUNC (check_times), ee);
+ gtk_signal_connect (GTK_OBJECT (priv->start_time), "changed",
+ GTK_SIGNAL_FUNC (date_changed_cb), ee);
+ gtk_signal_connect (GTK_OBJECT (priv->end_time), "changed",
+ GTK_SIGNAL_FUNC (date_changed_cb), ee);
gtk_signal_connect (GTK_OBJECT (priv->all_day_event), "toggled",
GTK_SIGNAL_FUNC (set_all_day), ee);
@@ -2210,27 +2204,40 @@ alarm_toggle (GtkWidget *toggle, EventEditor *ee)
gtk_widget_set_sensitive (alarm_unit, active);
}
-/*
- * Checks if the day range occupies all the day, and if so, check the
- * box accordingly
+/* Checks if the day range occupies a single whole day, and if so, check. the
+ * "all day event" box accordingly.
*/
static void
check_all_day (EventEditor *ee)
{
EventEditorPrivate *priv;
time_t ev_start, ev_end;
+ time_t start_begin_day, end_begin_day;
+ struct tm tm_start, tm_end;
+ gboolean all_day;
priv = ee->priv;
ev_start = e_date_edit_get_time (E_DATE_EDIT (priv->start_time));
ev_end = e_date_edit_get_time (E_DATE_EDIT (priv->end_time));
- /* all day event checkbox */
- if (time_day_begin (ev_start) == ev_start
- && time_day_begin (ev_end) == ev_end)
- e_dialog_toggle_set (priv->all_day_event, TRUE);
+ start_begin_day = time_day_begin (ev_start);
+ end_begin_day = time_day_begin (ev_end);
+
+ tm_start = *localtime (&start_begin_day);
+ tm_end = *localtime (&end_begin_day);
+
+ tm_end.tm_mday--;
+ if (mktime (&tm_start) == mktime (&tm_end))
+ all_day = TRUE;
else
- e_dialog_toggle_set (priv->all_day_event, FALSE);
+ all_day = FALSE;
+
+ gtk_signal_handler_block_by_data (GTK_OBJECT (priv->all_day_event), ee);
+
+ e_dialog_toggle_set (priv->all_day_event, all_day);
+
+ gtk_signal_handler_unblock_by_data (GTK_OBJECT (priv->all_day_event), ee);
}
/*
@@ -2284,18 +2291,22 @@ set_all_day (GtkWidget *toggle, EventEditor *ee)
e_date_edit_set_time (E_DATE_EDIT (priv->end_time), mktime (&end_tm));
}
-/*
- * Callback: checks that the dates are start < end
+/* Callback used when the start or end date widgets change. We check that the
+ * start date < end date and we set the "all day event" button as appropriate.
*/
static void
-check_dates (EDateEdit *dedit, EventEditor *ee)
+date_changed_cb (EDateEdit *dedit, gpointer data)
{
+ EventEditor *ee;
EventEditorPrivate *priv;
time_t start, end;
struct tm tm_start, tm_end;
+ ee = EVENT_EDITOR (data);
priv = ee->priv;
+ /* Ensure that start < end */
+
start = e_date_edit_get_time (E_DATE_EDIT (priv->start_time));
end = e_date_edit_get_time (E_DATE_EDIT (priv->end_time));
@@ -2304,88 +2315,36 @@ check_dates (EDateEdit *dedit, EventEditor *ee)
tm_end = *localtime (&end);
if (GTK_WIDGET (dedit) == priv->start_time) {
+ /* Modify the end time */
+
tm_end.tm_year = tm_start.tm_year;
tm_end.tm_mon = tm_start.tm_mon;
tm_end.tm_mday = tm_start.tm_mday;
+ tm_end.tm_hour = tm_start.tm_hour + 1;
+ tm_end.tm_min = tm_start.tm_min;
+ tm_end.tm_sec = tm_start.tm_sec;
gtk_signal_handler_block_by_data (GTK_OBJECT (priv->end_time), ee);
- e_date_edit_set_time (E_DATE_EDIT (priv->end_time),
- mktime (&tm_end));
+ e_date_edit_set_time (E_DATE_EDIT (priv->end_time), mktime (&tm_end));
gtk_signal_handler_unblock_by_data (GTK_OBJECT (priv->end_time), ee);
} else if (GTK_WIDGET (dedit) == priv->end_time) {
+ /* Modify the start time */
+
tm_start.tm_year = tm_end.tm_year;
tm_start.tm_mon = tm_end.tm_mon;
tm_start.tm_mday = tm_end.tm_mday;
-
-#if 0 /* FIXME: is this right? */
- gtk_signal_handler_block_by_data (GTK_OBJECT (priv->start_time), ee);
- e_date_edit_set_time (E_DATE_EDIT (priv->start_time),
- mktime (&tm_start));
- gtk_signal_handler_unblock_by_data (GTK_OBJECT (priv->start_time), ee);
-#endif
- }
- }
-}
-
-/*
- * Callback: checks that start_time < end_time and whether the
- * selected hour range spans all of the day
- */
-static void
-check_times (EDateEdit *dedit, EventEditor *ee)
-{
- EventEditorPrivate *priv;
- time_t start, end;
- struct tm tm_start, tm_end;
-
- priv = ee->priv;
-#if 0
- gdk_pointer_ungrab (GDK_CURRENT_TIME);
- gdk_flush ();
-#endif
- start = e_date_edit_get_time (E_DATE_EDIT (priv->start_time));
- end = e_date_edit_get_time (E_DATE_EDIT (priv->end_time));
-
- if (start > end) {
- tm_start = *localtime (&start);
- tm_end = *localtime (&end);
-
- if (GTK_WIDGET (dedit) == priv->start_time) {
- tm_end.tm_min = tm_start.tm_min;
- tm_end.tm_sec = tm_start.tm_sec;
- tm_end.tm_hour = tm_start.tm_hour + 1;
-
- if (tm_end.tm_hour >= 24) {
- tm_end.tm_hour = 24; /* mktime() will bump the day */
- tm_end.tm_min = 0;
- tm_end.tm_sec = 0;
- }
-
- gtk_signal_handler_block_by_data (GTK_OBJECT (priv->end_time), ee);
- e_date_edit_set_time (E_DATE_EDIT (priv->end_time),
- mktime (&tm_end));
- gtk_signal_handler_unblock_by_data (GTK_OBJECT (priv->end_time), ee);
- } else if (GTK_WIDGET (dedit) == priv->end_time) {
+ tm_start.tm_hour = tm_end.tm_hour - 1;
tm_start.tm_min = tm_end.tm_min;
tm_start.tm_sec = tm_end.tm_sec;
- tm_start.tm_hour = tm_end.tm_hour - 1;
-
- if (tm_start.tm_hour < 0) {
- tm_start.tm_hour = 0;
- tm_start.tm_min = 0;
- tm_start.tm_min = 0;
- }
gtk_signal_handler_block_by_data (GTK_OBJECT (priv->start_time), ee);
-
- /* will set recur start too */
e_date_edit_set_time (E_DATE_EDIT (priv->start_time), mktime (&tm_start));
-
gtk_signal_handler_unblock_by_data (GTK_OBJECT (priv->start_time), ee);
- }
+ } else
+ g_assert_not_reached ();
}
- /* Check whether the event spans the whole day */
+ /* Set the "all day event" button as appropriate */
check_all_day (ee);
}