This is the mail archive of the java-patches@gcc.gnu.org mailing list for the Java project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] javax.swing.UIDefaults implementation


hi,

this patch implements UIDefaults as per the spec (it was previously
wrong / incomplete) and modifies BasicDefaults to use it properly.

ok to commit?

-graydon


2003-11-03  Graydon Hoare  <graydon@redhat.com>

	* javax/swing/UIDefaults.java: Implement according to spec.
	* javax/swing/plaf/basic/BasicDefaults.java: Use UIDefaults properly.

Index: javax/swing/UIDefaults.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/javax/swing/UIDefaults.java,v
retrieving revision 1.4
diff -u -r1.4 UIDefaults.java
--- javax/swing/UIDefaults.java	15 Oct 2003 13:44:22 -0000	1.4
+++ javax/swing/UIDefaults.java	3 Nov 2003 21:41:24 -0000
@@ -41,9 +41,20 @@
 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 @@
  */
 public class UIDefaults extends Hashtable
 {
+
+  LinkedList bundles;
+  Set listeners;
+  Locale defaultLocale;
+
   interface ActiveValue
   {
     Object createValue(UIDefaults table);
@@ -63,12 +79,20 @@
 
   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 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)
+  {
+    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)
+  {
+    return this.get (key, getDefaultLocale ());
+  }
+
+  public Object get (Object key, Locale loc)
+  {
+    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);
+      }    
 
-  public UIDefaults(Object[] entries)
-  {
-    // XXX
-  }
-
-  public Object get(Object key)
-  {
-    // XXX Obey 1.4 specs
-    return super.get(key);
-  }
-
-  public Object get(Object key, Locale l)
-  {
-    throw new Error("not implemented");
+    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)
-  {
-    throw new Error("not implemented");
+  public void putDefaults(Object[] entries)
+  {
+    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,131 @@
 
   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 (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
Index: javax/swing/plaf/basic/BasicDefaults.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/javax/swing/plaf/basic/BasicDefaults.java,v
retrieving revision 1.4
diff -u -r1.4 BasicDefaults.java
--- javax/swing/plaf/basic/BasicDefaults.java	11 Jun 2003 13:20:40 -0000	1.4
+++ javax/swing/plaf/basic/BasicDefaults.java	3 Nov 2003 21:41:24 -0000
@@ -95,27 +95,27 @@
     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("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",      new BasicBorder());
-	put("JPanel.border",       new PanelBorder());
+	put("JButton.border",      "javax.swing.plaf.basic.BasicBorder");
+	put("JPanel.border",       "javax.swing.plaf.basic.PanelBorder");
 
-	put("JToggleButton.border", new PanelBorder());
-	put("JCheckBox.border", new PanelBorder());
-	put("JRadioButton.border", new 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");
     }
     
 }

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]