Code

r11451@tres: ted | 2006-04-17 22:21:33 -0700
[inkscape.git] / src / text-editing.cpp
index 44450f8fa7e39a7281c72b85f872f9cf84d44adc..f0cb4bd9da12967f29a32a30863485bc1154a367 100644 (file)
@@ -182,6 +182,43 @@ unsigned sp_text_get_length(SPObject const *item)
     return length;
 }
 
+/** Recursively gets the length of all the SPStrings at or below the given
+\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) && !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 (upto && child == upto) {
+            // hit upto, return immediately
+            return length;
+        }
+        if (SP_IS_STRING(child)) {
+            length += SP_STRING(child)->string.length();
+        }
+        else {
+            if (upto && child->isAncestorOf(upto)) {
+                // upto is below us, recurse and break loop
+                length += sp_text_get_length_upto(child, upto);
+                return length;
+            } else {
+                // recurse and go to the next sibling
+                length += sp_text_get_length_upto(child, upto);
+            }
+        }
+    }
+    return length;
+}
+
 static Inkscape::XML::Node* duplicate_node_without_children(Inkscape::XML::Node const *old_node)
 {
     switch (old_node->type()) {