classpath-patches
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[cp-patches] FYI: ComboBox fixes


From: David Gilbert
Subject: [cp-patches] FYI: ComboBox fixes
Date: Wed, 19 Oct 2005 15:56:35 +0100
User-agent: Mozilla Thunderbird 1.0.6 (X11/20050728)

This patch (committed) fixes most of the failing Mauve tests for the combo box 
classes:

2005-10-19  David Gilbert  <address@hidden>

        * javax/swing/plaf/basic/BasicArrowButton.java
        (buttonBorder): removed,
        (BasicArrowButton): don't set border, use default border,
        * javax/swing/plaf/basic/BasicComboBoxUI.java
        (configureArrowButton): don't set margin here,
        (getPreferredSize): added comment,
        (getMinimumSize): icon width is the same as the display area height,
        (getDefaultSize): return size of space char plus 1 pixel margin,
        (getDisplaySize): take into account the prototype display value, if
        there is one,
        * javax/swing/plaf/basic/BasicLookAndFeel.java
        (initComponentDefaults): updated 'Button.margin' default,
        * javax/swing/plaf/metal/MetalComboBoxButton.java
        (MetalComboBoxButton(JComboBox, Icon, boolean, CellRendererPane,
        JList)): check for null JComboBox, don't set margin here,
        * javax/swing/plaf/metal/MetalComboBoxUI.java
        (createArrowButton): set margin,
        (getMinimumSize): reimplemented,
        * javax/swing/plaf/metal/MetalLookAndFeel.java
        (initComponentDefaults): changed 'Button.margin' default to from Insets
        to InsetsUIResource.

Regards,

Dave
Index: javax/swing/plaf/basic/BasicArrowButton.java
===================================================================
RCS file: 
/cvsroot/classpath/classpath/javax/swing/plaf/basic/BasicArrowButton.java,v
retrieving revision 1.14
diff -u -r1.14 BasicArrowButton.java
--- javax/swing/plaf/basic/BasicArrowButton.java        19 Sep 2005 16:53:46 
-0000      1.14
+++ javax/swing/plaf/basic/BasicArrowButton.java        19 Oct 2005 14:28:10 
-0000
@@ -98,48 +98,6 @@
    */
   transient Color highlight = Color.WHITE;
 
-  /** The border around the ArrowButton. */
-  private transient Border buttonBorder = new Border()
-    {
-      public Insets getBorderInsets(Component c)
-      {
-       return new Insets(2, 2, 2, 2);
-      }
-
-      public boolean isBorderOpaque()
-      {
-       return true;
-      }
-
-      public void paintBorder(Component c, Graphics g, int x, int y, int w,
-                              int h)
-      {
-        Color saved = g.getColor();
-        AbstractButton b = (AbstractButton) c;
-        if (b.getModel().isPressed())
-          {
-            g.setColor(darkShadow);
-            g.drawRect(x, y, x + w - 1, y + h - 1);
-          }
-        else
-          {
-            g.setColor(highlight);
-            g.drawLine(x + 1, y + 1, x + w - 3, y + 1);
-            g.drawLine(x + 1, y + 1, x + 1, y + h - 2);
-
-            g.setColor(shadow);
-            g.drawLine(x + 1, y + h - 2, x + w - 1, y + h - 2);
-            g.drawLine(x + w - 2, y + 1, x + w - 2, y + h - 2);
-
-            g.setColor(darkShadow);
-            g.drawLine(x, y + h - 1, x + w - 1, y + h - 1);
-            g.drawLine(x + w - 1, y, x + w - 1, y + h - 1);
-
-            g.setColor(saved);
-          }
-      }
-    };
-
   /**
    * Creates a new BasicArrowButton object.
    *
@@ -148,7 +106,6 @@
   public BasicArrowButton(int direction)
   {
     super();
-    setBorder(buttonBorder);
     setDirection(direction);
   }
 
Index: javax/swing/plaf/basic/BasicComboBoxUI.java
===================================================================
RCS file: 
/cvsroot/classpath/classpath/javax/swing/plaf/basic/BasicComboBoxUI.java,v
retrieving revision 1.25
diff -u -r1.25 BasicComboBoxUI.java
--- javax/swing/plaf/basic/BasicComboBoxUI.java 18 Oct 2005 15:27:55 -0000      
1.25
+++ javax/swing/plaf/basic/BasicComboBoxUI.java 19 Oct 2005 14:28:11 -0000
@@ -43,6 +43,7 @@
 import java.awt.Container;
 import java.awt.Dimension;
 import java.awt.Font;
+import java.awt.FontMetrics;
 import java.awt.Graphics;
 import java.awt.Insets;
 import java.awt.LayoutManager;
@@ -556,7 +557,6 @@
   {
     arrowButton.setEnabled(comboBox.isEnabled());
     arrowButton.setFont(comboBox.getFont());
-    arrowButton.setMargin(new Insets(0, 0, 0, 0));
   }
 
   /**
@@ -651,6 +651,9 @@
    */
   public Dimension getPreferredSize(JComponent c)
   {
+    // note:  overriding getMinimumSize() (for example in the MetalComboBoxUI 
+    // class) affects the getPreferredSize() result, so it seems logical that
+    // this method is implemented by delegating to the getMinimumSize() method
     return getMinimumSize(c);
   }
 
