7190581: Nimbus: PgDn at the bottom causes scrolling
authorpsadhukhan
Fri, 28 Jul 2017 10:26:22 +0530
changeset 47165 eb0b0e665926
parent 47164 729fca326a7a
child 47166 dd1972cc4cd4
7190581: Nimbus: PgDn at the bottom causes scrolling Reviewed-by: ssadetsky
jdk/src/java.desktop/share/classes/javax/swing/text/DefaultEditorKit.java
jdk/test/javax/swing/JTextArea/4697612/bug4697612.java
--- a/jdk/src/java.desktop/share/classes/javax/swing/text/DefaultEditorKit.java	Thu Jul 27 12:36:57 2017 -0700
+++ b/jdk/src/java.desktop/share/classes/javax/swing/text/DefaultEditorKit.java	Fri Jul 28 10:26:22 2017 +0530
@@ -1496,6 +1496,15 @@
                                     target.setCaretPosition(newIndex);
                                 }
                             }
+                        } else {
+                            // If the caret index is same as the visible offset
+                            // then correct newVis.y so that it won't cause
+                            // unnecessary scrolling upward/downward when
+                            // page-down/page-up is received after ctrl-END/ctrl-HOME
+                            if (direction == -1 && newVis.y <= initialY ||
+                                direction == 1 && newVis.y >= initialY) {
+                                newVis.y = initialY;
+                            }
                         }
                     } catch (BadLocationException ble) { }
                 } else {
--- a/jdk/test/javax/swing/JTextArea/4697612/bug4697612.java	Thu Jul 27 12:36:57 2017 -0700
+++ b/jdk/test/javax/swing/JTextArea/4697612/bug4697612.java	Fri Jul 28 10:26:22 2017 +0530
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2017, 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
@@ -24,17 +24,23 @@
 /*
  * @test
  * @key headful
- * @bug 4697612 6244705
- * @author Peter Zhelezniakov
- * @library ../../regtesthelpers
- * @build Util
+ * @bug 4697612 6244705 7190581
  * @run main bug4697612
  */
-import java.io.*;
-import java.awt.*;
-import java.awt.event.*;
-import javax.swing.*;
-
+import java.awt.Rectangle;
+import java.awt.Dimension;
+import java.io.InputStream;
+import java.awt.Robot;
+import java.awt.event.KeyEvent;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import javax.swing.JFrame;
+import javax.swing.JScrollPane;
+import javax.swing.JTextArea;
+import javax.swing.LookAndFeel;
+import javax.swing.SwingUtilities;
+import javax.swing.UIManager;
+import javax.swing.UnsupportedLookAndFeelException;
 import javax.swing.text.BadLocationException;
 
 public class bug4697612 {
@@ -47,94 +53,120 @@
     private static JFrame frame;
     private static JTextArea text;
     private static JScrollPane scroller;
+    private static Robot robot;
+
+    private static void setLookAndFeel(final UIManager.LookAndFeelInfo laf) {
+        try {
+            UIManager.setLookAndFeel(laf.getClassName());
+        } catch (ClassNotFoundException | InstantiationException |
+                 UnsupportedLookAndFeelException | IllegalAccessException e) {
+            throw new RuntimeException(e);
+        }
+    }
 
     public static void main(String[] args) throws Throwable {
-        Robot robot = new Robot();
+        robot = new Robot();
         robot.setAutoDelay(100);
-
-        SwingUtilities.invokeAndWait(new Runnable() {
-
-            @Override
-            public void run() {
-                createAndShowGUI();
-            }
-        });
-
-        robot.waitForIdle();
-
-        SwingUtilities.invokeAndWait(new Runnable() {
-
-            @Override
-            public void run() {
-                text.requestFocus();
+        for (UIManager.LookAndFeelInfo laf : UIManager.getInstalledLookAndFeels()) {
+            try {
+                SwingUtilities.invokeAndWait(() -> setLookAndFeel(laf));
+                System.out.println("Test for LookAndFeel " + laf.getClassName());
+                new bug4697612();
+                System.out.println("Test passed for LookAndFeel " + laf.getClassName());
+            }  catch (Exception e) {
+                throw new RuntimeException(e);
             }
-        });
-
-        robot.waitForIdle();
-
-        // 4697612: pressing PgDn + PgUp should not alter caret position
-        Util.hitKeys(robot, KeyEvent.VK_HOME);
-        Util.hitKeys(robot, KeyEvent.VK_PAGE_DOWN);
-
+        }
+    }
 
-        int pos0 = getTextCaretPosition();
-        int caretHeight = getTextCaretHeight();
-        fontHeight = FONT_HEIGHT;
-
-        // iterate two times, for different (even and odd) font height
-        for (int i = 0; i < 2; i++) {
-
+    public bug4697612() throws Exception {
+        try {
             SwingUtilities.invokeAndWait(new Runnable() {
-
+                @Override
                 public void run() {
-                    text.setFont(text.getFont().deriveFont(fontHeight));
+                    createAndShowGUI();
+                }
+            });
+            robot.waitForIdle();
+            SwingUtilities.invokeAndWait(new Runnable() {
+                @Override
+                public void run() {
+                    text.requestFocus();
                 }
             });
+            robot.waitForIdle();
 
-            frameHeight = FRAME_HEIGHT;
+            // 4697612: pressing PgDn + PgUp should not alter caret position
+            robot.keyPress(KeyEvent.VK_HOME);
+            robot.keyRelease(KeyEvent.VK_HOME);
+            robot.keyPress(KeyEvent.VK_PAGE_DOWN);
+            robot.keyRelease(KeyEvent.VK_PAGE_DOWN);
+            robot.waitForIdle();
 
-            for (int j = 0; j < caretHeight; j++) {
-                SwingUtilities.invokeAndWait(new Runnable() {
+            int pos0 = getTextCaretPosition();
+            int caretHeight = getTextCaretHeight();
+            fontHeight = FONT_HEIGHT;
 
+            // iterate two times, for different (even and odd) font height
+            for (int i = 0; i < 2; i++) {
+
+                SwingUtilities.invokeAndWait(new Runnable() {
                     public void run() {
-                        frame.setSize(FRAME_WIDTH, frameHeight);
+                        text.setFont(text.getFont().deriveFont(fontHeight));
                     }
                 });
-
-                robot.waitForIdle();
+                frameHeight = FRAME_HEIGHT;
 
-                Util.hitKeys(robot, KeyEvent.VK_PAGE_DOWN);
-                Util.hitKeys(robot, KeyEvent.VK_PAGE_UP);
-                robot.waitForIdle();
+                for (int j = 0; j < caretHeight; j++) {
 
-                int pos = getTextCaretPosition();
-                if (pos0 != pos) {
-                    throw new RuntimeException("Failed 4697612: PgDn & PgUp keys scroll by different amounts");
+                    SwingUtilities.invokeAndWait(new Runnable() {
+                        public void run() {
+                            frame.setSize(FRAME_WIDTH, frameHeight);
+                        }
+                    });
+                    robot.waitForIdle();
+                    robot.keyPress(KeyEvent.VK_PAGE_DOWN);
+                    robot.keyRelease(KeyEvent.VK_PAGE_DOWN);
+                    robot.keyPress(KeyEvent.VK_PAGE_UP);
+                    robot.keyRelease(KeyEvent.VK_PAGE_UP);
+                    robot.waitForIdle();
+
+                    int pos = getTextCaretPosition();
+                    if (pos0 != pos) {
+                        throw new RuntimeException("Failed 4697612: PgDn & PgUp keys scroll by different amounts");
+                    }
+                    frameHeight++;
                 }
-                frameHeight++;
+                fontHeight++;
             }
-            fontHeight++;
-        }
-
 
-        // 6244705: pressing PgDn at the very bottom should not scroll
-        LookAndFeel laf = UIManager.getLookAndFeel();
-        if (laf.getID().equals("Aqua")) {
-            Util.hitKeys(robot, KeyEvent.VK_END);
-        } else {
-            Util.hitKeys(robot, KeyEvent.VK_CONTROL, KeyEvent.VK_END);
-        }
+            // 6244705: pressing PgDn at the very bottom should not scroll
+            LookAndFeel laf = UIManager.getLookAndFeel();
+            if (laf.getID().equals("Aqua")) {
+                robot.keyPress(KeyEvent.VK_END);
+                robot.keyRelease(KeyEvent.VK_END);
+            } else {
+                robot.keyPress(KeyEvent.VK_CONTROL);
+                robot.keyPress(KeyEvent.VK_END);
+                robot.keyRelease(KeyEvent.VK_END);
+                robot.keyRelease(KeyEvent.VK_CONTROL);
+            }
+            robot.waitForIdle();
+            robot.delay(1000);
 
-        robot.waitForIdle();
+            pos0 = getScrollerViewPosition();
+            robot.keyPress(KeyEvent.VK_PAGE_DOWN);
+            robot.keyRelease(KeyEvent.VK_PAGE_DOWN);
+            robot.waitForIdle();
+
+            int pos = getScrollerViewPosition();
 
-        pos0 = getScrollerViewPosition();
-        Util.hitKeys(robot, KeyEvent.VK_PAGE_DOWN);
-        robot.waitForIdle();
-
-        int pos = getScrollerViewPosition();
-
-        if (pos0 != pos) {
-            throw new RuntimeException("Failed 6244705: PgDn at the bottom causes scrolling");
+            if (pos0 != pos) {
+                System.out.println("pos0 " + pos0 + " pos " + pos);
+                throw new RuntimeException("Failed 6244705: PgDn at the bottom causes scrolling");
+            }
+        } finally {
+            SwingUtilities.invokeAndWait(() -> frame.dispose());
         }
     }