bug4697612.java revision 11111:4ef86895869c
1229159Sadrian/* 2229159Sadrian * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. 3229159Sadrian * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4229159Sadrian * 5229159Sadrian * This code is free software; you can redistribute it and/or modify it 6229159Sadrian * under the terms of the GNU General Public License version 2 only, as 7229159Sadrian * published by the Free Software Foundation. 8229159Sadrian * 9229159Sadrian * This code is distributed in the hope that it will be useful, but WITHOUT 10229159Sadrian * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11229159Sadrian * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12229159Sadrian * version 2 for more details (a copy is included in the LICENSE file that 13229159Sadrian * accompanied this code). 14229159Sadrian * 15229159Sadrian * You should have received a copy of the GNU General Public License version 16229159Sadrian * 2 along with this work; if not, write to the Free Software Foundation, 17229159Sadrian * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18229159Sadrian * 19229159Sadrian * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20229159Sadrian * or visit www.oracle.com if you need additional information or have any 21229159Sadrian * questions. 22229159Sadrian */ 23229159Sadrian 24229159Sadrian/* 25229159Sadrian * @test 26229159Sadrian * @bug 4697612 6244705 27229159Sadrian * @author Peter Zhelezniakov 28229159Sadrian * @library ../../regtesthelpers 29229159Sadrian * @build Util 30229159Sadrian * @run main bug4697612 31229159Sadrian */ 32229159Sadrianimport java.io.*; 33229159Sadrianimport java.awt.*; 34229159Sadrianimport java.awt.event.*; 35229159Sadrianimport javax.swing.*; 36229159Sadrian 37229159Sadrianimport javax.swing.text.BadLocationException; 38229159Sadrian 39229159Sadrianpublic class bug4697612 { 40229159Sadrian 41229159Sadrian static final int FRAME_WIDTH = 300; 42229159Sadrian static final int FRAME_HEIGHT = 300; 43229159Sadrian static final int FONT_HEIGHT = 16; 44229159Sadrian private static volatile int frameHeight; 45229159Sadrian private static volatile int fontHeight; 46229159Sadrian private static JFrame frame; 47229159Sadrian private static JTextArea text; 48229159Sadrian private static JScrollPane scroller; 49229159Sadrian 50229159Sadrian public static void main(String[] args) throws Throwable { 51229159Sadrian Robot robot = new Robot(); 52229159Sadrian robot.setAutoDelay(100); 53229159Sadrian 54229159Sadrian SwingUtilities.invokeAndWait(new Runnable() { 55229159Sadrian 56229159Sadrian @Override 57229159Sadrian public void run() { 58229159Sadrian createAndShowGUI(); 59229159Sadrian } 60229159Sadrian }); 61229159Sadrian 62229159Sadrian robot.waitForIdle(); 63229159Sadrian 64229159Sadrian SwingUtilities.invokeAndWait(new Runnable() { 65229159Sadrian 66229159Sadrian @Override 67229159Sadrian public void run() { 68229159Sadrian text.requestFocus(); 69229159Sadrian } 70229159Sadrian }); 71229159Sadrian 72229159Sadrian robot.waitForIdle(); 73229159Sadrian 74229159Sadrian // 4697612: pressing PgDn + PgUp should not alter caret position 75229159Sadrian Util.hitKeys(robot, KeyEvent.VK_HOME); 76229159Sadrian Util.hitKeys(robot, KeyEvent.VK_PAGE_DOWN); 77229159Sadrian 78229159Sadrian 79229159Sadrian int pos0 = getTextCaretPosition(); 80229159Sadrian int caretHeight = getTextCaretHeight(); 81229159Sadrian fontHeight = FONT_HEIGHT; 82229159Sadrian 83229159Sadrian // iterate two times, for different (even and odd) font height 84229159Sadrian for (int i = 0; i < 2; i++) { 85229159Sadrian 86229159Sadrian SwingUtilities.invokeAndWait(new Runnable() { 87229159Sadrian 88229159Sadrian public void run() { 89229159Sadrian text.setFont(text.getFont().deriveFont(fontHeight)); 90229159Sadrian } 91229159Sadrian }); 92229159Sadrian 93229159Sadrian frameHeight = FRAME_HEIGHT; 94229159Sadrian 95229159Sadrian for (int j = 0; j < caretHeight; j++) { 96229159Sadrian SwingUtilities.invokeAndWait(new Runnable() { 97229159Sadrian 98229159Sadrian public void run() { 99229159Sadrian frame.setSize(FRAME_WIDTH, frameHeight); 100229159Sadrian } 101229159Sadrian }); 102229159Sadrian 103229159Sadrian robot.waitForIdle(); 104229159Sadrian 105229159Sadrian Util.hitKeys(robot, KeyEvent.VK_PAGE_DOWN); 106229159Sadrian Util.hitKeys(robot, KeyEvent.VK_PAGE_UP); 107229159Sadrian robot.waitForIdle(); 108229159Sadrian 109229159Sadrian int pos = getTextCaretPosition(); 110 if (pos0 != pos) { 111 throw new RuntimeException("Failed 4697612: PgDn & PgUp keys scroll by different amounts"); 112 } 113 frameHeight++; 114 } 115 fontHeight++; 116 } 117 118 119 // 6244705: pressing PgDn at the very bottom should not scroll 120 LookAndFeel laf = UIManager.getLookAndFeel(); 121 if (laf.getID().equals("Aqua")) { 122 Util.hitKeys(robot, KeyEvent.VK_END); 123 } else { 124 Util.hitKeys(robot, KeyEvent.VK_CONTROL, KeyEvent.VK_END); 125 } 126 127 robot.waitForIdle(); 128 129 pos0 = getScrollerViewPosition(); 130 Util.hitKeys(robot, KeyEvent.VK_PAGE_DOWN); 131 robot.waitForIdle(); 132 133 int pos = getScrollerViewPosition(); 134 135 if (pos0 != pos) { 136 throw new RuntimeException("Failed 6244705: PgDn at the bottom causes scrolling"); 137 } 138 } 139 140 private static int getTextCaretPosition() throws Exception { 141 final int[] result = new int[1]; 142 SwingUtilities.invokeAndWait(new Runnable() { 143 144 @Override 145 public void run() { 146 result[0] = text.getCaretPosition(); 147 } 148 }); 149 150 return result[0]; 151 } 152 153 private static int getTextCaretHeight() throws Exception { 154 final int[] result = new int[1]; 155 SwingUtilities.invokeAndWait(new Runnable() { 156 157 @Override 158 public void run() { 159 try { 160 int pos0 = text.getCaretPosition(); 161 Rectangle dotBounds = text.modelToView(pos0); 162 result[0] = dotBounds.height; 163 } catch (BadLocationException ex) { 164 throw new RuntimeException(ex); 165 } 166 } 167 }); 168 169 return result[0]; 170 } 171 172 private static int getScrollerViewPosition() throws Exception { 173 final int[] result = new int[1]; 174 SwingUtilities.invokeAndWait(new Runnable() { 175 176 @Override 177 public void run() { 178 result[0] = scroller.getViewport().getViewPosition().y; 179 } 180 }); 181 182 return result[0]; 183 } 184 185 private static void createAndShowGUI() { 186 frame = new JFrame(); 187 frame.setSize(FRAME_WIDTH, FRAME_HEIGHT); 188 frame.setPreferredSize(new Dimension(FRAME_WIDTH, FRAME_HEIGHT)); 189 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 190 191 text = new JTextArea(); 192 try { 193 InputStream is = 194 bug4697612.class.getResourceAsStream("bug4697612.txt"); 195 text.read(new InputStreamReader(is), null); 196 } catch (IOException e) { 197 throw new Error(e); 198 } 199 200 scroller = new JScrollPane(text); 201 202 frame.getContentPane().add(scroller); 203 204 frame.pack(); 205 frame.setVisible(true); 206 } 207} 208