< prev index next >

modules/graphics/src/main/java/javafx/scene/text/HitInfo.java

Print this page

        

@@ -1,7 +1,7 @@
 /*
- * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License version 2 only, as
  * published by the Free Software Foundation.  Oracle designates this

@@ -21,38 +21,79 @@
  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  * or visit www.oracle.com if you need additional information or have any
  * questions.
  */
 
-package com.sun.javafx.scene.text;
+package javafx.scene.text;
+
+import java.text.BreakIterator;
+
+import com.sun.javafx.scene.text.TextLayout;
 
 /**
  * Represents the hit information in a Text node.
+ *
+ * @since 9
  */
 public class HitInfo {
 
+    private int charIndex;
+    private boolean leading;
+    private int insertionIndex;
+    private String text;
+
+    /**
+     * Create a HitInfo object representing a text index and forward bias.
+     *
+     * @param charIndex the character index.
+     * @param leading whether the hit is on the leading edge of the character. If it is false, it represents the trailing edge.
+     */
+    HitInfo(int charIndex, int insertionIndex, boolean leading, String text) {
+        this.charIndex = charIndex;
+        this.leading = leading;
+        this.insertionIndex = insertionIndex;
+        this.text = text;
+    }
+
     /**
      * The index of the character which this hit information refers to.
      */
-    private int charIndex;
     public int getCharIndex() { return charIndex; }
-    public void setCharIndex(int charIndex) { this.charIndex = charIndex; }
 
     /**
      * Indicates whether the hit is on the leading edge of the character.
      * If it is false, it represents the trailing edge.
      */
-    private boolean leading;
     public boolean isLeading() { return leading; }
-    public void setLeading(boolean leading) { this.leading = leading; }
 
+    private static BreakIterator charIterator = null;
     /**
      * Returns the index of the insertion position.
      */
     public int getInsertionIndex() {
-        return leading ? charIndex : charIndex + 1;
+        if (insertionIndex == -1) {
+            insertionIndex = charIndex;
+            if (!leading) {
+                if (text != null) {
+                    // Skip complex character clusters / ligatures.
+                    if (charIterator == null) {
+                        charIterator = BreakIterator.getCharacterInstance();
+                    }
+                    charIterator.setText(text);
+                    int next = charIterator.following(insertionIndex);
+                    if (next == BreakIterator.DONE) {
+                        insertionIndex += 1;
+                    } else {
+                        insertionIndex = next;
+                    }
+                } else {
+                    insertionIndex += 1;
+                }
+            }
+        }
+        return insertionIndex;
     }
 
     @Override public String toString() {
-        return "charIndex: " + charIndex + ", isLeading: " + leading;
+        return "charIndex: " + charIndex + ", isLeading: " + leading + ", insertionIndex: " + getInsertionIndex();
     }
 }
< prev index next >