final Set localKnownElementAdditions = ViewerElementSet
.withComparer(comparer);
final Set localKnownElementRemovals = ViewerElementSet
.withComparer(comparer);
final boolean[] suspendRedraw = new boolean[] { false };
event.diff.accept(new ListDiffVisitor() {
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) {
suspendRedraw[0] = true;
// does not affect known elements
}
public void handleReplace(int index, Object oldElement,
Object newElement) {
suspendRedraw[0] = true;
super.handleReplace(index, oldElement, newElement);
}
});
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);
}
if (suspendRedraw[0])
viewer.getControl().setRedraw(false);
try {
event.diff.accept(new ListDiffVisitor() {
public void handleAdd(int index, Object child) {
viewerUpdater.insert(parentElement, child, index);
}
public void handleRemove(int index, Object child) {