[evolution] Bug #248105 - No warning if you create an appointment in the past



commit c98ff48755c6a0bdd1005e9427d184385a4999b8
Author: Milan Crha <mcrha redhat com>
Date:   Thu May 27 17:27:47 2010 +0200

    Bug #248105 - No warning if you create an appointment in the past

 calendar/gui/dialogs/comp-editor-util.c |   31 +++++++++++++++++
 calendar/gui/dialogs/comp-editor-util.h |    2 +
 calendar/gui/dialogs/event-page.c       |   46 +++++++++++++++++++++++---
 calendar/gui/dialogs/memo-page.c        |   43 +++++++++++++++++++++---
 calendar/gui/dialogs/task-page.c        |   54 ++++++++++++++++++++++++++++---
 5 files changed, 161 insertions(+), 15 deletions(-)
---
diff --git a/calendar/gui/dialogs/comp-editor-util.c b/calendar/gui/dialogs/comp-editor-util.c
index 9856bd7..6d3adfe 100644
--- a/calendar/gui/dialogs/comp-editor-util.c
+++ b/calendar/gui/dialogs/comp-editor-util.c
@@ -381,3 +381,34 @@ comp_editor_have_in_new_attendees_lst (const GSList *new_attendees,
 
 	return FALSE;
 }
+
+/**
+ * comp_editor_test_time_in_the_past:
+ * @time_tt: Time to check.
+ * @parent: Parent window for a question dialog.
+ * @tag: Question message tag to use.
+ * Returns whether given time is in the past.
+ *
+ * Tests the given @time_tt whether occurs in the past,
+ * and if so, returns TRUE.
+ **/
+gboolean
+comp_editor_test_time_in_the_past (const struct icaltimetype time_tt)
+{
+	struct icaltimetype now_tt;
+	gboolean is_past;
+
+	if (icaltime_is_null_time (time_tt))
+		return FALSE;
+
+	if (time_tt.is_date) {
+		now_tt = icaltime_today ();
+		is_past = icaltime_compare_date_only (time_tt, now_tt) < 0;
+	} else {
+		now_tt = icaltime_current_time_with_zone (time_tt.zone);
+		now_tt.zone = time_tt.zone;
+		is_past = icaltime_compare (time_tt, now_tt) < 0;
+	}
+
+	return is_past;
+}
diff --git a/calendar/gui/dialogs/comp-editor-util.h b/calendar/gui/dialogs/comp-editor-util.h
index 6eeb8c5..6ebe473 100644
--- a/calendar/gui/dialogs/comp-editor-util.h
+++ b/calendar/gui/dialogs/comp-editor-util.h
@@ -47,4 +47,6 @@ void comp_editor_copy_new_attendees (ECalComponent *des, ECalComponent *src);
 gboolean comp_editor_have_in_new_attendees (ECalComponent *comp, EMeetingAttendee *ma);
 gboolean comp_editor_have_in_new_attendees_lst (const GSList *new_attendees, const gchar *eml);
 
+gboolean comp_editor_test_time_in_the_past (const struct icaltimetype time_tt);
+
 #endif
diff --git a/calendar/gui/dialogs/event-page.c b/calendar/gui/dialogs/event-page.c
index 361451e..5ceeb9e 100644
--- a/calendar/gui/dialogs/event-page.c
+++ b/calendar/gui/dialogs/event-page.c
@@ -720,6 +720,41 @@ create_image_event_box (const gchar *image_text, const gchar *tip_text)
 	return box;
 }
 
