2005-09-15  Lillian Angel  <[EMAIL PROTECTED]>

        * javax/swing/plaf/basic/BasicComboBoxRenderer.java
        (getListCellRendererComponent): Added code in to check if string
        is larger than comboBox. If it is, the string is truncated and
        '...' is drawn at the end of it.
        * javax/swing/plaf/basic/BasicComboBoxUI.java
        (getDefaultSize): Initially too small, still not fully 
        implemented.
        (getLargestItemSize): Made private, not in API.
        (minimumLayoutSize): Implemented properly.
        (intervalAdded): ComboBox should not be resized with every new
        component. This is fixed.

Index: javax/swing/plaf/basic/BasicComboBoxRenderer.java
===================================================================
RCS file: /cvsroot/classpath/classpath/javax/swing/plaf/basic/BasicComboBoxRenderer.java,v
retrieving revision 1.4
diff -u -r1.4 BasicComboBoxRenderer.java
--- javax/swing/plaf/basic/BasicComboBoxRenderer.java	2 Jul 2005 20:32:50 -0000	1.4
+++ javax/swing/plaf/basic/BasicComboBoxRenderer.java	15 Sep 2005 19:51:33 -0000
@@ -40,12 +40,16 @@
 
 import java.awt.Component;
 import java.awt.Dimension;
+import java.awt.FontMetrics;
 import java.io.Serializable;
 
 import javax.swing.JLabel;
 import javax.swing.JList;
 import javax.swing.ListCellRenderer;
 import javax.swing.SwingConstants;
+import javax.swing.SwingUtilities;
 import javax.swing.UIDefaults;
 import javax.swing.UIManager;
 import javax.swing.border.Border;
@@ -100,7 +104,28 @@
                                                 boolean cellHasFocus)
   {
     String s = value.toString();
-    setText(s);
+    
+    // String maybe larger than comboBox.
+    FontMetrics fm = getToolkit().getFontMetrics(list.getFont());
+    int strWidth = SwingUtilities.computeStringWidth(fm, s);
+    int cbWidth = getSize().width;
+    if (cbWidth != 0 && strWidth > cbWidth)
+      {
+        char[] str = s.toCharArray();
+        int currWidth = 0;
+        int i = 0;
+        String postStr = "... ";
+        cbWidth -= SwingUtilities.computeStringWidth(fm, postStr);
+        while (i < str.length && currWidth < cbWidth)
+          {
+            ++i;
+            currWidth = SwingUtilities.computeStringWidth(fm, new String(str, 0, i));
+          }
+        setText(new String(str, 0, i)  + postStr);
+      }
+    else   
+      setText(s);
+    
     setOpaque(true);
 
     UIDefaults defaults = UIManager.getLookAndFeelDefaults();
Index: javax/swing/plaf/basic/BasicComboBoxUI.java
===================================================================
RCS file: /cvsroot/classpath/classpath/javax/swing/plaf/basic/BasicComboBoxUI.java,v
retrieving revision 1.11
diff -u -r1.11 BasicComboBoxUI.java
--- javax/swing/plaf/basic/BasicComboBoxUI.java	13 Sep 2005 21:10:50 -0000	1.11
+++ javax/swing/plaf/basic/BasicComboBoxUI.java	15 Sep 2005 19:51:33 -0000
@@ -844,7 +844,8 @@
    */
   protected Dimension getDefaultSize()
   {
-    return new Dimension(6, 17);
+    // FIXME: Not implemented properly.
+    return new Dimension(100, 20);
   }
 
   /**
@@ -853,7 +854,7 @@
    *
    * @return dimensions of the largest item in the combo box.
    */
-  protected Dimension getLargestItemSize()
+  private Dimension getLargestItemSize()
   {
     ComboBoxModel model = comboBox.getModel();
     int numItems = model.getSize();
@@ -962,7 +963,26 @@
 
     public Dimension minimumLayoutSize(Container parent)
     {
-      return preferredLayoutSize(parent);
+      Dimension minSize = getDefaultSize();
+      ComboBoxModel model = comboBox.getModel();
+      int numItems = model.getSize();
+
+      if (numItems == 0)
+          return minSize;
+
+      ListCellRenderer renderer = comboBox.getRenderer();
+
+      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);
+
+      if (comp.getPreferredSize().width < minSize.width)
+        minSize =  comp.getMinimumSize();
+        }
+      return minSize;
     }
 
     /**
@@ -1105,25 +1125,17 @@
      */
     public void intervalAdded(ListDataEvent e)
     {
-      // must determine if the size of the combo box should change
-      int start = e.getIndex0();
-      int end = e.getIndex1();
-
       ComboBoxModel model = comboBox.getModel();
       ListCellRenderer renderer = comboBox.getRenderer();
 
       if (largestItemSize == null)
-	largestItemSize = new Dimension(0, 0);
+        largestItemSize = getLargestItemSize();
+      if (largestItemSize.width < getDefaultSize().width)
+        largestItemSize.width = getDefaultSize().width;
+      if (largestItemSize.height < getDefaultSize().height)
+        largestItemSize.height = getDefaultSize().height;
 
-      for (int i = start; i < end; i++)
-        {
-	  Object item = model.getElementAt(i);
-	  Component comp = renderer.getListCellRendererComponent(new JList(),
-	                                                         item, -1,
-	                                                         false, false);
-	  if (comp.getPreferredSize().getWidth() > largestItemSize.getWidth())
-	    largestItemSize = comp.getPreferredSize();
-        }
+      comboBox.repaint();
     }
 
     /**
_______________________________________________
Classpath-patches mailing list
[email protected]
http://lists.gnu.org/mailman/listinfo/classpath-patches

Reply via email to