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;
*/
public class UIDefaults extends Hashtable
{
+
+ LinkedList bundles;
+ Set listeners;
+ Locale defaultLocale;
+
interface ActiveValue
{
Object createValue(UIDefaults table);
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
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)
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
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");
}
}