1 /* 2 * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 */ 23 24 /* 25 @test 26 @key headful 27 @bug 8150176 8150844 28 @author a.stepanov 29 @summary Check if correct resolution variant is used 30 for JOptionPane dialog / internal frame icons. 31 @library ../../../../lib/client/ 32 @build ExtendedRobot 33 @run main/othervm/timeout=300 -Dsun.java2d.uiScale=1 MultiResolutionJOptionPaneIconTest 34 @run main/othervm/timeout=300 -Dsun.java2d.uiScale=2 MultiResolutionJOptionPaneIconTest 35 */ 36 37 import java.awt.*; 38 import java.awt.event.*; 39 import java.awt.image.*; 40 import javax.swing.*; 41 42 public class MultiResolutionJOptionPaneIconTest implements ActionListener { 43 44 private final static Color C1X = Color.ORANGE, C2X = Color.CYAN; 45 46 private final boolean isInternal; 47 48 private volatile JFrame test; 49 private volatile JDialog dialog; 50 private volatile JInternalFrame frame; 51 private final JDesktopPane parentPane = new JDesktopPane(); 52 private final JButton run = new JButton("run"); 53 54 private final ExtendedRobot robot = new ExtendedRobot(); 55 56 private static BufferedImage getSquare(int sz, Color c) { 57 58 BufferedImage img = new BufferedImage(sz, sz, BufferedImage.TYPE_INT_RGB); 59 Graphics g = img.getGraphics(); 60 g.setColor(c); 61 g.fillRect(0, 0, sz, sz); 62 return img; 63 } 64 65 private static Icon getIcon() { 66 67 BaseMultiResolutionImage mri = new BaseMultiResolutionImage( 68 new BufferedImage[]{getSquare(16, C1X), getSquare(32, C2X)}); 69 return new ImageIcon(mri); 70 } 71 72 public MultiResolutionJOptionPaneIconTest(boolean internal, 73 UIManager.LookAndFeelInfo lf) throws Exception { 74 75 UIManager.setLookAndFeel(lf.getClassName()); 76 77 isInternal = internal; 78 robot.setAutoDelay(50); 79 SwingUtilities.invokeAndWait(this::UI); 80 } 81 82 private void UI() { 83 84 test = new JFrame(); 85 test.setLayout(new BorderLayout()); 86 test.add(parentPane, BorderLayout.CENTER); 87 run.addActionListener(this); 88 test.add(run, BorderLayout.SOUTH); 89 test.setUndecorated(true); 90 test.setSize(400, 300); 91 test.setLocation(50, 50); 92 test.setVisible(true); 93 } 94 95 private void disposeAll() { 96 97 if (dialog != null) { dialog.dispose(); } 98 if (frame != null) { frame.dispose(); } 99 if (test != null) { test.dispose(); } 100 } 101 102 public void doTest() throws Exception { 103 104 robot.waitForIdle(1000); 105 clickButton(robot); 106 robot.waitForIdle(2000); 107 108 Component c = isInternal ? 109 frame.getContentPane() : dialog.getContentPane(); 110 111 System.out.println("\ncheck " + (isInternal ? "internal frame" : 112 "dialog") + " icon:"); 113 114 Point pt = c.getLocationOnScreen(); 115 checkColors(pt.x, c.getWidth(), pt.y, c.getHeight()); 116 System.out.println("ok"); 117 robot.waitForIdle(); 118 SwingUtilities.invokeAndWait(this::disposeAll); 119 robot.waitForIdle(); 120 } 121 122 private void checkColors(int x0, int w, int y0, int h) { 123 124 boolean is2x = "2".equals(System.getProperty("sun.java2d.uiScale")); 125 Color 126 expected = is2x ? C2X : C1X, 127 unexpected = is2x ? C1X : C2X; 128 129 for (int y = y0; y < y0 + h; y += 5) { 130 for (int x = x0; x < x0 + w; x += 5) { 131 132 Color c = robot.getPixelColor(x, y); 133 if (c.equals(unexpected)) { 134 throw new RuntimeException( 135 "invalid color was found, test failed"); 136 } else if (c.equals(expected)) { return; } 137 } 138 } 139 140 // no icon found at all 141 throw new RuntimeException("the icon wasn't found"); 142 } 143 144 private void showDialogOrFrame() { 145 146 JOptionPane pane = new JOptionPane("", 147 JOptionPane.DEFAULT_OPTION, 148 JOptionPane.INFORMATION_MESSAGE, 149 getIcon()); 150 pane.setOptions(new Object[]{}); // no buttons 151 152 if (isInternal) { 153 frame = pane.createInternalFrame(parentPane, ""); 154 frame.setLocation(0, 0); 155 frame.setVisible(true); 156 } else { 157 dialog = pane.createDialog(parentPane, ""); 158 dialog.setVisible(true); 159 } 160 } 161 162 public void clickButton(ExtendedRobot robot) { 163 164 Point pt = run.getLocationOnScreen(); 165 robot.mouseMove(pt.x + run.getWidth() / 2, pt.y + run.getHeight() / 2); 166 robot.waitForIdle(); 167 robot.click(); 168 } 169 170 @Override 171 public void actionPerformed(ActionEvent event) { showDialogOrFrame(); } 172 173 174 public static void main(String[] args) throws Exception { 175 176 for (UIManager.LookAndFeelInfo LF: UIManager.getInstalledLookAndFeels()) { 177 System.out.println("\nL&F: " + LF.getName()); 178 (new MultiResolutionJOptionPaneIconTest(false, LF)).doTest(); 179 (new MultiResolutionJOptionPaneIconTest(true , LF)).doTest(); 180 } 181 } 182 }