VASSAL.tools.ApplicationIcons.java Source code

Java tutorial

Introduction

Here is the source code for VASSAL.tools.ApplicationIcons.java

Source

/*
 * $Id$
 *
 * Copyright (c) 2009 by Joel Uckelman
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Library General Public
 * License (LGPL) as published by the Free Software Foundation.
 *
 * This library 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
 * Library General Public License for more details.
 *
 * You should have received a copy of the GNU Library General Public
 * License along with this library; if not, copies are available
 * at http://www.opensource.org.
 */

package VASSAL.tools;

import java.awt.Graphics2D;
import java.awt.Window;
import java.awt.image.BufferedImage;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

import javax.swing.JDialog;
import javax.swing.JFrame;

import org.apache.commons.lang.SystemUtils;

import VASSAL.tools.image.ImageIOException;
import VASSAL.tools.image.ImageUtils;

// FIXME: wizard doesn't get the right icons
// FIXME: check that parentless dialogs get the right icons

public class ApplicationIcons {

    private ApplicationIcons() {
    }

    //
    // Set up app icons for non-Mac systems
    //
    // The only decent way to set app icons in a variety of sizes is to
    // use Window.setIconImages(), which unforunately is a method new in
    // Java 1.6. We check here whether the method exists and use it if
    // we can. Otherwise, we use the crappy Window.setIconImage() and set
    // a single 16x16 icon. It should not generally be necessary to use
    // setIconImage(), as almost all non-Mac users should be using a Java
    // 6 JRE at this point.
    //
    // FIXME: Use setIconImages() directly on move to Java 1.6 or better
    //

    private static final Method setIconImages;
    private static final List<BufferedImage> icons;

    static {
        if (SystemUtils.IS_OS_MAC_OSX) {
            setIconImages = null;
            icons = null;
        } else {
            // get Window.setIconImages() by reflection
            Method m = null;
            try {
                m = Window.class.getMethod("setIconImages", List.class);
            } catch (NoSuchMethodException e) {
                // This means we are using Java 1.5.
            }

            setIconImages = m;

            // load the icons
            List<BufferedImage> l = null;
            try {
                if (setIconImages != null) {
                    if (SystemUtils.IS_OS_WINDOWS) {
                        // Windows uses 24x24 instead of 22x22
                        final BufferedImage src = ImageUtils.getImageResource("/icons/22x22/VASSAL.png");
                        final BufferedImage dst = ImageUtils.createCompatibleTranslucentImage(24, 24);
                        final Graphics2D g = dst.createGraphics();
                        g.drawImage(src, 1, 1, null);
                        g.dispose();

                        l = Arrays.asList(ImageUtils.getImageResource("/icons/16x16/VASSAL.png"), dst, // 24x24
                                ImageUtils.getImageResource("/icons/32x32/VASSAL.png"),
                                ImageUtils.getImageResource("/icons/48x48/VASSAL.png"),
                                ImageUtils.getImageResource("/images/VASSAL-256x256.png"));
                    } else {
                        // load the standard Tango sizes
                        l = Arrays.asList(ImageUtils.getImageResource("/icons/16x16/VASSAL.png"),
                                ImageUtils.getImageResource("/icons/22x22/VASSAL.png"),
                                ImageUtils.getImageResource("/icons/32x32/VASSAL.png"),
                                ImageUtils.getImageResource("/icons/48x48/VASSAL.png"));
                    }
                } else {
                    // we are using Java 1.5, so we can load but a single humble icon
                    l = Collections.singletonList(ImageUtils.getImageResource("/icons/16x16/VASSAL.png"));
                }
            } catch (ImageIOException e) {
                ReadErrorDialog.error(e, e.getFile());
            }
            icons = l;
        }
    }

    public static void setFor(JFrame w) {
        if (icons == null)
            return;

        if (setIconImages != null) {
            setIconImages(w);
        } else {
            // Load a single image as a fallback and watch in horror as it
            // gets scaled to ridiculous sizes.
            w.setIconImage(icons.get(0));
        }
    }

    public static void setFor(JDialog w) {
        if (icons == null)
            return;

        if (setIconImages != null) {
            setIconImages(w);
        } else {
            // Give up. JDialog has no setIconImage() method.
        }
    }

    private static void setIconImages(Window w) {
        try {
            setIconImages.invoke(w, icons);
        } catch (IllegalAccessException e) {
            ErrorDialog.bug(e);
        } catch (IllegalArgumentException e) {
            ErrorDialog.bug(e);
        } catch (InvocationTargetException e) {
            ErrorDialog.bug(e);
        } catch (ExceptionInInitializerError e) {
            ErrorDialog.bug(e);
        }
    }
}