[evolution] Bug #591330 - Do not clear task preview every minute



commit e2ca6f7753443a37fddd9d3af8360a9da06c4a9f
Author: Milan Crha <mcrha redhat com>
Date:   Thu Nov 26 15:15:17 2009 +0100

    Bug #591330 - Do not clear task preview every minute

 calendar/gui/e-cal-component-preview.c       |  110 ++++++++++++++++++++++++++
 calendar/gui/e-cal-component-preview.h       |    1 +
 calendar/gui/e-calendar-table.c              |    4 +
 modules/calendar/e-memo-shell-content.c      |    4 +-
 modules/calendar/e-memo-shell-view-actions.c |    2 +-
 modules/calendar/e-memo-shell-view.c         |    2 +-
 modules/calendar/e-task-shell-content.c      |    4 +-
 modules/calendar/e-task-shell-view-actions.c |    2 +-
 modules/calendar/e-task-shell-view.c         |    2 +-
 9 files changed, 123 insertions(+), 8 deletions(-)
---
diff --git a/calendar/gui/e-cal-component-preview.c b/calendar/gui/e-cal-component-preview.c
index 014ce2c..519c165 100644
--- a/calendar/gui/e-cal-component-preview.c
+++ b/calendar/gui/e-cal-component-preview.c
@@ -41,10 +41,91 @@
 
 struct _ECalComponentPreviewPrivate {
 	icaltimezone *zone;
+
+	/* information about currently showing component in a preview;
+	   if it didn't change then the preview is not updated */
+	gchar *cal_uid;
+	gchar *comp_uid;
+	struct icaltimetype comp_last_modified;
+	gint comp_sequence;
 };
 
 static gpointer parent_class;
 