+/* returns whether changed info text */
+static gboolean
+check_starts_in_the_past (EventPage *epage)
+{
+	EventPagePrivate *priv;
+	struct icaltimetype start_tt = icaltime_null_time ();
+	gboolean date_set;
+
+	if ((comp_editor_get_flags (comp_editor_page_get_editor (COMP_EDITOR_PAGE (epage))) & COMP_EDITOR_NEW_ITEM) == 0)
+		return FALSE;
+
+	priv = epage->priv;
+	date_set = e_date_edit_get_date (E_DATE_EDIT (priv->start_time), &start_tt.year, &start_tt.month, &start_tt.day);
+
+	g_return_val_if_fail (date_set, FALSE);
+
+	if (priv->all_day_event) {
+		start_tt.is_date = TRUE;
+	} else {
+		e_date_edit_get_time_of_day (E_DATE_EDIT (priv->start_time), &start_tt.hour, &start_tt.minute);
+		start_tt.zone = e_timezone_entry_get_timezone (E_TIMEZONE_ENTRY (priv->start_timezone));
+	}
+
+	if (comp_editor_test_time_in_the_past (start_tt)) {
+		gchar *tmp = g_strconcat ("<b>", _("Event's start time is in the past"), "</b>",
+			priv->subscriber_info_text ? "\n" : "", priv->subscriber_info_text, NULL);
+		event_page_set_info_string (epage, GTK_STOCK_DIALOG_WARNING, tmp);
+		g_free (tmp);
+	} else {
+		event_page_set_info_string (epage, priv->subscriber_info_text ? GTK_STOCK_DIALOG_INFO : NULL, priv->subscriber_info_text);
+	}
+
+	return TRUE;
+}
+
 static void
 sensitize_widgets (EventPage *epage)
 {
@@ -757,7 +792,7 @@ sensitize_widgets (EventPage *epage)
 		gchar *tmp = g_strconcat ("<b>", _("Event cannot be fully edited, because you are not the organizer"), "</b>", NULL);
 		event_page_set_info_string (epage, GTK_STOCK_DIALOG_INFO, tmp);
 		g_free (tmp);
-	} else {
+	} else if (!check_starts_in_the_past (epage)) {
 		event_page_set_info_string (epage, priv->subscriber_info_text ? GTK_STOCK_DIALOG_INFO : NULL, priv->subscriber_info_text);
 	}
 
@@ -2311,6 +2346,8 @@ notify_dates_changed (EventPage *epage, struct icaltimetype *start_tt,
 
 	comp_editor_page_notify_dates_changed (COMP_EDITOR_PAGE (epage),
 					       &dates);
+
+	check_starts_in_the_past (epage);
 }
 
 static gboolean
@@ -2639,14 +2676,13 @@ set_subscriber_info_string (EventPage *epage, const gchar *backend_address)
 		/* Translators: This string is used when we are creating an Event
 		   (meeting or appointment)  on behalf of some other user */
 		epage->priv->subscriber_info_text = g_markup_printf_escaped (_("You are acting on behalf of %s"), backend_address);
-
-		event_page_set_info_string (epage, GTK_STOCK_DIALOG_INFO, epage->priv->subscriber_info_text);
 	} else {
 		g_free (epage->priv->subscriber_info_text);
 		epage->priv->subscriber_info_text = NULL;
-
-		event_page_set_info_string (epage, NULL, NULL);
 	}
+
+	if (!check_starts_in_the_past (epage))
+		event_page_set_info_string (epage, epage->priv->subscriber_info_text ? GTK_STOCK_DIALOG_INFO : NULL, epage->priv->subscriber_info_text);
 }
 
 static void
diff --git a/calendar/gui/dialogs/memo-page.c b/calendar/gui/dialogs/memo-page.c
index 8ffe45d..27270fd 100644
--- a/calendar/gui/dialogs/memo-page.c
+++ b/calendar/gui/dialogs/memo-page.c
@@ -320,6 +320,32 @@ memo_page_init (MemoPage *mpage)
 	mpage->priv = MEMO_PAGE_GET_PRIVATE (mpage);
 }
 
