### Eclipse Workspace Patch 1.0 #P org.eclipse.jface Index: src/org/eclipse/jface/viewers/AbstractTreeViewer.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jface/src/org/eclipse/jface/viewers/AbstractTreeViewer.java,v retrieving revision 1.129 diff -u -r1.129 AbstractTreeViewer.java --- src/org/eclipse/jface/viewers/AbstractTreeViewer.java 12 Nov 2007 13:13:29 -0000 1.129 +++ src/org/eclipse/jface/viewers/AbstractTreeViewer.java 16 Nov 2007 13:19:27 -0000 @@ -2537,7 +2537,7 @@ oldCnt = getItemCount(tree); } - Item[] items = getChildren(widget,elementChildren); + Item[] items = getChildrenForUpdate(parent,widget,elementChildren); // save the expanded elements CustomHashtable expanded = newHashtable(CustomHashtable.DEFAULT_CAPACITY); // assume @@ -2687,6 +2687,7 @@ /** * Return the items to be refreshed as part of an update. elementChildren are the * new elements. + * @param parent * @param widget * @param elementChildren * @since 3.4 @@ -2694,7 +2695,7 @@ * NOTE: This API is experimental and may be deleted * before 3.4 is released. */ - public Item[] getChildren(Widget widget, Object[] elementChildren) { + public Item[] getChildrenForUpdate(Object parent, Widget widget, Object[] elementChildren) { return getChildren(widget); } Index: src/org/eclipse/jface/viewers/TreeViewer.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jface/src/org/eclipse/jface/viewers/TreeViewer.java,v retrieving revision 1.93 diff -u -r1.93 TreeViewer.java --- src/org/eclipse/jface/viewers/TreeViewer.java 15 Nov 2007 13:53:17 -0000 1.93 +++ src/org/eclipse/jface/viewers/TreeViewer.java 16 Nov 2007 13:19:27 -0000 @@ -1117,4 +1117,27 @@ } } + /* + * (non-Javadoc) + * + * @see org.eclipse.jface.viewers.AbstractTreeViewer#getChildren(org.eclipse.swt.widgets.Widget, + * java.lang.Object[]) + */ + public Item[] getChildrenForUpdate(Object parent, Widget widget, + Object[] elementChildren) { + Item[] items = super.getChildrenForUpdate(parent, widget, + elementChildren); + + //Avoid the flash of removing child nodes + if (!(parent == null || parent.equals(getRoot()))) + return items; + if (elementChildren == null || elementChildren.length == 0 + || items.length / elementChildren.length > 5) { + // Will there be a lot of disposal? + removeAll(getControl()); + items = getChildren(widget); + } + return items; + } + }