+static void
+clear_comp_info (ECalComponentPreview *preview)
+{
+	ECalComponentPreviewPrivate *priv;
+
+	g_return_if_fail (E_IS_CAL_COMPONENT_PREVIEW (preview));
+
+	priv = preview->priv;
+
+	g_free (priv->cal_uid);
+	priv->cal_uid = NULL;
+	g_free (priv->comp_uid);
+	priv->comp_uid = NULL;
+	priv->comp_last_modified = icaltime_null_time ();
+	priv->comp_sequence = -1;
+}
+
+/* Stores information about actually shown component and
+   returns whether component in the preview changed */
+static gboolean
+update_comp_info (ECalComponentPreview *preview, ECal *ecal, ECalComponent *comp)
+{
+	ECalComponentPreviewPrivate *priv;
+	gboolean changed;
+
+	g_return_val_if_fail (preview != NULL, TRUE);
+	g_return_val_if_fail (E_IS_CAL_COMPONENT_PREVIEW (preview), TRUE);
+
+	priv = preview->priv;
+
+	if (!E_IS_CAL_COMPONENT (comp) || !E_IS_CAL (ecal)) {
+		changed = !priv->cal_uid;
+		clear_comp_info (preview);
+	} else {
+		const gchar *uid;
+		gchar *cal_uid;
+		gchar *comp_uid;
+		struct icaltimetype comp_last_modified, *itm = NULL;
+		gint *sequence = NULL;
+		gint comp_sequence;
+
+		cal_uid = g_strdup (e_source_peek_uid (e_cal_get_source (ecal)));
+		e_cal_component_get_uid (comp, &uid);
+		comp_uid = g_strdup (uid);
+		e_cal_component_get_last_modified (comp, &itm);
+		if (itm) {
+			comp_last_modified = *itm;
+			e_cal_component_free_icaltimetype (itm);
+		} else
+			comp_last_modified = icaltime_null_time ();
+		e_cal_component_get_sequence (comp, &sequence);
+		if (sequence) {
+			comp_sequence = *sequence;
+			e_cal_component_free_sequence (sequence);
+		} else
+			comp_sequence = 0;
+
+		changed = !priv->cal_uid || !priv->comp_uid || !cal_uid || !comp_uid ||
+			  !g_str_equal (priv->cal_uid, cal_uid) ||
+			  !g_str_equal (priv->comp_uid, comp_uid) ||
+			  priv->comp_sequence != comp_sequence ||
+			  icaltime_compare (priv->comp_last_modified, comp_last_modified) != 0;
+
+		clear_comp_info (preview);
+
+		priv->cal_uid = cal_uid;
+		priv->comp_uid = comp_uid;
+		priv->comp_sequence = comp_sequence;
+		priv->comp_last_modified = comp_last_modified;
+	}
+
+	return changed;
+}
+
 /* Converts a time_t to a string, relative to the specified timezone */
 static gchar *
 timet_to_str_with_zone (ECalComponentDateTime *dt,
@@ -295,10 +376,25 @@ cal_component_preview_write_html (GString *buffer,
 }
 
 static void
+cal_component_preview_finalize (GObject *object)
+{
+	ECalComponentPreview *preview;
+
+	clear_comp_info (E_CAL_COMPONENT_PREVIEW (preview));
+
+	/* Chain up to parent's finalize() method. */
+	G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+static void
 cal_component_preview_class_init (ECalComponentPreviewClass *class)
 {
+	GObjectClass *object_class;
+
 	parent_class = g_type_class_peek_parent (class);
 	g_type_class_add_private (class, sizeof (ECalComponentPreviewPrivate));
+
+	object_class->finalize = cal_component_preview_finalize;
 }
 
 static void
@@ -376,6 +472,11 @@ e_cal_component_preview_display (ECalComponentPreview *preview,
 	g_return_if_fail (E_IS_CAL_COMPONENT_PREVIEW (preview));
 	g_return_if_fail (E_IS_CAL_COMPONENT (comp));
 
+	/* do not update preview when setting the same component as last time,
+	   which even didn't change */
+	if (!update_comp_info (preview, ecal, comp))
+		return;
+
 	/* XXX The initial buffer size is arbitrary.  Tune it. */
 
 	buffer = g_string_sized_new (4096);
@@ -384,3 +485,12 @@ e_cal_component_preview_display (ECalComponentPreview *preview,
 	e_web_view_load_string (E_WEB_VIEW (preview), buffer->str);
 	g_string_free (buffer, TRUE);
 }
+
+void
+e_cal_component_preview_clear (ECalComponentPreview *preview)
+{
+	g_return_if_fail (E_IS_CAL_COMPONENT_PREVIEW (preview));
+
+	clear_comp_info (preview);
+	e_web_view_clear (E_WEB_VIEW (preview));
+}
diff --git a/calendar/gui/e-cal-component-preview.h b/calendar/gui/e-cal-component-preview.h
index 78567f0..03798a4 100644
--- a/calendar/gui/e-cal-component-preview.h
+++ b/calendar/gui/e-cal-component-preview.h
@@ -75,6 +75,7 @@ void		e_cal_component_preview_set_default_timezone
 void		e_cal_component_preview_display	(ECalComponentPreview *preview,
 						 ECal *ecal,
 						 ECalComponent *comp);
+void		e_cal_component_preview_clear	(ECalComponentPreview *preview);
 
 G_END_DECLS
 
diff --git a/calendar/gui/e-calendar-table.c b/calendar/gui/e-calendar-table.c
index 2b11da0..3dd4d74 100644
--- a/calendar/gui/e-calendar-table.c
+++ b/calendar/gui/e-calendar-table.c
@@ -1462,6 +1462,7 @@ hide_completed_rows (ECalModel *model, GList *clients_list, gchar *hide_sexp, GP
 	GList *l, *m, *objects;
 	ECal *client;
 	gint pos;
+	gboolean changed = FALSE;
 
 	for (l = clients_list; l != NULL; l = l->next) {
 		client = l->data;
@@ -1484,6 +1485,7 @@ hide_completed_rows (ECalModel *model, GList *clients_list, gchar *hide_sexp, GP
 				e_table_model_pre_change (E_TABLE_MODEL (model));
 				pos = get_position_in_array (comp_objects, comp_data);
 				e_table_model_row_deleted (E_TABLE_MODEL (model), pos);
+				changed = TRUE;
 
 				if (g_ptr_array_remove (comp_objects, comp_data))
 					e_cal_model_free_component_data (comp_data);
@@ -1494,7 +1496,9 @@ hide_completed_rows (ECalModel *model, GList *clients_list, gchar *hide_sexp, GP
 
 		g_list_foreach (objects, (GFunc) icalcomponent_free, NULL);
 		g_list_free (objects);
+	}
 
+	if (changed) {
 		/* to notify about changes, because in call of row_deleted there are still all events */
 		e_table_model_changed (E_TABLE_MODEL (model));
 	}
diff --git a/modules/calendar/e-memo-shell-content.c b/modules/calendar/e-memo-shell-content.c
index c90b1de..21ab63e 100644
--- a/modules/calendar/e-memo-shell-content.c
+++ b/modules/calendar/e-memo-shell-content.c
@@ -202,7 +202,7 @@ memo_shell_content_cursor_change_cb (EMemoShellContent *memo_shell_content,
 	memo_preview = e_memo_shell_content_get_memo_preview (memo_shell_content);
 
 	if (e_table_selected_count (table) != 1) {
-		e_web_view_clear (E_WEB_VIEW (memo_preview));
+		e_cal_component_preview_clear (memo_preview);
 		return;
 	}
 
@@ -233,7 +233,7 @@ memo_shell_content_selection_change_cb (EMemoShellContent *memo_shell_content,
 	/* XXX Old code emits a "selection-changed" signal here. */
 
 	if (e_table_selected_count (table) != 1)
-		e_web_view_clear (E_WEB_VIEW (memo_preview));
+		e_cal_component_preview_clear (memo_preview);
 }
 
 static void
diff --git a/modules/calendar/e-memo-shell-view-actions.c b/modules/calendar/e-memo-shell-view-actions.c
index 57420cd..734a7c5 100644
--- a/modules/calendar/e-memo-shell-view-actions.c
+++ b/modules/calendar/e-memo-shell-view-actions.c
@@ -97,7 +97,7 @@ action_memo_delete_cb (GtkAction *action,
 	e_memo_table_delete_selected (memo_table);
 	e_memo_shell_view_set_status_message (memo_shell_view, NULL, -1.0);
 
-	e_web_view_clear (E_WEB_VIEW (memo_preview));
+	e_cal_component_preview_clear (memo_preview);
 }
 
 static void
diff --git a/modules/calendar/e-memo-shell-view.c b/modules/calendar/e-memo-shell-view.c
index 5d932e1..242bdfc 100644
--- a/modules/calendar/e-memo-shell-view.c
+++ b/modules/calendar/e-memo-shell-view.c
@@ -151,7 +151,7 @@ memo_shell_view_execute_search (EShellView *shell_view)
 
 	memo_preview =
 		e_memo_shell_content_get_memo_preview (memo_shell_content);
-	e_web_view_clear (E_WEB_VIEW (memo_preview));
+	e_cal_component_preview_clear (memo_preview);
 }
 
 static void
diff --git a/modules/calendar/e-task-shell-content.c b/modules/calendar/e-task-shell-content.c
index 2ad4b28..ca17cdb 100644
--- a/modules/calendar/e-task-shell-content.c
+++ b/modules/calendar/e-task-shell-content.c
@@ -203,7 +203,7 @@ task_shell_content_cursor_change_cb (ETaskShellContent *task_shell_content,
 	task_preview = e_task_shell_content_get_task_preview (task_shell_content);
 
 	if (e_table_selected_count (table) != 1) {
-		e_web_view_clear (E_WEB_VIEW (task_preview));
+		e_cal_component_preview_clear (task_preview);
 		return;
 	}
 
@@ -232,7 +232,7 @@ task_shell_content_selection_change_cb (ETaskShellContent *task_shell_content,
 	task_preview = e_task_shell_content_get_task_preview (task_shell_content);
 
 	if (e_table_selected_count (table) != 1)
-		e_web_view_clear (E_WEB_VIEW (task_preview));
+		e_cal_component_preview_clear (task_preview);
 }
 
 static void
diff --git a/modules/calendar/e-task-shell-view-actions.c b/modules/calendar/e-task-shell-view-actions.c
index 6f70c9a..0617778 100644
--- a/modules/calendar/e-task-shell-view-actions.c
+++ b/modules/calendar/e-task-shell-view-actions.c
@@ -128,7 +128,7 @@ action_task_delete_cb (GtkAction *action,
 	e_calendar_table_delete_selected (task_table);
 	e_task_shell_view_set_status_message (task_shell_view, NULL, -1.0);
 
-	e_web_view_clear (E_WEB_VIEW (task_preview));
+	e_cal_component_preview_clear (task_preview);
 }
 
 static void
diff --git a/modules/calendar/e-task-shell-view.c b/modules/calendar/e-task-shell-view.c
index b7c2bc9..8518a6d 100644
--- a/modules/calendar/e-task-shell-view.c
+++ b/modules/calendar/e-task-shell-view.c
@@ -263,7 +263,7 @@ task_shell_view_execute_search (EShellView *shell_view)
 
 	task_preview =
 		e_task_shell_content_get_task_preview (task_shell_content);
-	e_web_view_clear (E_WEB_VIEW (task_preview));
+	e_cal_component_preview_clear (task_preview);
 }
 
 static void



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