summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbulia byak <buliabyak@gmail.com>2006-02-05 21:30:12 +0000
committerbuliabyak <buliabyak@users.sourceforge.net>2006-02-05 21:30:12 +0000
commit91c19d6f5bcb06bbcac4cc1b90ac6847af0344c3 (patch)
tree7a6078a5f0ffad26dacb18fa08e4bfdc9e0fb6df
parentclean up unused code (diff)
downloadinkscape-91c19d6f5bcb06bbcac4cc1b90ac6847af0344c3.tar.gz
inkscape-91c19d6f5bcb06bbcac4cc1b90ac6847af0344c3.zip
fix recurstion gaffe, comment
(bzr r80)
-rw-r--r--src/text-editing.cpp29
1 files changed, 21 insertions, 8 deletions
diff --git a/src/text-editing.cpp b/src/text-editing.cpp
index d5a53fc49..f0cb4bd9d 100644
--- a/src/text-editing.cpp
+++ b/src/text-editing.cpp
@@ -183,23 +183,36 @@ unsigned sp_text_get_length(SPObject const *item)
}
/** Recursively gets the length of all the SPStrings at or below the given
-\a item. Also adds 1 for each line break encountered. */
+\a item, before and not including \a upto. Also adds 1 for each line break encountered. */
unsigned sp_text_get_length_upto(SPObject const *item, SPObject const *upto)
{
unsigned length = 0;
- if (SP_IS_STRING(item)) return SP_STRING(item)->string.length();
- if (is_line_break_object(item)) length++;
+ if (SP_IS_STRING(item)) {
+ return SP_STRING(item)->string.length();
+ }
+ if (is_line_break_object(item) && !SP_IS_TEXT(item)) {
+ if (item != SP_OBJECT_PARENT(item)->firstChild()) {
+ // add 1 for each newline
+ length++;
+ }
+ }
for (SPObject const *child = item->firstChild() ; child ; child = SP_OBJECT_NEXT(child)) {
- if (child == upto)
+ if (upto && child == upto) {
+ // hit upto, return immediately
return length;
- if (SP_IS_STRING(child)) length += SP_STRING(child)->string.length();
+ }
+ if (SP_IS_STRING(child)) {
+ length += SP_STRING(child)->string.length();
+ }
else {
- if (child->isAncestorOf(upto)) {
- length += sp_text_get_length(child);
+ if (upto && child->isAncestorOf(upto)) {
+ // upto is below us, recurse and break loop
+ length += sp_text_get_length_upto(child, upto);
return length;
} else {
- length += sp_text_get_length(child);
+ // recurse and go to the next sibling
+ length += sp_text_get_length_upto(child, upto);
}
}
}