AWTUtilities.java Source code

Java tutorial

Introduction

Here is the source code for AWTUtilities.java

Source

/**
 * The utillib library.
 * More information is available at http://www.jinchess.com/.
 * Copyright (C) 2002, 2003 Alexander Maryanovsky.
 * All rights reserved.
 *
 * The utillib library is free software; you can redistribute
 * it and/or modify it under the terms of the GNU Lesser General Public License
 * as published by the Free Software Foundation; either version 2 of the
 * License, or (at your option) any later version.
 *
 * The utillib 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 Lesser
 * General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with utillib library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

import java.awt.*;
import java.lang.reflect.*;

/**
 * A collection of AWT related utilities.
 */

public class AWTUtilities {

    /**
     * Packs and centers the given window relative to the given component. The
     * specified component may be <code>null</code>, in which case the window will
     * be centered on the screen. The method also makes sure that the target
     * window is fully visible by calling <code>forceToScreen</code>.
     */

    public static void centerWindow(Window target, Component parent) {
        target.pack();

        Dimension size = target.getSize();
        Rectangle parentBounds = parent == null || !parent.isShowing() ? getUsableScreenBounds()
                : new Rectangle(parent.getLocationOnScreen(), parent.getSize());

        target.setLocation(parentBounds.x + (parentBounds.width - size.width) / 2,
                parentBounds.y + (parentBounds.height - size.height) / 2);

        forceToScreen(target);
    }

    /**
     * Reposition the specified window so that it necessarily fits on the screen,
     * while trying to minimize changes.
     */

    public static void forceToScreen(Window window) {
        Dimension screenSize = window.getToolkit().getScreenSize();
        Rectangle bounds = window.getBounds();

        bounds.width = Math.min(bounds.width, screenSize.width);
        bounds.height = Math.min(bounds.height, screenSize.height);
        bounds.x = Math.min(Math.max(bounds.x, 0), screenSize.width - bounds.width);
        bounds.y = Math.min(Math.max(bounds.y, 0), screenSize.height - bounds.height);

        window.setBounds(bounds);
    }

    /**
     * Returns the parent Frame of the specified <code>Component</code> or
     * <code>null</code> if none exists.
     */

    public static Frame frameForComponent(Component component) {
        while (component != null) {
            if (component instanceof Frame)
                return (Frame) component;
            component = component.getParent();
        }

        return null;
    }

    /**
     * Returns a list of available font names. Under JDK1.1 it uses
     * <code>Toolkit.getFontList()</code> while under JDK1.2 (via reflection),
     * <code>GraphicsEnvironment.getAvailableFontFamilyNames()</code>
     */

    public static String[] getAvailableFontNames() {
        if (PlatformUtils.isJavaBetterThan("1.2")) {
            try {
                // The equivalent of "return GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames();"
                Class geClass = Class.forName("java.awt.GraphicsEnvironment");
                Method getLocalGraphicsEnvironmentMethod = geClass.getMethod("getLocalGraphicsEnvironment",
                        new Class[0]);
                Object localGE = getLocalGraphicsEnvironmentMethod.invoke(null, new Object[0]);
                Method getAvailableFontFamilyNamesMethod = geClass.getMethod("getAvailableFontFamilyNames",
                        new Class[0]);
                String[] fontNames = (String[]) getAvailableFontFamilyNamesMethod.invoke(localGE, new Object[0]);
                return fontNames;
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }
            return null;
        } else
            return Toolkit.getDefaultToolkit().getFontList();
    }

    /**
     * Returns the state of the specified frame, as specified by
     * <code>Frame.getExtendedState()</code> if running under JDK 1.4 or later,
     * otherwise returns 0. The call to <code>Frame.getExtendedState()</code> is
     * done via reflection to avoid runtime errors.
     */

    public static int getExtendedFrameState(Frame frame) {
        if (PlatformUtils.isJavaBetterThan("1.4")) {
            try {
                Class frameClass = Class.forName("java.awt.Frame");
                Method getExtendedStateMethod = frameClass.getMethod("getExtendedState", new Class[0]);
                Integer state = (Integer) getExtendedStateMethod.invoke(frame, new Object[0]);
                return state.intValue();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }
        }

        return 0;
    }

    /**
     * Sets the state of the specified frame, as specified by
     * <code>Frame.setExtendedState</code> if running in JDK 1.4 or later,
     * otherwise does nothing. The call to <code>Frame.setExtendedState()</code>
     * is done via reflection to avoid runtime errors. 
     */

