Mega Code Archive

 
Categories / Java / Swing JFC
 

AWT Utilities

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