+/* returns whether changed info text */
+static gboolean
+check_starts_in_the_past (MemoPage *mpage)
+{
+	MemoPagePrivate *priv;
+	struct icaltimetype start_tt = icaltime_null_time ();
+
+	if ((comp_editor_get_flags (comp_editor_page_get_editor (COMP_EDITOR_PAGE (mpage))) & COMP_EDITOR_NEW_ITEM) == 0)
+		return FALSE;
+
+	priv = mpage->priv;
+
+	start_tt.is_date = TRUE;
+	if (e_date_edit_get_date (E_DATE_EDIT (priv->start_date), &start_tt.year, &start_tt.month, &start_tt.day) &&
+	    comp_editor_test_time_in_the_past (start_tt)) {
+		gchar *tmp = g_strconcat ("<b>", _("Memo's start date is in the past"), "</b>",
+			priv->subscriber_info_text ? "\n" : "", priv->subscriber_info_text, NULL);
+		memo_page_set_info_string (mpage, GTK_STOCK_DIALOG_WARNING, tmp);
+		g_free (tmp);
+	} else {
+		memo_page_set_info_string (mpage, priv->subscriber_info_text ? GTK_STOCK_DIALOG_INFO : NULL, priv->subscriber_info_text);
+	}
+
+	return TRUE;
+}
+
 static void
 sensitize_widgets (MemoPage *mpage)
 {
@@ -354,7 +380,7 @@ sensitize_widgets (MemoPage *mpage)
 		gchar *tmp = g_strconcat ("<b>", _("Memo cannot be fully edited, because you are not the organizer"), "</b>", NULL);
 		memo_page_set_info_string (mpage, GTK_STOCK_DIALOG_INFO, tmp);
 		g_free (tmp);
-	} else {
+	} else if (!check_starts_in_the_past (mpage)) {
 		memo_page_set_info_string (mpage, priv->subscriber_info_text ? GTK_STOCK_DIALOG_INFO : NULL, priv->subscriber_info_text);
 	}
 
@@ -918,13 +944,13 @@ set_subscriber_info_string (MemoPage *mpage,
 		/* Translators: This string is used when we are creating a Memo
 		   on behalf of some other user */
 		mpage->priv->subscriber_info_text = g_markup_printf_escaped (_("You are acting on behalf of %s"), backend_address);
-		memo_page_set_info_string (mpage, GTK_STOCK_DIALOG_INFO, mpage->priv->subscriber_info_text);
 	} else {
 		g_free (mpage->priv->subscriber_info_text);
 		mpage->priv->subscriber_info_text = NULL;
-
-		memo_page_set_info_string (mpage, NULL, NULL);
 	}
+
+	if (!check_starts_in_the_past (mpage))
+		memo_page_set_info_string (mpage, mpage->priv->subscriber_info_text ? GTK_STOCK_DIALOG_INFO : NULL, mpage->priv->subscriber_info_text);
 }
 
 static void
@@ -954,6 +980,13 @@ to_button_clicked_cb (GtkButton *button,
 	gtk_widget_show (GTK_WIDGET (name_selector_dialog));
 }
 
+static void
+memo_page_start_date_changed_cb (MemoPage *mpage)
+{
+	check_starts_in_the_past (mpage);
+	comp_editor_page_changed (COMP_EDITOR_PAGE (mpage));
+}
+
 /* Hooks the widget signals */
 static gboolean
 init_widgets (MemoPage *mpage)
@@ -1013,7 +1046,7 @@ init_widgets (MemoPage *mpage)
 
 	g_signal_connect_swapped (
 		priv->start_date, "changed",
-		G_CALLBACK (comp_editor_page_changed), mpage);
+		G_CALLBACK (memo_page_start_date_changed_cb), mpage);
 
 	if (priv->name_selector) {
 		ENameSelectorDialog *name_selector_dialog;
diff --git a/calendar/gui/dialogs/task-page.c b/calendar/gui/dialogs/task-page.c
index 9747501..718d454 100644
--- a/calendar/gui/dialogs/task-page.c
+++ b/calendar/gui/dialogs/task-page.c
@@ -309,6 +309,49 @@ task_page_set_view_rsvp (TaskPage *page, gboolean state)
 	e_meeting_list_view_column_set_visible (priv->list_view, E_MEETING_STORE_RSVP_COL, state);
 }
 
