You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pivot.apache.org by gb...@apache.org on 2009/10/20 00:30:28 UTC

svn commit: r826843 - in /incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk: skin/terra/TerraTextInputSkin.java text/TextNode.java

Author: gbrown
Date: Mon Oct 19 22:30:27 2009
New Revision: 826843

URL: http://svn.apache.org/viewvc?rev=826843&view=rev
Log:
Minor updates to TerraTextInputSkin; add a character iterator to TextNode.

Modified:
    incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraTextInputSkin.java
    incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/text/TextNode.java

Modified: incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraTextInputSkin.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraTextInputSkin.java?rev=826843&r1=826842&r2=826843&view=diff
==============================================================================
--- incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraTextInputSkin.java (original)
+++ incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraTextInputSkin.java Mon Oct 19 22:30:27 2009
@@ -61,7 +61,7 @@
             caretOn = !caretOn;
 
             java.awt.Rectangle caretBounds = caretShapes[0].getBounds();
-            LineMetrics lm = font.getLineMetrics("", fontRenderContext);
+            LineMetrics lm = font.getLineMetrics("", FONT_RENDER_CONTEXT);
 
             int ascent = Math.round(lm.getAscent());
             caretBounds.x += (padding.left - scrollLeft + 1);
@@ -106,8 +106,6 @@
     }
 
 
-    protected FontRenderContext fontRenderContext = new FontRenderContext(null, true, false);
-
     private boolean caretOn = true;
     private Shape[] caretShapes = null;
     private Shape logicalHighlightShape = null;
@@ -145,6 +143,9 @@
 
     private static final int SCROLL_RATE = 50;
 
