mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			434 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			Java
		
	
	
	
			
		
		
	
	
			434 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			Java
		
	
	
	
| /* LookAndFeel.java --
 | |
|    Copyright (C) 2002, 2004, 2005, 2006,  Free Software Foundation, Inc.
 | |
| 
 | |
| This file is part of GNU Classpath.
 | |
| 
 | |
| GNU Classpath is free software; you can redistribute it and/or modify
 | |
| it under the terms of the GNU General Public License as published by
 | |
| the Free Software Foundation; either version 2, or (at your option)
 | |
| any later version.
 | |
| 
 | |
| GNU Classpath 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 for more details.
 | |
| 
 | |
| You should have received a copy of the GNU General Public License
 | |
| along with GNU Classpath; see the file COPYING.  If not, write to the
 | |
| Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 | |
| 02110-1301 USA.
 | |
| 
 | |
| Linking this library statically or dynamically with other modules is
 | |
| making a combined work based on this library.  Thus, the terms and
 | |
| conditions of the GNU General Public License cover the whole
 | |
| combination.
 | |
| 
 | |
| As a special exception, the copyright holders of this library give you
 | |
| permission to link this library with independent modules to produce an
 | |
| executable, regardless of the license terms of these independent
 | |
| modules, and to copy and distribute the resulting executable under
 | |
| terms of your choice, provided that you also meet, for each linked
 | |
| independent module, the terms and conditions of the license of that
 | |
| module.  An independent module is a module which is not derived from
 | |
| or based on this library.  If you modify this library, you may extend
 | |
| this exception to your version of the library, but you are not
 | |
| obligated to do so.  If you do not wish to do so, delete this
 | |
| exception statement from your version. */
 | |
| 
 | |
| 
 | |
| package javax.swing;
 | |
| 
 | |
| import java.awt.Color;
 | |
| import java.awt.Component;
 | |
| import java.awt.Font;
 | |
| import java.awt.Toolkit;
 | |
| import java.net.URL;
 | |
| 
 | |
| import javax.swing.border.Border;
 | |
| import javax.swing.plaf.ComponentInputMapUIResource;
 | |
| import javax.swing.plaf.IconUIResource;
 | |
| import javax.swing.plaf.InputMapUIResource;
 | |
| import javax.swing.plaf.UIResource;
 | |
| import javax.swing.plaf.metal.MetalLookAndFeel;
 | |
| import javax.swing.text.JTextComponent;
 | |
| 
 | |
| /**
 | |
|  * A <i>look-and-feel</i> controls most aspects of the appearance and
 | |
|  * operation of user interface components in <code>javax.swing</code>.  A
 | |
|  * cross-platform look-and-feel (the {@link MetalLookAndFeel}) is provided.
 | |
|  *
 | |
|  * @see UIManager#getInstalledLookAndFeels()
 | |
|  * @see UIManager#setLookAndFeel(LookAndFeel)
 | |
|  */
 | |
| public abstract class LookAndFeel
 | |
