From 554fd8c5195424bdbcabf5de30fdc183aba391bd Mon Sep 17 00:00:00 2001 From: upstream source tree Date: Sun, 15 Mar 2015 20:14:05 -0400 Subject: obtained gcc-4.6.4.tar.bz2 from upstream website; verified gcc-4.6.4.tar.bz2.sig; imported gcc-4.6.4 source tree from verified upstream tarball. downloading a git-generated archive based on the 'upstream' tag should provide you with a source tree that is binary identical to the one extracted from the above tarball. if you have obtained the source via the command 'git clone', however, do note that line-endings of files in your working directory might differ from line-endings of the respective files in the upstream repository. --- libjava/classpath/javax/swing/UIManager.java | 948 +++++++++++++++++++++++++++ 1 file changed, 948 insertions(+) create mode 100644 libjava/classpath/javax/swing/UIManager.java (limited to 'libjava/classpath/javax/swing/UIManager.java') diff --git a/libjava/classpath/javax/swing/UIManager.java b/libjava/classpath/javax/swing/UIManager.java new file mode 100644 index 000000000..05a3fceda --- /dev/null +++ b/libjava/classpath/javax/swing/UIManager.java @@ -0,0 +1,948 @@ +/* UIManager.java -- + Copyright (C) 2002, 2003, 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 gnu.java.lang.CPStringBuilder; + +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Font; +import java.awt.Insets; +import java.beans.PropertyChangeListener; +import java.beans.PropertyChangeSupport; +import java.io.Serializable; +import java.util.Enumeration; +import java.util.Locale; + +import javax.swing.border.Border; +import javax.swing.plaf.ComponentUI; +import javax.swing.plaf.metal.MetalLookAndFeel; + +/** + * Manages the current {@link LookAndFeel} and any auxiliary {@link LookAndFeel} + * instances. + */ +public class UIManager implements Serializable +{ + /** + * Represents the basic information about a {@link LookAndFeel} (LAF), so + * that a list of installed LAFs can be presented without actually loading + * the LAF class(es). + */ + public static class LookAndFeelInfo + { + String name, clazz; + + /** + * Creates a new instance. + * + * @param name the look and feel name. + * @param clazz the look and feel class name. + */ + public LookAndFeelInfo(String name, + String clazz) + { + this.name = name; + this.clazz = clazz; + } + + /** + * Returns the name of the look and feel. + * + * @return The name of the look and feel. + */ + public String getName() + { + return name; + } + + /** + * Returns the fully qualified class name for the {@link LookAndFeel}. + * + * @return The fully qualified class name for the {@link LookAndFeel}. + */ + public String getClassName() + { + return clazz; + } + + /** + * Returns a String representation of the LookAndFeelInfo object. + * + * @return a String representation of the LookAndFeelInfo object + */ + public String toString() + { + CPStringBuilder s = new CPStringBuilder(); + s.append(getClass().getName()); + s.append('['); + s.append(getName()); + s.append(' '); + s.append(getClassName()); + s.append(']'); + return s.toString(); + } + } + + /** + * A UIDefaults subclass that multiplexes between itself and a 'fallback' + * UIDefaults instance. This is used to protect the L&F UIDefaults from beeing + * overwritten by applications. + */ + private static class MultiplexUIDefaults + extends UIDefaults + { + private class MultiplexEnumeration + implements Enumeration + { + Enumeration[] enums; + int i; + MultiplexEnumeration(Enumeration e1, Enumeration e2) + { + enums = new Enumeration[]{ e1, e2 }; + i = 0; + } + + public boolean hasMoreElements() + { + return enums[i].hasMoreElements() || i < enums.length - 1; + } + + public Object nextElement() + { + Object val = enums[i].nextElement(); + if (! enums[i].hasMoreElements() && i < enums.length - 1) + i++; + return val; + } + + } + + UIDefaults fallback; + + /** + * Creates a new MultiplexUIDefaults instance with + * d as the fallback defaults. + * + * @param d the fallback defaults (null not permitted). + */ + MultiplexUIDefaults(UIDefaults d) + { + if (d == null) + throw new NullPointerException(); + fallback = d; + } + + public Object get(Object key) + { + Object val = super.get(key); + if (val == null) + val = fallback.get(key); + return val; + } + + public Object get(Object key, Locale l) + { + Object val = super.get(key, l); + if (val == null) + val = fallback.get(key, l); + return val; + } + + public Object remove(Object key) + { + Object val = super.remove(key); + if (val == null) + val = fallback.remove(key); + return val; + } + + public int size() + { + return super.size() + fallback.size(); + } + + public Enumeration keys() + { + return new MultiplexEnumeration(super.keys(), fallback.keys()); + } + + public Enumeration elements() + { + return new MultiplexEnumeration(super.elements(), fallback.elements()); + } + } + + private static final long serialVersionUID = -5547433830339189365L; + + /** The installed look and feel(s). */ + static LookAndFeelInfo [] installed = { + new LookAndFeelInfo("Metal", "javax.swing.plaf.metal.MetalLookAndFeel"), + new LookAndFeelInfo("GNU", "gnu.javax.swing.plaf.gnu.GNULookAndFeel") + }; + + /** The installed auxiliary look and feels. */ + static LookAndFeel[] auxLookAndFeels; + + /** The current look and feel. */ + static LookAndFeel currentLookAndFeel; + + static MultiplexUIDefaults currentUIDefaults; + + static UIDefaults lookAndFeelDefaults; + + /** Property change listener mechanism. */ + static PropertyChangeSupport listeners + = new PropertyChangeSupport(UIManager.class); + + static + { + String defaultlaf = System.getProperty("swing.defaultlaf"); + try + { + if (defaultlaf != null) + { + setLookAndFeel(defaultlaf); + } + else + { + setLookAndFeel(new MetalLookAndFeel()); + } + } + catch (Exception ex) + { + System.err.println("cannot initialize Look and Feel: " + defaultlaf); + System.err.println("error: " + ex.toString()); + ex.printStackTrace(); + System.err.println("falling back to Metal Look and Feel"); + try + { + setLookAndFeel(new MetalLookAndFeel()); + } + catch (Exception ex2) + { + throw (Error) new AssertionError("There must be no problem installing" + + " the MetalLookAndFeel.") + .initCause(ex2); + } + } + } + + /** + * Creates a new instance of the UIManager. There is no need + * to construct an instance of this class, since all methods are static. + */ + public UIManager() + { + // Do nothing here. + } + + /** + * Add a PropertyChangeListener to the listener list. + * + * @param listener the listener to add + */ + public static void addPropertyChangeListener(PropertyChangeListener listener) + { + listeners.addPropertyChangeListener(listener); + } + + /** + * Remove a PropertyChangeListener from the listener list. + * + * @param listener the listener to remove + */ + public static void removePropertyChangeListener(PropertyChangeListener + listener) + { + listeners.removePropertyChangeListener(listener); + } + + /** + * Returns an array of all added PropertyChangeListener objects. + * + * @return an array of listeners + * + * @since 1.4 + */ + public static PropertyChangeListener[] getPropertyChangeListeners() + { + return listeners.getPropertyChangeListeners(); + } + + /** + * Add a {@link LookAndFeel} to the list of auxiliary look and feels. + * + * @param laf the auxiliary look and feel (null not permitted). + * + * @throws NullPointerException if laf is null. + * + * @see #getAuxiliaryLookAndFeels() + */ + public static void addAuxiliaryLookAndFeel(LookAndFeel laf) + { + if (laf == null) + throw new NullPointerException("Null 'laf' argument."); + if (auxLookAndFeels == null) + { + auxLookAndFeels = new LookAndFeel[1]; + auxLookAndFeels[0] = laf; + return; + } + + LookAndFeel[] temp = new LookAndFeel[auxLookAndFeels.length + 1]; + System.arraycopy(auxLookAndFeels, 0, temp, 0, auxLookAndFeels.length); + auxLookAndFeels = temp; + auxLookAndFeels[auxLookAndFeels.length - 1] = laf; + } + + /** + * Removes a {@link LookAndFeel} (LAF) from the list of auxiliary LAFs. + * + * @param laf the LAF to remove. + * + * @return true if the LAF was removed, and false + * otherwise. + */ + public static boolean removeAuxiliaryLookAndFeel(LookAndFeel laf) + { + if (auxLookAndFeels == null) + return false; + int count = auxLookAndFeels.length; + if (count == 1 && auxLookAndFeels[0] == laf) + { + auxLookAndFeels = null; + return true; + } + for (int i = 0; i < count; i++) + { + if (auxLookAndFeels[i] == laf) + { + LookAndFeel[] temp = new LookAndFeel[auxLookAndFeels.length - 1]; + if (i == 0) + { + System.arraycopy(auxLookAndFeels, 1, temp, 0, count - 1); + } + else if (i == count - 1) + { + System.arraycopy(auxLookAndFeels, 0, temp, 0, count - 1); + } + else + { + System.arraycopy(auxLookAndFeels, 0, temp, 0, i); + System.arraycopy(auxLookAndFeels, i + 1, temp, i, + count - i - 1); + } + auxLookAndFeels = temp; + return true; + } + } + return false; + } + + /** + * Returns an array (possibly null) containing the auxiliary + * {@link LookAndFeel}s that are in use. These are used by the + * {@link javax.swing.plaf.multi.MultiLookAndFeel} class. + * + * @return The auxiliary look and feels (possibly null). + * + * @see #addAuxiliaryLookAndFeel(LookAndFeel) + */ + public static LookAndFeel[] getAuxiliaryLookAndFeels() + { + return auxLookAndFeels; + } + + /** + * Returns an object from the {@link UIDefaults} table for the current + * {@link LookAndFeel}. + * + * @param key the key. + * + * @return The object. + */ + public static Object get(Object key) + { + return getDefaults().get(key); + } + + /** + * Returns an object from the {@link UIDefaults} table for the current + * {@link LookAndFeel}. + * + * @param key the key. + * + * @return The object. + * + * @since 1.4 + */ + public static Object get(Object key, Locale locale) + { + return getDefaults().get(key, locale); + } + + /** + * Returns a boolean value from the defaults table. If there is no value + * for the specified key, or the value is not an instance of {@link Boolean}, + * this method returns false. + * + * @param key the key (null not permitted). + * + * @return The boolean value associated with the specified key. + * + * @throws NullPointerException if key is null. + * + * @since 1.4 + */ + public static boolean getBoolean(Object key) + { + Object value = get(key); + if (value instanceof Boolean) + return ((Boolean) value).booleanValue(); + return false; + } + + /** + * Returns a boolean value from the defaults table. If there is no value + * for the specified key, or the value is not an instance of {@link Boolean}, + * this method returns false. + * + * @param key the key (null not permitted). + * @param locale the locale. + * + * @return The boolean value associated with the specified key. + * + * @throws NullPointerException if key is null. + * + * @since 1.4 + */ + public static boolean getBoolean(Object key, Locale locale) + { + Object value = get(key, locale); + if (value instanceof Boolean) + return ((Boolean) value).booleanValue(); + return false; + } + + /** + * Returns a border from the defaults table. + * + * @param key the key (null not permitted). + * + * @return The border associated with the given key, or null. + * + * @throws NullPointerException if key is null. + */ + public static Border getBorder(Object key) + { + Object value = get(key); + if (value instanceof Border) + return (Border) value; + return null; + } + + /** + * Returns a border from the defaults table. + * + * @param key the key (null not permitted). + * @param locale the locale. + * + * @return The border associated with the given key, or null. + * + * @throws NullPointerException if key is null. + * + * @since 1.4 + */ + public static Border getBorder(Object key, Locale locale) + { + Object value = get(key, locale); + if (value instanceof Border) + return (Border) value; + return null; + } + + /** + * Returns a drawing color from the defaults table. + * + * @param key the key (null not permitted). + * + * @return The color associated with the given key, or null. + * + * @throws NullPointerException if key is null. + */ + public static Color getColor(Object key) + { + Object value = get(key); + if (value instanceof Color) + return (Color) value; + return null; + } + + /** + * Returns a drawing color from the defaults table. + * + * @param key the key (null not permitted). + * @param locale the locale. + * + * @return The color associated with the given key, or null. + * + * @throws NullPointerException if key is null. + * + * @since 1.4 + */ + public static Color getColor(Object key, Locale locale) + { + Object value = get(key, locale); + if (value instanceof Color) + return (Color) value; + return null; + } + + /** + * The fully qualified class name of the cross platform (Metal) look and feel. + * This string can be passed to Class.forName() + * + * @return "javax.swing.plaf.metal.MetalLookAndFeel" + */ + public static String getCrossPlatformLookAndFeelClassName() + { + return "javax.swing.plaf.metal.MetalLookAndFeel"; + } + + /** + * Returns the default values for this look and feel. + * + * @return The {@link UIDefaults} for the current {@link LookAndFeel}. + */ + public static UIDefaults getDefaults() + { + if (currentUIDefaults == null) + currentUIDefaults = new MultiplexUIDefaults(new UIDefaults()); + return currentUIDefaults; + } + + /** + * Returns a dimension from the defaults table. + * + * @param key the key (null not permitted). + * + * @return The color associated with the given key, or null. + * + * @throws NullPointerException if key is null. + */ + public static Dimension getDimension(Object key) + { + Object value = get(key); + if (value instanceof Dimension) + return (Dimension) value; + return null; + } + + /** + * Returns a dimension from the defaults table. + * + * @param key the key (null not permitted). + * @param locale the locale. + * + * @return The color associated with the given key, or null. + * + * @throws NullPointerException if key is null. + * @since 1.4 + */ + public static Dimension getDimension(Object key, Locale locale) + { + Object value = get(key, locale); + if (value instanceof Dimension) + return (Dimension) value; + return null; + } + + /** + * Retrieves a font from the defaults table of the current + * LookAndFeel. + * + * @param key an Object that specifies the font. Typically, + * this is a String such as + * TitledBorder.font. + * + * @return The font associated with the given key, or null. + * + * @throws NullPointerException if key is null. + */ + public static Font getFont(Object key) + { + Object value = get(key); + if (value instanceof Font) + return (Font) value; + return null; + } + + /** + * Retrieves a font from the defaults table of the current + * LookAndFeel. + * + * @param key an Object that specifies the font. Typically, + * this is a String such as + * TitledBorder.font. + * @param locale the locale. + * + * @return The font associated with the given key, or null. + * + * @throws NullPointerException if key is null. + * + * @since 1.4 + */ + public static Font getFont(Object key, Locale locale) + { + Object value = get(key, locale); + if (value instanceof Font) + return (Font) value; + return null; + } + + /** + * Returns an icon from the defaults table. + * + * @param key the key (null not permitted). + * + * @return The icon associated with the given key, or null. + * + * @throws NullPointerException if key is null. + */ + public static Icon getIcon(Object key) + { + Object value = get(key); + if (value instanceof Icon) + return (Icon) value; + return null; + } + + /** + * Returns an icon from the defaults table. + * + * @param key the key (null not permitted). + * @param locale the locale. + * + * @return The icon associated with the given key, or null. + * + * @throws NullPointerException if key is null. + * @since 1.4 + */ + public static Icon getIcon(Object key, Locale locale) + { + Object value = get(key, locale); + if (value instanceof Icon) + return (Icon) value; + return null; + } + + /** + * Returns an Insets object from the defaults table. + * + * @param key the key (null not permitted). + * + * @return The insets associated with the given key, or null. + * + * @throws NullPointerException if key is null. + */ + public static Insets getInsets(Object key) + { + Object o = get(key); + if (o instanceof Insets) + return (Insets) o; + else + return null; + } + + /** + * Returns an Insets object from the defaults table. + * + * @param key the key (null not permitted). + * @param locale the locale. + * + * @return The insets associated with the given key, or null. + * + * @throws NullPointerException if key is null. + * @since 1.4 + */ + public static Insets getInsets(Object key, Locale locale) + { + Object o = get(key, locale); + if (o instanceof Insets) + return (Insets) o; + else + return null; + } + + /** + * Returns an array containing information about the {@link LookAndFeel}s + * that are installed. + * + * @return A list of the look and feels that are available (installed). + */ + public static LookAndFeelInfo[] getInstalledLookAndFeels() + { + return installed; + } + + /** + * Returns the integer value of the {@link Integer} associated with the + * given key. If there is no value, or the value is not an instance of + * {@link Integer}, this method returns 0. + * + * @param key the key (null not permitted). + * + * @return The integer value associated with the given key, or 0. + */ + public static int getInt(Object key) + { + Object x = get(key); + if (x instanceof Integer) + return ((Integer) x).intValue(); + return 0; + } + + /** + * Returns the integer value of the {@link Integer} associated with the + * given key. If there is no value, or the value is not an instance of + * {@link Integer}, this method returns 0. + * + * @param key the key (null not permitted). + * @param locale the locale. + * + * @return The integer value associated with the given key, or 0. + * + * @since 1.4 + */ + public static int getInt(Object key, Locale locale) + { + Object x = get(key, locale); + if (x instanceof Integer) + return ((Integer) x).intValue(); + return 0; + } + + /** + * Returns the current look and feel (which may be null). + * + * @return The current look and feel. + * + * @see #setLookAndFeel(LookAndFeel) + */ + public static LookAndFeel getLookAndFeel() + { + return currentLookAndFeel; + } + + /** + * Returns the UIDefaults table of the currently active + * look and feel. + * + * @return The {@link UIDefaults} for the current {@link LookAndFeel}. + */ + public static UIDefaults getLookAndFeelDefaults() + { + return lookAndFeelDefaults; + } + + /** + * Returns the {@link String} associated with the given key. If the value + * is not a {@link String}, this method returns null. + * + * @param key the key (null not permitted). + * + * @return The string associated with the given key, or null. + */ + public static String getString(Object key) + { + Object s = get(key); + if (s instanceof String) + return (String) s; + return null; + } + + /** + * Returns the {@link String} associated with the given key. If the value + * is not a {@link String}, this method returns null. + * + * @param key the key (null not permitted). + * @param locale the locale. + * + * @return The string associated with the given key, or null. + * + * @since 1.4 + */ + public static String getString(Object key, Locale locale) + { + Object s = get(key, locale); + if (s instanceof String) + return (String) s; + return null; + } + + /** + * Returns the name of the {@link LookAndFeel} class that implements the + * native systems look and feel if there is one, otherwise the name + * of the default cross platform LookAndFeel class. + * + * @return The fully qualified class name for the system look and feel. + * + * @see #getCrossPlatformLookAndFeelClassName() + */ + public static String getSystemLookAndFeelClassName() + { + return getCrossPlatformLookAndFeelClassName(); + } + + /** + * Returns UI delegate from the current {@link LookAndFeel} that renders the + * target component. + * + * @param target the target component. + */ + public static ComponentUI getUI(JComponent target) + { + return getDefaults().getUI(target); + } + + /** + * Creates a new look and feel and adds it to the current array. + * + * @param name the look and feel name. + * @param className the fully qualified name of the class that implements the + * look and feel. + */ + public static void installLookAndFeel(String name, String className) + { + installLookAndFeel(new LookAndFeelInfo(name, className)); + } + + /** + * Adds the specified look and feel to the current array and then calls + * setInstalledLookAndFeels(javax.swing.UIManager.LookAndFeelInfo[]). + */ + public static void installLookAndFeel(LookAndFeelInfo info) + { + LookAndFeelInfo[] newInstalled = new LookAndFeelInfo[installed.length + 1]; + System.arraycopy(installed, 0, newInstalled, 0, installed.length); + newInstalled[newInstalled.length - 1] = info; + setInstalledLookAndFeels(newInstalled); + } + + /** + * Stores an object in the defaults table. + * + * @param key the key. + * @param value the value. + */ + public static Object put(Object key, Object value) + { + return getDefaults().put(key, value); + } + + /** + * Replaces the current array of installed LookAndFeelInfos. + */ + public static void setInstalledLookAndFeels(UIManager.LookAndFeelInfo[] infos) + { + installed = infos; + } + + /** + * Sets the current {@link LookAndFeel}. + * + * @param newLookAndFeel the new look and feel (null permitted). + * + * @throws UnsupportedLookAndFeelException if the look and feel is not + * supported on the current platform. + * + * @see LookAndFeel#isSupportedLookAndFeel() + */ + public static void setLookAndFeel(LookAndFeel newLookAndFeel) + throws UnsupportedLookAndFeelException + { + if (newLookAndFeel != null && ! newLookAndFeel.isSupportedLookAndFeel()) + throw new UnsupportedLookAndFeelException(newLookAndFeel.getName() + + " not supported on this platform"); + LookAndFeel oldLookAndFeel = currentLookAndFeel; + if (oldLookAndFeel != null) + oldLookAndFeel.uninitialize(); + + // Set the current default look and feel using a LookAndFeel object. + currentLookAndFeel = newLookAndFeel; + if (newLookAndFeel != null) + { + newLookAndFeel.initialize(); + lookAndFeelDefaults = newLookAndFeel.getDefaults(); + if (currentUIDefaults == null) + currentUIDefaults = + new MultiplexUIDefaults(lookAndFeelDefaults); + else + currentUIDefaults.fallback = lookAndFeelDefaults; + } + else + { + currentUIDefaults = null; + } + listeners.firePropertyChange("lookAndFeel", oldLookAndFeel, newLookAndFeel); + //revalidate(); + //repaint(); + } + + /** + * Set the current default look and feel using a class name. + * + * @param className the look and feel class name. + * + * @throws UnsupportedLookAndFeelException if the look and feel is not + * supported on the current platform. + * + * @see LookAndFeel#isSupportedLookAndFeel() + */ + public static void setLookAndFeel(String className) + throws ClassNotFoundException, InstantiationException, IllegalAccessException, + UnsupportedLookAndFeelException + { + Class c = Class.forName(className, true, + Thread.currentThread().getContextClassLoader()); + LookAndFeel a = (LookAndFeel) c.newInstance(); // throws class-cast-exception + setLookAndFeel(a); + } +} -- cgit v1.2.3