[evolution] Bug #655253 - Do not show detached instances twice in a calendar



commit f2dee9eb354db191021f0fa33228ac138f9e78b4
Author: Milan Crha <mcrha redhat com>
Date:   Wed Sep 14 20:00:25 2011 +0200

    Bug #655253 - Do not show detached instances twice in a calendar

 calendar/gui/e-cal-model.c |   52 +++++++++++++++++++++++++++----------------
 1 files changed, 33 insertions(+), 19 deletions(-)
---
diff --git a/calendar/gui/e-cal-model.c b/calendar/gui/e-cal-model.c
index 9bb8235..0c8c59b 100644
--- a/calendar/gui/e-cal-model.c
+++ b/calendar/gui/e-cal-model.c
@@ -2115,6 +2115,33 @@ search_by_id_and_client (ECalModelPrivate *priv,
 	return NULL;
 }
 
+static void
+remove_all_for_id_and_client (ECalModel *model,
+			      ECalClient *client,
+			      const ECalComponentId *id)
+{
+	ECalModelComponent *comp_data;
+
+	while ((comp_data = search_by_id_and_client (model->priv, client, id))) {
+		gint pos;
+		GSList *list = NULL;
+
+		pos = get_position_in_array (model->priv->objects, comp_data);
+
+		if (!g_ptr_array_remove (model->priv->objects, comp_data))
+			continue;
+
+		list = g_slist_append (list, comp_data);
+		g_signal_emit (G_OBJECT (model), signals[COMPS_DELETED], 0, list);
+
+		g_slist_free (list);
+		g_object_unref (comp_data);
+
+		e_table_model_pre_change (E_TABLE_MODEL (model));
+		e_table_model_row_deleted (E_TABLE_MODEL (model), pos);
+	}
+}
+
 typedef struct {
 	ECalClient *client;
 	ECalClientView *view;
@@ -2134,11 +2161,16 @@ add_instance_cb (ECalComponent *comp,
 	icaltimetype time;
 	ECalComponentDateTime datetime, to_set;
 	icaltimezone *zone = NULL;
+	ECalComponentId *id;
 
 	g_return_val_if_fail (E_IS_CAL_COMPONENT (comp), TRUE);
 
 	priv = rdata->model->priv;
 
+	id = e_cal_component_get_id (comp);
+	remove_all_for_id_and_client (rdata->model, rdata->client, id);
+	e_cal_component_free_id (id);
+
 	e_table_model_pre_change (E_TABLE_MODEL (rdata->model));
 
 	/* set the right instance start date to component */
@@ -2265,25 +2297,7 @@ process_added (ECalClientView *view,
 		id = e_cal_component_get_id (comp);
 
 		/* remove the components if they are already present and re-add them */
-		while ((comp_data = search_by_id_and_client (priv, client,
-							      id))) {
-			gint pos;
-			GSList *list = NULL;
-
-			pos = get_position_in_array (priv->objects, comp_data);
-
-			if (!g_ptr_array_remove (priv->objects, comp_data))
-				continue;
-
-			list = g_slist_append (list, comp_data);
-			g_signal_emit (G_OBJECT (model), signals[COMPS_DELETED], 0, list);
-
-			g_slist_free (list);
-			g_object_unref (comp_data);
-
-			e_table_model_pre_change (E_TABLE_MODEL (model));
-			e_table_model_row_deleted (E_TABLE_MODEL (model), pos);
-		}
+		remove_all_for_id_and_client (model, client, id);
 
 		e_cal_component_free_id (id);
 		g_object_unref (comp);



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