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));
+ }
+ }
+}