You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pivot.apache.org by rw...@apache.org on 2017/02/17 19:26:04 UTC

svn commit: r1783453 - in /pivot/branches/2.0.x/wtk/src/org/apache/pivot/wtk: Span.java TextPane.java text/ComponentNode.java text/Node.java text/TextNode.java

Author: rwhitcomb
Date: Fri Feb 17 19:26:04 2017
New Revision: 1783453

URL: http://svn.apache.org/viewvc?rev=1783453&view=rev
Log:
PIVOT-992:  Merge some ancillary changes (piecemeal) from "trunk" into
"branches/2.0.x" that are needed to make the TextPane changes merged
earlier to compile/work.  Mostly these have to do with supporting
text in ComponentNode, and using Span to access pieces of character
data.

Modified:
    pivot/branches/2.0.x/wtk/src/org/apache/pivot/wtk/Span.java
    pivot/branches/2.0.x/wtk/src/org/apache/pivot/wtk/TextPane.java
    pivot/branches/2.0.x/wtk/src/org/apache/pivot/wtk/text/ComponentNode.java
    pivot/branches/2.0.x/wtk/src/org/apache/pivot/wtk/text/Node.java
    pivot/branches/2.0.x/wtk/src/org/apache/pivot/wtk/text/TextNode.java

Modified: pivot/branches/2.0.x/wtk/src/org/apache/pivot/wtk/Span.java
URL: http://svn.apache.org/viewvc/pivot/branches/2.0.x/wtk/src/org/apache/pivot/wtk/Span.java?rev=1783453&r1=1783452&r2=1783453&view=diff
==============================================================================
--- pivot/branches/2.0.x/wtk/src/org/apache/pivot/wtk/Span.java (original)
+++ pivot/branches/2.0.x/wtk/src/org/apache/pivot/wtk/Span.java Fri Feb 17 19:26:04 2017
@@ -189,6 +189,20 @@ public final class Span {
         return new Span(Math.min(start, end), Math.max(start, end));
     }
 
+    /**
+     * Returns a new {@link Span} with both values offset by the given value.
+     * <p> This is useful while moving through a {@link TextPane} document
+     * for instance, where you have to subtract off the starting offset for
+     * child nodes.
+     *
+     * @param offset The positive or negative amount by which to "move" this
+     * span (both start and end).
+     * @return A new {@link Span} with updated values.
+     */
+    public Span offset(int offset) {
+        return new Span(this.start + offset, this.end + offset);
+    }
+
     @Override
     public boolean equals(Object o) {
         boolean equal = false;

Modified: pivot/branches/2.0.x/wtk/src/org/apache/pivot/wtk/TextPane.java
URL: http://svn.apache.org/viewvc/pivot/branches/2.0.x/wtk/src/org/apache/pivot/wtk/TextPane.java?rev=1783453&r1=1783452&r2=1783453&view=diff
==============================================================================
--- pivot/branches/2.0.x/wtk/src/org/apache/pivot/wtk/TextPane.java (original)
+++ pivot/branches/2.0.x/wtk/src/org/apache/pivot/wtk/TextPane.java Fri Feb 17 19:26:04 2017
@@ -24,6 +24,7 @@ import org.apache.pivot.beans.DefaultPro
 import org.apache.pivot.collections.LinkedList;
 import org.apache.pivot.collections.Sequence;
 import org.apache.pivot.util.ListenerList;
+import org.apache.pivot.wtk.Span;
 import org.apache.pivot.wtk.media.Image;
 import org.apache.pivot.wtk.text.ComponentNode;
 import org.apache.pivot.wtk.text.ComponentNodeListener;
@@ -702,31 +703,92 @@ public class TextPane extends Container
         // TODO
     }
 