+    private static final FontRenderContext FONT_RENDER_CONTEXT =
+        new FontRenderContext(null, true, false);
+
     public TerraTextInputSkin() {
         TerraTheme theme = (TerraTheme)Theme.getTheme();
         font = theme.getFont();
@@ -194,7 +195,7 @@
         // rather than calculating an average width
         String testString = "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz";
 
-        Rectangle2D testStringBounds = font.getStringBounds(testString, fontRenderContext);
+        Rectangle2D testStringBounds = font.getStringBounds(testString, FONT_RENDER_CONTEXT);
         int averageCharWidth = (int)Math.round((testStringBounds.getWidth() / testString.length()));
 
         return textSize * averageCharWidth + (padding.left + padding.right) + 2;
@@ -202,7 +203,7 @@
 
     @Override
     public int getPreferredHeight(int width) {
-        Rectangle2D maxCharBounds = font.getMaxCharBounds(fontRenderContext);
+        Rectangle2D maxCharBounds = font.getMaxCharBounds(FONT_RENDER_CONTEXT);
         int maxCharHeight = (int)Math.ceil(maxCharBounds.getHeight());
 
         return maxCharHeight + (padding.top + padding.bottom) + 2;
@@ -215,12 +216,7 @@
 
     @Override
     public int getBaseline(int width) {
-        // Calculate the baseline of the text
-        TextInput textInput = (TextInput)getComponent();
-        String text = textInput.getText();
-
-        // TODO Use a character iterator
-        LineMetrics lm = font.getLineMetrics(text, fontRenderContext);
+        LineMetrics lm = font.getLineMetrics("", FONT_RENDER_CONTEXT);
         return (int)Math.ceil(lm.getAscent() - 2) + (padding.top + 1);
     }
 
@@ -291,19 +287,19 @@
 
         boolean textValid = textInput.isTextValid();
 
-        LineMetrics lm = font.getLineMetrics("", fontRenderContext);
+        LineMetrics lm = font.getLineMetrics("", FONT_RENDER_CONTEXT);
         int ascent = Math.round(lm.getAscent());
 
         graphics.translate(padding.left - scrollLeft + 1, padding.top + ascent + 1);
 
         if (text.length() > 0) {
             // Paint the text
-            if (fontRenderContext.isAntiAliased()) {
+            if (FONT_RENDER_CONTEXT.isAntiAliased()) {
                 graphics.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
                     Platform.getTextAntialiasingHint());
             }
 
-            if (fontRenderContext.usesFractionalMetrics()) {
+            if (FONT_RENDER_CONTEXT.usesFractionalMetrics()) {
                 graphics.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS,
                     RenderingHints.VALUE_FRACTIONALMETRICS_ON);
             }
@@ -387,7 +383,7 @@
     }
 
     protected int getInsertionIndex(String text, int x) {
-        TextLayout textLayout = new TextLayout(text, font, fontRenderContext);
+        TextLayout textLayout = new TextLayout(text, font, FONT_RENDER_CONTEXT);
         TextHitInfo textHitInfo = textLayout.hitTestChar(x + scrollLeft - padding.left - 1, 0);
         int index = textHitInfo.getInsertionIndex();
 
@@ -1238,7 +1234,7 @@
     @Override
     public void charactersRemoved(TextInput textInput, int index, int count) {
         String text = getText();
-        Rectangle2D textBounds = font.getStringBounds(text, fontRenderContext);
+        Rectangle2D textBounds = font.getStringBounds(text, FONT_RENDER_CONTEXT);
 
         int textWidth = (int)textBounds.getWidth();
         int width = getWidth();
@@ -1289,7 +1285,7 @@
         int selectionStart = textInput.getSelectionStart();
         int selectionLength = textInput.getSelectionLength();
 
-        TextLayout textLayout = new TextLayout(text, font, fontRenderContext);
+        TextLayout textLayout = new TextLayout(text, font, FONT_RENDER_CONTEXT);
 
         caretShapes = textLayout.getCaretShapes(selectionStart);
         logicalHighlightShape = textLayout.getLogicalHighlightShape(selectionStart,

Modified: incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/text/TextNode.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/text/TextNode.java?rev=826843&r1=826842&r2=826843&view=diff
==============================================================================
--- incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/text/TextNode.java (original)
+++ incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/text/TextNode.java Mon Oct 19 22:30:27 2009
@@ -16,12 +16,83 @@
  */
 package org.apache.pivot.wtk.text;
 
+import java.text.CharacterIterator;
+
 import org.apache.pivot.util.ListenerList;
 
 /**
  * Node representing a sequence of characters.
  */
 public final class TextNode extends Node {
+    private class TextNodeCharacterIterator implements CharacterIterator {
+        private int index;
+
+        public TextNodeCharacterIterator() {
+            index = 0;
+        }
+
+        public TextNodeCharacterIterator(TextNodeCharacterIterator textNodeCharacterIterator) {
+            index = textNodeCharacterIterator.index;
+        }
+
+        @Override
+        public char first() {
+            return setIndex(getBeginIndex());
+        }
+
+        @Override
+        public char last() {
+            return setIndex(getCharacterCount() == 0 ? getEndIndex() : getEndIndex() - 1);
+        }
+
+        @Override
+        public char next() {
+            return setIndex(index < getCharacterCount() ? index + 1 : DONE);
+        }
+
+        @Override
+        public char previous() {
+            return setIndex(index > getBeginIndex() ? index - 1 : DONE);
+        }
+
+        @Override
+        public char current() {
+            return (index < getCharacterCount()) ? getCharacter(index) : DONE;
+        }
+
+        @Override
+        public int getBeginIndex() {
+            return 0;
+        }
+
+        @Override
+        public int getEndIndex() {
+            return getCharacterCount();
+        }
+
+        @Override
+        public int getIndex() {
+            return index;
+        }
+
+        @Override
+        public char setIndex(int index) {
+            if (index < 0
+                || index > getCharacterCount()) {
+                throw new IndexOutOfBoundsException();
+            }
+
+            this.index = index;
+
+            return current();
+        }
+
+        @Override
+        public Object clone() {
+            return new TextNodeCharacterIterator(this);
+        }
+    }
+
     private static class TextNodeListenerList extends ListenerList<TextNodeListener>
         implements TextNodeListener {
         @Override
@@ -95,7 +166,6 @@
 
             text = textBuilder.substring(start, end);
             textBuilder.delete(start, end);
-
             textNodeListeners.charactersRemoved(this, index, text);
 
             rangeRemoved(index, count);
@@ -118,6 +188,10 @@
         return textBuilder.length();
     }
 
+    public CharacterIterator getCharacterIterator() {
+        return new TextNodeCharacterIterator();
+    }
+
     public String getText() {
         return textBuilder.toString();
     }