+static gboolean
+date_in_past (TaskPage *tpage, EDateEdit *date)
+{
+	struct icaltimetype tt = icaltime_null_time ();
+
+	if (!e_date_edit_get_date (date, &tt.year, &tt.month, &tt.day))
+		return FALSE;
+
+	if (e_date_edit_get_time_of_day (date, &tt.hour, &tt.minute))
+		tt.zone = e_timezone_entry_get_timezone (E_TIMEZONE_ENTRY (tpage->priv->timezone));
+	else
+		tt.is_date = TRUE;
+
+	return comp_editor_test_time_in_the_past (tt);
+}
+
+/* returns whether changed info text */
+static gboolean
+check_starts_in_the_past (TaskPage *tpage)
+{
+	TaskPagePrivate *priv;
+	gboolean start_in_past, due_in_past;
+
+	if ((comp_editor_get_flags (comp_editor_page_get_editor (COMP_EDITOR_PAGE (tpage))) & COMP_EDITOR_NEW_ITEM) == 0)
+		return FALSE;
+
+	priv = tpage->priv;
+	start_in_past = date_in_past (tpage, E_DATE_EDIT (priv->start_date));
+	due_in_past = date_in_past (tpage, E_DATE_EDIT (priv->due_date));
+
+	if (start_in_past || due_in_past) {
+		gchar *tmp = g_strconcat ("<b>", start_in_past ? _("Task's start date is in the past") : "",
+			start_in_past && due_in_past ? "\n" : "", due_in_past ? _("Task's due date is in the past") : "", "</b>",
+			priv->subscriber_info_text ? "\n" : "", priv->subscriber_info_text, NULL);
+		task_page_set_info_string (tpage, GTK_STOCK_DIALOG_WARNING, tmp);
+		g_free (tmp);
+	} else {
+		task_page_set_info_string (tpage, priv->subscriber_info_text ? GTK_STOCK_DIALOG_INFO : NULL, priv->subscriber_info_text);
+	}
+
+	return TRUE;
+}
+
 static void
 sensitize_widgets (TaskPage *tpage)
 {
@@ -340,7 +383,7 @@ sensitize_widgets (TaskPage *tpage)
 		gchar *tmp = g_strconcat ("<b>", _("Task cannot be fully edited, because you are not the organizer"), "</b>", NULL);
 		task_page_set_info_string (tpage, GTK_STOCK_DIALOG_INFO, tmp);
 		g_free (tmp);
-	} else {
+	} else if (!check_starts_in_the_past (tpage)) {
 		task_page_set_info_string (tpage, priv->subscriber_info_text ? GTK_STOCK_DIALOG_INFO : NULL, priv->subscriber_info_text);
 	}
 
@@ -1506,6 +1549,8 @@ date_changed_cb (EDateEdit *dedit,
 	/* Notify upstream */
 	comp_editor_page_notify_dates_changed (COMP_EDITOR_PAGE (tpage),
 					       &dates);
+
+	check_starts_in_the_past (tpage);
 }
 
 static void
@@ -1744,14 +1789,13 @@ set_subscriber_info_string (TaskPage *tpage, const gchar *backend_address)
 		/* Translators: This string is used when we are creating a Task
 		   on behalf of some other user */
 		tpage->priv->subscriber_info_text = g_markup_printf_escaped (_("You are acting on behalf of %s"), backend_address);
-
-		task_page_set_info_string (tpage, GTK_STOCK_DIALOG_INFO, tpage->priv->subscriber_info_text);
 	} else {
 		g_free (tpage->priv->subscriber_info_text);
 		tpage->priv->subscriber_info_text = NULL;
-
-		task_page_set_info_string (tpage, NULL, NULL);
 	}
+
+	if (!check_starts_in_the_past (tpage))
+		task_page_set_info_string (tpage, tpage->priv->subscriber_info_text ? GTK_STOCK_DIALOG_INFO : NULL, tpage->priv->subscriber_info_text);
 }
 
 void



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]