Java 类java.awt.font.TextHitInfo 实例源码
项目:incubator-netbeans
文件:TextLayoutUtils.java
/**
* Get real allocation (possibly not rectangular) of a part of layout.
* <br>
* It's used when rendering the text layout for filling background highlights of the view.
*
* @param length Total number of characters for which the allocation is computed.
* @param alloc Allocation given by a parent view.
* @return
*/
public static Shape getRealAlloc(TextLayout textLayout, Rectangle2D textLayoutRect,
TextHitInfo startHit, TextHitInfo endHit)
{
// Quick-fix to eliminate missing line in rendering italic "d" - more elaborate fix is needed
textLayoutRect = new Rectangle2D.Double(textLayoutRect.getX(), textLayoutRect.getY(),
textLayoutRect.getWidth() + 2, textLayoutRect.getHeight());
Rectangle2D.Double zeroBasedRect = ViewUtils.shape2Bounds(textLayoutRect);
zeroBasedRect.x = 0;
zeroBasedRect.y = 0;
Shape ret = textLayout.getVisualHighlightShape(startHit, endHit, zeroBasedRect);
AffineTransform transform = AffineTransform.getTranslateInstance(
textLayoutRect.getX(),
textLayoutRect.getY()
);
ret = transform.createTransformedShape(ret);
// The following gives bad result for some reason (works for layout but not for caret modelToView())
// Shape ret2 = textLayout.getVisualHighlightShape(startHit.getCharIndex(), endHit.getCharIndex(), textLayoutRect);
return ret;
}
项目:OpenJSharp
文件:TextMeasureTests.java
public void runTest(Object ctx, int numReps) {
TLExContext tlctx = (TLExContext)ctx;
TextLayout tl = tlctx.tl;
TextHitInfo[] hits = tlctx.hits;
Rectangle2D lb = tlctx.lb;
Shape s;
if (hits.length < 3) {
do {
s = tl.getVisualHighlightShape(hits[0], hits[hits.length - 1], lb);
} while (--numReps >= 0);
} else {
do {
for (int i = 3; i < hits.length; ++i) {
s = tl.getVisualHighlightShape(hits[i-3], hits[i], lb);
}
} while (--numReps >= 0);
}
}
项目:OpenJSharp
文件:CodePointInputMethod.java
/**
* Move the insertion point one position to the left in the composed text.
* Do not let the caret move to the left of the "\\u" or "\\U".
*/
private void moveCaretLeft() {
int len = buffer.length();
if (--insertionPoint < 2) {
insertionPoint++;
beep();
} else if (format == SURROGATE_PAIR && insertionPoint == 7) {
insertionPoint = 8;
beep();
}
context.dispatchInputMethodEvent(
InputMethodEvent.CARET_POSITION_CHANGED,
null, 0,
TextHitInfo.leading(insertionPoint), null);
}
项目:OpenJSharp
文件:CompositionArea.java
private Rectangle getCaretRectangle(TextHitInfo caret) {
int caretLocation = 0;
TextLayout layout = composedTextLayout;
if (layout != null) {
caretLocation = Math.round(layout.getCaretInfo(caret)[0]);
}
Graphics g = getGraphics();
FontMetrics metrics = null;
try {
metrics = g.getFontMetrics();
} finally {
g.dispose();
}
return new Rectangle(TEXT_ORIGIN_X + caretLocation,
TEXT_ORIGIN_Y - metrics.getAscent(),
0, metrics.getAscent() + metrics.getDescent());
}
项目:OpenJSharp
文件:CompositionAreaHandler.java
public Rectangle getTextLocation(TextHitInfo offset) {
synchronized (compositionAreaLock) {
if (compositionAreaOwner == this && isCompositionAreaVisible()) {
return compositionArea.getTextLocation(offset);
} else if (composedText != null) {
// there's composed text, but it's not displayed, so fake a rectangle
return new Rectangle(0, 0, 0, 10);
} else {
InputMethodRequests requests = getClientInputMethodRequests();
if (requests != null) {
return requests.getTextLocation(offset);
} else {
// passive client, no composed text, so fake a rectangle
return new Rectangle(0, 0, 0, 10);
}
}
}
}
项目:OpenJSharp
文件:InputMethodContext.java
public void dispatchInputMethodEvent(int id,
AttributedCharacterIterator text, int committedCharacterCount,
TextHitInfo caret, TextHitInfo visiblePosition) {
// We need to record the client component as the source so
// that we have correct information if we later have to break up this
// event into key events.
Component source;
source = getClientComponent();
if (source != null) {
InputMethodEvent event = new InputMethodEvent(source,
id, text, committedCharacterCount, caret, visiblePosition);
if (haveActiveClient() && !useBelowTheSpotInput()) {
source.dispatchEvent(event);
} else {
getCompositionAreaHandler(true).processInputMethodEvent(event);
}
}
}
项目:OpenJSharp
文件:JTextComponent.java
public TextHitInfo getLocationOffset(int x, int y) {
if (composedTextAttribute == null) {
return null;
} else {
Point p = getLocationOnScreen();
p.x = x - p.x;
p.y = y - p.y;
int pos = viewToModel(p);
if ((pos >= composedTextStart.getOffset()) &&
(pos <= composedTextEnd.getOffset())) {
return TextHitInfo.leading(pos - composedTextStart.getOffset());
} else {
return null;
}
}
}
项目:OpenJSharp
文件:JTextComponent.java
public Rectangle getTextLocation(TextHitInfo offset) {
Rectangle r;
try {
r = modelToView(getCaretPosition());
if (r != null) {
Point p = getLocationOnScreen();
r.translate(p.x, p.y);
}
} catch (BadLocationException ble) {
r = null;
}
if (r == null)
r = new Rectangle();
return r;
}
项目:jdk8u-jdk
文件:TextMeasureTests.java
public void runTest(Object ctx, int numReps) {
TLExContext tlctx = (TLExContext)ctx;
TextLayout tl = tlctx.tl;
TextHitInfo[] hits = tlctx.hits;
Rectangle2D lb = tlctx.lb;
Shape s;
if (hits.length < 3) {
do {
s = tl.getVisualHighlightShape(hits[0], hits[hits.length - 1], lb);
} while (--numReps >= 0);
} else {
do {
for (int i = 3; i < hits.length; ++i) {
s = tl.getVisualHighlightShape(hits[i-3], hits[i], lb);
}
} while (--numReps >= 0);
}
}
项目:jdk8u-jdk
文件:CodePointInputMethod.java
/**
* Move the insertion point one position to the left in the composed text.
* Do not let the caret move to the left of the "\\u" or "\\U".
*/
private void moveCaretLeft() {
int len = buffer.length();
if (--insertionPoint < 2) {
insertionPoint++;
beep();
} else if (format == SURROGATE_PAIR && insertionPoint == 7) {
insertionPoint = 8;
beep();
}
context.dispatchInputMethodEvent(
InputMethodEvent.CARET_POSITION_CHANGED,
null, 0,
TextHitInfo.leading(insertionPoint), null);
}
项目:jdk8u-jdk
文件:CompositionArea.java
private Rectangle getCaretRectangle(TextHitInfo caret) {
int caretLocation = 0;
TextLayout layout = composedTextLayout;
if (layout != null) {
caretLocation = Math.round(layout.getCaretInfo(caret)[0]);
}
Graphics g = getGraphics();
FontMetrics metrics = null;
try {
metrics = g.getFontMetrics();
} finally {
g.dispose();
}
return new Rectangle(TEXT_ORIGIN_X + caretLocation,
TEXT_ORIGIN_Y - metrics.getAscent(),
0, metrics.getAscent() + metrics.getDescent());
}
项目:jdk8u-jdk
文件:CompositionAreaHandler.java
public Rectangle getTextLocation(TextHitInfo offset) {
synchronized (compositionAreaLock) {
if (compositionAreaOwner == this && isCompositionAreaVisible()) {
return compositionArea.getTextLocation(offset);
} else if (composedText != null) {
// there's composed text, but it's not displayed, so fake a rectangle
return new Rectangle(0, 0, 0, 10);
} else {
InputMethodRequests requests = getClientInputMethodRequests();
if (requests != null) {
return requests.getTextLocation(offset);
} else {
// passive client, no composed text, so fake a rectangle
return new Rectangle(0, 0, 0, 10);
}
}
}
}
项目:jdk8u-jdk
文件:InputMethodContext.java
public void dispatchInputMethodEvent(int id,
AttributedCharacterIterator text, int committedCharacterCount,
TextHitInfo caret, TextHitInfo visiblePosition) {
// We need to record the client component as the source so
// that we have correct information if we later have to break up this
// event into key events.
Component source;
source = getClientComponent();
if (source != null) {
InputMethodEvent event = new InputMethodEvent(source,
id, text, committedCharacterCount, caret, visiblePosition);
if (haveActiveClient() && !useBelowTheSpotInput()) {
source.dispatchEvent(event);
} else {
getCompositionAreaHandler(true).processInputMethodEvent(event);
}
}
}
项目:jdk8u-jdk
文件:JTextComponent.java
public TextHitInfo getLocationOffset(int x, int y) {
if (composedTextAttribute == null) {
return null;
} else {
Point p = getLocationOnScreen();
p.x = x - p.x;
p.y = y - p.y;
int pos = viewToModel(p);
if ((pos >= composedTextStart.getOffset()) &&
(pos <= composedTextEnd.getOffset())) {
return TextHitInfo.leading(pos - composedTextStart.getOffset());
} else {
return null;
}
}
}
项目:jdk8u-jdk
文件:JTextComponent.java
public Rectangle getTextLocation(TextHitInfo offset) {
Rectangle r;
try {
r = modelToView(getCaretPosition());
if (r != null) {
Point p = getLocationOnScreen();
r.translate(p.x, p.y);
}
} catch (BadLocationException ble) {
r = null;
}
if (r == null)
r = new Rectangle();
return r;
}
项目:openjdk-jdk10
文件:TextMeasureTests.java
public void runTest(Object ctx, int numReps) {
TLExContext tlctx = (TLExContext)ctx;
TextLayout tl = tlctx.tl;
TextHitInfo[] hits = tlctx.hits;
Rectangle2D lb = tlctx.lb;
Shape s;
if (hits.length < 3) {
do {
s = tl.getVisualHighlightShape(hits[0], hits[hits.length - 1], lb);
} while (--numReps >= 0);
} else {
do {
for (int i = 3; i < hits.length; ++i) {
s = tl.getVisualHighlightShape(hits[i-3], hits[i], lb);
}
} while (--numReps >= 0);
}
}
项目:openjdk-jdk10
文件:CodePointInputMethod.java
/**
* Move the insertion point one position to the left in the composed text.
* Do not let the caret move to the left of the "\\u" or "\\U".
*/
private void moveCaretLeft() {
int len = buffer.length();
if (--insertionPoint < 2) {
insertionPoint++;
beep();
} else if (format == SURROGATE_PAIR && insertionPoint == 7) {
insertionPoint = 8;
beep();
}
context.dispatchInputMethodEvent(
InputMethodEvent.CARET_POSITION_CHANGED,
null, 0,
TextHitInfo.leading(insertionPoint), null);
}
项目:openjdk-jdk10
文件:CompositionAreaHandler.java
public Rectangle getTextLocation(TextHitInfo offset) {
synchronized (compositionAreaLock) {
if (compositionAreaOwner == this && isCompositionAreaVisible()) {
return compositionArea.getTextLocation(offset);
} else if (composedText != null) {
// there's composed text, but it's not displayed, so fake a rectangle
return new Rectangle(0, 0, 0, 10);
} else {
InputMethodRequests requests = getClientInputMethodRequests();
if (requests != null) {
return requests.getTextLocation(offset);
} else {
// passive client, no composed text, so fake a rectangle
return new Rectangle(0, 0, 0, 10);
}
}
}
}
项目:openjdk-jdk10
文件:InputMethodContext.java
public void dispatchInputMethodEvent(int id,
AttributedCharacterIterator text, int committedCharacterCount,
TextHitInfo caret, TextHitInfo visiblePosition) {
// We need to record the client component as the source so
// that we have correct information if we later have to break up this
// event into key events.
Component source;
source = getClientComponent();
if (source != null) {
InputMethodEvent event = new InputMethodEvent(source,
id, text, committedCharacterCount, caret, visiblePosition);
if (haveActiveClient() && !useBelowTheSpotInput()) {
source.dispatchEvent(event);
} else {
getCompositionAreaHandler(true).processInputMethodEvent(event);
}
}
}
项目:openjdk-jdk10
文件:JTextComponent.java
public TextHitInfo getLocationOffset(int x, int y) {
if (composedTextAttribute == null) {
return null;
} else {
Point p = getLocationOnScreen();
p.x = x - p.x;
p.y = y - p.y;
int pos = viewToModel(p);
if ((pos >= composedTextStart.getOffset()) &&
(pos <= composedTextEnd.getOffset())) {
return TextHitInfo.leading(pos - composedTextStart.getOffset());
} else {
return null;
}
}
}
项目:openjdk-jdk10
文件:JTextComponent.java
public Rectangle getTextLocation(TextHitInfo offset) {
Rectangle r;
try {
r = modelToView(getCaretPosition());
if (r != null) {
Point p = getLocationOnScreen();
r.translate(p.x, p.y);
}
} catch (BadLocationException ble) {
r = null;
}
if (r == null)
r = new Rectangle();
return r;
}
项目:incubator-netbeans
文件:FoldView.java
static TextHitInfo x2RelOffset(TextLayout textLayout, float x) {
TextHitInfo hit;
x -= EXTRA_MARGIN_WIDTH;
if (x >= textLayout.getAdvance()) {
hit = TextHitInfo.trailing(textLayout.getCharacterCount());
} else {
hit = textLayout.hitTestChar(x, 0); // What about backward bias -> with higher offsets it may go back visually
}
return hit;
}
项目:incubator-netbeans
文件:HighlightsViewUtils.java
static int viewToIndex(TextLayout textLayout, double x, Shape alloc, Position.Bias[] biasReturn) {
Rectangle2D bounds = ViewUtils.shapeAsRect(alloc);
TextHitInfo hitInfo = x2Index(textLayout, (float)(x - bounds.getX()));
if (biasReturn != null) {
biasReturn[0] = hitInfo.isLeadingEdge() ? Position.Bias.Forward : Position.Bias.Backward;
}
return hitInfo.getInsertionIndex();
}
项目:incubator-netbeans
文件:HighlightsViewUtils.java
static TextHitInfo x2Index(TextLayout textLayout, float x) {
TextHitInfo hit;
hit = textLayout.hitTestChar(x, 0);
// Use forward bias only since BaseCaret and other code is not sensitive to backward bias yet
if (!hit.isLeadingEdge()) {
hit = TextHitInfo.leading(hit.getInsertionIndex());
}
return hit;
}
项目:OpenJSharp
文件:TextMeasureTests.java
public void init(TestEnvironment env, Result results) {
super.init(env, results);
ArrayList list = new ArrayList(text.length() * 2 + 2);
TextHitInfo hit = TextHitInfo.trailing(-1);
do {
list.add(hit);
hit = tl.getNextRightHit(hit);
} while (hit != null);
hits = (TextHitInfo[])list.toArray(new TextHitInfo[list.size()]);
lb = tl.getBounds();
lb.setRect(lb.getMinX() - 10, lb.getMinY(), lb.getWidth() + 20, lb.getHeight());
}
项目:OpenJSharp
文件:TextMeasureTests.java
public void runTest(Object ctx, int numReps) {
TLExContext tlctx = (TLExContext)ctx;
TextLayout tl = tlctx.tl;
TextHitInfo[] hits = tlctx.hits;
do {
for (int i = 0; i < hits.length; ++i) {
tl.getCaretInfo(hits[i]);
}
} while (--numReps >= 0);
}
项目:OpenJSharp
文件:TextMeasureTests.java
public void runTest(Object ctx, int numReps) {
TLExContext tlctx = (TLExContext)ctx;
TextLayout tl = tlctx.tl;
TextHitInfo[] hits = tlctx.hits;
TextHitInfo hit;
do {
for (int i = 0; i < hits.length; ++i) {
hit = tl.getNextLeftHit(hits[i]);
}
} while (--numReps >= 0);
}
项目:OpenJSharp
文件:TextMeasureTests.java
public void runTest(Object ctx, int numReps) {
TLExContext tlctx = (TLExContext)ctx;
TextLayout tl = tlctx.tl;
TextHitInfo[] hits = tlctx.hits;
Shape s;
do {
for (int i = 0; i < hits.length; ++i) {
s = tl.getCaretShape(hits[i]);
}
} while (--numReps >= 0);
}
项目:OpenJSharp
文件:TextMeasureTests.java
public void runTest(Object ctx, int numReps) {
TLExContext tlctx = (TLExContext)ctx;
TextLayout tl = tlctx.tl;
int numhits = tlctx.hits.length;
Rectangle2D lb = tlctx.lb;
TextHitInfo hit;
for (int i = 0; i <= numhits; ++i) {
float x = (float)(lb.getMinX() + lb.getWidth() * i / numhits);
float y = (float)(lb.getMinY() + lb.getHeight() * i / numhits);
hit = tl.hitTestChar(x, y, lb);
}
}
项目:OpenJSharp
文件:CodePointInputMethod.java
/**
* Send the composed text to the client.
*/
private void sendComposedText() {
AttributedString as = new AttributedString(buffer.toString());
as.addAttribute(TextAttribute.INPUT_METHOD_HIGHLIGHT,
InputMethodHighlight.SELECTED_RAW_TEXT_HIGHLIGHT);
context.dispatchInputMethodEvent(
InputMethodEvent.INPUT_METHOD_TEXT_CHANGED,
as.getIterator(), 0,
TextHitInfo.leading(insertionPoint), null);
}
项目:OpenJSharp
文件:CodePointInputMethod.java
/**
* Send the committed text to the client.
*/
private void sendCommittedText() {
AttributedString as = new AttributedString(buffer.toString());
context.dispatchInputMethodEvent(
InputMethodEvent.INPUT_METHOD_TEXT_CHANGED,
as.getIterator(), buffer.length(),
TextHitInfo.leading(insertionPoint), null);
buffer.setLength(0);
insertionPoint = 0;
format = UNSET;
}
项目:OpenJSharp
文件:CodePointInputMethod.java
/**
* Move the insertion point one position to the right in the composed text.
*/
private void moveCaretRight() {
int len = buffer.length();
if (++insertionPoint > len) {
insertionPoint = len;
beep();
}
context.dispatchInputMethodEvent(
InputMethodEvent.CARET_POSITION_CHANGED,
null, 0,
TextHitInfo.leading(insertionPoint), null);
}
项目:OpenJSharp
文件:CompositionArea.java
/**
* Sets the caret to be displayed in this composition area.
* The text is not changed.
*/
void setCaret(TextHitInfo caret) {
this.caret = caret;
if (compositionWindow.isVisible()) {
Graphics g = getGraphics();
try {
paint(g);
} finally {
g.dispose();
}
}
}
项目:OpenJSharp
文件:CompositionArea.java
TextHitInfo getLocationOffset(int x, int y) {
TextLayout layout = composedTextLayout;
if (layout == null) {
return null;
} else {
Point location = getLocationOnScreen();
x -= location.x + TEXT_ORIGIN_X;
y -= location.y + TEXT_ORIGIN_Y;
if (layout.getBounds().contains(x, y)) {
return layout.hitTestChar(x, y);
} else {
return null;
}
}
}
项目:OpenJSharp
文件:CompositionAreaHandler.java
public TextHitInfo getLocationOffset(int x, int y) {
synchronized (compositionAreaLock) {
if (compositionAreaOwner == this && isCompositionAreaVisible()) {
return compositionArea.getLocationOffset(x, y);
} else {
return null;
}
}
}
项目:OpenJSharp
文件:JTextComponent.java
private void setInputMethodCaretPosition(InputMethodEvent e) {
int dot;
if (composedTextExists()) {
dot = composedTextStart.getOffset();
if (!(caret instanceof ComposedTextCaret)) {
if (composedTextCaret == null) {
composedTextCaret = new ComposedTextCaret();
}
originalCaret = caret;
// Sets composed text caret
exchangeCaret(originalCaret, composedTextCaret);
}
TextHitInfo caretPos = e.getCaret();
if (caretPos != null) {
int index = caretPos.getInsertionIndex();
dot += index;
if (index == 0) {
// Scroll the component if needed so that the composed text
// becomes visible.
try {
Rectangle d = modelToView(dot);
Rectangle end = modelToView(composedTextEnd.getOffset());
Rectangle b = getBounds();
d.x += Math.min(end.x - d.x, b.width);
scrollRectToVisible(d);
} catch (BadLocationException ble) {}
}
}
caret.setDot(dot);
} else if (caret instanceof ComposedTextCaret) {
dot = caret.getDot();
// Restores original caret
exchangeCaret(caret, originalCaret);
caret.setDot(dot);
}
}
项目:OpenJSharp
文件:X11InputMethod.java
/**
* Creates an input method event from the arguments given
* and posts it on the AWT event queue. For arguments,
* see InputMethodEvent. Called by input method.
*
* @see java.awt.event.InputMethodEvent#InputMethodEvent
*/
private void postInputMethodEvent(int id,
AttributedCharacterIterator text,
int committedCharacterCount,
TextHitInfo caret,
TextHitInfo visiblePosition,
long when) {
Component source = getClientComponent();
if (source != null) {
InputMethodEvent event = new InputMethodEvent(source,
id, when, text, committedCharacterCount, caret, visiblePosition);
SunToolkit.postEvent(SunToolkit.targetToAppContext(source), (AWTEvent)event);
}
}
项目:OpenJSharp
文件:X11InputMethod.java
private void postInputMethodEvent(int id,
AttributedCharacterIterator text,
int committedCharacterCount,
TextHitInfo caret,
TextHitInfo visiblePosition) {
postInputMethodEvent(id, text, committedCharacterCount,
caret, visiblePosition, EventQueue.getMostRecentEventTime());
}
项目:jdk8u-jdk
文件:TextMeasureTests.java
public void init(TestEnvironment env, Result results) {
super.init(env, results);
ArrayList list = new ArrayList(text.length() * 2 + 2);
TextHitInfo hit = TextHitInfo.trailing(-1);
do {
list.add(hit);
hit = tl.getNextRightHit(hit);
} while (hit != null);
hits = (TextHitInfo[])list.toArray(new TextHitInfo[list.size()]);
lb = tl.getBounds();
lb.setRect(lb.getMinX() - 10, lb.getMinY(), lb.getWidth() + 20, lb.getHeight());
}
项目:jdk8u-jdk
文件:TextMeasureTests.java
public void runTest(Object ctx, int numReps) {
TLExContext tlctx = (TLExContext)ctx;
TextLayout tl = tlctx.tl;
TextHitInfo[] hits = tlctx.hits;
do {
for (int i = 0; i < hits.length; ++i) {
tl.getCaretInfo(hits[i]);
}
} while (--numReps >= 0);
}