-    private void addToText(StringBuilder text, Element element) {
-        for (Node node : element) {
-            if (node instanceof TextNode) {
-                text.append(((TextNode)node).getCharacters());
+    /**
+     * Add the text from the given element (and its children) to the given buffer,
+     * respecting the range of characters to be included.
+     *
+     * @param text The buffer we're building.
+     * @param element The current element in the document.
+     * @param includeSpan The range of text to be included (in document-relative
+     * coordinates).
+     */
+    private void addToText(StringBuilder text, Element element, Span includeSpan) {
+        Span elementSpan = element.getDocumentSpan();
+        Span elementIntersection = elementSpan.intersect(includeSpan);
+        if (elementIntersection != null) {
+            for (Node node : element) {
+                if (node instanceof Element) {
+                    addToText(text, (Element) node, includeSpan);
+                }
+                else {
+                    Span nodeSpan = node.getDocumentSpan();
+                    Span nodeIntersection = nodeSpan.intersect(includeSpan);
+                    if (nodeIntersection != null) {
+                        Span currentSpan = nodeIntersection.offset(-nodeSpan.start);
+                        if (node instanceof TextNode) {
+                            text.append(((TextNode) node).getCharacters(currentSpan));
+                        } else if (node instanceof ComponentNode) {
+                            text.append(((ComponentNode) node).getCharacters(currentSpan));
+                        }
+                        // TODO: anything more that could/should be handled?
+                        // lists for instance???
+                    }
+                }
             }
-            else if (node instanceof Element) {
-                addToText(text, (Element)node);
+            if (element instanceof Paragraph && elementIntersection.end == elementSpan.end) {
+                // TODO: unclear if this is included in the character count for a paragraph or not
+                // or what that means for the intersection range above
+                text.append('\n');
             }
-            // TODO: anything more that could/should be handled?
-        }
-        if (element instanceof Paragraph) {
-            text.append('\n');
         }
     }
 
     /**
-     * Convenience method to get all the text from the current document
-     * into a single string.
+     * Convenience method to get all the text from the current document into a
+     * single string.
+     *
+     * @return The complete text of the document as a string.
      * @see #setText
      */
     public String getText() {
+        int count;
+        Document doc = getDocument();
+        if (doc != null && (count = getCharacterCount()) != 0) {
+            StringBuilder text = new StringBuilder(count);
+            addToText(text, doc, new Span(0, count - 1));
+            return text.toString();
+        }
+        return null;
+    }
+
+    /**
+     * Convenience method to get a portion of the document text into a single string.
+     *
+     * @param beginIndex The 0-based offset where to start retrieving text.
+     * @param endIndex The ending offset + 1 of the text to retrieve.
+     * @return The specified portion of the document text if there is any, or
+     * {@code null} if there is no document.
+     */
+    public String getText(int beginIndex, int endIndex) {
+        if (beginIndex > endIndex) {
+            throw new IllegalArgumentException("Beginning index " + beginIndex +
+                " is greater than ending index " + endIndex + ".");
+        }
+
+        if (beginIndex < 0 || endIndex > getCharacterCount()) {
+            throw new IndexOutOfBoundsException("Beginning index = " + beginIndex +
+                ", ending index = " + endIndex + ", document.characterCount = " +
+                getCharacterCount() + ".");
+        }
+
+        int count = endIndex - beginIndex;
+        if (count == 0) {
+            return "";
+        }
         Document doc = getDocument();
-        if (doc != null && getCharacterCount() != 0) {
-            StringBuilder text = new StringBuilder(getCharacterCount());
-            addToText(text, doc);
+        if (doc != null) {
+            StringBuilder text = new StringBuilder(count);
+            addToText(text, doc, new Span(beginIndex, endIndex - 1));
             return text.toString();
         }
         return null;

Modified: pivot/branches/2.0.x/wtk/src/org/apache/pivot/wtk/text/ComponentNode.java
URL: http://svn.apache.org/viewvc/pivot/branches/2.0.x/wtk/src/org/apache/pivot/wtk/text/ComponentNode.java?rev=1783453&r1=1783452&r2=1783453&view=diff
==============================================================================
--- pivot/branches/2.0.x/wtk/src/org/apache/pivot/wtk/text/ComponentNode.java (original)
+++ pivot/branches/2.0.x/wtk/src/org/apache/pivot/wtk/text/ComponentNode.java Fri Feb 17 19:26:04 2017
@@ -17,7 +17,15 @@
 package org.apache.pivot.wtk.text;
 
 import org.apache.pivot.util.ListenerList;
+import org.apache.pivot.wtk.Button;
 import org.apache.pivot.wtk.Component;
+import org.apache.pivot.wtk.Container;
+import org.apache.pivot.wtk.Label;
+import org.apache.pivot.wtk.Span;
+import org.apache.pivot.wtk.TextArea;
+import org.apache.pivot.wtk.TextInput;
+import org.apache.pivot.wtk.TextPane;
+import org.apache.pivot.wtk.content.ButtonData;
 
 /**
  * Node representing a live pivot component.
@@ -62,14 +70,62 @@ public class ComponentNode extends Node
         }
     }
 
+    public String getText() {
+        return getText(this.component);
+    }
+
+    private String getText(Component comp) {
+        if (comp instanceof TextInput) {
+            return ((TextInput)comp).getText();
+        } else if (comp instanceof TextArea) {
+            return ((TextArea)comp).getText();
+        } else if (comp instanceof TextPane) {
+            return ((TextPane)comp).getText();
+        } else if (comp instanceof Label) {
+            return ((Label)comp).getText();
+        } else if (comp instanceof Button) {
+            Object buttonData = ((Button)comp).getButtonData();
+            if (buttonData instanceof ButtonData) {
+                return ((ButtonData)buttonData).getText();
+            } else if (buttonData instanceof String) {
+                return (String)buttonData;
+            } else {
+                return buttonData.toString();
+            }
+        } else if (comp instanceof Container) {
+            StringBuilder buf = new StringBuilder();
+            for (Component child : (Container)comp) {
+                buf.append(getText(child));
+            }
+            return buf.toString();
+        }
+        return "";
+    }
+
+    public String getSubstring(Span range) {
+        return getText(this.component).substring(range.start, range.end + 1);
+    }
+
+    public String getSubstring(int start, int end) {
+        return getText(this.component).substring(start, end);
+    }
+
+    public CharSequence getCharacters(Span range) {
+        return getText(this.component).subSequence(range.start, range.end + 1);
+    }
+
+    public CharSequence getCharacters(int start, int end) {
+        return getText(this.component).subSequence(start, end);
+    }
+
     @Override
     public char getCharacterAt(int offset) {
-        return 0x00;
+        return getText(this.component).charAt(offset);
     }
 
     @Override
     public int getCharacterCount() {
-        return 1;
+        return getText(this.component).length();
     }
 
     @Override
@@ -84,7 +140,9 @@ public class ComponentNode extends Node
 
     @Override
     public Node getRange(int offset, int characterCount) {
-        if (offset < 0 || offset > 1) {
+        // Note: only supports getting the complete range of text
+        String componentText = getText();
+        if (offset < 0 || offset >= componentText.length()) {
             throw new IndexOutOfBoundsException();
         }
 

Modified: pivot/branches/2.0.x/wtk/src/org/apache/pivot/wtk/text/Node.java
URL: http://svn.apache.org/viewvc/pivot/branches/2.0.x/wtk/src/org/apache/pivot/wtk/text/Node.java?rev=1783453&r1=1783452&r2=1783453&view=diff
==============================================================================
--- pivot/branches/2.0.x/wtk/src/org/apache/pivot/wtk/text/Node.java (original)
+++ pivot/branches/2.0.x/wtk/src/org/apache/pivot/wtk/text/Node.java Fri Feb 17 19:26:04 2017
@@ -18,6 +18,7 @@ package org.apache.pivot.wtk.text;
 
 import org.apache.pivot.collections.Sequence;
 import org.apache.pivot.util.ListenerList;
+import org.apache.pivot.wtk.Span;
 
 /**
  * Abstract base class for document nodes.
@@ -120,6 +121,17 @@ public abstract class Node {
     }
 
     /**
+     * @return A {@link Span} that describes the content range of this node
+     * relative to the whole document.
+     */
+    public Span getDocumentSpan() {
+        int docOffset = getDocumentOffset();
+        int nodeLength = getCharacterCount();
+        // The "end" of a Span is inclusive, so subtract one here
+        return new Span(docOffset, docOffset + nodeLength - 1);
+    }
+
+    /**
      * Inserts a range into the node. Note that the contents of the range,
      * rather than the range itself, is added to the node.
      *

Modified: pivot/branches/2.0.x/wtk/src/org/apache/pivot/wtk/text/TextNode.java
URL: http://svn.apache.org/viewvc/pivot/branches/2.0.x/wtk/src/org/apache/pivot/wtk/text/TextNode.java?rev=1783453&r1=1783452&r2=1783453&view=diff
==============================================================================
--- pivot/branches/2.0.x/wtk/src/org/apache/pivot/wtk/text/TextNode.java (original)
+++ pivot/branches/2.0.x/wtk/src/org/apache/pivot/wtk/text/TextNode.java Fri Feb 17 19:26:04 2017
@@ -17,6 +17,7 @@
 package org.apache.pivot.wtk.text;
 
 import org.apache.pivot.util.ListenerList;
+import org.apache.pivot.wtk.Span;
 
 /**
  * Node representing a sequence of characters.
@@ -107,6 +108,10 @@ public final class TextNode extends Node
         }
     }
 
+    public String getSubstring(Span range) {
+        return characters.substring(range.start, range.end + 1);
+    }
+
     public String getSubstring(int start, int end) {
         return characters.substring(start, end);
     }
@@ -115,6 +120,14 @@ public final class TextNode extends Node
         return characters;
     }
 
+    public CharSequence getCharacters(int start, int end) {
+        return characters.subSequence(start, end);
+    }
+
+    public CharSequence getCharacters(Span range) {
+        return characters.subSequence(range.start, range.end + 1);
+    }
+
     @Override
     public char getCharacterAt(int index) {
         if (index < 0