6866751: J2SE_Swing_Reg: the caret disappears when moving to the end of the line.
authorssadetsky
Thu, 09 Apr 2015 17:41:08 +0400
changeset 30452 9cc90ad7cf9a
parent 30451 d28ee90b36ea
child 30453 0a9513d4c1bb
6866751: J2SE_Swing_Reg: the caret disappears when moving to the end of the line. Reviewed-by: serb, alexsch
jdk/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicTextUI.java
jdk/test/javax/swing/plaf/basic/6866751/bug6866751.java
--- 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();
+
+    }
+
+}