diff options
author | Pawel Piech | 2009-11-18 16:22:33 +0000 |
---|---|---|
committer | Pawel Piech | 2009-11-18 16:22:33 +0000 |
commit | 84619f435d65a6c0b42bee8d13e86407240062e9 (patch) | |
tree | 5b1ae0b95fb38ab89866854bb8ecd0089933c665 | |
parent | 79073aaae9c951eba9a46457557661600f0d1c1b (diff) | |
download | eclipse.platform.debug-84619f435d65a6c0b42bee8d13e86407240062e9.tar.gz eclipse.platform.debug-84619f435d65a6c0b42bee8d13e86407240062e9.tar.xz eclipse.platform.debug-84619f435d65a6c0b42bee8d13e86407240062e9.zip |
Merged fixes for Bug 291267 from HEAD.
7 files changed, 116 insertions, 12 deletions
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ITreeModelContentProvider.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ITreeModelContentProvider.java index 1b7e93e4a..1bbb00b53 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ITreeModelContentProvider.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ITreeModelContentProvider.java @@ -179,4 +179,17 @@ public interface ITreeModelContentProvider extends ILazyTreePathContentProvider * @since 3.6 */ public void updateModel(IModelDelta delta, int mask); + + /** + * Instructs the content provider to cancel any pending state changes + * (i.e. SELECT, REVEAL, EXPAND, COLLAPSE) for the given path. Pending + * state changes are changes the the viewer plans to re-apply to the + * viewer following a refresh. If the user changes viewer state while + * the viewer is being refreshed, user's change should override the + * previous state. + * + * @param path Path of the element for which to cancel pending changes. + * @param flags Flags indicating the changes to cancel. + */ + public void cancelRestore(TreePath path, int flags); } diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ITreeModelViewer.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ITreeModelViewer.java index a23191780..55de29964 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ITreeModelViewer.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ITreeModelViewer.java @@ -77,15 +77,17 @@ public interface ITreeModelViewer extends ISelectionProvider { public ISelection getSelection(); /** - * Sets a new selection for this viewer and optionally makes it visible. + * Sets a new selection for this viewer and optionally makes it visible. * * @param selection the new selection * @param reveal <code>true</code> if the selection is to be made * visible, and <code>false</code> otherwise * @param force <code>true</code> if the selection should override the * model selection policy + * @return returns <code>false</code> if the selection change was overriden + * by the model selection policy */ - public void setSelection(ISelection selection, boolean reveal, boolean force); + public boolean setSelection(ISelection selection, boolean reveal, boolean force); /** * Returns the auto-expand level. diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/InternalTreeModelViewer.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/InternalTreeModelViewer.java index 74a8c67b3..0c6807d82 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/InternalTreeModelViewer.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/InternalTreeModelViewer.java @@ -62,6 +62,7 @@ import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.PaintEvent; import org.eclipse.swt.events.PaintListener; import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.events.TreeEvent; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.FontData; @@ -1701,11 +1702,12 @@ public class InternalTreeModelViewer extends TreeViewer * @param force whether to force the selection (i.e. <code>true</code> to * override the model selection policy) */ - public void setSelection(ISelection selection, boolean reveal, boolean force) { - if (force) { + public boolean setSelection(ISelection selection, boolean reveal, boolean force) { + if (force || overrideSelection(getSelection(), selection)) { super.setSelection(selection, reveal); + return true; } else { - setSelection(selection, reveal); + return false; } } @@ -2449,6 +2451,29 @@ public class InternalTreeModelViewer extends TreeViewer } } else { super.handleSelect(event); + IContentProvider contentProvider = getContentProvider(); + if (contentProvider instanceof TreeModelContentProvider) { + TreePath path = getTreePathFromItem((TreeItem)event.item); + ((TreeModelContentProvider) contentProvider).cancelRestore(path, IModelDelta.SELECT); + } } } + + protected void handleTreeExpand(TreeEvent event) { + super.handleTreeExpand(event); + IContentProvider contentProvider = getContentProvider(); + if (contentProvider instanceof TreeModelContentProvider) { + TreePath path = getTreePathFromItem((TreeItem)event.item); + ((TreeModelContentProvider) contentProvider).cancelRestore(path, IModelDelta.COLLAPSE); + } + } + + protected void handleTreeCollapse(TreeEvent event) { + super.handleTreeCollapse(event); + IContentProvider contentProvider = getContentProvider(); + if (contentProvider instanceof TreeModelContentProvider) { + TreePath path = getTreePathFromItem((TreeItem)event.item); + ((TreeModelContentProvider) contentProvider).cancelRestore(path, IModelDelta.EXPAND); + } + } } diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/InternalVirtualTreeModelViewer.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/InternalVirtualTreeModelViewer.java index 8c545c34f..7edae0a1c 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/InternalVirtualTreeModelViewer.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/InternalVirtualTreeModelViewer.java @@ -753,9 +753,9 @@ public class InternalVirtualTreeModelViewer extends Viewer * @param force whether to force the selection (i.e. <code>true</code> to * override the model selection policy) */ - public void setSelection(ISelection selection, boolean reveal, boolean force) { + public boolean setSelection(ISelection selection, boolean reveal, boolean force) { if (!force && !overrideSelection(getSelection(), selection)) { - return; + return false; } if (!fPreservingSelecction) { @@ -765,6 +765,7 @@ public class InternalVirtualTreeModelViewer extends Viewer fRestoreSelection = false; internalSetSelection(selection, reveal); } + return true; } private void internalSetSelection(ISelection selection, boolean reveal) { diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ModelContentProvider.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ModelContentProvider.java index edd7cbde3..572413257 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ModelContentProvider.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ModelContentProvider.java @@ -570,6 +570,57 @@ abstract class ModelContentProvider implements IContentProvider, IModelChangedLi abstract void doRestore(final ModelDelta delta, boolean knowsHasChildren, boolean knowsChildCount, boolean checkChildrenRealized); + public void cancelRestore(final TreePath path, final int flags) { + if (fPendingState == null) { + return; + } + + if ((flags & (IModelDelta.SELECT | IModelDelta.REVEAL)) != 0) { + // If we're canceling select or reveal, cancel it for all of pending deltas + final int mask = flags & (IModelDelta.SELECT | IModelDelta.REVEAL); + fPendingState.accept(new IModelDeltaVisitor() { + public boolean visit(IModelDelta delta, int depth) { + int deltaFlags = delta.getFlags(); + int newFlags = deltaFlags & ~mask; + if (DEBUG_STATE_SAVE_RESTORE + && (DEBUG_PRESENTATION_ID == null || DEBUG_PRESENTATION_ID.equals(getPresentationContext().getId()))) + { + if (deltaFlags != newFlags) { + System.out.println("\tCANCEL: " + delta.getElement() + "(" + Integer.toHexString(deltaFlags & mask) + ")"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + } + } + ((ModelDelta)delta).setFlags(newFlags); + return true; + } + }); + } + if ((flags & ~(IModelDelta.SELECT | IModelDelta.REVEAL)) != 0) { + final int mask = flags & ~(IModelDelta.SELECT | IModelDelta.REVEAL); + // For other flags (EXPAND/COLLAPSE), cancel only from the matching path. + fPendingState.accept(new IModelDeltaVisitor() { + public boolean visit(IModelDelta delta, int depth) { + if (depth == path.getSegmentCount()) { + TreePath deltaPath = getViewerTreePath(delta); + if (deltaPath.equals(path)) { + int deltaFlags = delta.getFlags(); + int newFlags = deltaFlags & ~mask; + if (DEBUG_STATE_SAVE_RESTORE + && (DEBUG_PRESENTATION_ID == null || DEBUG_PRESENTATION_ID.equals(getPresentationContext().getId()))) + { + if (deltaFlags != newFlags) { + System.out.println("\tCANCEL: " + delta.getElement() + "(" + Integer.toHexString(deltaFlags & mask) + ")"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + } + } + ((ModelDelta)delta).setFlags(newFlags); + } + return false; + } + return true; + } + }); + } + } + protected void appendToPendingStateDelta(TreePath path) { if (DEBUG_STATE_SAVE_RESTORE && (DEBUG_PRESENTATION_ID == null || DEBUG_PRESENTATION_ID.equals(getPresentationContext().getId()))) { @@ -629,8 +680,10 @@ abstract class ModelContentProvider implements IContentProvider, IModelChangedLi // If the pending state node does not contain any flags, // we can also skip it. ModelDelta saveDeltaNode = findSaveDelta(appendDeltaRoot, pendingDeltaNode); - if (saveDeltaNode != null && !isDeltaInParent(pendingDeltaNode, saveDeltaNode) - && pendingDeltaNode.getFlags() != IModelDelta.NO_CHANGE) { + if (saveDeltaNode != null && + !isDeltaInParent(pendingDeltaNode, saveDeltaNode) && + pendingDeltaNode.getFlags() != IModelDelta.NO_CHANGE) + { saveDeltaNode.setChildCount(pendingDeltaNode.getParentDelta().getChildCount()); copyIntoDelta(pendingDeltaNode, saveDeltaNode); } else { diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/SubTreeModelViewer.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/SubTreeModelViewer.java index f30f9b3cb..e9936cf51 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/SubTreeModelViewer.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/SubTreeModelViewer.java @@ -325,8 +325,8 @@ public class SubTreeModelViewer extends TreeModelViewer { SubTreeModelViewer.this.setAutoExpandLevel(level); } - public void setSelection(ISelection selection, boolean reveal, boolean force) { - SubTreeModelViewer.this.setSelection(selection, reveal, force); + public boolean setSelection(ISelection selection, boolean reveal, boolean force) { + return SubTreeModelViewer.this.setSelection(selection, reveal, force); } public void updateViewer(IModelDelta delta) { @@ -446,6 +446,10 @@ public class SubTreeModelViewer extends TreeModelViewer { return null; } + public void cancelRestore(TreePath path, int flags) { + fBaseProvider.cancelRestore(createFullPath(path), flags); + } + public void dispose() { fBaseProvider.dispose(); } diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/TreeModelContentProvider.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/TreeModelContentProvider.java index abd200ebc..c818b10e3 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/TreeModelContentProvider.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/TreeModelContentProvider.java @@ -144,6 +144,7 @@ public class TreeModelContentProvider extends ModelContentProvider implements IT protected void handleCollapse(IModelDelta delta) { TreePath elementPath = getViewerTreePath(delta); getViewer().setExpandedState(elementPath, false); + cancelRestore(elementPath, IModelDelta.EXPAND); } /* (non-Javadoc) @@ -203,6 +204,7 @@ public class TreeModelContentProvider extends ModelContentProvider implements IT treeViewer.setChildCount(elementPath, viewCount); if (!treeViewer.getExpandedState(elementPath)) { treeViewer.expandToLevel(elementPath, 1); + cancelRestore(elementPath, IModelDelta.COLLAPSE); } } } @@ -355,7 +357,10 @@ public class TreeModelContentProvider extends ModelContentProvider implements IT treeViewer.replace(parentPath, viewIndex, delta.getElement()); } } - treeViewer.setSelection(new TreeSelection(getViewerTreePath(delta)), false, (delta.getFlags() & IModelDelta.FORCE) != 0); + TreePath selectionPath = getViewerTreePath(delta); + if ( treeViewer.setSelection(new TreeSelection(selectionPath), false, (delta.getFlags() & IModelDelta.FORCE) != 0) ) { + cancelRestore(selectionPath, IModelDelta.SELECT); + } } /* (non-Javadoc) @@ -373,6 +378,7 @@ public class TreeModelContentProvider extends ModelContentProvider implements IT if (parentDelta != null) { handleExpand(parentDelta); reveal(delta); + cancelRestore(getViewerTreePath(delta), IModelDelta.REVEAL); } } |