| {
 | |
|   /**
 | |
|    * Creates and returns a look-and-feel specific defaults table.  This method
 | |
|    * is called once by {@link UIManager#setLookAndFeel(LookAndFeel)} and
 | |
|    * shouldn't be called again (as it creates a large table of defaults).
 | |
|    *
 | |
|    * @return The UI defaults.
 | |
|    */
 | |
|   public UIDefaults getDefaults()
 | |
|   {
 | |
|     return null;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Returns a description of the look and feel.
 | |
|    *
 | |
|    * @return A description of the look and feel.
 | |
|    */
 | |
|   public abstract String getDescription();
 | |
| 
 | |
|   /**
 | |
|    * Returns the value of <code>Toolkit.getDefaultToolkit()
 | |
|    * .getDesktopProperty(systemPropertyName)</code>, or
 | |
|    * <code>fallbackValue</code> if no such property is defined.
 | |
|    *
 | |
|    * @param systemPropertyName  the system property name.
 | |
|    * @param fallbackValue  the fallback value.
 | |
|    *
 | |
|    * @return The property value or <code>fallbackValue</code>.
 | |
|    */
 | |
|   public static Object getDesktopPropertyValue(String systemPropertyName,
 | |
|       Object fallbackValue)
 | |
|   {
 | |
|     Object value = Toolkit.getDefaultToolkit().getDesktopProperty(
 | |
|         systemPropertyName);
 | |
|     return value != null ? value : fallbackValue;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Returns an identifier for the look and feel.
 | |
|    *
 | |
|    * @return An identifier for the look and feel.
 | |
|    */
 | |
|   public abstract String getID();
 | |
| 
 | |
|   /**
 | |
|    * Returns the name for the look and feel.
 | |
|    *
 | |
|    * @return The name for the look and feel.
 | |
|    */
 | |
|   public abstract String getName();
 | |
| 
 | |
|   /**
 | |
|    * Returns <code>true</code> when the look-and-feel supports window
 | |
|    * decorations, and <code>false</code> otherwise. This default implementation
 | |
|    * always returns <code>false</code> and needs to be overridden when the
 | |
|    * derived look-and-feel supports this.
 | |
|    *
 | |
|    * @return <code>false</code>.
 | |
|    *
 | |
|    * @since 1.4
 | |
|    */
 | |
|   public boolean getSupportsWindowDecorations()
 | |
|   {
 | |
|     return false;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Initializes the look-and-feel.  The
 | |
|    * {@link UIManager#setLookAndFeel(LookAndFeel)} method calls this method
 | |
|    * before the first call (and typically the only call) to
 | |
|    * {@link #getDefaults()}.  This default implementation does nothing, but
 | |
|    * subclasses can override this behaviour.
 | |
|    */
 | |
|   public void initialize()
 | |
|   {
 | |
|     // We do nothing here. This method is meant to be overridden by
 | |
|     // LookAndFeel implementations.
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Convenience method for installing a component's default {@link Border}
 | |
|    * object on the specified component if either the border is currently
 | |
|    * <code>null</code> or already an instance of {@link UIResource}.
 | |
|    *
 | |
|    * @param c  the component (<code>null</code> not permitted).
 | |
|    * @param defaultBorderName  the border name (for lookup in the UIDefaults
 | |
|    *     table).
 | |
|    */
 | |
|   public static void installBorder(JComponent c, String defaultBorderName)
 | |
|   {
 | |
|     Border b = c.getBorder();
 | |
|     if (b == null || b instanceof UIResource)
 | |
|       c.setBorder(UIManager.getBorder(defaultBorderName));
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Convenience method for initializing a component's foreground and
 | |
|    * background color properties with values from the current defaults table.
 | |
|    *
 | |
|    * @param c  the component (<code>null</code> not permitted).
 | |
|    * @param defaultBgName  the key for the background color in the UIDefaults
 | |
|    *     table.
 | |
|    * @param defaultFgName  the key for the foreground color in the UIDefaults
 | |
|    *     table.
 | |
|    */
 | |
|   public static void installColors(JComponent c, String defaultBgName,
 | |
|                                    String defaultFgName)
 | |
|   {
 | |
|     // Install background.
 | |
|     Color bg = c.getBackground();
 | |
|     if (bg == null || bg instanceof UIResource)
 | |
|       c.setBackground(UIManager.getColor(defaultBgName));
 | |
| 
 | |
|     // Install foreground.
 | |
|     Color fg = c.getForeground();
 | |
|     if (fg == null || fg instanceof UIResource)
 | |
|       c.setForeground(UIManager.getColor(defaultFgName));
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Convenience method for initializing a component's foreground, background
 | |
|    * and font properties with values from the current defaults table.
 | |
|    *
 | |
|    * @param component  the component (<code>null</code> not permitted).
 | |
|    * @param defaultBgName  the key for the background color in the UIDefaults
 | |
|    *     table.
 | |
|    * @param defaultFgName  the key for the foreground color in the UIDefaults
 | |
|    *     table.
 | |
|    * @param defaultFontName  the key for the font in the UIDefaults table.
 | |
|    */
 | |
|   public static void installColorsAndFont(JComponent component,
 | |
|                                           String defaultBgName,
 | |
|                                           String defaultFgName,
 | |
|                                           String defaultFontName)
 | |
|   {
 | |
|     // Install colors.
 | |
|     installColors(component, defaultBgName, defaultFgName);
 | |
|     // Install font.
 | |
|     Font f = component.getFont();
 | |
|     if (f == null || f instanceof UIResource)
 | |
|       component.setFont(UIManager.getFont(defaultFontName));
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Returns <code>true</code> if the look-and-feel is the "native"
 | |
|    * look-and-feel for the current platform, and <code>false</code> otherwise.
 | |
|    * A native look-and-feel emulates the appearance and behaviour of the
 | |
|    * default windowing system on the host operating system.
 | |
|    *
 | |
|    * @return A flag indicating whether or not this is the native look and feel
 | |
|    *         for the current platform.
 | |
|    */
 | |
|   public abstract boolean isNativeLookAndFeel();
 | |
| 
 | |
|   /**
 | |
|    * Returns <code>true</code> if the look-and-feel is supported on the
 | |
|    * current operating system, and <code>false</code> otherwise.  This
 | |
|    * mechanism is provided so that it is possible to prevent a look-and-feel
 | |
|    * from being used on some operating systems (usually for legal, not
 | |
|    * technical, reasons).
 | |
|    *
 | |
|    * @return A flag indicating whether or not the look-and-feel is supported
 | |
|    *         on the current platform.
 | |
|    */
 | |
|   public abstract boolean isSupportedLookAndFeel();
 | |
| 
 | |
|   /**
 | |
|    * Loads the bindings in keys into retMap. Does not remove existing entries
 | |
|    * from retMap.  <code>keys</code> describes the InputMap, every even indexed
 | |
|    * item is either a KeyStroke or a String representing a KeyStroke and every
 | |
|    * odd indexed item is the Object associated with that KeyStroke in an
 | |
|    * ActionMap.
 | |
|    *
 | |
|    * @param retMap the InputMap into which we load bindings
 | |
|    * @param keys the Object array describing the InputMap as above
 | |
|    */
 | |
|   public static void loadKeyBindings(InputMap retMap, Object[] keys)
 | |
|   {
 | |
|     if (keys == null)
 | |
|       return;
 | |
|     for (int i = 0; i < keys.length - 1; i += 2)
 | |
|       {
 | |
|         Object key = keys[i];
 | |
|         KeyStroke keyStroke;
 | |
|         if (key instanceof KeyStroke)
 | |
|           keyStroke = (KeyStroke) key;
 | |
|         else
 | |
|           keyStroke = KeyStroke.getKeyStroke((String) key);
 | |
|         retMap.put(keyStroke, keys[i + 1]);
 | |
|       }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Creates a ComponentInputMap from keys.
 | |
|    * <code>keys</code> describes the InputMap, every even indexed
 | |
|    * item is either a KeyStroke or a String representing a KeyStroke and every
 | |
|    * odd indexed item is the Object associated with that KeyStroke in an
 | |
|    * ActionMap.
 | |
|    *
 | |
|    * @param c the JComponent associated with the ComponentInputMap
 | |
|    * @param keys the Object array describing the InputMap as above
 | |
|    *
 | |
|    * @return A new input map.
 | |
|    */
 | |
|   public static ComponentInputMap makeComponentInputMap(JComponent c,
 | |
|                                                         Object[] keys)
 | |
|   {
 | |
|     ComponentInputMap retMap = new ComponentInputMapUIResource(c);
 | |
|     loadKeyBindings(retMap, keys);
 | |
|     return retMap;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Utility method that creates a UIDefaults.LazyValue that creates an
 | |
|    * ImageIcon UIResource for the specified gifFile filename.
 | |
|    *
 | |
|    * @param baseClass  the base class for accessing the icon resource.
 | |
|    * @param gifFile  the file name.
 | |
|    *
 | |
|    * @return A {@link UIDefaults.LazyValue} that serves up an
 | |
|    *     {@link IconUIResource}.
 | |
|    */
 | |
|   public static Object makeIcon(Class<?> baseClass, String gifFile)
 | |
|   {
 | |
|     final URL file = baseClass.getResource(gifFile);
 | |
|     return new UIDefaults.LazyValue()
 | |
|       {
 | |
|         public Object createValue(UIDefaults table)
 | |
|         {
 | |
|           return new IconUIResource(new ImageIcon(file));
 | |
|         }
 | |
|       };
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Creates a InputMap from keys.
 | |
|    * <code>keys</code> describes the InputMap, every even indexed
 | |
|    * item is either a KeyStroke or a String representing a KeyStroke and every
 | |
|    * odd indexed item is the Object associated with that KeyStroke in an
 | |
|    * ActionMap.
 | |
|    *
 | |
|    * @param keys the Object array describing the InputMap as above
 | |
|    *
 | |
|    * @return A new input map.
 | |
|    */
 | |
|   public static InputMap makeInputMap(Object[] keys)
 | |
|   {
 | |
|     InputMap retMap = new InputMapUIResource();
 | |
|     loadKeyBindings(retMap, keys);
 | |
|     return retMap;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Convenience method for building lists of KeyBindings.
 | |
|    * <code>keyBindingList</code> is an array of KeyStroke-Action pairs where
 | |
|    * even indexed elements are KeyStrokes or Strings representing KeyStrokes
 | |
|    * and odd indexed elements are the associated Actions.
 | |
|    *
 | |
|    * @param keyBindingList the array of KeyStroke-Action pairs
 | |
|    * @return a JTextComponent.KeyBinding array
 | |
|    */
 | |
|   public static JTextComponent.KeyBinding[] makeKeyBindings(
 | |
|       Object[] keyBindingList)
 | |
|   {
 | |
|     JTextComponent.KeyBinding[] retBindings =
 | |
|       new JTextComponent.KeyBinding[keyBindingList.length / 2];
 | |
|     for (int i = 0; i < keyBindingList.length - 1; i += 2)
 | |
|       {
 | |
|         KeyStroke stroke;
 | |
|         if (keyBindingList[i] instanceof KeyStroke)
 | |
|           stroke = (KeyStroke) keyBindingList[i];
 | |
|         else
 | |
|           stroke = KeyStroke.getKeyStroke((String) keyBindingList[i]);
 | |
|         retBindings[i / 2] = new JTextComponent.KeyBinding(stroke,
 | |
|             (String) keyBindingList[i + 1]);
 | |
|       }
 | |
|     return retBindings;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Invoked when the user attempts an invalid operation. The default
 | |
|    * implementation just beeps. Subclasses that wish to change this need to
 | |
|    * override this method.
 | |
|    *
 | |
|    * @param component the component the error occured in
 | |
|    */
 | |
|   public void provideErrorFeedback(Component component)
 | |
|   {
 | |
|     Toolkit.getDefaultToolkit().beep();
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Returns a string that displays and identifies this object's properties.
 | |
|    *
 | |
|    * @return string containing the description and class name.
 | |
|    */
 | |
|   public String toString()
 | |
|   {
 | |
|     return getDescription() + " " + getClass().getName();
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * UIManager.setLookAndFeel calls this method just before we're replaced by
 | |
|    * a new default look and feel.
 | |
|    */
 | |
|   public void uninitialize()
 | |
|   {
 | |
|     // We do nothing here. This method is meant to be overridden by
 | |
|     // LookAndFeel implementations.
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Convenience method for un-installing a component's default border on the
 | |
|    * specified component if the border is currently an instance of UIResource.
 | |
|    *
 | |
|    * @param c  the component (<code>null</code> not permitted).
 | |
|    */
 | |
|   public static void uninstallBorder(JComponent c)
 | |
|   {
 | |
|     if (c.getBorder() instanceof UIResource)
 | |
|       c.setBorder(null);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This methods installs a UI property if it hasn't already been set by an
 | |
|    * application. This method is used by UI delegates that install a default
 | |
|    * value for a property with a primitive type but do not want to override
 | |
|    * a value that has been set by an application.
 | |
|    *
 | |
|    * The supported properties depend on the actual type of the component and
 | |
|    * are listed in the table below. The supported properties are of course
 | |
|    * inherited to subclasses.
 | |
|    *
 | |
|    * <table>
 | |
|    * <tr><th>Type</th><th>Supported properties</th></tr>
 | |
|    * <tr><td><code>JComponent</code></td>
 | |
|    *     <td><code>opaque, autoscrolls</code></td></tr>
 | |
|    * <tr><td><code>AbstractButton</code></td>
 | |
|    *     <td><code>borderPainted, rolloverEnabled, iconTextGap,
 | |
|    *      contentAreaFilled</code></td></tr>
 | |
|    * <tr><td><code>JDesktopPane</code></td>
 | |
|    *     <td><code>dragMode</code></td></tr>
 | |
|    * <tr><td><code>JSplitPane</code></td>
 | |
|    *     <td><code>dividerSize, oneTouchExpandable</code></td></tr>
 | |
|    * <tr><td><code>JTable</code></td>
 | |
|    *     <td><code>rowHeight</code></td></tr>
 | |
|    * <tr><td><code>JTree</code></td>
 | |
|    *     <td><code>rowHeight, scrollsOnExpand, showsRootHandles</code></td></tr>
 | |
|    * </table>
 | |
|    *
 | |
|    * @param c the component to install the property to
 | |
|    * @param propertyName the name of the property
 | |
|    * @param value the value of the property
 | |
|    *
 | |
|    * @throws IllegalArgumentException if the specified property cannot be set
 | |
|    *         by this method
 | |
|    * @throws ClassCastException if the property value does not match the
 | |
|    *         property type
 | |
|    * @throws NullPointerException if <code>c</code> or
 | |
|    *         <code>propertyValue</code> is <code>null</code>
 | |
|    *
 | |
|    * @since 1.5
 | |
|    */
 | |
|   public static void installProperty(JComponent c, String propertyName,
 | |
|                                      Object value)
 | |
|   {
 | |
|     c.setUIProperty(propertyName, value);
 | |
|   }
 | |
| }
 |