blob: dcd9067284edf09dd82977668863b8a2de13f224 [file] [log] [blame]
/*
* 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");
}
}
}
}