[gnumeric] Conditional style: improve handling of large areas.
- From: Morten Welinder <mortenw src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnumeric] Conditional style: improve handling of large areas.
- Date: Tue, 13 Aug 2013 22:48:33 +0000 (UTC)
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]