< 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 >