From ccdf1a46ee4a3425bee1602ccf758a2bb9364571 Mon Sep 17 00:00:00 2001 From: Graydon Hoare Date: Tue, 18 Nov 2003 01:36:56 +0000 Subject: [PATCH] BasicDefaults.java: Rewrite to spec. 2003-11-17 Graydon Hoare * javax/swing/plaf/basic/BasicDefaults.java: Rewrite to spec. * javax/swing/UIDefaults.java: Modify to reflect rewrite. From-SVN: r73688 --- libjava/ChangeLog | 5 + libjava/javax/swing/UIDefaults.java | 349 ++++++++++++++---- .../javax/swing/plaf/basic/BasicDefaults.java | 40 +- 3 files changed, 312 insertions(+), 82 deletions(-) diff --git a/libjava/ChangeLog b/libjava/ChangeLog index 9a26ba1b012..3dcb93016e4 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,8 @@ +2003-11-17 Graydon Hoare + + * javax/swing/plaf/basic/BasicDefaults.java: Rewrite to spec. + * javax/swing/UIDefaults.java: Modify to reflect rewrite. + 2003-11-16 Tom Tromey PR libgcj/13062: diff --git a/libjava/javax/swing/UIDefaults.java b/libjava/javax/swing/UIDefaults.java index 33c184b83d9..f1f99646adf 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 diff --git a/libjava/javax/swing/plaf/basic/BasicDefaults.java b/libjava/javax/swing/plaf/basic/BasicDefaults.java index 046a7316c93..ee6575e014d 100644 --- a/libjava/javax/swing/plaf/basic/BasicDefaults.java +++ b/libjava/javax/swing/plaf/basic/BasicDefaults.java @@ -95,27 +95,27 @@ public class BasicDefaults extends UIDefaults public BasicDefaults() { // System.out.println("BasicDefaults !!!!!!!!!!!!!!!!!!!!!!!!!"); - put("JButton", new BasicButtonUI()); - put("JLabel", new BasicLabelUI()); + put("JButton", "javax.swing.plaf.basic.BasicButtonUI"); + put("JLabel", "javax.swing.plaf.basic.BasicLabelUI"); - put("JPanel", new BasicPanelUI()); - put("JCheckBox", new BasicCheckBoxUI()); - put("JRadioButton", new BasicRadioButtonUI()); - put("JToggleButton", new BasicToggleButtonUI()); - put("JOptionPane", new BasicOptionPaneUI()); - put("JList", new BasicListUI()); - put("JTree", new BasicTreeUI()); - put("JTextComponent", new BasicTextUI()); - put("JTabbedPane", new BasicTabbedPaneUI()); - put("JScrollPane", new BasicScrollPaneUI()); - put("JViewport", new BasicViewportUI()); - - put("JButton.border", new BasicBorder()); - put("JPanel.border", new PanelBorder()); - - put("JToggleButton.border", new PanelBorder()); - put("JCheckBox.border", new PanelBorder()); - put("JRadioButton.border", new PanelBorder()); + put("JPanel", "javax.swing.plaf.basic.BasicPanelUI"); + put("JCheckBox", "javax.swing.plaf.basic.BasicCheckBoxUI"); + put("JRadioButton", "javax.swing.plaf.basic.BasicRadioButtonUI"); + put("JToggleButton", "javax.swing.plaf.basic.BasicToggleButtonUI"); + put("JOptionPane", "javax.swing.plaf.basic.BasicOptionPaneUI"); + put("JList", "javax.swing.plaf.basic.BasicListUI"); + put("JTree", "javax.swing.plaf.basic.BasicTreeUI"); + put("JTextComponent", "javax.swing.plaf.basic.BasicTextUI"); + put("JTabbedPane", "javax.swing.plaf.basic.BasicTabbedPaneUI"); + put("JScrollPane", "javax.swing.plaf.basic.BasicScrollPaneUI"); + put("JViewport", "javax.swing.plaf.basic.BasicViewportUI"); + + put("JButton.border", "javax.swing.plaf.basic.BasicBorder"); + put("JPanel.border", "javax.swing.plaf.basic.PanelBorder"); + + put("JToggleButton.border", "javax.swing.plaf.basic.PanelBorder"); + put("JCheckBox.border", "javax.swing.plaf.basic.PanelBorder"); + put("JRadioButton.border", "javax.swing.plaf.basic.PanelBorder"); } } -- 2.30.2