Index: src/org/eclipse/ui/navigator/CommonViewer.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/CommonViewer.java,v retrieving revision 1.21 diff -u -r1.21 CommonViewer.java --- src/org/eclipse/ui/navigator/CommonViewer.java 8 May 2006 20:54:43 -0000 1.21 +++ src/org/eclipse/ui/navigator/CommonViewer.java 29 May 2006 18:57:10 -0000 @@ -12,6 +12,7 @@ import java.util.ArrayList; import java.util.Iterator; +import java.util.List; import org.eclipse.jface.viewers.DecoratingLabelProvider; import org.eclipse.jface.viewers.IBaseLabelProvider; @@ -23,6 +24,7 @@ import org.eclipse.jface.viewers.ViewerSorter; import org.eclipse.swt.dnd.DND; import org.eclipse.swt.events.DisposeEvent; +import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Widget; import org.eclipse.ui.PlatformUI; @@ -48,6 +50,8 @@ public class CommonViewer extends TreeViewer { private final NavigatorContentService contentService; + + private ISelection cachedSelection; /** *

@@ -329,6 +333,7 @@ public void setSelection(ISelection selection, boolean reveal) { if(selection instanceof IStructuredSelection) { + cachedSelection = null; IStructuredSelection sSelection = (IStructuredSelection) selection; INavigatorPipelineService pipeDream = contentService @@ -343,7 +348,8 @@ super.setSelection(new StructuredSelection(update.getRefreshTargets().toArray()) , reveal); } else { super.setSelection(selection, reveal); - } + } + cachedSelection = super.getSelection();//update cachedSelection } } @@ -408,6 +414,77 @@ return; } super.internalRefresh(element, updateLabels); - } + } + + + + /* (non-Javadoc) + * @see org.eclipse.jface.viewers.TreeViewer#setSelection(java.util.List) + */ + protected void setSelection(List items) { + cachedSelection = null; + super.setSelection(items); + cachedSelection = super.getSelection(); + } + + /* (non-Javadoc) + * @see org.eclipse.jface.viewers.AbstractTreeViewer#getSelection() + */ + public ISelection getSelection() { + if (cachedSelection == null) { + cachedSelection = super.getSelection(); + } + return cachedSelection; + } + + /* (non-Javadoc) + * @see org.eclipse.jface.viewers.AbstractTreeViewer#setSelectionToWidget(org.eclipse.jface.viewers.ISelection, boolean) + */ + protected void setSelectionToWidget(ISelection selection, boolean reveal) { + cachedSelection = null; + super.setSelectionToWidget(selection, reveal); + cachedSelection = super.getSelection(); + } + + /* (non-Javadoc) + * @see org.eclipse.jface.viewers.StructuredViewer#handlePostSelect(org.eclipse.swt.events.SelectionEvent) + */ + protected void handlePostSelect(SelectionEvent e) { + cachedSelection = null; + super.handlePostSelect(e); + } + + /* (non-Javadoc) + * @see org.eclipse.jface.viewers.StructuredViewer#handleSelect(org.eclipse.swt.events.SelectionEvent) + */ + protected void handleSelect(SelectionEvent event) { + cachedSelection = null; + super.handleSelect(event); + } + + /* (non-Javadoc) + * @see org.eclipse.jface.viewers.StructuredViewer#preservingSelection(java.lang.Runnable) + */ + protected void preservingSelection(Runnable updateCode) { + ISelection oldSelection = getSelection(); + super.preservingSelection(updateCode); + ISelection newSelection = getSelection(); + if(newSelection.equals(oldSelection)){ + //if they are equal, then we need to verify this. otherwise, handleInvalidSelection(...) had been called already + cachedSelection = null; + newSelection = getSelection(); + if (!newSelection.equals(oldSelection)) { + handleInvalidSelection(oldSelection, newSelection); + } + } + } + + /* (non-Javadoc) + * @see org.eclipse.jface.viewers.StructuredViewer#updateSelection(org.eclipse.jface.viewers.ISelection) + */ + protected void updateSelection(ISelection selection) { + cachedSelection = selection;//update cached selection + super.updateSelection(selection); + } }