< prev index next >

modules/controls/src/main/java/com/sun/javafx/scene/control/skin/Utils.java

Print this page

        

*** 1,7 **** /* ! * Copyright (c) 2011, 2015, 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 --- 1,7 ---- /* ! * Copyright (c) 2011, 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
*** 52,75 **** import javafx.scene.input.Mnemonic; import javafx.scene.paint.Color; import javafx.scene.text.Font; import javafx.scene.text.Text; import javafx.scene.text.TextBoundsType; import java.text.Bidi; - import java.text.BreakIterator; import java.util.Locale; import java.util.function.Consumer; import static javafx.scene.control.OverrunStyle.CENTER_ELLIPSIS; import static javafx.scene.control.OverrunStyle.CENTER_WORD_ELLIPSIS; import static javafx.scene.control.OverrunStyle.CLIP; import static javafx.scene.control.OverrunStyle.ELLIPSIS; import static javafx.scene.control.OverrunStyle.LEADING_ELLIPSIS; import static javafx.scene.control.OverrunStyle.LEADING_WORD_ELLIPSIS; import static javafx.scene.control.OverrunStyle.WORD_ELLIPSIS; - import static javafx.scene.control.skin.TextFieldSkin.TextPosInfo; /** * BE REALLY CAREFUL WITH RESTORING OR RESETTING STATE OF helper NODE AS LEFTOVER * STATE CAUSES REALLY ODD NASTY BUGS! * --- 52,74 ---- import javafx.scene.input.Mnemonic; import javafx.scene.paint.Color; import javafx.scene.text.Font; import javafx.scene.text.Text; import javafx.scene.text.TextBoundsType; + import javafx.scene.text.HitInfo; import java.text.Bidi; import java.util.Locale; import java.util.function.Consumer; import static javafx.scene.control.OverrunStyle.CENTER_ELLIPSIS; import static javafx.scene.control.OverrunStyle.CENTER_WORD_ELLIPSIS; import static javafx.scene.control.OverrunStyle.CLIP; import static javafx.scene.control.OverrunStyle.ELLIPSIS; import static javafx.scene.control.OverrunStyle.LEADING_ELLIPSIS; import static javafx.scene.control.OverrunStyle.LEADING_WORD_ELLIPSIS; import static javafx.scene.control.OverrunStyle.WORD_ELLIPSIS; /** * BE REALLY CAREFUL WITH RESTORING OR RESETTING STATE OF helper NODE AS LEFTOVER * STATE CAUSES REALLY ODD NASTY BUGS! *
*** 152,162 **** // The -2 is a fudge to make sure the result more often matches // what we get from using computeTextWidth instead. It's not yet // clear what causes the small discrepancies. Bounds bounds = helper.getLayoutBounds(); Point2D endPoint = new Point2D(width - 2, bounds.getMinY() + bounds.getHeight() / 2); ! final int index = helper.impl_hitTestChar(endPoint).getCharIndex(); // RESTORE STATE helper.setWrappingWidth(DEFAULT_WRAPPING_WIDTH); helper.setLineSpacing(DEFAULT_LINE_SPACING); helper.setText(DEFAULT_TEXT); return index; --- 151,161 ---- // The -2 is a fudge to make sure the result more often matches // what we get from using computeTextWidth instead. It's not yet // clear what causes the small discrepancies. Bounds bounds = helper.getLayoutBounds(); Point2D endPoint = new Point2D(width - 2, bounds.getMinY() + bounds.getHeight() / 2); ! final int index = helper.hitTest(endPoint).getCharIndex(); // RESTORE STATE helper.setWrappingWidth(DEFAULT_WRAPPING_WIDTH); helper.setLineSpacing(DEFAULT_LINE_SPACING); helper.setText(DEFAULT_TEXT); return index;
*** 408,424 **** // Find index of character at the bottom left of the text area. // This should be the first character of a line that would be clipped. Point2D endPoint = new Point2D(0, height - helper.getBaselineOffset()); ! int hit = helper.impl_hitTestChar(endPoint).getCharIndex(); if (hit >= len) { helper.setBoundsType(TextBoundsType.LOGICAL); // restore return text; } if (center) { ! hit = helper.impl_hitTestChar(centerPoint).getCharIndex(); } if (hit > 0 && hit < len) { // Step one, make a truncation estimate. --- 407,423 ---- // Find index of character at the bottom left of the text area. // This should be the first character of a line that would be clipped. Point2D endPoint = new Point2D(0, height - helper.getBaselineOffset()); ! int hit = helper.hitTest(endPoint).getCharIndex(); if (hit >= len) { helper.setBoundsType(TextBoundsType.LOGICAL); // restore return text; } if (center) { ! hit = helper.hitTest(centerPoint).getCharIndex(); } if (hit > 0 && hit < len) { // Step one, make a truncation estimate.
*** 475,485 **** // Step two, check if text still overflows after we added the ellipsis. // If so, remove one char or word at a time. while (true) { helper.setText(result); ! int hit2 = helper.impl_hitTestChar(endPoint).getCharIndex(); if (center && hit2 < centerLen) { // No room for text after ellipsis. Maybe there is a newline // here, and the next line falls outside the view. if (hit2 > 0 && result.charAt(hit2-1) == '\n') { hit2--; --- 474,484 ---- // Step two, check if text still overflows after we added the ellipsis. // If so, remove one char or word at a time. while (true) { helper.setText(result); ! int hit2 = helper.hitTest(endPoint).getCharIndex(); if (center && hit2 < centerLen) { // No room for text after ellipsis. Maybe there is a newline // here, and the next line falls outside the view. if (hit2 > 0 && result.charAt(hit2-1) == '\n') { hit2--;
*** 753,782 **** public static boolean isTwoLevelFocus() { return Platform.isSupported(ConditionalFeature.TWO_LEVEL_FOCUS); } - // Workaround for RT-26961. HitInfo.getInsertionIndex() doesn't skip - // complex character clusters / ligatures. - private static BreakIterator charIterator = null; - public static int getHitInsertionIndex(TextPosInfo hit, String text) { - int charIndex = hit.getCharIndex(); - if (text != null && !hit.isLeading()) { - if (charIterator == null) { - charIterator = BreakIterator.getCharacterInstance(); - } - charIterator.setText(text); - int next = charIterator.following(charIndex); - if (next == BreakIterator.DONE) { - charIndex = hit.getInsertionIndex(); - } else { - charIndex = next; - } - } - return charIndex; - } - // useful method for linking things together when before a property is // necessarily set public static <T> void executeOnceWhenPropertyIsNonNull(ObservableValue<T> p, Consumer<T> consumer) { if (p == null) return; --- 752,761 ----
< prev index next >