7190581: Nimbus: PgDn at the bottom causes scrolling

Reviewed-by: ssadetsky
This commit is contained in:
Prasanta Sadhukhan 2017-07-28 10:26:22 +05:30
parent b9a122f2e9
commit c6ce199830
2 changed files with 115 additions and 74 deletions

View File

@ -1496,6 +1496,15 @@ public class DefaultEditorKit extends EditorKit {
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 {

View File

@ -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 @@ public class bug4697612 {
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();
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();
SwingUtilities.invokeAndWait(new Runnable() {
@Override
public void run() {
text.requestFocus();
}
});
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();
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++) {
for (int j = 0; j < caretHeight; j++) {
SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
frame.setSize(FRAME_WIDTH, frameHeight);
text.setFont(text.getFont().deriveFont(fontHeight));
}
});
frameHeight = FRAME_HEIGHT;
robot.waitForIdle();
for (int j = 0; j < caretHeight; j++) {
Util.hitKeys(robot, KeyEvent.VK_PAGE_DOWN);
Util.hitKeys(robot, KeyEvent.VK_PAGE_UP);
robot.waitForIdle();
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");
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")) {
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);
// 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);
}
pos0 = getScrollerViewPosition();
robot.keyPress(KeyEvent.VK_PAGE_DOWN);
robot.keyRelease(KeyEvent.VK_PAGE_DOWN);
robot.waitForIdle();
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());
}
}