    public static void setExtendedFrameState(Frame frame, int state) {
        if (PlatformUtils.isJavaBetterThan("1.4")) {
            try {
                Class frameClass = Class.forName("java.awt.Frame");
                Method setExtendedStateMethod = frameClass.getMethod("setExtendedState", new Class[] { int.class });
                setExtendedStateMethod.invoke(frame, new Object[] { new Integer(state) });
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * Attempts to determine the usable screen bounds of the default screen
     * device. If the require java.awt API is not available under the JVM we're
     * running in, this will simply return the screen bounds obtained via
     * <code>Toolkit.getScreenSize()</code>.
     */

    public static Rectangle getUsableScreenBounds() {
        if (PlatformUtils.isJavaBetterThan("1.4")) {
            try {
                Class graphicsEnvironmentClass = Class.forName("java.awt.GraphicsEnvironment");
                Class graphicsDeviceClass = Class.forName("java.awt.GraphicsDevice");
                Class graphicsConfigurationClass = Class.forName("java.awt.GraphicsConfiguration");

                Class[] emptyClassArr = new Class[0];
                Method getLocalGraphicsEnvironmentMethod = graphicsEnvironmentClass
                        .getMethod("getLocalGraphicsEnvironment", emptyClassArr);
                Method getDefaultScreenDeviceMethod = graphicsEnvironmentClass.getMethod("getDefaultScreenDevice",
                        emptyClassArr);
                Method getDefaultConfigurationMethod = graphicsDeviceClass.getMethod("getDefaultConfiguration",
                        emptyClassArr);
                Method getBoundsMethod = graphicsConfigurationClass.getMethod("getBounds", emptyClassArr);
                Method getScreenInsetsMethod = Toolkit.class.getMethod("getScreenInsets",
                        new Class[] { graphicsConfigurationClass });

                Object[] emptyObjArr = new Object[0];
                Object graphicsEnvironment = getLocalGraphicsEnvironmentMethod.invoke(null, emptyObjArr);
                Object defaultScreenDevice = getDefaultScreenDeviceMethod.invoke(graphicsEnvironment, emptyObjArr);
                Object defaultConfiguration = getDefaultConfigurationMethod.invoke(defaultScreenDevice,
                        emptyObjArr);
                Rectangle bounds = (Rectangle) getBoundsMethod.invoke(defaultConfiguration, emptyObjArr);
                Insets insets = (Insets) getScreenInsetsMethod.invoke(Toolkit.getDefaultToolkit(),
                        new Object[] { defaultConfiguration });

                bounds.x += insets.left;
                bounds.y += insets.top;
                bounds.width -= insets.left + insets.right;
                bounds.height -= insets.top + insets.bottom;

                return bounds;
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (SecurityException e) {
                e.printStackTrace();
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }
        }

        return new Rectangle(new Point(0, 0), Toolkit.getDefaultToolkit().getScreenSize());
    }

    /**
     * Enables or disables all the components within the specified container.
     * 
     * This is a rather hacky method - it doesn't work well if there are both
     * enabled and disabled components in the container.
     */

    public static void setContainerEnabled(Container container, boolean enabled) {
        Component[] children = container.getComponents();
        for (int i = 0; i < children.length; i++) {
            Component child = children[i];
            child.setEnabled(enabled);
            if (child instanceof Container)
                setContainerEnabled((Container) child, enabled);
        }
    }

}

/**
 * The utillib library.
 * More information is available at http://www.jinchess.com/.
 * Copyright (C) 2004 Alexander Maryanovsky.
 * All rights reserved.
 *
 * The utillib library is free software; you can redistribute
 * it and/or modify it under the terms of the GNU Lesser General Public License
 * as published by the Free Software Foundation; either version 2 of the
 * License, or (at your option) any later version.
 *
 * The utillib 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 Lesser
 * General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with utillib library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

/**
 * A class which contains various platform specific utilities.
 */

class PlatformUtils {

    /**
     * Returns whether the version of Java we're running in is higher than or
     * equal to the specified version.
     */

    public static boolean isJavaBetterThan(String ver) {
        return System.getProperty("java.version").compareTo(ver) >= 0;
    }

    /**
     * Returns whether we're running under the old (just in case there's ever a
     * new one) Microsoft VM.
     */

    public static boolean isOldMicrosoftVM() {
        String vendor = System.getProperty("java.vendor");

        return (vendor != null) && vendor.toLowerCase().startsWith("microsoft") && !isJavaBetterThan("1.2");
    }

    /**
     * Returns whether we're running under Windows.
     */

    public static boolean isWindows() {
        String os = System.getProperty("os.name");

        return (os != null) && os.toLowerCase().startsWith("windows");
    }

    /**
     * Returns whether we're running under Windows 95/98/ME.
     */

    public static boolean isOldWindows() {
        String os = System.getProperty("os.name");

        return isWindows() && (System.getProperty("os.version").compareTo("5.0") < 0)
                && !os.toLowerCase().startsWith("windows nt");
    }

    /**
     * Returns whether we're running under Linux.
     */

    public static boolean isLinux() {
        String os = System.getProperty("os.name");

        return (os != null) && os.toLowerCase().startsWith("linux");
    }

    /**
     * Returns whether we're running under Mac OS.
     */

    public static boolean isMacOS() {
        String os = System.getProperty("os.name");

        return (os != null) && os.toLowerCase().startsWith("mac");
    }

    /**
     * Returns whether we're running under Mac OS X.
     */

    public static boolean isMacOSX() {
        String os = System.getProperty("os.name");

        return (os != null) && os.toLowerCase().startsWith("mac os x");
    }

    /**
     * Returns whether we're running under Solaris.
     */

    public static boolean isSolaris() {
        String os = System.getProperty("os.name");

        return (os != null) && (os.toLowerCase().startsWith("solaris") || os.toLowerCase().startsWith("sunos"));
    }

    /**
     * Returns the name of the OS we're running on, out of the specified list:
     * <ul>
     *   <li>windows
     *   <li>linux
     *   <li>macosx
     *   <li>solaris
     * </ul>
     * 
     * Returns <code>null</code> if we're running on an OS which is not in the
     * above list.
     */

    public static String getOSName() {
        if (isWindows() || isOldWindows())
            return "windows";
        else if (isLinux())
            return "linux";
        else if (isMacOSX())
            return "macosx";
        else if (isSolaris())
            return "solaris";
        else
            return null;
    }

}