6866751: J2SE_Swing_Reg: the caret disappears when moving to the end of the line.
Reviewed-by: serb, alexsch
--- a/jdk/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicTextUI.java Wed Apr 08 10:50:50 2015 -0700
+++ b/jdk/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicTextUI.java Thu Apr 09 17:41:08 2015 +0400
@@ -102,6 +102,7 @@
*/
@SuppressWarnings("serial") // Same-version serialization only
public abstract class BasicTextUI extends TextUI implements ViewFactory {
+ private static final int DEFAULT_CARET_MARGIN = 1;
/**
* Creates a new UI.
@@ -204,6 +205,12 @@
evt.getPropertyName().equals("enabled")) {
updateBackground((JTextComponent)evt.getSource());
+ } else if (evt.getPropertyName().equals("caretWidth")) {
+ Object value = evt.getNewValue();
+ if (value instanceof Number) {
+ int width = ((Number) value).intValue();
+ if (width >= 0) caretMargin = width;
+ }
}
}
@@ -794,6 +801,20 @@
installDefaults();
installDefaults2();
+ // margin required to show caret in the rightmost position
+ caretMargin = -1;
+ Object property = UIManager.get("Caret.width");
+ if (property instanceof Number) {
+ caretMargin = ((Number) property).intValue();
+ }
+ property = c.getClientProperty("caretWidth");
+ if (property instanceof Number) {
+ caretMargin = ((Number) property).intValue();
+ }
+ if (caretMargin < 0) {
+ caretMargin = DEFAULT_CARET_MARGIN;
+ }
+
// attach to the model and editor
editor.addPropertyChangeListener(updateHandler);
Document doc = editor.getDocument();
@@ -924,7 +945,7 @@
rootView.setSize(Integer.MAX_VALUE, Integer.MAX_VALUE);
}
d.width = (int) Math.min((long) rootView.getPreferredSpan(View.X_AXIS) +
- (long) i.left + (long) i.right, Integer.MAX_VALUE);
+ (long) i.left + (long) i.right + caretMargin, Integer.MAX_VALUE);
d.height = (int) Math.min((long) rootView.getPreferredSpan(View.Y_AXIS) +
(long) i.top + (long) i.bottom, Integer.MAX_VALUE);
} finally {
@@ -1323,6 +1344,7 @@
private final DragListener dragListener = getDragListener();
private static final Position.Bias[] discardBias = new Position.Bias[1];
private DefaultCaret dropCaret;
+ private int caretMargin;
/**
* Root view that acts as a gateway between the component
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/plaf/basic/6866751/bug6866751.java Thu Apr 09 17:41:08 2015 +0400
@@ -0,0 +1,97 @@
+/*
+ * Copyright (c) 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.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * 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.
+ */
+
+/* @test
+ @bug 6866751
+ @summary J2SE_Swing_Reg: the caret disappears when moving to the end of the line.
+ @author Semyon Sadetsky
+ */
+import javax.swing.*;
+
+public class bug6866751 {
+ private static JFrame frame;
+ private static JTextArea area;
+
+ public static void main(String[] args) throws Exception {
+ try {
+ SwingUtilities.invokeAndWait(new Runnable() {
+ public void run() {
+ frame = new JFrame();
+ frame.setUndecorated(true);
+ frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+ setup(frame);
+ }
+ });
+ SwingUtilities.invokeAndWait(new Runnable() {
+ public void run() {
+ int width = area.getWidth();
+ double caretX =
+ area.getCaret().getMagicCaretPosition().getX();
+ if (width < caretX + 1) {
+ throw new RuntimeException(
+ "Width of the area (" + width +
+ ") is less than caret x-position " +
+ caretX + 1);
+ }
+ area.putClientProperty("caretWidth", 10);
+ }
+ });
+ SwingUtilities.invokeAndWait(new Runnable() {
+ public void run() {
+ int width = area.getWidth();
+ double caretX =
+ area.getCaret().getMagicCaretPosition().getX();
+ if (width < caretX + 10) {
+ throw new RuntimeException(
+ "Width of the area (" + width +
+ ") is less than caret x-position " +
+ caretX + 10);
+ }
+ }
+ });
+ System.out.println("ok");
+ } finally {
+ SwingUtilities.invokeAndWait(new Runnable() {
+ @Override
+ public void run() {
+ frame.dispose();
+ }
+ });
+ }
+ }
+
+ static void setup(JFrame frame) {
+ area = new JTextArea();
+ frame.getContentPane().add(new JScrollPane(area));
+ area.setText(
+ "mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm");
+ area.getCaret().setDot(area.getText().length() + 1);
+
+ frame.setSize(300, 200);
+ frame.setVisible(true);
+
+ area.requestFocus();
+
+ }
+
+}