Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPawel Piech2009-11-18 16:22:33 +0000
committerPawel Piech2009-11-18 16:22:33 +0000
commit84619f435d65a6c0b42bee8d13e86407240062e9 (patch)
tree5b1ae0b95fb38ab89866854bb8ecd0089933c665
parent79073aaae9c951eba9a46457557661600f0d1c1b (diff)
downloadeclipse.platform.debug-84619f435d65a6c0b42bee8d13e86407240062e9.tar.gz
eclipse.platform.debug-84619f435d65a6c0b42bee8d13e86407240062e9.tar.xz
eclipse.platform.debug-84619f435d65a6c0b42bee8d13e86407240062e9.zip
Merged fixes for Bug 291267 from HEAD.
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ITreeModelContentProvider.java13
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ITreeModelViewer.java6
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/InternalTreeModelViewer.java31
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/InternalVirtualTreeModelViewer.java5
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ModelContentProvider.java57
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/SubTreeModelViewer.java8
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/TreeModelContentProvider.java8
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);
}
}

Back to the top