diff options
-rw-r--r-- | test/jb/javax/swing/JDialog/JDialog392.java | 215 |
1 files changed, 215 insertions, 0 deletions
diff --git a/test/jb/javax/swing/JDialog/JDialog392.java b/test/jb/javax/swing/JDialog/JDialog392.java new file mode 100644 index 0000000000..70083cb9e0 --- /dev/null +++ b/test/jb/javax/swing/JDialog/JDialog392.java @@ -0,0 +1,215 @@ +/* + * Copyright 2000-2017 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import javax.imageio.ImageIO; +import javax.swing.JDialog; +import javax.swing.JFrame; +import javax.swing.SwingUtilities; +import javax.swing.WindowConstants; +import java.awt.AWTException; +import java.awt.Dialog; +import java.awt.Dimension; +import java.awt.Point; +import java.awt.Robot; +import java.awt.Rectangle; +import java.awt.event.WindowEvent; +import java.awt.event.WindowListener; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.util.Arrays; + +/* @test + * @summary regression test on JRE-392 Tip of the day is not hidden while another modal window is shown + * @run main/othervm JDialog392 + */ + + +// The test displays two modal dialogs one by one +// and checks that the latest modal dialog would be on top of all windows +public class JDialog392 { + + private static JFrame frame = new JFrame("JDialog392"); + + private static boolean verbose = false; + private static boolean passed = true; + + static DialogThread modalDialogThread1; + + static DialogThread modalDialogThread2; + + static class DialogThread implements Runnable { + + JDialog dialog; + + private String dialogTitle; + private Point location; + private int width; + private int height; + private DialogListener eventListener; + + + DialogThread(String dialogTitle, Point location, int width, int height, DialogListener eventListener) { + this.dialogTitle = dialogTitle; + this.location = location; + this.width = width; + this.height = height; + this.eventListener = eventListener; + } + + @Override + public void run() { + dialog = new JDialog(frame, true); + dialog.setModalityType(Dialog.ModalityType.APPLICATION_MODAL); + dialog.setTitle(dialogTitle); + + dialog.setLocation(location); + dialog.setSize(width, height); + + if (eventListener != null) + dialog.addWindowListener(eventListener); + + dialog.setVisible(true); + } + + void removeWindowListener() { + dialog.removeWindowListener(eventListener); + } + } + + static abstract class DialogListener implements WindowListener { + + @Override + public void windowClosing(WindowEvent e) { + + } + + @Override + public void windowClosed(WindowEvent e) { + + } + + @Override + public void windowIconified(WindowEvent e) { + + } + + @Override + public void windowDeiconified(WindowEvent e) { + + } + + @Override + public void windowActivated(WindowEvent e) { + + } + + @Override + public void windowDeactivated(WindowEvent e) { + + } + } + + static class FirstDialogListener extends DialogListener { + @Override + public void windowOpened(WindowEvent windowEvent) { + modalDialogThread1.removeWindowListener(); + modalDialogThread2 = new DialogThread( + "Modal input 2", + new Point(5, 50), + 300, 200, + new SecondDialogListener()); + SwingUtilities.invokeLater(modalDialogThread2); + } + } + + static class SecondDialogListener extends DialogListener { + @Override + public void windowOpened(WindowEvent windowEvent) { + try { + Robot robot = new Robot(); + Dimension shotSize = modalDialogThread2.dialog.getContentPane().getSize(); + Rectangle captureRect = new Rectangle(modalDialogThread2.dialog.getContentPane().getLocationOnScreen(), shotSize); + + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + BufferedImage screenImage = robot.createScreenCapture(captureRect); + + int rgb; + int expectedRGB = screenImage.getRGB((int) (shotSize.getWidth()/2), (int) (shotSize.getHeight()/2)) & 0x00FFFFFF; + + for (int col = 1; col < shotSize.getWidth(); col++) { + for (int row = 1; row < shotSize.getHeight(); row++) { + try { + // remove transparance + rgb = screenImage.getRGB(col, row) & 0x00FFFFFF; + + if (verbose) + System.out.print((rgb == expectedRGB) ? " ." : " " + Integer.toHexString(rgb)); + + passed = passed & (expectedRGB == rgb); + + } catch (ArrayIndexOutOfBoundsException e) { + throw new RuntimeException(e); + } + + } + if (verbose) + System.out.println(); + } + if (verbose) + ImageIO.write(screenImage, "bmp", new File("test392.bmp")); + + if (!passed) + throw new RuntimeException("The second dialog window was not on top"); + + } catch (AWTException | IOException e) { + throw new RuntimeException(e); + } + modalDialogThread2.dialog.dispose(); + modalDialogThread1.dialog.dispose(); + frame.dispose(); + } + } + + private void doTest() { + frame.setSize(350, 300); + frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); + frame.setVisible(true); + + modalDialogThread1 = new DialogThread( + "Modal input 1", + new Point(10, 75), + 250, 150, + new FirstDialogListener()); + + try { + SwingUtilities.invokeAndWait(modalDialogThread1); + } catch (InterruptedException | InvocationTargetException e) { + throw new RuntimeException(e); + } + } + + public static void main(String[] args) throws Exception { + JDialog392.verbose = Arrays.asList(args).contains("-verbose"); + new JDialog392().doTest(); + } +} |