[gnumeric] Conditional style: improve handling of large areas.



commit 2f240aa5dd8f2250fc7543ea3eaa6b8adf1d7b9e
Author: Morten Welinder <terra gnome org>
Date:   Tue Aug 13 18:46:02 2013 -0400

    Conditional style: improve handling of large areas.

 ChangeLog            |    4 ++++
 NEWS                 |    1 +
 src/dependent.c      |   13 +++++--------
 src/dependent.h      |    7 ++++---
 src/gnm-style-impl.h |    2 +-
 src/mstyle.c         |   35 ++++++++++++++++++-----------------
 6 files changed, 33 insertions(+), 29 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index 680e491..d085714 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2013-08-13  Morten Welinder  <terra gnome org>
+
+       * src/gnm-style-impl.h (_GnmStyle): Switch ->deps to a GPtrArray.
+
 2013-08-12  Morten Welinder  <terra gnome org>
 
        * src/sheet-object-widget.c (sow_create_widget): New function.
diff --git a/NEWS b/NEWS
index 0157750..6017454 100644
--- a/NEWS
+++ b/NEWS
@@ -37,6 +37,7 @@ Morten:
        [#704562]
        * Fix conditional format problem.  [#704445]
        * Fix R1C1 parsing issue.  [#705637]
+       * Improve handling of large-area conditional styles.
 
 --------------------------------------------------------------------------
 Gnumeric 1.12.4
diff --git a/src/dependent.c b/src/dependent.c
index 12b4e37..5700820 100644
--- a/src/dependent.c
+++ b/src/dependent.c
@@ -1183,16 +1183,15 @@ workbook_unlink_3d_dep (GnmDependent *dep)
  * @sheet:
  * @texpr:
  * @r:
- *
- * Returns: (element-type GnmDependent) (transfer full):
+ * @accum: (inout) (transfer full) (element-type GnmDependent):
  **/
-GSList *
+void
 gnm_dep_style_dependency (Sheet *sheet,
                          GnmExprTop const *texpr,
-                         GnmRange const *r)
+                         GnmRange const *r,
+                         GPtrArray *accum)
 {
        int row, col;
-       GSList *res = NULL;
 
        /*
         * FIXME: Maybe do better for an expression that is just an
@@ -1212,11 +1211,9 @@ gnm_dep_style_dependency (Sheet *sheet,
 
                        dependent_set_expr (dep, texpr);
                        dependent_link (dep);
-                       res = g_slist_prepend (res, dep);
+                       g_ptr_array_add (accum, dep);
                }
        }
-
-       return res;
 }
 
 /*****************************************************************************/
diff --git a/src/dependent.h b/src/dependent.h
index 82d2dbb..aedfcee 100644
--- a/src/dependent.h
+++ b/src/dependent.h
@@ -111,9 +111,10 @@ void dependents_workbook_destroy  (Workbook *wb);
 void dependents_revive_sheet      (Sheet *sheet);
 void workbook_queue_all_recalc   (Workbook *wb);
 
-GSList *gnm_dep_style_dependency (Sheet *sheet,
-                                 GnmExprTop const *texpr,
-                                 GnmRange const *r);
+void gnm_dep_style_dependency (Sheet *sheet,
+                              GnmExprTop const *texpr,
+                              GnmRange const *r,
+                              GPtrArray *accum);
 
 GnmDepContainer *gnm_dep_container_new  (Sheet *sheet);
 void            gnm_dep_container_dump (GnmDepContainer const *deps,
diff --git a/src/gnm-style-impl.h b/src/gnm-style-impl.h
index 5c0a5c8..786a54e 100644
--- a/src/gnm-style-impl.h
+++ b/src/gnm-style-impl.h
@@ -65,7 +65,7 @@ struct _GnmStyle {
        GnmStyleConditions      *conditions;
        GPtrArray               *cond_styles;
 
-       GSList *deps;
+       GPtrArray *deps;
 };
 
 #define elem_changed(style, elem) do { (style)->changed |= (1u << (elem)); } while(0)
diff --git a/src/mstyle.c b/src/mstyle.c
index 540fcd5..c7b5484 100644
--- a/src/mstyle.c
+++ b/src/mstyle.c
@@ -734,8 +734,11 @@ gnm_style_unref (GnmStyle const *style)
                gnm_style_clear_pango (unconst);
                gnm_style_clear_font (unconst);
 
-               if (style->deps)
-                       g_warning ("Leftover style deps!");
+               if (style->deps) {
+                       if (style->deps->len > 0)
+                               g_warning ("Leftover style deps!");
+                       g_ptr_array_free (style->deps, TRUE);
+               }
 
                CHUNK_FREE (gnm_style_pool, unconst);
        }
@@ -1866,13 +1869,11 @@ gnm_style_link_dependents (GnmStyle *style, GnmRange const *r)
 {
        GnmStyleConditions *sc;
        Sheet *sheet;
-       GSList *deps;
 
        g_return_if_fail (style != NULL);
        g_return_if_fail (r != NULL);
 
        sheet = style->linked_sheet;
-       deps = style->deps;
 
        /*
         * Conditional formatting.
@@ -1898,10 +1899,10 @@ gnm_style_link_dependents (GnmStyle *style, GnmRange const *r)
                                        gnm_style_cond_get_expr (c, ei);
                                if (!texpr)
                                        continue;
-                               deps = g_slist_concat
-                                       (deps,
-                                        gnm_dep_style_dependency
-                                        (sheet, texpr, r));
+                               if (!style->deps)
+                                       style->deps = g_ptr_array_new ();
+                               gnm_dep_style_dependency
+                                       (sheet, texpr, r, style->deps);
                        }
                }
        }
@@ -1915,21 +1916,22 @@ gnm_style_link_dependents (GnmStyle *style, GnmRange const *r)
         */
 
        /* The style owns the deps.  */
-       style->deps = deps;
 }
 
 void
 gnm_style_unlink_dependents (GnmStyle *style, GnmRange const *r)
 {
-       GSList *keep = NULL, *l, *next;
+       unsigned ui, k;
 
        g_return_if_fail (style != NULL);
        g_return_if_fail (r != NULL);
 
-       for (l = style->deps; l; l = next) {
-               GnmDependent *dep = l->data;
+       if (!style->deps)
+               return;
+
+       for (ui = k = 0; ui < style->deps->len; ui++) {
+               GnmDependent *dep = g_ptr_array_index (style->deps, ui);
                GnmCellPos const *pos = dependent_pos (dep);
-               next = l->next;
 
                if (range_contains (r, pos->col, pos->row)) {
                        if (debug_style_deps ())
@@ -1937,14 +1939,13 @@ gnm_style_unlink_dependents (GnmStyle *style, GnmRange const *r)
                                            cellpos_as_string (pos), style);
                        dependent_set_expr (dep, NULL);
                        g_free (dep);
-                       g_slist_free_1 (l);
                } else {
-                       l->next = keep;
-                       keep = l;
+                       g_ptr_array_index (style->deps, k) = dep;
+                       k++;
                }
        }
 
-       style->deps = keep;
+       g_ptr_array_set_size (style->deps, k);
 }
 
 


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