diff options
author | Graydon Hoare <graydon@redhat.com> | 2003-11-18 01:36:56 +0000 |
---|---|---|
committer | Graydon Hoare <graydon@gcc.gnu.org> | 2003-11-18 01:36:56 +0000 |
commit | ccdf1a46ee4a3425bee1602ccf758a2bb9364571 (patch) | |
tree | ec4cd3232c9ce2ab328e590c5edbc47051ec3de6 /libjava/javax/swing/UIDefaults.java | |
parent | 628b6e8cc11bf9e24e18f895eabf5cf7ec65c871 (diff) | |
download | gcc-ccdf1a46ee4a3425bee1602ccf758a2bb9364571.zip gcc-ccdf1a46ee4a3425bee1602ccf758a2bb9364571.tar.gz gcc-ccdf1a46ee4a3425bee1602ccf758a2bb9364571.tar.bz2 |
BasicDefaults.java: Rewrite to spec.
2003-11-17 Graydon Hoare <graydon@redhat.com>
* javax/swing/plaf/basic/BasicDefaults.java: Rewrite to spec.
* javax/swing/UIDefaults.java: Modify to reflect rewrite.
From-SVN: r73688
Diffstat (limited to 'libjava/javax/swing/UIDefaults.java')
-rw-r--r-- | libjava/javax/swing/UIDefaults.java | 349 |
1 files changed, 287 insertions, 62 deletions
diff --git a/libjava/javax/swing/UIDefaults.java b/libjava/javax/swing/UIDefaults.java index 33c184b..f1f9964 100644 --- a/libjava/javax/swing/UIDefaults.java +++ b/libjava/javax/swing/UIDefaults.java @@ -41,9 +41,20 @@ import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.Insets; +import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; +import java.lang.reflect.Method; +import java.lang.reflect.Constructor; import java.util.Hashtable; +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.LinkedList; import java.util.Locale; +import java.util.Set; +import java.util.HashSet; +import java.util.MissingResourceException; +import java.util.ResourceBundle; import javax.swing.border.Border; import javax.swing.plaf.ComponentUI; @@ -56,6 +67,11 @@ import javax.swing.plaf.ComponentUI; */ public class UIDefaults extends Hashtable { + + LinkedList bundles; + Set listeners; + Locale defaultLocale; + interface ActiveValue { Object createValue(UIDefaults table); @@ -63,12 +79,20 @@ public class UIDefaults extends Hashtable public static class LazyInputMap implements LazyValue { - public LazyInputMap(Object[] bindings) + Object[] bind; + public LazyInputMap (Object[] bindings) { + bind = bindings; } - public Object createValue(UIDefaults table) + public Object createValue (UIDefaults table) { - throw new Error("not implemented"); + InputMap im = new InputMap (); + for (int i = 0; 2*i+1 < bind.length; ++i) + { + im.put (KeyStroke.getKeyStroke ((String) bind[2*i]), + bind[2*i+1]); + } + return im; } } // class LazyInputMap @@ -79,135 +103,287 @@ public class UIDefaults extends Hashtable public static class ProxyLazyValue implements LazyValue { - public ProxyLazyValue(String s) + LazyValue inner; + public ProxyLazyValue (String s) { - throw new Error("not implemented"); + final String className = s; + inner = new LazyValue () + { + public Object createValue (UIDefaults table) + { + try + { + return Class + .forName (className) + .getConstructor (new Class[] {}) + .newInstance (new Object[] {}); + } + catch (Exception e) + { + return null; + } + } + }; } - public ProxyLazyValue(String c, String m) + + public ProxyLazyValue (String c, String m) { - throw new Error("not implemented"); + final String className = c; + final String methodName = m; + inner = new LazyValue () + { + public Object createValue (UIDefaults table) + { + try + { + return Class + .forName (className) + .getMethod (methodName, new Class[] {}) + .invoke (null, new Object[] {}); + } + catch (Exception e) + { + return null; + } + } + }; } - public ProxyLazyValue(String c, Object[] o) + + public ProxyLazyValue (String c, Object[] os) { - throw new Error("not implemented"); + final String className = c; + final Object[] objs = os; + final Class[] clss = new Class[objs.length]; + for (int i = 0; i < objs.length; ++i) + { + clss[i] = objs[i].getClass (); + } + inner = new LazyValue () + { + public Object createValue (UIDefaults table) + { + try + { + return Class + .forName (className) + .getConstructor (clss) + .newInstance (objs); + } + catch (Exception e) + { + return null; + } + } + }; } - public ProxyLazyValue(String c, String m, Object[] o) + + public ProxyLazyValue (String c, String m, Object[] os) { - throw new Error("not implemented"); + final String className = c; + final String methodName = m; + final Object[] objs = os; + final Class[] clss = new Class[objs.length]; + for (int i = 0; i < objs.length; ++i) + { + clss[i] = objs[i].getClass (); + } + inner = new LazyValue () + { + public Object createValue (UIDefaults table) + { + try + { + return Class + .forName (className) + .getMethod (methodName, clss) + .invoke (null, objs); + } + catch (Exception e) + { + return null; + } + } + }; } - public Object createValue(UIDefaults table) + + public Object createValue (UIDefaults table) { - throw new Error("not implemented"); + return inner.createValue (table); } } // class ProxyLazyValue private static final long serialVersionUID = 7341222528856548117L; - public UIDefaults() + public UIDefaults () { + bundles = new LinkedList (); + listeners = new HashSet (); + defaultLocale = Locale.getDefault (); } - public UIDefaults(Object[] entries) + public UIDefaults (Object[] entries) { - // XXX + bundles = new LinkedList (); + listeners = new HashSet (); + defaultLocale = Locale.getDefault (); + + for (int i = 0; (2*i+1) < entries.length; ++i) + { + put (entries[2*i], entries[2*i+1]); + } } - public Object get(Object key) + public Object get (Object key) { - // XXX Obey 1.4 specs - return super.get(key); + return this.get (key, getDefaultLocale ()); } - public Object get(Object key, Locale l) + public Object get (Object key, Locale loc) { - throw new Error("not implemented"); + Object obj = null; + + if (super.containsKey (key)) + { + obj = super.get (key); + } + else if (key instanceof String) + { + String keyString = (String) key; + ListIterator i = bundles.listIterator (0); + while (i.hasNext ()) + { + String bundle_name = (String) i.next (); + ResourceBundle res = + ResourceBundle.getBundle (bundle_name, loc); + if (res != null) + { + try + { + obj = res.getObject (keyString); + break; + } + catch (MissingResourceException me) + { + // continue, this bundle has no such key + } + } + } + } + + // now we've found the object, resolve it. + // nb: LazyValues aren't supported in resource bundles, so it's correct + // to insert their results in the locale-less hashtable. + + if (obj == null) + return null; + + if (obj instanceof LazyValue) + { + Object resolved = ((LazyValue)obj).createValue (this); + super.remove (key); + super.put (key, resolved); + return resolved; + } + else if (obj instanceof ActiveValue) + { + return ((ActiveValue)obj).createValue (this); + } + + return obj; } public Object put(Object key, Object value) { - throw new Error("not implemented"); + Object old = super.put (key, value); + if (key instanceof String && old != value) + firePropertyChange ((String) key, old, value); + return old; } - public void putDefaults(Object[] list) + public void putDefaults(Object[] entries) { - throw new Error("not implemented"); + for (int i = 0; (2*i+1) < entries.length; ++i) + { + super.put (entries[2*i], entries[2*i+1]); + } + firePropertyChange ("UIDefaults", null, null); } public Font getFont(Object key) { - Object o = get(key); + Object o = get (key); return o instanceof Font ? (Font) o : null; } public Font getFont(Object key, Locale l) { - Object o = get(key, l); + Object o = get (key, l); return o instanceof Font ? (Font) o : null; } public Color getColor(Object key) { - Object o = get(key); + Object o = get (key); return o instanceof Color ? (Color) o : null; } public Color getColor(Object key, Locale l) { - Object o = get(key, l); + Object o = get (key, l); return o instanceof Color ? (Color) o : null; } public Icon getIcon(Object key) { - Object o = get(key); + Object o = get (key); return o instanceof Icon ? (Icon) o : null; } public Icon getIcon(Object key, Locale l) { - Object o = get(key, l); + Object o = get (key, l); return o instanceof Icon ? (Icon) o : null; } public Border getBorder(Object key) { - Object o = get(key); + Object o = get (key); return o instanceof Border ? (Border) o : null; } public Border getBorder(Object key, Locale l) { - Object o = get(key, l); + Object o = get (key, l); return o instanceof Border ? (Border) o : null; } public String getString(Object key) { - Object o = get(key); + Object o = get (key); return o instanceof String ? (String) o : null; } public String getString(Object key, Locale l) { - Object o = get(key, l); + Object o = get (key, l); return o instanceof String ? (String) o : null; } int getInt(Object key) { - Object o = get(key); + Object o = get (key); return o instanceof Integer ? ((Integer) o).intValue() : 0; } int getInt(Object key, Locale l) { - Object o = get(key, l); + Object o = get (key, l); return o instanceof Integer ? ((Integer) o).intValue() : 0; } public boolean getBoolean(Object key) { - return Boolean.TRUE.equals(get(key)); + return Boolean.TRUE.equals (get (key)); } public boolean getBoolean(Object key, Locale l) @@ -217,89 +393,138 @@ public class UIDefaults extends Hashtable public Insets getInsets(Object key) { - Object o = get(key); + Object o = get (key); return o instanceof Insets ? (Insets) o : null; } public Insets getInsets(Object key, Locale l) { - Object o = get(key, l); + Object o = get (key, l); return o instanceof Insets ? (Insets) o : null; } public Dimension getDimension(Object key) { - Object o = get(key); + Object o = get (key); return o instanceof Dimension ? (Dimension) o : null; } public Dimension getDimension(Object key, Locale l) { - Object o = get(key, l); + Object o = get (key, l); return o instanceof Dimension ? (Dimension) o : null; } public Class getUIClass(String id, ClassLoader loader) { - throw new Error("not implemented"); + String className = (String) get (id); + if (className == null) + return null; + try + { + if (loader != null) + return loader.loadClass (className); + return Class.forName (className); + } + catch (Exception e) + { + return null; + } } public Class getUIClass(String id) { - throw new Error("not implemented"); + return getUIClass (id, null); } - + protected void getUIError(String msg) { - // Does nothing unless overridden. + System.err.println ("UIDefaults.getUIError: " + msg); } - public ComponentUI getUI(JComponent a) + public ComponentUI getUI(JComponent target) { - String pp = a.getUIClassID(); - ComponentUI p = (ComponentUI) get(pp); - if (p == null) - getUIError("failed to locate UI:" + pp); - return p; + String classId = target.getUIClassID (); + Class cls = getUIClass (classId); + if (cls == null) + { + getUIError ("failed to locate UI class:" + classId); + return null; + } + + Method factory; + + try + { + factory = cls.getMethod ("createUI", new Class[] { JComponent.class } ); + } + catch (NoSuchMethodException nme) + { + getUIError ("failed to locate createUI method on " + cls.toString ()); + return null; + } + + try + { + return (ComponentUI) factory.invoke (null, new Object[] { target }); + } + catch (java.lang.reflect.InvocationTargetException ite) + { + getUIError ("InvocationTargetException ("+ ite.getTargetException() + +") calling createUI(...) on " + cls.toString ()); + return null; + + } + catch (Exception e) + { + getUIError ("exception calling createUI(...) on " + cls.toString ()); + return null; + } } - void addPropertyChangeListener(PropertyChangeListener l) + void addPropertyChangeListener(PropertyChangeListener listener) { - throw new Error("not implemented"); + listeners.add (listener); } - void removePropertyChangeListener(PropertyChangeListener l) + void removePropertyChangeListener(PropertyChangeListener listener) { - throw new Error("not implemented"); + listeners.remove (listener); } public PropertyChangeListener[] getPropertyChangeListeners() { - throw new Error("not implemented"); + return (PropertyChangeListener[]) listeners.toArray (); } protected void firePropertyChange(String property, Object o, Object n) { - throw new Error("not implemented"); + Iterator i = listeners.iterator (); + PropertyChangeEvent pce = new PropertyChangeEvent (this, property, o, n); + while (i.hasNext ()) + { + PropertyChangeListener pcl = (PropertyChangeListener) i.next (); + pcl.propertyChange (pce); + } } void addResourceBundle(String name) { - throw new Error("not implemented"); + bundles.addFirst (name); } void removeResourceBundle(String name) { - throw new Error("not implemented"); + bundles.remove (name); } - void setDefaultLocale(Locale l) + void setDefaultLocale(Locale loc) { - throw new Error("not implemented"); + defaultLocale = loc; } public Locale getDefaultLocale() { - throw new Error("not implemented"); + return defaultLocale; } } // class UIDefaults |