[evolution/gnome-2-32] Bug #629150 - Empty calendar view



commit f38ef3d9f896da9800d2257ddfabb7767138a7d1
Author: Milan Crha <mcrha redhat com>
Date:   Wed Sep 29 10:28:25 2010 +0200

    Bug #629150 - Empty calendar view

 calendar/gui/e-day-view.c  |   53 +++++++++++++++++++++++++++++++++++++----
 calendar/gui/e-day-view.h  |    2 +
 calendar/gui/e-week-view.c |   55 +++++++++++++++++++++++++++++++++++++------
 calendar/gui/e-week-view.h |    2 +
 calendar/gui/gnome-cal.c   |   17 ++++++-------
 5 files changed, 106 insertions(+), 23 deletions(-)
---
diff --git a/calendar/gui/e-day-view.c b/calendar/gui/e-day-view.c
index 85513a2..1ad96c1 100644
--- a/calendar/gui/e-day-view.c
+++ b/calendar/gui/e-day-view.c
@@ -769,6 +769,7 @@ time_range_changed_cb (ECalModel *model, time_t start_time, time_t end_time, gpo
 
 	if (!E_CALENDAR_VIEW (day_view)->in_focus) {
 		e_day_view_free_events (day_view);
+		day_view->requires_update = TRUE;
 		return;
 	}
 
@@ -863,6 +864,8 @@ model_row_changed_cb (ETableModel *etm, gint row, gpointer user_data)
 	EDayView *day_view = E_DAY_VIEW (user_data);
 
 	if (!E_CALENDAR_VIEW (day_view)->in_focus) {
+		e_day_view_free_events (day_view);
+		day_view->requires_update = TRUE;
 		return;
 	}
 
@@ -875,6 +878,8 @@ model_cell_changed_cb (ETableModel *etm, gint col, gint row, gpointer user_data)
 	EDayView *day_view = E_DAY_VIEW (user_data);
 
 	if (!E_CALENDAR_VIEW (day_view)->in_focus) {
+		e_day_view_free_events (day_view);
+		day_view->requires_update = TRUE;
 		return;
 	}
 
@@ -889,6 +894,8 @@ model_rows_inserted_cb (ETableModel *etm, gint row, gint count, gpointer user_da
 	gint i;
 
 	if (!E_CALENDAR_VIEW (day_view)->in_focus) {
+		e_day_view_free_events (day_view);
+		day_view->requires_update = TRUE;
 		return;
 	}
 
@@ -919,6 +926,8 @@ model_comps_deleted_cb (ETableModel *etm, gpointer data, gpointer user_data)
 	GSList *l, *list = data;
 
 	if (!E_CALENDAR_VIEW (day_view)->in_focus) {
+		e_day_view_free_events (day_view);
+		day_view->requires_update = TRUE;
 		return;
 	}
 
@@ -961,8 +970,11 @@ timezone_changed_cb (ECalModel *cal_model, icaltimezone *old_zone,
 
 	g_return_if_fail (E_IS_DAY_VIEW (day_view));
 
-	if (!cal_view->in_focus)
+	if (!cal_view->in_focus) {
+		e_day_view_free_events (day_view);
+		day_view->requires_update = TRUE;
 		return;
+	}
 
 	/* If our time hasn't been set yet, just return. */
 	if (day_view->lower == 0 && day_view->upper == 0)
@@ -1308,6 +1320,8 @@ e_day_view_init (EDayView *day_view)
 		GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_ASK);
 
 	e_drag_dest_add_calendar_targets (day_view->main_canvas);
+
+	day_view->requires_update = FALSE;
 }
 
 static void
@@ -1938,6 +1952,22 @@ e_day_view_focus_in (GtkWidget *widget, GdkEventFocus *event)
 	GTK_WIDGET_SET_FLAGS (widget, GTK_HAS_FOCUS);
 #endif
 
+	if (E_CALENDAR_VIEW (day_view)->in_focus && day_view->requires_update) {
+		time_t my_start = 0, my_end = 0, model_start = 0, model_end = 0;
+
+		day_view->requires_update = FALSE;
+
+		e_cal_model_get_time_range (e_calendar_view_get_model (E_CALENDAR_VIEW (day_view)), &model_start, &model_end);
+
+		if (e_calendar_view_get_visible_time_range (E_CALENDAR_VIEW (day_view), &my_start, &my_end) &&
+		    model_start == my_start && model_end == my_end) {
+			/* update only when the same time range is set in a view and in a model;
+			   otherwise time range change invokes also query update */
+			e_day_view_recalc_day_starts (day_view, day_view->lower);
+			e_day_view_update_query (day_view);
+		}
+	}
+
 	gtk_widget_queue_draw (day_view->top_canvas);
 	gtk_widget_queue_draw (day_view->main_canvas);
 
@@ -2738,8 +2768,11 @@ e_day_view_set_mins_per_row (EDayView *day_view,
 	g_object_notify (G_OBJECT (day_view), "mins-per-row");
 
 	/* If we aren't visible, we'll sort it out later. */
-	if (!E_CALENDAR_VIEW (day_view)->in_focus)
-	    return;
+	if (!E_CALENDAR_VIEW (day_view)->in_focus) {
+		e_day_view_free_events (day_view);
+		day_view->requires_update = TRUE;
+		return;
+	}
 
 	for (day = 0; day < E_DAY_VIEW_MAX_DAYS; day++)
 		day_view->need_layout[day] = TRUE;
@@ -3799,8 +3832,13 @@ e_day_view_update_query (EDayView *day_view)
 {
 	gint rows, r;
 
-	if (!E_CALENDAR_VIEW (day_view)->in_focus)
+	if (!E_CALENDAR_VIEW (day_view)->in_focus) {
+		e_day_view_free_events (day_view);
+		day_view->requires_update = TRUE;
 		return;
+	}
+
+	day_view->requires_update = FALSE;
 
 	e_day_view_stop_editing_event (day_view);
 
@@ -4739,8 +4777,11 @@ e_day_view_check_layout (EDayView *day_view)
 	gint max_cols = -1;
 
 	/* Don't bother if we aren't visible. */
-	if (!E_CALENDAR_VIEW (day_view)->in_focus)
-	    return;
+	if (!E_CALENDAR_VIEW (day_view)->in_focus) {
+		e_day_view_free_events (day_view);
+		day_view->requires_update = TRUE;
+		return;
+	}
 
 	/* Make sure the events are sorted (by start and size). */
 	e_day_view_ensure_events_sorted (day_view);
diff --git a/calendar/gui/e-day-view.h b/calendar/gui/e-day-view.h
index aee8be0..1a6f4ef 100644
--- a/calendar/gui/e-day-view.h
+++ b/calendar/gui/e-day-view.h
@@ -485,6 +485,8 @@ struct _EDayView {
 	guint32 bc_event_time;
 	time_t before_click_dtstart;
 	time_t before_click_dtend;
+
+	gboolean requires_update;
 };
 
 struct _EDayViewClass
diff --git a/calendar/gui/e-week-view.c b/calendar/gui/e-week-view.c
index 91abad1..f7dd1d2 100644
--- a/calendar/gui/e-week-view.c
+++ b/calendar/gui/e-week-view.c
@@ -277,8 +277,11 @@ week_view_model_cell_changed_cb (EWeekView *week_view,
                                  gint col,
                                  gint row)
 {
-	if (!E_CALENDAR_VIEW (week_view)->in_focus)
+	if (!E_CALENDAR_VIEW (week_view)->in_focus) {
+		e_week_view_free_events (week_view);
+		week_view->requires_update = TRUE;
 		return;
+	}
 
 	week_view_update_row (week_view, row);
 }
@@ -290,8 +293,11 @@ week_view_model_comps_deleted_cb (EWeekView *week_view,
 	GSList *l, *list = data;
 
 	/* FIXME Stop editing? */
-	if (!E_CALENDAR_VIEW (week_view)->in_focus)
+	if (!E_CALENDAR_VIEW (week_view)->in_focus) {
+		e_week_view_free_events (week_view);
+		week_view->requires_update = TRUE;
 		return;
+	}
 
 	for (l = list; l != NULL; l = g_slist_next (l)) {
 		gint event_num;
@@ -321,8 +327,11 @@ static void
 week_view_model_row_changed_cb (EWeekView *week_view,
                                 gint row)
 {
-	if (!E_CALENDAR_VIEW (week_view)->in_focus)
+	if (!E_CALENDAR_VIEW (week_view)->in_focus) {
+		e_week_view_free_events (week_view);
+		week_view->requires_update = TRUE;
 		return;
+	}
 
 	week_view_update_row (week_view, row);
 }
@@ -335,8 +344,11 @@ week_view_model_rows_inserted_cb (EWeekView *week_view,
 	ECalModel *model;
 	gint i;
 
-	if (!E_CALENDAR_VIEW (week_view)->in_focus)
+	if (!E_CALENDAR_VIEW (week_view)->in_focus) {
+		e_week_view_free_events (week_view);
+		week_view->requires_update = TRUE;
 		return;
+	}
 
 	model = e_calendar_view_get_model (E_CALENDAR_VIEW (week_view));
 
@@ -416,6 +428,7 @@ week_view_time_range_changed_cb (EWeekView *week_view,
 
 	if (!E_CALENDAR_VIEW (week_view)->in_focus) {
 		e_week_view_free_events (week_view);
+		week_view->requires_update = TRUE;
 		return;
 	}
 
@@ -440,8 +453,11 @@ timezone_changed_cb (ECalModel *cal_model,
 
 	g_return_if_fail (E_IS_WEEK_VIEW (week_view));
 
-	if (!cal_view->in_focus)
+	if (!cal_view->in_focus) {
+		e_week_view_free_events (week_view);
+		week_view->requires_update = TRUE;
 		return;
+	}
 
 	/* If we don't have a valid date set yet, just return. */
 	if (!g_date_valid (&week_view->first_day_shown))
@@ -829,6 +845,8 @@ e_week_view_init (EWeekView *week_view)
 	week_view->move_cursor = gdk_cursor_new (GDK_FLEUR);
 	week_view->resize_width_cursor = gdk_cursor_new (GDK_SB_H_DOUBLE_ARROW);
 	week_view->last_cursor_set = NULL;
+
+	week_view->requires_update = FALSE;
 }
 
 /**
@@ -1369,6 +1387,21 @@ e_week_view_focus_in (GtkWidget *widget, GdkEventFocus *event)
 	GTK_WIDGET_SET_FLAGS (widget, GTK_HAS_FOCUS);
 #endif
 
+	if (E_CALENDAR_VIEW (week_view)->in_focus && week_view->requires_update) {
+		time_t my_start = 0, my_end = 0, model_start = 0, model_end = 0;
+
+		week_view->requires_update = FALSE;
+
+		e_cal_model_get_time_range (e_calendar_view_get_model (E_CALENDAR_VIEW (week_view)), &model_start, &model_end);
+
+		if (e_calendar_view_get_visible_time_range (E_CALENDAR_VIEW (week_view), &my_start, &my_end) &&
+		    model_start == my_start && model_end == my_end) {
+			/* update only when the same time range is set in a view and in a model;
+			   otherwise time range change invokes also query update */
+			e_week_view_update_query (week_view);
+		}
+	}
+
 	gtk_widget_queue_draw (week_view->main_canvas);
 
 	return FALSE;
@@ -1594,8 +1627,11 @@ e_week_view_update_query (EWeekView *week_view)
 {
 	gint rows, r;
 
-	if (!E_CALENDAR_VIEW (week_view)->in_focus)
+	if (!E_CALENDAR_VIEW (week_view)->in_focus) {
+		e_week_view_free_events (week_view);
+		week_view->requires_update = TRUE;
 		return;
+	}
 
 	gtk_widget_queue_draw (week_view->main_canvas);
 	e_week_view_free_events (week_view);
@@ -2822,8 +2858,11 @@ static void
 e_week_view_check_layout (EWeekView *week_view)
 {
 	/* Don't bother if we aren't visible. */
-	if (!E_CALENDAR_VIEW (week_view)->in_focus)
-	    return;
+	if (!E_CALENDAR_VIEW (week_view)->in_focus) {
+		e_week_view_free_events (week_view);
+		week_view->requires_update = TRUE;
+		return;
+	}
 
 	/* Make sure the events are sorted (by start and size). */
 	e_week_view_ensure_events_sorted (week_view);
diff --git a/calendar/gui/e-week-view.h b/calendar/gui/e-week-view.h
index 0712e1a..232dbe1 100644
--- a/calendar/gui/e-week-view.h
+++ b/calendar/gui/e-week-view.h
@@ -354,6 +354,8 @@ struct _EWeekView {
 	guint32 bc_event_time;
 	time_t before_click_dtstart;
 	time_t before_click_dtend;
+
+	gboolean requires_update;
 };
 
 struct _EWeekViewClass {
diff --git a/calendar/gui/gnome-cal.c b/calendar/gui/gnome-cal.c
index 1195e04..8a2029d 100644
--- a/calendar/gui/gnome-cal.c
+++ b/calendar/gui/gnome-cal.c
@@ -1823,12 +1823,20 @@ gnome_calendar_set_view (GnomeCalendar *gcal,
                          GnomeCalendarViewType view_type)
 {
 	ECalendarView *calendar_view;
+	gint ii;
 
 	g_return_if_fail (GNOME_IS_CALENDAR (gcal));
 
 	gcal->priv->current_view_type = view_type;
 	gnome_calendar_set_range_selected (gcal, FALSE);
 
+	E_CALENDAR_VIEW (gcal->priv->views[view_type])->in_focus = TRUE;
+	for (ii = 0; ii < GNOME_CAL_LAST_VIEW; ii++) {
+		if (ii == view_type)
+			continue;
+		E_CALENDAR_VIEW (gcal->priv->views[ii])->in_focus = FALSE;
+	}
+
 	calendar_view = gnome_calendar_get_calendar_view (gcal, view_type);
 	gtk_widget_grab_focus (GTK_WIDGET (calendar_view));
 
@@ -1843,7 +1851,6 @@ gnome_calendar_display_view (GnomeCalendar *gcal,
 	gboolean preserve_day;
 	gboolean range_selected;
 	time_t start_time;
-	gint ii;
 
 	view = gnome_calendar_get_calendar_view (gcal, view_type);
 
@@ -1895,14 +1902,6 @@ gnome_calendar_display_view (GnomeCalendar *gcal,
 	gnome_calendar_set_view (gcal, view_type);
 	gnome_calendar_set_range_selected (gcal, range_selected);
 
-	/* XXX Move this to set_view()? */
-	E_CALENDAR_VIEW (gcal->priv->views[view_type])->in_focus = TRUE;
-	for (ii = 0; ii < GNOME_CAL_LAST_VIEW; ii++) {
-		if (ii == view_type)
-			continue;
-		E_CALENDAR_VIEW (gcal->priv->views[ii])->in_focus = FALSE;
-	}
-
 	/* For the week & month views we want the selection in the date
 	   navigator to be rounded to the nearest week when the arrow buttons
 	   are pressed to move to the previous/next month. */



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