| /* | |
| * Copyright (c) 2005, 2023, 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. | |
| */ | |
| import java.awt.AlphaComposite; | |
| import java.awt.Color; | |
| import java.awt.Dialog; | |
| import java.awt.Font; | |
| import java.awt.Frame; | |
| import java.awt.GradientPaint; | |
| import java.awt.Graphics2D; | |
| import java.awt.GridLayout; | |
| import java.awt.Image; | |
| import java.awt.Rectangle; | |
| import java.awt.RenderingHints; | |
| import java.awt.Window; | |
| import java.awt.image.BaseMultiResolutionImage; | |
| import java.awt.image.BufferedImage; | |
| import java.lang.reflect.InvocationTargetException; | |
| import java.util.Arrays; | |
| import java.util.List; | |
| import javax.swing.ImageIcon; | |
| import javax.swing.JLabel; | |
| import javax.swing.SwingUtilities; | |
| import static java.awt.image.BufferedImage.TYPE_INT_ARGB; | |
| import static jdk.test.lib.Platform.isWindows; | |
| /* | |
| * @test | |
| * @bug 6233560 6280303 6292933 | |
| * @summary Tests if toplevel's icons are shown correctly | |
| * @key headful | |
| * @requires (os.family == "windows") | |
| * @library /java/awt/regtesthelpers /test/lib | |
| * @build PassFailJFrame jdk.test.lib.Platform | |
| * @run main/manual IconShowingTest | |
| */ | |
| public class IconShowingTest { | |
| private static final int EXTRA_OFFSET = 50; | |
| private static final String INSTRUCTIONS = | |
| "Look at the icons shown on frames and dialogs, icons of minimized frames\n" | |
| + (isWindows() ? "are displayed in ALT+TAB window\n" : "") + "\n"+ | |
| """ | |
| Alpha-channel (transparency) should be supported | |
| by Windows and may not be supported by other platforms. | |
| Notes: | |
| * Icons might appear in grayscale. | |
| * Default icon might be either Duke or Java Cup. | |
| Press PASS if the icons match label description in windows | |
| and are shown correctly, FAIL otherwise. | |
| """; | |
| public static void main(String[] args) throws Exception { | |
| PassFailJFrame passFailJFrame = new PassFailJFrame("Icon Showing " + | |
| "Test Instructions", INSTRUCTIONS, 5, 18, 48); | |
| SwingUtilities.invokeAndWait(() -> { | |
| try { | |
| createAndShowGUI(); | |
| } catch (Exception e) { | |
| throw new RuntimeException("Error while running the test", e); | |
| } | |
| }); | |
| passFailJFrame.awaitAndCheck(); | |
| } | |
| public static void createAndShowGUI() | |
| throws InterruptedException, InvocationTargetException { | |
| Image i_16 = createIcon(16, 8, "16"); | |
| Image i_32 = createIcon(32, 14, "32"); | |
| Image i_48 = createIcon(48, 24, "48"); | |
| Image i_64 = createIcon(64, 30, "64"); | |
| ImageIcon ji_16 = new ImageIcon(IconShowingTest.class.getResource( | |
| "java-icon16.png")); | |
| Image[] images = new Image[] {i_16, i_32, i_48, i_64}; | |
| List<Image> imageList = Arrays.asList(images); | |
| ImageIcon icon = new ImageIcon(new MRImage(images)); | |
| Frame f1 = new Frame("Frame 1"); | |
| f1.setIconImages(imageList); | |
| f1.setLayout(new GridLayout(0, 1)); | |
| f1.add(new JLabel("Icon 16x16", new ImageIcon(i_16), JLabel.CENTER)); | |
| f1.add(new JLabel("Icon 32x32", new ImageIcon(i_32), JLabel.CENTER)); | |
| f1.add(new JLabel("Icon 48x48", new ImageIcon(i_48), JLabel.CENTER)); | |
| f1.add(new JLabel("Icon 64x64", new ImageIcon(i_64), JLabel.CENTER)); | |
| PassFailJFrame.positionTestWindow(null, | |
| PassFailJFrame.Position.TOP_LEFT_CORNER); | |
| Rectangle bounds = PassFailJFrame.getInstructionFrameBounds(); | |
| int windowPosX = bounds.x + bounds.width + 5; | |
| f1.setBounds(windowPosX, EXTRA_OFFSET, 200, 300); | |
| f1.setVisible(true); | |
| f1.toFront(); | |
| PassFailJFrame.addTestWindow(f1); | |
| int windowPosY = f1.getY() + f1.getHeight(); | |
| Dialog d11 = new Dialog(f1, "Dialog 1.1"); | |
| d11.setResizable(false); | |
| addIconAndLabelToWindow(d11, windowPosX, windowPosY - EXTRA_OFFSET, | |
| (isWindows() ? "No icon, non-resizable dialog" | |
| : "Inherited icon, non-resizable dialog"), | |
| (isWindows() ? null : icon)); | |
| Dialog d12 = new Dialog(d11, "Dialog 1.2"); | |
| addIconAndLabelToWindow(d12, windowPosX, windowPosY + EXTRA_OFFSET, | |
| "Inherited icon, resizable dialog", icon); | |
| Frame f2 = new Frame("Frame 2"); | |
| addIconAndLabelToWindow(f2, windowPosX + 200, 0, | |
| "Default Icon", ji_16); | |
| Dialog d21 = new Dialog(f2, "Dialog 2.1"); | |
| d21.setResizable(false); | |
| addIconAndLabelToWindow(d21, windowPosX + 200, 100, | |
| (isWindows() ? "No icon, non-resizable dialog" | |
| : "Inherited default Icon, non-resizable dialog"), | |
| (isWindows() ? null : ji_16)); | |
| Dialog d22 = new Dialog(f2, "Dialog 2.2"); | |
| addIconAndLabelToWindow(d22, windowPosX + 200, 200, | |
| "Inherited default Icon, resizable dialog", ji_16); | |
| Dialog d23 = new Dialog(f2, "Dialog 2.3"); | |
| d23.setIconImages(imageList); | |
| d23.setResizable(false); | |
| addIconAndLabelToWindow(d23, windowPosX + 200, 300, | |
| "Modified Icon, non-resizable dialog", icon); | |
| Dialog d24 = new Dialog(f2, "Dialog 2.4"); | |
| d24.setIconImages(imageList); | |
| addIconAndLabelToWindow(d24, windowPosX + 200, 400, | |
| "Modified Icon, resizable dialog", icon); | |
| Dialog d31 = new Dialog((Frame)null, "Dialog 3.1"); | |
| addIconAndLabelToWindow(d31, windowPosX + 400, 100, | |
| "Default icon, resizable dialog", ji_16); | |
| Dialog d32 = new Dialog(d31, "Dialog 3.2"); | |
| d32.setResizable(false); | |
| addIconAndLabelToWindow(d32, windowPosX + 400, 200, | |
| (isWindows() ? "No icon, non-resizable dialog" | |
| : "Default Icon, non-resizable dialog"), | |
| (isWindows() ? null : ji_16)); | |
| Dialog d33 = new Dialog(d31, "Dialog 3.3"); | |
| d33.setIconImages(imageList); | |
| d33.setResizable(false); | |
| addIconAndLabelToWindow(d33, windowPosX + 400, 300, | |
| "Modified icon, non-resizable dialog", icon); | |
| Dialog d34 = new Dialog(d33, "Dialog 3.4"); | |
| d34.setResizable(false); | |
| addIconAndLabelToWindow(d34, windowPosX + 400, 400, | |
| (isWindows() ? "No icon, non-resizable dialog" | |
| : "Inherited modified icon, non-resizable dialog"), | |
| (isWindows() ? null : icon)); | |
| Dialog d41 = new Dialog((Frame) null, "Dialog 4.1"); | |
| d41.setResizable(false); | |
| addIconAndLabelToWindow(d41, windowPosX + 600, 100, | |
| "Default icon, non-resizable dialog", ji_16); | |
| Dialog d42 = new Dialog(d41, "Dialog 4.2"); | |
| addIconAndLabelToWindow(d42, windowPosX + 600, 200, | |
| "Inherited default icon, resizable dialog", ji_16); | |
| Dialog d43 = new Dialog(d41, "Dialog 4.3"); | |
| d43.setIconImages(imageList); | |
| addIconAndLabelToWindow(d43, windowPosX + 600, 300, | |
| "Modified icon, resizable dialog", icon); | |
| Dialog d44 = new Dialog(d43, "Dialog 4.4"); | |
| addIconAndLabelToWindow(d44, windowPosX + 600, 400, | |
| "Inherited modified icon, resizable dialog", icon); | |
| } | |
| private static void addIconAndLabelToWindow(Window win, int x, int y, | |
| String title, ImageIcon icon) { | |
| win.setBounds(x, (y + EXTRA_OFFSET), 200, 100); | |
| win.add(new JLabel(title, icon, JLabel.CENTER)); | |
| win.setVisible(true); | |
| win.toFront(); | |
| PassFailJFrame.addTestWindow(win); | |
| } | |
| public static Image createIcon(int size, int fontSize, String value) { | |
| BufferedImage bImg = new BufferedImage(size, size, TYPE_INT_ARGB); | |
| Graphics2D g2d = bImg.createGraphics(); | |
| int half = size / 2; | |
| for (int i = 0; i < half - 1; i += 2) { | |
| g2d.setComposite(AlphaComposite.Src); | |
| g2d.setColor(Color.RED); | |
| g2d.fillRect(0, i, half, 1); | |
| g2d.setComposite(AlphaComposite.Clear); | |
| g2d.fillRect(0, i + 1, half, 1); | |
| } | |
| g2d.setComposite(AlphaComposite.Clear); | |
| g2d.fillRect(half, 0, half, half); | |
| g2d.setComposite(AlphaComposite.Src); | |
| g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, | |
| RenderingHints.VALUE_TEXT_ANTIALIAS_ON); | |
| g2d.setFont(new Font("Dialog", Font.PLAIN, fontSize)); | |
| g2d.setColor(Color.BLUE); | |
| g2d.drawString(value, half - 1, half - 2); | |
| int height = (half + 1) / 3; | |
| // Green | |
| GradientPaint greenGradient = new GradientPaint(0, half - 1, Color.GREEN, | |
| size, half - 1, new Color(0, 255, 0, 0)); | |
| g2d.setPaint(greenGradient); | |
| g2d.fillRect(0, half - 1, size, height); | |
| // Blue | |
| GradientPaint blueGradient = new GradientPaint(0, (half - 1) + height, Color.BLUE, | |
| size, (half - 1) + height, new Color(0, 0, 255, 0)); | |
| g2d.setPaint(blueGradient); | |
| g2d.fillRect(0, (half - 1) + height, size, height); | |
| // Red | |
| GradientPaint redGradient = new GradientPaint(0, (half - 1) + height * 2, Color.RED, | |
| size, (half - 1) + height * 2, new Color(255, 0, 0, 0)); | |
| g2d.setPaint(redGradient); | |
| g2d.fillRect(0, (half - 1) + height * 2, size, height); | |
| g2d.dispose(); | |
| return bImg; | |
| } | |
| private static class MRImage extends BaseMultiResolutionImage { | |
| public MRImage(Image... resolutionVariants) { | |
| super(resolutionVariants); | |
| } | |
| @Override | |
| public Image getResolutionVariant(double expectedSize, double unused) { | |
| final int size = (int) Math.round(expectedSize / 16.0) * 16; | |
| List<Image> imageList = getResolutionVariants(); | |
| for (int i = 0; i < imageList.size(); i++) { | |
| if (size == imageList.get(i).getWidth(null)) { | |
| return imageList.get(i); | |
| } else if (imageList.get(i).getWidth(null) > size) { | |
| return imageList.get(i > 0 ? i - 1 : i); | |
| } | |
| } | |
| return imageList.get(0); //default/base image | |
| } | |
| } | |
| } |