| /* |
| * Copyright (c) 2016, 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 |
| @key headful |
| @bug 7126823 |
| @summary Verify NormalBounds upon iconify/deiconify sequence |
| @run main NormalBoundsTest |
| */ |
| import java.awt.Point; |
| import java.awt.Rectangle; |
| import java.awt.Robot; |
| import java.awt.event.InputEvent; |
| import java.beans.PropertyVetoException; |
| import javax.swing.JDesktopPane; |
| import javax.swing.JFrame; |
| import javax.swing.JInternalFrame; |
| import javax.swing.SwingUtilities; |
| import javax.swing.UIManager; |
| import javax.swing.UnsupportedLookAndFeelException; |
| import javax.swing.WindowConstants; |
| |
| public class NormalBoundsTest { |
| |
| private static JFrame mainFrame; |
| private static JInternalFrame internalFrame; |
| private static Rectangle bounds; |
| |
| private static void createUI(String lookAndFeelString) { |
| internalFrame = new JInternalFrame("Internal", true, true, true, true); |
| internalFrame.setDefaultCloseOperation( |
| WindowConstants.DO_NOTHING_ON_CLOSE); |
| internalFrame.setSize(200, 200); |
| |
| JDesktopPane desktopPane = new JDesktopPane(); |
| desktopPane.setDragMode(JDesktopPane.OUTLINE_DRAG_MODE); |
| desktopPane.add(internalFrame); |
| |
| mainFrame = new JFrame(lookAndFeelString); |
| mainFrame.setSize(640, 480); |
| mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); |
| mainFrame.setContentPane(desktopPane); |
| |
| mainFrame.setVisible(true); |
| internalFrame.setVisible(true); |
| |
| } |
| |
| private static int signWOZero(int i) { |
| return (i > 0) ? 1 : -1; |
| } |
| |
| private static void mouseMove(Robot robot, Point startPt, Point endPt) { |
| int dx = endPt.x - startPt.x; |
| int dy = endPt.y - startPt.y; |
| |
| int ax = Math.abs(dx) * 2; |
| int ay = Math.abs(dy) * 2; |
| |
| int sx = signWOZero(dx); |
| int sy = signWOZero(dy); |
| |
| int x = startPt.x; |
| int y = startPt.y; |
| |
| int d = 0; |
| |
| if (ax > ay) { |
| d = ay - ax / 2; |
| while (true) { |
| robot.mouseMove(x, y); |
| robot.delay(50); |
| |
| if (x == endPt.x) { |
| return; |
| } |
| if (d >= 0) { |
| y = y + sy; |
| d = d - ax; |
| } |
| x = x + sx; |
| d = d + ay; |
| } |
| } else { |
| d = ax - ay / 2; |
| while (true) { |
| robot.mouseMove(x, y); |
| robot.delay(50); |
| |
| if (y == endPt.y) { |
| return; |
| } |
| if (d >= 0) { |
| x = x + sx; |
| d = d - ay; |
| } |
| y = y + sy; |
| d = d + ax; |
| } |
| } |
| } |
| |
| private static void drag(Robot r, Point startPt, Point endPt, int button) { |
| if (!(button == InputEvent.BUTTON1_MASK |
| || button == InputEvent.BUTTON2_MASK |
| || button == InputEvent.BUTTON3_MASK)) { |
| throw new IllegalArgumentException("invalid mouse button"); |
| } |
| |
| r.mouseMove(startPt.x, startPt.y); |
| r.mousePress(button); |
| try { |
| mouseMove(r, startPt, endPt); |
| } finally { |
| r.mouseRelease(button); |
| } |
| } |
| |
| private static boolean tryLookAndFeel(String lookAndFeelString) { |
| try { |
| UIManager.setLookAndFeel(lookAndFeelString); |
| return true; |
| } catch (UnsupportedLookAndFeelException | ClassNotFoundException | |
| InstantiationException | IllegalAccessException e) { |
| return false; |
| } |
| } |
| |
| public static void executeTest(Robot robot) throws Exception { |
| |
| // Iconize JInternalFrame |
| SwingUtilities.invokeAndWait(new Runnable() { |
| @Override |
| public void run() { |
| try { |
| internalFrame.setIcon(true); |
| } catch (PropertyVetoException ex) { |
| mainFrame.dispose(); |
| throw new RuntimeException("Iconize InternalFrame Failed"); |
| } |
| } |
| }); |
| robot.waitForIdle(); |
| |
| // Deiconize JInternalFrame |
| SwingUtilities.invokeAndWait(new Runnable() { |
| @Override |
| public void run() { |
| try { |
| internalFrame.setIcon(false); |
| } catch (PropertyVetoException ex) { |
| mainFrame.dispose(); |
| throw new RuntimeException("Deiconize InternalFrame" |
| + " Failed"); |
| } |
| } |
| }); |
| robot.waitForIdle(); |
| |
| SwingUtilities.invokeAndWait(new Runnable() { |
| @Override |
| public void run() { |
| Point loc = internalFrame.getLocationOnScreen(); |
| // Drag Frame |
| drag(robot, |
| new Point((int) loc.x + 80, (int) loc.y + 12), |
| new Point((int) loc.x + 100, (int) loc.y + 40), |
| InputEvent.BUTTON1_MASK); |
| } |
| }); |
| robot.waitForIdle(); |
| |
| SwingUtilities.invokeAndWait(new Runnable() { |
| @Override |
| public void run() { |
| bounds = internalFrame.getBounds(); |
| if (!internalFrame.getNormalBounds().equals(bounds)) { |
| mainFrame.dispose(); |
| throw new RuntimeException("Invalid NormalBounds"); |
| } |
| } |
| }); |
| robot.waitForIdle(); |
| |
| // Regression Test Bug ID: 4424247 |
| // Maximize JInternalFrame |
| SwingUtilities.invokeAndWait(new Runnable() { |
| @Override |
| public void run() { |
| try { |
| internalFrame.setMaximum(true); |
| } catch (PropertyVetoException ex) { |
| mainFrame.dispose(); |
| throw new RuntimeException("Maximize InternalFrame Failed"); |
| } |
| } |
| }); |
| robot.waitForIdle(); |
| |
| // Iconize JInternalFrame |
| SwingUtilities.invokeAndWait(new Runnable() { |
| @Override |
| public void run() { |
| try { |
| internalFrame.setIcon(true); |
| } catch (PropertyVetoException ex) { |
| mainFrame.dispose(); |
| throw new RuntimeException("Iconize InternalFrame Failed"); |
| } |
| } |
| }); |
| robot.waitForIdle(); |
| |
| // DeIconize JInternalFrame |
| SwingUtilities.invokeAndWait(new Runnable() { |
| @Override |
| public void run() { |
| try { |
| internalFrame.setIcon(false); |
| } catch (PropertyVetoException ex) { |
| mainFrame.dispose(); |
| throw new RuntimeException("DeIcoize InternalFrame " |
| + " Failed"); |
| } |
| } |
| }); |
| robot.waitForIdle(); |
| |
| // Restore/Undo Maximize JInternalFrame |
| SwingUtilities.invokeAndWait(new Runnable() { |
| @Override |
| public void run() { |
| try { |
| internalFrame.setMaximum(false); |
| } catch (PropertyVetoException ex) { |
| mainFrame.dispose(); |
| throw new RuntimeException("Restore InternalFrame " |
| + " Failed"); |
| } |
| } |
| }); |
| robot.waitForIdle(); |
| |
| SwingUtilities.invokeAndWait(new Runnable() { |
| @Override |
| public void run() { |
| if (!internalFrame.getBounds().equals(bounds)) { |
| mainFrame.dispose(); |
| throw new RuntimeException("Regression Test Failed"); |
| } |
| } |
| }); |
| robot.waitForIdle(); |
| |
| mainFrame.dispose(); |
| } |
| |
| public static void main(String[] args) throws Exception { |
| Robot robot = new Robot(); |
| UIManager.LookAndFeelInfo[] lookAndFeelArray |
| = UIManager.getInstalledLookAndFeels(); |
| for (UIManager.LookAndFeelInfo lookAndFeelItem : lookAndFeelArray) { |
| String lookAndFeelString = lookAndFeelItem.getClassName(); |
| if (tryLookAndFeel(lookAndFeelString)) { |
| // create UI |
| SwingUtilities.invokeAndWait(new Runnable() { |
| @Override |
| public void run() { |
| createUI(lookAndFeelString); |
| } |
| }); |
| |
| robot.waitForIdle(); |
| executeTest(robot); |
| } else { |
| throw new RuntimeException("Setting Look and Feel Failed"); |
| } |
| } |
| |
| } |
| } |