### Eclipse Workspace Patch 1.0
#P org.eclipse.jface.databinding
Index: src/org/eclipse/jface/databinding/viewers/ObservableSetTreeContentProvider.java
===================================================================
RCS file: /cvsroot/eclipse/org.eclipse.jface.databinding/src/org/eclipse/jface/databinding/viewers/ObservableSetTreeContentProvider.java,v
retrieving revision 1.3
diff -u -r1.3 ObservableSetTreeContentProvider.java
--- src/org/eclipse/jface/databinding/viewers/ObservableSetTreeContentProvider.java 29 Apr 2008 01:44:21 -0000 1.3
+++ src/org/eclipse/jface/databinding/viewers/ObservableSetTreeContentProvider.java 22 Jul 2008 22:53:50 -0000
@@ -7,7 +7,7 @@
*
* Contributors:
* Matthew Hall - initial API and implementation (bug 207858)
- * Matthew Hall - bug 226765
+ * Matthew Hall - bugs 226765, 222991
*******************************************************************************/
package org.eclipse.jface.databinding.viewers;
@@ -22,6 +22,7 @@
import org.eclipse.core.databinding.observable.set.ISetChangeListener;
import org.eclipse.core.databinding.observable.set.SetChangeEvent;
import org.eclipse.jface.internal.databinding.viewers.ObservableCollectionTreeContentProvider;
+import org.eclipse.jface.internal.databinding.viewers.ViewerElementSet;
import org.eclipse.jface.viewers.AbstractTreeViewer;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.Viewer;
@@ -58,27 +59,44 @@
if (isViewerDisposed())
return;
- Set removals = event.diff.getRemovals();
- if (!removals.isEmpty()) {
- viewerUpdater.remove(parentElement, removals.toArray());
- for (Iterator iterator = removals.iterator(); iterator
- .hasNext();) {
- Object child = iterator.next();
- TreeNode childNode = getExistingNode(child);
- if (childNode != null)
- childNode.removeParent(parentElement);
- }
+ Set localAdditions = event.diff.getAdditions();
+ Set localRemovals = event.diff.getRemovals();
+
+ Set knownElementAdditions = ViewerElementSet
+ .withComparer(comparer);
+ knownElementAdditions.addAll(localAdditions);
+ knownElementAdditions.removeAll(knownElements);
+
+ Set knownElementRemovals = findPendingRemovals(parentElement,
+ localRemovals);
+ knownElementRemovals.retainAll(knownElements);
+
+ knownElements.addAll(knownElementAdditions);
+ if (realizedElements != null) {
+ realizedElements.removeAll(knownElementRemovals);
+ }
+
+ for (Iterator iterator = localAdditions.iterator(); iterator
+ .hasNext();) {
+ Object child = iterator.next();
+ getOrCreateNode(child).addParent(parentElement);
+ }
+
+ viewerUpdater.add(parentElement, localAdditions.toArray());
+ viewerUpdater.remove(parentElement, localRemovals.toArray());
+
+ for (Iterator iterator = localRemovals.iterator(); iterator
+ .hasNext();) {
+ Object child = iterator.next();
+ TreeNode childNode = getExistingNode(child);
+ if (childNode != null)
+ childNode.removeParent(parentElement);
}
- Set additions = event.diff.getAdditions();
- if (!additions.isEmpty()) {
- for (Iterator iterator = additions.iterator(); iterator
- .hasNext();) {
- Object child = iterator.next();
- getOrCreateNode(child).addParent(parentElement);
- }
- viewerUpdater.add(parentElement, additions.toArray());
+ if (realizedElements != null) {
+ realizedElements.addAll(knownElementAdditions);
}
+ knownElements.removeAll(knownElementRemovals);
}
}
@@ -113,10 +131,10 @@
* @param structureAdvisor
* an advisor that will be consulted from the implementations of
* the {@link #getParent(Object)} and
- * {@link #hasChildren(Object)} methods, or null
- * if no advisor is available. It is recommended that clients
- * pass a non-null advisor if they can provide additional
- * structural information about the tree.
+ * {@link #hasChildren(Object)} methods, or null if
+ * no advisor is available. It is recommended that clients pass a
+ * non-null advisor if they can provide additional structural
+ * information about the tree.
*/
public ObservableSetTreeContentProvider(IObservableFactory setFactory,
TreeStructureAdvisor structureAdvisor) {
@@ -159,4 +177,16 @@
public IObservableSet getKnownElements() {
return impl.getKnownElements();
}
+
+ /**
+ * Returns the set of known elements which have been realized in the viewer.
+ * Clients may track this set in order to perform custom actions on elements
+ * while they are known to be present in the viewer.
+ *
+ * @return the set of known elements which have been realized in the viewer.
+ * @since 1.3
+ */
+ public IObservableSet getRealizedElements() {
+ return impl.getRealizedElements();
+ }
}
\ No newline at end of file
Index: src/org/eclipse/jface/databinding/viewers/ObservableListTreeContentProvider.java
===================================================================
RCS file: /cvsroot/eclipse/org.eclipse.jface.databinding/src/org/eclipse/jface/databinding/viewers/ObservableListTreeContentProvider.java,v
retrieving revision 1.4
diff -u -r1.4 ObservableListTreeContentProvider.java
--- src/org/eclipse/jface/databinding/viewers/ObservableListTreeContentProvider.java 29 Apr 2008 01:44:21 -0000 1.4
+++ src/org/eclipse/jface/databinding/viewers/ObservableListTreeContentProvider.java 22 Jul 2008 22:53:50 -0000
@@ -7,7 +7,7 @@
*
* Contributors:
* Matthew Hall - initial API and implementation (bug 207858)
- * Matthew Hall - bug 226765
+ * Matthew Hall - bugs 226765, 222991
*******************************************************************************/
package org.eclipse.jface.databinding.viewers;
@@ -61,29 +61,59 @@
if (isViewerDisposed())
return;
- final Set removals = ViewerElementSet.withComparer(comparer);
+ // Determine which elements are being added and removed
+ final Set localKnownElementAdditions = ViewerElementSet
+ .withComparer(comparer);
+ final Set localKnownElementRemovals = ViewerElementSet
+ .withComparer(comparer);
event.diff.accept(new ListDiffVisitor() {
- public void handleAdd(int index, Object child) {
- // adds to known elements if new element
- getOrCreateNode(child).addParent(parentElement);
+ public void handleAdd(int index, Object element) {
+ localKnownElementAdditions.add(element);
+ }
+
+ public void handleRemove(int index, Object element) {
+ localKnownElementRemovals.add(element);
+ }
+
+ public void handleMove(int oldIndex, int newIndex,
+ Object element) {
+ // ignore
+ }
+ });
+ localKnownElementRemovals.removeAll(event.getObservableList());
+
+ Set knownElementAdditions = ViewerElementSet
+ .withComparer(comparer);
+ knownElementAdditions.addAll(localKnownElementAdditions);
+ knownElementAdditions.removeAll(knownElements);
+
+ Set knownElementRemovals = findPendingRemovals(parentElement,
+ localKnownElementRemovals);
+ knownElementRemovals.retainAll(knownElements);
+
+ knownElements.addAll(knownElementAdditions);
+ if (realizedElements != null) {
+ realizedElements.removeAll(knownElementRemovals);
+ }
+
+ for (Iterator it = localKnownElementAdditions.iterator(); it
+ .hasNext();) {
+ getOrCreateNode(it.next()).addParent(parentElement);
+ }
+ event.diff.accept(new ListDiffVisitor() {
+ public void handleAdd(int index, Object child) {
viewerUpdater.insert(parentElement, child, index);
}
public void handleRemove(int index, Object child) {
viewerUpdater.remove(parentElement, child, index);
-
- removals.add(child);
}
public void handleReplace(int index, Object oldChild,
Object newChild) {
- getOrCreateNode(newChild).addParent(parentElement);
-
viewerUpdater.replace(parentElement, oldChild,
newChild, index);
-
- removals.add(oldChild);
}
public void handleMove(int oldIndex, int newIndex,
@@ -93,16 +123,18 @@
}
});
- // For each removed element, do not remove node's parent if the
- // element is still present elsewhere in the list.
- removals.removeAll(event.getObservableList());
- for (Iterator iterator = removals.iterator(); iterator
+ for (Iterator it = localKnownElementRemovals.iterator(); it
.hasNext();) {
- TreeNode node = getExistingNode(iterator.next());
- if (node != null)
- // removes from known elements if last parent
+ TreeNode node = getExistingNode(it.next());
+ if (node != null) {
node.removeParent(parentElement);
+ }
}
+
+ if (realizedElements != null) {
+ realizedElements.addAll(knownElementAdditions);
+ }
+ knownElements.removeAll(knownElementRemovals);
}
}
@@ -137,10 +169,10 @@
* @param structureAdvisor
* an advisor that will be consulted from the implementations of
* the {@link #getParent(Object)} and
- * {@link #hasChildren(Object)} methods, or null
- * if no advisor is available. It is recommended that clients
- * pass a non-null advisor if they can provide additional
- * structural information about the tree.
+ * {@link #hasChildren(Object)} methods, or null if
+ * no advisor is available. It is recommended that clients pass a
+ * non-null advisor if they can provide additional structural
+ * information about the tree.
*/
public ObservableListTreeContentProvider(IObservableFactory listFactory,
TreeStructureAdvisor structureAdvisor) {
@@ -183,4 +215,16 @@
public IObservableSet getKnownElements() {
return impl.getKnownElements();
}
+
+ /**
+ * Returns the set of known elements which have been realized in the viewer.
+ * Clients may track this set in order to perform custom actions on elements
+ * while they are known to be present in the viewer.
+ *
+ * @return the set of known elements which have been realized in the viewer.
+ * @since 1.3
+ */
+ public IObservableSet getRealizedElements() {
+ return impl.getRealizedElements();
+ }
}
\ No newline at end of file
Index: src/org/eclipse/jface/databinding/viewers/ObservableListContentProvider.java
===================================================================
RCS file: /cvsroot/eclipse/org.eclipse.jface.databinding/src/org/eclipse/jface/databinding/viewers/ObservableListContentProvider.java,v
retrieving revision 1.12
diff -u -r1.12 ObservableListContentProvider.java
--- src/org/eclipse/jface/databinding/viewers/ObservableListContentProvider.java 29 Apr 2008 01:44:21 -0000 1.12
+++ src/org/eclipse/jface/databinding/viewers/ObservableListContentProvider.java 22 Jul 2008 22:53:50 -0000
@@ -8,7 +8,7 @@
* Contributors:
* IBM Corporation - initial API and implementation
* Tom Schindl - bugfix in: 214355
- * Matthew Hall - bugs 215531, 226765
+ * Matthew Hall - bugs 215531, 226765, 222991
*******************************************************************************/
package org.eclipse.jface.databinding.viewers;
@@ -64,26 +64,44 @@
}
public void handleListChange(ListChangeEvent event) {
- if (isViewerDisposed())
+ if (isViewerDisposed()) {
return;
- final Set removals = ViewerElementSet.withComparer(comparer);
+ }
+
+ // Determine which elements were added and removed
+ final Set knownElementAdditions = ViewerElementSet
+ .withComparer(comparer);
+ final Set knownElementRemovals = ViewerElementSet
+ .withComparer(comparer);
+ event.diff.accept(new ListDiffVisitor() {
+ public void handleAdd(int index, Object element) {
+ knownElementAdditions.add(element);
+ }
+
+ public void handleRemove(int index, Object element) {
+ knownElementRemovals.add(element);
+ }
+ });
+ knownElementAdditions.removeAll(knownElements);
+ knownElementRemovals.removeAll(event.getObservableList());
+
+ knownElements.addAll(knownElementAdditions);
+ if (realizedElements != null) {
+ realizedElements.removeAll(knownElementRemovals);
+ }
event.diff.accept(new ListDiffVisitor() {
public void handleAdd(int index, Object element) {
- knownElements.add(element);
viewerUpdater.insert(element, index);
}
public void handleRemove(int index, Object element) {
viewerUpdater.remove(element, index);
- removals.add(element);
}
public void handleReplace(int index, Object oldElement,
Object newElement) {
- knownElements.add(newElement);
viewerUpdater.replace(oldElement, newElement, index);
- removals.add(oldElement);
}
public void handleMove(int oldIndex, int newIndex,
@@ -92,10 +110,10 @@
}
});
- // For each removed element, do not remove from known elements if
- // the element is still present elsewhere in the list.
- removals.removeAll(event.getObservableList());
- knownElements.removeAll(removals);
+ if (realizedElements != null) {
+ realizedElements.addAll(knownElementAdditions);
+ }
+ knownElements.removeAll(knownElementRemovals);
}
}
@@ -130,4 +148,16 @@
public IObservableSet getKnownElements() {
return impl.getKnownElements();
}
+
+ /**
+ * Returns the set of known elements which have been realized in the viewer.
+ * Clients may track this set in order to perform custom actions on elements
+ * while they are known to be present in the viewer.
+ *
+ * @return the set of known elements which have been realized in the viewer.
+ * @since 1.3
+ */
+ public IObservableSet getRealizedElements() {
+ return impl.getRealizedElements();
+ }
}
Index: src/org/eclipse/jface/databinding/viewers/ObservableSetContentProvider.java
===================================================================
RCS file: /cvsroot/eclipse/org.eclipse.jface.databinding/src/org/eclipse/jface/databinding/viewers/ObservableSetContentProvider.java,v
retrieving revision 1.14
diff -u -r1.14 ObservableSetContentProvider.java
--- src/org/eclipse/jface/databinding/viewers/ObservableSetContentProvider.java 29 Apr 2008 01:44:21 -0000 1.14
+++ src/org/eclipse/jface/databinding/viewers/ObservableSetContentProvider.java 22 Jul 2008 22:53:50 -0000
@@ -8,7 +8,7 @@
* Contributors:
* IBM Corporation - initial API and implementation
* Brad Reynolds - bug 116920
- * Matthew Hall - bugs 215531, 226765
+ * Matthew Hall - bugs 215531, 226765, 222991
*******************************************************************************/
package org.eclipse.jface.databinding.viewers;
@@ -63,12 +63,16 @@
return;
Set removals = event.diff.getRemovals();
- viewerUpdater.remove(removals.toArray());
- knownElements.removeAll(removals);
-
Set additions = event.diff.getAdditions();
+
knownElements.addAll(additions);
+ realizedElements.removeAll(removals);
+
+ viewerUpdater.remove(removals.toArray());
viewerUpdater.add(additions.toArray());
+
+ realizedElements.addAll(additions);
+ knownElements.removeAll(removals);
}
}
@@ -103,4 +107,16 @@
public IObservableSet getKnownElements() {
return impl.getKnownElements();
}
+
+ /**
+ * Returns the set of known elements which have been realized in the viewer.
+ * Clients may track this set in order to perform custom actions on elements
+ * while they are known to be present in the viewer.
+ *
+ * @return the set of known elements which have been realized in the viewer.
+ * @since 1.3
+ */
+ public IObservableSet getRealizedElements() {
+ return impl.getRealizedElements();
+ }
}
Index: src/org/eclipse/jface/internal/databinding/viewers/ObservableCollectionTreeContentProvider.java
===================================================================
RCS file: /cvsroot/eclipse/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/viewers/ObservableCollectionTreeContentProvider.java,v
retrieving revision 1.6
diff -u -r1.6 ObservableCollectionTreeContentProvider.java
--- src/org/eclipse/jface/internal/databinding/viewers/ObservableCollectionTreeContentProvider.java 2 Jul 2008 18:00:42 -0000 1.6
+++ src/org/eclipse/jface/internal/databinding/viewers/ObservableCollectionTreeContentProvider.java 22 Jul 2008 22:53:50 -0000
@@ -7,11 +7,13 @@
*
* Contributors:
* Matthew Hall - initial API and implementation (bug 207858)
- * Matthew Hall - bugs 226765, 239015
+ * Matthew Hall - bugs 226765, 239015, 222991
******************************************************************************/
package org.eclipse.jface.internal.databinding.viewers;
+import java.util.Collection;
+import java.util.Collections;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
@@ -49,21 +51,40 @@
ITreeContentProvider {
private Realm realm;
+ private Display display;
+
private IObservableValue viewerObservable;
/**
+ * Element comparer used by the viewer (may be null).
+ */
+ protected IElementComparer comparer;
+
+ private IObservableFactory elementSetFactory;
+
+ /**
* Interfaces for sending updates to the viewer.
*/
protected TreeViewerUpdater viewerUpdater;
/**
- * Element comparer used by the viewer (may be null).
+ * Observable set of all elements known to the content provider. Subclasses
+ * must add new elements to this set before adding them to the
+ * viewer, and must remove old elements from this set after removing
+ * them from the viewer.
*/
- protected IElementComparer comparer;
-
- private IObservableSet knownElements;
+ protected IObservableSet knownElements;
private IObservableSet unmodifiableKnownElements;
+ /**
+ * Observable set of known elements which have been realized in the viewer.
+ * Subclasses must add new elements to this set after adding them to
+ * the viewer, and must remove old elements from this set before
+ * removing them from the viewer.
+ */
+ protected IObservableSet realizedElements;
+ private IObservableSet unmodifiableRealizedElements;
+
private IObservableFactory /* */collectionFactory;
private Map /*