@@ -665,9 +668,8 @@
   public Dimension getMinimumSize(JComponent c)
   {
     Dimension d = getDisplaySize();
-    Dimension arrowDim = arrowButton.getPreferredSize();
-    Dimension result = new Dimension(d.width + arrowDim.width, 
-            Math.max(d.height, arrowDim.height));
+    int arrowButtonWidth = d.height;
+    Dimension result = new Dimension(d.width + arrowButtonWidth, d.height);
     return result;
   }
 
@@ -828,15 +830,24 @@
   }
 
   /**
-   * Returns default size for the combo box that doesn't contain any elements
-   * in it
+   * Returns the default size for the display area of a combo box that does 
+   * not contain any elements.  This method returns the width and height of
+   * a single space in the current font, plus a margin of 1 pixel. 
    *
-   * @return Default size of the combo box with no elements in it.
+   * @return The default display size.
+   * 
+   * @see #getDisplaySize()
    */
   protected Dimension getDefaultSize()
   {
-    // FIXME: Not implemented properly.
-    return new Dimension(100, 5);
+    // There is nothing in the spec to say how this method should be
+    // implemented...so I've done some guessing, written some Mauve tests,
+    // and written something that gives dimensions that are close to the 
+    // reference implementation.
+    FontMetrics fm = comboBox.getFontMetrics(comboBox.getFont());
+    int w = fm.charWidth(' ') + 2;
+    int h = fm.getHeight() + 2;
+    return new Dimension(w, h);
   }
 
   /**
@@ -847,40 +858,52 @@
    */
   protected Dimension getDisplaySize()
   {
-    ComboBoxModel model = comboBox.getModel();
-    int numItems = model.getSize();
-
-    // if combo box doesn't have any items then simply
-    // return its default size
-    if (numItems == 0)
+    Object prototype = comboBox.getPrototypeDisplayValue();
+    if (prototype != null)
       {
-       displaySize = getDefaultSize();
-       return displaySize;
+        // calculate result based on prototype
+        ListCellRenderer renderer = comboBox.getRenderer();
+        Component comp = renderer.getListCellRendererComponent(listBox, 
+                prototype, -1, false, false);
+        Dimension compSize = comp.getPreferredSize();
+        compSize.width += 2;  // add 1 pixel margin around area
+        compSize.height += 2;
+        return compSize;
       }
+    else
+      {
+        ComboBoxModel model = comboBox.getModel();
+        int numItems = model.getSize();
+
+        // if combo box doesn't have any items then simply
+        // return its default size
+        if (numItems == 0)
+          {
+            displaySize = getDefaultSize();
+            return displaySize;
+          }
 
-    Dimension size = new Dimension(0, 0);
+        Dimension size = new Dimension(0, 0);
 
-    // ComboBox's display size should be equal to the 
-    // size of the largest item in the combo box. 
-    ListCellRenderer renderer = comboBox.getRenderer();
-
-    // FIXME: use the JComboBox.getPrototypeDisplayValue() if there is
-    // one
-    for (int i = 0; i < numItems; i++)
-      {
-        Object item = model.getElementAt(i);
-        String s = item.toString();
-        Component comp = renderer.getListCellRendererComponent(listBox, item,
-            -1, false, false);
+        // ComboBox's display size should be equal to the 
+        // size of the largest item in the combo box. 
+        ListCellRenderer renderer = comboBox.getRenderer();
 
-        Dimension compSize = comp.getPreferredSize();
-        if (compSize.width > size.width)
-          size.width = compSize.width;
-        if (compSize.height > size.height)
-          size.height = compSize.height;
+        for (int i = 0; i < numItems; i++)
+          {
+            Object item = model.getElementAt(i);
+            Component comp = renderer.getListCellRendererComponent(listBox, 
+                    item, -1, false, false);
+
+            Dimension compSize = comp.getPreferredSize();
+            if (compSize.width + 2 > size.width)
+              size.width = compSize.width + 2;
+            if (compSize.height + 2 > size.height)
+              size.height = compSize.height + 2;
+          }
+        displaySize = size;
+        return displaySize;
       }
-    displaySize = size;
-    return displaySize;
   }
 
   /**
Index: javax/swing/plaf/basic/BasicLookAndFeel.java
===================================================================
RCS file: 
/cvsroot/classpath/classpath/javax/swing/plaf/basic/BasicLookAndFeel.java,v
retrieving revision 1.63
diff -u -r1.63 BasicLookAndFeel.java
--- javax/swing/plaf/basic/BasicLookAndFeel.java        18 Oct 2005 17:48:03 
-0000      1.63
+++ javax/swing/plaf/basic/BasicLookAndFeel.java        19 Oct 2005 14:28:13 
-0000
@@ -273,7 +273,7 @@
       "Button.foreground", new ColorUIResource(Color.BLACK),
       "Button.highlight", new ColorUIResource(Color.WHITE),
       "Button.light", new ColorUIResource(Color.LIGHT_GRAY),
-      "Button.margin", new InsetsUIResource(2, 2, 2, 2),
+      "Button.margin", new InsetsUIResource(2, 14, 2, 14),
       "Button.shadow", new ColorUIResource(Color.GRAY),
       "Button.textIconGap", new Integer(4),
       "Button.textShiftOffset", new Integer(0),
Index: javax/swing/plaf/metal/MetalComboBoxButton.java
===================================================================
RCS file: 
/cvsroot/classpath/classpath/javax/swing/plaf/metal/MetalComboBoxButton.java,v
retrieving revision 1.5
diff -u -r1.5 MetalComboBoxButton.java
--- javax/swing/plaf/metal/MetalComboBoxButton.java     17 Oct 2005 10:02:52 
-0000      1.5
+++ javax/swing/plaf/metal/MetalComboBoxButton.java     19 Oct 2005 14:28:14 
-0000
@@ -100,12 +100,13 @@
       CellRendererPane pane, JList list)
   {
     super();
+    if (cb == null)
+      throw new NullPointerException("Null 'cb' argument");
     comboBox = cb;
     comboIcon = i;
     iconOnly = onlyIcon;
     listBox = list;
     rendererPane = pane;
-    setMargin(new Insets(0, 0, 0, 0));
   }
   
   /**
Index: javax/swing/plaf/metal/MetalComboBoxUI.java
===================================================================
RCS file: 
/cvsroot/classpath/classpath/javax/swing/plaf/metal/MetalComboBoxUI.java,v
retrieving revision 1.6
diff -u -r1.6 MetalComboBoxUI.java
--- javax/swing/plaf/metal/MetalComboBoxUI.java 19 Oct 2005 13:46:02 -0000      
1.6
+++ javax/swing/plaf/metal/MetalComboBoxUI.java 19 Oct 2005 14:28:14 -0000
@@ -41,6 +41,7 @@
 import java.awt.Container;
 import java.awt.Dimension;
 import java.awt.Graphics;
+import java.awt.Insets;
 import java.awt.LayoutManager;
 import java.awt.Rectangle;
 import java.awt.event.MouseEvent;
@@ -49,6 +50,7 @@
 
 import javax.swing.CellRendererPane;
 import javax.swing.ComboBoxEditor;
+import javax.swing.Icon;
 import javax.swing.JButton;
 import javax.swing.JComboBox;
 import javax.swing.JComponent;
@@ -210,8 +212,10 @@
    */
   protected JButton createArrowButton()
   {
-    return new MetalComboBoxButton(comboBox, new MetalComboBoxIcon(), 
+    JButton button = new MetalComboBoxButton(comboBox, new 
MetalComboBoxIcon(), 
             new CellRendererPane(), listBox);  
+    button.setMargin(new Insets(0, 1, 1, 3));
+    return button;
   }
   
   /**
@@ -291,10 +295,15 @@
    */
   public Dimension getMinimumSize(JComponent c)
   {
-    // FIXME: this needs work
-    Dimension result = super.getMinimumSize(c);
-    result.height = result.height + 9;
-    return result;   
+    MetalComboBoxButton b = (MetalComboBoxButton) arrowButton;
+    Icon icon = b.getComboIcon();
+    Insets insets = b.getInsets();
+    Dimension d = getDisplaySize();
+    int insetsH = insets.top + insets.bottom;
+    int insetsW = insets.left + insets.right;
+    int iconWidth = icon.getIconWidth() + 6;
+    return new Dimension(d.width + insetsW + iconWidth, 
+            d.height + insetsH);
   }
   
 }
Index: javax/swing/plaf/metal/MetalLookAndFeel.java
===================================================================
RCS file: 
/cvsroot/classpath/classpath/javax/swing/plaf/metal/MetalLookAndFeel.java,v
retrieving revision 1.66
diff -u -r1.66 MetalLookAndFeel.java
--- javax/swing/plaf/metal/MetalLookAndFeel.java        17 Oct 2005 10:02:52 
-0000      1.66
+++ javax/swing/plaf/metal/MetalLookAndFeel.java        19 Oct 2005 14:28:16 
-0000
@@ -781,7 +781,7 @@
       "Button.foreground", getControlTextColor(),
       "Button.highlight", getControlHighlight(),
       "Button.light", getControlHighlight(),
-      "Button.margin", new Insets(2, 14, 2, 14),
+      "Button.margin", new InsetsUIResource(2, 14, 2, 14),
       "Button.select", getControlShadow(),
       "Button.shadow", getControlShadow(),
 

reply via email to

[Prev in Thread] Current Thread [Next in Thread]