You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pivot.apache.org by gb...@apache.org on 2009/08/03 22:33:55 UTC

svn commit: r800549 - in /incubator/pivot/trunk: core/src/org/apache/pivot/collections/ demos/src/org/apache/pivot/demos/lists/ wtk/ wtk/src/org/apache/pivot/wtk/ wtk/test/org/apache/pivot/wtk/test/

Author: gbrown
Date: Mon Aug  3 20:33:55 2009
New Revision: 800549

URL: http://svn.apache.org/viewvc?rev=800549&view=rev
Log:
Add basic unit tests for multiple selection handling; add ImmutablePath class.

Added:
    incubator/pivot/trunk/wtk/test/org/apache/pivot/wtk/test/MultiSelectTest.java
Modified:
    incubator/pivot/trunk/core/src/org/apache/pivot/collections/Sequence.java
    incubator/pivot/trunk/demos/src/org/apache/pivot/demos/lists/MultiSelect.java
    incubator/pivot/trunk/wtk/.classpath
    incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/ListSelection.java

Modified: incubator/pivot/trunk/core/src/org/apache/pivot/collections/Sequence.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/core/src/org/apache/pivot/collections/Sequence.java?rev=800549&r1=800548&r2=800549&view=diff
==============================================================================
--- incubator/pivot/trunk/core/src/org/apache/pivot/collections/Sequence.java (original)
+++ incubator/pivot/trunk/core/src/org/apache/pivot/collections/Sequence.java Mon Aug  3 20:33:55 2009
@@ -110,6 +110,41 @@
         }
 
         /**
+         * Class representing an immutable path.
+         *
+         * @author gbrown
+         */
+        public static class ImmutablePath extends Path {
+            public ImmutablePath(Integer... elements) {
+                super(elements);
+            }
+
+            public ImmutablePath(Path path) {
+                super(path);
+            }
+
+            @Override
+            public int add(Integer item) {
+                throw new UnsupportedOperationException();
+            }
+
+            @Override
+            public void insert(Integer item, int index) {
+                throw new UnsupportedOperationException();
+            }
+
+            @Override
+            public Integer update(int index, Integer item) {
+                throw new UnsupportedOperationException();
+            }
+
+            @Override
+            public Sequence<Integer> remove(int index, int count) {
+                throw new UnsupportedOperationException();
+            }
+        }
+
+        /**
          * Adds an item to a nested sequence.
          *
          * @param sequence

Modified: incubator/pivot/trunk/demos/src/org/apache/pivot/demos/lists/MultiSelect.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/demos/src/org/apache/pivot/demos/lists/MultiSelect.java?rev=800549&r1=800548&r2=800549&view=diff
==============================================================================
--- incubator/pivot/trunk/demos/src/org/apache/pivot/demos/lists/MultiSelect.java (original)
+++ incubator/pivot/trunk/demos/src/org/apache/pivot/demos/lists/MultiSelect.java Mon Aug  3 20:33:55 2009
@@ -60,14 +60,6 @@
 
         window.open(display);
         dataListView.requestFocus();
-
-        dataListView.clearSelection();
-        dataListView.addSelectedRange(0, 4);
-        dataListView.addSelectedRange(8, 12);
-        dataListView.addSelectedRange(4, 7);
-
-        dataListView.removeSelectedRange(1, 1);
-        dataListView.removeSelectedRange(0, 0);
     }
 
     @Override

Modified: incubator/pivot/trunk/wtk/.classpath
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/wtk/.classpath?rev=800549&r1=800548&r2=800549&view=diff
==============================================================================
--- incubator/pivot/trunk/wtk/.classpath (original)
+++ incubator/pivot/trunk/wtk/.classpath Mon Aug  3 20:33:55 2009
@@ -4,5 +4,6 @@
 	<classpathentry kind="src" path="test"/>
 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
 	<classpathentry combineaccessrules="false" kind="src" path="/core"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
 	<classpathentry kind="output" path="bin"/>
 </classpath>

Modified: incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/ListSelection.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/ListSelection.java?rev=800549&r1=800548&r2=800549&view=diff
==============================================================================
--- incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/ListSelection.java (original)
+++ incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/ListSelection.java Mon Aug  3 20:33:55 2009
@@ -72,83 +72,81 @@
         Span range = normalize(start, end);
         assert(range.start >= 0);
 
-        if (range.getLength() > 0) {
-            int n = selectedRanges.getLength();
+        int n = selectedRanges.getLength();
+
+        if (n == 0) {
+            // The selection is currently empty; append the new range
+            // and add it to the added range list
+            selectedRanges.add(range);
+            addedRanges.add(range);
+        } else {
+            // Locate the lower bound of the intersection
+            int i = ArrayList.binarySearch(selectedRanges, range, START_COMPARATOR);
+            if (i < 0) {
+                i = -(i + 1);
+            }
 
-            if (n == 0) {
-                // The selection is currently empty; append the new range
-                // and add it to the added range list
+            // Merge the selection with the previous range, if necessary
+            if (i > 0) {
+                Span previousRange = selectedRanges.get(i - 1);
+                if (range.start == previousRange.end + 1) {
+                    i--;
+                }
+            }
+
+            if (i == n) {
+                // The new range starts after the last existing selection
+                // ends; append it and add it to the added range list
                 selectedRanges.add(range);
                 addedRanges.add(range);
             } else {
-                // Locate the lower bound of the intersection
-                int i = ArrayList.binarySearch(selectedRanges, range, START_COMPARATOR);
-                if (i < 0) {
-                    i = -(i + 1);
+                // Locate the upper bound of the intersection
+                int j = ArrayList.binarySearch(selectedRanges, range, END_COMPARATOR);
+                if (j < 0) {
+                    j = -(j + 1);
+                } else {
+                    j++;
                 }
 
-                // Merge the selection with the previous range, if necessary
-                if (i > 0) {
-                    Span previousRange = selectedRanges.get(i - 1);
-                    if (range.start == previousRange.end + 1) {
-                        i--;
+                // Merge the selection with the next range, if necessary
+                if (j < n) {
+                    Span nextRange = selectedRanges.get(j);
+                    if (range.end == nextRange.start - 1) {
+                        j++;
                     }
                 }
 
-                if (i == n) {
-                    // The new range starts after the last existing selection
-                    // ends; append it and add it to the added range list
-                    selectedRanges.add(range);
+                if (i == j) {
+                    selectedRanges.insert(range, i);
                     addedRanges.add(range);
                 } else {
-                    // Locate the upper bound of the intersection
-                    int j = ArrayList.binarySearch(selectedRanges, range, END_COMPARATOR);
-                    if (j < 0) {
-                        j = -(j + 1);
-                    } else {
-                        j++;
-                    }
-
-                    // Merge the selection with the next range, if necessary
-                    if (j < n) {
-                        Span nextRange = selectedRanges.get(j);
-                        if (range.end == nextRange.start - 1) {
-                            j++;
-                        }
-                    }
-
-                    if (i == j) {
-                        selectedRanges.insert(range, i);
-                        addedRanges.add(range);
-                    } else {
-                        // Create a new range representing the union of the intersecting ranges
-                        Span lowerRange = selectedRanges.get(i);
-                        Span upperRange = selectedRanges.get(j - 1);
+                    // Create a new range representing the union of the intersecting ranges
+                    Span lowerRange = selectedRanges.get(i);
+                    Span upperRange = selectedRanges.get(j - 1);
 
-                        range = new Span(Math.min(range.start, lowerRange.start),
-                            Math.max(range.end, upperRange.end));
+                    range = new Span(Math.min(range.start, lowerRange.start),
+                        Math.max(range.end, upperRange.end));
 
-                        // Add the gaps to the added list
-                        if (range.start < lowerRange.start) {
-                            addedRanges.add(new Span(range.start, lowerRange.start - 1));
-                        }
+                    // Add the gaps to the added list
+                    if (range.start < lowerRange.start) {
+                        addedRanges.add(new Span(range.start, lowerRange.start - 1));
+                    }
 
-                        for (int k = i; k < j - 1; k++) {
-                            Span selectedRange = selectedRanges.get(k);
-                            Span nextSelectedRange = selectedRanges.get(k + 1);
-                            addedRanges.add(new Span(selectedRange.end + 1, nextSelectedRange.start - 1));
-                        }
+                    for (int k = i; k < j - 1; k++) {
+                        Span selectedRange = selectedRanges.get(k);
+                        Span nextSelectedRange = selectedRanges.get(k + 1);
+                        addedRanges.add(new Span(selectedRange.end + 1, nextSelectedRange.start - 1));
+                    }
 
-                        if (range.end > upperRange.end) {
-                            addedRanges.add(new Span(upperRange.end + 1, range.end));
-                        }
+                    if (range.end > upperRange.end) {
+                        addedRanges.add(new Span(upperRange.end + 1, range.end));
+                    }
 
-                        // Remove all redundant ranges
-                        selectedRanges.update(i, range);
+                    // Remove all redundant ranges
+                    selectedRanges.update(i, range);
 
-                        if (i < j) {
-                            selectedRanges.remove(i + 1, j - i - 1);
-                        }
+                    if (i < j) {
+                        selectedRanges.remove(i + 1, j - i - 1);
                     }
                 }
             }
@@ -173,16 +171,16 @@
         Span range = normalize(start, end);
         assert(range.start >= 0);
 
-        if (range.getLength() > 0) {
-            int n = selectedRanges.getLength();
+        int n = selectedRanges.getLength();
 
-            if (n > 0) {
-                // Locate the lower bound of the intersection
-                int i = ArrayList.binarySearch(selectedRanges, range, START_COMPARATOR);
-                if (i < 0) {
-                    i = -(i + 1);
-                }
+        if (n > 0) {
+            // Locate the lower bound of the intersection
+            int i = ArrayList.binarySearch(selectedRanges, range, START_COMPARATOR);
+            if (i < 0) {
+                i = -(i + 1);
+            }
 
+            if (i < n) {
                 Span lowerRange = selectedRanges.get(i);
 
                 if (lowerRange.start < range.start
@@ -209,30 +207,32 @@
                         j++;
                     }
 
-                    Span upperRange = selectedRanges.get(j - 1);
+                    if (j > 0) {
+                        Span upperRange = selectedRanges.get(j - 1);
 
-                    Span trailingRemovedRange = null;
-                    if (range.end < upperRange.end) {
-                        // Remove the head of this range
-                        selectedRanges.update(j - 1, new Span(range.end + 1, upperRange.end));
-                        trailingRemovedRange = new Span(upperRange.start, range.end);
-                        j--;
-                    }
+                        Span trailingRemovedRange = null;
+                        if (range.end < upperRange.end) {
+                            // Remove the head of this range
+                            selectedRanges.update(j - 1, new Span(range.end + 1, upperRange.end));
+                            trailingRemovedRange = new Span(upperRange.start, range.end);
+                            j--;
+                        }
 
-                    // Remove all cleared ranges
-                    Sequence<Span> clearedRanges = selectedRanges.remove(i, j - i);
+                        // Remove all cleared ranges
+                        Sequence<Span> clearedRanges = selectedRanges.remove(i, j - i);
 
-                    // Construct the removed range list
-                    if (leadingRemovedRange != null) {
-                        removedRanges.add(leadingRemovedRange);
-                    }
+                        // Construct the removed range list
+                        if (leadingRemovedRange != null) {
+                            removedRanges.add(leadingRemovedRange);
+                        }
 
-                    for (int k = 0, c = clearedRanges.getLength(); k < c; k++) {
-                        removedRanges.add(clearedRanges.get(k));
-                    }
+                        for (int k = 0, c = clearedRanges.getLength(); k < c; k++) {
+                            removedRanges.add(clearedRanges.get(k));
+                        }
 
-                    if (trailingRemovedRange != null) {
-                        removedRanges.add(trailingRemovedRange);
+                        if (trailingRemovedRange != null) {
+                            removedRanges.add(trailingRemovedRange);
+                        }
                     }
                 }
             }

Added: incubator/pivot/trunk/wtk/test/org/apache/pivot/wtk/test/MultiSelectTest.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/wtk/test/org/apache/pivot/wtk/test/MultiSelectTest.java?rev=800549&view=auto
==============================================================================
--- incubator/pivot/trunk/wtk/test/org/apache/pivot/wtk/test/MultiSelectTest.java (added)
+++ incubator/pivot/trunk/wtk/test/org/apache/pivot/wtk/test/MultiSelectTest.java Mon Aug  3 20:33:55 2009
@@ -0,0 +1,88 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.pivot.wtk.test;
+
+import static org.junit.Assert.*;
+
+import org.apache.pivot.collections.Sequence;
+import org.apache.pivot.wtk.ListView;
+import org.apache.pivot.wtk.ListViewSelectionListener;
+import org.apache.pivot.wtk.Span;
+import org.apache.pivot.wtk.content.NumericSpinnerData;
+import org.junit.Test;
+
+public class MultiSelectTest {
+    private ListView listView1 = new ListView();
+    private ListView listView2 = new ListView();
+
+    @Test
+    public void basicTest() {
+        listView1.getListViewSelectionListeners().add(new ListViewSelectionListener() {
+            public void selectedRangeAdded(ListView listView, int rangeStart, int rangeEnd) {
+                listView2.addSelectedRange(rangeStart, rangeEnd);
+            }
+
+            public void selectedRangeRemoved(ListView listView, int rangeStart, int rangeEnd) {
+                listView2.removeSelectedRange(rangeStart, rangeEnd);
+            }
+
+            public void selectedRangesChanged(ListView listView, Sequence<Span> previousSelectedRanges) {
+                listView2.setSelectedRanges(listView1.getSelectedRanges());
+            }
+        });
+
+        NumericSpinnerData listData = new NumericSpinnerData(0, 255, 1);
+
+        listView1.setListData(listData);
+        listView1.setSelectMode(ListView.SelectMode.MULTI);
+
+        listView2.setListData(listData);
+        listView2.setSelectMode(ListView.SelectMode.MULTI);
+
+        assertEquals(listView1.addSelectedRange(0, 4).getLength(), 1);
+        assertEquals(listView1.addSelectedRange(0, 4).getLength(), 0);
+        assertEquals(listView1.addSelectedRange(8, 12).getLength(), 1);
+        assertEquals(listView1.addSelectedRange(4, 7).getLength(), 1);
+        assertEquals(listView1.removeSelectedRange(1, 1).getLength(), 1);
+        assertEquals(listView1.removeSelectedRange(0, 0).getLength(), 1);
+        assertEquals(listView1.removeSelectedRange(0, 0).getLength(), 0);
+        assertEquals(listView1.removeSelectedRange(14, 14).getLength(), 0);
+        assertEquals(listView1.addSelectedRange(16, 19).getLength(), 1);
+        assertEquals(listView1.removeSelectedRange(10, 17).getLength(), 2);
+
+        Sequence<Span> selectedRanges = listView1.getSelectedRanges();
+        assertEquals(selectedRanges.getLength(), 2);
+        assertEquals(selectedRanges.get(0), new Span(2, 9));
+        assertEquals(selectedRanges.get(1), new Span(18, 19));
+
+        assertEquals(listView1.removeSelectedRange(1, 20).getLength(), 2);
+        assertEquals(listView1.removeSelectedRange(0, 5).getLength(), 0);
+
+        compareSelectionState();
+    }
+
+    private void compareSelectionState() {
+        Sequence<Span> selectedRanges1 = listView1.getSelectedRanges();
+        Sequence<Span> selectedRanges2 = listView2.getSelectedRanges();
+
+        assertEquals(selectedRanges1.getLength(), selectedRanges2.getLength());
+
+        for (int i = 0, n = selectedRanges1.getLength(); i < n; i++) {
+            assertEquals(selectedRanges1.get(i), selectedRanges2.get(i));
+        }
+    }
+}