[gnumeric] Managed dependents: allow resetting sheet



commit dce31edfde7a2fdd27d2c3c3b61551e78752e357
Author: Morten Welinder <terra gnome org>
Date:   Sun Jan 1 15:28:25 2012 -0500

    Managed dependents: allow resetting sheet

 ChangeLog       |    5 +++++
 src/dependent.c |   24 ++++++++++++++++++++++++
 src/dependent.h |    1 +
 3 files changed, 30 insertions(+), 0 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index 884a1fd..9796f34 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2012-01-01  Morten Welinder  <terra gnome org>
+
+	* src/dependent.c (dependent_managed_set_sheet): New function for
+	this mildly complicated operation.
+
 2011-12-31  Morten Welinder  <terra gnome org>
 
 	* src/wbc-gtk.c (wbc_gtk_create_status_area): Beat the auto
diff --git a/src/dependent.c b/src/dependent.c
index 6cabd51..abbcbde 100644
--- a/src/dependent.c
+++ b/src/dependent.c
@@ -1253,11 +1253,35 @@ dependent_managed_init (GnmDependent *dep, Sheet *sheet)
 void
 dependent_managed_set_expr (GnmDependent *dep, GnmExprTop const *texpr)
 {
+	g_return_if_fail (dep != NULL);
+	g_return_if_fail (dependent_type (dep) == DEPENDENT_MANAGED);
+
 	dependent_set_expr (dep, texpr);
 	if (texpr && dep->sheet)
 		dependent_link (dep);
 }
 
+void
+dependent_managed_set_sheet (GnmDependent *dep, Sheet *sheet)
+{
+	GnmExprTop const *texpr;
+
+	g_return_if_fail (dep != NULL);
+	g_return_if_fail (dependent_type (dep) == DEPENDENT_MANAGED);
+
+	if (dep->sheet == sheet)
+		return;
+
+	texpr = dep->texpr;
+	if (texpr) gnm_expr_top_ref (texpr);
+	dependent_set_expr (dep, NULL);
+	/* We're now unlinked from everything. */
+	if (dep->sheet) g_object_unref (dep->sheet);
+	dep->sheet = sheet ? g_object_ref (sheet) : NULL;
+	dependent_managed_set_expr (dep, texpr);
+	if (texpr) gnm_expr_top_unref (texpr);
+}
+
 static void
 managed_dep_eval (G_GNUC_UNUSED GnmDependent *dep)
 {
diff --git a/src/dependent.h b/src/dependent.h
index 78da677..54e7288 100644
--- a/src/dependent.h
+++ b/src/dependent.h
@@ -116,6 +116,7 @@ void             gnm_dep_container_resize (GnmDepContainer *deps, int rows);
 
 void dependent_managed_init (GnmDependent *dep, Sheet *sheet);
 void dependent_managed_set_expr (GnmDependent *dep, GnmExprTop const *texpr);
+void dependent_managed_set_sheet (GnmDependent *dep, Sheet *sheet);
 
 #define DEPENDENT_CONTAINER_FOREACH_DEPENDENT(dc, dep, code)	\
   do {								\



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