/*
* $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);
}
}
}