diff options
author | Pawel Piech | 2009-11-11 19:56:51 +0000 |
---|---|---|
committer | Pawel Piech | 2009-11-11 19:56:51 +0000 |
commit | 978d8355a2516e35ead2c68eda315639bfb8c843 (patch) | |
tree | d25859fc75b48ab63c42b4a06be37eb1d6cd4c7a /org.eclipse.debug.ui | |
parent | 0030724c66680f3283e9598926672ce93f2a7b40 (diff) | |
download | eclipse.platform.debug-978d8355a2516e35ead2c68eda315639bfb8c843.tar.gz eclipse.platform.debug-978d8355a2516e35ead2c68eda315639bfb8c843.tar.xz eclipse.platform.debug-978d8355a2516e35ead2c68eda315639bfb8c843.zip |
Bug 291267 - Additional fixes for intermittent failures in restoring viewer state.
Diffstat (limited to 'org.eclipse.debug.ui')
5 files changed, 51 insertions, 5 deletions
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ChildrenCountUpdate.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ChildrenCountUpdate.java index 19b0be07a..073ff0bcc 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ChildrenCountUpdate.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ChildrenCountUpdate.java @@ -76,7 +76,7 @@ class ChildrenCountUpdate extends ViewerUpdateMonitor implements IChildrenCountU return true; } else if (getElementContentProvider().equals(request.getElementContentProvider())) { if (fBatchedRequests == null) { - fBatchedRequests = new ArrayList(); + fBatchedRequests = new ArrayList(4); fBatchedRequests.add(this); } fBatchedRequests.add(request); @@ -103,6 +103,19 @@ class ChildrenCountUpdate extends ViewerUpdateMonitor implements IChildrenCountU getElementContentProvider().update(updates); } } + + boolean containsUpdate(TreePath path) { + if (getElementPath().equals(path)) { + return true; + } else if (fBatchedRequests != null) { + for (int i = 0; i < fBatchedRequests.size(); i++) { + if (((ViewerUpdateMonitor)fBatchedRequests.get(i)).getElementPath().equals(path)) { + return true; + } + } + } + return false; + } /* (non-Javadoc) * @see org.eclipse.debug.internal.ui.viewers.model.ViewerUpdateMonitor#getPriority() diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ChildrenUpdate.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ChildrenUpdate.java index 21db89ddd..387403eae 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ChildrenUpdate.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ChildrenUpdate.java @@ -126,7 +126,13 @@ public class ChildrenUpdate extends ViewerUpdateMonitor implements IChildrenUpda } return false; } + + boolean containsUpdate(TreePath path) { + return getElementPath().equals(path); + } + + /* (non-Javadoc) * @see org.eclipse.debug.internal.ui.viewers.model.provisional.IChildrenUpdate#getLength() */ diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/HasChildrenUpdate.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/HasChildrenUpdate.java index 61bb05dc6..9572326cf 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/HasChildrenUpdate.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/HasChildrenUpdate.java @@ -106,6 +106,20 @@ class HasChildrenUpdate extends ViewerUpdateMonitor implements IHasChildrenUpdat } } + boolean containsUpdate(TreePath path) { + if (getElementPath().equals(path)) { + return true; + } else if (fBatchedRequests != null) { + for (int i = 0; i < fBatchedRequests.size(); i++) { + if (((ViewerUpdateMonitor)fBatchedRequests.get(i)).getElementPath().equals(path)) { + return true; + } + } + } + return false; + } + + /* (non-Javadoc) * @see org.eclipse.debug.internal.ui.viewers.model.ViewerUpdateMonitor#getPriority() */ 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 1b793f53b..133df6b70 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 @@ -191,10 +191,16 @@ abstract class ModelContentProvider implements IContentProvider, IModelChangedLi * int) */ public boolean visit(IModelDelta delta, int depth) { - if (delta.getFlags() != IModelDelta.NO_CHANGE) { + // Filster out the CONTENT flags from the delta flags, the content + // flag is only used as a marker indicating that all the sub-elements + // of a given delta have been retrieved. + int flags = (delta.getFlags() & ~IModelDelta.CONTENT); + + if (flags != IModelDelta.NO_CHANGE) { IModelDelta parentDelta = delta.getParentDelta(); // Remove the delta if : - // - The parent delta has no more flags on it. + // - The parent delta has no more flags on it (the content flag is removed as well), + // which means that parent element's children have been completely exposed. // - There are no more pending updates for the element. // - If element is a memento, there are no state requests pending. if (parentDelta != null && parentDelta.getFlags() == IModelDelta.NO_CHANGE) { @@ -207,7 +213,7 @@ abstract class ModelContentProvider implements IContentProvider, IModelChangedLi } } - if (delta.getFlags() == IModelDelta.REVEAL && !(delta.getElement() instanceof IMemento)) { + if (flags == IModelDelta.REVEAL && !(delta.getElement() instanceof IMemento)) { topDelta = delta; } else { complete = false; @@ -241,7 +247,7 @@ abstract class ModelContentProvider implements IContentProvider, IModelChangedLi if (requests != null) { for (int i = 0; i < requests.size(); i++) { ViewerUpdateMonitor update = (ViewerUpdateMonitor) requests.get(i); - if (update.getElement().equals(path.getLastSegment())) { + if (update.containsUpdate(path)) { return true; } } diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ViewerUpdateMonitor.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ViewerUpdateMonitor.java index 9a137d227..9ba15c551 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ViewerUpdateMonitor.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ViewerUpdateMonitor.java @@ -201,6 +201,13 @@ public abstract class ViewerUpdateMonitor extends Request implements IViewerUpda * @return whether it worked */ abstract boolean coalesce(ViewerUpdateMonitor update); + + /** + * Returns whether this update or any coalesced updates is for an + * element at the given path. + * @since 3.6 + */ + abstract boolean containsUpdate(TreePath path); /** * Starts this request. Subclasses must override startRequest(). |