Hey,

This patch now makes a few of harmony's test suites now pass on
classpath.  The main problem was that 'selected' was not being updated
in a couple of necessary methods.  I have also committed some mauve
tests (gnu.testlet.java.awt.List.testSelected.java).  The other minor
modifications were also based on harmony's test suites.  

If someone could kindly review this patch and approve and/or comment on
it, that would be great.

Thanks.
Tania

2006-07-26  Tania Bento  <[EMAIL PROTECTED]>

        * java/awt/List.java
        Initialized private variable visibleIndex to -1.
        (addItem(String, int)): If string is null, it should be
        set to the empty string.
        (addItem(String, int)): If int < -1, it should be
        set to -1.
        (delItem): If the item to be deleted was selected, the
        next item on the list automatically is selected.
        (delItems): Checks are not necessarily and all indices
        in selected should be deleted.
        (getSelectedIndex): If selected == null, 0 should be
        returned.
        (select): Updated selected.
        (deselect): Updated selected.



Index: java/awt/List.java
===================================================================
RCS file: /cvsroot/classpath/classpath/java/awt/List.java,v
retrieving revision 1.28
diff -u -r1.28 List.java
--- java/awt/List.java	13 Jul 2006 17:30:24 -0000	1.28
+++ java/awt/List.java	26 Jul 2006 14:11:35 -0000
@@ -108,7 +108,7 @@
   * @serial An index value used by <code>makeVisible()</code> and
   * <code>getVisibleIndex</code>.
   */
-private int visibleIndex;
+private int visibleIndex = -1;
 
 // The list of ItemListeners for this object.
 private ItemListener item_listeners;
@@ -116,7 +116,6 @@
 // The list of ActionListeners for this object.
 private ActionListener action_listeners;
 
-
 /*************************************************************************/
 
 /*
@@ -176,6 +175,7 @@
 
   if (GraphicsEnvironment.isHeadless())
     throw new HeadlessException ();
+  
 }
 
 /*************************************************************************/
@@ -314,12 +314,13 @@
   */
 public void
 setMultipleSelections(boolean multipleMode)
-{
+{  
   this.multipleMode = multipleMode;
 
   ListPeer peer = (ListPeer) getPeer ();
   if (peer != null)
     peer.setMultipleMode (multipleMode);
+      
 }
 
 /*************************************************************************/
@@ -519,6 +520,12 @@
 public void
 addItem(String item, int index)
 {
+  if (item == null)
+    item = ""; 
+  
+  if (index < -1)
+    index = -1;
+  
   if ((index == -1) || (index >= items.size ()))
     items.addElement (item);
   else
@@ -543,7 +550,17 @@
 public void
 delItem(int index) throws IllegalArgumentException
 {
+  boolean selected = false;
+  if (isSelected(index))
+    {
+      selected = true;
+      deselect(index);   
+    }
+  
   items.removeElementAt (index);
+  
+  if (selected)
+    select(index);
 
   ListPeer peer = (ListPeer) getPeer ();
   if (peer != null)
@@ -580,15 +597,6 @@
 public synchronized void
 delItems(int start, int end) throws IllegalArgumentException
 {
-  if ((start < 0) || (start >= items.size()))
-    throw new IllegalArgumentException("Bad list start index value: " + start);
-
-  if ((start < 0) || (start >= items.size()))
-    throw new IllegalArgumentException("Bad list start index value: " + start);
-
-  if (start > end)
-    throw new IllegalArgumentException("Start is greater than end!");
-
   // We must run the loop in reverse direction.
   for (int i = end; i >= start; --i)
     items.removeElementAt (i);
@@ -644,6 +652,8 @@
   ListPeer peer = (ListPeer) getPeer ();
   if (peer != null)
     peer.removeAll ();
+  
+  selected = new int[0];
 }
 
 /*************************************************************************/
@@ -693,8 +703,12 @@
       selected = l.getSelectedIndexes ();
     }
 
-  if (selected == null || selected.length != 1)
+  if (selected != null && selected.length != 1)
     return -1;
+  
+  if (selected == null)
+    return 0;
+  
   return selected[0];
 }
 
@@ -713,7 +727,8 @@
     {
       ListPeer l = (ListPeer) peer;
       selected = l.getSelectedIndexes ();
-    }
+    }   
+  
   return selected;
 }
 
@@ -862,13 +877,31 @@
   *
   * @param index The index of the item to select.
   */
-public synchronized void
-select(int index)
-{
-  ListPeer lp = (ListPeer)getPeer();
-  if (lp != null)
-    lp.select(index);
-}
+  public synchronized void select(int index)
+  {
+    ListPeer lp = (ListPeer) getPeer();
+    if (lp != null)
+      lp.select(index);
+
+    boolean found = false;
+    for (int i = 0; i < selected.length; i++)
+      {
+        if (selected[i] == index)
+          {
+            found = true;
+          }
+      }
+    if (! found)
+      {
+        if (! isMultipleMode())
+          selected = new int[0];
+        
+        int[] temp = new int[selected.length + 1];
+        System.arraycopy(selected, 0, temp, 0, selected.length);
+        temp[selected.length] = index;
+        selected = temp;
+      }
+  }
 
 /*************************************************************************/
 
@@ -880,9 +913,26 @@
 public synchronized void
 deselect(int index)
 {
-  ListPeer lp = (ListPeer)getPeer();
-  if (lp != null)
-    lp.deselect(index);
+  if (isSelected(index))
+    {
+      ListPeer lp = (ListPeer)getPeer();
+      if (lp != null)
+        lp.deselect(index);
+
+      int[] temp = new int[selected.length - 1];
+      for (int i = 0; i < temp.length; i++)
+        {
+          if (selected[i] != index)
+            temp[i] = selected[i];
+          else
+            {
+              System.arraycopy(selected, i + 1, temp, i, 
+                               selected.length - i - 1);
+              break;
+            }
+        }
+      selected = temp;
+    }
 }
 
 /*************************************************************************/

Reply via email to