I committed this patch. The changes to DefaultComboBoxModel are backed by a raft of
Mauve tests. The change to MetalComboBoxButton protects against a possible
NullPointerException:
2005-09-23 David Gilbert <[EMAIL PROTECTED]>
* javax/swing/DefaultComboBoxModel.java
(DefaultComboBoxModel(Object[])): set selected item,
(DefaultComboBoxModel(Vector): likewise,
(addElement): reimplemented,
(removeElementAt): update selected item,
(removeAllElements): clear selected item and fire correct event,
(setSelectedItem): update item always,
(getElementAt): return null for index out of bounds,
* javax/swing/plaf/metal/MetalComboBoxButton.java
(paintComponent): check for null selection.
Regards,
Dave Gilbert
Index: javax/swing/DefaultComboBoxModel.java
===================================================================
RCS file: /cvsroot/classpath/classpath/javax/swing/DefaultComboBoxModel.java,v
retrieving revision 1.10
diff -u -r1.10 DefaultComboBoxModel.java
--- javax/swing/DefaultComboBoxModel.java 27 Jul 2005 12:41:33 -0000
1.10
+++ javax/swing/DefaultComboBoxModel.java 23 Sep 2005 16:07:41 -0000
@@ -85,6 +85,8 @@
public DefaultComboBoxModel(Object[] items)
{
list = new Vector(Arrays.asList(items));
+ if (list.size() > 0)
+ selectedItem = list.get(0);
}
/**
@@ -96,6 +98,8 @@
public DefaultComboBoxModel(Vector vector)
{
this.list = vector;
+ if (vector.size() > 0)
+ selectedItem = vector.get(0);
}
/**
@@ -107,8 +111,17 @@
*/
public void addElement(Object object)
{
- list.add(object);
- fireIntervalAdded(this, list.size() - 1, list.size());
+ if (list.size() == 0)
+ {
+ list.add(object);
+ selectedItem = object;
+ fireContentsChanged(this, -1, -1);
+ }
+ else
+ {
+ list.add(object);
+ fireIntervalAdded(this, list.size() - 1, list.size() - 1);
+ }
}
/**
@@ -122,7 +135,17 @@
*/
public void removeElementAt(int index)
{
+ int selected = getIndexOf(selectedItem);
list.remove(index);
+ if (selected == index) // choose a new selected item
+ {
+ if (selected > 0)
+ selectedItem = getElementAt(selected - 1);
+ else
+ selectedItem = getElementAt(selected);
+
+
+ }
fireIntervalRemoved(this, index, index);
}
@@ -163,9 +186,13 @@
*/
public void removeAllElements()
{
- list.clear();
- int listSize = getSize();
- fireIntervalAdded(this, 0, listSize);
+ selectedItem = null;
+ int size = getSize();
+ if (size > 0)
+ {
+ list.clear();
+ fireIntervalRemoved(this, 0, size - 1);
+ }
}
/**
@@ -191,14 +218,9 @@
*/
public void setSelectedItem(Object object)
{
-
- // Updates the selected item only if the given object
- // is null or in the list (this is how the JDK behaves).
- if(object == null || list.contains(object)) {
- selectedItem = object;
- fireContentsChanged(this, -1, -1);
- }
-
+ selectedItem = object;
+ if(object == null || list.contains(object))
+ fireContentsChanged(this, -1, -1);
}
/**
@@ -220,6 +242,8 @@
*/
public Object getElementAt(int index)
{
+ if (index < 0 || index >= list.size())
+ return null;
return list.elementAt(index);
}
Index: javax/swing/plaf/metal/MetalComboBoxButton.java
===================================================================
RCS file:
/cvsroot/classpath/classpath/javax/swing/plaf/metal/MetalComboBoxButton.java,v
retrieving revision 1.1
diff -u -r1.1 MetalComboBoxButton.java
--- javax/swing/plaf/metal/MetalComboBoxButton.java 13 Sep 2005 21:36:03
-0000 1.1
+++ javax/swing/plaf/metal/MetalComboBoxButton.java 23 Sep 2005 16:07:44
-0000
@@ -209,7 +209,10 @@
}
else
{
- String text = comboBox.getModel().getSelectedItem().toString();
+ String text = "";
+ Object selected = comboBox.getModel().getSelectedItem();
+ if (selected != null)
+ text = selected.toString();
Rectangle bounds = comboBox.getBounds();
Rectangle innerArea = SwingUtilities.calculateInnerArea(this, null);
if (comboBox.hasFocus())
_______________________________________________
Classpath-patches mailing list
Classpath-patches@gnu.org
http://lists.gnu.org/mailman/listinfo/classpath-patches