diff options
Diffstat (limited to 'org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model')
46 files changed, 7543 insertions, 7543 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 940d18bf2..b77fcc474 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 @@ -28,9 +28,9 @@ import org.eclipse.jface.viewers.TreePath; */ class ChildrenCountUpdate extends ViewerUpdateMonitor implements IChildrenCountUpdate { - /** - * Child count result. - */ + /** + * Child count result. + */ private int fCount = 0; /** @@ -39,18 +39,18 @@ class ChildrenCountUpdate extends ViewerUpdateMonitor implements IChildrenCountU */ private List<ViewerUpdateMonitor> fBatchedRequests = null; - /** - * Flag whether filtering is enabled in viewer. If filtering is enabled, then a - * children update is performed on child elements to filter them as part of the - * child count calculation. - */ + /** + * Flag whether filtering is enabled in viewer. If filtering is enabled, then a + * children update is performed on child elements to filter them as part of the + * child count calculation. + */ private boolean fShouldFilter = false; /** * Children indexes which are currently filtered. When updating child count, also need * to verify that currently filtered children are still filtered. */ - private int[] fFilteredChildren = null; + private int[] fFilteredChildren = null; /** * Children update used to filter children. @@ -81,42 +81,42 @@ class ChildrenCountUpdate extends ViewerUpdateMonitor implements IChildrenCountU @Override protected synchronized void scheduleViewerUpdate() { - // If filtering is enabled perform child update on all children in order to update - // viewer filters. + // If filtering is enabled perform child update on all children in order to update + // viewer filters. if (fShouldFilter || fFilteredChildren != null) { - if (fChildrenUpdate == null) { - int startIdx; - int count; - if (fShouldFilter) { - startIdx = 0; - count = getCount(); - } else { - startIdx = fFilteredChildren[0]; - int endIdx = fFilteredChildren[fFilteredChildren.length - 1]; - count = endIdx - startIdx + 1; - } - - fChildrenUpdate = new ChildrenUpdate(getContentProvider(), getViewerInput(), getElementPath(), getElement(), startIdx, count, getElementContentProvider()) { - @Override + if (fChildrenUpdate == null) { + int startIdx; + int count; + if (fShouldFilter) { + startIdx = 0; + count = getCount(); + } else { + startIdx = fFilteredChildren[0]; + int endIdx = fFilteredChildren[fFilteredChildren.length - 1]; + count = endIdx - startIdx + 1; + } + + fChildrenUpdate = new ChildrenUpdate(getContentProvider(), getViewerInput(), getElementPath(), getElement(), startIdx, count, getElementContentProvider()) { + @Override protected void performUpdate() { - performUpdate(true); - ChildrenCountUpdate.super.scheduleViewerUpdate(); - } + performUpdate(true); + ChildrenCountUpdate.super.scheduleViewerUpdate(); + } - @Override + @Override protected void scheduleViewerUpdate() { execInDisplayThread(() -> { if (!getContentProvider().isDisposed() && !isCanceled()) { performUpdate(); } }); - } - }; + } + }; execInDisplayThread(() -> fChildrenUpdate.startRequest()); - return; - } + return; + } } else { - super.scheduleViewerUpdate(); + super.scheduleViewerUpdate(); } } @@ -137,9 +137,9 @@ class ChildrenCountUpdate extends ViewerUpdateMonitor implements IChildrenCountU // Child 0 is automatically updated by the tree at the same time that the child count is requested. Therefore, // If this child count update filtered out this element, it needs to be updated again. if (fShouldFilter && getContentProvider().isFiltered(elementPath, 0)) { - getContentProvider().updateElement(elementPath, 0); + getContentProvider().updateElement(elementPath, 0); } - getContentProvider().getViewer().setChildCount(elementPath, viewCount); + getContentProvider().getViewer().setChildCount(elementPath, viewCount); getContentProvider().getStateTracker().restorePendingStateOnUpdate(getElementPath(), -1, true, true, false); } @@ -192,16 +192,16 @@ class ChildrenCountUpdate extends ViewerUpdateMonitor implements IChildrenCountU @Override boolean containsUpdate(TreePath path) { - if (getElementPath().equals(path)) { - return true; - } else if (fBatchedRequests != null) { - for (int i = 0; i < fBatchedRequests.size(); i++) { - if (fBatchedRequests.get(i).getElementPath().equals(path)) { - return true; - } - } - } - return false; + if (getElementPath().equals(path)) { + return true; + } else if (fBatchedRequests != null) { + for (int i = 0; i < fBatchedRequests.size(); i++) { + if (fBatchedRequests.get(i).getElementPath().equals(path)) { + return true; + } + } + } + return false; } @Override @@ -219,19 +219,19 @@ class ChildrenCountUpdate extends ViewerUpdateMonitor implements IChildrenCountU } int getCount() { - return fCount; + return fCount; } - @Override + @Override protected boolean doEquals(ViewerUpdateMonitor update) { - return - update instanceof ChildrenCountUpdate && - getViewerInput().equals(update.getViewerInput()) && - getElementPath().equals(update.getElementPath()); - } + return + update instanceof ChildrenCountUpdate && + getViewerInput().equals(update.getViewerInput()) && + getElementPath().equals(update.getElementPath()); + } - @Override + @Override protected int doHashCode() { - return getClass().hashCode() + getViewerInput().hashCode() + getElementPath().hashCode(); - } + return getClass().hashCode() + getViewerInput().hashCode() + getElementPath().hashCode(); + } } 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 8819290ea..0a29af029 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 @@ -66,26 +66,26 @@ public class ChildrenUpdate extends ViewerUpdateMonitor implements IChildrenUpda int viewIndex = provider.modelToViewIndex(elementPath, modelIndex); if (provider.shouldFilter(elementPath, element)) { if (provider.addFilteredIndex(elementPath, modelIndex, element)) { - if (!updateFilterOnly) { - if (DebugUIPlugin.DEBUG_CONTENT_PROVIDER && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(getPresentationContext())) { - DebugUIPlugin.trace("REMOVE(" + getElement() + ", modelIndex: " + modelIndex + " viewIndex: " + viewIndex + ", " + element + ")"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ - } - viewer.remove(elementPath, viewIndex); - } + if (!updateFilterOnly) { + if (DebugUIPlugin.DEBUG_CONTENT_PROVIDER && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(getPresentationContext())) { + DebugUIPlugin.trace("REMOVE(" + getElement() + ", modelIndex: " + modelIndex + " viewIndex: " + viewIndex + ", " + element + ")"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ + } + viewer.remove(elementPath, viewIndex); + } } } else { if (provider.isFiltered(elementPath, modelIndex)) { provider.clearFilteredChild(elementPath, modelIndex); - if (!updateFilterOnly) { + if (!updateFilterOnly) { int insertIndex = provider.modelToViewIndex(elementPath, modelIndex); if (DebugUIPlugin.DEBUG_CONTENT_PROVIDER) { DebugUIPlugin.trace("insert(" + getElement() + ", modelIndex: " + modelIndex + " insertIndex: " + insertIndex + ", " + element + ")"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ } viewer.insert(elementPath, element, insertIndex); - } + } } else if (!updateFilterOnly){ - if (DebugUIPlugin.DEBUG_CONTENT_PROVIDER && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(getPresentationContext())) { - DebugUIPlugin.trace("replace(" + getElement() + ", modelIndex: " + modelIndex + " viewIndex: " + viewIndex + ", " + element + ")"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ + if (DebugUIPlugin.DEBUG_CONTENT_PROVIDER && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(getPresentationContext())) { + DebugUIPlugin.trace("replace(" + getElement() + ", modelIndex: " + modelIndex + " viewIndex: " + viewIndex + ", " + element + ")"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ } viewer.replace(elementPath, viewIndex, element); } @@ -149,8 +149,8 @@ public class ChildrenUpdate extends ViewerUpdateMonitor implements IChildrenUpda @Override boolean containsUpdate(TreePath path) { - return getElementPath().equals(path); - } + return getElementPath().equals(path); + } @Override public int getLength() { @@ -201,24 +201,24 @@ public class ChildrenUpdate extends ViewerUpdateMonitor implements IChildrenUpda } Object[] getElements() { - return fElements; + return fElements; } - @Override + @Override protected boolean doEquals(ViewerUpdateMonitor update) { - return - update instanceof ChildrenUpdate && - ((ChildrenUpdate)update).getOffset() == getOffset() && - ((ChildrenUpdate)update).getLength() == getLength() && - getViewerInput().equals(update.getViewerInput()) && - getElementPath().equals(update.getElementPath()); - } - - @Override + return + update instanceof ChildrenUpdate && + ((ChildrenUpdate)update).getOffset() == getOffset() && + ((ChildrenUpdate)update).getLength() == getLength() && + getViewerInput().equals(update.getViewerInput()) && + getElementPath().equals(update.getElementPath()); + } + + @Override protected int doHashCode() { - return (int)Math.pow( - (getClass().hashCode() + getViewerInput().hashCode() + getElementPath().hashCode()) * (getOffset() + 2), - getLength() + 2); - } + return (int)Math.pow( + (getClass().hashCode() + getViewerInput().hashCode() + getElementPath().hashCode()) * (getOffset() + 2), + getLength() + 2); + } } diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ElementCompareRequest.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ElementCompareRequest.java index 25d737dad..76f30f905 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ElementCompareRequest.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ElementCompareRequest.java @@ -26,30 +26,30 @@ import org.eclipse.ui.IMemento; public class ElementCompareRequest extends MementoUpdate implements IElementCompareRequest { private boolean fEqual; - private final int fModelIndex; + private final int fModelIndex; private ModelDelta fDelta; - private boolean fKnowsHasChildren; - private boolean fKnowsChildCount; - private boolean fCheckChildrenRealized; - - - /** - * @param provider the content provider to use for the update - * @param viewerInput the current input - * @param element the element to update - * @param elementPath the path of the element to update - * @param memento Memento to encode result into - * @param delta Delta to write the result comparison into. - * @param modelIndex Index of element to compare. - * @param knowsHasChildren Flag indicating whether provider knows the has - * children state of element. - * @param knowsChildCount Flag indicating whether provider knows the - * child count state of element. - * @param checkChildrenRealized Flag indicating if any realized children should be checked - */ + private boolean fKnowsHasChildren; + private boolean fKnowsChildCount; + private boolean fCheckChildrenRealized; + + + /** + * @param provider the content provider to use for the update + * @param viewerInput the current input + * @param element the element to update + * @param elementPath the path of the element to update + * @param memento Memento to encode result into + * @param delta Delta to write the result comparison into. + * @param modelIndex Index of element to compare. + * @param knowsHasChildren Flag indicating whether provider knows the has + * children state of element. + * @param knowsChildCount Flag indicating whether provider knows the + * child count state of element. + * @param checkChildrenRealized Flag indicating if any realized children should be checked + */ public ElementCompareRequest(TreeModelContentProvider provider, Object viewerInput, Object element, - TreePath elementPath, IMemento memento, ModelDelta delta, int modelIndex, - boolean knowsHasChildren, boolean knowsChildCount, boolean checkChildrenRealized) + TreePath elementPath, IMemento memento, ModelDelta delta, int modelIndex, + boolean knowsHasChildren, boolean knowsChildCount, boolean checkChildrenRealized) { super(provider, viewerInput, provider.getPresentationContext(), element, elementPath, memento); fProvider = provider; @@ -67,21 +67,21 @@ public class ElementCompareRequest extends MementoUpdate implements IElementComp @Override public void done() { - ITreeModelViewer viewer = getContentProvider().getViewer(); - if (viewer == null) + ITreeModelViewer viewer = getContentProvider().getViewer(); + if (viewer == null) { return; // disposed } - if (viewer.getDisplay().getThread() == Thread.currentThread()) { - fProvider.getStateTracker().compareFinished(ElementCompareRequest.this, fDelta); - } else { + if (viewer.getDisplay().getThread() == Thread.currentThread()) { + fProvider.getStateTracker().compareFinished(ElementCompareRequest.this, fDelta); + } else { viewer.getDisplay().asyncExec(() -> { if (getContentProvider().isDisposed()) { return; } fProvider.getStateTracker().compareFinished(ElementCompareRequest.this, fDelta); }); - } + } } public boolean isEqual() { @@ -113,20 +113,20 @@ public class ElementCompareRequest extends MementoUpdate implements IElementComp return fKnowsChildCount; } - void setCheckChildrenRealized(boolean checkChildrenRealized) { - fCheckChildrenRealized = checkChildrenRealized; - } + void setCheckChildrenRealized(boolean checkChildrenRealized) { + fCheckChildrenRealized = checkChildrenRealized; + } - boolean checkChildrenRealized() { - return fCheckChildrenRealized; - } + boolean checkChildrenRealized() { + return fCheckChildrenRealized; + } - @Override + @Override public String toString() { - StringBuilder buf = new StringBuilder(); - buf.append("IElementCompareRequest: "); //$NON-NLS-1$ - buf.append(getElement()); - return buf.toString(); - } + StringBuilder buf = new StringBuilder(); + buf.append("IElementCompareRequest: "); //$NON-NLS-1$ + buf.append(getElement()); + return buf.toString(); + } } diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ElementMementoRequest.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ElementMementoRequest.java index 7b3c8e73b..d3887179a 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ElementMementoRequest.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ElementMementoRequest.java @@ -32,11 +32,11 @@ class ElementMementoRequest extends MementoUpdate implements IElementMementoRequ private ModelDelta fDelta; /** - * @param provider the content provider to use for the update - * @param viewerInput the current input - * @param collector Collector to report the result to - * @param element the element to update - * @param elementPath the path of the element to update + * @param provider the content provider to use for the update + * @param viewerInput the current input + * @param collector Collector to report the result to + * @param element the element to update + * @param elementPath the path of the element to update * @param memento Memento to encode result into * @param delta Delta to write the result comparison into. */ @@ -63,22 +63,22 @@ class ElementMementoRequest extends MementoUpdate implements IElementMementoRequ } private void doComplete() { - if (getContentProvider().isDisposed()) { + if (getContentProvider().isDisposed()) { return; } - if (!isCanceled() && (getStatus() == null || getStatus().isOK())) { - // replace the element with a memento - fDelta.setElement(getMemento()); - } - fManager.requestComplete(ElementMementoRequest.this); + if (!isCanceled() && (getStatus() == null || getStatus().isOK())) { + // replace the element with a memento + fDelta.setElement(getMemento()); + } + fManager.requestComplete(ElementMementoRequest.this); } @Override public String toString() { - StringBuilder buf = new StringBuilder(); - buf.append("IElementMementoRequest: "); //$NON-NLS-1$ - buf.append(getElement()); - return buf.toString(); + StringBuilder buf = new StringBuilder(); + buf.append("IElementMementoRequest: "); //$NON-NLS-1$ + buf.append(getElement()); + return buf.toString(); } } diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/FilterTransform.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/FilterTransform.java index f43a6dd9b..60c8125bd 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/FilterTransform.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/FilterTransform.java @@ -375,11 +375,11 @@ public class FilterTransform { } public int indexOfFilteredElement(TreePath parentPath, Object element) { - Node parentNode = root.find(parentPath, 0); - if (parentNode == null) { - return -1; - } - return parentNode.indexOfFilteredElement(element); + Node parentNode = root.find(parentPath, 0); + if (parentNode == null) { + return -1; + } + return parentNode.indexOfFilteredElement(element); } /** 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 808f66e5a..b05729bfa 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 @@ -32,15 +32,15 @@ class HasChildrenUpdate extends ViewerUpdateMonitor implements IHasChildrenUpdat private List<ViewerUpdateMonitor> fBatchedRequests = null; - /** - * Constructs a request to update an element - * - * @param provider the content provider - * @param viewerInput the current input - * @param elementPath the path to the element being update - * @param element the element - * @param elementContentProvider the content provider for the element - */ + /** + * Constructs a request to update an element + * + * @param provider the content provider + * @param viewerInput the current input + * @param elementPath the path to the element being update + * @param element the element + * @param elementContentProvider the content provider for the element + */ public HasChildrenUpdate(TreeModelContentProvider provider, Object viewerInput, TreePath elementPath, Object element, IElementContentProvider elementContentProvider) { super(provider, viewerInput, elementPath, element, elementContentProvider, provider.getPresentationContext()); } @@ -52,7 +52,7 @@ class HasChildrenUpdate extends ViewerUpdateMonitor implements IHasChildrenUpdat if (!fHasChildren) { contentProvider.clearFilters(elementPath); } - if (DebugUIPlugin.DEBUG_CONTENT_PROVIDER && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(getPresentationContext())) { + if (DebugUIPlugin.DEBUG_CONTENT_PROVIDER && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(getPresentationContext())) { } contentProvider.getViewer().setHasChildren(elementPath, fHasChildren); if (fHasChildren) { @@ -112,17 +112,17 @@ class HasChildrenUpdate extends ViewerUpdateMonitor implements IHasChildrenUpdat @Override boolean containsUpdate(TreePath path) { - if (getElementPath().equals(path)) { - return true; - } else if (fBatchedRequests != null) { - for (int i = 0; i < fBatchedRequests.size(); i++) { - if (fBatchedRequests.get(i).getElementPath().equals(path)) { - return true; - } - } - } - return false; - } + if (getElementPath().equals(path)) { + return true; + } else if (fBatchedRequests != null) { + for (int i = 0; i < fBatchedRequests.size(); i++) { + if (fBatchedRequests.get(i).getElementPath().equals(path)) { + return true; + } + } + } + return false; + } @Override int getPriority() { @@ -139,20 +139,20 @@ class HasChildrenUpdate extends ViewerUpdateMonitor implements IHasChildrenUpdat } boolean hasChildren() { - return fHasChildren; + return fHasChildren; } - @Override + @Override protected boolean doEquals(ViewerUpdateMonitor update) { - return - update instanceof HasChildrenUpdate && - getViewerInput().equals(update.getViewerInput()) && - getElementPath().equals(update.getElementPath()); - } + return + update instanceof HasChildrenUpdate && + getViewerInput().equals(update.getViewerInput()) && + getElementPath().equals(update.getElementPath()); + } - @Override + @Override protected int doHashCode() { - return getClass().hashCode() + getViewerInput().hashCode() + getElementPath().hashCode(); - } + return getClass().hashCode() + getViewerInput().hashCode() + getElementPath().hashCode(); + } } diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/IInternalTreeModelViewer.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/IInternalTreeModelViewer.java index c71362168..d89111ae1 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/IInternalTreeModelViewer.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/IInternalTreeModelViewer.java @@ -32,291 +32,291 @@ import org.eclipse.swt.graphics.RGB; */ public interface IInternalTreeModelViewer extends ITreeModelViewer { - /** - * Returns this viewer's filters. - * - * @return an array of viewer filters - * @see org.eclipse.jface.viewers.StructuredViewer#setFilters(ViewerFilter[]) - */ - @Override ViewerFilter[] getFilters(); + /** + * Returns this viewer's filters. + * + * @return an array of viewer filters + * @see org.eclipse.jface.viewers.StructuredViewer#setFilters(ViewerFilter[]) + */ + @Override ViewerFilter[] getFilters(); - /** - * Reveals the given element in the viewer. - * @param path Path to the element's parent. - * @param index Index of the element to be revealed. - */ - void reveal(TreePath path, int index); + /** + * Reveals the given element in the viewer. + * @param path Path to the element's parent. + * @param index Index of the element to be revealed. + */ + void reveal(TreePath path, int index); - /** - * Triggers an update of the given element's state. If multiple instances - * of the given element are found in the tree, they will all be updated. - * - * @param element Element to update. - */ - void update(Object element); + /** + * Triggers an update of the given element's state. If multiple instances + * of the given element are found in the tree, they will all be updated. + * + * @param element Element to update. + */ + void update(Object element); - /** - * Sets the given object to be the element at the given index of the given parent. - * <p> - * This method should only be called by the viewer framework. - * </p> - * - * @param parentOrTreePath Parent object, or a tree path of the parent element. - * @param index Index at which to set the new element. - * @param element Element object. - * @noreference This method is not intended to be referenced by clients. - */ - void replace(Object parentOrTreePath, final int index, Object element); + /** + * Sets the given object to be the element at the given index of the given parent. + * <p> + * This method should only be called by the viewer framework. + * </p> + * + * @param parentOrTreePath Parent object, or a tree path of the parent element. + * @param index Index at which to set the new element. + * @param element Element object. + * @noreference This method is not intended to be referenced by clients. + */ + void replace(Object parentOrTreePath, final int index, Object element); - /** - * Set the number of children of the given element or tree path. To set the - * number of children of the invisible root of the tree, you can pass the - * input object or an empty tree path. - * <p> - * This method should only be called by the viewer framework. - * </p> - * - * @param elementOrTreePath The element, or tree path. - * @param count new value - * @noreference This method is not intended to be referenced by clients. - */ - void setChildCount(final Object elementOrTreePath, final int count); + /** + * Set the number of children of the given element or tree path. To set the + * number of children of the invisible root of the tree, you can pass the + * input object or an empty tree path. + * <p> + * This method should only be called by the viewer framework. + * </p> + * + * @param elementOrTreePath The element, or tree path. + * @param count new value + * @noreference This method is not intended to be referenced by clients. + */ + void setChildCount(final Object elementOrTreePath, final int count); - /** - * Inform the viewer about whether the given element or tree path has - * children. Avoid calling this method if the number of children has - * already been set. - * <p> - * This method should only be called by the viewer framework. - * </p> - * - * @param elementOrTreePath the element, or tree path - * @param hasChildren new value. - * @noreference This method is not intended to be referenced by clients. - */ - void setHasChildren(final Object elementOrTreePath, final boolean hasChildren); + /** + * Inform the viewer about whether the given element or tree path has + * children. Avoid calling this method if the number of children has + * already been set. + * <p> + * This method should only be called by the viewer framework. + * </p> + * + * @param elementOrTreePath the element, or tree path + * @param hasChildren new value. + * @noreference This method is not intended to be referenced by clients. + */ + void setHasChildren(final Object elementOrTreePath, final boolean hasChildren); - /** - * Performs auto expand on an element at the specified path if the auto expand - * level dictates the element should be expanded. - * <p> - * This method should only be called by the viewer framework. - * </p> - * - * @param elementPath tree path to element to consider for expansion - * @noreference This method is not intended to be referenced by clients. - */ - void autoExpand(TreePath elementPath); + /** + * Performs auto expand on an element at the specified path if the auto expand + * level dictates the element should be expanded. + * <p> + * This method should only be called by the viewer framework. + * </p> + * + * @param elementPath tree path to element to consider for expansion + * @noreference This method is not intended to be referenced by clients. + */ + void autoExpand(TreePath elementPath); - /** - * Sets whether the node corresponding to the given element or tree path is - * expanded or collapsed. - * <p> - * This method should only be called by the viewer framework. - * </p> - * - * @param elementOrTreePath - * the element, or the tree path to the element - * @param expanded - * <code>true</code> if the node is expanded, and - * <code>false</code> if collapsed - * - * @noreference This method is not intended to be referenced by clients. - */ - void setExpandedState(Object elementOrTreePath, boolean expanded); + /** + * Sets whether the node corresponding to the given element or tree path is + * expanded or collapsed. + * <p> + * This method should only be called by the viewer framework. + * </p> + * + * @param elementOrTreePath + * the element, or the tree path to the element + * @param expanded + * <code>true</code> if the node is expanded, and + * <code>false</code> if collapsed + * + * @noreference This method is not intended to be referenced by clients. + */ + void setExpandedState(Object elementOrTreePath, boolean expanded); - /** - * Expands all ancestors of the given element or tree path so that the given - * element becomes visible in this viewer's tree control, and then expands - * the subtree rooted at the given element to the given level. - * <p> - * This method should only be called by the viewer framework. - * </p> - * - * @param elementOrTreePath - * the element - * @param level - * non-negative level, or <code>ALL_LEVELS</code> to expand all - * levels of the tree - * - * @noreference This method is not intended to be referenced by clients. - */ - void expandToLevel(Object elementOrTreePath, int level); + /** + * Expands all ancestors of the given element or tree path so that the given + * element becomes visible in this viewer's tree control, and then expands + * the subtree rooted at the given element to the given level. + * <p> + * This method should only be called by the viewer framework. + * </p> + * + * @param elementOrTreePath + * the element + * @param level + * non-negative level, or <code>ALL_LEVELS</code> to expand all + * levels of the tree + * + * @noreference This method is not intended to be referenced by clients. + */ + void expandToLevel(Object elementOrTreePath, int level); - /** - * Removes the given element from the viewer. The selection is updated if - * necessary. - * <p> - * This method should only be called by the viewer framework. - * </p> - * @param elementOrTreePath the element, or the tree path to the element - * @noreference This method is not intended to be referenced by clients. - */ - void remove(Object elementOrTreePath); + /** + * Removes the given element from the viewer. The selection is updated if + * necessary. + * <p> + * This method should only be called by the viewer framework. + * </p> + * @param elementOrTreePath the element, or the tree path to the element + * @noreference This method is not intended to be referenced by clients. + */ + void remove(Object elementOrTreePath); - /** - * Removes the element at the specified index of the parent. The selection is updated if required. - * <p> - * This method should only be called by the viewer framework. - * </p> - * - * @param parentOrTreePath the parent element, the input element, or a tree path to the parent element - * @param index child index - * @noreference This method is not intended to be referenced by clients. - */ - void remove(Object parentOrTreePath, final int index); + /** + * Removes the element at the specified index of the parent. The selection is updated if required. + * <p> + * This method should only be called by the viewer framework. + * </p> + * + * @param parentOrTreePath the parent element, the input element, or a tree path to the parent element + * @param index child index + * @noreference This method is not intended to be referenced by clients. + */ + void remove(Object parentOrTreePath, final int index); - /** - * Inserts the given element as a new child element of the given parent - * element at the given position. If this viewer has a sorter, the position - * is ignored and the element is inserted at the correct position in the - * sort order. - * <p> - * This method should only be called by the viewer framework. - * </p> - * @param parentOrTreePath the parent element, or the tree path to the parent - * - * @param element the element - * @param position a 0-based position relative to the model, or -1 to indicate - * the last position - * @noreference This method is not intended to be referenced by clients. - */ - void insert(Object parentOrTreePath, Object element, int position); + /** + * Inserts the given element as a new child element of the given parent + * element at the given position. If this viewer has a sorter, the position + * is ignored and the element is inserted at the correct position in the + * sort order. + * <p> + * This method should only be called by the viewer framework. + * </p> + * @param parentOrTreePath the parent element, or the tree path to the parent + * + * @param element the element + * @param position a 0-based position relative to the model, or -1 to indicate + * the last position + * @noreference This method is not intended to be referenced by clients. + */ + void insert(Object parentOrTreePath, Object element, int position); - /** - * Returns whether the candidate selection should override the current - * selection. - * @param current Current selection in viewer. - * @param candidate Proposed new selection. - * @return whether new selection should override the current - */ - boolean overrideSelection(ISelection current, ISelection candidate); + /** + * Returns whether the candidate selection should override the current + * selection. + * @param current Current selection in viewer. + * @param candidate Proposed new selection. + * @return whether new selection should override the current + */ + boolean overrideSelection(ISelection current, ISelection candidate); - /** - * Returns whether the node corresponding to the given element or tree path - * is expanded or collapsed. - * - * @param elementOrTreePath - * the element - * @return <code>true</code> if the node is expanded, and - * <code>false</code> if collapsed - */ - boolean getExpandedState(Object elementOrTreePath); + /** + * Returns whether the node corresponding to the given element or tree path + * is expanded or collapsed. + * + * @param elementOrTreePath + * the element + * @return <code>true</code> if the node is expanded, and + * <code>false</code> if collapsed + */ + boolean getExpandedState(Object elementOrTreePath); - /** - * Returns whether the node corresponding to the given element or tree path - * has any child elements. - * - * @param elementOrTreePath Path to element - * @return Returns whether the given element has children. - */ - boolean getHasChildren(Object elementOrTreePath); + /** + * Returns whether the node corresponding to the given element or tree path + * has any child elements. + * + * @param elementOrTreePath Path to element + * @return Returns whether the given element has children. + */ + boolean getHasChildren(Object elementOrTreePath); - /** - * Returns the child count of the element at the given path. <br> - * Note: The child count may be incorrect if the element is not - * expanded in the tree. - * - * @param path Path to get count for. - * @return The child count. - */ - int getChildCount(TreePath path); + /** + * Returns the child count of the element at the given path. <br> + * Note: The child count may be incorrect if the element is not + * expanded in the tree. + * + * @param path Path to get count for. + * @return The child count. + */ + int getChildCount(TreePath path); - /** - * Returns the element which is a child of the element at the - * given path, with the given index. - * - * @param path Path to parent element. - * @param index Index of child element. - * @return Child element. - */ - Object getChildElement(TreePath path, int index); + /** + * Returns the element which is a child of the element at the + * given path, with the given index. + * + * @param path Path to parent element. + * @param index Index of child element. + * @return Child element. + */ + Object getChildElement(TreePath path, int index); - /** - * Returns the tree path of the element that is at the top of the - * viewer. - * - * @return the tree path of the element at the top of the - * viewer. - */ - TreePath getTopElementPath(); + /** + * Returns the tree path of the element that is at the top of the + * viewer. + * + * @return the tree path of the element at the top of the + * viewer. + */ + TreePath getTopElementPath(); - /** - * Finds the index of the given element with a parent of given path. - * - * @param parentPath Path of parent element. - * @param element Element to find. - * - * @return The element's index, or -1 if not found. - */ - int findElementIndex(TreePath parentPath, Object element); + /** + * Finds the index of the given element with a parent of given path. + * + * @param parentPath Path of parent element. + * @param element Element to find. + * + * @return The element's index, or -1 if not found. + */ + int findElementIndex(TreePath parentPath, Object element); - /** - * Returns a boolean indicating whether all the child elements of the - * given parent have been realized already. - * - * @param parentPath Path of parent element. - * @return true if all children realized - */ - boolean getElementChildrenRealized(TreePath parentPath); + /** + * Returns a boolean indicating whether all the child elements of the + * given parent have been realized already. + * + * @param parentPath Path of parent element. + * @return true if all children realized + */ + boolean getElementChildrenRealized(TreePath parentPath); - /** - * Clears the selection in the viewer, if any, without firing - * selection change notification. This is only to be used by - * the platform. - */ - void clearSelectionQuiet(); + /** + * Clears the selection in the viewer, if any, without firing + * selection change notification. This is only to be used by + * the platform. + */ + void clearSelectionQuiet(); - /** - * Sets the element's display information. - * <p> - * This method should only be called by the viewer framework. - * </p> - * - * @param path Element path. - * @param numColumns Number of columns in the data. - * @param labels Array of labels. The array cannot to be - * <code>null</code>, but values within the array may be. - * @param images Array of image descriptors, may be <code>null</code>. - * @param fontDatas Array of fond data objects, may be <code>null</code>. - * @param foregrounds Array of RGB values for foreground colors, may be - * <code>null</code>. - * @param backgrounds Array of RGB values for background colors, may be - * <code>null</code>. - * @noreference This method is not intended to be referenced by clients. - */ - void setElementData(TreePath path, int numColumns, String[] labels, ImageDescriptor[] images, FontData[] fontDatas, RGB[] foregrounds, RGB[] backgrounds); + /** + * Sets the element's display information. + * <p> + * This method should only be called by the viewer framework. + * </p> + * + * @param path Element path. + * @param numColumns Number of columns in the data. + * @param labels Array of labels. The array cannot to be + * <code>null</code>, but values within the array may be. + * @param images Array of image descriptors, may be <code>null</code>. + * @param fontDatas Array of fond data objects, may be <code>null</code>. + * @param foregrounds Array of RGB values for foreground colors, may be + * <code>null</code>. + * @param backgrounds Array of RGB values for background colors, may be + * <code>null</code>. + * @noreference This method is not intended to be referenced by clients. + */ + void setElementData(TreePath path, int numColumns, String[] labels, ImageDescriptor[] images, FontData[] fontDatas, RGB[] foregrounds, RGB[] backgrounds); - /** - * Returns identifiers of the visible columns in this viewer, or <code>null</code> - * if there is currently no column presentation. - * - * @return visible columns or <code>null</code> - */ - String[] getVisibleColumns(); + /** + * Returns identifiers of the visible columns in this viewer, or <code>null</code> + * if there is currently no column presentation. + * + * @return visible columns or <code>null</code> + */ + String[] getVisibleColumns(); - /** - * Sets the element check state data. - * - * @param path Path of element to check. - * @param checked if true, item will be checked - * @param grayed if true item will be grayed - */ - void setElementChecked(TreePath path, boolean checked, boolean grayed); + /** + * Sets the element check state data. + * + * @param path Path of element to check. + * @param checked if true, item will be checked + * @param grayed if true item will be grayed + */ + void setElementChecked(TreePath path, boolean checked, boolean grayed); - /** - * Retrieves the element check state. - * - * @param path Path of element to return check state for. - * @return the element checked state - */ - boolean getElementChecked(TreePath path); + /** + * Retrieves the element check state. + * + * @param path Path of element to return check state for. + * @return the element checked state + */ + boolean getElementChecked(TreePath path); - /** - * Retrieves the element's check box grayed state. - * - * @param path Path of element to return grayed state for. - * @return the element grayed state - */ - boolean getElementGrayed(TreePath path); + /** + * Retrieves the element's check box grayed state. + * + * @param path Path of element to return grayed state for. + * @return the element grayed state + */ + boolean getElementGrayed(TreePath path); } 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 04476f252..ee94069e4 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 @@ -31,221 +31,221 @@ import org.eclipse.jface.viewers.Viewer; */ public interface ITreeModelContentProvider extends ILazyTreePathContentProvider { - /** - * Bit-mask which allows all possible model delta flags. - * - * @since 3.6 - * @see #setModelDeltaMask(int) - */ - int ALL_MODEL_DELTA_FLAGS = ~0; - - /** - * Bit-mask which allows only flags which control selection and expansion. - * - * @since 3.6 - * @see #setModelDeltaMask(int) - */ - int CONTROL_MODEL_DELTA_FLAGS = - IModelDelta.EXPAND | IModelDelta.COLLAPSE | IModelDelta.SELECT | IModelDelta.REVEAL | IModelDelta.FORCE; - - /** - * Bit-mask which allows only flags which update viewer's information - * about the model. - * - * @since 3.6 - * @see #setModelDeltaMask(int) - */ - int UPDATE_MODEL_DELTA_FLAGS = - IModelDelta.ADDED | IModelDelta.CONTENT | IModelDelta.INSERTED | IModelDelta.INSTALL | IModelDelta.REMOVED | - IModelDelta.REPLACED | IModelDelta.STATE | IModelDelta.UNINSTALL; - - /** - * Translates and returns the given child index from the viewer coordinate - * space to the model coordinate space. - * - * @param parentPath path to parent element - * @param index index of child element in viewer (filtered) space - * @return index of child element in model (raw) space - */ - int viewToModelIndex(TreePath parentPath, int index); - - /** - * Translates and returns the given child count from the viewer coordinate - * space to the model coordinate space. - * - * @param parentPath path to parent element - * @param count number of child elements in viewer (filtered) space - * @return number of child elements in model (raw) space - */ - int viewToModelCount(TreePath parentPath, int count); - - /** - * Translates and returns the given child index from the model coordinate - * space to the viewer coordinate space. - * - * @param parentPath path to parent element - * @param index index of child element in model (raw) space - * @return index of child element in viewer (filtered) space or -1 if filtered - */ - int modelToViewIndex(TreePath parentPath, int index); - - /** - * Returns whether the children of given element should be filtered. - * <p>This method is used to determine whether any of the registered filters - * that extend {@link TreeModelViewerFilter} are applicable to the given - * element. If so, then children of given element should be filtered - * prior to populating them in the viewer. - * - * @param parentElement - * the parent element - * @return whether there are any {@link TreeModelViewerFilter} filters - * applicable to given parent - */ - boolean areTreeModelViewerFiltersApplicable(Object parentElement); - - /** - * Returns whether the given element is filtered. - * - * @param parentElementOrTreePath - * the parent element or path - * @param element - * the child element - * @return whether to filter the element - */ - boolean shouldFilter(Object parentElementOrTreePath, Object element); - - /** - * Notification the given element is being unmapped. - * - * @param path Path to unmap - */ - void unmapPath(TreePath path); - - /** - * Sets the bit mask which will be used to filter the {@link IModelDelta} - * coming from the model. Any delta flags which are hidden by the mask - * will be ignored. - * - * @param mask for <code>IModelDelta</code> flags - * - * @since 3.6 - */ - void setModelDeltaMask(int mask); - - /** - * Returns the current model delta mask. - * - * @return bit mask used to filter model delta events. - * - * @see #setModelDeltaMask(int) - * @since 3.6 - */ - int getModelDeltaMask(); - - /** - * Translates and returns the given child count from the model coordinate - * space to the viewer coordinate space. - * - * @param parentPath path to parent element - * @param count child count element in model (raw) space - * @return child count in viewer (filtered) space - */ - int modelToViewChildCount(TreePath parentPath, int count); - - /** - * Registers the specified listener for view update notifications. - * @param listener Listener to add - */ - void addViewerUpdateListener(IViewerUpdateListener listener); - - /** - * Removes the specified listener from update notifications. - * @param listener Listener to remove - */ - void removeViewerUpdateListener(IViewerUpdateListener listener); - - /** - * Registers the given listener for model delta notification. - * This listener is called immediately after the viewer processes - * the delta. - * @param listener Listener to add - */ - void addModelChangedListener(IModelChangedListener listener); - - /** - * Removes the given listener from model delta notification. - * @param listener Listener to remove - */ - void removeModelChangedListener(IModelChangedListener listener); - - /** - * Causes the content provider to save the expansion and selection state - * of given element. The state is then restored as the tree is lazily - * re-populated. - * @param path Path of the element to save. - */ - void preserveState(TreePath path); - - /** - * Registers the specified listener for state update notifications. - * @param listener Listener to add - * @since 3.6 - */ - void addStateUpdateListener(IStateUpdateListener listener); - - /** - * Removes the specified listener from state update notifications. - * @param listener Listener to remove - * @since 3.6 - */ - void removeStateUpdateListener(IStateUpdateListener listener); - - /** - * Instructs the content provider to process the given model delta. This - * mechanism can be used to control the view's layout (expanding, selecting - * , etc.) - * - * @param delta The model delta to process. - * @param mask Mask that can be used to suppress processing of some of the - * delta flags - * - * @since 3.6 - */ - 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. - */ - void cancelRestore(TreePath path, int flags); - - /** - * Notifies the content provider that a client called {@link Viewer#setInput(Object)}, - * and the viewer input is changed. - * This method is guaranteed to be called after {@link IContentProvider#inputChanged(Viewer, Object, Object)} - * - * @param viewer The viewer that uses this content provider. - * @param oldInput Old input object. - * @param newInput New input object. - * - * @since 3.8 - */ - void postInputChanged(IInternalTreeModelViewer viewer, Object oldInput, Object newInput); - - /** - * Notifies the receiver that the given element has had its - * checked state modified in the viewer. - * - * @param path Path of the element that had its checked state changed - * @param checked The new checked state of the element - * @return false if the check state should not change - */ - boolean setChecked(TreePath path, boolean checked); + /** + * Bit-mask which allows all possible model delta flags. + * + * @since 3.6 + * @see #setModelDeltaMask(int) + */ + int ALL_MODEL_DELTA_FLAGS = ~0; + + /** + * Bit-mask which allows only flags which control selection and expansion. + * + * @since 3.6 + * @see #setModelDeltaMask(int) + */ + int CONTROL_MODEL_DELTA_FLAGS = + IModelDelta.EXPAND | IModelDelta.COLLAPSE | IModelDelta.SELECT | IModelDelta.REVEAL | IModelDelta.FORCE; + + /** + * Bit-mask which allows only flags which update viewer's information + * about the model. + * + * @since 3.6 + * @see #setModelDeltaMask(int) + */ + int UPDATE_MODEL_DELTA_FLAGS = + IModelDelta.ADDED | IModelDelta.CONTENT | IModelDelta.INSERTED | IModelDelta.INSTALL | IModelDelta.REMOVED | + IModelDelta.REPLACED | IModelDelta.STATE | IModelDelta.UNINSTALL; + + /** + * Translates and returns the given child index from the viewer coordinate + * space to the model coordinate space. + * + * @param parentPath path to parent element + * @param index index of child element in viewer (filtered) space + * @return index of child element in model (raw) space + */ + int viewToModelIndex(TreePath parentPath, int index); + + /** + * Translates and returns the given child count from the viewer coordinate + * space to the model coordinate space. + * + * @param parentPath path to parent element + * @param count number of child elements in viewer (filtered) space + * @return number of child elements in model (raw) space + */ + int viewToModelCount(TreePath parentPath, int count); + + /** + * Translates and returns the given child index from the model coordinate + * space to the viewer coordinate space. + * + * @param parentPath path to parent element + * @param index index of child element in model (raw) space + * @return index of child element in viewer (filtered) space or -1 if filtered + */ + int modelToViewIndex(TreePath parentPath, int index); + + /** + * Returns whether the children of given element should be filtered. + * <p>This method is used to determine whether any of the registered filters + * that extend {@link TreeModelViewerFilter} are applicable to the given + * element. If so, then children of given element should be filtered + * prior to populating them in the viewer. + * + * @param parentElement + * the parent element + * @return whether there are any {@link TreeModelViewerFilter} filters + * applicable to given parent + */ + boolean areTreeModelViewerFiltersApplicable(Object parentElement); + + /** + * Returns whether the given element is filtered. + * + * @param parentElementOrTreePath + * the parent element or path + * @param element + * the child element + * @return whether to filter the element + */ + boolean shouldFilter(Object parentElementOrTreePath, Object element); + + /** + * Notification the given element is being unmapped. + * + * @param path Path to unmap + */ + void unmapPath(TreePath path); + + /** + * Sets the bit mask which will be used to filter the {@link IModelDelta} + * coming from the model. Any delta flags which are hidden by the mask + * will be ignored. + * + * @param mask for <code>IModelDelta</code> flags + * + * @since 3.6 + */ + void setModelDeltaMask(int mask); + + /** + * Returns the current model delta mask. + * + * @return bit mask used to filter model delta events. + * + * @see #setModelDeltaMask(int) + * @since 3.6 + */ + int getModelDeltaMask(); + + /** + * Translates and returns the given child count from the model coordinate + * space to the viewer coordinate space. + * + * @param parentPath path to parent element + * @param count child count element in model (raw) space + * @return child count in viewer (filtered) space + */ + int modelToViewChildCount(TreePath parentPath, int count); + + /** + * Registers the specified listener for view update notifications. + * @param listener Listener to add + */ + void addViewerUpdateListener(IViewerUpdateListener listener); + + /** + * Removes the specified listener from update notifications. + * @param listener Listener to remove + */ + void removeViewerUpdateListener(IViewerUpdateListener listener); + + /** + * Registers the given listener for model delta notification. + * This listener is called immediately after the viewer processes + * the delta. + * @param listener Listener to add + */ + void addModelChangedListener(IModelChangedListener listener); + + /** + * Removes the given listener from model delta notification. + * @param listener Listener to remove + */ + void removeModelChangedListener(IModelChangedListener listener); + + /** + * Causes the content provider to save the expansion and selection state + * of given element. The state is then restored as the tree is lazily + * re-populated. + * @param path Path of the element to save. + */ + void preserveState(TreePath path); + + /** + * Registers the specified listener for state update notifications. + * @param listener Listener to add + * @since 3.6 + */ + void addStateUpdateListener(IStateUpdateListener listener); + + /** + * Removes the specified listener from state update notifications. + * @param listener Listener to remove + * @since 3.6 + */ + void removeStateUpdateListener(IStateUpdateListener listener); + + /** + * Instructs the content provider to process the given model delta. This + * mechanism can be used to control the view's layout (expanding, selecting + * , etc.) + * + * @param delta The model delta to process. + * @param mask Mask that can be used to suppress processing of some of the + * delta flags + * + * @since 3.6 + */ + 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. + */ + void cancelRestore(TreePath path, int flags); + + /** + * Notifies the content provider that a client called {@link Viewer#setInput(Object)}, + * and the viewer input is changed. + * This method is guaranteed to be called after {@link IContentProvider#inputChanged(Viewer, Object, Object)} + * + * @param viewer The viewer that uses this content provider. + * @param oldInput Old input object. + * @param newInput New input object. + * + * @since 3.8 + */ + void postInputChanged(IInternalTreeModelViewer viewer, Object oldInput, Object newInput); + + /** + * Notifies the receiver that the given element has had its + * checked state modified in the viewer. + * + * @param path Path of the element that had its checked state changed + * @param checked The new checked state of the element + * @return false if the check state should not change + */ + boolean setChecked(TreePath path, boolean checked); } diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ITreeModelLabelProvider.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ITreeModelLabelProvider.java index da09cf204..f9e720e28 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ITreeModelLabelProvider.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ITreeModelLabelProvider.java @@ -31,50 +31,50 @@ import org.eclipse.swt.graphics.RGB; */ public interface ITreeModelLabelProvider extends IBaseLabelProvider { - /** - * Requests an label update label of the given element. - * @param elementPath Element to update. - * @return true if element label provider is found and update will - * be requested. - */ - boolean update(TreePath elementPath); + /** + * Requests an label update label of the given element. + * @param elementPath Element to update. + * @return true if element label provider is found and update will + * be requested. + */ + boolean update(TreePath elementPath); - /** - * Registers the specified listener for view label update notifications. - * @param listener Listener to add - */ - void addLabelUpdateListener(ILabelUpdateListener listener); + /** + * Registers the specified listener for view label update notifications. + * @param listener Listener to add + */ + void addLabelUpdateListener(ILabelUpdateListener listener); - /** - * Removes the specified listener from view label update notifications. - * @param listener Listener to remove - */ - void removeLabelUpdateListener(ILabelUpdateListener listener); + /** + * Removes the specified listener from view label update notifications. + * @param listener Listener to remove + */ + void removeLabelUpdateListener(ILabelUpdateListener listener); - /** - * Returns an image for the given image descriptor or <code>null</code>. Adds the image - * to a cache of images if it does not already exist. - * - * @param descriptor image descriptor or <code>null</code> - * @return image or <code>null</code> - */ - Image getImage(ImageDescriptor descriptor); + /** + * Returns an image for the given image descriptor or <code>null</code>. Adds the image + * to a cache of images if it does not already exist. + * + * @param descriptor image descriptor or <code>null</code> + * @return image or <code>null</code> + */ + Image getImage(ImageDescriptor descriptor); - /** - * Returns a font for the given font data or <code>null</code>. Adds the font to the font - * cache if not yet created. - * - * @param fontData font data or <code>null</code> - * @return font font or <code>null</code> - */ - Font getFont(FontData fontData); + /** + * Returns a font for the given font data or <code>null</code>. Adds the font to the font + * cache if not yet created. + * + * @param fontData font data or <code>null</code> + * @return font font or <code>null</code> + */ + Font getFont(FontData fontData); - /** - * Returns a color for the given RGB or <code>null</code>. Adds the color to the color - * cache if not yet created. - * - * @param rgb RGB or <code>null</code> - * @return color or <code>null</code> - */ - Color getColor(RGB rgb); + /** + * Returns a color for the given RGB or <code>null</code>. Adds the color to the color + * cache if not yet created. + * + * @param rgb RGB or <code>null</code> + * @return color or <code>null</code> + */ + Color getColor(RGB rgb); } 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 20bfcc8e1..3bc99b786 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 @@ -82,41 +82,41 @@ public class InternalTreeModelViewer extends TreeViewer implements IInternalTree private final IPresentationContext fContext; - /** - * Current column presentation or <code>null</code> - */ - private IColumnPresentation fColumnPresentation = null; - - /** - * Map of columns presentation id to its visible columns id's (String[]) - * When a columns presentation is not in the map, default settings are used. - */ + /** + * Current column presentation or <code>null</code> + */ + private IColumnPresentation fColumnPresentation = null; + + /** + * Map of columns presentation id to its visible columns id's (String[]) + * When a columns presentation is not in the map, default settings are used. + */ private final Map<String, String[]> fVisibleColumns = new HashMap<>(); - /** - * Map of column id's to persisted sizes - */ + /** + * Map of column id's to persisted sizes + */ private final Map<Object, Integer> fColumnSizes = new HashMap<>(); - /** - * Map of column presentation id's to an array of integers representing the column order - * for that presentation, or <code>null</code> if default. - */ + /** + * Map of column presentation id's to an array of integers representing the column order + * for that presentation, or <code>null</code> if default. + */ private final Map<String, int[]> fColumnOrder = new HashMap<>(); - /** - * Map of column presentation id to whether columns should be displayed - * for that presentation (the user can toggle columns on/off when a - * presentation is optional. - */ + /** + * Map of column presentation id to whether columns should be displayed + * for that presentation (the user can toggle columns on/off when a + * presentation is optional. + */ private final Map<String, Boolean> fShowColumns = new HashMap<>(); - /** - * Item's tree path cache - */ - private static final String TREE_PATH_KEY = "TREE_PATH_KEY"; //$NON-NLS-1$ + /** + * Item's tree path cache + */ + private static final String TREE_PATH_KEY = "TREE_PATH_KEY"; //$NON-NLS-1$ - /** + /** * Memento type for column sizes. Sizes are keyed by column presentation id */ private static final String COLUMN_SIZES = "COLUMN_SIZES"; //$NON-NLS-1$ @@ -190,15 +190,15 @@ public class InternalTreeModelViewer extends TreeViewer implements IInternalTree if (fModifier.canModify(element, property)) { // install cell editor CellEditor cellEditor = editor.getCellEditor(getPresentationContext(), property, element, (Composite)getControl()); - if (cellEditor != null) { - disposeCellEditors(); - CellEditor[] newEditors = new CellEditor[getVisibleColumns().length]; - for (int i = 0; i < newEditors.length; i++) { + if (cellEditor != null) { + disposeCellEditors(); + CellEditor[] newEditors = new CellEditor[getVisibleColumns().length]; + for (int i = 0; i < newEditors.length; i++) { newEditors[i] = cellEditor; } - setCellEditors(newEditors); - return true; - } + setCellEditors(newEditors); + return true; + } } } } @@ -271,12 +271,12 @@ public class InternalTreeModelViewer extends TreeViewer implements IInternalTree // A pop-up viewer is transient and does not automatically expand // and select elements up when requested by the model if ((style & SWT.POP_UP) != 0) { - ((ITreeModelContentProvider)getContentProvider()).setModelDeltaMask( - ~ITreeModelContentProvider.CONTROL_MODEL_DELTA_FLAGS); + ((ITreeModelContentProvider)getContentProvider()).setModelDeltaMask( + ~ITreeModelContentProvider.CONTROL_MODEL_DELTA_FLAGS); + } + if ((style & SWT.CHECK) != 0) { + context.setProperty(ICheckUpdate.PROP_CHECK, Boolean.TRUE); } - if ((style & SWT.CHECK) != 0) { - context.setProperty(ICheckUpdate.PROP_CHECK, Boolean.TRUE); - } } /** @@ -346,14 +346,14 @@ public class InternalTreeModelViewer extends TreeViewer implements IInternalTree item.setBackground(i, (Color) backgrounds[i]); } } - Boolean checked = (Boolean) item.getData(PREV_CHECKED_KEY); - if (checked != null) { - item.setChecked(checked.booleanValue()); - } - Boolean grayed = (Boolean) item.getData(PREV_GRAYED_KEY); - if (grayed != null) { - item.setGrayed(grayed.booleanValue()); - } + Boolean checked = (Boolean) item.getData(PREV_CHECKED_KEY); + if (checked != null) { + item.setChecked(checked.booleanValue()); + } + Boolean grayed = (Boolean) item.getData(PREV_GRAYED_KEY); + if (grayed != null) { + item.setGrayed(grayed.booleanValue()); + } } /* @@ -362,23 +362,23 @@ public class InternalTreeModelViewer extends TreeViewer implements IInternalTree */ @Override protected void handleInvalidSelection(ISelection selection, ISelection newSelection) { - IModelSelectionPolicy selectionPolicy = ViewerAdapterService.getSelectionPolicy(selection, getPresentationContext()); - if (selectionPolicy != null) { - while (!selection.equals(newSelection)) { - ISelection temp = newSelection; - selection = selectionPolicy.replaceInvalidSelection(selection, newSelection); - if (selection == null) { - selection = TreeSelection.EMPTY; - } - if (!temp.equals(selection)) { - setSelectionToWidget(selection, false); - newSelection = getSelection(); - } else { - break; - } - } - } - super.handleInvalidSelection(selection, newSelection); + IModelSelectionPolicy selectionPolicy = ViewerAdapterService.getSelectionPolicy(selection, getPresentationContext()); + if (selectionPolicy != null) { + while (!selection.equals(newSelection)) { + ISelection temp = newSelection; + selection = selectionPolicy.replaceInvalidSelection(selection, newSelection); + if (selection == null) { + selection = TreeSelection.EMPTY; + } + if (!temp.equals(selection)) { + setSelectionToWidget(selection, false); + newSelection = getSelection(); + } else { + break; + } + } + } + super.handleInvalidSelection(selection, newSelection); } @Override @@ -405,7 +405,7 @@ public class InternalTreeModelViewer extends TreeViewer implements IInternalTree protected void unmapElement(Object element, Widget widget) { if (fNotifyUnmap) { // TODO: should we update the filter with the "new non-identical element"? - ((ITreeModelContentProvider) getContentProvider()).unmapPath((TreePath) widget.getData(TREE_PATH_KEY)); + ((ITreeModelContentProvider) getContentProvider()).unmapPath((TreePath) widget.getData(TREE_PATH_KEY)); } super.unmapElement(element, widget); } @@ -468,20 +468,20 @@ public class InternalTreeModelViewer extends TreeViewer implements IInternalTree @Override protected void unmapAllElements() { - // Do nothing when called from StructuredViewer.setInput(), to avoid - // clearing elements before viewer state is saved. - // Bug 326917 - if (getControl().isDisposed()) { - unmapAllElements(); - } + // Do nothing when called from StructuredViewer.setInput(), to avoid + // clearing elements before viewer state is saved. + // Bug 326917 + if (getControl().isDisposed()) { + unmapAllElements(); + } } @Override protected void inputChanged(Object input, Object oldInput) { - fCellModifier.clear(); - // Clear items map now that ITreeModelContentProvider.inputChanged() was already called. - // Bug 326917 - super.unmapAllElements(); + fCellModifier.clear(); + // Clear items map now that ITreeModelContentProvider.inputChanged() was already called. + // Bug 326917 + super.unmapAllElements(); ((ITreeModelContentProvider)getContentProvider()).postInputChanged(this, oldInput, input); super.inputChanged(input, oldInput); @@ -489,19 +489,19 @@ public class InternalTreeModelViewer extends TreeViewer implements IInternalTree } /** - * Configures the columns for the given viewer input. - * - * @param input the viewer input - */ - protected void resetColumns(Object input) { - if (input != null) { - // only change columns if the input is non-null (persist when empty) - IColumnPresentationFactory factory = ViewerAdapterService.getColumnPresentationFactory(input); - PresentationContext context = (PresentationContext) getPresentationContext(); - String type = null; - if (factory != null) { - type = factory.getColumnPresentationId(context, input); - } + * Configures the columns for the given viewer input. + * + * @param input the viewer input + */ + protected void resetColumns(Object input) { + if (input != null) { + // only change columns if the input is non-null (persist when empty) + IColumnPresentationFactory factory = ViewerAdapterService.getColumnPresentationFactory(input); + PresentationContext context = (PresentationContext) getPresentationContext(); + String type = null; + if (factory != null) { + type = factory.getColumnPresentationId(context, input); + } if (type != null && factory != null) { if (fColumnPresentation != null) { if (!fColumnPresentation.getId().equals(type)) { @@ -524,14 +524,14 @@ public class InternalTreeModelViewer extends TreeViewer implements IInternalTree configureColumns(); } } - } - } - - /** - * Configures the columns based on the current settings. - */ - protected void configureColumns() { - if (fColumnPresentation != null) { + } + } + + /** + * Configures the columns based on the current settings. + */ + protected void configureColumns() { + if (fColumnPresentation != null) { IColumnPresentation build = null; if (isShowColumns(fColumnPresentation.getId())) { build = fColumnPresentation; @@ -541,7 +541,7 @@ public class InternalTreeModelViewer extends TreeViewer implements IInternalTree // get rid of columns buildColumns(null); } - } + } /** * Toggles columns on/off for the current column presentation, if any. @@ -608,33 +608,33 @@ public class InternalTreeModelViewer extends TreeViewer implements IInternalTree @Override protected void internalRefresh(Object element, boolean updateLabels) { - ITreeModelContentProvider contentProvider = (ITreeModelContentProvider)getContentProvider(); - - if (element == null) { - internalRefresh(getControl(), getRoot(), true, updateLabels); - contentProvider.preserveState(TreePath.EMPTY); - } else { - Widget[] items = findItems(element); - if (items.length != 0) { - for (int i = 0; i < items.length; i++) { - if (items[i] instanceof TreeItem) { - contentProvider.preserveState(getTreePathFromItem((TreeItem)items[i])); - } else { - contentProvider.preserveState(TreePath.EMPTY); - } - } - } - } - super.internalRefresh(element, updateLabels); - } - - /** - * Refreshes the columns in the view, based on the viewer input. - */ - protected void refreshColumns() { - configureColumns(); - refresh(); - } + ITreeModelContentProvider contentProvider = (ITreeModelContentProvider)getContentProvider(); + + if (element == null) { + internalRefresh(getControl(), getRoot(), true, updateLabels); + contentProvider.preserveState(TreePath.EMPTY); + } else { + Widget[] items = findItems(element); + if (items.length != 0) { + for (int i = 0; i < items.length; i++) { + if (items[i] instanceof TreeItem) { + contentProvider.preserveState(getTreePathFromItem((TreeItem)items[i])); + } else { + contentProvider.preserveState(TreePath.EMPTY); + } + } + } + } + super.internalRefresh(element, updateLabels); + } + + /** + * Refreshes the columns in the view, based on the viewer input. + */ + protected void refreshColumns() { + configureColumns(); + refresh(); + } /** * Returns whether columns are being displayed currently. @@ -665,28 +665,28 @@ public class InternalTreeModelViewer extends TreeViewer implements IInternalTree return bool.booleanValue(); } - /** - * Creates new columns for the given presentation. - * - * TODO: does this need to be asynchronous? - * - * @param presentation the column presentation to build from - */ - protected void buildColumns(IColumnPresentation presentation) { - // dispose current columns, persisting their weights - Tree tree = getTree(); + /** + * Creates new columns for the given presentation. + * + * TODO: does this need to be asynchronous? + * + * @param presentation the column presentation to build from + */ + protected void buildColumns(IColumnPresentation presentation) { + // dispose current columns, persisting their weights + Tree tree = getTree(); final TreeColumn[] columns = tree.getColumns(); String[] visibleColumnIds = getVisibleColumns(); // remove all listeners before disposing - see bug 223233 - for (int i = 0; i < columns.length; i++) { - columns[i].removeControlListener(fListener); - } - for (int i = 0; i < columns.length; i++) { + for (int i = 0; i < columns.length; i++) { + columns[i].removeControlListener(fListener); + } + for (int i = 0; i < columns.length; i++) { columns[i].dispose(); } - PresentationContext presentationContext = (PresentationContext) getPresentationContext(); - if (presentation != null) { - for (int i = 0; i < visibleColumnIds.length; i++) { + PresentationContext presentationContext = (PresentationContext) getPresentationContext(); + if (presentation != null) { + for (int i = 0; i < visibleColumnIds.length; i++) { String id = visibleColumnIds[i]; String header = presentation.getHeader(id); // TODO: allow client to specify style @@ -700,68 +700,68 @@ public class InternalTreeModelViewer extends TreeViewer implements IInternalTree } column.setData(id); } - int[] order = fColumnOrder.get(presentation.getId()); - if (order != null) { - tree.setColumnOrder(order); - } - tree.setHeaderVisible(true); - tree.setLinesVisible(true); - presentationContext.setColumns(visibleColumnIds); - setColumnProperties(visibleColumnIds); - setCellModifier(fCellModifier); - } else { - tree.setHeaderVisible(false); - tree.setLinesVisible(false); - presentationContext.setColumns(null); - setCellModifier(null); - setColumnProperties(null); - } - - int treeWidgetWidth = tree.getSize().x; - int avg = treeWidgetWidth; - if (visibleColumnIds != null) { + int[] order = fColumnOrder.get(presentation.getId()); + if (order != null) { + tree.setColumnOrder(order); + } + tree.setHeaderVisible(true); + tree.setLinesVisible(true); + presentationContext.setColumns(visibleColumnIds); + setColumnProperties(visibleColumnIds); + setCellModifier(fCellModifier); + } else { + tree.setHeaderVisible(false); + tree.setLinesVisible(false); + presentationContext.setColumns(null); + setCellModifier(null); + setColumnProperties(null); + } + + int treeWidgetWidth = tree.getSize().x; + int avg = treeWidgetWidth; + if (visibleColumnIds != null) { avg /= visibleColumnIds.length; } - if (avg == 0) { - tree.addPaintListener(new PaintListener() { - @Override + if (avg == 0) { + tree.addPaintListener(new PaintListener() { + @Override public void paintControl(PaintEvent e) { - Tree tree2 = getTree(); - String[] visibleColumns = getVisibleColumns(); - if (visibleColumns != null) { - int treeWidgetWidth1 = tree2.getSize().x; + Tree tree2 = getTree(); + String[] visibleColumns = getVisibleColumns(); + if (visibleColumns != null) { + int treeWidgetWidth1 = tree2.getSize().x; int avg1 = treeWidgetWidth1 / visibleColumns.length; - initColumns(avg1, treeWidgetWidth1, visibleColumns); - } - tree2.removePaintListener(this); - } - }); - } else { - initColumns(avg, treeWidgetWidth, visibleColumnIds); - } - } - - private void initColumns(int widthHint, int treeWidgetWidth, String[] visibleColumnIds) { - TreeColumn[] columns = getTree().getColumns(); - for (int i = 0; i < columns.length; i++) { - TreeColumn treeColumn = columns[i]; - Object colData = treeColumn.getData(); - String columnId = colData instanceof String ? (String) colData : null; - Integer width = fColumnSizes.get(colData); - if (width == null) { - int ans = getInitialColumnWidth(columnId, treeWidgetWidth, visibleColumnIds); - if (ans == -1) { - treeColumn.setWidth(widthHint); - } else { - treeColumn.setWidth(ans); - } - } else { - treeColumn.setWidth(width.intValue()); - } - treeColumn.addControlListener(fListener); - } - } + initColumns(avg1, treeWidgetWidth1, visibleColumns); + } + tree2.removePaintListener(this); + } + }); + } else { + initColumns(avg, treeWidgetWidth, visibleColumnIds); + } + } + + private void initColumns(int widthHint, int treeWidgetWidth, String[] visibleColumnIds) { + TreeColumn[] columns = getTree().getColumns(); + for (int i = 0; i < columns.length; i++) { + TreeColumn treeColumn = columns[i]; + Object colData = treeColumn.getData(); + String columnId = colData instanceof String ? (String) colData : null; + Integer width = fColumnSizes.get(colData); + if (width == null) { + int ans = getInitialColumnWidth(columnId, treeWidgetWidth, visibleColumnIds); + if (ans == -1) { + treeColumn.setWidth(widthHint); + } else { + treeColumn.setWidth(ans); + } + } else { + treeColumn.setWidth(width.intValue()); + } + treeColumn.addControlListener(fListener); + } + } /** * Returns the current column presentation for this viewer, or <code>null</code> @@ -788,25 +788,25 @@ public class InternalTreeModelViewer extends TreeViewer implements IInternalTree if (columns == null) { return presentation.getInitialColumns(); } else { - String[] available = presentation.getAvailableColumns(); - for (int i = 0; i < columns.length; i++) { - boolean columnAvailable = false; - for (int j = 0; j < available.length; j++) { - if (columns[i].equals(available[j])) { + String[] available = presentation.getAvailableColumns(); + for (int i = 0; i < columns.length; i++) { + boolean columnAvailable = false; + for (int j = 0; j < available.length; j++) { + if (columns[i].equals(available[j])) { columnAvailable = true; } - } - - if (!columnAvailable || presentation.getHeader(columns[i]) == null) { - // We found a column ID which is not in current list of available column IDs. - // Or the presentation cannot return a header title for the given column. - // Clear out saved column data for given column presentation. - fVisibleColumns.remove(presentation.getId()); - fColumnOrder.remove(presentation.getId()); - fColumnSizes.remove(presentation.getId()); - return presentation.getInitialColumns(); - } - } + } + + if (!columnAvailable || presentation.getHeader(columns[i]) == null) { + // We found a column ID which is not in current list of available column IDs. + // Or the presentation cannot return a header title for the given column. + // Clear out saved column data for given column presentation. + fVisibleColumns.remove(presentation.getId()); + fColumnOrder.remove(presentation.getId()); + fColumnSizes.remove(presentation.getId()); + return presentation.getInitialColumns(); + } + } } return columns; } @@ -834,9 +834,9 @@ public class InternalTreeModelViewer extends TreeViewer implements IInternalTree } /** - * Persists column sizes in cache - */ - protected void persistColumnSizes() { + * Persists column sizes in cache + */ + protected void persistColumnSizes() { Tree tree = getTree(); TreeColumn[] columns = tree.getColumns(); for (int i = 0; i < columns.length; i++) { @@ -844,29 +844,29 @@ public class InternalTreeModelViewer extends TreeViewer implements IInternalTree Object id = treeColumn.getData(); fColumnSizes.put(id, Integer.valueOf(treeColumn.getWidth())); } - } - - /** - * Persists column ordering - */ - protected void persistColumnOrder() { - IColumnPresentation presentation = getColumnPresentation(); - if (presentation != null) { - Tree tree = getTree(); - int[] order = tree.getColumnOrder(); - if (order.length > 0) { - for (int i = 0; i < order.length; i++) { + } + + /** + * Persists column ordering + */ + protected void persistColumnOrder() { + IColumnPresentation presentation = getColumnPresentation(); + if (presentation != null) { + Tree tree = getTree(); + int[] order = tree.getColumnOrder(); + if (order.length > 0) { + for (int i = 0; i < order.length; i++) { if (i != order[i]) { // non default order fColumnOrder.put(presentation.getId(), order); return; } } - } - // default order - fColumnOrder.remove(presentation.getId()); - } - } + } + // default order + fColumnOrder.remove(presentation.getId()); + } + } /** * Save viewer state into the given memento. @@ -1022,7 +1022,7 @@ public class InternalTreeModelViewer extends TreeViewer implements IInternalTree return false; } /** - * Registers the specified listener for view update notifications. + * Registers the specified listener for view update notifications. * * @param listener listener */ @@ -1038,7 +1038,7 @@ public class InternalTreeModelViewer extends TreeViewer implements IInternalTree */ @Override public void removeViewerUpdateListener(IViewerUpdateListener listener) { - ITreeModelContentProvider cp = (ITreeModelContentProvider)getContentProvider(); + ITreeModelContentProvider cp = (ITreeModelContentProvider)getContentProvider(); if (cp != null) { cp.removeViewerUpdateListener(listener); } @@ -1061,24 +1061,24 @@ public class InternalTreeModelViewer extends TreeViewer implements IInternalTree */ @Override public void removeModelChangedListener(IModelChangedListener listener) { - ITreeModelContentProvider cp = (ITreeModelContentProvider)getContentProvider(); + ITreeModelContentProvider cp = (ITreeModelContentProvider)getContentProvider(); if (cp != null) { cp.removeModelChangedListener(listener); } } - @Override + @Override public void addStateUpdateListener(IStateUpdateListener listener) { - ((ITreeModelContentProvider)getContentProvider()).addStateUpdateListener(listener); - } + ((ITreeModelContentProvider)getContentProvider()).addStateUpdateListener(listener); + } - @Override + @Override public void removeStateUpdateListener(IStateUpdateListener listener) { - ITreeModelContentProvider cp = (ITreeModelContentProvider)getContentProvider(); - if (cp != null) { - cp.removeStateUpdateListener(listener); - } - } + ITreeModelContentProvider cp = (ITreeModelContentProvider)getContentProvider(); + if (cp != null) { + cp.removeStateUpdateListener(listener); + } + } @Override protected void doUpdateItem(final Item item, Object element) { @@ -1092,9 +1092,9 @@ public class InternalTreeModelViewer extends TreeViewer implements IInternalTree } if ( !((ITreeModelLabelProvider)getLabelProvider()).update(getTreePathFromItem(item)) ) { - if (element instanceof String) { - item.setData(PREV_LABEL_KEY, new String[] { (String)element } ); - } + if (element instanceof String) { + item.setData(PREV_LABEL_KEY, new String[] { (String)element } ); + } } @@ -1107,14 +1107,14 @@ public class InternalTreeModelViewer extends TreeViewer implements IInternalTree @Override public void addLabelUpdateListener(ILabelUpdateListener listener) { - ((ITreeModelLabelProvider)getLabelProvider()).addLabelUpdateListener(listener); + ((ITreeModelLabelProvider)getLabelProvider()).addLabelUpdateListener(listener); } @Override public void removeLabelUpdateListener(ILabelUpdateListener listener) { - if (!getControl().isDisposed()) { - ((ITreeModelLabelProvider)getLabelProvider()).removeLabelUpdateListener(listener); - } + if (!getControl().isDisposed()) { + ((ITreeModelLabelProvider)getLabelProvider()).removeLabelUpdateListener(listener); + } } /** @@ -1271,50 +1271,50 @@ public class InternalTreeModelViewer extends TreeViewer implements IInternalTree //************************************************************************** // Another couple of methods copied from TreeViewer to workaround the UI bug 266189. // - @Override + @Override protected void createChildren(Widget widget) { - Object element = widget.getData(); - if (element == null && widget instanceof TreeItem) { - // parent has not been materialized - virtualMaterializeItem((TreeItem) widget); - // try getting the element now that updateElement was called - element = widget.getData(); - } - if (element == null) { - // give up because the parent is still not materialized - return; - } - Item[] children = getChildren(widget); - if (children.length == 1 && children[0].getData() == null) { - // found a dummy node - virtualLazyUpdateChildCount(widget, children.length); - children = getChildren(widget); - } - // DO NOT touch all children - return; - } - - private void virtualMaterializeItem(TreeItem treeItem) { - if (treeItem.getData() != null) { - // already materialized - return; - } - - int index; - Widget parent = treeItem.getParentItem(); - if (parent == null) { - parent = treeItem.getParent(); - } - Object parentElement = parent.getData(); - if (parentElement != null) { - if (parent instanceof Tree) { - index = ((Tree) parent).indexOf(treeItem); - } else { - index = ((TreeItem) parent).indexOf(treeItem); - } - virtualLazyUpdateWidget(parent, index); - } - } + Object element = widget.getData(); + if (element == null && widget instanceof TreeItem) { + // parent has not been materialized + virtualMaterializeItem((TreeItem) widget); + // try getting the element now that updateElement was called + element = widget.getData(); + } + if (element == null) { + // give up because the parent is still not materialized + return; + } + Item[] children = getChildren(widget); + if (children.length == 1 && children[0].getData() == null) { + // found a dummy node + virtualLazyUpdateChildCount(widget, children.length); + children = getChildren(widget); + } + // DO NOT touch all children + return; + } + + private void virtualMaterializeItem(TreeItem treeItem) { + if (treeItem.getData() != null) { + // already materialized + return; + } + + int index; + Widget parent = treeItem.getParentItem(); + if (parent == null) { + parent = treeItem.getParent(); + } + Object parentElement = parent.getData(); + if (parentElement != null) { + if (parent instanceof Tree) { + index = ((Tree) parent).indexOf(treeItem); + } else { + index = ((TreeItem) parent).indexOf(treeItem); + } + virtualLazyUpdateWidget(parent, index); + } + } /** @@ -1333,470 +1333,470 @@ public class InternalTreeModelViewer extends TreeViewer implements IInternalTree } } - @Override + @Override public int findElementIndex(TreePath parentPath, Object element) { - Widget parentItem = findItem(parentPath); - if (parentItem != null) { - Item[] children = getChildren(parentItem); - for (int i = 0; i < children.length; i++) { - Item item = children[i]; - Object data = item.getData(); - if ( (element != null && element.equals(data)) || (element == null && data == null) ) { - return i; - } - } - } - return -1; - } - - @Override + Widget parentItem = findItem(parentPath); + if (parentItem != null) { + Item[] children = getChildren(parentItem); + for (int i = 0; i < children.length; i++) { + Item item = children[i]; + Object data = item.getData(); + if ( (element != null && element.equals(data)) || (element == null && data == null) ) { + return i; + } + } + } + return -1; + } + + @Override public boolean getElementChildrenRealized(TreePath parentPath) { - Widget parentItem = findItem(parentPath); - if (parentItem != null) { - Item[] children = getChildren(parentItem); - for (int i = 0; i < children.length; i++) { - if (children[i].getData() == null) { - return false; - } - } - } - return true; - } - - @Override + Widget parentItem = findItem(parentPath); + if (parentItem != null) { + Item[] children = getChildren(parentItem); + for (int i = 0; i < children.length; i++) { + if (children[i].getData() == null) { + return false; + } + } + } + return true; + } + + @Override public Display getDisplay() { - Control control = getControl(); + Control control = getControl(); if (control != null && !control.isDisposed()) { - return control.getDisplay(); - } - return null; - } + return control.getDisplay(); + } + return null; + } - protected static final String[] STATE_PROPERTIES = new String[]{ IBasicPropertyConstants.P_TEXT, IBasicPropertyConstants.P_IMAGE }; + protected static final String[] STATE_PROPERTIES = new String[]{ IBasicPropertyConstants.P_TEXT, IBasicPropertyConstants.P_IMAGE }; - @Override + @Override public void update(Object element) { - update(element, STATE_PROPERTIES); - } - - /** - * Label data cache keys - * TODO: workaround for bug 159461 - */ - static String PREV_LABEL_KEY = "PREV_LABEL_KEY"; //$NON-NLS-1$ - static String PREV_IMAGE_KEY = "PREV_IMAGE_KEY"; //$NON-NLS-1$ - static String PREV_FONT_KEY = "PREV_FONT_KEY"; //$NON-NLS-1$ - static String PREV_FOREGROUND_KEY = "PREV_FOREGROUND_KEY"; //$NON-NLS-1$ - static String PREV_BACKGROUND_KEY = "PREV_BACKGROUND_KEY"; //$NON-NLS-1$ - static String PREV_CHECKED_KEY = "PREV_CHECKED_KEY"; //$NON-NLS-1$ - static String PREV_GRAYED_KEY = "PREV_GRAYED_KEY"; //$NON-NLS-1$ - - @Override + update(element, STATE_PROPERTIES); + } + + /** + * Label data cache keys + * TODO: workaround for bug 159461 + */ + static String PREV_LABEL_KEY = "PREV_LABEL_KEY"; //$NON-NLS-1$ + static String PREV_IMAGE_KEY = "PREV_IMAGE_KEY"; //$NON-NLS-1$ + static String PREV_FONT_KEY = "PREV_FONT_KEY"; //$NON-NLS-1$ + static String PREV_FOREGROUND_KEY = "PREV_FOREGROUND_KEY"; //$NON-NLS-1$ + static String PREV_BACKGROUND_KEY = "PREV_BACKGROUND_KEY"; //$NON-NLS-1$ + static String PREV_CHECKED_KEY = "PREV_CHECKED_KEY"; //$NON-NLS-1$ + static String PREV_GRAYED_KEY = "PREV_GRAYED_KEY"; //$NON-NLS-1$ + + @Override public void setElementData(TreePath path, int numColumns, String[] labels, ImageDescriptor[] imageDescriptors, - FontData[] fontDatas, RGB[] _foregrounds, RGB[] _backgrounds) - { - Widget widget = findItem(path); - String[] columnIds = getVisibleColumns(); - - if (widget != null && widget instanceof TreeItem && !widget.isDisposed()) { - TreeItem item = (TreeItem)widget; - /*Object data = item.getData(); - int itemCount = item.getItemCount(); - item.clearAll(false); - item.setData(data); - item.setItemCount(itemCount);*/ - - for (int i=0; i<numColumns; i++){ - // text might be null if the launch has been terminated - item.setText(i,(labels[i] == null ? IInternalDebugCoreConstants.EMPTY_STRING : labels[i])); - } - item.setData(PREV_LABEL_KEY, labels); - - if (imageDescriptors == null) { - for (int i=0; i<numColumns; i++){ - item.setImage(i,null); - } - item.setData(PREV_IMAGE_KEY, null); - } else { - Image[] images = new Image[imageDescriptors.length]; - for (int i = 0; i < imageDescriptors.length; i++) { - images[i] = ((ITreeModelLabelProvider)getLabelProvider()).getImage(imageDescriptors[i]); - } - if (columnIds == null) { - item.setImage(images[0]); - } else { - item.setImage(images); - } - item.setData(PREV_IMAGE_KEY, images); - } - - if (_foregrounds == null) { - for (int i=0; i<numColumns; i++){ - item.setForeground(i,null); - } - item.setData(PREV_FOREGROUND_KEY, null); - } else { - Color[] foregrounds = new Color[_foregrounds.length]; - for (int i = 0; i< foregrounds.length; i++) { - foregrounds[i] = ((ITreeModelLabelProvider)getLabelProvider()).getColor(_foregrounds[i]); - } - if (columnIds == null) { - item.setForeground(0,foregrounds[0]); - } else { - for (int i = 0; i< foregrounds.length; i++) { - item.setForeground(i, foregrounds[i]); - } - } - item.setData(PREV_FOREGROUND_KEY, foregrounds); - } - - if (_backgrounds == null) { - for (int i=0; i<numColumns; i++){ - item.setBackground(i,null); - } - item.setData(PREV_BACKGROUND_KEY, null); - } else { - Color[] backgrounds = new Color[_backgrounds.length]; - for (int i = 0; i< backgrounds.length; i++) { - backgrounds[i] = ((ITreeModelLabelProvider)getLabelProvider()).getColor(_backgrounds[i]); - } - if (columnIds == null) { - item.setBackground(0,backgrounds[0]); - } else { - for (int i = 0; i< backgrounds.length; i++) { - item.setBackground(i, backgrounds[i]); - } - } - item.setData(PREV_BACKGROUND_KEY, backgrounds); - } - - if (fontDatas == null) { - for (int i=0; i<numColumns; i++){ - item.setFont(i,null); - } - item.setData(PREV_FONT_KEY, null); - } else { - Font[] fonts = new Font[fontDatas.length]; - for (int i = 0; i < fontDatas.length; i++) { - fonts[i] = ((ITreeModelLabelProvider)getLabelProvider()).getFont(fontDatas[i]); - } - if (columnIds == null) { - item.setFont(0,fonts[0]); - } else { - for (int i = 0; i < fonts.length; i++) { - item.setFont(i, fonts[i]); - } - } - item.setData(PREV_FONT_KEY, fonts); - } - } - } - - @Override + FontData[] fontDatas, RGB[] _foregrounds, RGB[] _backgrounds) + { + Widget widget = findItem(path); + String[] columnIds = getVisibleColumns(); + + if (widget != null && widget instanceof TreeItem && !widget.isDisposed()) { + TreeItem item = (TreeItem)widget; + /*Object data = item.getData(); + int itemCount = item.getItemCount(); + item.clearAll(false); + item.setData(data); + item.setItemCount(itemCount);*/ + + for (int i=0; i<numColumns; i++){ + // text might be null if the launch has been terminated + item.setText(i,(labels[i] == null ? IInternalDebugCoreConstants.EMPTY_STRING : labels[i])); + } + item.setData(PREV_LABEL_KEY, labels); + + if (imageDescriptors == null) { + for (int i=0; i<numColumns; i++){ + item.setImage(i,null); + } + item.setData(PREV_IMAGE_KEY, null); + } else { + Image[] images = new Image[imageDescriptors.length]; + for (int i = 0; i < imageDescriptors.length; i++) { + images[i] = ((ITreeModelLabelProvider)getLabelProvider()).getImage(imageDescriptors[i]); + } + if (columnIds == null) { + item.setImage(images[0]); + } else { + item.setImage(images); + } + item.setData(PREV_IMAGE_KEY, images); + } + + if (_foregrounds == null) { + for (int i=0; i<numColumns; i++){ + item.setForeground(i,null); + } + item.setData(PREV_FOREGROUND_KEY, null); + } else { + Color[] foregrounds = new Color[_foregrounds.length]; + for (int i = 0; i< foregrounds.length; i++) { + foregrounds[i] = ((ITreeModelLabelProvider)getLabelProvider()).getColor(_foregrounds[i]); + } + if (columnIds == null) { + item.setForeground(0,foregrounds[0]); + } else { + for (int i = 0; i< foregrounds.length; i++) { + item.setForeground(i, foregrounds[i]); + } + } + item.setData(PREV_FOREGROUND_KEY, foregrounds); + } + + if (_backgrounds == null) { + for (int i=0; i<numColumns; i++){ + item.setBackground(i,null); + } + item.setData(PREV_BACKGROUND_KEY, null); + } else { + Color[] backgrounds = new Color[_backgrounds.length]; + for (int i = 0; i< backgrounds.length; i++) { + backgrounds[i] = ((ITreeModelLabelProvider)getLabelProvider()).getColor(_backgrounds[i]); + } + if (columnIds == null) { + item.setBackground(0,backgrounds[0]); + } else { + for (int i = 0; i< backgrounds.length; i++) { + item.setBackground(i, backgrounds[i]); + } + } + item.setData(PREV_BACKGROUND_KEY, backgrounds); + } + + if (fontDatas == null) { + for (int i=0; i<numColumns; i++){ + item.setFont(i,null); + } + item.setData(PREV_FONT_KEY, null); + } else { + Font[] fonts = new Font[fontDatas.length]; + for (int i = 0; i < fontDatas.length; i++) { + fonts[i] = ((ITreeModelLabelProvider)getLabelProvider()).getFont(fontDatas[i]); + } + if (columnIds == null) { + item.setFont(0,fonts[0]); + } else { + for (int i = 0; i < fonts.length; i++) { + item.setFont(i, fonts[i]); + } + } + item.setData(PREV_FONT_KEY, fonts); + } + } + } + + @Override public ViewerLabel getElementLabel(TreePath path, String columnId) { - if (path.getSegmentCount() == 0) { - return null; - } - - int columnIdx = -1; - String[] visibleColumns = getVisibleColumns(); - if (columnId != null && visibleColumns != null) { - int i = 0; - for (i = 0; i < visibleColumns.length; i++) { - if (columnId.equals(getVisibleColumns()[i])) { - columnIdx = i; - break; - } - } - if (i == visibleColumns.length) { - return null; - } - } else { - columnIdx = 0; - } - TreeItem item = (TreeItem)findItem(path); - - if (item != null) { - ViewerLabel label = new ViewerLabel(item.getText(columnIdx), item.getImage(columnIdx)); - label.setFont(item.getFont(columnIdx)); - label.setBackground(item.getBackground(columnIdx)); - label.setForeground(item.getForeground(columnIdx)); - return label; - } - return null; - } - - @Override + if (path.getSegmentCount() == 0) { + return null; + } + + int columnIdx = -1; + String[] visibleColumns = getVisibleColumns(); + if (columnId != null && visibleColumns != null) { + int i = 0; + for (i = 0; i < visibleColumns.length; i++) { + if (columnId.equals(getVisibleColumns()[i])) { + columnIdx = i; + break; + } + } + if (i == visibleColumns.length) { + return null; + } + } else { + columnIdx = 0; + } + TreeItem item = (TreeItem)findItem(path); + + if (item != null) { + ViewerLabel label = new ViewerLabel(item.getText(columnIdx), item.getImage(columnIdx)); + label.setFont(item.getFont(columnIdx)); + label.setBackground(item.getBackground(columnIdx)); + label.setForeground(item.getForeground(columnIdx)); + return label; + } + return null; + } + + @Override public void reveal(TreePath path, int index) { - Widget item = findItem(path); - TreeItem[] children = null; - if (item instanceof TreeItem) { - children = ((TreeItem)item).getItems(); - } else if (item instanceof Tree) { - children = ((Tree)item).getItems(); - } - if (children != null && index < children.length) { - getTree().setTopItem(children[index]); - } - } - - @Override + Widget item = findItem(path); + TreeItem[] children = null; + if (item instanceof TreeItem) { + children = ((TreeItem)item).getItems(); + } else if (item instanceof Tree) { + children = ((Tree)item).getItems(); + } + if (children != null && index < children.length) { + getTree().setTopItem(children[index]); + } + } + + @Override public int getChildCount(TreePath path) { - if (path.getSegmentCount() == 0) { - return ((Tree)getControl()).getItemCount(); - } else { - Widget[] items = internalFindItems(path); - if (items.length > 0) { - if (items[0] instanceof TreeItem) { - return ((TreeItem)items[0]).getItemCount(); - } - } - } - return -1; - } - - @Override + if (path.getSegmentCount() == 0) { + return ((Tree)getControl()).getItemCount(); + } else { + Widget[] items = internalFindItems(path); + if (items.length > 0) { + if (items[0] instanceof TreeItem) { + return ((TreeItem)items[0]).getItemCount(); + } + } + } + return -1; + } + + @Override public Object getChildElement(TreePath path, int index) { - TreeItem childItem = null; - if (path.getSegmentCount() == 0) { - Tree tree = (Tree)getControl(); - try { - childItem = tree.getItem(index); - } catch (IllegalArgumentException e) {} - } else { - try { - Widget[] items = internalFindItems(path); - if (items.length > 0) { - if (items[0] instanceof TreeItem) { - childItem = ((TreeItem)items[0]).getItem(index); - } - } - } catch (IllegalArgumentException e) {} - } - if (childItem != null) { - return childItem.getData(); - } - return null; - } - - @Override + TreeItem childItem = null; + if (path.getSegmentCount() == 0) { + Tree tree = (Tree)getControl(); + try { + childItem = tree.getItem(index); + } catch (IllegalArgumentException e) {} + } else { + try { + Widget[] items = internalFindItems(path); + if (items.length > 0) { + if (items[0] instanceof TreeItem) { + childItem = ((TreeItem)items[0]).getItem(index); + } + } + } catch (IllegalArgumentException e) {} + } + if (childItem != null) { + return childItem.getData(); + } + return null; + } + + @Override public TreePath getTopElementPath() { - TreeItem topItem = ((Tree)getControl()).getTopItem(); + TreeItem topItem = ((Tree)getControl()).getTopItem(); if (topItem != null && !topItem.isDisposed() && topItem.getData() != null) { - return getTreePathFromItem(topItem); - } - return null; - } + return getTreePathFromItem(topItem); + } + return null; + } - @Override + @Override public boolean saveElementState(TreePath path, ModelDelta delta, int flagsToSave) { - Tree tree = (Tree) getControl(); - TreeItem[] selection = tree.getSelection(); + Tree tree = (Tree) getControl(); + TreeItem[] selection = tree.getSelection(); Set<TreeItem> set = new HashSet<>(); - for (int i = 0; i < selection.length; i++) { - set.add(selection[i]); - } - - TreeItem[] items = null; - Widget w = internalGetWidgetToSelect(path); - if (w instanceof Tree) { - delta.setChildCount( - ((ITreeModelContentProvider)getContentProvider()).viewToModelCount(path, tree.getItemCount())); - if ((flagsToSave & IModelDelta.EXPAND) != 0) { - delta.setFlags(delta.getFlags() | IModelDelta.EXPAND); - } - items = tree.getItems(); - } else if (w instanceof TreeItem) { - TreeItem item = (TreeItem)w; - if (item.getExpanded()) { - int itemCount = item.getData() != null ? item.getItemCount() : -1; - delta.setChildCount(((ITreeModelContentProvider)getContentProvider()).viewToModelCount(path, itemCount)); - if ((flagsToSave & IModelDelta.EXPAND) != 0) { - delta.setFlags(delta.getFlags() | IModelDelta.EXPAND); - } - } else if ((flagsToSave & IModelDelta.COLLAPSE) != 0){ - delta.setFlags(delta.getFlags() | IModelDelta.COLLAPSE); - } - - if (set.contains(item) && (flagsToSave & IModelDelta.SELECT) != 0) { - delta.setFlags(delta.getFlags() | IModelDelta.SELECT); - } - items = ((TreeItem)w).getItems(); - } - if (items != null && items.length != 0) { - for (int i = 0; i < items.length; i++) { - doSaveElementState(path, delta, items[i], set, i, flagsToSave); - } - return true; - } else { - return false; - } - } + for (int i = 0; i < selection.length; i++) { + set.add(selection[i]); + } + + TreeItem[] items = null; + Widget w = internalGetWidgetToSelect(path); + if (w instanceof Tree) { + delta.setChildCount( + ((ITreeModelContentProvider)getContentProvider()).viewToModelCount(path, tree.getItemCount())); + if ((flagsToSave & IModelDelta.EXPAND) != 0) { + delta.setFlags(delta.getFlags() | IModelDelta.EXPAND); + } + items = tree.getItems(); + } else if (w instanceof TreeItem) { + TreeItem item = (TreeItem)w; + if (item.getExpanded()) { + int itemCount = item.getData() != null ? item.getItemCount() : -1; + delta.setChildCount(((ITreeModelContentProvider)getContentProvider()).viewToModelCount(path, itemCount)); + if ((flagsToSave & IModelDelta.EXPAND) != 0) { + delta.setFlags(delta.getFlags() | IModelDelta.EXPAND); + } + } else if ((flagsToSave & IModelDelta.COLLAPSE) != 0){ + delta.setFlags(delta.getFlags() | IModelDelta.COLLAPSE); + } + + if (set.contains(item) && (flagsToSave & IModelDelta.SELECT) != 0) { + delta.setFlags(delta.getFlags() | IModelDelta.SELECT); + } + items = ((TreeItem)w).getItems(); + } + if (items != null && items.length != 0) { + for (int i = 0; i < items.length; i++) { + doSaveElementState(path, delta, items[i], set, i, flagsToSave); + } + return true; + } else { + return false; + } + } private void doSaveElementState(TreePath parentPath, ModelDelta delta, TreeItem item, Collection<TreeItem> set, int index, int flagsToSave) { - Object element = item.getData(); - if (element != null) { - boolean expanded = item.getExpanded(); - boolean selected = set.contains(item); - int flags = IModelDelta.NO_CHANGE; - if (expanded && (flagsToSave & IModelDelta.EXPAND) != 0) { - flags = flags | IModelDelta.EXPAND; - } - if (!expanded && (flagsToSave & IModelDelta.COLLAPSE) != 0) { - flags = flags | IModelDelta.COLLAPSE; - } - if (selected && (flagsToSave & IModelDelta.SELECT) != 0) { - flags = flags | IModelDelta.SELECT; - } - if (expanded || flags != IModelDelta.NO_CHANGE) { - int modelIndex = ((ITreeModelContentProvider)getContentProvider()).viewToModelIndex(parentPath, index); - TreePath elementPath = parentPath.createChildPath(element); - ModelDelta childDelta = delta.addNode(element, modelIndex, flags, -1); - if (expanded) { - // Only get the item count if the item is expanded. Getting - // item count triggers an update of the element (bug 335734). - int itemCount = item.getItemCount(); - int numChildren = ((ITreeModelContentProvider)getContentProvider()).viewToModelCount(elementPath, itemCount); - childDelta.setChildCount(numChildren); - TreeItem[] items = item.getItems(); - for (int i = 0; i < items.length; i++) { - doSaveElementState(elementPath, childDelta, items[i], set, i, flagsToSave); - } - } - } - } - } - - @Override + Object element = item.getData(); + if (element != null) { + boolean expanded = item.getExpanded(); + boolean selected = set.contains(item); + int flags = IModelDelta.NO_CHANGE; + if (expanded && (flagsToSave & IModelDelta.EXPAND) != 0) { + flags = flags | IModelDelta.EXPAND; + } + if (!expanded && (flagsToSave & IModelDelta.COLLAPSE) != 0) { + flags = flags | IModelDelta.COLLAPSE; + } + if (selected && (flagsToSave & IModelDelta.SELECT) != 0) { + flags = flags | IModelDelta.SELECT; + } + if (expanded || flags != IModelDelta.NO_CHANGE) { + int modelIndex = ((ITreeModelContentProvider)getContentProvider()).viewToModelIndex(parentPath, index); + TreePath elementPath = parentPath.createChildPath(element); + ModelDelta childDelta = delta.addNode(element, modelIndex, flags, -1); + if (expanded) { + // Only get the item count if the item is expanded. Getting + // item count triggers an update of the element (bug 335734). + int itemCount = item.getItemCount(); + int numChildren = ((ITreeModelContentProvider)getContentProvider()).viewToModelCount(elementPath, itemCount); + childDelta.setChildCount(numChildren); + TreeItem[] items = item.getItems(); + for (int i = 0; i < items.length; i++) { + doSaveElementState(elementPath, childDelta, items[i], set, i, flagsToSave); + } + } + } + } + } + + @Override public void updateViewer(IModelDelta delta) { - ((ITreeModelContentProvider)getContentProvider()).updateModel(delta, ITreeModelContentProvider.ALL_MODEL_DELTA_FLAGS); - } + ((ITreeModelContentProvider)getContentProvider()).updateModel(delta, ITreeModelContentProvider.ALL_MODEL_DELTA_FLAGS); + } @Override public void setElementChecked(TreePath path, boolean checked, boolean grayed) { - Widget widget = findItem(path); + Widget widget = findItem(path); - if (widget != null && widget instanceof TreeItem && !widget.isDisposed()) { - TreeItem item = (TreeItem)widget; + if (widget != null && widget instanceof TreeItem && !widget.isDisposed()) { + TreeItem item = (TreeItem)widget; - item.setChecked(checked); - item.setGrayed(grayed); + item.setChecked(checked); + item.setGrayed(grayed); - item.setData(PREV_CHECKED_KEY, checked ? Boolean.TRUE : Boolean.FALSE); - item.setData(PREV_GRAYED_KEY, grayed ? Boolean.TRUE : Boolean.FALSE); - } + item.setData(PREV_CHECKED_KEY, checked ? Boolean.TRUE : Boolean.FALSE); + item.setData(PREV_GRAYED_KEY, grayed ? Boolean.TRUE : Boolean.FALSE); + } } - @Override + @Override public boolean getElementChecked(TreePath path) { - Widget widget = findItem(path); - - if (widget != null && widget instanceof TreeItem && !widget.isDisposed()) { - TreeItem item = (TreeItem)widget; - - return item.getChecked(); - } - return false; - } - - /** - * Retrieves the element's check box grayed state. - * - * @param path the path of the element to set grayed - * @return grayed - */ - @Override + Widget widget = findItem(path); + + if (widget != null && widget instanceof TreeItem && !widget.isDisposed()) { + TreeItem item = (TreeItem)widget; + + return item.getChecked(); + } + return false; + } + + /** + * Retrieves the element's check box grayed state. + * + * @param path the path of the element to set grayed + * @return grayed + */ + @Override public boolean getElementGrayed(TreePath path) { - Widget widget = findItem(path); + Widget widget = findItem(path); - if (widget != null && widget instanceof TreeItem && !widget.isDisposed()) { - TreeItem item = (TreeItem)widget; + if (widget != null && widget instanceof TreeItem && !widget.isDisposed()) { + TreeItem item = (TreeItem)widget; - return item.getGrayed(); - } - return false; - } + return item.getGrayed(); + } + return false; + } - @Override + @Override public boolean getHasChildren(Object elementOrTreePath) { - if (elementOrTreePath instanceof TreePath && - ((TreePath)elementOrTreePath).getSegmentCount() == 0) - { - return getTree().getItemCount() > 0; - } - - Widget[] items = internalFindItems(elementOrTreePath); - if (items != null && items.length > 0) { - if (items[0] instanceof TreeItem) { - return ((TreeItem)items[0]).getItemCount() > 0; - } else { - return ((Tree)items[0]).getItemCount() > 0; - } - } - - return false; - } - - @Override + if (elementOrTreePath instanceof TreePath && + ((TreePath)elementOrTreePath).getSegmentCount() == 0) + { + return getTree().getItemCount() > 0; + } + + Widget[] items = internalFindItems(elementOrTreePath); + if (items != null && items.length > 0) { + if (items[0] instanceof TreeItem) { + return ((TreeItem)items[0]).getItemCount() > 0; + } else { + return ((Tree)items[0]).getItemCount() > 0; + } + } + + return false; + } + + @Override public TreePath[] getElementPaths(Object element) { - Widget[] items = internalFindItems(element); - TreePath[] paths = new TreePath[items.length]; - for (int i = 0; i < items.length; i++) { - if (items[i] instanceof Tree) { - paths[i] = TreePath.EMPTY; - } else { - paths[i] = getTreePathFromItem((Item)items[i]); - } - } - return paths; - } + Widget[] items = internalFindItems(element); + TreePath[] paths = new TreePath[items.length]; + for (int i = 0; i < items.length; i++) { + if (items[i] instanceof Tree) { + paths[i] = TreePath.EMPTY; + } else { + paths[i] = getTreePathFromItem((Item)items[i]); + } + } + return paths; + } @Override protected void handleSelect(SelectionEvent event) { - super.handleSelect(event); - - TreeItem item = (TreeItem) event.item; - if (item != null) { // item can be null when de-selected (bug 296703) - Object element = item.getData(); - IContentProvider contentProvider = getContentProvider(); - if (element != null && contentProvider instanceof TreeModelContentProvider) { - TreePath path = getTreePathFromItem(item); - - if (event.detail == SWT.CHECK) { - boolean checked = item.getChecked(); - boolean accepted = ((ITreeModelContentProvider) contentProvider).setChecked(path, checked); - - // if the listen rejects the change or there is not ICheckboxModelProxy, than revert the check state - if (!accepted) { - item.setChecked(!checked); - } else { - item.setData(PREV_CHECKED_KEY, Boolean.valueOf(checked)); - } - } else { - ((TreeModelContentProvider) contentProvider).cancelRestore(path, IModelDelta.SELECT|IModelDelta.REVEAL); - } - } - } + super.handleSelect(event); + + TreeItem item = (TreeItem) event.item; + if (item != null) { // item can be null when de-selected (bug 296703) + Object element = item.getData(); + IContentProvider contentProvider = getContentProvider(); + if (element != null && contentProvider instanceof TreeModelContentProvider) { + TreePath path = getTreePathFromItem(item); + + if (event.detail == SWT.CHECK) { + boolean checked = item.getChecked(); + boolean accepted = ((ITreeModelContentProvider) contentProvider).setChecked(path, checked); + + // if the listen rejects the change or there is not ICheckboxModelProxy, than revert the check state + if (!accepted) { + item.setChecked(!checked); + } else { + item.setData(PREV_CHECKED_KEY, Boolean.valueOf(checked)); + } + } else { + ((TreeModelContentProvider) contentProvider).cancelRestore(path, IModelDelta.SELECT|IModelDelta.REVEAL); + } + } + } } @Override protected void handleTreeExpand(TreeEvent event) { - super.handleTreeExpand(event); - IContentProvider contentProvider = getContentProvider(); - if (contentProvider instanceof TreeModelContentProvider && event.item.getData() != null) { - TreePath path = getTreePathFromItem((TreeItem)event.item); - ((TreeModelContentProvider) contentProvider).cancelRestore(path, IModelDelta.COLLAPSE); - } + super.handleTreeExpand(event); + IContentProvider contentProvider = getContentProvider(); + if (contentProvider instanceof TreeModelContentProvider && event.item.getData() != null) { + TreePath path = getTreePathFromItem((TreeItem)event.item); + ((TreeModelContentProvider) contentProvider).cancelRestore(path, IModelDelta.COLLAPSE); + } } @Override protected void handleTreeCollapse(TreeEvent event) { - super.handleTreeCollapse(event); - IContentProvider contentProvider = getContentProvider(); - if (contentProvider instanceof TreeModelContentProvider && event.item.getData() != null) { - TreePath path = getTreePathFromItem((TreeItem)event.item); - ((TreeModelContentProvider) contentProvider).cancelRestore(path, IModelDelta.EXPAND); - } + super.handleTreeCollapse(event); + IContentProvider contentProvider = getContentProvider(); + if (contentProvider instanceof TreeModelContentProvider && event.item.getData() != null) { + TreePath path = getTreePathFromItem((TreeItem)event.item); + ((TreeModelContentProvider) contentProvider).cancelRestore(path, IModelDelta.EXPAND); + } } @Override 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 fba0d7806..830bdf862 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 @@ -68,245 +68,245 @@ import org.eclipse.ui.IMemento; */ @SuppressWarnings("deprecation") public class InternalVirtualTreeModelViewer extends Viewer - implements IVirtualItemListener, - org.eclipse.debug.internal.ui.viewers.model.ITreeModelViewer, - IInternalTreeModelViewer + implements IVirtualItemListener, + org.eclipse.debug.internal.ui.viewers.model.ITreeModelViewer, + IInternalTreeModelViewer { - /** - * Memento type for the visible columns for a presentation context. - * A memento is created for each column presentation keyed by column number - */ - private static final String VISIBLE_COLUMNS = "VISIBLE_COLUMNS"; //$NON-NLS-1$ - - /** - * Memento type for whether columns are visible for a presentation context. - * Booleans are keyed by column presentation id - */ - private static final String SHOW_COLUMNS = "SHOW_COLUMNS"; //$NON-NLS-1$ - /** - * Memento key for the number of visible columns in a VISIBLE_COLUMNS memento - * or for the width of a column - */ - private static final String SIZE = "SIZE"; //$NON-NLS-1$ - /** - * Memento key prefix a visible column - */ - private static final String COLUMN = "COLUMN"; //$NON-NLS-1$ - - /** - * Item's tree path cache - */ - private static final String TREE_PATH_KEY = "TREE_PATH_KEY"; //$NON-NLS-1$ - - /** - * Viewer filters currently configured for viewer. - */ - private ViewerFilter[] fFilters = new ViewerFilter[0]; - - /** - * The display that this virtual tree viewer is associated with. It is used - * for access to the UI thread. - */ - private Display fDisplay; - - /** - * The object that allows the model to identify what this view - * is presenting. - */ - private IPresentationContext fContext; - - /** - * Input into the viewer. - */ - private Object fInput; - - /** - * The tree of items in this viewer. - */ - private VirtualTree fTree; - - /** - * Mapping of data elements in the tree to the items that hold them. The - * tree may contain the same element in several places, so the map values - * are lists. - */ + /** + * Memento type for the visible columns for a presentation context. + * A memento is created for each column presentation keyed by column number + */ + private static final String VISIBLE_COLUMNS = "VISIBLE_COLUMNS"; //$NON-NLS-1$ + + /** + * Memento type for whether columns are visible for a presentation context. + * Booleans are keyed by column presentation id + */ + private static final String SHOW_COLUMNS = "SHOW_COLUMNS"; //$NON-NLS-1$ + /** + * Memento key for the number of visible columns in a VISIBLE_COLUMNS memento + * or for the width of a column + */ + private static final String SIZE = "SIZE"; //$NON-NLS-1$ + /** + * Memento key prefix a visible column + */ + private static final String COLUMN = "COLUMN"; //$NON-NLS-1$ + + /** + * Item's tree path cache + */ + private static final String TREE_PATH_KEY = "TREE_PATH_KEY"; //$NON-NLS-1$ + + /** + * Viewer filters currently configured for viewer. + */ + private ViewerFilter[] fFilters = new ViewerFilter[0]; + + /** + * The display that this virtual tree viewer is associated with. It is used + * for access to the UI thread. + */ + private Display fDisplay; + + /** + * The object that allows the model to identify what this view + * is presenting. + */ + private IPresentationContext fContext; + + /** + * Input into the viewer. + */ + private Object fInput; + + /** + * The tree of items in this viewer. + */ + private VirtualTree fTree; + + /** + * Mapping of data elements in the tree to the items that hold them. The + * tree may contain the same element in several places, so the map values + * are lists. + */ private Map<Object, List<VirtualItem>> fItemsMap = new HashMap<>(); - /** - * Whether to notify the content provider when an element is unmapped. - * Used to suppress the notification during an associate operation. - */ - private boolean fNotifyUnmap = true; - - /** - * The label provider, must be the tree model provider. - */ - private TreeModelLabelProvider fLabelProvider; - - /** - * The content provider must be a tree model provider. - */ - private TreeModelContentProvider fContentProvider; - - /** - * Flag indicating whether the viewer is currently executing an operation - * at the end of which the selection will be restored. - */ - private boolean fPreservingSelecction; - - /** - * Flag indicating that the selection should not be restored at the end - * of a preserving-selection operation. - */ - private boolean fRestoreSelection; - - /** - * Level to which the tree should automatically expand elements. - * <code>-1<code> indicates that all levels shoudl be expanded. - */ - private int fAutoExpandToLevel = 0; - - /** - * Current column presentation or <code>null</code> - */ - private IColumnPresentation fColumnPresentation = null; - - /** - * Map of columns presentation id to its visible columns id's (String[]) - * When a columns presentation is not in the map, default settings are used. - */ + /** + * Whether to notify the content provider when an element is unmapped. + * Used to suppress the notification during an associate operation. + */ + private boolean fNotifyUnmap = true; + + /** + * The label provider, must be the tree model provider. + */ + private TreeModelLabelProvider fLabelProvider; + + /** + * The content provider must be a tree model provider. + */ + private TreeModelContentProvider fContentProvider; + + /** + * Flag indicating whether the viewer is currently executing an operation + * at the end of which the selection will be restored. + */ + private boolean fPreservingSelecction; + + /** + * Flag indicating that the selection should not be restored at the end + * of a preserving-selection operation. + */ + private boolean fRestoreSelection; + + /** + * Level to which the tree should automatically expand elements. + * <code>-1<code> indicates that all levels shoudl be expanded. + */ + private int fAutoExpandToLevel = 0; + + /** + * Current column presentation or <code>null</code> + */ + private IColumnPresentation fColumnPresentation = null; + + /** + * Map of columns presentation id to its visible columns id's (String[]) + * When a columns presentation is not in the map, default settings are used. + */ private Map<String, String[]> fVisibleColumns = new HashMap<>(); - /** - * Map of column presentation id to whether columns should be displayed - * for that presentation (the user can toggle columns on/off when a - * presentation is optional. - */ + /** + * Map of column presentation id to whether columns should be displayed + * for that presentation (the user can toggle columns on/off when a + * presentation is optional. + */ private Map<String, Boolean> fShowColumns = new HashMap<>(); - /** - * Runnable for validating the virtual tree. It is scheduled to run in the - * UI thread whenever a tree validation is requested. - */ - private Runnable fValidateRunnable; + /** + * Runnable for validating the virtual tree. It is scheduled to run in the + * UI thread whenever a tree validation is requested. + */ + private Runnable fValidateRunnable; - public InternalVirtualTreeModelViewer(Display display, int style, IPresentationContext context, IVirtualItemValidator itemValidator) { - fDisplay = display; - fContext = context; - fTree = new VirtualTree(style, itemValidator); - fTree.addItemListener(this); + public InternalVirtualTreeModelViewer(Display display, int style, IPresentationContext context, IVirtualItemValidator itemValidator) { + fDisplay = display; + fContext = context; + fTree = new VirtualTree(style, itemValidator); + fTree.addItemListener(this); - fContentProvider = new TreeModelContentProvider(); - fLabelProvider = new TreeModelLabelProvider(this); + fContentProvider = new TreeModelContentProvider(); + fLabelProvider = new TreeModelLabelProvider(this); - if ((style & SWT.POP_UP) != 0) { - getContentProvider().setModelDeltaMask(~ITreeModelContentProvider.CONTROL_MODEL_DELTA_FLAGS); - } - } + if ((style & SWT.POP_UP) != 0) { + getContentProvider().setModelDeltaMask(~ITreeModelContentProvider.CONTROL_MODEL_DELTA_FLAGS); + } + } - @Override + @Override public Object getInput() { - return fInput; - } + return fInput; + } - @Override + @Override public Control getControl() { - // The virtual viewer does not have an SWT control associated with it. - // Fortunately this method is not used by the base Viewer class. - return null; - } + // The virtual viewer does not have an SWT control associated with it. + // Fortunately this method is not used by the base Viewer class. + return null; + } - @Override + @Override public Display getDisplay() { - return fDisplay; - } + return fDisplay; + } - @Override + @Override public void setInput(Object input) { - Object oldInput = fInput; - getContentProvider().inputChanged(this, oldInput, input); - fItemsMap.clear(); - fTree.clearAll(); - fInput = input; - mapElement(fInput, getTree()); - getContentProvider().postInputChanged(this, oldInput , input); - fTree.setData(fInput); - fTree.setSelection(EMPTY_ITEMS_ARRAY); - inputChanged(fInput, oldInput); - refresh(); - } - - @Override + Object oldInput = fInput; + getContentProvider().inputChanged(this, oldInput, input); + fItemsMap.clear(); + fTree.clearAll(); + fInput = input; + mapElement(fInput, getTree()); + getContentProvider().postInputChanged(this, oldInput , input); + fTree.setData(fInput); + fTree.setSelection(EMPTY_ITEMS_ARRAY); + inputChanged(fInput, oldInput); + refresh(); + } + + @Override public void replace(Object parentElementOrTreePath, final int index, Object element) { - VirtualItem[] selectedItems = fTree.getSelection(); - TreeSelection selection = (TreeSelection) getSelection(); - VirtualItem[] itemsToDisassociate; - if (parentElementOrTreePath instanceof TreePath) { - TreePath elementPath = ((TreePath) parentElementOrTreePath).createChildPath(element); - itemsToDisassociate = findItems(elementPath); - } else { - itemsToDisassociate = findItems(element); - } - - VirtualItem[] parentItems = findItems(parentElementOrTreePath); - for (int i = 0; i < parentItems.length; i++) { - VirtualItem parentItem = parentItems[i]; - if (index < parentItem.getItemCount()) { - VirtualItem item = parentItem.getItem(new Index(index)); - selection = adjustSelectionForReplace(selectedItems, selection, item, element, parentItem.getData()); - // disassociate any different item that represents the - // same element under the same parent (the tree) - for (int j = 0; j < itemsToDisassociate.length; j++) { - VirtualItem itemToDisassociate = itemsToDisassociate[j]; - if (itemToDisassociate != item && itemsToDisassociate[j].getParent() == parentItem) { - disassociate(itemToDisassociate); - itemToDisassociate.getParent().clear(itemToDisassociate.getIndex()); - } - } - //Object oldData = item.getData(); - associate(element, item); - doUpdate(item); - VirtualItem[] children = item.getItems(); - for (int j = 0; j < children.length; j++) { - children[j].setNeedsDataUpdate(); - } - } - } - // Restore the selection if we are not already in a nested - // preservingSelection: - if (!fPreservingSelecction) { - internalSetSelection(selection, false); - // send out notification if old and new differ - ISelection newSelection = getSelection(); - if (!newSelection.equals(selection)) { - handleInvalidSelection(selection, newSelection); - } - } - validate(); - } - - public VirtualTree getTree() { - return fTree; - } - - @Override + VirtualItem[] selectedItems = fTree.getSelection(); + TreeSelection selection = (TreeSelection) getSelection(); + VirtualItem[] itemsToDisassociate; + if (parentElementOrTreePath instanceof TreePath) { + TreePath elementPath = ((TreePath) parentElementOrTreePath).createChildPath(element); + itemsToDisassociate = findItems(elementPath); + } else { + itemsToDisassociate = findItems(element); + } + + VirtualItem[] parentItems = findItems(parentElementOrTreePath); + for (int i = 0; i < parentItems.length; i++) { + VirtualItem parentItem = parentItems[i]; + if (index < parentItem.getItemCount()) { + VirtualItem item = parentItem.getItem(new Index(index)); + selection = adjustSelectionForReplace(selectedItems, selection, item, element, parentItem.getData()); + // disassociate any different item that represents the + // same element under the same parent (the tree) + for (int j = 0; j < itemsToDisassociate.length; j++) { + VirtualItem itemToDisassociate = itemsToDisassociate[j]; + if (itemToDisassociate != item && itemsToDisassociate[j].getParent() == parentItem) { + disassociate(itemToDisassociate); + itemToDisassociate.getParent().clear(itemToDisassociate.getIndex()); + } + } + //Object oldData = item.getData(); + associate(element, item); + doUpdate(item); + VirtualItem[] children = item.getItems(); + for (int j = 0; j < children.length; j++) { + children[j].setNeedsDataUpdate(); + } + } + } + // Restore the selection if we are not already in a nested + // preservingSelection: + if (!fPreservingSelecction) { + internalSetSelection(selection, false); + // send out notification if old and new differ + ISelection newSelection = getSelection(); + if (!newSelection.equals(selection)) { + handleInvalidSelection(selection, newSelection); + } + } + validate(); + } + + public VirtualTree getTree() { + return fTree; + } + + @Override public void insert(Object parentOrTreePath, Object element, int position) { - if (parentOrTreePath instanceof TreePath) { - VirtualItem parentItem = findItem((TreePath) parentOrTreePath); - if (parentItem != null) { - VirtualItem item = parentItem.addItem(position); - item.setData(element); - mapElement(element, item); - doUpdate(item); - } - } else { - // TODO: Implement insert() for element - } - validate(); - } - - @Override + if (parentOrTreePath instanceof TreePath) { + VirtualItem parentItem = findItem((TreePath) parentOrTreePath); + if (parentItem != null) { + VirtualItem item = parentItem.addItem(position); + item.setData(element); + mapElement(element, item); + doUpdate(item); + } + } else { + // TODO: Implement insert() for element + } + validate(); + } + + @Override public void remove(final Object parentOrTreePath, final int index) { final List<TreePath> oldSelection = new LinkedList<>(Arrays.asList(((TreeSelection) getSelection()).getPaths())); preservingSelection(() -> { @@ -351,50 +351,50 @@ public class InternalVirtualTreeModelViewer extends Viewer } } }); - } + } - @Override + @Override public void remove(Object elementOrPath) { - if (elementOrPath.equals(getInput()) || TreePath.EMPTY.equals(elementOrPath)) { - setInput(null); - return; - } - - VirtualItem[] items = findItems(elementOrPath); - if (items.length > 0) { - for (int j = 0; j < items.length; j++) { - disassociate(items[j]); - items[j].getParent().remove(items[j].getIndex()); - } - } - } - - private TreeSelection adjustSelectionForReplace(VirtualItem[] selectedItems, TreeSelection selection, - VirtualItem item, Object element, Object parentElement) - { - if (item.getData() != null || selectedItems.length == selection.size() || parentElement == null) { - // Don't do anything - we are not seeing an instance of bug 185673 - return selection; - } - for (int i = 0; i < selectedItems.length; i++) { - if (item == selectedItems[i]) { - // The current item was selected, but its data is null. - // The data will be replaced by the given element, so to keep - // it selected, we have to add it to the selection. - TreePath[] originalPaths = selection.getPaths(); - int length = originalPaths.length; - TreePath[] paths = new TreePath[length + 1]; - System.arraycopy(originalPaths, 0, paths, 0, length); - // set the element temporarily so that we can call getTreePathFromItem - item.setData(element); - paths[length] = getTreePathFromItem(item); - item.setData(null); - return new TreeSelection(paths, selection.getElementComparer()); - } - } - // The item was not selected, return the given selection - return selection; - } + if (elementOrPath.equals(getInput()) || TreePath.EMPTY.equals(elementOrPath)) { + setInput(null); + return; + } + + VirtualItem[] items = findItems(elementOrPath); + if (items.length > 0) { + for (int j = 0; j < items.length; j++) { + disassociate(items[j]); + items[j].getParent().remove(items[j].getIndex()); + } + } + } + + private TreeSelection adjustSelectionForReplace(VirtualItem[] selectedItems, TreeSelection selection, + VirtualItem item, Object element, Object parentElement) + { + if (item.getData() != null || selectedItems.length == selection.size() || parentElement == null) { + // Don't do anything - we are not seeing an instance of bug 185673 + return selection; + } + for (int i = 0; i < selectedItems.length; i++) { + if (item == selectedItems[i]) { + // The current item was selected, but its data is null. + // The data will be replaced by the given element, so to keep + // it selected, we have to add it to the selection. + TreePath[] originalPaths = selection.getPaths(); + int length = originalPaths.length; + TreePath[] paths = new TreePath[length + 1]; + System.arraycopy(originalPaths, 0, paths, 0, length); + // set the element temporarily so that we can call getTreePathFromItem + item.setData(element); + paths[length] = getTreePathFromItem(item); + item.setData(null); + return new TreeSelection(paths, selection.getElementComparer()); + } + } + // The item was not selected, return the given selection + return selection; + } // private VirtualTreeSelection adjustSelectionForReplace(VirtualTreeSelection selection, VirtualItem item, // Object element, Object parentElement) @@ -449,181 +449,181 @@ public class InternalVirtualTreeModelViewer extends Viewer // } - @Override + @Override public void reveal(TreePath path, final int index) { - VirtualItem parentItem = findItem(path); - if (parentItem != null && parentItem.getItemCount() >= index) { - VirtualItem revealItem = parentItem.getItem(new Index(index)); - getTree().showItem(revealItem); - getTree().validate(); - } - // TODO: implement reveal() - } - - @Override + VirtualItem parentItem = findItem(path); + if (parentItem != null && parentItem.getItemCount() >= index) { + VirtualItem revealItem = parentItem.getItem(new Index(index)); + getTree().showItem(revealItem); + getTree().validate(); + } + // TODO: implement reveal() + } + + @Override public int findElementIndex(TreePath parentPath, Object element) { - VirtualItem parentItem = findItem(parentPath); - if (parentItem != null) { - VirtualItem item = parentItem.findItem(element); - if (item != null) { - return item.getIndex().intValue(); - } - } - return -1; - } - - @Override + VirtualItem parentItem = findItem(parentPath); + if (parentItem != null) { + VirtualItem item = parentItem.findItem(element); + if (item != null) { + return item.getIndex().intValue(); + } + } + return -1; + } + + @Override public boolean getElementChildrenRealized(TreePath parentPath) { - VirtualItem parentItem = findItem(parentPath); - if (parentItem != null) { - return !parentItem.childrenNeedDataUpdate(); - } - return true; - } + VirtualItem parentItem = findItem(parentPath); + if (parentItem != null) { + return !parentItem.childrenNeedDataUpdate(); + } + return true; + } - private ITreeModelLabelProvider getLabelProvider() { - return fLabelProvider; - } + private ITreeModelLabelProvider getLabelProvider() { + return fLabelProvider; + } - private ITreeModelContentProvider getContentProvider() { - return fContentProvider; - } + private ITreeModelContentProvider getContentProvider() { + return fContentProvider; + } - public static int ALL_LEVELS = -1; + public static int ALL_LEVELS = -1; - @Override + @Override public void refresh() { - refresh(fTree); - validate(); - } + refresh(fTree); + validate(); + } - @Override + @Override public void refresh(Object element) { - VirtualItem[] items = findItems(element); - for (int i = 0; i < items.length; i++) { - refresh(items[i]); - validate(); - } - } - - private void refresh(VirtualItem item) { - getContentProvider().preserveState(getTreePathFromItem(item)); - - if (!item.needsDataUpdate()) { - if (item.getParent() != null) { - item.setNeedsLabelUpdate(); - virtualLazyUpdateHasChildren(item); - } - - VirtualItem[] items = item.getItems(); - for (int i = 0; i < items.length; i++) { - items[i].setNeedsDataUpdate(); - } - } - refreshStruct(item); - } - - private void refreshStruct(VirtualItem item) { - boolean expanded = false; - if (item.getParent() == null) { - // root item - virtualLazyUpdateChildCount(item); - expanded = true; - } else { - if (item.getExpanded()) { - virtualLazyUpdateData(item); - expanded = true; - } - } - - VirtualItem[] items = item.getItems(); - for (int i = 0; i < items.length; i++) { - if (expanded) { - refreshStruct(items[i]); - } else { - item.clear(new VirtualItem.Index(i)); - } - } - } - - private void validate() { - if (fValidateRunnable == null) { + VirtualItem[] items = findItems(element); + for (int i = 0; i < items.length; i++) { + refresh(items[i]); + validate(); + } + } + + private void refresh(VirtualItem item) { + getContentProvider().preserveState(getTreePathFromItem(item)); + + if (!item.needsDataUpdate()) { + if (item.getParent() != null) { + item.setNeedsLabelUpdate(); + virtualLazyUpdateHasChildren(item); + } + + VirtualItem[] items = item.getItems(); + for (int i = 0; i < items.length; i++) { + items[i].setNeedsDataUpdate(); + } + } + refreshStruct(item); + } + + private void refreshStruct(VirtualItem item) { + boolean expanded = false; + if (item.getParent() == null) { + // root item + virtualLazyUpdateChildCount(item); + expanded = true; + } else { + if (item.getExpanded()) { + virtualLazyUpdateData(item); + expanded = true; + } + } + + VirtualItem[] items = item.getItems(); + for (int i = 0; i < items.length; i++) { + if (expanded) { + refreshStruct(items[i]); + } else { + item.clear(new VirtualItem.Index(i)); + } + } + } + + private void validate() { + if (fValidateRunnable == null) { fValidateRunnable = () -> { if (!fTree.isDisposed()) { fValidateRunnable = null; fTree.validate(); } }; - getDisplay().asyncExec(fValidateRunnable); - } - } + getDisplay().asyncExec(fValidateRunnable); + } + } - @Override + @Override protected void inputChanged(Object input, Object oldInput) { - resetColumns(input); - } + resetColumns(input); + } - @Override + @Override public int getAutoExpandLevel() { - return fAutoExpandToLevel; - } + return fAutoExpandToLevel; + } - @Override + @Override public void setAutoExpandLevel(int level) { - fAutoExpandToLevel = level; - } + fAutoExpandToLevel = level; + } - public VirtualItem findItem(TreePath path) { - if (path.getSegmentCount() == 0) { - return fTree; - } + public VirtualItem findItem(TreePath path) { + if (path.getSegmentCount() == 0) { + return fTree; + } List<VirtualItem> itemsList = fItemsMap.get(path.getLastSegment()); - if (itemsList != null) { + if (itemsList != null) { for (VirtualItem item : itemsList) { if (path.equals(getTreePathFromItem(item))) { return item; - } - } - } - - return null; - } - - static private final VirtualItem[] EMPTY_ITEMS_ARRAY = new VirtualItem[0]; - - public VirtualItem[] findItems(Object elementOrTreePath) { - Object element = elementOrTreePath; - if (elementOrTreePath instanceof TreePath) { - TreePath path = (TreePath)elementOrTreePath; - if (path.getSegmentCount() == 0) { - return new VirtualItem[] { getTree() }; - } - element = path.getLastSegment(); - } + } + } + } + + return null; + } + + static private final VirtualItem[] EMPTY_ITEMS_ARRAY = new VirtualItem[0]; + + public VirtualItem[] findItems(Object elementOrTreePath) { + Object element = elementOrTreePath; + if (elementOrTreePath instanceof TreePath) { + TreePath path = (TreePath)elementOrTreePath; + if (path.getSegmentCount() == 0) { + return new VirtualItem[] { getTree() }; + } + element = path.getLastSegment(); + } List<VirtualItem> itemsList = fItemsMap.get(element); - if (itemsList == null) { - return EMPTY_ITEMS_ARRAY; - } else { - return itemsList.toArray(new VirtualItem[itemsList.size()]); - } - } - - @Override + if (itemsList == null) { + return EMPTY_ITEMS_ARRAY; + } else { + return itemsList.toArray(new VirtualItem[itemsList.size()]); + } + } + + @Override public void setElementData(TreePath path, int numColumns, String[] labels, ImageDescriptor[] images, - FontData[] fontDatas, RGB[] foregrounds, RGB[] backgrounds) { - VirtualItem item = findItem(path); - if (item != null) { - item.setData(VirtualItem.LABEL_KEY, labels); - item.setData(VirtualItem.IMAGE_KEY, images); - item.setData(VirtualItem.FOREGROUND_KEY, foregrounds); - item.setData(VirtualItem.BACKGROUND_KEY, backgrounds); - item.setData(VirtualItem.FONT_KEY, fontDatas); - } - } - - @Override + FontData[] fontDatas, RGB[] foregrounds, RGB[] backgrounds) { + VirtualItem item = findItem(path); + if (item != null) { + item.setData(VirtualItem.LABEL_KEY, labels); + item.setData(VirtualItem.IMAGE_KEY, images); + item.setData(VirtualItem.FOREGROUND_KEY, foregrounds); + item.setData(VirtualItem.BACKGROUND_KEY, backgrounds); + item.setData(VirtualItem.FONT_KEY, fontDatas); + } + } + + @Override public void setChildCount(final Object elementOrTreePath, final int count) { preservingSelection(() -> { VirtualItem[] items = findItems(elementOrTreePath); @@ -638,10 +638,10 @@ public class InternalVirtualTreeModelViewer extends Viewer items[i].setItemCount(count); } }); - validate(); - } + validate(); + } - @Override + @Override public void setHasChildren(final Object elementOrTreePath, final boolean hasChildren) { preservingSelection(() -> { VirtualItem[] items = findItems(elementOrTreePath); @@ -667,962 +667,962 @@ public class InternalVirtualTreeModelViewer extends Viewer } } }); - } + } - @Override + @Override public boolean getHasChildren(Object elementOrTreePath) { - VirtualItem[] items = findItems(elementOrTreePath); - if (items.length > 0) { - return items[0].hasItems(); - } - return false; - } - - private void virtualLazyUpdateHasChildren(VirtualItem item) { - TreePath treePath; - treePath = getTreePathFromItem(item); - item.clearNeedsCountUpdate(); - getContentProvider().updateHasChildren(treePath); - } - - private void virtualLazyUpdateChildCount(VirtualItem item) { - item.clearNeedsCountUpdate(); - getContentProvider().updateChildCount(getTreePathFromItem(item), item.getItemCount()); - } - - private void virtualLazyUpdateData(VirtualItem item) { - item.clearNeedsDataUpdate(); - getContentProvider().updateElement(getTreePathFromItem(item.getParent()), item.getIndex().intValue()); - } - - private void virtualLazyUpdateLabel(VirtualItem item) { - item.clearNeedsLabelUpdate(); - if ( !getLabelProvider().update(getTreePathFromItem(item)) ) { - if (item.getData() instanceof String) { - item.setData(VirtualItem.LABEL_KEY, new String[] { (String)item.getData() } ); - } - } - } - - private TreePath getTreePathFromItem(VirtualItem item) { + VirtualItem[] items = findItems(elementOrTreePath); + if (items.length > 0) { + return items[0].hasItems(); + } + return false; + } + + private void virtualLazyUpdateHasChildren(VirtualItem item) { + TreePath treePath; + treePath = getTreePathFromItem(item); + item.clearNeedsCountUpdate(); + getContentProvider().updateHasChildren(treePath); + } + + private void virtualLazyUpdateChildCount(VirtualItem item) { + item.clearNeedsCountUpdate(); + getContentProvider().updateChildCount(getTreePathFromItem(item), item.getItemCount()); + } + + private void virtualLazyUpdateData(VirtualItem item) { + item.clearNeedsDataUpdate(); + getContentProvider().updateElement(getTreePathFromItem(item.getParent()), item.getIndex().intValue()); + } + + private void virtualLazyUpdateLabel(VirtualItem item) { + item.clearNeedsLabelUpdate(); + if ( !getLabelProvider().update(getTreePathFromItem(item)) ) { + if (item.getData() instanceof String) { + item.setData(VirtualItem.LABEL_KEY, new String[] { (String)item.getData() } ); + } + } + } + + private TreePath getTreePathFromItem(VirtualItem item) { List<Object> segments = new LinkedList<>(); - while (item.getParent() != null) { - segments.add(0, item.getData()); - item = item.getParent(); - } - return new TreePath(segments.toArray()); - } - - private void unmapElement(Object element, VirtualItem item) { - if (fNotifyUnmap) { - // TODO: should we update the filter with the "new non-identical element"? - IContentProvider provider = getContentProvider(); - if (provider instanceof TreeModelContentProvider) { - ((TreeModelContentProvider) provider).unmapPath((TreePath) item.getData(TREE_PATH_KEY)); - } - } + while (item.getParent() != null) { + segments.add(0, item.getData()); + item = item.getParent(); + } + return new TreePath(segments.toArray()); + } + + private void unmapElement(Object element, VirtualItem item) { + if (fNotifyUnmap) { + // TODO: should we update the filter with the "new non-identical element"? + IContentProvider provider = getContentProvider(); + if (provider instanceof TreeModelContentProvider) { + ((TreeModelContentProvider) provider).unmapPath((TreePath) item.getData(TREE_PATH_KEY)); + } + } List<VirtualItem> itemsList = fItemsMap.get(element); - if (itemsList != null) { - itemsList.remove(item); - if (itemsList.isEmpty()) { - fItemsMap.remove(element); - } - } - } - - private void mapElement(Object element, VirtualItem item) { - // Get the items set for given element, if it doesn't exist, create it. - // When retrieving the set, also remove it from the map, it will be - // re-inserted to make sure that the new instance of element is used - // in case the element has changed but the elment is equal to the old - // one. + if (itemsList != null) { + itemsList.remove(item); + if (itemsList.isEmpty()) { + fItemsMap.remove(element); + } + } + } + + private void mapElement(Object element, VirtualItem item) { + // Get the items set for given element, if it doesn't exist, create it. + // When retrieving the set, also remove it from the map, it will be + // re-inserted to make sure that the new instance of element is used + // in case the element has changed but the elment is equal to the old + // one. List<VirtualItem> itemsList = fItemsMap.remove(element); - if (itemsList == null) { + if (itemsList == null) { itemsList = new ArrayList<>(1); - } + } - if (!itemsList.contains(item)) { - itemsList.add(item); - } + if (!itemsList.contains(item)) { + itemsList.add(item); + } - // Insert the set back into the map. - fItemsMap.put(element, itemsList); + // Insert the set back into the map. + fItemsMap.put(element, itemsList); - item.setData(TREE_PATH_KEY, getTreePathFromItem(item)); - } + item.setData(TREE_PATH_KEY, getTreePathFromItem(item)); + } - @Override + @Override public void revealed(VirtualItem item) { - if (item.needsDataUpdate()) { - virtualLazyUpdateData(item); - } else if (item.getData() != null) { - if (item.needsLabelUpdate()) { - virtualLazyUpdateLabel(item); - } - if (item.needsCountUpdate() && item.getExpanded()) { - virtualLazyUpdateChildCount(item); - } - } - } - - @Override + if (item.needsDataUpdate()) { + virtualLazyUpdateData(item); + } else if (item.getData() != null) { + if (item.needsLabelUpdate()) { + virtualLazyUpdateLabel(item); + } + if (item.needsCountUpdate() && item.getExpanded()) { + virtualLazyUpdateChildCount(item); + } + } + } + + @Override public void disposed(VirtualItem item) { - if (!fTree.isDisposed()) { - Object data = item.getData(); - if (data != null) { - unmapElement(data, item); - } - } - } - - private void associate(Object element, VirtualItem item) { - Object data = item.getData(); - if (data != null && data != element && data.equals(element)) { - // elements are equal but not identical - // -> being removed from map, but should not change filters - try { - fNotifyUnmap = false; - doAssociate(element, item); - } finally { - fNotifyUnmap = true; - } - } else { - doAssociate(element, item); - } - - } - - private void doAssociate(Object element, VirtualItem item) { - Object data = item.getData(); - if (data != null && data != element && data.equals(element)) { - // workaround for PR 1FV62BT - // assumption: elements are equal but not identical - // -> remove from map but don't touch children - unmapElement(data, item); - item.setData(element); - mapElement(element, item); - } else { - // recursively disassociate all - if (data != element) { - if (data != null) { - unmapElement(element, item); - disassociate(item); - } - item.setData(element); - } - // Always map the element, even if data == element, - // since unmapAllElements() can leave the map inconsistent - // See bug 2741 for details. - mapElement(element, item); - } - } - - private void disassociate(VirtualItem item) { - unmapElement(item.getData(), item); - - // Clear the map before we clear the data - item.setData(null); - - // Disassociate the children - VirtualItem[] items = item.getItems(); - for (int i = 0; i < items.length; i++) { - if (items[i].getData() != null) { - disassociate(items[i]); - } - } - } - - @Override + if (!fTree.isDisposed()) { + Object data = item.getData(); + if (data != null) { + unmapElement(data, item); + } + } + } + + private void associate(Object element, VirtualItem item) { + Object data = item.getData(); + if (data != null && data != element && data.equals(element)) { + // elements are equal but not identical + // -> being removed from map, but should not change filters + try { + fNotifyUnmap = false; + doAssociate(element, item); + } finally { + fNotifyUnmap = true; + } + } else { + doAssociate(element, item); + } + + } + + private void doAssociate(Object element, VirtualItem item) { + Object data = item.getData(); + if (data != null && data != element && data.equals(element)) { + // workaround for PR 1FV62BT + // assumption: elements are equal but not identical + // -> remove from map but don't touch children + unmapElement(data, item); + item.setData(element); + mapElement(element, item); + } else { + // recursively disassociate all + if (data != element) { + if (data != null) { + unmapElement(element, item); + disassociate(item); + } + item.setData(element); + } + // Always map the element, even if data == element, + // since unmapAllElements() can leave the map inconsistent + // See bug 2741 for details. + mapElement(element, item); + } + } + + private void disassociate(VirtualItem item) { + unmapElement(item.getData(), item); + + // Clear the map before we clear the data + item.setData(null); + + // Disassociate the children + VirtualItem[] items = item.getItems(); + for (int i = 0; i < items.length; i++) { + if (items[i].getData() != null) { + disassociate(items[i]); + } + } + } + + @Override public void setSelection(ISelection selection, boolean reveal) { - setSelection(selection, reveal, false); - } + setSelection(selection, reveal, false); + } - @Override + @Override public void setSelection(ISelection selection, boolean reveal, boolean force) { - trySelection(selection, reveal, force); - } + trySelection(selection, reveal, force); + } - @Override + @Override public boolean trySelection(ISelection selection, boolean reveal, boolean force) { - if (!force && !overrideSelection(getSelection(), selection)) { - return false; - } - - if (!fPreservingSelecction) { - internalSetSelection(selection, reveal); - fireSelectionChanged(new SelectionChangedEvent(this, selection)); - } else { - fRestoreSelection = false; - internalSetSelection(selection, reveal); - } - return true; - } - - private void internalSetSelection(ISelection selection, boolean reveal) { - if (selection instanceof ITreeSelection) { - TreePath[] paths = ((ITreeSelection) selection).getPaths(); + if (!force && !overrideSelection(getSelection(), selection)) { + return false; + } + + if (!fPreservingSelecction) { + internalSetSelection(selection, reveal); + fireSelectionChanged(new SelectionChangedEvent(this, selection)); + } else { + fRestoreSelection = false; + internalSetSelection(selection, reveal); + } + return true; + } + + private void internalSetSelection(ISelection selection, boolean reveal) { + if (selection instanceof ITreeSelection) { + TreePath[] paths = ((ITreeSelection) selection).getPaths(); List<VirtualItem> newSelection = new ArrayList<>(paths.length); - for (int i = 0; i < paths.length; ++i) { - // Use internalExpand since item may not yet be created. See - // 1G6B1AR. - VirtualItem item = findItem(paths[i]); - if (item != null) { - newSelection.add(item); - } - } - fTree.setSelection(newSelection.toArray(new VirtualItem[newSelection.size()])); - - // Although setting the selection in the control should reveal it, - // setSelection may be a no-op if the selection is unchanged, - // so explicitly reveal items in the selection here. - // See bug 100565 for more details. - if (reveal && newSelection.size() > 0) { - // Iterate backwards so the first item in the list - // is the one guaranteed to be visible - for (int i = (newSelection.size() - 1); i >= 0; i--) { - fTree.showItem(newSelection.get(i)); - } - } - } else { - fTree.setSelection(EMPTY_ITEMS_ARRAY); - } - - // Make sure that the new selection is properly revealed. - validate(); - } - - @Override + for (int i = 0; i < paths.length; ++i) { + // Use internalExpand since item may not yet be created. See + // 1G6B1AR. + VirtualItem item = findItem(paths[i]); + if (item != null) { + newSelection.add(item); + } + } + fTree.setSelection(newSelection.toArray(new VirtualItem[newSelection.size()])); + + // Although setting the selection in the control should reveal it, + // setSelection may be a no-op if the selection is unchanged, + // so explicitly reveal items in the selection here. + // See bug 100565 for more details. + if (reveal && newSelection.size() > 0) { + // Iterate backwards so the first item in the list + // is the one guaranteed to be visible + for (int i = (newSelection.size() - 1); i >= 0; i--) { + fTree.showItem(newSelection.get(i)); + } + } + } else { + fTree.setSelection(EMPTY_ITEMS_ARRAY); + } + + // Make sure that the new selection is properly revealed. + validate(); + } + + @Override public void update(Object element) { - VirtualItem[] items = findItems(element); - for (int i = 0; i < items.length; i++) { - doUpdate(items[i]); - } - } - - public void doUpdate(VirtualItem item) { - item.setNeedsLabelUpdate(); - validate(); - } - - @Override + VirtualItem[] items = findItems(element); + for (int i = 0; i < items.length; i++) { + doUpdate(items[i]); + } + } + + public void doUpdate(VirtualItem item) { + item.setNeedsLabelUpdate(); + validate(); + } + + @Override public ISelection getSelection() { - if (fTree.isDisposed()) { - return TreeSelection.EMPTY; - } - VirtualItem[] items = fTree.getSelection(); + if (fTree.isDisposed()) { + return TreeSelection.EMPTY; + } + VirtualItem[] items = fTree.getSelection(); ArrayList<TreePath> list = new ArrayList<>(items.length); Map<VirtualItem, TreePath> map = new LinkedHashMap<>(items.length * 4 / 3); - for (int i = 0; i < items.length; i++) { - TreePath path = null; - if (items[i].getData() != null) { - path = getTreePathFromItem(items[i]); - list.add(path); - } - map.put(items[i], path); - } - return new TreeSelection(list.toArray(new TreePath[list.size()])); - } - - private void preservingSelection(Runnable updateCode) { - - ISelection oldSelection = null; - try { - // preserve selection - oldSelection = getSelection(); - fPreservingSelecction = fRestoreSelection = true; - - // perform the update - updateCode.run(); - - } finally { - fPreservingSelecction = false; - - // restore selection - if (fRestoreSelection) { - internalSetSelection(oldSelection, false); - } - - // send out notification if old and new differ - ISelection newSelection = getSelection(); - if (!newSelection.equals(oldSelection)) { - handleInvalidSelection(oldSelection, newSelection); - } - } - } - - @Override + for (int i = 0; i < items.length; i++) { + TreePath path = null; + if (items[i].getData() != null) { + path = getTreePathFromItem(items[i]); + list.add(path); + } + map.put(items[i], path); + } + return new TreeSelection(list.toArray(new TreePath[list.size()])); + } + + private void preservingSelection(Runnable updateCode) { + + ISelection oldSelection = null; + try { + // preserve selection + oldSelection = getSelection(); + fPreservingSelecction = fRestoreSelection = true; + + // perform the update + updateCode.run(); + + } finally { + fPreservingSelecction = false; + + // restore selection + if (fRestoreSelection) { + internalSetSelection(oldSelection, false); + } + + // send out notification if old and new differ + ISelection newSelection = getSelection(); + if (!newSelection.equals(oldSelection)) { + handleInvalidSelection(oldSelection, newSelection); + } + } + } + + @Override public void expandToLevel(Object elementOrTreePath, int level) { - VirtualItem[] items = findItems(elementOrTreePath); - if (items.length > 0) { - expandToLevel(items[0], level); - } - validate(); - } - - @Override + VirtualItem[] items = findItems(elementOrTreePath); + if (items.length > 0) { + expandToLevel(items[0], level); + } + validate(); + } + + @Override public void setExpandedState(Object elementOrTreePath, boolean expanded) { - VirtualItem[] items = findItems(elementOrTreePath); - for (int i = 0; i < items.length; i++) { - items[i].setExpanded(expanded); - } - validate(); - } - - @Override + VirtualItem[] items = findItems(elementOrTreePath); + for (int i = 0; i < items.length; i++) { + items[i].setExpanded(expanded); + } + validate(); + } + + @Override public boolean getExpandedState(Object elementOrTreePath) { - VirtualItem[] items = findItems(elementOrTreePath); - if (items.length > 0) { - return items[0].getExpanded(); - } - return false; - } - - private void expandToLevel(VirtualItem item, int level) { - if (level == ALL_LEVELS || level > 0) { - if (!item.hasItems()) { - return; - } - - item.setExpanded(true); - - if (item.getData() == null) { - virtualLazyUpdateData(item); - // Cannot expand children if data is null. - return; - } - - if (level == ALL_LEVELS || level > 1) { - VirtualItem[] children = item.getItems(); - int newLevel = (level == ALL_LEVELS ? ALL_LEVELS - : level - 1); - for (int i = 0; i < children.length; i++) { - expandToLevel(children[i], newLevel); - } - } - } - } - - private void handleInvalidSelection(ISelection selection, ISelection newSelection) { - IModelSelectionPolicy selectionPolicy = ViewerAdapterService.getSelectionPolicy(selection, getPresentationContext()); - if (selectionPolicy != null) { - while (!selection.equals(newSelection)) { - ISelection temp = newSelection; - selection = selectionPolicy.replaceInvalidSelection(selection, newSelection); - if (selection == null) { - selection = TreeSelection.EMPTY; - } - if (!temp.equals(selection)) { - internalSetSelection(selection, false); - newSelection = getSelection(); - } else { - break; - } - } - } - - fireSelectionChanged(new SelectionChangedEvent(this, newSelection)); - } - - /** - * Returns whether the candidate selection should override the current - * selection. - * - * @param current Current selection in viewer - * @param candidate New potential selection requested by model. - * @return true if candidate selection should be set to viewer. - */ - @Override + VirtualItem[] items = findItems(elementOrTreePath); + if (items.length > 0) { + return items[0].getExpanded(); + } + return false; + } + + private void expandToLevel(VirtualItem item, int level) { + if (level == ALL_LEVELS || level > 0) { + if (!item.hasItems()) { + return; + } + + item.setExpanded(true); + + if (item.getData() == null) { + virtualLazyUpdateData(item); + // Cannot expand children if data is null. + return; + } + + if (level == ALL_LEVELS || level > 1) { + VirtualItem[] children = item.getItems(); + int newLevel = (level == ALL_LEVELS ? ALL_LEVELS + : level - 1); + for (int i = 0; i < children.length; i++) { + expandToLevel(children[i], newLevel); + } + } + } + } + + private void handleInvalidSelection(ISelection selection, ISelection newSelection) { + IModelSelectionPolicy selectionPolicy = ViewerAdapterService.getSelectionPolicy(selection, getPresentationContext()); + if (selectionPolicy != null) { + while (!selection.equals(newSelection)) { + ISelection temp = newSelection; + selection = selectionPolicy.replaceInvalidSelection(selection, newSelection); + if (selection == null) { + selection = TreeSelection.EMPTY; + } + if (!temp.equals(selection)) { + internalSetSelection(selection, false); + newSelection = getSelection(); + } else { + break; + } + } + } + + fireSelectionChanged(new SelectionChangedEvent(this, newSelection)); + } + + /** + * Returns whether the candidate selection should override the current + * selection. + * + * @param current Current selection in viewer + * @param candidate New potential selection requested by model. + * @return true if candidate selection should be set to viewer. + */ + @Override public boolean overrideSelection(ISelection current, ISelection candidate) { - IModelSelectionPolicy selectionPolicy = ViewerAdapterService.getSelectionPolicy(current, getPresentationContext()); - if (selectionPolicy == null) { - return true; - } - if (selectionPolicy.contains(candidate, getPresentationContext())) { - return selectionPolicy.overrides(current, candidate, getPresentationContext()); - } - return !selectionPolicy.isSticky(current, getPresentationContext()); - } - - @Override + IModelSelectionPolicy selectionPolicy = ViewerAdapterService.getSelectionPolicy(current, getPresentationContext()); + if (selectionPolicy == null) { + return true; + } + if (selectionPolicy.contains(candidate, getPresentationContext())) { + return selectionPolicy.overrides(current, candidate, getPresentationContext()); + } + return !selectionPolicy.isSticky(current, getPresentationContext()); + } + + @Override public ViewerFilter[] getFilters() { - return fFilters; - } + return fFilters; + } - @Override + @Override public void addFilter(ViewerFilter filter) { - ViewerFilter[] newFilters = new ViewerFilter[fFilters.length + 1]; - System.arraycopy(fFilters, 0, newFilters, 0, fFilters.length); - newFilters[fFilters.length] = filter; - fFilters = newFilters; - } + ViewerFilter[] newFilters = new ViewerFilter[fFilters.length + 1]; + System.arraycopy(fFilters, 0, newFilters, 0, fFilters.length); + newFilters[fFilters.length] = filter; + fFilters = newFilters; + } - @Override + @Override public void setFilters(ViewerFilter... filters) { - fFilters = filters; - } - - public void dispose() { - if (fColumnPresentation != null) { - fColumnPresentation.dispose(); - } - - if (fContentProvider != null) { - fContentProvider.dispose(); - fContentProvider = null; - } - if (fLabelProvider != null) { - fLabelProvider.dispose(); - fLabelProvider = null; - } - - fTree.removeItemListener(this); - fTree.dispose(); - } - - /** - * Returns this viewer's presentation context. - * - * @return presentation context - */ - @Override + fFilters = filters; + } + + public void dispose() { + if (fColumnPresentation != null) { + fColumnPresentation.dispose(); + } + + if (fContentProvider != null) { + fContentProvider.dispose(); + fContentProvider = null; + } + if (fLabelProvider != null) { + fLabelProvider.dispose(); + fLabelProvider = null; + } + + fTree.removeItemListener(this); + fTree.dispose(); + } + + /** + * Returns this viewer's presentation context. + * + * @return presentation context + */ + @Override public IPresentationContext getPresentationContext() { - return fContext; - } - - /** - * Configures the columns for the given viewer input. - * - * @param input new viewer input - */ - private void resetColumns(Object input) { - if (input != null) { - // only change columns if the input is non-null (persist when empty) - IColumnPresentationFactory factory = ViewerAdapterService.getColumnPresentationFactory(input); - PresentationContext context = (PresentationContext) getPresentationContext(); - String type = null; - if (factory != null) { - type = factory.getColumnPresentationId(context, input); - } - if (type != null && factory != null) { - if (fColumnPresentation != null) { - if (!fColumnPresentation.getId().equals(type)) { - // dispose old, create new - fColumnPresentation.dispose(); - fColumnPresentation = null; - } - } - if (fColumnPresentation == null) { - fColumnPresentation = factory.createColumnPresentation(context, input); - if (fColumnPresentation != null) { - fColumnPresentation.init(context); - configureColumns(); - } - } - } else { - if (fColumnPresentation != null) { - fColumnPresentation.dispose(); - fColumnPresentation = null; - configureColumns(); - } - } - } - } - - /** - * Configures the columns based on the current settings. - */ - protected void configureColumns() { - if (fColumnPresentation != null) { - IColumnPresentation build = null; - if (isShowColumns(fColumnPresentation.getId())) { - build = fColumnPresentation; - } - buildColumns(build); - } else { - // get rid of columns - buildColumns(null); - } - } - - /** - * Toggles columns on/off for the current column presentation, if any. - * - * @param show whether to show columns if the current input supports - * columns - */ - public void setShowColumns(boolean show) { - if (show) { - if (!isShowColumns()) { - fShowColumns.remove(fColumnPresentation.getId()); - } - } else { - if (isShowColumns()){ - fShowColumns.put(fColumnPresentation.getId(), Boolean.FALSE); - } - } - refreshColumns(); - } - - /** - * Refreshes the columns in the view, based on the viewer input. - */ - protected void refreshColumns() { - configureColumns(); - refresh(); - } - - /** - * @return Returns true if columns are being displayed currently. - */ - public boolean isShowColumns() { - if (fColumnPresentation != null) { - return isShowColumns(fColumnPresentation.getId()); - } - return false; - } - - /** - * Returns whether columns can be toggled on/off for the current input. - * - * @return whether columns can be toggled on/off for the current input - */ - public boolean canToggleColumns() { - return fColumnPresentation != null && fColumnPresentation.isOptional(); - } - - protected boolean isShowColumns(String columnPresentationId) { - Boolean bool = fShowColumns.get(columnPresentationId); - if (bool == null) { - return true; - } - return bool.booleanValue(); - } - - /** - * Creates new columns for the given presentation. - * - * @param presentation presentation context to build columns for. - */ - protected void buildColumns(IColumnPresentation presentation) { - PresentationContext presentationContext = (PresentationContext) getPresentationContext(); - if (presentation != null) { - presentationContext.setColumns(getVisibleColumns()); - } else { - presentationContext.setColumns(null); - } - } - - /** - * Returns identifiers of the visible columns in this viewer, or <code>null</code> - * if there is currently no column presentation. - * - * @return visible columns or <code>null</code> - */ - @Override + return fContext; + } + + /** + * Configures the columns for the given viewer input. + * + * @param input new viewer input + */ + private void resetColumns(Object input) { + if (input != null) { + // only change columns if the input is non-null (persist when empty) + IColumnPresentationFactory factory = ViewerAdapterService.getColumnPresentationFactory(input); + PresentationContext context = (PresentationContext) getPresentationContext(); + String type = null; + if (factory != null) { + type = factory.getColumnPresentationId(context, input); + } + if (type != null && factory != null) { + if (fColumnPresentation != null) { + if (!fColumnPresentation.getId().equals(type)) { + // dispose old, create new + fColumnPresentation.dispose(); + fColumnPresentation = null; + } + } + if (fColumnPresentation == null) { + fColumnPresentation = factory.createColumnPresentation(context, input); + if (fColumnPresentation != null) { + fColumnPresentation.init(context); + configureColumns(); + } + } + } else { + if (fColumnPresentation != null) { + fColumnPresentation.dispose(); + fColumnPresentation = null; + configureColumns(); + } + } + } + } + + /** + * Configures the columns based on the current settings. + */ + protected void configureColumns() { + if (fColumnPresentation != null) { + IColumnPresentation build = null; + if (isShowColumns(fColumnPresentation.getId())) { + build = fColumnPresentation; + } + buildColumns(build); + } else { + // get rid of columns + buildColumns(null); + } + } + + /** + * Toggles columns on/off for the current column presentation, if any. + * + * @param show whether to show columns if the current input supports + * columns + */ + public void setShowColumns(boolean show) { + if (show) { + if (!isShowColumns()) { + fShowColumns.remove(fColumnPresentation.getId()); + } + } else { + if (isShowColumns()){ + fShowColumns.put(fColumnPresentation.getId(), Boolean.FALSE); + } + } + refreshColumns(); + } + + /** + * Refreshes the columns in the view, based on the viewer input. + */ + protected void refreshColumns() { + configureColumns(); + refresh(); + } + + /** + * @return Returns true if columns are being displayed currently. + */ + public boolean isShowColumns() { + if (fColumnPresentation != null) { + return isShowColumns(fColumnPresentation.getId()); + } + return false; + } + + /** + * Returns whether columns can be toggled on/off for the current input. + * + * @return whether columns can be toggled on/off for the current input + */ + public boolean canToggleColumns() { + return fColumnPresentation != null && fColumnPresentation.isOptional(); + } + + protected boolean isShowColumns(String columnPresentationId) { + Boolean bool = fShowColumns.get(columnPresentationId); + if (bool == null) { + return true; + } + return bool.booleanValue(); + } + + /** + * Creates new columns for the given presentation. + * + * @param presentation presentation context to build columns for. + */ + protected void buildColumns(IColumnPresentation presentation) { + PresentationContext presentationContext = (PresentationContext) getPresentationContext(); + if (presentation != null) { + presentationContext.setColumns(getVisibleColumns()); + } else { + presentationContext.setColumns(null); + } + } + + /** + * Returns identifiers of the visible columns in this viewer, or <code>null</code> + * if there is currently no column presentation. + * + * @return visible columns or <code>null</code> + */ + @Override public String[] getVisibleColumns() { - if (isShowColumns()) { - IColumnPresentation presentation = getColumnPresentation(); - if (presentation != null) { - String[] columns = fVisibleColumns.get(presentation.getId()); - if (columns == null) { - return presentation.getInitialColumns(); - } - return columns; - } - } - return null; - } - - /** - * Sets the id's of visible columns, or <code>null</code> to set default columns. - * Only affects the current column presentation. - * - * @param ids visible columns - */ - public void setVisibleColumns(String[] ids) { - if (ids != null && ids.length == 0) { - ids = null; - } - IColumnPresentation presentation = getColumnPresentation(); - if (presentation != null) { - fVisibleColumns.remove(presentation.getId()); - if (ids != null) { - // put back in table if not default - String[] columns = presentation.getInitialColumns(); - if (columns.length == ids.length) { - for (int i = 0; i < columns.length; i++) { - if (!ids[i].equals(columns[i])) { - fVisibleColumns.put(presentation.getId(), ids); - break; - } - } - } else { - fVisibleColumns.put(presentation.getId(), ids); - } - } - PresentationContext presentationContext = (PresentationContext) getPresentationContext(); - presentationContext.setColumns(getVisibleColumns()); - refreshColumns(); - } - } - - /** - * Returns the current column presentation for this viewer, or <code>null</code> - * if none. - * - * @return column presentation or <code>null</code> - */ - public IColumnPresentation getColumnPresentation() { - return fColumnPresentation; - } - - /** - * Save viewer state into the given memento. - * - * @param memento Memento to write state to. - */ - public void saveState(IMemento memento) { - if (!fShowColumns.isEmpty()) { + if (isShowColumns()) { + IColumnPresentation presentation = getColumnPresentation(); + if (presentation != null) { + String[] columns = fVisibleColumns.get(presentation.getId()); + if (columns == null) { + return presentation.getInitialColumns(); + } + return columns; + } + } + return null; + } + + /** + * Sets the id's of visible columns, or <code>null</code> to set default columns. + * Only affects the current column presentation. + * + * @param ids visible columns + */ + public void setVisibleColumns(String[] ids) { + if (ids != null && ids.length == 0) { + ids = null; + } + IColumnPresentation presentation = getColumnPresentation(); + if (presentation != null) { + fVisibleColumns.remove(presentation.getId()); + if (ids != null) { + // put back in table if not default + String[] columns = presentation.getInitialColumns(); + if (columns.length == ids.length) { + for (int i = 0; i < columns.length; i++) { + if (!ids[i].equals(columns[i])) { + fVisibleColumns.put(presentation.getId(), ids); + break; + } + } + } else { + fVisibleColumns.put(presentation.getId(), ids); + } + } + PresentationContext presentationContext = (PresentationContext) getPresentationContext(); + presentationContext.setColumns(getVisibleColumns()); + refreshColumns(); + } + } + + /** + * Returns the current column presentation for this viewer, or <code>null</code> + * if none. + * + * @return column presentation or <code>null</code> + */ + public IColumnPresentation getColumnPresentation() { + return fColumnPresentation; + } + + /** + * Save viewer state into the given memento. + * + * @param memento Memento to write state to. + */ + public void saveState(IMemento memento) { + if (!fShowColumns.isEmpty()) { for (Entry<String, Boolean> entry : fShowColumns.entrySet()) { - IMemento sizes = memento.createChild(SHOW_COLUMNS, entry.getKey()); - sizes.putString(SHOW_COLUMNS, entry.getValue().toString()); - } - } - if (!fVisibleColumns.isEmpty()) { + IMemento sizes = memento.createChild(SHOW_COLUMNS, entry.getKey()); + sizes.putString(SHOW_COLUMNS, entry.getValue().toString()); + } + } + if (!fVisibleColumns.isEmpty()) { for (Entry<String, String[]> entry : fVisibleColumns.entrySet()) { IMemento visible = memento.createChild(VISIBLE_COLUMNS, entry.getKey()); - String[] columns = entry.getValue(); - visible.putInteger(SIZE, columns.length); - for (int i = 0; i < columns.length; i++) { - visible.putString(COLUMN+Integer.toString(i), columns[i]); - } - } - } - // save presentation context properties - IPresentationContext context = getPresentationContext(); - if (context instanceof PresentationContext) { - PresentationContext pc = (PresentationContext) context; - pc.saveProperites(memento); - - } - } - - /** - * Initializes viewer state from the memento - * - * @param memento Memento to read state from. - */ - public void initState(IMemento memento) { - IMemento[] mementos = memento.getChildren(SHOW_COLUMNS); - for (int i = 0; i < mementos.length; i++) { - IMemento child = mementos[i]; - String id = child.getID(); - Boolean bool = Boolean.valueOf(child.getString(SHOW_COLUMNS)); - if (!bool.booleanValue()) { - fShowColumns.put(id, bool); - } - } - mementos = memento.getChildren(VISIBLE_COLUMNS); - for (int i = 0; i < mementos.length; i++) { - IMemento child = mementos[i]; - String id = child.getID(); - Integer integer = child.getInteger(SIZE); - if (integer != null) { - int length = integer.intValue(); - String[] columns = new String[length]; - for (int j = 0; j < length; j++) { - columns[j] = child.getString(COLUMN+Integer.toString(j)); - } - fVisibleColumns.put(id, columns); - } - } - // restore presentation context properties - // save presentation context properties - IPresentationContext context = getPresentationContext(); - if (context instanceof PresentationContext) { - PresentationContext pc = (PresentationContext) context; - pc.initProperties(memento); - } - } - - @Override + String[] columns = entry.getValue(); + visible.putInteger(SIZE, columns.length); + for (int i = 0; i < columns.length; i++) { + visible.putString(COLUMN+Integer.toString(i), columns[i]); + } + } + } + // save presentation context properties + IPresentationContext context = getPresentationContext(); + if (context instanceof PresentationContext) { + PresentationContext pc = (PresentationContext) context; + pc.saveProperites(memento); + + } + } + + /** + * Initializes viewer state from the memento + * + * @param memento Memento to read state from. + */ + public void initState(IMemento memento) { + IMemento[] mementos = memento.getChildren(SHOW_COLUMNS); + for (int i = 0; i < mementos.length; i++) { + IMemento child = mementos[i]; + String id = child.getID(); + Boolean bool = Boolean.valueOf(child.getString(SHOW_COLUMNS)); + if (!bool.booleanValue()) { + fShowColumns.put(id, bool); + } + } + mementos = memento.getChildren(VISIBLE_COLUMNS); + for (int i = 0; i < mementos.length; i++) { + IMemento child = mementos[i]; + String id = child.getID(); + Integer integer = child.getInteger(SIZE); + if (integer != null) { + int length = integer.intValue(); + String[] columns = new String[length]; + for (int j = 0; j < length; j++) { + columns[j] = child.getString(COLUMN+Integer.toString(j)); + } + fVisibleColumns.put(id, columns); + } + } + // restore presentation context properties + // save presentation context properties + IPresentationContext context = getPresentationContext(); + if (context instanceof PresentationContext) { + PresentationContext pc = (PresentationContext) context; + pc.initProperties(memento); + } + } + + @Override public void addViewerUpdateListener(IViewerUpdateListener listener) { - getContentProvider().addViewerUpdateListener(listener); - } + getContentProvider().addViewerUpdateListener(listener); + } - @Override + @Override public void removeViewerUpdateListener(IViewerUpdateListener listener) { - ITreeModelContentProvider cp = getContentProvider(); - if (cp != null) { - cp.removeViewerUpdateListener(listener); - } - } + ITreeModelContentProvider cp = getContentProvider(); + if (cp != null) { + cp.removeViewerUpdateListener(listener); + } + } - @Override + @Override public void addModelChangedListener(IModelChangedListener listener) { - getContentProvider().addModelChangedListener(listener); - } + getContentProvider().addModelChangedListener(listener); + } - @Override + @Override public void removeModelChangedListener(IModelChangedListener listener) { - ITreeModelContentProvider cp = getContentProvider(); - if (cp != null) { - cp.removeModelChangedListener(listener); - } - } + ITreeModelContentProvider cp = getContentProvider(); + if (cp != null) { + cp.removeModelChangedListener(listener); + } + } - @Override + @Override public void addStateUpdateListener(IStateUpdateListener listener) { - getContentProvider().addStateUpdateListener(listener); - } + getContentProvider().addStateUpdateListener(listener); + } - @Override + @Override public void removeStateUpdateListener(IStateUpdateListener listener) { - ITreeModelContentProvider cp = getContentProvider(); - if (cp != null) { - cp.removeStateUpdateListener(listener); - } - } + ITreeModelContentProvider cp = getContentProvider(); + if (cp != null) { + cp.removeStateUpdateListener(listener); + } + } @Override public void addLabelUpdateListener(ILabelUpdateListener listener) { - getLabelProvider().addLabelUpdateListener(listener); - } + getLabelProvider().addLabelUpdateListener(listener); + } - @Override + @Override public void removeLabelUpdateListener(ILabelUpdateListener listener) { - getLabelProvider().removeLabelUpdateListener(listener); - } - - /** - * Performs auto expand on an element at the specified path if the auto expand - * level dictates the element should be expanded. - * - * @param elementPath tree path to element to consider for expansion - */ - @Override + getLabelProvider().removeLabelUpdateListener(listener); + } + + /** + * Performs auto expand on an element at the specified path if the auto expand + * level dictates the element should be expanded. + * + * @param elementPath tree path to element to consider for expansion + */ + @Override public void autoExpand(TreePath elementPath) { - int level = getAutoExpandLevel(); - if (level > 0 || level == org.eclipse.debug.internal.ui.viewers.model.provisional.ITreeModelViewer.ALL_LEVELS) { - if (level == org.eclipse.debug.internal.ui.viewers.model.provisional.ITreeModelViewer.ALL_LEVELS || level > elementPath.getSegmentCount()) { - expandToLevel(elementPath, 1); - } - } - } - - @Override + int level = getAutoExpandLevel(); + if (level > 0 || level == org.eclipse.debug.internal.ui.viewers.model.provisional.ITreeModelViewer.ALL_LEVELS) { + if (level == org.eclipse.debug.internal.ui.viewers.model.provisional.ITreeModelViewer.ALL_LEVELS || level > elementPath.getSegmentCount()) { + expandToLevel(elementPath, 1); + } + } + } + + @Override public int getChildCount(TreePath path) { - int childCount = -1; - VirtualItem[] items = findItems(path); - if (items.length > 0) { - childCount = items[0].getItemCount(); - // Mimic the jface viewer behavior which returns 1 for child count - // for an item that has children but is not yet expanded. - // Return 0, if we do not know if the item has children. - if (childCount == -1) { - childCount = items[0].hasItems() ? 1 : 0; - } - } - return childCount; - } - - @Override + int childCount = -1; + VirtualItem[] items = findItems(path); + if (items.length > 0) { + childCount = items[0].getItemCount(); + // Mimic the jface viewer behavior which returns 1 for child count + // for an item that has children but is not yet expanded. + // Return 0, if we do not know if the item has children. + if (childCount == -1) { + childCount = items[0].hasItems() ? 1 : 0; + } + } + return childCount; + } + + @Override public Object getChildElement(TreePath path, int index) { - VirtualItem[] items = findItems(path); - if (items.length > 0) { - if (index < items[0].getItemCount()) { - return items[0].getItem(new VirtualItem.Index(index)).getData(); - } - } - return null; - } - - @Override + VirtualItem[] items = findItems(path); + if (items.length > 0) { + if (index < items[0].getItemCount()) { + return items[0].getItem(new VirtualItem.Index(index)).getData(); + } + } + return null; + } + + @Override public TreePath getTopElementPath() { - return null; - } + return null; + } - @Override + @Override public boolean saveElementState(TreePath path, ModelDelta delta, int flagsToSave) { - VirtualTree tree = getTree(); - VirtualItem[] selection = tree.getSelection(); + VirtualTree tree = getTree(); + VirtualItem[] selection = tree.getSelection(); Set<VirtualItem> set = new HashSet<>(); - for (int i = 0; i < selection.length; i++) { - set.add(selection[i]); - } - - VirtualItem[] items = null; - VirtualItem parent = findItem(path); - - if (parent != null) { - delta.setChildCount(((TreeModelContentProvider)getContentProvider()).viewToModelCount(path, parent.getItemCount())); - if (parent.getExpanded()) { - if ((flagsToSave & IModelDelta.EXPAND) != 0) { - delta.setFlags(delta.getFlags() | IModelDelta.EXPAND); - } - } else if ((flagsToSave & IModelDelta.COLLAPSE) != 0 && parent.hasItems()){ - delta.setFlags(delta.getFlags() | IModelDelta.COLLAPSE); - } - - if (set.contains(parent) && (flagsToSave & IModelDelta.SELECT) != 0) { - delta.setFlags(delta.getFlags() | IModelDelta.SELECT); - } - - items = parent.getItems(); - for (int i = 0; i < items.length; i++) { - doSaveElementState(path, delta, items[i], set, flagsToSave); - } - return true; - } else { - return false; - } - } + for (int i = 0; i < selection.length; i++) { + set.add(selection[i]); + } + + VirtualItem[] items = null; + VirtualItem parent = findItem(path); + + if (parent != null) { + delta.setChildCount(((TreeModelContentProvider)getContentProvider()).viewToModelCount(path, parent.getItemCount())); + if (parent.getExpanded()) { + if ((flagsToSave & IModelDelta.EXPAND) != 0) { + delta.setFlags(delta.getFlags() | IModelDelta.EXPAND); + } + } else if ((flagsToSave & IModelDelta.COLLAPSE) != 0 && parent.hasItems()){ + delta.setFlags(delta.getFlags() | IModelDelta.COLLAPSE); + } + + if (set.contains(parent) && (flagsToSave & IModelDelta.SELECT) != 0) { + delta.setFlags(delta.getFlags() | IModelDelta.SELECT); + } + + items = parent.getItems(); + for (int i = 0; i < items.length; i++) { + doSaveElementState(path, delta, items[i], set, flagsToSave); + } + return true; + } else { + return false; + } + } private void doSaveElementState(TreePath parentPath, ModelDelta delta, VirtualItem item, Collection<VirtualItem> set, int flagsToSave) { - Object element = item.getData(); - if (element != null) { - boolean expanded = item.getExpanded(); - boolean selected = set.contains(item); - int flags = IModelDelta.NO_CHANGE; - if (expanded && (flagsToSave & IModelDelta.EXPAND) != 0) { - flags = flags | IModelDelta.EXPAND; - } - if (!expanded && (flagsToSave & IModelDelta.COLLAPSE) != 0 && item.hasItems()){ - flags = flags | IModelDelta.COLLAPSE; - } - if (selected && (flagsToSave & IModelDelta.SELECT) != 0) { - flags = flags | IModelDelta.SELECT; - } - if (expanded || flags != IModelDelta.NO_CHANGE) { - int modelIndex = ((TreeModelContentProvider)getContentProvider()).viewToModelIndex(parentPath, item.getIndex().intValue()); - TreePath elementPath = parentPath.createChildPath(element); - int numChildren = ((TreeModelContentProvider)getContentProvider()).viewToModelCount(elementPath, item.getItemCount()); - ModelDelta childDelta = delta.addNode(element, modelIndex, flags, numChildren); - if (expanded) { - VirtualItem[] items = item.getItems(); - for (int i = 0; i < items.length; i++) { - doSaveElementState(elementPath, childDelta, items[i], set, flagsToSave); - } - } - } - } - } - - @Override + Object element = item.getData(); + if (element != null) { + boolean expanded = item.getExpanded(); + boolean selected = set.contains(item); + int flags = IModelDelta.NO_CHANGE; + if (expanded && (flagsToSave & IModelDelta.EXPAND) != 0) { + flags = flags | IModelDelta.EXPAND; + } + if (!expanded && (flagsToSave & IModelDelta.COLLAPSE) != 0 && item.hasItems()){ + flags = flags | IModelDelta.COLLAPSE; + } + if (selected && (flagsToSave & IModelDelta.SELECT) != 0) { + flags = flags | IModelDelta.SELECT; + } + if (expanded || flags != IModelDelta.NO_CHANGE) { + int modelIndex = ((TreeModelContentProvider)getContentProvider()).viewToModelIndex(parentPath, item.getIndex().intValue()); + TreePath elementPath = parentPath.createChildPath(element); + int numChildren = ((TreeModelContentProvider)getContentProvider()).viewToModelCount(elementPath, item.getItemCount()); + ModelDelta childDelta = delta.addNode(element, modelIndex, flags, numChildren); + if (expanded) { + VirtualItem[] items = item.getItems(); + for (int i = 0; i < items.length; i++) { + doSaveElementState(elementPath, childDelta, items[i], set, flagsToSave); + } + } + } + } + } + + @Override public void updateViewer(IModelDelta delta) { - getContentProvider().updateModel(delta, ITreeModelContentProvider.ALL_MODEL_DELTA_FLAGS); - } + getContentProvider().updateModel(delta, ITreeModelContentProvider.ALL_MODEL_DELTA_FLAGS); + } - @Override + @Override public ViewerLabel getElementLabel(TreePath path, String columnId) { - if (path.getSegmentCount() == 0) { - return null; - } - - int columnIdx = -1; - String[] visibleColumns = getVisibleColumns(); - if (columnId != null && visibleColumns != null) { - int i = 0; - for (i = 0; i < visibleColumns.length; i++) { - if (columnId.equals(getVisibleColumns()[i])) { - columnIdx = i; - break; - } - } - if (i == visibleColumns.length) { - return null; - } - } else { - columnIdx = 0; - } - VirtualItem item = findItem(path); - - if (item != null) { - ViewerLabel label = new ViewerLabel(getText(item, columnIdx), getImage(item, columnIdx)); - label.setFont(getFont(item, columnIdx)); - label.setBackground(getBackground(item, columnIdx)); - label.setForeground(getForeground(item, columnIdx)); - return label; - } - return null; - } - - @Override + if (path.getSegmentCount() == 0) { + return null; + } + + int columnIdx = -1; + String[] visibleColumns = getVisibleColumns(); + if (columnId != null && visibleColumns != null) { + int i = 0; + for (i = 0; i < visibleColumns.length; i++) { + if (columnId.equals(getVisibleColumns()[i])) { + columnIdx = i; + break; + } + } + if (i == visibleColumns.length) { + return null; + } + } else { + columnIdx = 0; + } + VirtualItem item = findItem(path); + + if (item != null) { + ViewerLabel label = new ViewerLabel(getText(item, columnIdx), getImage(item, columnIdx)); + label.setFont(getFont(item, columnIdx)); + label.setBackground(getBackground(item, columnIdx)); + label.setForeground(getForeground(item, columnIdx)); + return label; + } + return null; + } + + @Override public TreePath[] getElementPaths(Object element) { - VirtualItem[] items = findItems(element); - TreePath[] paths = new TreePath[items.length]; - for (int i = 0; i < items.length; i++) { - paths[i] = getTreePathFromItem(items[i]); - } - return paths; - } - - - public String getText(VirtualItem item, int columnIdx) { - String[] texts = (String[])item.getData(VirtualItem.LABEL_KEY); - if (texts != null && texts.length > columnIdx) { - return texts[columnIdx]; - } - return null; - } - - public Image getImage(VirtualItem item, int columnIdx) { - ImageDescriptor[] imageDescriptors = (ImageDescriptor[]) item.getData(VirtualItem.IMAGE_KEY); - if (imageDescriptors != null && imageDescriptors.length > columnIdx) { - return getLabelProvider().getImage(imageDescriptors[columnIdx]); - } - return null; - } - - public Font getFont(VirtualItem item, int columnIdx) { - FontData[] fontDatas = (FontData[]) item.getData(VirtualItem.FONT_KEY); - if (fontDatas != null) { - return getLabelProvider().getFont(fontDatas[columnIdx]); - } - return null; - } - - public Color getForeground(VirtualItem item, int columnIdx) { - RGB[] rgbs = (RGB[]) item.getData(VirtualItem.FOREGROUND_KEY); - if (rgbs != null) { - return getLabelProvider().getColor(rgbs[columnIdx]); - } - return null; - } - - public Color getBackground(VirtualItem item, int columnIdx) { - RGB[] rgbs = (RGB[]) item.getData(VirtualItem.BACKGROUND_KEY); - if (rgbs != null) { - return getLabelProvider().getColor(rgbs[columnIdx]); - } - return null; - } - - @Override + VirtualItem[] items = findItems(element); + TreePath[] paths = new TreePath[items.length]; + for (int i = 0; i < items.length; i++) { + paths[i] = getTreePathFromItem(items[i]); + } + return paths; + } + + + public String getText(VirtualItem item, int columnIdx) { + String[] texts = (String[])item.getData(VirtualItem.LABEL_KEY); + if (texts != null && texts.length > columnIdx) { + return texts[columnIdx]; + } + return null; + } + + public Image getImage(VirtualItem item, int columnIdx) { + ImageDescriptor[] imageDescriptors = (ImageDescriptor[]) item.getData(VirtualItem.IMAGE_KEY); + if (imageDescriptors != null && imageDescriptors.length > columnIdx) { + return getLabelProvider().getImage(imageDescriptors[columnIdx]); + } + return null; + } + + public Font getFont(VirtualItem item, int columnIdx) { + FontData[] fontDatas = (FontData[]) item.getData(VirtualItem.FONT_KEY); + if (fontDatas != null) { + return getLabelProvider().getFont(fontDatas[columnIdx]); + } + return null; + } + + public Color getForeground(VirtualItem item, int columnIdx) { + RGB[] rgbs = (RGB[]) item.getData(VirtualItem.FOREGROUND_KEY); + if (rgbs != null) { + return getLabelProvider().getColor(rgbs[columnIdx]); + } + return null; + } + + public Color getBackground(VirtualItem item, int columnIdx) { + RGB[] rgbs = (RGB[]) item.getData(VirtualItem.BACKGROUND_KEY); + if (rgbs != null) { + return getLabelProvider().getColor(rgbs[columnIdx]); + } + return null; + } + + @Override public void clearSelectionQuiet() { - getTree().setSelection(EMPTY_ITEMS_ARRAY); - } + getTree().setSelection(EMPTY_ITEMS_ARRAY); + } - @Override + @Override public boolean getElementChecked(TreePath path) { - // Not supported - return false; - } + // Not supported + return false; + } - @Override + @Override public boolean getElementGrayed(TreePath path) { - // Not supported - return false; - } + // Not supported + return false; + } - @Override + @Override public void setElementChecked(TreePath path, boolean checked, boolean grayed) { - // Not supported - } + // Not supported + } - @Override + @Override public String toString() { - return getTree().toString(); - } + return getTree().toString(); + } } diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/LabelUpdate.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/LabelUpdate.java index 4ece51019..984ca2e6e 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/LabelUpdate.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/LabelUpdate.java @@ -137,7 +137,7 @@ class LabelUpdate extends Request implements ILabelUpdate, ICheckUpdate { * Applies settings to viewer cell */ public void performUpdate() { - fProvider.setElementData(fElementPath, fNumColumns, fLabels, fImageDescriptors, fFontDatas, fForegrounds, fBackgrounds, fChecked, fGrayed); + fProvider.setElementData(fElementPath, fNumColumns, fLabels, fImageDescriptors, fFontDatas, fForegrounds, fBackgrounds, fChecked, fGrayed); fProvider.updateComplete(this); } diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/MementoUpdate.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/MementoUpdate.java index 329cac20b..0e718ba2e 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/MementoUpdate.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/MementoUpdate.java @@ -33,12 +33,12 @@ abstract class MementoUpdate extends Request implements IViewerUpdate { /** * Constructs a viewer state request. - * @param provider the content provider to use for the update - * @param viewerInput the current input - * @param elementPath the path of the element to update - * @param element the element to update - * @param memento Memento to update - * @param context the presentation context + * @param provider the content provider to use for the update + * @param viewerInput the current input + * @param elementPath the path of the element to update + * @param element the element to update + * @param memento Memento to update + * @param context the presentation context * */ public MementoUpdate(TreeModelContentProvider provider, Object viewerInput, IPresentationContext context, Object element, TreePath elementPath, IMemento memento) { 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 8886c18d8..00a70d498 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 @@ -45,545 +45,545 @@ import org.eclipse.swt.widgets.Display; */ public class SubTreeModelViewer extends TreeModelViewer { - /** - * The tree path in the model to the root element of this viewer. - */ - private TreePath fRootPath = TreePath.EMPTY; - - /** - * Viewer delegate that content and label providers refer to for viewer data. - */ - private DelegatingTreeModelViewer fDelegatingViewer; - - /** - * @return Returns the root element's model tree path. - */ - public TreePath getRootPath() { - return fRootPath; - } - - public SubTreeModelViewer(Composite parent, int style, IPresentationContext context) { - super(parent, style, context); - } - - /** - * Sets the viewer's input and root element's path - * - * @param input New viewer input. - * @param rootPath New root element path. - */ - public void setInput(Object input, TreePath rootPath) { - fRootPath = rootPath; - super.setInput(input); - } - - /** - * A proxy for the sub tree viewer which is given to the content and - * label providers. It translates the sub-tree paths in the viewer to the - * full model paths that the providers expect. - */ - public class DelegatingTreeModelViewer extends Viewer - implements IInternalTreeModelViewer - { - @Override + /** + * The tree path in the model to the root element of this viewer. + */ + private TreePath fRootPath = TreePath.EMPTY; + + /** + * Viewer delegate that content and label providers refer to for viewer data. + */ + private DelegatingTreeModelViewer fDelegatingViewer; + + /** + * @return Returns the root element's model tree path. + */ + public TreePath getRootPath() { + return fRootPath; + } + + public SubTreeModelViewer(Composite parent, int style, IPresentationContext context) { + super(parent, style, context); + } + + /** + * Sets the viewer's input and root element's path + * + * @param input New viewer input. + * @param rootPath New root element path. + */ + public void setInput(Object input, TreePath rootPath) { + fRootPath = rootPath; + super.setInput(input); + } + + /** + * A proxy for the sub tree viewer which is given to the content and + * label providers. It translates the sub-tree paths in the viewer to the + * full model paths that the providers expect. + */ + public class DelegatingTreeModelViewer extends Viewer + implements IInternalTreeModelViewer + { + @Override public void reveal(TreePath path, int index) { - if (path.startsWith(fRootPath, null)) { - SubTreeModelViewer.this.reveal(createSubPath(path), index); - } - } + if (path.startsWith(fRootPath, null)) { + SubTreeModelViewer.this.reveal(createSubPath(path), index); + } + } - @Override + @Override public void replace(Object parentOrTreePath, int index, Object element) { - if (parentOrTreePath instanceof TreePath) { - TreePath path = (TreePath)parentOrTreePath; - if (path.startsWith(fRootPath, null)) { - SubTreeModelViewer.this.replace(createSubPath(path), index, element); - } - } else { - SubTreeModelViewer.this.replace(parentOrTreePath, index, element); - } - } - - @Override + if (parentOrTreePath instanceof TreePath) { + TreePath path = (TreePath)parentOrTreePath; + if (path.startsWith(fRootPath, null)) { + SubTreeModelViewer.this.replace(createSubPath(path), index, element); + } + } else { + SubTreeModelViewer.this.replace(parentOrTreePath, index, element); + } + } + + @Override public void setChildCount(Object elementOrTreePath, int count) { - if (elementOrTreePath instanceof TreePath) { - TreePath path = (TreePath)elementOrTreePath; - if (path.startsWith(fRootPath, null)) { - SubTreeModelViewer.this.setChildCount(createSubPath(path), count); - } - } else { - SubTreeModelViewer.this.setChildCount(elementOrTreePath, count); - } - } - - @Override + if (elementOrTreePath instanceof TreePath) { + TreePath path = (TreePath)elementOrTreePath; + if (path.startsWith(fRootPath, null)) { + SubTreeModelViewer.this.setChildCount(createSubPath(path), count); + } + } else { + SubTreeModelViewer.this.setChildCount(elementOrTreePath, count); + } + } + + @Override public void setHasChildren(Object elementOrTreePath, boolean hasChildren) { - if (elementOrTreePath instanceof TreePath) { - TreePath path = (TreePath)elementOrTreePath; - if (path.startsWith(fRootPath, null)) { - SubTreeModelViewer.this.setHasChildren(createSubPath(path), hasChildren); - } - } else { - SubTreeModelViewer.this.setHasChildren(elementOrTreePath, hasChildren); - } - } - - @Override + if (elementOrTreePath instanceof TreePath) { + TreePath path = (TreePath)elementOrTreePath; + if (path.startsWith(fRootPath, null)) { + SubTreeModelViewer.this.setHasChildren(createSubPath(path), hasChildren); + } + } else { + SubTreeModelViewer.this.setHasChildren(elementOrTreePath, hasChildren); + } + } + + @Override public void autoExpand(TreePath elementPath) { - // not supported - } + // not supported + } - @Override + @Override public void setExpandedState(Object elementOrTreePath, boolean expanded) { - if (elementOrTreePath instanceof TreePath) { - TreePath path = (TreePath)elementOrTreePath; - if (path.startsWith(fRootPath, null)) { - SubTreeModelViewer.this.setExpandedState(createSubPath(path), expanded); - } - } else { - SubTreeModelViewer.this.setExpandedState(elementOrTreePath, expanded); - } - } - - @Override + if (elementOrTreePath instanceof TreePath) { + TreePath path = (TreePath)elementOrTreePath; + if (path.startsWith(fRootPath, null)) { + SubTreeModelViewer.this.setExpandedState(createSubPath(path), expanded); + } + } else { + SubTreeModelViewer.this.setExpandedState(elementOrTreePath, expanded); + } + } + + @Override public void expandToLevel(Object elementOrTreePath, int level) { - if (elementOrTreePath instanceof TreePath) { - TreePath path = (TreePath)elementOrTreePath; - if (path.startsWith(fRootPath, null)) { - SubTreeModelViewer.this.expandToLevel(createSubPath(path), level); - } - } else { - SubTreeModelViewer.this.expandToLevel(elementOrTreePath, level); - } - } - - @Override + if (elementOrTreePath instanceof TreePath) { + TreePath path = (TreePath)elementOrTreePath; + if (path.startsWith(fRootPath, null)) { + SubTreeModelViewer.this.expandToLevel(createSubPath(path), level); + } + } else { + SubTreeModelViewer.this.expandToLevel(elementOrTreePath, level); + } + } + + @Override public void remove(Object elementOrTreePath) { - if (elementOrTreePath instanceof TreePath) { - TreePath path = (TreePath)elementOrTreePath; - if (path.startsWith(fRootPath, null)) { - SubTreeModelViewer.this.remove(createSubPath(path)); - } - } else { - SubTreeModelViewer.this.remove(elementOrTreePath); - } - } - - @Override + if (elementOrTreePath instanceof TreePath) { + TreePath path = (TreePath)elementOrTreePath; + if (path.startsWith(fRootPath, null)) { + SubTreeModelViewer.this.remove(createSubPath(path)); + } + } else { + SubTreeModelViewer.this.remove(elementOrTreePath); + } + } + + @Override public void remove(Object parentOrTreePath, final int index) { - if (parentOrTreePath instanceof TreePath) { - TreePath path = (TreePath)parentOrTreePath; - if (path.startsWith(fRootPath, null)) { - SubTreeModelViewer.this.remove(createSubPath(path), index); - } - } else { - SubTreeModelViewer.this.remove(parentOrTreePath, index); - } - } - - @Override + if (parentOrTreePath instanceof TreePath) { + TreePath path = (TreePath)parentOrTreePath; + if (path.startsWith(fRootPath, null)) { + SubTreeModelViewer.this.remove(createSubPath(path), index); + } + } else { + SubTreeModelViewer.this.remove(parentOrTreePath, index); + } + } + + @Override public void insert(Object parentOrTreePath, Object element, int position) { - if (parentOrTreePath instanceof TreePath) { - TreePath path = (TreePath)parentOrTreePath; - if (path.startsWith(fRootPath, null)) { - SubTreeModelViewer.this.insert(createSubPath(path), element, position); - } - } else { - SubTreeModelViewer.this.insert(parentOrTreePath, element, position); - } - } - - @Override + if (parentOrTreePath instanceof TreePath) { + TreePath path = (TreePath)parentOrTreePath; + if (path.startsWith(fRootPath, null)) { + SubTreeModelViewer.this.insert(createSubPath(path), element, position); + } + } else { + SubTreeModelViewer.this.insert(parentOrTreePath, element, position); + } + } + + @Override public boolean getExpandedState(Object elementOrTreePath) { - if (elementOrTreePath instanceof TreePath) { - TreePath path = (TreePath)elementOrTreePath; - if (path.startsWith(fRootPath, null)) { - return SubTreeModelViewer.this.getExpandedState(createSubPath(path)); - } - } else { - return SubTreeModelViewer.this.getExpandedState(elementOrTreePath); - } - return false; - } - - @Override + if (elementOrTreePath instanceof TreePath) { + TreePath path = (TreePath)elementOrTreePath; + if (path.startsWith(fRootPath, null)) { + return SubTreeModelViewer.this.getExpandedState(createSubPath(path)); + } + } else { + return SubTreeModelViewer.this.getExpandedState(elementOrTreePath); + } + return false; + } + + @Override public int getChildCount(TreePath path) { - if (path.startsWith(fRootPath, null)) { - return SubTreeModelViewer.this.getChildCount(createSubPath(path)); - } - return -1; - } + if (path.startsWith(fRootPath, null)) { + return SubTreeModelViewer.this.getChildCount(createSubPath(path)); + } + return -1; + } - @Override + @Override public boolean getHasChildren(Object elementOrTreePath) { - if (elementOrTreePath instanceof TreePath) { - TreePath path = (TreePath)elementOrTreePath; - if (path.startsWith(fRootPath, null)) { - return SubTreeModelViewer.this.getHasChildren(createSubPath(path)); - } - } else { - return SubTreeModelViewer.this.getHasChildren(elementOrTreePath); - } - return false; - } - - @Override + if (elementOrTreePath instanceof TreePath) { + TreePath path = (TreePath)elementOrTreePath; + if (path.startsWith(fRootPath, null)) { + return SubTreeModelViewer.this.getHasChildren(createSubPath(path)); + } + } else { + return SubTreeModelViewer.this.getHasChildren(elementOrTreePath); + } + return false; + } + + @Override public Object getChildElement(TreePath path, int index) { - if (path.startsWith(fRootPath, null)) { - return SubTreeModelViewer.this.getChildElement(createSubPath(path), index); - } - return null; - } + if (path.startsWith(fRootPath, null)) { + return SubTreeModelViewer.this.getChildElement(createSubPath(path), index); + } + return null; + } - @Override + @Override public TreePath getTopElementPath() { - return createFullPath(SubTreeModelViewer.this.getTopElementPath()); - } + return createFullPath(SubTreeModelViewer.this.getTopElementPath()); + } - @Override + @Override public int findElementIndex(TreePath parentPath, Object element) { - if (parentPath.startsWith(fRootPath, null)) { - return SubTreeModelViewer.this.findElementIndex(createSubPath(parentPath), element); - } - return -1; - } + if (parentPath.startsWith(fRootPath, null)) { + return SubTreeModelViewer.this.findElementIndex(createSubPath(parentPath), element); + } + return -1; + } - @Override + @Override public boolean getElementChildrenRealized(TreePath parentPath) { - if (parentPath.startsWith(fRootPath, null)) { - return SubTreeModelViewer.this.getElementChildrenRealized(createSubPath(parentPath)); - } - return true; - } + if (parentPath.startsWith(fRootPath, null)) { + return SubTreeModelViewer.this.getElementChildrenRealized(createSubPath(parentPath)); + } + return true; + } - @Override + @Override public void setElementData(TreePath path, int numColumns, String[] labels, ImageDescriptor[] images, FontData[] fontDatas, RGB[] foregrounds, RGB[] backgrounds) { - if (path.startsWith(fRootPath, null)) { - SubTreeModelViewer.this.setElementData(createSubPath(path), numColumns, labels, images, fontDatas, foregrounds, backgrounds); - } - } + if (path.startsWith(fRootPath, null)) { + SubTreeModelViewer.this.setElementData(createSubPath(path), numColumns, labels, images, fontDatas, foregrounds, backgrounds); + } + } - @Override + @Override public Control getControl() { - return SubTreeModelViewer.this.getControl(); - } + return SubTreeModelViewer.this.getControl(); + } - @Override + @Override public Object getInput() { - return SubTreeModelViewer.this.getInput(); - } + return SubTreeModelViewer.this.getInput(); + } - @Override + @Override public ISelection getSelection() { - return SubTreeModelViewer.this.getSelection(); - } + return SubTreeModelViewer.this.getSelection(); + } - @Override + @Override public void refresh() { - SubTreeModelViewer.this.refresh(); - } + SubTreeModelViewer.this.refresh(); + } - @Override + @Override public void setInput(Object input) { - SubTreeModelViewer.this.setInput(input); - } + SubTreeModelViewer.this.setInput(input); + } - @Override + @Override public void setSelection(ISelection selection, boolean reveal) { - SubTreeModelViewer.this.setSelection(selection, reveal); - } + SubTreeModelViewer.this.setSelection(selection, reveal); + } - @Override + @Override public String[] getVisibleColumns() { - return SubTreeModelViewer.this.getVisibleColumns(); - } + return SubTreeModelViewer.this.getVisibleColumns(); + } - @Override + @Override public void addLabelUpdateListener(ILabelUpdateListener listener) { - SubTreeModelViewer.this.addLabelUpdateListener(listener); - } + SubTreeModelViewer.this.addLabelUpdateListener(listener); + } - @Override + @Override public void addModelChangedListener(IModelChangedListener listener) { - SubTreeModelViewer.this.addModelChangedListener(listener); - } + SubTreeModelViewer.this.addModelChangedListener(listener); + } - @Override + @Override public void addStateUpdateListener(IStateUpdateListener listener) { - SubTreeModelViewer.this.addStateUpdateListener(listener); - } + SubTreeModelViewer.this.addStateUpdateListener(listener); + } - @Override + @Override public void addViewerUpdateListener(IViewerUpdateListener listener) { - SubTreeModelViewer.this.addViewerUpdateListener(listener); - } + SubTreeModelViewer.this.addViewerUpdateListener(listener); + } - @Override + @Override public int getAutoExpandLevel() { - return SubTreeModelViewer.this.getAutoExpandLevel(); - } + return SubTreeModelViewer.this.getAutoExpandLevel(); + } - @Override + @Override public Display getDisplay() { - return SubTreeModelViewer.this.getDisplay(); - } + return SubTreeModelViewer.this.getDisplay(); + } - @Override + @Override public ViewerLabel getElementLabel(TreePath path, String columnId) { - return SubTreeModelViewer.this.getElementLabel(path, columnId); - } + return SubTreeModelViewer.this.getElementLabel(path, columnId); + } - @Override + @Override public IPresentationContext getPresentationContext() { - return SubTreeModelViewer.this.getPresentationContext(); - } + return SubTreeModelViewer.this.getPresentationContext(); + } - @Override + @Override public void removeLabelUpdateListener(ILabelUpdateListener listener) { - SubTreeModelViewer.this.removeLabelUpdateListener(listener); - } + SubTreeModelViewer.this.removeLabelUpdateListener(listener); + } - @Override + @Override public void removeModelChangedListener(IModelChangedListener listener) { - SubTreeModelViewer.this.removeModelChangedListener(listener); - } + SubTreeModelViewer.this.removeModelChangedListener(listener); + } - @Override + @Override public void removeStateUpdateListener(IStateUpdateListener listener) { - SubTreeModelViewer.this.removeStateUpdateListener(listener); - } + SubTreeModelViewer.this.removeStateUpdateListener(listener); + } - @Override + @Override public void removeViewerUpdateListener(IViewerUpdateListener listener) { - SubTreeModelViewer.this.removeViewerUpdateListener(listener); - } + SubTreeModelViewer.this.removeViewerUpdateListener(listener); + } - @Override + @Override public boolean saveElementState(TreePath path, ModelDelta delta, int deltaFlags) { - return SubTreeModelViewer.this.saveElementState(path, delta, deltaFlags); - } + return SubTreeModelViewer.this.saveElementState(path, delta, deltaFlags); + } - @Override + @Override public void setAutoExpandLevel(int level) { - SubTreeModelViewer.this.setAutoExpandLevel(level); - } + SubTreeModelViewer.this.setAutoExpandLevel(level); + } - @Override + @Override public void setSelection(ISelection selection, boolean reveal, boolean force) { - SubTreeModelViewer.this.setSelection(selection, reveal, force); - } + SubTreeModelViewer.this.setSelection(selection, reveal, force); + } - @Override + @Override public boolean trySelection(ISelection selection, boolean reveal, boolean force) { - return SubTreeModelViewer.this.trySelection(selection, reveal, force); - } + return SubTreeModelViewer.this.trySelection(selection, reveal, force); + } - @Override + @Override public void updateViewer(IModelDelta delta) { - SubTreeModelViewer.this.updateViewer(delta); - } + SubTreeModelViewer.this.updateViewer(delta); + } - @Override + @Override public ViewerFilter[] getFilters() { - return SubTreeModelViewer.this.getFilters(); - } + return SubTreeModelViewer.this.getFilters(); + } - @Override + @Override public void addFilter(ViewerFilter filter) { - SubTreeModelViewer.this.addFilter(filter); - } + SubTreeModelViewer.this.addFilter(filter); + } - @Override + @Override public void setFilters(ViewerFilter... filters) { - SubTreeModelViewer.this.setFilters(filters); - } + SubTreeModelViewer.this.setFilters(filters); + } - @Override + @Override public boolean overrideSelection(ISelection current, ISelection candidate) { - return SubTreeModelViewer.this.overrideSelection(current, candidate); - } + return SubTreeModelViewer.this.overrideSelection(current, candidate); + } - @Override + @Override public void refresh(Object element) { - SubTreeModelViewer.this.refresh(element); - } + SubTreeModelViewer.this.refresh(element); + } - @Override + @Override public void update(Object element) { - SubTreeModelViewer.this.update(element); - } + SubTreeModelViewer.this.update(element); + } - @Override + @Override public void clearSelectionQuiet() { - SubTreeModelViewer.this.clearSelectionQuiet(); - } + SubTreeModelViewer.this.clearSelectionQuiet(); + } - @Override + @Override public TreePath[] getElementPaths(Object element) { - TreePath[] subViewerPaths = SubTreeModelViewer.this.getElementPaths(element); - TreePath[] retVal = new TreePath[subViewerPaths.length]; - for (int i = 0; i < subViewerPaths.length; i++) { - retVal[i] = createFullPath(subViewerPaths[i]); - } - return retVal; - } - - @Override + TreePath[] subViewerPaths = SubTreeModelViewer.this.getElementPaths(element); + TreePath[] retVal = new TreePath[subViewerPaths.length]; + for (int i = 0; i < subViewerPaths.length; i++) { + retVal[i] = createFullPath(subViewerPaths[i]); + } + return retVal; + } + + @Override public boolean getElementChecked(TreePath path) { - return SubTreeModelViewer.this.getElementChecked(createSubPath(path)); - } + return SubTreeModelViewer.this.getElementChecked(createSubPath(path)); + } - @Override + @Override public boolean getElementGrayed(TreePath path) { - return SubTreeModelViewer.this.getElementGrayed(createSubPath(path)); - } + return SubTreeModelViewer.this.getElementGrayed(createSubPath(path)); + } - @Override + @Override public void setElementChecked(TreePath path, boolean checked, boolean grayed) { - SubTreeModelViewer.this.setElementChecked(createSubPath(path), checked, grayed); - } - } + SubTreeModelViewer.this.setElementChecked(createSubPath(path), checked, grayed); + } + } - /** - * Delegating content provider. It translates all the calls to the - * underlying content provider to use full model tree paths. - */ - private class SubTreeModelContentProvider implements ITreeModelContentProvider { + /** + * Delegating content provider. It translates all the calls to the + * underlying content provider to use full model tree paths. + */ + private class SubTreeModelContentProvider implements ITreeModelContentProvider { - private TreeModelContentProvider fBaseProvider; + private TreeModelContentProvider fBaseProvider; - public SubTreeModelContentProvider() { - fBaseProvider = new TreeModelContentProvider(); - } + public SubTreeModelContentProvider() { + fBaseProvider = new TreeModelContentProvider(); + } - @Override + @Override public void updateHasChildren(TreePath path) { - fBaseProvider.updateHasChildren(createFullPath(path)); - } + fBaseProvider.updateHasChildren(createFullPath(path)); + } - @Override + @Override public void updateChildCount(TreePath path, int currentChildCount) { - fBaseProvider.updateChildCount(createFullPath(path), currentChildCount); - } + fBaseProvider.updateChildCount(createFullPath(path), currentChildCount); + } - @Override + @Override public void updateElement(TreePath parentPath, int viewIndex) { - fBaseProvider.updateElement(createFullPath(parentPath), viewIndex); - } + fBaseProvider.updateElement(createFullPath(parentPath), viewIndex); + } - @Override + @Override public int viewToModelCount(TreePath parentPath, int count) { - return fBaseProvider.viewToModelCount(createFullPath(parentPath), count); - } + return fBaseProvider.viewToModelCount(createFullPath(parentPath), count); + } - @Override + @Override public int viewToModelIndex(TreePath parentPath, int index) { - return fBaseProvider.viewToModelIndex(createFullPath(parentPath), index); - } + return fBaseProvider.viewToModelIndex(createFullPath(parentPath), index); + } - @Override + @Override public void addModelChangedListener(IModelChangedListener listener) { - fBaseProvider.addModelChangedListener(listener); - } + fBaseProvider.addModelChangedListener(listener); + } - @Override + @Override public void preserveState(TreePath subPath) { - fBaseProvider.preserveState(createFullPath(subPath)); - } + fBaseProvider.preserveState(createFullPath(subPath)); + } - @Override + @Override public void addStateUpdateListener(IStateUpdateListener listener) { - fBaseProvider.addStateUpdateListener(listener); - } + fBaseProvider.addStateUpdateListener(listener); + } - @Override + @Override public void addViewerUpdateListener(IViewerUpdateListener listener) { - fBaseProvider.addViewerUpdateListener(listener); - } + fBaseProvider.addViewerUpdateListener(listener); + } - @Override + @Override public int getModelDeltaMask() { - return fBaseProvider.getModelDeltaMask(); - } + return fBaseProvider.getModelDeltaMask(); + } - @Override + @Override public int modelToViewChildCount(TreePath parentPath, int count) { - return fBaseProvider.modelToViewChildCount(createFullPath(parentPath), count); - } + return fBaseProvider.modelToViewChildCount(createFullPath(parentPath), count); + } - @Override + @Override public int modelToViewIndex(TreePath parentPath, int index) { - return fBaseProvider.modelToViewIndex(createFullPath(parentPath), index); - } + return fBaseProvider.modelToViewIndex(createFullPath(parentPath), index); + } - @Override + @Override public void removeModelChangedListener(IModelChangedListener listener) { - fBaseProvider.removeModelChangedListener(listener); - } + fBaseProvider.removeModelChangedListener(listener); + } - @Override + @Override public void removeStateUpdateListener(IStateUpdateListener listener) { - fBaseProvider.removeStateUpdateListener(listener); - } + fBaseProvider.removeStateUpdateListener(listener); + } - @Override + @Override public void removeViewerUpdateListener(IViewerUpdateListener listener) { - fBaseProvider.removeViewerUpdateListener(listener); - } + fBaseProvider.removeViewerUpdateListener(listener); + } - @Override + @Override public void setModelDeltaMask(int mask) { - fBaseProvider.setModelDeltaMask(mask); - } + fBaseProvider.setModelDeltaMask(mask); + } - @Override + @Override public boolean areTreeModelViewerFiltersApplicable(Object parentElement) { - return fBaseProvider.areTreeModelViewerFiltersApplicable(parentElement); - } + return fBaseProvider.areTreeModelViewerFiltersApplicable(parentElement); + } - @Override + @Override public boolean shouldFilter(Object parentElementOrTreePath, Object element) { - if (parentElementOrTreePath instanceof TreePath) { - TreePath path = (TreePath)parentElementOrTreePath; - return fBaseProvider.shouldFilter(createFullPath(path), element); - } else { - return fBaseProvider.shouldFilter(parentElementOrTreePath, element); - } + if (parentElementOrTreePath instanceof TreePath) { + TreePath path = (TreePath)parentElementOrTreePath; + return fBaseProvider.shouldFilter(createFullPath(path), element); + } else { + return fBaseProvider.shouldFilter(parentElementOrTreePath, element); + } - } + } - @Override + @Override public void unmapPath(TreePath path) { - fBaseProvider.unmapPath(createFullPath(path)); - } + fBaseProvider.unmapPath(createFullPath(path)); + } - @Override + @Override public void updateModel(IModelDelta delta, int mask) { - fBaseProvider.updateModel(delta, mask); - } + fBaseProvider.updateModel(delta, mask); + } - @Override + @Override public TreePath[] getParents(Object element) { - // Not used - return null; - } + // Not used + return null; + } - @Override + @Override public void cancelRestore(TreePath path, int flags) { - fBaseProvider.cancelRestore(createFullPath(path), flags); - } + fBaseProvider.cancelRestore(createFullPath(path), flags); + } - @Override + @Override public void dispose() { - fBaseProvider.dispose(); - } + fBaseProvider.dispose(); + } - @Override + @Override public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { - fBaseProvider.inputChanged(fDelegatingViewer, oldInput, newInput); - } + fBaseProvider.inputChanged(fDelegatingViewer, oldInput, newInput); + } @Override public void postInputChanged(IInternalTreeModelViewer viewer, @@ -591,125 +591,125 @@ public class SubTreeModelViewer extends TreeModelViewer { fBaseProvider.postInputChanged(viewer, oldInput, newInput); } - @Override + @Override public boolean setChecked(TreePath path, boolean checked) { - return fBaseProvider.setChecked(createFullPath(path), checked); - } + return fBaseProvider.setChecked(createFullPath(path), checked); + } - } + } - /** - * Delegating label provider. It translates all the calls to the - * underlying label provider to use full model tree paths. - */ - private class SubTreeModelLabelProvider extends ColumnLabelProvider - implements ITreeModelLabelProvider - { + /** + * Delegating label provider. It translates all the calls to the + * underlying label provider to use full model tree paths. + */ + private class SubTreeModelLabelProvider extends ColumnLabelProvider + implements ITreeModelLabelProvider + { - private TreeModelLabelProvider fBaseProvider; + private TreeModelLabelProvider fBaseProvider; - public SubTreeModelLabelProvider(IInternalTreeModelViewer viewer) { - fBaseProvider = new TreeModelLabelProvider(viewer); - } + public SubTreeModelLabelProvider(IInternalTreeModelViewer viewer) { + fBaseProvider = new TreeModelLabelProvider(viewer); + } - @Override + @Override public boolean update(TreePath elementPath) { - return fBaseProvider.update( createFullPath(elementPath) ); - } + return fBaseProvider.update( createFullPath(elementPath) ); + } - @Override + @Override public void addLabelUpdateListener(ILabelUpdateListener listener) { - fBaseProvider.addLabelUpdateListener(listener); - } + fBaseProvider.addLabelUpdateListener(listener); + } - @Override + @Override public Color getColor(RGB rgb) { - return fBaseProvider.getColor(rgb); - } + return fBaseProvider.getColor(rgb); + } - @Override + @Override public Font getFont(FontData fontData) { - return fBaseProvider.getFont(fontData); - } + return fBaseProvider.getFont(fontData); + } - @Override + @Override public Image getImage(ImageDescriptor descriptor) { - return fBaseProvider.getImage(descriptor); - } + return fBaseProvider.getImage(descriptor); + } - @Override + @Override public void removeLabelUpdateListener(ILabelUpdateListener listener) { - fBaseProvider.removeLabelUpdateListener(listener); - } + fBaseProvider.removeLabelUpdateListener(listener); + } - @Override + @Override public void addListener(ILabelProviderListener listener) { - fBaseProvider.addListener(listener); - } + fBaseProvider.addListener(listener); + } - @Override + @Override public void dispose() { - fBaseProvider.dispose(); - super.dispose(); - } + fBaseProvider.dispose(); + super.dispose(); + } - @Override + @Override public boolean isLabelProperty(Object element, String property) { - return fBaseProvider.isLabelProperty(element, property); - } + return fBaseProvider.isLabelProperty(element, property); + } - @Override + @Override public void removeListener(ILabelProviderListener listener) { - fBaseProvider.removeListener(listener); - } - } - - private TreePath createFullPath(TreePath subPath) { - if (fRootPath == null) { - return TreePath.EMPTY; - } - - Object[] segments = new Object[fRootPath.getSegmentCount() + subPath.getSegmentCount()]; - for (int i = 0; i < fRootPath.getSegmentCount(); i++) { - segments[i] = fRootPath.getSegment(i); - } - for (int i = 0; i < subPath.getSegmentCount(); i++) { - segments[i + fRootPath.getSegmentCount()] = subPath.getSegment(i); - } - return new TreePath(segments); - } - - private TreePath createSubPath(TreePath fullPath) { - if (fRootPath == null) { - return TreePath.EMPTY; - } - - if (fullPath.getSegmentCount() <= fRootPath.getSegmentCount()) { - return TreePath.EMPTY; - } - Object[] segments = new Object[fullPath.getSegmentCount() - fRootPath.getSegmentCount()]; - for (int i = 0; i < segments.length; i++) { - segments[i] = fullPath.getSegment(i + fRootPath.getSegmentCount()); - } - return new TreePath(segments); - } - - private DelegatingTreeModelViewer getDelegatingViewer() { - if (fDelegatingViewer == null) { - fDelegatingViewer = new DelegatingTreeModelViewer(); - } - return fDelegatingViewer; - } - - @Override + fBaseProvider.removeListener(listener); + } + } + + private TreePath createFullPath(TreePath subPath) { + if (fRootPath == null) { + return TreePath.EMPTY; + } + + Object[] segments = new Object[fRootPath.getSegmentCount() + subPath.getSegmentCount()]; + for (int i = 0; i < fRootPath.getSegmentCount(); i++) { + segments[i] = fRootPath.getSegment(i); + } + for (int i = 0; i < subPath.getSegmentCount(); i++) { + segments[i + fRootPath.getSegmentCount()] = subPath.getSegment(i); + } + return new TreePath(segments); + } + + private TreePath createSubPath(TreePath fullPath) { + if (fRootPath == null) { + return TreePath.EMPTY; + } + + if (fullPath.getSegmentCount() <= fRootPath.getSegmentCount()) { + return TreePath.EMPTY; + } + Object[] segments = new Object[fullPath.getSegmentCount() - fRootPath.getSegmentCount()]; + for (int i = 0; i < segments.length; i++) { + segments[i] = fullPath.getSegment(i + fRootPath.getSegmentCount()); + } + return new TreePath(segments); + } + + private DelegatingTreeModelViewer getDelegatingViewer() { + if (fDelegatingViewer == null) { + fDelegatingViewer = new DelegatingTreeModelViewer(); + } + return fDelegatingViewer; + } + + @Override protected ITreeModelContentProvider createContentProvider() { - return new SubTreeModelContentProvider(); - } + return new SubTreeModelContentProvider(); + } - @Override + @Override protected ITreeModelLabelProvider createLabelProvider() { - return new SubTreeModelLabelProvider(getDelegatingViewer()); - } + return new SubTreeModelLabelProvider(getDelegatingViewer()); + } } diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/TimeTriggeredProgressMonitorDialog.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/TimeTriggeredProgressMonitorDialog.java index 22bc2da8e..38b2c2903 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/TimeTriggeredProgressMonitorDialog.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/TimeTriggeredProgressMonitorDialog.java @@ -69,94 +69,94 @@ public class TimeTriggeredProgressMonitorDialog extends ProgressMonitorDialog { this.longOperationTime = longOperationTime; } - /** + /** * Create a monitor for the receiver that wrappers the superclasses monitor. * */ - public void createWrapperedMonitor() { - wrapperedMonitor = new IProgressMonitor() { + public void createWrapperedMonitor() { + wrapperedMonitor = new IProgressMonitor() { - IProgressMonitor superMonitor = TimeTriggeredProgressMonitorDialog.super - .getProgressMonitor(); + IProgressMonitor superMonitor = TimeTriggeredProgressMonitorDialog.super + .getProgressMonitor(); - @Override + @Override public void beginTask(String name, int totalWork) { - superMonitor.beginTask(name, totalWork); - checkTicking(); - } + superMonitor.beginTask(name, totalWork); + checkTicking(); + } - /** + /** * Check if we have ticked in the last 800ms. */ - private void checkTicking() { - if (triggerTime < 0) { + private void checkTicking() { + if (triggerTime < 0) { triggerTime = System.currentTimeMillis() + longOperationTime; } - if (!dialogOpened && System.currentTimeMillis() > triggerTime) { - open(); - dialogOpened = true; - } - } + if (!dialogOpened && System.currentTimeMillis() > triggerTime) { + open(); + dialogOpened = true; + } + } - @Override + @Override public void done() { - superMonitor.done(); - checkTicking(); - } + superMonitor.done(); + checkTicking(); + } - @Override + @Override public void internalWorked(double work) { - superMonitor.internalWorked(work); - checkTicking(); - } + superMonitor.internalWorked(work); + checkTicking(); + } - @Override + @Override public boolean isCanceled() { - return superMonitor.isCanceled(); - } + return superMonitor.isCanceled(); + } - @Override + @Override public void setCanceled(boolean value) { - superMonitor.setCanceled(value); + superMonitor.setCanceled(value); - } + } - @Override + @Override public void setTaskName(String name) { - superMonitor.setTaskName(name); - checkTicking(); + superMonitor.setTaskName(name); + checkTicking(); - } + } - @Override + @Override public void subTask(String name) { - superMonitor.subTask(name); - checkTicking(); - } + superMonitor.subTask(name); + checkTicking(); + } - @Override + @Override public void worked(int work) { - superMonitor.worked(work); - checkTicking(); + superMonitor.worked(work); + checkTicking(); - } - }; - } + } + }; + } - @Override + @Override public IProgressMonitor getProgressMonitor() { - if (wrapperedMonitor == null) { + if (wrapperedMonitor == null) { createWrapperedMonitor(); } - return wrapperedMonitor; - } + return wrapperedMonitor; + } - @Override + @Override public void run(final boolean fork, final boolean cancelable, - final IRunnableWithProgress runnable) throws InvocationTargetException, - InterruptedException { - final InvocationTargetException[] invokes = new InvocationTargetException[1]; - final InterruptedException[] interrupt = new InterruptedException[1]; + final IRunnableWithProgress runnable) throws InvocationTargetException, + InterruptedException { + final InvocationTargetException[] invokes = new InvocationTargetException[1]; + final InterruptedException[] interrupt = new InterruptedException[1]; Runnable dialogWaitRunnable = () -> { try { TimeTriggeredProgressMonitorDialog.super.run(fork, cancelable, runnable); @@ -166,17 +166,17 @@ public class TimeTriggeredProgressMonitorDialog extends ProgressMonitorDialog { interrupt[0] = e2; } }; - final Display display = PlatformUI.getWorkbench().getDisplay(); - if (display == null) { + final Display display = PlatformUI.getWorkbench().getDisplay(); + if (display == null) { return; } - //show a busy cursor until the dialog opens - BusyIndicator.showWhile(display, dialogWaitRunnable); - if (invokes[0] != null) { - throw invokes[0]; - } - if (interrupt[0] != null) { - throw interrupt[0]; - } - } + //show a busy cursor until the dialog opens + BusyIndicator.showWhile(display, dialogWaitRunnable); + if (invokes[0] != null) { + throw invokes[0]; + } + if (interrupt[0] != null) { + throw interrupt[0]; + } + } } 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 4608c48b0..80c487b76 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 @@ -67,327 +67,327 @@ import org.eclipse.ui.progress.WorkbenchJob; */ public class TreeModelContentProvider implements ITreeModelContentProvider, IContentProvider, IModelChangedListener { - /** - * Tree model viewer that this content provider is used with. - */ - private IInternalTreeModelViewer fViewer; - - /** - * Mask used to filter delta updates coming from the model. - */ - private int fModelDeltaMask = ~0; - - /** - * Map tree paths to model proxy responsible for element - * - * Used to install different model proxy instances for one element depending - * on the tree path. - */ + /** + * Tree model viewer that this content provider is used with. + */ + private IInternalTreeModelViewer fViewer; + + /** + * Mask used to filter delta updates coming from the model. + */ + private int fModelDeltaMask = ~0; + + /** + * Map tree paths to model proxy responsible for element + * + * Used to install different model proxy instances for one element depending + * on the tree path. + */ private Map<TreePath, IModelProxy> fTreeModelProxies = new HashMap<>(); // tree // model // proxy // by // element tree path - /** - * Map element to model proxy responsible for it. - * - * Used to install a single model proxy which is responsible for all - * instances of an element in the model tree. - */ + /** + * Map element to model proxy responsible for it. + * + * Used to install a single model proxy which is responsible for all + * instances of an element in the model tree. + */ private Map<Object, IModelProxy> fModelProxies = new HashMap<>(); // model // proxy // by // element - /** - * Map of nodes that have been filtered from the viewer. - */ - private FilterTransform fTransform = new FilterTransform(); + /** + * Map of nodes that have been filtered from the viewer. + */ + private FilterTransform fTransform = new FilterTransform(); - /** - * Model listeners - */ + /** + * Model listeners + */ private ListenerList<IModelChangedListener> fModelListeners = new ListenerList<>(); - /** - * Viewer update listeners - */ + /** + * Viewer update listeners + */ private ListenerList<IViewerUpdateListener> fUpdateListeners = new ListenerList<>(); - /** - * Flag indicating whether we are currently in a model sequence. - * @see IViewerUpdateListener - */ - private boolean fModelSequenceRunning = false; + /** + * Flag indicating whether we are currently in a model sequence. + * @see IViewerUpdateListener + */ + private boolean fModelSequenceRunning = false; - /** - * Map of updates in progress: element path -> list of requests - */ + /** + * Map of updates in progress: element path -> list of requests + */ private Map<TreePath, List<ViewerUpdateMonitor>> fRequestsInProgress = new HashMap<>(); - /** - * Map of dependent requests waiting for parent requests to complete: - * element path -> list of requests - */ + /** + * Map of dependent requests waiting for parent requests to complete: + * element path -> list of requests + */ private Map<TreePath, List<ViewerUpdateMonitor>> fWaitingRequests = new HashMap<>(); private List<ViewerUpdateMonitor> fCompletedUpdates = new ArrayList<>(); - private Runnable fCompletedUpdatesRunnable; + private Runnable fCompletedUpdatesRunnable; - private ViewerStateTracker fStateTracker = new ViewerStateTracker(this); + private ViewerStateTracker fStateTracker = new ViewerStateTracker(this); private TreePath fRevealPath; private int fRevealIndex; - /** - * Update type constants - */ - static final int UPDATE_SEQUENCE_BEGINS = 0; + /** + * Update type constants + */ + static final int UPDATE_SEQUENCE_BEGINS = 0; - static final int UPDATE_SEQUENCE_COMPLETE = 1; + static final int UPDATE_SEQUENCE_COMPLETE = 1; - static final int UPDATE_BEGINS = 2; + static final int UPDATE_BEGINS = 2; - static final int UPDATE_COMPLETE = 3; + static final int UPDATE_COMPLETE = 3; - /** - * Constant for an empty tree path. - */ - static final TreePath EMPTY_TREE_PATH = new TreePath(new Object[] {}); + /** + * Constant for an empty tree path. + */ + static final TreePath EMPTY_TREE_PATH = new TreePath(new Object[] {}); - @Override + @Override public void dispose() { - if (fViewer == null) { + if (fViewer == null) { return; } fDelayedDoModelChangeJob.shutdown(); - Assert.isTrue( getViewer().getDisplay().getThread() == Thread.currentThread() ); + Assert.isTrue( getViewer().getDisplay().getThread() == Thread.currentThread() ); - // cancel pending updates + // cancel pending updates for (List<ViewerUpdateMonitor> requests : fRequestsInProgress.values()) { for (ViewerUpdateMonitor vu : requests) { vu.cancel(); - } - } - fWaitingRequests.clear(); - - fStateTracker.dispose(); - fModelListeners.clear(); - fUpdateListeners.clear(); - disposeAllModelProxies(); - - synchronized(this) { - fViewer = null; - } - } - - /** - * @return Returns whether the content provider is disposed. - */ - boolean isDisposed() { - synchronized(this) { - return fViewer == null; - } - } - - @Override + } + } + fWaitingRequests.clear(); + + fStateTracker.dispose(); + fModelListeners.clear(); + fUpdateListeners.clear(); + disposeAllModelProxies(); + + synchronized(this) { + fViewer = null; + } + } + + /** + * @return Returns whether the content provider is disposed. + */ + boolean isDisposed() { + synchronized(this) { + return fViewer == null; + } + } + + @Override public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { - synchronized(this) { - fViewer = (IInternalTreeModelViewer) viewer; - } + synchronized(this) { + fViewer = (IInternalTreeModelViewer) viewer; + } - Assert.isTrue( fViewer.getDisplay().getThread() == Thread.currentThread() ); + Assert.isTrue( fViewer.getDisplay().getThread() == Thread.currentThread() ); - if (oldInput != null) { - fStateTracker.saveViewerState(oldInput); - } - } + if (oldInput != null) { + fStateTracker.saveViewerState(oldInput); + } + } - @Override + @Override public void postInputChanged(IInternalTreeModelViewer viewer, Object oldInput, Object newInput) { - Assert.isTrue( getViewer().getDisplay().getThread() == Thread.currentThread() ); - - cancelSubtreeUpdates(TreePath.EMPTY); - disposeAllModelProxies(); - cancelSubtreeUpdates(TreePath.EMPTY); - fTransform.clear(); - if (newInput != null) { - installModelProxy(newInput, TreePath.EMPTY); - fStateTracker.restoreViewerState(newInput); - } - } - - @Override + Assert.isTrue( getViewer().getDisplay().getThread() == Thread.currentThread() ); + + cancelSubtreeUpdates(TreePath.EMPTY); + disposeAllModelProxies(); + cancelSubtreeUpdates(TreePath.EMPTY); + fTransform.clear(); + if (newInput != null) { + installModelProxy(newInput, TreePath.EMPTY); + fStateTracker.restoreViewerState(newInput); + } + } + + @Override public void addViewerUpdateListener(IViewerUpdateListener listener) { - fUpdateListeners.add(listener); - } + fUpdateListeners.add(listener); + } - @Override + @Override public void removeViewerUpdateListener(IViewerUpdateListener listener) { - fUpdateListeners.remove(listener); - } + fUpdateListeners.remove(listener); + } - @Override + @Override public void addStateUpdateListener(IStateUpdateListener listener) { - fStateTracker.addStateUpdateListener(listener); - } + fStateTracker.addStateUpdateListener(listener); + } - @Override + @Override public void preserveState(TreePath path) { - fStateTracker.appendToPendingStateDelta(path); - } + fStateTracker.appendToPendingStateDelta(path); + } - @Override + @Override public void removeStateUpdateListener(IStateUpdateListener listener) { - fStateTracker.removeStateUpdateListener(listener); - } + fStateTracker.removeStateUpdateListener(listener); + } - @Override + @Override public void addModelChangedListener(IModelChangedListener listener) { - fModelListeners.add(listener); - } + fModelListeners.add(listener); + } - @Override + @Override public void removeModelChangedListener(IModelChangedListener listener) { - fModelListeners.remove(listener); - } + fModelListeners.remove(listener); + } - @Override + @Override public void cancelRestore(final TreePath path, final int flags) { - fStateTracker.cancelRestore(path, flags); - } + fStateTracker.cancelRestore(path, flags); + } - @Override + @Override public boolean setChecked(TreePath path, boolean checked) { - IModelProxy elementProxy = getElementProxy(path); - if (elementProxy instanceof ICheckboxModelProxy) { - return ((ICheckboxModelProxy) elementProxy).setChecked(getPresentationContext(), getViewer().getInput(), path, checked); - } - return false; - } - - /** - * Installs the model proxy for the given element into this content provider - * if not already installed. - * @param input the input to install the model proxy on - * @param path the {@link TreePath} to install the proxy for - */ - private void installModelProxy(Object input, TreePath path) { - - if (!fTreeModelProxies.containsKey(path) && !fModelProxies.containsKey(path.getLastSegment())) { - Object element = path.getSegmentCount() != 0 ? path.getLastSegment() : input; - IModelProxy proxy = null; - IModelProxyFactory2 modelProxyFactory2 = ViewerAdapterService.getModelProxyFactory2(element); - if (modelProxyFactory2 != null) { - proxy = modelProxyFactory2.createTreeModelProxy(input, path, getPresentationContext()); - if (proxy != null) { - fTreeModelProxies.put(path, proxy); - } - } - if (proxy == null) { - IModelProxyFactory modelProxyFactory = ViewerAdapterService.getModelProxyFactory(element); - if (modelProxyFactory != null) { - proxy = modelProxyFactory.createModelProxy(element, getPresentationContext()); - if (proxy != null) { - fModelProxies.put(element, proxy); - } - } - } - - if (proxy instanceof IModelProxy2) { - proxy.addModelChangedListener(this); - ((IModelProxy2)proxy).initialize(getViewer()); - } else if (proxy != null) { - final IModelProxy finalProxy = proxy; - Job job = new Job("Model Proxy installed notification job") {//$NON-NLS-1$ - @Override + IModelProxy elementProxy = getElementProxy(path); + if (elementProxy instanceof ICheckboxModelProxy) { + return ((ICheckboxModelProxy) elementProxy).setChecked(getPresentationContext(), getViewer().getInput(), path, checked); + } + return false; + } + + /** + * Installs the model proxy for the given element into this content provider + * if not already installed. + * @param input the input to install the model proxy on + * @param path the {@link TreePath} to install the proxy for + */ + private void installModelProxy(Object input, TreePath path) { + + if (!fTreeModelProxies.containsKey(path) && !fModelProxies.containsKey(path.getLastSegment())) { + Object element = path.getSegmentCount() != 0 ? path.getLastSegment() : input; + IModelProxy proxy = null; + IModelProxyFactory2 modelProxyFactory2 = ViewerAdapterService.getModelProxyFactory2(element); + if (modelProxyFactory2 != null) { + proxy = modelProxyFactory2.createTreeModelProxy(input, path, getPresentationContext()); + if (proxy != null) { + fTreeModelProxies.put(path, proxy); + } + } + if (proxy == null) { + IModelProxyFactory modelProxyFactory = ViewerAdapterService.getModelProxyFactory(element); + if (modelProxyFactory != null) { + proxy = modelProxyFactory.createModelProxy(element, getPresentationContext()); + if (proxy != null) { + fModelProxies.put(element, proxy); + } + } + } + + if (proxy instanceof IModelProxy2) { + proxy.addModelChangedListener(this); + ((IModelProxy2)proxy).initialize(getViewer()); + } else if (proxy != null) { + final IModelProxy finalProxy = proxy; + Job job = new Job("Model Proxy installed notification job") {//$NON-NLS-1$ + @Override protected IStatus run(IProgressMonitor monitor) { - if (!monitor.isCanceled()) { - IPresentationContext context = null; - Viewer viewer = null; - synchronized (TreeModelContentProvider.this) { - if (!isDisposed()) { - context = getPresentationContext(); - viewer = (Viewer) getViewer(); - } - } - if (viewer != null && context != null && !finalProxy.isDisposed()) { - finalProxy.init(context); - finalProxy.addModelChangedListener(TreeModelContentProvider.this); - finalProxy.installed(viewer); - } - } - return Status.OK_STATUS; - } - - @Override + if (!monitor.isCanceled()) { + IPresentationContext context = null; + Viewer viewer = null; + synchronized (TreeModelContentProvider.this) { + if (!isDisposed()) { + context = getPresentationContext(); + viewer = (Viewer) getViewer(); + } + } + if (viewer != null && context != null && !finalProxy.isDisposed()) { + finalProxy.init(context); + finalProxy.addModelChangedListener(TreeModelContentProvider.this); + finalProxy.installed(viewer); + } + } + return Status.OK_STATUS; + } + + @Override public boolean shouldRun() { - return !isDisposed(); - } - }; - job.setSystem(true); - job.schedule(); - } - } - } - - /** - * Finds the model proxy that an element with a given path is associated with. - * @param path Path of the element. - * @return Element's model proxy. - */ - private IModelProxy getElementProxy(TreePath path) { - while (path != null) { - IModelProxy proxy = fTreeModelProxies.get(path); - if (proxy != null) { - return proxy; - } - - Object element = path.getSegmentCount() == 0 ? getViewer().getInput() : path.getLastSegment(); - proxy = fModelProxies.get(element); - if (proxy != null) { - return proxy; - } - - path = path.getParentPath(); - } - return null; - } - - /** - * Removes all model proxies - */ - private void disposeAllModelProxies() { - Assert.isTrue( getViewer().getDisplay().getThread() == Thread.currentThread() ); + return !isDisposed(); + } + }; + job.setSystem(true); + job.schedule(); + } + } + } + + /** + * Finds the model proxy that an element with a given path is associated with. + * @param path Path of the element. + * @return Element's model proxy. + */ + private IModelProxy getElementProxy(TreePath path) { + while (path != null) { + IModelProxy proxy = fTreeModelProxies.get(path); + if (proxy != null) { + return proxy; + } + + Object element = path.getSegmentCount() == 0 ? getViewer().getInput() : path.getLastSegment(); + proxy = fModelProxies.get(element); + if (proxy != null) { + return proxy; + } + + path = path.getParentPath(); + } + return null; + } + + /** + * Removes all model proxies + */ + private void disposeAllModelProxies() { + Assert.isTrue( getViewer().getDisplay().getThread() == Thread.currentThread() ); for (IModelProxy proxy : fModelProxies.values()) { - proxy.dispose(); - } - fModelProxies.clear(); + proxy.dispose(); + } + fModelProxies.clear(); for (IModelProxy proxy : fTreeModelProxies.values()) { - proxy.dispose(); - } - fTreeModelProxies.clear(); - } - - /** - * Removes the model proxy installed for the given element, if any. - * @param path the {@link TreePath} to dispose the model proxy for - */ - private void disposeModelProxy(TreePath path) { - IModelProxy proxy = fTreeModelProxies.remove(path); - if (proxy != null) { - proxy.dispose(); - } - proxy = fModelProxies.remove(path.getLastSegment()); - if (proxy != null) { - proxy.dispose(); - } - } + proxy.dispose(); + } + fTreeModelProxies.clear(); + } + + /** + * Removes the model proxy installed for the given element, if any. + * @param path the {@link TreePath} to dispose the model proxy for + */ + private void disposeModelProxy(TreePath path) { + IModelProxy proxy = fTreeModelProxies.remove(path); + if (proxy != null) { + proxy.dispose(); + } + proxy = fModelProxies.remove(path.getLastSegment()); + if (proxy != null) { + proxy.dispose(); + } + } private static class DelayedDoModelChange { public final IModelDelta delta; @@ -488,280 +488,280 @@ public class TreeModelContentProvider implements ITreeModelContentProvider, ICon private final DelayedDoModelChangedJob fDelayedDoModelChangeJob = new DelayedDoModelChangedJob(); - @Override + @Override public void modelChanged(final IModelDelta delta, final IModelProxy proxy) { - Display display = null; - - // Check if the viewer is still available, i.e. if the content provider - // is not disposed. - synchronized(this) { - if (fViewer != null && !proxy.isDisposed()) { - display = fViewer.getDisplay(); - } - } - if (display != null) { - // If we're in display thread, process the delta immediately to - // avoid "skid" in processing events. - if (Thread.currentThread().equals(display.getThread())) { - doModelChanged(delta, proxy); - } - else { + Display display = null; + + // Check if the viewer is still available, i.e. if the content provider + // is not disposed. + synchronized(this) { + if (fViewer != null && !proxy.isDisposed()) { + display = fViewer.getDisplay(); + } + } + if (display != null) { + // If we're in display thread, process the delta immediately to + // avoid "skid" in processing events. + if (Thread.currentThread().equals(display.getThread())) { + doModelChanged(delta, proxy); + } + else { try { Job.getJobManager().join(ElementContentProvider.class, null); } catch (OperationCanceledException | InterruptedException e) { DebugUIPlugin.log(new Status(IStatus.WARNING, DebugUIPlugin.getUniqueIdentifier(), "Interrupted while waiting on ElementContentProvider jobs", e)); //$NON-NLS-1$ } fDelayedDoModelChangeJob.runDelayed(delta, proxy); - } - } - } - - /** - * Executes the model proxy in UI thread. - * @param delta Delta to process - * @param proxy Proxy that fired the delta. - */ - private void doModelChanged(IModelDelta delta, IModelProxy proxy) { - if (!proxy.isDisposed()) { - if (DebugUIPlugin.DEBUG_DELTAS && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(getPresentationContext())) { - DebugUIPlugin.trace("RECEIVED DELTA: " + delta.toString()); //$NON-NLS-1$ - } - - updateModel(delta, getModelDeltaMask()); - - // Initiate model update sequence before notifying of the model changed. - trigger(null); - - // Call model listeners after updating the viewer model. + } + } + } + + /** + * Executes the model proxy in UI thread. + * @param delta Delta to process + * @param proxy Proxy that fired the delta. + */ + private void doModelChanged(IModelDelta delta, IModelProxy proxy) { + if (!proxy.isDisposed()) { + if (DebugUIPlugin.DEBUG_DELTAS && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(getPresentationContext())) { + DebugUIPlugin.trace("RECEIVED DELTA: " + delta.toString()); //$NON-NLS-1$ + } + + updateModel(delta, getModelDeltaMask()); + + // Initiate model update sequence before notifying of the model changed. + trigger(null); + + // Call model listeners after updating the viewer model. for (IModelChangedListener iModelChangedListener : fModelListeners) { iModelChangedListener.modelChanged(delta, proxy); } - } - } + } + } - @Override + @Override public void setModelDeltaMask(int mask) { - fModelDeltaMask = mask; - } + fModelDeltaMask = mask; + } - @Override + @Override public int getModelDeltaMask() { - return fModelDeltaMask; - } + return fModelDeltaMask; + } - @Override + @Override public void updateModel(IModelDelta delta, int mask) { - // Processing deltas with null input leads to NPEs - // (Bug 380288 - NPE switching to the Breakpoints View) - if (getViewer() == null || getViewer().getInput() == null) { + // Processing deltas with null input leads to NPEs + // (Bug 380288 - NPE switching to the Breakpoints View) + if (getViewer() == null || getViewer().getInput() == null) { return; } fRevealPath = null; - IModelDelta[] deltaArray = new IModelDelta[] { delta }; - updateNodes(deltaArray, mask & (IModelDelta.REMOVED | IModelDelta.UNINSTALL)); - updateNodes(deltaArray, mask & ITreeModelContentProvider.UPDATE_MODEL_DELTA_FLAGS - & ~(IModelDelta.REMOVED | IModelDelta.UNINSTALL)); - updateNodes(deltaArray, mask & ITreeModelContentProvider.CONTROL_MODEL_DELTA_FLAGS); - - fStateTracker.checkIfRestoreComplete(); - } - - /** - * Returns a tree path for the node including the root element. - * - * @param node - * model delta - * @return corresponding tree path - */ - TreePath getFullTreePath(IModelDelta node) { + IModelDelta[] deltaArray = new IModelDelta[] { delta }; + updateNodes(deltaArray, mask & (IModelDelta.REMOVED | IModelDelta.UNINSTALL)); + updateNodes(deltaArray, mask & ITreeModelContentProvider.UPDATE_MODEL_DELTA_FLAGS + & ~(IModelDelta.REMOVED | IModelDelta.UNINSTALL)); + updateNodes(deltaArray, mask & ITreeModelContentProvider.CONTROL_MODEL_DELTA_FLAGS); + + fStateTracker.checkIfRestoreComplete(); + } + + /** + * Returns a tree path for the node including the root element. + * + * @param node + * model delta + * @return corresponding tree path + */ + TreePath getFullTreePath(IModelDelta node) { ArrayList<Object> list = new ArrayList<>(); - while (node.getParentDelta() != null) { - list.add(0, node.getElement()); - node = node.getParentDelta(); - } - return new TreePath(list.toArray()); - } - - /** - * Returns a tree path for the node, *not* including the root element. - * - * @param node - * model delta - * @return corresponding tree path - */ - TreePath getViewerTreePath(IModelDelta node) { + while (node.getParentDelta() != null) { + list.add(0, node.getElement()); + node = node.getParentDelta(); + } + return new TreePath(list.toArray()); + } + + /** + * Returns a tree path for the node, *not* including the root element. + * + * @param node + * model delta + * @return corresponding tree path + */ + TreePath getViewerTreePath(IModelDelta node) { ArrayList<Object> list = new ArrayList<>(); - IModelDelta parentDelta = node.getParentDelta(); - while (parentDelta != null) { - list.add(0, node.getElement()); - node = parentDelta; - parentDelta = node.getParentDelta(); - } - return new TreePath(list.toArray()); - } - - /** - * Returns the viewer this content provider is working for. - * - * @return viewer - */ - protected IInternalTreeModelViewer getViewer() { - synchronized(this) { - return fViewer; - } - } - - @Override + IModelDelta parentDelta = node.getParentDelta(); + while (parentDelta != null) { + list.add(0, node.getElement()); + node = parentDelta; + parentDelta = node.getParentDelta(); + } + return new TreePath(list.toArray()); + } + + /** + * Returns the viewer this content provider is working for. + * + * @return viewer + */ + protected IInternalTreeModelViewer getViewer() { + synchronized(this) { + return fViewer; + } + } + + @Override public int viewToModelIndex(TreePath parentPath, int index) { - return fTransform.viewToModelIndex(parentPath, index); - } + return fTransform.viewToModelIndex(parentPath, index); + } - @Override + @Override public int viewToModelCount(TreePath parentPath, int count) { - return fTransform.viewToModelCount(parentPath, count); - } + return fTransform.viewToModelCount(parentPath, count); + } - @Override + @Override public int modelToViewIndex(TreePath parentPath, int index) { - return fTransform.modelToViewIndex(parentPath, index); - } + return fTransform.modelToViewIndex(parentPath, index); + } - @Override + @Override public int modelToViewChildCount(TreePath parentPath, int count) { - return fTransform.modelToViewCount(parentPath, count); - } + return fTransform.modelToViewCount(parentPath, count); + } - @Override + @Override public boolean areTreeModelViewerFiltersApplicable(Object parentElement) { - ViewerFilter[] filters = fViewer.getFilters(); - if (filters.length > 0) { - for (int j = 0; j < filters.length; j++) { - if (filters[j] instanceof TreeModelViewerFilter && - ((TreeModelViewerFilter)filters[j]).isApplicable(fViewer, parentElement)) - { - return true; - } - } - } - return false; - } - - @Override + ViewerFilter[] filters = fViewer.getFilters(); + if (filters.length > 0) { + for (int j = 0; j < filters.length; j++) { + if (filters[j] instanceof TreeModelViewerFilter && + ((TreeModelViewerFilter)filters[j]).isApplicable(fViewer, parentElement)) + { + return true; + } + } + } + return false; + } + + @Override public boolean shouldFilter(Object parentElementOrTreePath, Object element) { - ViewerFilter[] filters = fViewer.getFilters(); - if (filters.length > 0) { - for (int j = 0; j < filters.length; j++) { - if (filters[j] instanceof TreeModelViewerFilter) { - // Skip the filter if not applicable to parent element - Object parentElement = parentElementOrTreePath instanceof TreePath - ? ((TreePath)parentElementOrTreePath).getLastSegment() : parentElementOrTreePath; - if (parentElement == null) { + ViewerFilter[] filters = fViewer.getFilters(); + if (filters.length > 0) { + for (int j = 0; j < filters.length; j++) { + if (filters[j] instanceof TreeModelViewerFilter) { + // Skip the filter if not applicable to parent element + Object parentElement = parentElementOrTreePath instanceof TreePath + ? ((TreePath)parentElementOrTreePath).getLastSegment() : parentElementOrTreePath; + if (parentElement == null) { parentElement = fViewer.getInput(); } - if (!((TreeModelViewerFilter)filters[j]).isApplicable(fViewer, parentElement)) { - continue; - } - } - - if (!(filters[j].select((Viewer) fViewer, parentElementOrTreePath, element))) { - return true; - } - } - } - return false; - } - - @Override + if (!((TreeModelViewerFilter)filters[j]).isApplicable(fViewer, parentElement)) { + continue; + } + } + + if (!(filters[j].select((Viewer) fViewer, parentElementOrTreePath, element))) { + return true; + } + } + } + return false; + } + + @Override public void unmapPath(TreePath path) { - Assert.isTrue( getViewer().getDisplay().getThread() == Thread.currentThread() ); - fTransform.clear(path); - cancelSubtreeUpdates(path); - } - - - boolean addFilteredIndex(TreePath parentPath, int index, Object element) { - Assert.isTrue( getViewer().getDisplay().getThread() == Thread.currentThread() ); - return fTransform.addFilteredIndex(parentPath, index, element); - } - - void removeElementFromFilters(TreePath parentPath, int index) { - Assert.isTrue( getViewer().getDisplay().getThread() == Thread.currentThread() ); - fTransform.removeElementFromFilters(parentPath, index); - } - - boolean removeElementFromFilters(TreePath parentPath, Object element) { - Assert.isTrue( getViewer().getDisplay().getThread() == Thread.currentThread() ); - return fTransform.removeElementFromFilters(parentPath, element); - } - - void setModelChildCount(TreePath parentPath, int childCount) { - Assert.isTrue( getViewer().getDisplay().getThread() == Thread.currentThread() ); - fTransform.setModelChildCount(parentPath, childCount); - } - - boolean isFiltered(TreePath parentPath, int index) { - Assert.isTrue( getViewer().getDisplay().getThread() == Thread.currentThread() ); - return fTransform.isFiltered(parentPath, index); - } - - int[] getFilteredChildren(TreePath parent) { - Assert.isTrue( getViewer().getDisplay().getThread() == Thread.currentThread() ); - return fTransform.getFilteredChildren(parent); - } - - void clearFilteredChild(TreePath parent, int modelIndex) { - Assert.isTrue( getViewer().getDisplay().getThread() == Thread.currentThread() ); - fTransform.clear(parent, modelIndex); - } - - void clearFilters(TreePath parent) { - Assert.isTrue( getViewer().getDisplay().getThread() == Thread.currentThread() ); - fTransform.clear(parent); - } - - /** - * Notification an update request has started - * - * @param update the update to notify about - */ - void updateStarted(ViewerUpdateMonitor update) { - Assert.isTrue( getViewer().getDisplay().getThread() == Thread.currentThread() ); + Assert.isTrue( getViewer().getDisplay().getThread() == Thread.currentThread() ); + fTransform.clear(path); + cancelSubtreeUpdates(path); + } + + + boolean addFilteredIndex(TreePath parentPath, int index, Object element) { + Assert.isTrue( getViewer().getDisplay().getThread() == Thread.currentThread() ); + return fTransform.addFilteredIndex(parentPath, index, element); + } + + void removeElementFromFilters(TreePath parentPath, int index) { + Assert.isTrue( getViewer().getDisplay().getThread() == Thread.currentThread() ); + fTransform.removeElementFromFilters(parentPath, index); + } + + boolean removeElementFromFilters(TreePath parentPath, Object element) { + Assert.isTrue( getViewer().getDisplay().getThread() == Thread.currentThread() ); + return fTransform.removeElementFromFilters(parentPath, element); + } + + void setModelChildCount(TreePath parentPath, int childCount) { + Assert.isTrue( getViewer().getDisplay().getThread() == Thread.currentThread() ); + fTransform.setModelChildCount(parentPath, childCount); + } + + boolean isFiltered(TreePath parentPath, int index) { + Assert.isTrue( getViewer().getDisplay().getThread() == Thread.currentThread() ); + return fTransform.isFiltered(parentPath, index); + } + + int[] getFilteredChildren(TreePath parent) { + Assert.isTrue( getViewer().getDisplay().getThread() == Thread.currentThread() ); + return fTransform.getFilteredChildren(parent); + } + + void clearFilteredChild(TreePath parent, int modelIndex) { + Assert.isTrue( getViewer().getDisplay().getThread() == Thread.currentThread() ); + fTransform.clear(parent, modelIndex); + } + + void clearFilters(TreePath parent) { + Assert.isTrue( getViewer().getDisplay().getThread() == Thread.currentThread() ); + fTransform.clear(parent); + } + + /** + * Notification an update request has started + * + * @param update the update to notify about + */ + void updateStarted(ViewerUpdateMonitor update) { + Assert.isTrue( getViewer().getDisplay().getThread() == Thread.currentThread() ); List<ViewerUpdateMonitor> requests = fRequestsInProgress.get(update.getSchedulingPath()); - if (requests == null) { + if (requests == null) { requests = new ArrayList<>(); - fRequestsInProgress.put(update.getSchedulingPath(), requests); - } - requests.add(update); - if (!fModelSequenceRunning) { - fModelSequenceRunning = true; - if (DebugUIPlugin.DEBUG_UPDATE_SEQUENCE && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(getPresentationContext())) { - DebugUIPlugin.trace("MODEL SEQUENCE BEGINS"); //$NON-NLS-1$ - } - notifyUpdate(UPDATE_SEQUENCE_BEGINS, null); - } - if (DebugUIPlugin.DEBUG_UPDATE_SEQUENCE && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(getPresentationContext())) { - DebugUIPlugin.trace("\tBEGIN - " + update); //$NON-NLS-1$ - } - notifyUpdate(UPDATE_BEGINS, update); - } - - /** - * Notification an update request has completed - * - * @param updates the updates to notify - */ + fRequestsInProgress.put(update.getSchedulingPath(), requests); + } + requests.add(update); + if (!fModelSequenceRunning) { + fModelSequenceRunning = true; + if (DebugUIPlugin.DEBUG_UPDATE_SEQUENCE && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(getPresentationContext())) { + DebugUIPlugin.trace("MODEL SEQUENCE BEGINS"); //$NON-NLS-1$ + } + notifyUpdate(UPDATE_SEQUENCE_BEGINS, null); + } + if (DebugUIPlugin.DEBUG_UPDATE_SEQUENCE && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(getPresentationContext())) { + DebugUIPlugin.trace("\tBEGIN - " + update); //$NON-NLS-1$ + } + notifyUpdate(UPDATE_BEGINS, update); + } + + /** + * Notification an update request has completed + * + * @param updates the updates to notify + */ void updatesComplete(final List<ViewerUpdateMonitor> updates) { - for (int i = 0; i < updates.size(); i++) { - ViewerUpdateMonitor update = updates.get(i); - notifyUpdate(UPDATE_COMPLETE, update); - if (DebugUIPlugin.DEBUG_UPDATE_SEQUENCE && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(getPresentationContext())) { - DebugUIPlugin.trace("\tEND - " + update); //$NON-NLS-1$ - } - } - - // Wait a single cycle to allow viewer to queue requests triggered by completed updates. + for (int i = 0; i < updates.size(); i++) { + ViewerUpdateMonitor update = updates.get(i); + notifyUpdate(UPDATE_COMPLETE, update); + if (DebugUIPlugin.DEBUG_UPDATE_SEQUENCE && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(getPresentationContext())) { + DebugUIPlugin.trace("\tEND - " + update); //$NON-NLS-1$ + } + } + + // Wait a single cycle to allow viewer to queue requests triggered by completed updates. getViewer().getDisplay().asyncExec(() -> { if (isDisposed()) { return; @@ -811,355 +811,355 @@ public class TreeModelContentProvider implements ITreeModelContentProvider, ICon } }); - } - - /** - * @return Returns true if there are outstanding updates in the viewer. - */ - boolean areRequestsPending() { - return !fRequestsInProgress.isEmpty() || !fWaitingRequests.isEmpty(); - } - - /** - * @return Returns the state tracker for the content provider. - */ - ViewerStateTracker getStateTracker() { - return fStateTracker; - } - - /** - * Notifies listeners about given update. - * @param type Type of update to call listeners with. - * @param update Update to notify about. - */ - private void notifyUpdate(final int type, final IViewerUpdate update) { - if (!fUpdateListeners.isEmpty()) { + } + + /** + * @return Returns true if there are outstanding updates in the viewer. + */ + boolean areRequestsPending() { + return !fRequestsInProgress.isEmpty() || !fWaitingRequests.isEmpty(); + } + + /** + * @return Returns the state tracker for the content provider. + */ + ViewerStateTracker getStateTracker() { + return fStateTracker; + } + + /** + * Notifies listeners about given update. + * @param type Type of update to call listeners with. + * @param update Update to notify about. + */ + private void notifyUpdate(final int type, final IViewerUpdate update) { + if (!fUpdateListeners.isEmpty()) { for (IViewerUpdateListener iViewerUpdateListener : fUpdateListeners) { final IViewerUpdateListener listener = iViewerUpdateListener; - SafeRunner.run(new ISafeRunnable() { - @Override + SafeRunner.run(new ISafeRunnable() { + @Override public void run() throws Exception { - switch (type) { - case UPDATE_SEQUENCE_BEGINS: - listener.viewerUpdatesBegin(); - break; - case UPDATE_SEQUENCE_COMPLETE: - listener.viewerUpdatesComplete(); - break; - case UPDATE_BEGINS: - listener.updateStarted(update); - break; - case UPDATE_COMPLETE: - listener.updateComplete(update); - break; + switch (type) { + case UPDATE_SEQUENCE_BEGINS: + listener.viewerUpdatesBegin(); + break; + case UPDATE_SEQUENCE_COMPLETE: + listener.viewerUpdatesComplete(); + break; + case UPDATE_BEGINS: + listener.updateStarted(update); + break; + case UPDATE_COMPLETE: + listener.updateComplete(update); + break; default: break; - } - } + } + } - @Override + @Override public void handleException(Throwable exception) { - DebugUIPlugin.log(exception); - } - }); - } - } - } - - /** - * Cancels outstanding updates for the element at given path and its - * children. - * @param path Path of element. - */ - private void cancelSubtreeUpdates(TreePath path) { - Assert.isTrue( getViewer().getDisplay().getThread() == Thread.currentThread() ); + DebugUIPlugin.log(exception); + } + }); + } + } + } + + /** + * Cancels outstanding updates for the element at given path and its + * children. + * @param path Path of element. + */ + private void cancelSubtreeUpdates(TreePath path) { + Assert.isTrue( getViewer().getDisplay().getThread() == Thread.currentThread() ); for (Entry<TreePath, List<ViewerUpdateMonitor>> entry : fRequestsInProgress.entrySet()) { - TreePath entryPath = entry.getKey(); - if (entryPath.startsWith(path, null)) { + TreePath entryPath = entry.getKey(); + if (entryPath.startsWith(path, null)) { List<ViewerUpdateMonitor> requests = entry.getValue(); Iterator<ViewerUpdateMonitor> reqIter = requests.iterator(); - while (reqIter.hasNext()) { - // Cancel update and remove from requests list. Removing from - // fRequestsInProgress ensures that isRequestBlocked() won't be triggered - // by a canceled update. + while (reqIter.hasNext()) { + // Cancel update and remove from requests list. Removing from + // fRequestsInProgress ensures that isRequestBlocked() won't be triggered + // by a canceled update. reqIter.next().cancel(); - reqIter.remove(); - } - } - } + reqIter.remove(); + } + } + } List<TreePath> purge = new ArrayList<>(); for (TreePath entryPath : fWaitingRequests.keySet()) { - if (entryPath.startsWith(path, null)) { - purge.add(entryPath); - } - } + if (entryPath.startsWith(path, null)) { + purge.add(entryPath); + } + } for (TreePath tp : purge) { fWaitingRequests.remove(tp); - } + } - fStateTracker.cancelStateSubtreeUpdates(path); - } + fStateTracker.cancelStateSubtreeUpdates(path); + } - /** - * Returns whether this given request should be run, or should wait for - * parent update to complete. - * - * @param update the update the schedule - */ - private void schedule(final ViewerUpdateMonitor update) { - Assert.isTrue(getViewer().getDisplay().getThread() == Thread.currentThread()); + /** + * Returns whether this given request should be run, or should wait for + * parent update to complete. + * + * @param update the update the schedule + */ + private void schedule(final ViewerUpdateMonitor update) { + Assert.isTrue(getViewer().getDisplay().getThread() == Thread.currentThread()); - TreePath schedulingPath = update.getSchedulingPath(); + TreePath schedulingPath = update.getSchedulingPath(); List<ViewerUpdateMonitor> requests = fWaitingRequests.get(schedulingPath); - if (requests == null) { + if (requests == null) { requests = new LinkedList<>(); - requests.add(update); - fWaitingRequests.put(schedulingPath, requests); + requests.add(update); + fWaitingRequests.put(schedulingPath, requests); List<ViewerUpdateMonitor> inProgressList = fRequestsInProgress.get(schedulingPath); - if (inProgressList != null) { - int staleUpdateIndex = inProgressList.indexOf(update); - if (staleUpdateIndex >= 0) { - // Cancel update and remove from requests list. Removing from - // fRequestsInProgress ensures that isRequestBlocked() won't be triggered - // by a canceled update. - ViewerUpdateMonitor staleUpdate = inProgressList.remove(staleUpdateIndex); - staleUpdate.cancel(); - // Note: Do not reset the inProgressList to null. This would cause the - // updateStarted() method to think that a new update sequence is - // being started. Since there are waiting requests for this scheduling - // path, the list will be cleaned up later. - } - } - if (inProgressList == null || inProgressList.isEmpty()) { + if (inProgressList != null) { + int staleUpdateIndex = inProgressList.indexOf(update); + if (staleUpdateIndex >= 0) { + // Cancel update and remove from requests list. Removing from + // fRequestsInProgress ensures that isRequestBlocked() won't be triggered + // by a canceled update. + ViewerUpdateMonitor staleUpdate = inProgressList.remove(staleUpdateIndex); + staleUpdate.cancel(); + // Note: Do not reset the inProgressList to null. This would cause the + // updateStarted() method to think that a new update sequence is + // being started. Since there are waiting requests for this scheduling + // path, the list will be cleaned up later. + } + } + if (inProgressList == null || inProgressList.isEmpty()) { getViewer().getDisplay().asyncExec(() -> { if (isDisposed()) { return; } trigger(update.getSchedulingPath()); }); - } - } else { - // there are waiting requests: coalesce with existing request and add to list - requests.add(coalesce(requests, update)); - } - } - - /** - * Tries to coalesce the given request with any request in the list. If a match is found, - * the resulting request is then coalesced again with candidates in list. - * @param requests List of waiting requests to coalesce with - * @param toCoalesce request to coalesce - * @return Returns either the coalesced request. If no match was found it returns the - * toCoalesce parameter request. Either way the returned request needs to be added to the - * waiting requests list. - */ + } + } else { + // there are waiting requests: coalesce with existing request and add to list + requests.add(coalesce(requests, update)); + } + } + + /** + * Tries to coalesce the given request with any request in the list. If a match is found, + * the resulting request is then coalesced again with candidates in list. + * @param requests List of waiting requests to coalesce with + * @param toCoalesce request to coalesce + * @return Returns either the coalesced request. If no match was found it returns the + * toCoalesce parameter request. Either way the returned request needs to be added to the + * waiting requests list. + */ private ViewerUpdateMonitor coalesce(List<ViewerUpdateMonitor> requests, ViewerUpdateMonitor toCoalesce) { for (ViewerUpdateMonitor waiting : requests) { - if (waiting.coalesce(toCoalesce)) { - requests.remove(waiting); - // coalesced with existing request, done - // try to coalesce the combined requests with other waiting requests - return coalesce(requests, waiting); - } - } - return toCoalesce; - } - - /** - * Returns whether there are outstanding ChildrenUpdate updates for the given path. - * This method is expected to be called during processing of a ChildrenRequest, - * therefore one running children request is ignored. - * @param path Path of element to check. - * @return True if there are outstanding children updates for given element. - */ - boolean areChildrenUpdatesPending(TreePath path) { - Assert.isTrue( getViewer().getDisplay().getThread() == Thread.currentThread() ); + if (waiting.coalesce(toCoalesce)) { + requests.remove(waiting); + // coalesced with existing request, done + // try to coalesce the combined requests with other waiting requests + return coalesce(requests, waiting); + } + } + return toCoalesce; + } + + /** + * Returns whether there are outstanding ChildrenUpdate updates for the given path. + * This method is expected to be called during processing of a ChildrenRequest, + * therefore one running children request is ignored. + * @param path Path of element to check. + * @return True if there are outstanding children updates for given element. + */ + boolean areChildrenUpdatesPending(TreePath path) { + Assert.isTrue( getViewer().getDisplay().getThread() == Thread.currentThread() ); List<ViewerUpdateMonitor> requests = fWaitingRequests.get(path); - if (requests != null) { - for (int i = 0; i < requests.size(); i++) { - if (requests.get(i) instanceof ChildrenUpdate) { - return true; - } - } - } - requests = fRequestsInProgress.get(path); - if (requests != null) { - int numChildrenUpdateRequests = 0; - for (int i = 0; i < requests.size(); i++) { - if (requests.get(i) instanceof ChildrenUpdate) { - if (++numChildrenUpdateRequests > 1) { - return true; - } - } - } - } - return false; - } - - /** - * Triggers waiting requests based on the given request that just - * completed. - * <p> - * Requests are processed in order such that updates to - * children are delayed until updates for parent elements are completed. - * This allows the expansion/selection state of the elements to be - * properly restored as new elements are retrieved from model. - * </p> - * @param schedulingPath schedulingPath path or requests to start processing. May - * be <code>null</code> to start the shortest path request. - */ - private void trigger(TreePath schedulingPath) { - Assert.isTrue(getViewer().getDisplay().getThread() == Thread.currentThread()); - - if (fWaitingRequests.isEmpty()) { - return; - } + if (requests != null) { + for (int i = 0; i < requests.size(); i++) { + if (requests.get(i) instanceof ChildrenUpdate) { + return true; + } + } + } + requests = fRequestsInProgress.get(path); + if (requests != null) { + int numChildrenUpdateRequests = 0; + for (int i = 0; i < requests.size(); i++) { + if (requests.get(i) instanceof ChildrenUpdate) { + if (++numChildrenUpdateRequests > 1) { + return true; + } + } + } + } + return false; + } + + /** + * Triggers waiting requests based on the given request that just + * completed. + * <p> + * Requests are processed in order such that updates to + * children are delayed until updates for parent elements are completed. + * This allows the expansion/selection state of the elements to be + * properly restored as new elements are retrieved from model. + * </p> + * @param schedulingPath schedulingPath path or requests to start processing. May + * be <code>null</code> to start the shortest path request. + */ + private void trigger(TreePath schedulingPath) { + Assert.isTrue(getViewer().getDisplay().getThread() == Thread.currentThread()); + + if (fWaitingRequests.isEmpty()) { + return; + } List<ViewerUpdateMonitor> waiting = fWaitingRequests.get(schedulingPath); - if (waiting == null) { - // no waiting, update the entry with the shortest path - int length = Integer.MAX_VALUE; + if (waiting == null) { + // no waiting, update the entry with the shortest path + int length = Integer.MAX_VALUE; Entry<TreePath, List<ViewerUpdateMonitor>> candidate = null; for (Entry<TreePath, List<ViewerUpdateMonitor>> entry : fWaitingRequests.entrySet()) { - TreePath key = entry.getKey(); - if (key.getSegmentCount() < length && !isRequestBlocked(key)) { - candidate = entry; - length = key.getSegmentCount(); - } - } - if (candidate != null) { - startHighestPriorityRequest(candidate.getKey(), candidate.getValue()); - } - } else if (!isRequestBlocked(schedulingPath)) { - // start the highest priority request - startHighestPriorityRequest(schedulingPath, waiting); - } - } - - /** - * Returns true if there are running requests for any parent element of - * the given tree path. - * @param requestPath Path of element to check. - * @return Returns true if requests are running. - */ - private boolean isRequestBlocked(TreePath requestPath) { - TreePath parentPath = requestPath; + TreePath key = entry.getKey(); + if (key.getSegmentCount() < length && !isRequestBlocked(key)) { + candidate = entry; + length = key.getSegmentCount(); + } + } + if (candidate != null) { + startHighestPriorityRequest(candidate.getKey(), candidate.getValue()); + } + } else if (!isRequestBlocked(schedulingPath)) { + // start the highest priority request + startHighestPriorityRequest(schedulingPath, waiting); + } + } + + /** + * Returns true if there are running requests for any parent element of + * the given tree path. + * @param requestPath Path of element to check. + * @return Returns true if requests are running. + */ + private boolean isRequestBlocked(TreePath requestPath) { + TreePath parentPath = requestPath; List<ViewerUpdateMonitor> parentRequests = fRequestsInProgress.get(parentPath); - while (parentRequests == null || parentRequests.isEmpty()) { - parentPath = parentPath.getParentPath(); - if (parentPath == null) { - // no running requests: start request - return false; - } - parentRequests = fRequestsInProgress.get(parentPath); - } - return true; - } - - /** - * @param key the {@link TreePath} - * @param waiting the list of waiting requests - */ + while (parentRequests == null || parentRequests.isEmpty()) { + parentPath = parentPath.getParentPath(); + if (parentPath == null) { + // no running requests: start request + return false; + } + parentRequests = fRequestsInProgress.get(parentPath); + } + return true; + } + + /** + * @param key the {@link TreePath} + * @param waiting the list of waiting requests + */ private void startHighestPriorityRequest(TreePath key, List<ViewerUpdateMonitor> waiting) { - int priority = 4; - ViewerUpdateMonitor next = null; + int priority = 4; + ViewerUpdateMonitor next = null; for (ViewerUpdateMonitor vu : waiting) { - if (vu.getPriority() < priority) { - next = vu; - priority = next.getPriority(); - } - } - if (next != null) { - waiting.remove(next); - if (waiting.isEmpty()) { - fWaitingRequests.remove(key); - } - next.start(); - } - } - - /** - * Returns the element corresponding to the given tree path. - * - * @param path - * tree path - * @return model element - */ - protected Object getElement(TreePath path) { - if (path.getSegmentCount() > 0) { - return path.getLastSegment(); - } - return getViewer().getInput(); - } - - /** - * Reschedule any children updates in progress for the given parent that - * have a start index greater than the given index. An element has been - * removed at this index, invalidating updates in progress. - * - * @param parentPath - * view tree path to parent element - * @param modelIndex - * index at which an element was removed - */ - private void rescheduleUpdates(TreePath parentPath, int modelIndex) { - Assert.isTrue( getViewer().getDisplay().getThread() == Thread.currentThread() ); + if (vu.getPriority() < priority) { + next = vu; + priority = next.getPriority(); + } + } + if (next != null) { + waiting.remove(next); + if (waiting.isEmpty()) { + fWaitingRequests.remove(key); + } + next.start(); + } + } + + /** + * Returns the element corresponding to the given tree path. + * + * @param path + * tree path + * @return model element + */ + protected Object getElement(TreePath path) { + if (path.getSegmentCount() > 0) { + return path.getLastSegment(); + } + return getViewer().getInput(); + } + + /** + * Reschedule any children updates in progress for the given parent that + * have a start index greater than the given index. An element has been + * removed at this index, invalidating updates in progress. + * + * @param parentPath + * view tree path to parent element + * @param modelIndex + * index at which an element was removed + */ + private void rescheduleUpdates(TreePath parentPath, int modelIndex) { + Assert.isTrue( getViewer().getDisplay().getThread() == Thread.currentThread() ); List<ViewerUpdateMonitor> requests = fRequestsInProgress.get(parentPath); List<IChildrenUpdate> reCreate = null; - if (requests != null) { + if (requests != null) { Iterator<ViewerUpdateMonitor> iterator = requests.iterator(); - while (iterator.hasNext()) { + while (iterator.hasNext()) { ViewerUpdateMonitor update = iterator.next(); - if (update instanceof IChildrenUpdate) { - IChildrenUpdate childrenUpdate = (IChildrenUpdate) update; - if (childrenUpdate.getOffset() > modelIndex) { - // Cancel update and remove from requests list. Removing from - // fRequestsInProgress ensures that isRequestBlocked() won't be triggered - // by a canceled update. - childrenUpdate.cancel(); - iterator.remove(); - if (reCreate == null) { + if (update instanceof IChildrenUpdate) { + IChildrenUpdate childrenUpdate = (IChildrenUpdate) update; + if (childrenUpdate.getOffset() > modelIndex) { + // Cancel update and remove from requests list. Removing from + // fRequestsInProgress ensures that isRequestBlocked() won't be triggered + // by a canceled update. + childrenUpdate.cancel(); + iterator.remove(); + if (reCreate == null) { reCreate = new ArrayList<>(); - } - reCreate.add(childrenUpdate); - if (DebugUIPlugin.DEBUG_CONTENT_PROVIDER && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(getPresentationContext())) { - DebugUIPlugin.trace("canceled update in progress handling REMOVE: " + childrenUpdate); //$NON-NLS-1$ - } - } - } - } - } - requests = fWaitingRequests.get(parentPath); - if (requests != null) { + } + reCreate.add(childrenUpdate); + if (DebugUIPlugin.DEBUG_CONTENT_PROVIDER && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(getPresentationContext())) { + DebugUIPlugin.trace("canceled update in progress handling REMOVE: " + childrenUpdate); //$NON-NLS-1$ + } + } + } + } + } + requests = fWaitingRequests.get(parentPath); + if (requests != null) { for (ViewerUpdateMonitor update : requests) { - if (update instanceof IChildrenUpdate) { - IChildrenUpdate childrenUpdate = (IChildrenUpdate) update; - if (childrenUpdate.getOffset() > modelIndex) { - ((ChildrenUpdate) childrenUpdate).setOffset(childrenUpdate.getOffset() - 1); - if (DebugUIPlugin.DEBUG_CONTENT_PROVIDER && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(getPresentationContext())) { - DebugUIPlugin.trace("modified waiting update handling REMOVE: " + childrenUpdate); //$NON-NLS-1$ - } - } - } - } - } - // re-schedule canceled updates at new position. - // have to do this last else the requests would be waiting and - // get modified. - if (reCreate != null) { + if (update instanceof IChildrenUpdate) { + IChildrenUpdate childrenUpdate = (IChildrenUpdate) update; + if (childrenUpdate.getOffset() > modelIndex) { + ((ChildrenUpdate) childrenUpdate).setOffset(childrenUpdate.getOffset() - 1); + if (DebugUIPlugin.DEBUG_CONTENT_PROVIDER && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(getPresentationContext())) { + DebugUIPlugin.trace("modified waiting update handling REMOVE: " + childrenUpdate); //$NON-NLS-1$ + } + } + } + } + } + // re-schedule canceled updates at new position. + // have to do this last else the requests would be waiting and + // get modified. + if (reCreate != null) { for (IChildrenUpdate childrenUpdate : reCreate) { - int start = childrenUpdate.getOffset() - 1; - int end = start + childrenUpdate.getLength(); - for (int i = start; i < end; i++) { - doUpdateElement(parentPath, i); - } - } - } - } + int start = childrenUpdate.getOffset() - 1; + int end = start + childrenUpdate.getLength(); + for (int i = start; i < end; i++) { + doUpdateElement(parentPath, i); + } + } + } + } private void doUpdateChildCount(TreePath path) { - Assert.isTrue( getViewer().getDisplay().getThread() == Thread.currentThread() ); + Assert.isTrue( getViewer().getDisplay().getThread() == Thread.currentThread() ); Object element = getElement(path); IElementContentProvider contentAdapter = ViewerAdapterService.getContentProvider(element); @@ -1170,7 +1170,7 @@ public class TreeModelContentProvider implements ITreeModelContentProvider, ICon } void doUpdateElement(TreePath parentPath, int modelIndex) { - Assert.isTrue( getViewer().getDisplay().getThread() == Thread.currentThread() ); + Assert.isTrue( getViewer().getDisplay().getThread() == Thread.currentThread() ); Object parent = getElement(parentPath); IElementContentProvider contentAdapter = ViewerAdapterService.getContentProvider(parent); @@ -1181,7 +1181,7 @@ public class TreeModelContentProvider implements ITreeModelContentProvider, ICon } private void doUpdateHasChildren(TreePath path) { - Assert.isTrue( getViewer().getDisplay().getThread() == Thread.currentThread() ); + Assert.isTrue( getViewer().getDisplay().getThread() == Thread.currentThread() ); Object element = getElement(path); IElementContentProvider contentAdapter = ViewerAdapterService.getContentProvider(element); @@ -1197,73 +1197,73 @@ public class TreeModelContentProvider implements ITreeModelContentProvider, ICon * @param path Path of element to check. * @return Returns true if there are outstanding updates. */ - boolean areElementUpdatesPending(TreePath path) { - Assert.isTrue( getViewer().getDisplay().getThread() == Thread.currentThread() ); + boolean areElementUpdatesPending(TreePath path) { + Assert.isTrue( getViewer().getDisplay().getThread() == Thread.currentThread() ); - TreePath parentPath = path.getParentPath(); + TreePath parentPath = path.getParentPath(); List<ViewerUpdateMonitor> requests = fWaitingRequests.get(path); - if (requests != null) { - for (int i = 0; i < requests.size(); i++) { - ViewerUpdateMonitor update = requests.get(i); - if (update instanceof ChildrenUpdate) { - return true; - } - } - } - requests = fWaitingRequests.get(parentPath); - if (requests != null) { - for (int i = 0; i < requests.size(); i++) { - ViewerUpdateMonitor update = requests.get(i); - if (update.containsUpdate(path)) { - return true; - } - } - } - requests = fRequestsInProgress.get(path); - if (requests != null) { - for (int i = 0; i < requests.size(); i++) { - ViewerUpdateMonitor update = requests.get(i); - if (update instanceof ChildrenUpdate) { - return true; - } - } - } - requests = fRequestsInProgress.get(parentPath); - if (requests != null) { - for (int i = 0; i < requests.size(); i++) { - ViewerUpdateMonitor update = requests.get(i); - if (update.getElement().equals(path.getLastSegment())) { - return true; - } - } - } - return false; - } - - /** - * Returns the presentation context for this content provider. - * - * @return presentation context - */ + if (requests != null) { + for (int i = 0; i < requests.size(); i++) { + ViewerUpdateMonitor update = requests.get(i); + if (update instanceof ChildrenUpdate) { + return true; + } + } + } + requests = fWaitingRequests.get(parentPath); + if (requests != null) { + for (int i = 0; i < requests.size(); i++) { + ViewerUpdateMonitor update = requests.get(i); + if (update.containsUpdate(path)) { + return true; + } + } + } + requests = fRequestsInProgress.get(path); + if (requests != null) { + for (int i = 0; i < requests.size(); i++) { + ViewerUpdateMonitor update = requests.get(i); + if (update instanceof ChildrenUpdate) { + return true; + } + } + } + requests = fRequestsInProgress.get(parentPath); + if (requests != null) { + for (int i = 0; i < requests.size(); i++) { + ViewerUpdateMonitor update = requests.get(i); + if (update.getElement().equals(path.getLastSegment())) { + return true; + } + } + } + return false; + } + + /** + * Returns the presentation context for this content provider. + * + * @return presentation context + */ protected IPresentationContext getPresentationContext() { - ITreeModelViewer viewer = getViewer(); - if (viewer != null) { - return viewer.getPresentationContext(); - } - return null; - } - - /** - * Updates the viewer with the following deltas. - * - * @param nodes Model deltas to be processed. - * @param mask the model delta mask - * @see IModelDelta for a list of masks - */ - protected void updateNodes(IModelDelta[] nodes, int mask) { - for (int i = 0; i < nodes.length; i++) { - IModelDelta node = nodes[i]; - int flags = node.getFlags() & mask; + ITreeModelViewer viewer = getViewer(); + if (viewer != null) { + return viewer.getPresentationContext(); + } + return null; + } + + /** + * Updates the viewer with the following deltas. + * + * @param nodes Model deltas to be processed. + * @param mask the model delta mask + * @see IModelDelta for a list of masks + */ + protected void updateNodes(IModelDelta[] nodes, int mask) { + for (int i = 0; i < nodes.length; i++) { + IModelDelta node = nodes[i]; + int flags = node.getFlags() & mask; if (flags != 0) { if ((flags & IModelDelta.ADDED) != 0) { handleAdd(node); @@ -1301,36 +1301,36 @@ public class TreeModelContentProvider implements ITreeModelContentProvider, ICon if ((flags & IModelDelta.REVEAL) != 0) { handleReveal(node); } - } - updateNodes(node.getChildDeltas(), mask); - } - } + } + updateNodes(node.getChildDeltas(), mask); + } + } - protected void handleInstall(IModelDelta delta) { - installModelProxy(getViewer().getInput(), getFullTreePath(delta)); - } + protected void handleInstall(IModelDelta delta) { + installModelProxy(getViewer().getInput(), getFullTreePath(delta)); + } - protected void handleUninstall(IModelDelta delta) { - disposeModelProxy(getFullTreePath(delta)); - } + protected void handleUninstall(IModelDelta delta) { + disposeModelProxy(getFullTreePath(delta)); + } - protected void handleAdd(IModelDelta delta) { + protected void handleAdd(IModelDelta delta) { IModelDelta parentDelta = delta.getParentDelta(); if (parentDelta == null) { - DebugUIPlugin.log(new Status(IStatus.ERROR, DebugUIPlugin.getUniqueIdentifier(), "Invalid viewer update: " + delta + ", in " + getPresentationContext().getId(), null )); //$NON-NLS-1$ //$NON-NLS-2$ - return; + DebugUIPlugin.log(new Status(IStatus.ERROR, DebugUIPlugin.getUniqueIdentifier(), "Invalid viewer update: " + delta + ", in " + getPresentationContext().getId(), null )); //$NON-NLS-1$ //$NON-NLS-2$ + return; } TreePath parentPath = getViewerTreePath(parentDelta); Object element = delta.getElement(); int count = parentDelta.getChildCount(); if (count > 0) { - setModelChildCount(parentPath, count); - int modelIndex = count - 1; - if (delta.getIndex() != -1) { - // assume addition at end, unless index specified by delta - modelIndex = delta.getIndex(); - } + setModelChildCount(parentPath, count); + int modelIndex = count - 1; + if (delta.getIndex() != -1) { + // assume addition at end, unless index specified by delta + modelIndex = delta.getIndex(); + } if (shouldFilter(parentPath, element)) { addFilteredIndex(parentPath, modelIndex, element); if (DebugUIPlugin.DEBUG_CONTENT_PROVIDER && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(getPresentationContext())) { @@ -1341,7 +1341,7 @@ public class TreeModelContentProvider implements ITreeModelContentProvider, ICon if (isFiltered(parentPath, modelIndex)) { clearFilteredChild(parentPath, modelIndex); } - int viewIndex = modelToViewIndex(parentPath, modelIndex); + int viewIndex = modelToViewIndex(parentPath, modelIndex); int viewCount = modelToViewChildCount(parentPath, count); if (DebugUIPlugin.DEBUG_CONTENT_PROVIDER && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(getPresentationContext())) { DebugUIPlugin.trace("handleAdd(" + delta.getElement() + ") viewIndex: " + viewIndex + " modelIndex: " + modelIndex + " viewCount: " + viewCount + " modelCount: " + count); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ @@ -1357,11 +1357,11 @@ public class TreeModelContentProvider implements ITreeModelContentProvider, ICon if (DebugUIPlugin.DEBUG_CONTENT_PROVIDER && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(getPresentationContext())) { DebugUIPlugin.trace("handleAdd(" + delta.getElement() + ")"); //$NON-NLS-1$ //$NON-NLS-2$ } - doUpdateChildCount(getViewerTreePath(delta.getParentDelta())); + doUpdateChildCount(getViewerTreePath(delta.getParentDelta())); } } - protected void handleContent(IModelDelta delta) { + protected void handleContent(IModelDelta delta) { if (delta.getParentDelta() == null && delta.getChildCount() == 0) { // if the delta is for the root, ensure the root still matches viewer input if (!delta.getElement().equals(getViewer().getInput())) { @@ -1373,13 +1373,13 @@ public class TreeModelContentProvider implements ITreeModelContentProvider, ICon getViewer().refresh(getElement(treePath)); } - protected void handleCollapse(IModelDelta delta) { + protected void handleCollapse(IModelDelta delta) { TreePath elementPath = getViewerTreePath(delta); getViewer().setExpandedState(elementPath, false); - cancelRestore(elementPath, IModelDelta.EXPAND); + cancelRestore(elementPath, IModelDelta.EXPAND); } - protected void handleExpand(IModelDelta delta) { + protected void handleExpand(IModelDelta delta) { // expand each parent, then this node IModelDelta parentDelta = delta.getParentDelta(); if (parentDelta != null) { @@ -1388,22 +1388,22 @@ public class TreeModelContentProvider implements ITreeModelContentProvider, ICon } expand(delta); } else { - int childCount = delta.getChildCount(); - TreePath elementPath = getViewerTreePath(delta); - if (childCount > 0) { - int viewCount = modelToViewChildCount(elementPath, childCount); - if (DebugUIPlugin.DEBUG_CONTENT_PROVIDER && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(getPresentationContext())) { - DebugUIPlugin.trace("[expand] setChildCount(" + delta.getElement() + ", (model) " + childCount + " (view) " + viewCount); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - } - getViewer().setChildCount(elementPath, viewCount); - } - } - } - - /** - * Expands the element pointed to by given delta. - * @param delta Delta that points to the element to expand. - */ + int childCount = delta.getChildCount(); + TreePath elementPath = getViewerTreePath(delta); + if (childCount > 0) { + int viewCount = modelToViewChildCount(elementPath, childCount); + if (DebugUIPlugin.DEBUG_CONTENT_PROVIDER && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(getPresentationContext())) { + DebugUIPlugin.trace("[expand] setChildCount(" + delta.getElement() + ", (model) " + childCount + " (view) " + viewCount); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + } + getViewer().setChildCount(elementPath, viewCount); + } + } + } + + /** + * Expands the element pointed to by given delta. + * @param delta Delta that points to the element to expand. + */ private void expand(IModelDelta delta) { int childCount = delta.getChildCount(); int modelIndex = delta.getIndex(); @@ -1435,9 +1435,9 @@ public class TreeModelContentProvider implements ITreeModelContentProvider, ICon DebugUIPlugin.trace("[expand] setChildCount(" + delta.getElement() + ", (model) " + childCount + " (view) " + viewCount); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ } treeViewer.setChildCount(elementPath, viewCount); - if (!treeViewer.getExpandedState(elementPath)) { - treeViewer.expandToLevel(elementPath, 1); - } + if (!treeViewer.getExpandedState(elementPath)) { + treeViewer.expandToLevel(elementPath, 1); + } cancelRestore(elementPath, IModelDelta.COLLAPSE); } } @@ -1451,7 +1451,7 @@ public class TreeModelContentProvider implements ITreeModelContentProvider, ICon * @param element element to insert * @param modelIndex index of the element in the model * @return Returns the view index of the newly inserted element - * or -1 if not inserted. + * or -1 if not inserted. */ private int unfilterElement(TreePath parentPath, Object element, int modelIndex) { // Element is filtered - if no longer filtered, insert the element @@ -1478,11 +1478,11 @@ public class TreeModelContentProvider implements ITreeModelContentProvider, ICon } protected void handleInsert(IModelDelta delta) { - IModelDelta parentDelta = delta.getParentDelta(); - if (parentDelta == null) { - DebugUIPlugin.log(new Status(IStatus.ERROR, DebugUIPlugin.getUniqueIdentifier(), "Invalid viewer update: " + delta + ", in " + getPresentationContext().getId(), null )); //$NON-NLS-1$ //$NON-NLS-2$ - return; - } + IModelDelta parentDelta = delta.getParentDelta(); + if (parentDelta == null) { + DebugUIPlugin.log(new Status(IStatus.ERROR, DebugUIPlugin.getUniqueIdentifier(), "Invalid viewer update: " + delta + ", in " + getPresentationContext().getId(), null )); //$NON-NLS-1$ //$NON-NLS-2$ + return; + } TreePath parentPath = getViewerTreePath(delta.getParentDelta()); Object element = delta.getElement(); @@ -1505,7 +1505,7 @@ public class TreeModelContentProvider implements ITreeModelContentProvider, ICon if (DebugUIPlugin.DEBUG_CONTENT_PROVIDER && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(getPresentationContext())) { DebugUIPlugin.trace("handleInsert(" + delta.getElement() + ")"); //$NON-NLS-1$ //$NON-NLS-2$ } - doUpdateChildCount(getViewerTreePath(delta.getParentDelta())); + doUpdateChildCount(getViewerTreePath(delta.getParentDelta())); } } @@ -1515,8 +1515,8 @@ public class TreeModelContentProvider implements ITreeModelContentProvider, ICon } IModelDelta parentDelta = delta.getParentDelta(); if (parentDelta == null) { - DebugUIPlugin.log(new Status(IStatus.ERROR, DebugUIPlugin.getUniqueIdentifier(), "Invalid viewer update: " + delta + ", in " + getPresentationContext().getId(), null )); //$NON-NLS-1$ //$NON-NLS-2$ - return; + DebugUIPlugin.log(new Status(IStatus.ERROR, DebugUIPlugin.getUniqueIdentifier(), "Invalid viewer update: " + delta + ", in " + getPresentationContext().getId(), null )); //$NON-NLS-1$ //$NON-NLS-2$ + return; } IInternalTreeModelViewer treeViewer = getViewer(); TreePath parentPath = getViewerTreePath(parentDelta); @@ -1530,16 +1530,16 @@ public class TreeModelContentProvider implements ITreeModelContentProvider, ICon int unmappedIndex = -1; int itemCount = -1; if (modelIndex < 0) { - itemCount = treeViewer.getChildCount(parentPath); - if (itemCount == -1) { - clearFilters(parentPath); - } - viewIndex = treeViewer.findElementIndex(parentPath, element); - if (viewIndex >= 0) { - modelIndex = viewToModelIndex(parentPath, viewIndex); - } else { - unmappedIndex = treeViewer.findElementIndex(parentPath, null); - } + itemCount = treeViewer.getChildCount(parentPath); + if (itemCount == -1) { + clearFilters(parentPath); + } + viewIndex = treeViewer.findElementIndex(parentPath, element); + if (viewIndex >= 0) { + modelIndex = viewToModelIndex(parentPath, viewIndex); + } else { + unmappedIndex = treeViewer.findElementIndex(parentPath, null); + } } else { viewIndex = modelToViewIndex(parentPath, modelIndex); } @@ -1583,41 +1583,41 @@ public class TreeModelContentProvider implements ITreeModelContentProvider, ICon } protected void handleReplace(IModelDelta delta) { - IModelDelta parentDelta = delta.getParentDelta(); - if (parentDelta == null) { - DebugUIPlugin.log(new Status(IStatus.ERROR, DebugUIPlugin.getUniqueIdentifier(), "Invalid viewer update: " + delta + ", in " + getPresentationContext().getId(), null )); //$NON-NLS-1$ //$NON-NLS-2$ - return; - } + IModelDelta parentDelta = delta.getParentDelta(); + if (parentDelta == null) { + DebugUIPlugin.log(new Status(IStatus.ERROR, DebugUIPlugin.getUniqueIdentifier(), "Invalid viewer update: " + delta + ", in " + getPresentationContext().getId(), null )); //$NON-NLS-1$ //$NON-NLS-2$ + return; + } TreePath parentPath = getViewerTreePath(parentDelta); int index = delta.getIndex(); if (index < 0) { - index = fTransform.indexOfFilteredElement(parentPath, delta.getElement()); + index = fTransform.indexOfFilteredElement(parentPath, delta.getElement()); } if (index >= 0) { - boolean filtered = isFiltered(parentPath, index); - boolean shouldFilter = shouldFilter(parentPath, delta.getReplacementElement()); - - // Update the filter transform - if (filtered) { - clearFilteredChild(parentPath, index); - } - if (shouldFilter) { - addFilteredIndex(parentPath, index, delta.getElement()); - } - - // Update the viewer - if (filtered) { - if (!shouldFilter) { - getViewer().insert(parentPath, delta.getReplacementElement(), modelToViewIndex(parentPath, index)); - } - //else do nothing - } else { - if (shouldFilter) { - getViewer().remove(parentPath, modelToViewIndex(parentPath, index)); - } else { - getViewer().replace(parentPath, delta.getIndex(), delta.getReplacementElement()); - } - } + boolean filtered = isFiltered(parentPath, index); + boolean shouldFilter = shouldFilter(parentPath, delta.getReplacementElement()); + + // Update the filter transform + if (filtered) { + clearFilteredChild(parentPath, index); + } + if (shouldFilter) { + addFilteredIndex(parentPath, index, delta.getElement()); + } + + // Update the viewer + if (filtered) { + if (!shouldFilter) { + getViewer().insert(parentPath, delta.getReplacementElement(), modelToViewIndex(parentPath, index)); + } + //else do nothing + } else { + if (shouldFilter) { + getViewer().remove(parentPath, modelToViewIndex(parentPath, index)); + } else { + getViewer().replace(parentPath, delta.getIndex(), delta.getReplacementElement()); + } + } } } @@ -1627,18 +1627,18 @@ public class TreeModelContentProvider implements ITreeModelContentProvider, ICon // check if selection is allowed IStructuredSelection candidate = new TreeSelection(getViewerTreePath(delta)); if ((delta.getFlags() & IModelDelta.FORCE) == 0 && - !treeViewer.overrideSelection(treeViewer.getSelection(), candidate)) + !treeViewer.overrideSelection(treeViewer.getSelection(), candidate)) { return; } // empty the selection before replacing elements to avoid materializing elements (@see bug 305739) treeViewer.clearSelectionQuiet(); if (modelIndex >= 0) { - IModelDelta parentDelta = delta.getParentDelta(); - if (parentDelta == null) { - DebugUIPlugin.log(new Status(IStatus.ERROR, DebugUIPlugin.getUniqueIdentifier(), "Invalid viewer update: " + delta + ", in " + getPresentationContext().getId(), null )); //$NON-NLS-1$ //$NON-NLS-2$ - return; - } + IModelDelta parentDelta = delta.getParentDelta(); + if (parentDelta == null) { + DebugUIPlugin.log(new Status(IStatus.ERROR, DebugUIPlugin.getUniqueIdentifier(), "Invalid viewer update: " + delta + ", in " + getPresentationContext().getId(), null )); //$NON-NLS-1$ //$NON-NLS-2$ + return; + } TreePath parentPath = getViewerTreePath(parentDelta); int viewIndex = modelToViewIndex(parentPath, modelIndex); if (viewIndex >= 0) { @@ -1659,7 +1659,7 @@ public class TreeModelContentProvider implements ITreeModelContentProvider, ICon } TreePath selectionPath = getViewerTreePath(delta); if (treeViewer.trySelection(new TreeSelection(selectionPath), false, (delta.getFlags() | IModelDelta.FORCE) == 0)) { - cancelRestore(selectionPath, IModelDelta.SELECT); + cancelRestore(selectionPath, IModelDelta.SELECT); } } @@ -1669,13 +1669,13 @@ public class TreeModelContentProvider implements ITreeModelContentProvider, ICon protected void handleReveal(IModelDelta delta) { IModelDelta parentDelta = delta.getParentDelta(); - if (parentDelta == null) { - DebugUIPlugin.log(new Status(IStatus.ERROR, DebugUIPlugin.getUniqueIdentifier(), "Invalid viewer update: " + delta + ", in " + getPresentationContext().getId(), null )); //$NON-NLS-1$ //$NON-NLS-2$ - return; - } - handleExpand(parentDelta); - reveal(delta); - cancelRestore(getViewerTreePath(delta), IModelDelta.REVEAL); + if (parentDelta == null) { + DebugUIPlugin.log(new Status(IStatus.ERROR, DebugUIPlugin.getUniqueIdentifier(), "Invalid viewer update: " + delta + ", in " + getPresentationContext().getId(), null )); //$NON-NLS-1$ //$NON-NLS-2$ + return; + } + handleExpand(parentDelta); + reveal(delta); + cancelRestore(getViewerTreePath(delta), IModelDelta.REVEAL); } /** @@ -1708,7 +1708,7 @@ public class TreeModelContentProvider implements ITreeModelContentProvider, ICon // only move tree based on force flag and selection policy if ((delta.getFlags() & IModelDelta.FORCE) != 0 || - treeViewer.overrideSelection(treeViewer.getSelection(), new TreeSelection(elementPath))) + treeViewer.overrideSelection(treeViewer.getSelection(), new TreeSelection(elementPath))) { /* * Bug 438724 - Save reveal parameters and redo reveal on @@ -1717,7 +1717,7 @@ public class TreeModelContentProvider implements ITreeModelContentProvider, ICon */ fRevealPath = parentPath; fRevealIndex = viewIndex; - treeViewer.reveal(parentPath, viewIndex); + treeViewer.reveal(parentPath, viewIndex); } } } @@ -1729,7 +1729,7 @@ public class TreeModelContentProvider implements ITreeModelContentProvider, ICon @Override public void updateChildCount(TreePath treePath, int currentChildCount) { - Assert.isTrue( getViewer().getDisplay().getThread() == Thread.currentThread() ); + Assert.isTrue( getViewer().getDisplay().getThread() == Thread.currentThread() ); if (DebugUIPlugin.DEBUG_CONTENT_PROVIDER && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(getPresentationContext())) { DebugUIPlugin.trace("updateChildCount(" + getElement(treePath) + ", " + currentChildCount + ")"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ @@ -1739,7 +1739,7 @@ public class TreeModelContentProvider implements ITreeModelContentProvider, ICon @Override public void updateElement(TreePath parentPath, int viewIndex) { - Assert.isTrue( getViewer().getDisplay().getThread() == Thread.currentThread() ); + Assert.isTrue( getViewer().getDisplay().getThread() == Thread.currentThread() ); int modelIndex = viewToModelIndex(parentPath, viewIndex); if (DebugUIPlugin.DEBUG_CONTENT_PROVIDER && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(getPresentationContext())) { @@ -1750,7 +1750,7 @@ public class TreeModelContentProvider implements ITreeModelContentProvider, ICon @Override public void updateHasChildren(TreePath path) { - Assert.isTrue( getViewer().getDisplay().getThread() == Thread.currentThread() ); + Assert.isTrue( getViewer().getDisplay().getThread() == Thread.currentThread() ); if (DebugUIPlugin.DEBUG_CONTENT_PROVIDER && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(getPresentationContext())) { DebugUIPlugin.trace("updateHasChildren(" + getElement(path)); //$NON-NLS-1$ @@ -1765,61 +1765,61 @@ public class TreeModelContentProvider implements ITreeModelContentProvider, ICon * @param update Update to perform. */ void scheduleViewerUpdate(ViewerUpdateMonitor update) { - Display display; - Runnable updateJob = null; - synchronized(this) { - if (isDisposed()) { + Display display; + Runnable updateJob = null; + synchronized(this) { + if (isDisposed()) { return; } - display = getViewer().getDisplay(); - fCompletedUpdates.add(update); - if (fCompletedUpdatesRunnable == null) { + display = getViewer().getDisplay(); + fCompletedUpdates.add(update); + if (fCompletedUpdatesRunnable == null) { fCompletedUpdatesRunnable = () -> { if (!isDisposed()) { performUpdates(); } }; - updateJob = fCompletedUpdatesRunnable; - } - } - - if (updateJob != null) { - if (Thread.currentThread() == display.getThread()) { - performUpdates(); - } else { + updateJob = fCompletedUpdatesRunnable; + } + } + + if (updateJob != null) { + if (Thread.currentThread() == display.getThread()) { + performUpdates(); + } else { fDelayedDoModelChangeJob.runDelayed(updateJob); - } - } + } + } } /** * Perform the updates pointed to by given array on the viewer. */ private void performUpdates() { - Assert.isTrue( getViewer().getDisplay().getThread() == Thread.currentThread() ); + Assert.isTrue( getViewer().getDisplay().getThread() == Thread.currentThread() ); List<ViewerUpdateMonitor> jobCompletedUpdates; - synchronized(this) { - if (isDisposed()) { - return; - } - jobCompletedUpdates = fCompletedUpdates; - fCompletedUpdatesRunnable = null; + synchronized(this) { + if (isDisposed()) { + return; + } + jobCompletedUpdates = fCompletedUpdates; + fCompletedUpdatesRunnable = null; fCompletedUpdates = new ArrayList<>(); - } - // necessary to check if viewer is disposed - try { - for (int i = 0; i < jobCompletedUpdates.size(); i++) { - ViewerUpdateMonitor completedUpdate = jobCompletedUpdates.get(i); - if (!completedUpdate.isCanceled() && !isDisposed()) { - IStatus status = completedUpdate.getStatus(); - if (status == null || status.isOK()) { - completedUpdate.performUpdate(); - } - } - } - } finally { - updatesComplete(jobCompletedUpdates); - } + } + // necessary to check if viewer is disposed + try { + for (int i = 0; i < jobCompletedUpdates.size(); i++) { + ViewerUpdateMonitor completedUpdate = jobCompletedUpdates.get(i); + if (!completedUpdate.isCanceled() && !isDisposed()) { + IStatus status = completedUpdate.getStatus(); + if (status == null || status.isOK()) { + completedUpdate.performUpdate(); + } + } + } + } finally { + updatesComplete(jobCompletedUpdates); + } } } diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/TreeModelLabelProvider.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/TreeModelLabelProvider.java index dbf6f53c2..bbde049f8 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/TreeModelLabelProvider.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/TreeModelLabelProvider.java @@ -49,7 +49,7 @@ import org.eclipse.swt.widgets.Display; * @since 3.3 */ public class TreeModelLabelProvider extends ColumnLabelProvider - implements ITreeModelLabelProvider, IModelChangedListener + implements ITreeModelLabelProvider, IModelChangedListener { private IInternalTreeModelViewer fViewer; @@ -103,28 +103,28 @@ public class TreeModelLabelProvider extends ColumnLabelProvider */ private List<ILabelUpdate> fUpdatesInProgress = new ArrayList<>(); - /** - * Delta visitor actively cancels the outstanding label updates for - * elements that are changed and are about to be updated. - */ - class CancelPendingUpdatesVisitor implements IModelDeltaVisitor { - @Override + /** + * Delta visitor actively cancels the outstanding label updates for + * elements that are changed and are about to be updated. + */ + class CancelPendingUpdatesVisitor implements IModelDeltaVisitor { + @Override public boolean visit(IModelDelta delta, int depth) { - if ((delta.getFlags() & IModelDelta.CONTENT) > 0) { - cancelElementUpdates(delta.getElement(), true); - return false; - } else if ((delta.getFlags() & IModelDelta.STATE) > 0) { - cancelElementUpdates(delta.getElement(), false); - return true; - } - return true; - } - } - - /** - * Delta visitor - */ - private CancelPendingUpdatesVisitor fCancelPendingUpdatesVisitor = new CancelPendingUpdatesVisitor(); + if ((delta.getFlags() & IModelDelta.CONTENT) > 0) { + cancelElementUpdates(delta.getElement(), true); + return false; + } else if ((delta.getFlags() & IModelDelta.STATE) > 0) { + cancelElementUpdates(delta.getElement(), false); + return true; + } + return true; + } + } + + /** + * Delta visitor + */ + private CancelPendingUpdatesVisitor fCancelPendingUpdatesVisitor = new CancelPendingUpdatesVisitor(); /** * Constructs a new label provider on the given display @@ -206,21 +206,21 @@ public class TreeModelLabelProvider extends ColumnLabelProvider @Override public void dispose() { - Assert.isTrue(fViewer.getDisplay().getThread() == Thread.currentThread()); + Assert.isTrue(fViewer.getDisplay().getThread() == Thread.currentThread()); - fViewer.removeModelChangedListener(this); - fViewer = null; + fViewer.removeModelChangedListener(this); + fViewer = null; List<ILabelUpdate> complete = null; - synchronized(this) { - complete = fComplete; - fComplete = null; - } - if (complete != null) { + synchronized(this) { + complete = fComplete; + fComplete = null; + } + if (complete != null) { for (ILabelUpdate update : complete) { update.cancel(); } - } + } for (ILabelUpdate currentUpdate : fUpdatesInProgress) { currentUpdate.cancel(); } @@ -231,7 +231,7 @@ public class TreeModelLabelProvider extends ColumnLabelProvider for (List<ILabelUpdate> updateList : fPendingUpdates.values()) { for (ILabelUpdate update : updateList) { update.cancel(); - } + } } fPendingUpdates.clear(); for (Image image : fImageCache.values()) { @@ -250,7 +250,7 @@ public class TreeModelLabelProvider extends ColumnLabelProvider } private boolean isDisposed() { - return fViewer == null; + return fViewer == null; } @Override @@ -260,120 +260,120 @@ public class TreeModelLabelProvider extends ColumnLabelProvider @Override public boolean update(TreePath elementPath) { - Assert.isTrue(fViewer.getDisplay().getThread() == Thread.currentThread()); + Assert.isTrue(fViewer.getDisplay().getThread() == Thread.currentThread()); - cancelPathUpdates(elementPath); + cancelPathUpdates(elementPath); String[] visibleColumns = fViewer.getVisibleColumns(); Object element = elementPath.getLastSegment(); IElementLabelProvider presentation = ViewerAdapterService.getLabelProvider(element); if (presentation != null) { List<ILabelUpdate> updates = fPendingUpdates.get(presentation); - if (updates == null) { + if (updates == null) { updates = new LinkedList<>(); - fPendingUpdates.put(presentation, updates); - } - updates.add(new LabelUpdate(fViewer.getInput(), elementPath, this, visibleColumns, fViewer.getPresentationContext())); - fPendingUpdatesRunnable = new Runnable() { - @Override + fPendingUpdates.put(presentation, updates); + } + updates.add(new LabelUpdate(fViewer.getInput(), elementPath, this, visibleColumns, fViewer.getPresentationContext())); + fPendingUpdatesRunnable = new Runnable() { + @Override public void run() { - if (isDisposed()) { + if (isDisposed()) { return; } - startRequests(this); - } - }; - fViewer.getDisplay().asyncExec(fPendingUpdatesRunnable); + startRequests(this); + } + }; + fViewer.getDisplay().asyncExec(fPendingUpdatesRunnable); return true; } else { - return false; + return false; } } /** - * Cancel any outstanding updates that are running for this element. + * Cancel any outstanding updates that are running for this element. * @param elementPath Element to cancel updates for. - */ - private void cancelPathUpdates(TreePath elementPath) { - Assert.isTrue(fViewer.getDisplay().getThread() == Thread.currentThread()); + */ + private void cancelPathUpdates(TreePath elementPath) { + Assert.isTrue(fViewer.getDisplay().getThread() == Thread.currentThread()); for (ILabelUpdate currentUpdate : fUpdatesInProgress) { - if (elementPath.equals(currentUpdate.getElementPath())) { - currentUpdate.cancel(); - } - } - } - - /** - * Sets the element's display information in the viewer. - * - * @param path Element path. - * @param numColumns Number of columns in the data. - * @param labels Array of labels. The array cannot to be - * <code>null</code>, but values within the array may be. - * @param images Array of image descriptors, may be <code>null</code>. - * @param fontDatas Array of fond data objects, may be <code>null</code>. - * @param foregrounds Array of RGB values for foreground colors, may be - * <code>null</code>. - * @param backgrounds Array of RGB values for background colors, may be - * <code>null</code>. - * @param checked Whether given item should be checked. - * @param grayed Whether given item's checkbox should be grayed. - */ - void setElementData(TreePath path, int numColumns, String[] labels, ImageDescriptor[] images, - FontData[] fontDatas, RGB[] foregrounds, RGB[] backgrounds, boolean checked, boolean grayed) - { - fViewer.setElementData(path, numColumns, labels, images, fontDatas, foregrounds, backgrounds); - fViewer.setElementChecked(path, checked, grayed); - } + if (elementPath.equals(currentUpdate.getElementPath())) { + currentUpdate.cancel(); + } + } + } + + /** + * Sets the element's display information in the viewer. + * + * @param path Element path. + * @param numColumns Number of columns in the data. + * @param labels Array of labels. The array cannot to be + * <code>null</code>, but values within the array may be. + * @param images Array of image descriptors, may be <code>null</code>. + * @param fontDatas Array of fond data objects, may be <code>null</code>. + * @param foregrounds Array of RGB values for foreground colors, may be + * <code>null</code>. + * @param backgrounds Array of RGB values for background colors, may be + * <code>null</code>. + * @param checked Whether given item should be checked. + * @param grayed Whether given item's checkbox should be grayed. + */ + void setElementData(TreePath path, int numColumns, String[] labels, ImageDescriptor[] images, + FontData[] fontDatas, RGB[] foregrounds, RGB[] backgrounds, boolean checked, boolean grayed) + { + fViewer.setElementData(path, numColumns, labels, images, fontDatas, foregrounds, backgrounds); + fViewer.setElementChecked(path, checked, grayed); + } private void startRequests(Runnable runnable) { - if (runnable != fPendingUpdatesRunnable) { - return; - } - if (!fPendingUpdates.isEmpty()) { + if (runnable != fPendingUpdatesRunnable) { + return; + } + if (!fPendingUpdates.isEmpty()) { List<ILabelUpdate> list = null; for (Entry<IElementLabelProvider, List<ILabelUpdate>> entry : fPendingUpdates.entrySet()) { list = entry.getValue(); for (ILabelUpdate update : list) { updateStarted(update); - } + } entry.getKey().update(list.toArray(new ILabelUpdate[list.size()])); - } - } - fPendingUpdates.clear(); - fPendingUpdatesRunnable = null; + } + } + fPendingUpdates.clear(); + fPendingUpdatesRunnable = null; } - /** - * Cancels all running updates for the given element. If seachFullPath is true, - * all updates will be canceled which have the given element anywhere in their - * patch. - * @param element element to search for. - * @param searchFullPath flag whether to look for the element in the full path - * of the update - */ - private void cancelElementUpdates(Object element, boolean searchFullPath) { + /** + * Cancels all running updates for the given element. If seachFullPath is true, + * all updates will be canceled which have the given element anywhere in their + * patch. + * @param element element to search for. + * @param searchFullPath flag whether to look for the element in the full path + * of the update + */ + private void cancelElementUpdates(Object element, boolean searchFullPath) { for (ILabelUpdate currentUpdate : fUpdatesInProgress) { - if (searchFullPath) { - if (element.equals(fViewer.getInput())) { - currentUpdate.cancel(); - } else { - TreePath updatePath = currentUpdate.getElementPath(); - for (int i = 0; i < updatePath.getSegmentCount(); i++) { - if (element.equals(updatePath.getSegment(i))) { - currentUpdate.cancel(); - break; // Exit the for loop, stay in the while loop - } - } - } - } else { - if (element.equals(currentUpdate.getElement())) { - currentUpdate.cancel(); - } - } - } - } + if (searchFullPath) { + if (element.equals(fViewer.getInput())) { + currentUpdate.cancel(); + } else { + TreePath updatePath = currentUpdate.getElementPath(); + for (int i = 0; i < updatePath.getSegmentCount(); i++) { + if (element.equals(updatePath.getSegment(i))) { + currentUpdate.cancel(); + break; // Exit the for loop, stay in the while loop + } + } + } + } else { + if (element.equals(currentUpdate.getElement())) { + currentUpdate.cancel(); + } + } + } + } /** * Returns the presentation context for this label provider. @@ -384,13 +384,13 @@ public class TreeModelLabelProvider extends ColumnLabelProvider return fViewer.getPresentationContext(); } - /** - * A label update is complete. - * - * @param update Update that is to be completed. - */ - synchronized void complete(ILabelUpdate update) { - if (fViewer == null) { + /** + * A label update is complete. + * + * @param update Update that is to be completed. + */ + synchronized void complete(ILabelUpdate update) { + if (fViewer == null) { return; } @@ -411,11 +411,11 @@ public class TreeModelLabelProvider extends ColumnLabelProvider } else { ((LabelUpdate) itrUpdate).performUpdate(); } - } + } }); } fComplete.add(update); - } + } @Override public void addLabelUpdateListener(ILabelUpdateListener listener) { @@ -433,7 +433,7 @@ public class TreeModelLabelProvider extends ColumnLabelProvider * @param update Update that was started */ void updateStarted(ILabelUpdate update) { - Assert.isTrue(fViewer.getDisplay().getThread() == Thread.currentThread()); + Assert.isTrue(fViewer.getDisplay().getThread() == Thread.currentThread()); boolean begin = fUpdatesInProgress.isEmpty(); fUpdatesInProgress.add(update); @@ -444,8 +444,8 @@ public class TreeModelLabelProvider extends ColumnLabelProvider } notifyUpdate(TreeModelContentProvider.UPDATE_SEQUENCE_BEGINS, null); } - if (DebugUIPlugin.DEBUG_UPDATE_SEQUENCE && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(getPresentationContext())) { - DebugUIPlugin.trace("\tBEGIN - " + update); //$NON-NLS-1$ + if (DebugUIPlugin.DEBUG_UPDATE_SEQUENCE && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(getPresentationContext())) { + DebugUIPlugin.trace("\tBEGIN - " + update); //$NON-NLS-1$ } notifyUpdate(TreeModelContentProvider.UPDATE_BEGINS, update); } @@ -458,13 +458,13 @@ public class TreeModelLabelProvider extends ColumnLabelProvider void updateComplete(ILabelUpdate update) { fUpdatesInProgress.remove(update); - if (DebugUIPlugin.DEBUG_UPDATE_SEQUENCE && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(getPresentationContext())) { - DebugUIPlugin.trace("\tEND - " + update); //$NON-NLS-1$ + if (DebugUIPlugin.DEBUG_UPDATE_SEQUENCE && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(getPresentationContext())) { + DebugUIPlugin.trace("\tEND - " + update); //$NON-NLS-1$ } notifyUpdate(TreeModelContentProvider.UPDATE_COMPLETE, update); if (fUpdatesInProgress.isEmpty()) { - if (DebugUIPlugin.DEBUG_UPDATE_SEQUENCE && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(getPresentationContext())) { - DebugUIPlugin.trace("LABEL SEQUENCE ENDS"); //$NON-NLS-1$ + if (DebugUIPlugin.DEBUG_UPDATE_SEQUENCE && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(getPresentationContext())) { + DebugUIPlugin.trace("LABEL SEQUENCE ENDS"); //$NON-NLS-1$ } notifyUpdate(TreeModelContentProvider.UPDATE_SEQUENCE_COMPLETE, null); } @@ -505,7 +505,7 @@ public class TreeModelLabelProvider extends ColumnLabelProvider @Override public void modelChanged(IModelDelta delta, IModelProxy proxy) { - delta.accept(fCancelPendingUpdatesVisitor); - } + delta.accept(fCancelPendingUpdatesVisitor); + } } diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ViewerAdapterService.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ViewerAdapterService.java index ad74f09e2..293f64366 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ViewerAdapterService.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ViewerAdapterService.java @@ -38,45 +38,45 @@ import org.eclipse.jface.viewers.IStructuredSelection; public class ViewerAdapterService { - /** - * Returns the content provider for the given element or - * <code>null</code> if none. - * - * @param element element to retrieve adapter for - * @return content provider or <code>null</code> - */ - public static IElementContentProvider getContentProvider(Object element) { - return (IElementContentProvider)getAdapter(element, IElementContentProvider.class); - } + /** + * Returns the content provider for the given element or + * <code>null</code> if none. + * + * @param element element to retrieve adapter for + * @return content provider or <code>null</code> + */ + public static IElementContentProvider getContentProvider(Object element) { + return (IElementContentProvider)getAdapter(element, IElementContentProvider.class); + } - /** - * Returns the label provider for the given element or - * <code>null</code> if none. - * - * @param element element to retrieve adapter for - * @return label provider or <code>null</code> - */ - public static IElementLabelProvider getLabelProvider(Object element) { - IElementLabelProvider lp = (IElementLabelProvider)getAdapter(element, IElementLabelProvider.class); - if (lp == null && element instanceof String) { - // there are no adapters registered for Strings - return new DebugElementAdapterFactory().getAdapter(element, IElementLabelProvider.class); - } - return lp; - } + /** + * Returns the label provider for the given element or + * <code>null</code> if none. + * + * @param element element to retrieve adapter for + * @return label provider or <code>null</code> + */ + public static IElementLabelProvider getLabelProvider(Object element) { + IElementLabelProvider lp = (IElementLabelProvider)getAdapter(element, IElementLabelProvider.class); + if (lp == null && element instanceof String) { + // there are no adapters registered for Strings + return new DebugElementAdapterFactory().getAdapter(element, IElementLabelProvider.class); + } + return lp; + } - /** - * Returns the column presentation factory for the given element or <code>null</code>. - * - * @param element element to retrieve adapter for - * @return column presentation factory of <code>null</code> - */ - public static IColumnPresentationFactory getColumnPresentationFactory(Object element) { - return (IColumnPresentationFactory)getAdapter(element, IColumnPresentationFactory.class); - } + /** + * Returns the column presentation factory for the given element or <code>null</code>. + * + * @param element element to retrieve adapter for + * @return column presentation factory of <code>null</code> + */ + public static IColumnPresentationFactory getColumnPresentationFactory(Object element) { + return (IColumnPresentationFactory)getAdapter(element, IColumnPresentationFactory.class); + } /** - * Returns the model proxy factory for the given element or + * Returns the model proxy factory for the given element or * <code>null</code> if none. * * @param element element to retrieve adapter for @@ -87,15 +87,15 @@ public class ViewerAdapterService { } /** - * Returns the model proxy factory v.2 for the given element or - * <code>null</code> if none. - * - * @param element element to retrieve adapter for - * @return model proxy factory or <code>null</code> - */ - public static IModelProxyFactory2 getModelProxyFactory2(Object element) { - return (IModelProxyFactory2)getAdapter(element, IModelProxyFactory2.class); - } + * Returns the model proxy factory v.2 for the given element or + * <code>null</code> if none. + * + * @param element element to retrieve adapter for + * @return model proxy factory or <code>null</code> + */ + public static IModelProxyFactory2 getModelProxyFactory2(Object element) { + return (IModelProxyFactory2)getAdapter(element, IModelProxyFactory2.class); + } /** * Returns the memento provider for the given element or @@ -108,15 +108,15 @@ public class ViewerAdapterService { return (IElementMementoProvider)getAdapter(element, IElementMementoProvider.class); } - /** - * Returns the element editor for the given element or <code>null</code>. - * - * @param element element to retrieve adapter for - * @return element editor or <code>null</code> - */ - public static IElementEditor getElementEditor(Object element) { - return (IElementEditor)getAdapter(element, IElementEditor.class); - } + /** + * Returns the element editor for the given element or <code>null</code>. + * + * @param element element to retrieve adapter for + * @return element editor or <code>null</code> + */ + public static IElementEditor getElementEditor(Object element) { + return (IElementEditor)getAdapter(element, IElementEditor.class); + } /** * Creates and returns the selection policy associated with the given selection @@ -138,16 +138,16 @@ public class ViewerAdapterService { return null; } - /** - * Returns the viewer input provider for the given element or - * <code>null</code> if none. - * - * @param element element to retrieve adapter for - * @return viewer input provider or <code>null</code> - */ - public static IViewerInputProvider getInputProvider(Object element) { - return (IViewerInputProvider)getAdapter(element, IViewerInputProvider.class); - } + /** + * Returns the viewer input provider for the given element or + * <code>null</code> if none. + * + * @param element element to retrieve adapter for + * @return viewer input provider or <code>null</code> + */ + public static IViewerInputProvider getInputProvider(Object element) { + return (IViewerInputProvider)getAdapter(element, IViewerInputProvider.class); + } /** * Returns an adapter of the specified type for the given object or <code>null</code> @@ -158,6 +158,6 @@ public class ViewerAdapterService { * @return adapter or <code>null</code> */ private static Object getAdapter(Object element, Class<?> type) { - return DebugPlugin.getAdapter(element, type); + return DebugPlugin.getAdapter(element, type); } } diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ViewerInputUpdate.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ViewerInputUpdate.java index 77ac587fd..60336ac97 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ViewerInputUpdate.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ViewerInputUpdate.java @@ -33,90 +33,90 @@ import org.eclipse.ui.progress.WorkbenchJob; */ public class ViewerInputUpdate extends Request implements IViewerInputUpdate { - /** - * Presentation context - */ - private IPresentationContext fContext; - - /** - * New viewer input - */ - private Object fSource; - - /** - * Whether this update is done - */ - private boolean fDone; - - /** - * Viewer input to use - */ - private Object fInputElement; - - /** - * Viewer input at the time the request was made - */ - private Object fViewerInput; - - /** - * Client making request - */ - private IViewerInputRequestor fRequestor; - - /** - * When <code>done()</code> is called, the viewer must be informed that the update is complete in the UI thread. - */ - protected WorkbenchJob fViewerInputUpdateJob = new WorkbenchJob("Asynchronous viewer input update") { //$NON-NLS-1$ - @Override + /** + * Presentation context + */ + private IPresentationContext fContext; + + /** + * New viewer input + */ + private Object fSource; + + /** + * Whether this update is done + */ + private boolean fDone; + + /** + * Viewer input to use + */ + private Object fInputElement; + + /** + * Viewer input at the time the request was made + */ + private Object fViewerInput; + + /** + * Client making request + */ + private IViewerInputRequestor fRequestor; + + /** + * When <code>done()</code> is called, the viewer must be informed that the update is complete in the UI thread. + */ + protected WorkbenchJob fViewerInputUpdateJob = new WorkbenchJob("Asynchronous viewer input update") { //$NON-NLS-1$ + @Override public IStatus runInUIThread(IProgressMonitor monitor) { - if (ViewerInputUpdate.this.isCanceled()){ - return Status.CANCEL_STATUS; - } - fRequestor.viewerInputComplete(ViewerInputUpdate.this); - return Status.OK_STATUS; - } - }; - - /** - * Constructs a viewer input update request. - * - * @param context presentation context - * @param viewerInput viewer input at the time the request was made - * @param requestor client making the request - * @param source source from which to derive a viewer input - */ - public ViewerInputUpdate(IPresentationContext context, Object viewerInput, IViewerInputRequestor requestor, Object source){ - fContext = context; - fSource = source; - fRequestor = requestor; - fViewerInputUpdateJob.setSystem(true); - fViewerInput = viewerInput; - } + if (ViewerInputUpdate.this.isCanceled()){ + return Status.CANCEL_STATUS; + } + fRequestor.viewerInputComplete(ViewerInputUpdate.this); + return Status.OK_STATUS; + } + }; + + /** + * Constructs a viewer input update request. + * + * @param context presentation context + * @param viewerInput viewer input at the time the request was made + * @param requestor client making the request + * @param source source from which to derive a viewer input + */ + public ViewerInputUpdate(IPresentationContext context, Object viewerInput, IViewerInputRequestor requestor, Object source){ + fContext = context; + fSource = source; + fRequestor = requestor; + fViewerInputUpdateJob.setSystem(true); + fViewerInput = viewerInput; + } @Override public IPresentationContext getPresentationContext() { return fContext; } - @Override + @Override public final void done() { - synchronized (this) { - if (isDone()) { - return; - } - fDone = true; + synchronized (this) { + if (isDone()) { + return; + } + fDone = true; } - fViewerInputUpdateJob.schedule(); + fViewerInputUpdateJob.schedule(); } - /** - * Returns whether this request is done yet. - * - * @return whether this request is done yet - */ - protected synchronized boolean isDone() { - return fDone; - } + /** + * Returns whether this request is done yet. + * + * @return whether this request is done yet + */ + protected synchronized boolean isDone() { + return fDone; + } @Override public Object getElement() { diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ViewerStateTracker.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ViewerStateTracker.java index 4fb884148..4ddb63f31 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ViewerStateTracker.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ViewerStateTracker.java @@ -77,208 +77,208 @@ import org.eclipse.ui.XMLMemento; */ class ViewerStateTracker { - // State update type constants used in notifying listeners - static final int STATE_SAVE_SEQUENCE_BEGINS = 4; - static final int STATE_SAVE_SEQUENCE_COMPLETE = 5; - static final int STATE_RESTORE_SEQUENCE_BEGINS = 6; - static final int STATE_RESTORE_SEQUENCE_COMPLETE = 7; - - /** - * Dummy marker element used in the state delta. The marker indicates that a - * given element in the pending state delta has been removed. It replaces - * the original element so that it may optionally be garbage collected. - */ - private final static String ELEMENT_REMOVED = "ELEMENT_REMOVED"; //$NON-NLS-1$ - - /** - * Collector of memento encoding requests. - */ - interface IElementMementoCollector { - - /** - * Adds the request to this manager. - * - * @param request to add - */ - void addRequest(ElementMementoRequest request); - - /** - * Notification the request is complete. - * - * @param request that was completed - */ - void requestComplete(ElementMementoRequest request); - - /** - * Process the queued requests. Accepts no more new requests. - */ - void processReqeusts(); - - /** - * Cancels the requests in progress. - */ - void cancel(); - } - - /** - * LRU cache for viewer states - */ + // State update type constants used in notifying listeners + static final int STATE_SAVE_SEQUENCE_BEGINS = 4; + static final int STATE_SAVE_SEQUENCE_COMPLETE = 5; + static final int STATE_RESTORE_SEQUENCE_BEGINS = 6; + static final int STATE_RESTORE_SEQUENCE_COMPLETE = 7; + + /** + * Dummy marker element used in the state delta. The marker indicates that a + * given element in the pending state delta has been removed. It replaces + * the original element so that it may optionally be garbage collected. + */ + private final static String ELEMENT_REMOVED = "ELEMENT_REMOVED"; //$NON-NLS-1$ + + /** + * Collector of memento encoding requests. + */ + interface IElementMementoCollector { + + /** + * Adds the request to this manager. + * + * @param request to add + */ + void addRequest(ElementMementoRequest request); + + /** + * Notification the request is complete. + * + * @param request that was completed + */ + void requestComplete(ElementMementoRequest request); + + /** + * Process the queued requests. Accepts no more new requests. + */ + void processReqeusts(); + + /** + * Cancels the requests in progress. + */ + void cancel(); + } + + /** + * LRU cache for viewer states + */ class LRUMap<K, V> extends LinkedHashMap<K, V> { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; - private int fMaxSize; + private int fMaxSize; - LRUMap(int maxSize) { - super(); - fMaxSize = maxSize; - } + LRUMap(int maxSize) { + super(); + fMaxSize = maxSize; + } - @Override + @Override protected boolean removeEldestEntry(Entry<K, V> eldest) { - return size() > fMaxSize; - } - } - - /** - * Content provider that is using this state tracker. - */ - private TreeModelContentProvider fContentProvider; - - ViewerStateTracker(TreeModelContentProvider contentProvider) { - fContentProvider = contentProvider; - } - - /** - * Map of viewer states keyed by viewer input mementos - */ + return size() > fMaxSize; + } + } + + /** + * Content provider that is using this state tracker. + */ + private TreeModelContentProvider fContentProvider; + + ViewerStateTracker(TreeModelContentProvider contentProvider) { + fContentProvider = contentProvider; + } + + /** + * Map of viewer states keyed by viewer input mementos + */ private Map<String, ModelDelta> fViewerStates = new LRUMap<>(20); - /** - * Pending viewer state to be restored - */ - private ModelDelta fPendingState = null; + /** + * Pending viewer state to be restored + */ + private ModelDelta fPendingState = null; - /** - * Flag indicating that the content provider is performing - * state restore operations. - */ - private boolean fInStateRestore = false; + /** + * Flag indicating that the content provider is performing + * state restore operations. + */ + private boolean fInStateRestore = false; - /** - * State update listeners - */ + /** + * State update listeners + */ private ListenerList<IStateUpdateListener> fStateUpdateListeners = new ListenerList<>(); - /** - * Postpone restoring REVEAL element until the current updates are complete. - * See bug 324100 - */ - protected PendingRevealDelta fPendingSetTopItem = null; + /** + * Postpone restoring REVEAL element until the current updates are complete. + * See bug 324100 + */ + protected PendingRevealDelta fPendingSetTopItem = null; - /** - * Set of IMementoManager's that are currently saving state - */ + /** + * Set of IMementoManager's that are currently saving state + */ private Set<IElementMementoCollector> fPendingStateSaves = new HashSet<>(); - /** - * Used to queue a viewer input for state restore - */ - private Object fQueuedRestore = null; + /** + * Used to queue a viewer input for state restore + */ + private Object fQueuedRestore = null; - /** - * Object used to key compare requests in map. - */ - private static class CompareRequestKey { + /** + * Object used to key compare requests in map. + */ + private static class CompareRequestKey { - CompareRequestKey(TreePath path, IModelDelta delta) { - fPath = path; - fDelta = delta; - } + CompareRequestKey(TreePath path, IModelDelta delta) { + fPath = path; + fDelta = delta; + } - TreePath fPath; - IModelDelta fDelta; + TreePath fPath; + IModelDelta fDelta; - @Override + @Override public boolean equals(Object obj) { - if (obj instanceof CompareRequestKey) { - CompareRequestKey key = (CompareRequestKey) obj; - return key.fDelta.equals(fDelta) && key.fPath.equals(fPath); - } - return false; - } - - @Override + if (obj instanceof CompareRequestKey) { + CompareRequestKey key = (CompareRequestKey) obj; + return key.fDelta.equals(fDelta) && key.fPath.equals(fPath); + } + return false; + } + + @Override public int hashCode() { - return fDelta.hashCode() + fPath.hashCode(); - } - } + return fDelta.hashCode() + fPath.hashCode(); + } + } - /** - * Compare requests that are currently running. - */ + /** + * Compare requests that are currently running. + */ private Map<CompareRequestKey, ElementCompareRequest> fCompareRequestsInProgress = new LinkedHashMap<>(); - /** - * Cancels pending updates. - */ - void dispose() { - Assert.isTrue( fContentProvider.getViewer().getDisplay().getThread() == Thread.currentThread() ); + /** + * Cancels pending updates. + */ + void dispose() { + Assert.isTrue( fContentProvider.getViewer().getDisplay().getThread() == Thread.currentThread() ); for (IElementMementoCollector emc : fPendingStateSaves) { emc.cancel(); - } - fStateUpdateListeners.clear(); + } + fStateUpdateListeners.clear(); for (ElementCompareRequest ecr : fCompareRequestsInProgress.values()) { ecr.cancel(); - } - fCompareRequestsInProgress.clear(); - - if (fPendingSetTopItem != null) { - fPendingSetTopItem.dispose(); - } - } - - /** - * Restores viewer state for the given input - * - * @param input - * viewer input - */ - private void startRestoreViewerState(final Object input) { - Assert.isTrue( fContentProvider.getViewer().getDisplay().getThread() == Thread.currentThread() ); - - fPendingState = null; - final IElementMementoProvider defaultProvider = ViewerAdapterService.getMementoProvider(input); - if (defaultProvider != null) { - // build a model delta representing expansion and selection state - final ModelDelta delta = new ModelDelta(input, IModelDelta.NO_CHANGE); - final XMLMemento inputMemento = XMLMemento.createWriteRoot("VIEWER_INPUT_MEMENTO"); //$NON-NLS-1$ - final IElementMementoCollector manager = new IElementMementoCollector() { - - private IElementMementoRequest fRequest; - - @Override + } + fCompareRequestsInProgress.clear(); + + if (fPendingSetTopItem != null) { + fPendingSetTopItem.dispose(); + } + } + + /** + * Restores viewer state for the given input + * + * @param input + * viewer input + */ + private void startRestoreViewerState(final Object input) { + Assert.isTrue( fContentProvider.getViewer().getDisplay().getThread() == Thread.currentThread() ); + + fPendingState = null; + final IElementMementoProvider defaultProvider = ViewerAdapterService.getMementoProvider(input); + if (defaultProvider != null) { + // build a model delta representing expansion and selection state + final ModelDelta delta = new ModelDelta(input, IModelDelta.NO_CHANGE); + final XMLMemento inputMemento = XMLMemento.createWriteRoot("VIEWER_INPUT_MEMENTO"); //$NON-NLS-1$ + final IElementMementoCollector manager = new IElementMementoCollector() { + + private IElementMementoRequest fRequest; + + @Override public void requestComplete(ElementMementoRequest request) { - if (fContentProvider.isDisposed()) { + if (fContentProvider.isDisposed()) { return; } - notifyStateUpdate(input, TreeModelContentProvider.UPDATE_COMPLETE, request); - - if (!request.isCanceled() && (request.getStatus() == null || request.getStatus().isOK())) { - XMLMemento keyMemento = (XMLMemento) delta.getElement(); - StringWriter writer = new StringWriter(); - try { - keyMemento.save(writer); - final String keyMementoString = writer.toString(); - ModelDelta stateDelta = fViewerStates.get(keyMementoString); - if (stateDelta != null) { - if (DebugUIPlugin.DEBUG_STATE_SAVE_RESTORE && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(fContentProvider.getPresentationContext())) { - DebugUIPlugin.trace("STATE RESTORE INPUT COMARE ENDED : " + fRequest + " - MATCHING STATE FOUND"); //$NON-NLS-1$ //$NON-NLS-2$ - } - - // Process start of restore in an async cycle because we may still be inside inputChanged() - // call. I.e. the "input.equals(fContentProvider.getViewer().getInput())" test may fail. + notifyStateUpdate(input, TreeModelContentProvider.UPDATE_COMPLETE, request); + + if (!request.isCanceled() && (request.getStatus() == null || request.getStatus().isOK())) { + XMLMemento keyMemento = (XMLMemento) delta.getElement(); + StringWriter writer = new StringWriter(); + try { + keyMemento.save(writer); + final String keyMementoString = writer.toString(); + ModelDelta stateDelta = fViewerStates.get(keyMementoString); + if (stateDelta != null) { + if (DebugUIPlugin.DEBUG_STATE_SAVE_RESTORE && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(fContentProvider.getPresentationContext())) { + DebugUIPlugin.trace("STATE RESTORE INPUT COMARE ENDED : " + fRequest + " - MATCHING STATE FOUND"); //$NON-NLS-1$ //$NON-NLS-2$ + } + + // Process start of restore in an async cycle because we may still be inside inputChanged() + // call. I.e. the "input.equals(fContentProvider.getViewer().getInput())" test may fail. fContentProvider.getViewer().getDisplay().asyncExec(() -> { if (!fContentProvider.isDisposed() && input.equals(fContentProvider.getViewer().getInput())) { @@ -303,85 +303,85 @@ class ViewerStateTracker { } } }); - } else { - if (DebugUIPlugin.DEBUG_STATE_SAVE_RESTORE && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(fContentProvider.getPresentationContext())) { - DebugUIPlugin.trace("STATE RESTORE INPUT COMARE ENDED : " + fRequest + " - NO MATCHING STATE"); //$NON-NLS-1$ //$NON-NLS-2$ - } - } - } catch (IOException e) { - DebugUIPlugin.log(e); - } - } else { - notifyStateUpdate(input, STATE_RESTORE_SEQUENCE_BEGINS, null); - } - } - - @Override + } else { + if (DebugUIPlugin.DEBUG_STATE_SAVE_RESTORE && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(fContentProvider.getPresentationContext())) { + DebugUIPlugin.trace("STATE RESTORE INPUT COMARE ENDED : " + fRequest + " - NO MATCHING STATE"); //$NON-NLS-1$ //$NON-NLS-2$ + } + } + } catch (IOException e) { + DebugUIPlugin.log(e); + } + } else { + notifyStateUpdate(input, STATE_RESTORE_SEQUENCE_BEGINS, null); + } + } + + @Override public void processReqeusts() { - notifyStateUpdate(input, STATE_RESTORE_SEQUENCE_BEGINS, null); - if (DebugUIPlugin.DEBUG_STATE_SAVE_RESTORE && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(fContentProvider.getPresentationContext())) { - DebugUIPlugin.trace("STATE RESTORE INPUT COMARE BEGIN : " + fRequest); //$NON-NLS-1$ - } - notifyStateUpdate(input, TreeModelContentProvider.UPDATE_BEGINS, fRequest); - defaultProvider.encodeElements(new IElementMementoRequest[] { fRequest }); - } - - @Override + notifyStateUpdate(input, STATE_RESTORE_SEQUENCE_BEGINS, null); + if (DebugUIPlugin.DEBUG_STATE_SAVE_RESTORE && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(fContentProvider.getPresentationContext())) { + DebugUIPlugin.trace("STATE RESTORE INPUT COMARE BEGIN : " + fRequest); //$NON-NLS-1$ + } + notifyStateUpdate(input, TreeModelContentProvider.UPDATE_BEGINS, fRequest); + defaultProvider.encodeElements(new IElementMementoRequest[] { fRequest }); + } + + @Override public void addRequest(ElementMementoRequest req) { - fRequest = req; - } + fRequest = req; + } - @Override + @Override public void cancel() { - // not used - } - - }; - manager.addRequest( - new ElementMementoRequest(fContentProvider, fContentProvider.getViewer().getInput(), manager, - delta.getElement(), fContentProvider.getViewerTreePath(delta), inputMemento, delta)); - manager.processReqeusts(); - } else { - if (DebugUIPlugin.DEBUG_STATE_SAVE_RESTORE && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(fContentProvider.getPresentationContext())) { - DebugUIPlugin.trace("STATE RESTORE: No input memento provider"); //$NON-NLS-1$ - } - } - } - - /** - * Appends the state of the given subtree to the current pending delta. - * @param path Path to subtree to restore. - */ - void appendToPendingStateDelta(final TreePath path) { - if (fContentProvider.getViewer() == null) + // not used + } + + }; + manager.addRequest( + new ElementMementoRequest(fContentProvider, fContentProvider.getViewer().getInput(), manager, + delta.getElement(), fContentProvider.getViewerTreePath(delta), inputMemento, delta)); + manager.processReqeusts(); + } else { + if (DebugUIPlugin.DEBUG_STATE_SAVE_RESTORE && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(fContentProvider.getPresentationContext())) { + DebugUIPlugin.trace("STATE RESTORE: No input memento provider"); //$NON-NLS-1$ + } + } + } + + /** + * Appends the state of the given subtree to the current pending delta. + * @param path Path to subtree to restore. + */ + void appendToPendingStateDelta(final TreePath path) { + if (fContentProvider.getViewer() == null) { return; // Not initialized yet. } - if (DebugUIPlugin.DEBUG_STATE_SAVE_RESTORE && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(fContentProvider.getPresentationContext())) { - DebugUIPlugin.trace("STATE APPEND BEGIN: " + path.getLastSegment()); //$NON-NLS-1$ - } - - // build a model delta representing expansion and selection state - final ModelDelta appendDeltaRoot = new ModelDelta(fContentProvider.getViewer().getInput(), IModelDelta.NO_CHANGE); - ModelDelta delta = appendDeltaRoot; - for (int i = 0; i < path.getSegmentCount(); i++) { - delta = delta.addNode(path.getSegment(i), IModelDelta.NO_CHANGE); - } - - if (!fContentProvider.getViewer().saveElementState(path, delta, IModelDelta.COLLAPSE | IModelDelta.EXPAND | IModelDelta.SELECT)) { - // Path to save the state was not found or there was no - // (expansion) state to save! Abort. - if (DebugUIPlugin.DEBUG_STATE_SAVE_RESTORE && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(fContentProvider.getPresentationContext())) { - DebugUIPlugin.trace("STATE APPEND CANCEL: Element " + path.getLastSegment() + " not found."); //$NON-NLS-1$ //$NON-NLS-2$ - } - return; - } - - // Append a marker CONTENT flag to all the delta nodes that contain the - // EXPAND node. These - // markers are used by the restore logic to know when a delta node can - // be removed. + if (DebugUIPlugin.DEBUG_STATE_SAVE_RESTORE && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(fContentProvider.getPresentationContext())) { + DebugUIPlugin.trace("STATE APPEND BEGIN: " + path.getLastSegment()); //$NON-NLS-1$ + } + + // build a model delta representing expansion and selection state + final ModelDelta appendDeltaRoot = new ModelDelta(fContentProvider.getViewer().getInput(), IModelDelta.NO_CHANGE); + ModelDelta delta = appendDeltaRoot; + for (int i = 0; i < path.getSegmentCount(); i++) { + delta = delta.addNode(path.getSegment(i), IModelDelta.NO_CHANGE); + } + + if (!fContentProvider.getViewer().saveElementState(path, delta, IModelDelta.COLLAPSE | IModelDelta.EXPAND | IModelDelta.SELECT)) { + // Path to save the state was not found or there was no + // (expansion) state to save! Abort. + if (DebugUIPlugin.DEBUG_STATE_SAVE_RESTORE && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(fContentProvider.getPresentationContext())) { + DebugUIPlugin.trace("STATE APPEND CANCEL: Element " + path.getLastSegment() + " not found."); //$NON-NLS-1$ //$NON-NLS-2$ + } + return; + } + + // Append a marker CONTENT flag to all the delta nodes that contain the + // EXPAND node. These + // markers are used by the restore logic to know when a delta node can + // be removed. delta.accept((d, depth) -> { if ((d.getFlags() & IModelDelta.EXPAND) != 0) { ((ModelDelta) d).setFlags(d.getFlags() | IModelDelta.CONTENT); @@ -389,21 +389,21 @@ class ViewerStateTracker { return true; }); - if (DebugUIPlugin.DEBUG_STATE_SAVE_RESTORE && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(fContentProvider.getPresentationContext())) { - DebugUIPlugin.trace("\tAPPEND DELTA: " + appendDeltaRoot); //$NON-NLS-1$ - } - - if (fPendingState != null) { - // If the restore for the current input was never completed, - // preserve - // that restore along with the restore that was completed. - if (DebugUIPlugin.DEBUG_STATE_SAVE_RESTORE && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(fContentProvider.getPresentationContext())) { - DebugUIPlugin.trace("\tAPPEND OUTSTANDING RESTORE: " + fPendingState); //$NON-NLS-1$ - } - - // If the append delta is generated for a sub-tree, copy the pending delta - // attributes into the pending delta. - if (path.getSegmentCount() > 0) { + if (DebugUIPlugin.DEBUG_STATE_SAVE_RESTORE && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(fContentProvider.getPresentationContext())) { + DebugUIPlugin.trace("\tAPPEND DELTA: " + appendDeltaRoot); //$NON-NLS-1$ + } + + if (fPendingState != null) { + // If the restore for the current input was never completed, + // preserve + // that restore along with the restore that was completed. + if (DebugUIPlugin.DEBUG_STATE_SAVE_RESTORE && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(fContentProvider.getPresentationContext())) { + DebugUIPlugin.trace("\tAPPEND OUTSTANDING RESTORE: " + fPendingState); //$NON-NLS-1$ + } + + // If the append delta is generated for a sub-tree, copy the pending delta + // attributes into the pending delta. + if (path.getSegmentCount() > 0) { fPendingState.accept((pendingDeltaNode, depth) -> { TreePath pendingDeltaPath = fContentProvider.getViewerTreePath(pendingDeltaNode); if (path.startsWith(pendingDeltaPath, null)) { @@ -415,9 +415,9 @@ class ViewerStateTracker { } return false; }); - } + } - // Copy the pending state into the new appended state. + // Copy the pending state into the new appended state. fPendingState.accept((pendingDeltaNode, depth) -> { // Skip the top element if (pendingDeltaNode.getParentDelta() == null) { @@ -455,80 +455,80 @@ class ViewerStateTracker { return pendingDeltaNode.getChildCount() > 0; } }); - } - - if (appendDeltaRoot.getChildDeltas().length > 0) { - // Set the new delta root as the pending state delta. - if (fPendingState == null) { - notifyStateUpdate(appendDeltaRoot.getElement(), STATE_RESTORE_SEQUENCE_BEGINS, null); - } - fPendingState = appendDeltaRoot; - if (DebugUIPlugin.DEBUG_STATE_SAVE_RESTORE && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(fContentProvider.getPresentationContext())) { - DebugUIPlugin.trace("STATE APPEND COMPLETE " + fPendingState); //$NON-NLS-1$ - } - } else { - if (DebugUIPlugin.DEBUG_STATE_SAVE_RESTORE && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(fContentProvider.getPresentationContext())) { - DebugUIPlugin.trace("STATE APPEND CANCELED: No Data"); //$NON-NLS-1$ - } - } - } - - /** - * Saves the viewer's state for the previous input. * @param oldInput - * @param input the {@link ModelDelta} input - */ - protected void saveViewerState(Object input) { + } + + if (appendDeltaRoot.getChildDeltas().length > 0) { + // Set the new delta root as the pending state delta. + if (fPendingState == null) { + notifyStateUpdate(appendDeltaRoot.getElement(), STATE_RESTORE_SEQUENCE_BEGINS, null); + } + fPendingState = appendDeltaRoot; + if (DebugUIPlugin.DEBUG_STATE_SAVE_RESTORE && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(fContentProvider.getPresentationContext())) { + DebugUIPlugin.trace("STATE APPEND COMPLETE " + fPendingState); //$NON-NLS-1$ + } + } else { + if (DebugUIPlugin.DEBUG_STATE_SAVE_RESTORE && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(fContentProvider.getPresentationContext())) { + DebugUIPlugin.trace("STATE APPEND CANCELED: No Data"); //$NON-NLS-1$ + } + } + } + + /** + * Saves the viewer's state for the previous input. * @param oldInput + * @param input the {@link ModelDelta} input + */ + protected void saveViewerState(Object input) { for (Iterator<ElementCompareRequest> itr = fCompareRequestsInProgress.values().iterator(); itr.hasNext();) { - itr.next().cancel(); - itr.remove(); - } - - IElementMementoProvider stateProvider = ViewerAdapterService.getMementoProvider(input); - if (stateProvider != null) { - if (DebugUIPlugin.DEBUG_STATE_SAVE_RESTORE && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(fContentProvider.getPresentationContext())) { - DebugUIPlugin.trace("STATE SAVE BEGIN: " + input); //$NON-NLS-1$ - } - - // build a model delta representing expansion and selection state - final ModelDelta saveDeltaRoot = new ModelDelta(input, IModelDelta.NO_CHANGE); - buildViewerState(saveDeltaRoot); - if (DebugUIPlugin.DEBUG_STATE_SAVE_RESTORE && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(fContentProvider.getPresentationContext())) { - DebugUIPlugin.trace("\tSAVE DELTA FROM VIEW:\n" + saveDeltaRoot); //$NON-NLS-1$ - } - - // check if pending restore reveal - if (fPendingSetTopItem != null) { - // set back the pending reveal flag - ModelDelta revealDelta = fPendingSetTopItem.getDelta(); - revealDelta.setFlags(revealDelta.getFlags() | IModelDelta.REVEAL); - - fPendingSetTopItem.dispose(); - - ModelDelta saveDeltaNode = findSubDeltaParent(saveDeltaRoot, revealDelta); - if (saveDeltaNode != null) { - clearRevealFlag(saveDeltaRoot); - ModelDelta child = saveDeltaNode.getChildDelta(revealDelta.getElement(), revealDelta.getIndex()); - if (child != null) { - child.setFlags(child.getFlags() | IModelDelta.REVEAL); - } else { - // the node should be added if not found - saveDeltaNode.setChildCount(revealDelta.getParentDelta().getChildCount()); - copyIntoDelta(revealDelta, saveDeltaNode); - } - } else { - if (DebugUIPlugin.DEBUG_STATE_SAVE_RESTORE && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(fContentProvider.getPresentationContext())) { - DebugUIPlugin.trace("\tSKIPPED: " + revealDelta.getElement()); //$NON-NLS-1$ - } - } - } - - if (fPendingState != null) { - // If the restore for the current input was never completed, - // preserve - // that restore along with the restore that was completed. - if (DebugUIPlugin.DEBUG_STATE_SAVE_RESTORE && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(fContentProvider.getPresentationContext())) { - DebugUIPlugin.trace("\tSAVE OUTSTANDING RESTORE: " + fPendingState); //$NON-NLS-1$ - } + itr.next().cancel(); + itr.remove(); + } + + IElementMementoProvider stateProvider = ViewerAdapterService.getMementoProvider(input); + if (stateProvider != null) { + if (DebugUIPlugin.DEBUG_STATE_SAVE_RESTORE && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(fContentProvider.getPresentationContext())) { + DebugUIPlugin.trace("STATE SAVE BEGIN: " + input); //$NON-NLS-1$ + } + + // build a model delta representing expansion and selection state + final ModelDelta saveDeltaRoot = new ModelDelta(input, IModelDelta.NO_CHANGE); + buildViewerState(saveDeltaRoot); + if (DebugUIPlugin.DEBUG_STATE_SAVE_RESTORE && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(fContentProvider.getPresentationContext())) { + DebugUIPlugin.trace("\tSAVE DELTA FROM VIEW:\n" + saveDeltaRoot); //$NON-NLS-1$ + } + + // check if pending restore reveal + if (fPendingSetTopItem != null) { + // set back the pending reveal flag + ModelDelta revealDelta = fPendingSetTopItem.getDelta(); + revealDelta.setFlags(revealDelta.getFlags() | IModelDelta.REVEAL); + + fPendingSetTopItem.dispose(); + + ModelDelta saveDeltaNode = findSubDeltaParent(saveDeltaRoot, revealDelta); + if (saveDeltaNode != null) { + clearRevealFlag(saveDeltaRoot); + ModelDelta child = saveDeltaNode.getChildDelta(revealDelta.getElement(), revealDelta.getIndex()); + if (child != null) { + child.setFlags(child.getFlags() | IModelDelta.REVEAL); + } else { + // the node should be added if not found + saveDeltaNode.setChildCount(revealDelta.getParentDelta().getChildCount()); + copyIntoDelta(revealDelta, saveDeltaNode); + } + } else { + if (DebugUIPlugin.DEBUG_STATE_SAVE_RESTORE && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(fContentProvider.getPresentationContext())) { + DebugUIPlugin.trace("\tSKIPPED: " + revealDelta.getElement()); //$NON-NLS-1$ + } + } + } + + if (fPendingState != null) { + // If the restore for the current input was never completed, + // preserve + // that restore along with the restore that was completed. + if (DebugUIPlugin.DEBUG_STATE_SAVE_RESTORE && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(fContentProvider.getPresentationContext())) { + DebugUIPlugin.trace("\tSAVE OUTSTANDING RESTORE: " + fPendingState); //$NON-NLS-1$ + } IModelDeltaVisitor pendingStateVisitor = (pendingDeltaNode, depth) -> { // Ignore the top element. @@ -577,184 +577,184 @@ class ViewerStateTracker { return pendingDeltaNode.getChildCount() > 0; } }; - fPendingState.accept(pendingStateVisitor); - } - - if (saveDeltaRoot.getChildDeltas().length > 0) { - // encode delta with mementos in place of elements, in non-UI - // thread - encodeDelta(saveDeltaRoot, stateProvider); - } else { - if (DebugUIPlugin.DEBUG_STATE_SAVE_RESTORE && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(fContentProvider.getPresentationContext())) { - DebugUIPlugin.trace("STATE SAVE CANCELED, NO DATA"); //$NON-NLS-1$ - } - } - } - } - - private void clearRevealFlag(ModelDelta saveRootDelta) { + fPendingState.accept(pendingStateVisitor); + } + + if (saveDeltaRoot.getChildDeltas().length > 0) { + // encode delta with mementos in place of elements, in non-UI + // thread + encodeDelta(saveDeltaRoot, stateProvider); + } else { + if (DebugUIPlugin.DEBUG_STATE_SAVE_RESTORE && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(fContentProvider.getPresentationContext())) { + DebugUIPlugin.trace("STATE SAVE CANCELED, NO DATA"); //$NON-NLS-1$ + } + } + } + } + + private void clearRevealFlag(ModelDelta saveRootDelta) { IModelDeltaVisitor clearDeltaVisitor = (delta, depth) -> { if ((delta.getFlags() & IModelDelta.REVEAL) != 0) { ((ModelDelta) delta).setFlags(delta.getFlags() & ~IModelDelta.REVEAL); } return true; }; - saveRootDelta.accept(clearDeltaVisitor); - } + saveRootDelta.accept(clearDeltaVisitor); + } - private ModelDelta findSubDeltaParent(ModelDelta destinationDeltaRoot, IModelDelta subDelta) { - // Create a path of elements to the sub-delta. + private ModelDelta findSubDeltaParent(ModelDelta destinationDeltaRoot, IModelDelta subDelta) { + // Create a path of elements to the sub-delta. LinkedList<IModelDelta> deltaPath = new LinkedList<>(); - IModelDelta delta = subDelta; - while (delta.getParentDelta() != null) { - delta = delta.getParentDelta(); - deltaPath.addFirst(delta); - } - - // For each element in the path of the sub-delta, find the corresponding - // element in the destination delta + IModelDelta delta = subDelta; + while (delta.getParentDelta() != null) { + delta = delta.getParentDelta(); + deltaPath.addFirst(delta); + } + + // For each element in the path of the sub-delta, find the corresponding + // element in the destination delta Iterator<IModelDelta> itr = deltaPath.iterator(); - // Skip the root element - itr.next(); - ModelDelta saveDelta = destinationDeltaRoot; - while (saveDelta != null && itr.hasNext()) { - IModelDelta itrDelta = itr.next(); - saveDelta = saveDelta.getChildDelta(itrDelta.getElement(), itrDelta.getIndex()); - } - return saveDelta; - } - - private ModelDelta findDeltaForPath(ModelDelta root, TreePath path) { - ModelDelta delta = root; - for (int i = 0; i < path.getSegmentCount(); i++) { - delta = delta.getChildDelta(path.getSegment(i)); - if (delta == null) { - return null; - } - } - return delta; - } - - private boolean isDeltaInParent(IModelDelta delta, ModelDelta destParent) { - return destParent.getChildDelta(delta.getElement(), delta.getIndex()) != null; - } - - private void copyIntoDelta(IModelDelta delta, ModelDelta destParent) { - ModelDelta newDelta = destParent.addNode(delta.getElement(), delta.getIndex(), delta.getFlags(), delta - .getChildCount()); - for (int i = 0; i < delta.getChildDeltas().length; i++) { - copyIntoDelta(delta.getChildDeltas()[i], newDelta); - } - } - - /** - * Encodes delta elements into mementos using the given provider. - * @param rootDelta the {@link ModelDelta} to encode - * @param defaultProvider the default provider to use when processing the given delta - * - */ - protected void encodeDelta(final ModelDelta rootDelta, final IElementMementoProvider defaultProvider) { - final Object input = rootDelta.getElement(); - final XMLMemento inputMemento = XMLMemento.createWriteRoot("VIEWER_INPUT_MEMENTO"); //$NON-NLS-1$ - final XMLMemento childrenMemento = XMLMemento.createWriteRoot("CHILDREN_MEMENTO"); //$NON-NLS-1$ - final IElementMementoCollector manager = new IElementMementoCollector() { - - /** - * list of memento fRequests - */ + // Skip the root element + itr.next(); + ModelDelta saveDelta = destinationDeltaRoot; + while (saveDelta != null && itr.hasNext()) { + IModelDelta itrDelta = itr.next(); + saveDelta = saveDelta.getChildDelta(itrDelta.getElement(), itrDelta.getIndex()); + } + return saveDelta; + } + + private ModelDelta findDeltaForPath(ModelDelta root, TreePath path) { + ModelDelta delta = root; + for (int i = 0; i < path.getSegmentCount(); i++) { + delta = delta.getChildDelta(path.getSegment(i)); + if (delta == null) { + return null; + } + } + return delta; + } + + private boolean isDeltaInParent(IModelDelta delta, ModelDelta destParent) { + return destParent.getChildDelta(delta.getElement(), delta.getIndex()) != null; + } + + private void copyIntoDelta(IModelDelta delta, ModelDelta destParent) { + ModelDelta newDelta = destParent.addNode(delta.getElement(), delta.getIndex(), delta.getFlags(), delta + .getChildCount()); + for (int i = 0; i < delta.getChildDeltas().length; i++) { + copyIntoDelta(delta.getChildDeltas()[i], newDelta); + } + } + + /** + * Encodes delta elements into mementos using the given provider. + * @param rootDelta the {@link ModelDelta} to encode + * @param defaultProvider the default provider to use when processing the given delta + * + */ + protected void encodeDelta(final ModelDelta rootDelta, final IElementMementoProvider defaultProvider) { + final Object input = rootDelta.getElement(); + final XMLMemento inputMemento = XMLMemento.createWriteRoot("VIEWER_INPUT_MEMENTO"); //$NON-NLS-1$ + final XMLMemento childrenMemento = XMLMemento.createWriteRoot("CHILDREN_MEMENTO"); //$NON-NLS-1$ + final IElementMementoCollector manager = new IElementMementoCollector() { + + /** + * list of memento fRequests + */ private List<IElementMementoRequest> fRequests = new ArrayList<>(); - /** - * Flag indicating whether the encoding of delta has been canceled. - */ - private boolean fCanceled = false; + /** + * Flag indicating whether the encoding of delta has been canceled. + */ + private boolean fCanceled = false; - @Override + @Override public void requestComplete(ElementMementoRequest request) { - Assert.isTrue( fContentProvider.getViewer().getDisplay().getThread() == Thread.currentThread() ); - - notifyStateUpdate(input, TreeModelContentProvider.UPDATE_COMPLETE, request); - if (DebugUIPlugin.DEBUG_STATE_SAVE_RESTORE && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(fContentProvider.getPresentationContext())) { - DebugUIPlugin.trace("\tSTATE END: " + request); //$NON-NLS-1$ - } - - if (!request.isCanceled() && (request.getStatus() == null || request.getStatus().isOK())) { - boolean requestsComplted = false; - if (!fCanceled) { - fRequests.remove(request); - requestsComplted = fRequests.isEmpty(); - } - if (requestsComplted) { - XMLMemento keyMemento = (XMLMemento) rootDelta.getElement(); - StringWriter writer = new StringWriter(); - try { - keyMemento.save(writer); - fViewerStates.put(writer.toString(), rootDelta); - } catch (IOException e) { - DebugUIPlugin.log(e); - } - if (DebugUIPlugin.DEBUG_STATE_SAVE_RESTORE && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(fContentProvider.getPresentationContext())) { - DebugUIPlugin.trace("STATE SAVE COMPLETED: " + rootDelta); //$NON-NLS-1$ - } - stateSaveComplete(input, this); - } - } else { - cancel(); - } - } - - @Override + Assert.isTrue( fContentProvider.getViewer().getDisplay().getThread() == Thread.currentThread() ); + + notifyStateUpdate(input, TreeModelContentProvider.UPDATE_COMPLETE, request); + if (DebugUIPlugin.DEBUG_STATE_SAVE_RESTORE && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(fContentProvider.getPresentationContext())) { + DebugUIPlugin.trace("\tSTATE END: " + request); //$NON-NLS-1$ + } + + if (!request.isCanceled() && (request.getStatus() == null || request.getStatus().isOK())) { + boolean requestsComplted = false; + if (!fCanceled) { + fRequests.remove(request); + requestsComplted = fRequests.isEmpty(); + } + if (requestsComplted) { + XMLMemento keyMemento = (XMLMemento) rootDelta.getElement(); + StringWriter writer = new StringWriter(); + try { + keyMemento.save(writer); + fViewerStates.put(writer.toString(), rootDelta); + } catch (IOException e) { + DebugUIPlugin.log(e); + } + if (DebugUIPlugin.DEBUG_STATE_SAVE_RESTORE && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(fContentProvider.getPresentationContext())) { + DebugUIPlugin.trace("STATE SAVE COMPLETED: " + rootDelta); //$NON-NLS-1$ + } + stateSaveComplete(input, this); + } + } else { + cancel(); + } + } + + @Override public void cancel() { - Assert.isTrue( fContentProvider.getViewer().getDisplay().getThread() == Thread.currentThread() ); + Assert.isTrue( fContentProvider.getViewer().getDisplay().getThread() == Thread.currentThread() ); - if (fCanceled) { - return; - } + if (fCanceled) { + return; + } - fCanceled = true; + fCanceled = true; for (IElementMementoRequest req : fRequests) { - req.cancel(); - } - fRequests.clear(); - if (DebugUIPlugin.DEBUG_STATE_SAVE_RESTORE && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(fContentProvider.getPresentationContext())) { - DebugUIPlugin.trace("STATE SAVE ABORTED: " + rootDelta.getElement()); //$NON-NLS-1$ - } - stateSaveComplete(input, this); - } - - @Override + req.cancel(); + } + fRequests.clear(); + if (DebugUIPlugin.DEBUG_STATE_SAVE_RESTORE && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(fContentProvider.getPresentationContext())) { + DebugUIPlugin.trace("STATE SAVE ABORTED: " + rootDelta.getElement()); //$NON-NLS-1$ + } + stateSaveComplete(input, this); + } + + @Override public void processReqeusts() { - Assert.isTrue( fContentProvider.getViewer().getDisplay().getThread() == Thread.currentThread() ); + Assert.isTrue( fContentProvider.getViewer().getDisplay().getThread() == Thread.currentThread() ); Map<IElementMementoProvider, List<IElementMementoRequest>> providers = new HashMap<>(); for (IElementMementoRequest request : fRequests) { - notifyStateUpdate(input, TreeModelContentProvider.UPDATE_BEGINS, request); - IElementMementoProvider provider = ViewerAdapterService.getMementoProvider(request.getElement()); - if (provider == null) { - provider = defaultProvider; - } + notifyStateUpdate(input, TreeModelContentProvider.UPDATE_BEGINS, request); + IElementMementoProvider provider = ViewerAdapterService.getMementoProvider(request.getElement()); + if (provider == null) { + provider = defaultProvider; + } List<IElementMementoRequest> reqs = providers.get(provider); - if (reqs == null) { + if (reqs == null) { reqs = new ArrayList<>(); - providers.put(provider, reqs); - } - reqs.add(request); - } + providers.put(provider, reqs); + } + reqs.add(request); + } for (Entry<IElementMementoProvider, List<IElementMementoRequest>> entry : providers.entrySet()) { - IElementMementoProvider provider = entry.getKey(); + IElementMementoProvider provider = entry.getKey(); List<IElementMementoRequest> reqs = entry.getValue(); provider.encodeElements(reqs.toArray(new IElementMementoRequest[reqs.size()])); - } - } + } + } - @Override + @Override public void addRequest(ElementMementoRequest request) { - Assert.isTrue( fContentProvider.getViewer().getDisplay().getThread() == Thread.currentThread() ); + Assert.isTrue( fContentProvider.getViewer().getDisplay().getThread() == Thread.currentThread() ); - fRequests.add(request); - } + fRequests.add(request); + } - }; + }; IModelDeltaVisitor visitor = (delta, depth) -> { // Add the CONTENT flag to all nodes with an EXPAND flag. // During restoring, this flag is used as a marker indicating @@ -778,94 +778,94 @@ class ViewerStateTracker { } return true; }; - rootDelta.accept(visitor); - stateSaveStarted(input, manager); - manager.processReqeusts(); - } - - /** - * Called when a state save is starting. - * @param input the {@link ModelDelta} input - * @param manager the manager to notify - */ - private void stateSaveStarted(Object input, IElementMementoCollector manager) { - Assert.isTrue( fContentProvider.getViewer().getDisplay().getThread() == Thread.currentThread() ); - - notifyStateUpdate(input, STATE_SAVE_SEQUENCE_BEGINS, null); - fPendingStateSaves.add(manager); - } - - /** - * Called when a state save is complete. - * @param input the {@link ModelDelta} input - * @param manager the manager to notify - */ - private void stateSaveComplete(Object input, IElementMementoCollector manager) { - Assert.isTrue( fContentProvider.getViewer().getDisplay().getThread() == Thread.currentThread() ); - - notifyStateUpdate(input, STATE_SAVE_SEQUENCE_COMPLETE, null); - fPendingStateSaves.remove(manager); - if (fQueuedRestore != null) { - Object temp = fQueuedRestore; - fQueuedRestore = null; - restoreViewerState(temp); - } - } - - /** - * Returns whether any state saving is in progress. - * - * @return whether any state saving is in progress - */ - private boolean isSavingState() { - Assert.isTrue( fContentProvider.getViewer().getDisplay().getThread() == Thread.currentThread() ); - - return !fPendingStateSaves.isEmpty(); - } - - /** - * Restores the viewer state unless a save is taking place. If a save is - * taking place, the restore is queued. - * - * @param input - * viewer input - */ - protected void restoreViewerState(final Object input) { - Assert.isTrue( fContentProvider.getViewer().getDisplay().getThread() == Thread.currentThread() ); - - fPendingState = null; - if (isSavingState()) { - fQueuedRestore = input; - } else { - startRestoreViewerState(input); - } - } - - - public void cancelRestore(final TreePath path, final int flags) { - if (fInStateRestore) { - // If we are currently processing pending state already, ignore - // cancelRestore requests. These requests may be triggered in the viewer - // by changes to the tree state (Bug 295585). - return; - } - - if ((flags & IModelDelta.REVEAL) != 0 && fPendingSetTopItem != null) { - fPendingSetTopItem.dispose(); - return; - } - - // Nothing else to do - if (fPendingState == null) { - return; - } - - if ((flags & (IModelDelta.SELECT | IModelDelta.REVEAL)) != 0) { - // If we're canceling reveal and this is waiting for updates to complete - // then just cancel it and return - - // If we're canceling select or reveal, cancel it for all of pending deltas - final int mask = flags & (IModelDelta.SELECT | IModelDelta.REVEAL); + rootDelta.accept(visitor); + stateSaveStarted(input, manager); + manager.processReqeusts(); + } + + /** + * Called when a state save is starting. + * @param input the {@link ModelDelta} input + * @param manager the manager to notify + */ + private void stateSaveStarted(Object input, IElementMementoCollector manager) { + Assert.isTrue( fContentProvider.getViewer().getDisplay().getThread() == Thread.currentThread() ); + + notifyStateUpdate(input, STATE_SAVE_SEQUENCE_BEGINS, null); + fPendingStateSaves.add(manager); + } + + /** + * Called when a state save is complete. + * @param input the {@link ModelDelta} input + * @param manager the manager to notify + */ + private void stateSaveComplete(Object input, IElementMementoCollector manager) { + Assert.isTrue( fContentProvider.getViewer().getDisplay().getThread() == Thread.currentThread() ); + + notifyStateUpdate(input, STATE_SAVE_SEQUENCE_COMPLETE, null); + fPendingStateSaves.remove(manager); + if (fQueuedRestore != null) { + Object temp = fQueuedRestore; + fQueuedRestore = null; + restoreViewerState(temp); + } + } + + /** + * Returns whether any state saving is in progress. + * + * @return whether any state saving is in progress + */ + private boolean isSavingState() { + Assert.isTrue( fContentProvider.getViewer().getDisplay().getThread() == Thread.currentThread() ); + + return !fPendingStateSaves.isEmpty(); + } + + /** + * Restores the viewer state unless a save is taking place. If a save is + * taking place, the restore is queued. + * + * @param input + * viewer input + */ + protected void restoreViewerState(final Object input) { + Assert.isTrue( fContentProvider.getViewer().getDisplay().getThread() == Thread.currentThread() ); + + fPendingState = null; + if (isSavingState()) { + fQueuedRestore = input; + } else { + startRestoreViewerState(input); + } + } + + + public void cancelRestore(final TreePath path, final int flags) { + if (fInStateRestore) { + // If we are currently processing pending state already, ignore + // cancelRestore requests. These requests may be triggered in the viewer + // by changes to the tree state (Bug 295585). + return; + } + + if ((flags & IModelDelta.REVEAL) != 0 && fPendingSetTopItem != null) { + fPendingSetTopItem.dispose(); + return; + } + + // Nothing else to do + if (fPendingState == null) { + return; + } + + if ((flags & (IModelDelta.SELECT | IModelDelta.REVEAL)) != 0) { + // If we're canceling reveal and this is waiting for updates to complete + // then just cancel it and return + + // If we're canceling select or reveal, cancel it for all of pending deltas + final int mask = flags & (IModelDelta.SELECT | IModelDelta.REVEAL); fPendingState.accept((delta, depth) -> { int deltaFlags = delta.getFlags(); int newFlags = deltaFlags & ~mask; @@ -879,10 +879,10 @@ class ViewerStateTracker { ((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. + } + 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((delta, depth) -> { if (depth < path.getSegmentCount()) { // Descend until we reach a matching depth. @@ -926,30 +926,30 @@ class ViewerStateTracker { return true; } }); - } - } - - - /** - * Perform any restoration required for the given tree path. - * <p> - * This method is called after every viewer update completion to continue - * restoring the expansion state that was previously saved. - * - * @param path the tree path to update - * @param modelIndex the index in the current model - * @param knowsHasChildren if the content provider knows it has children already - * @param knowsChildCount if the content provider knows the current child count already - * @param checkChildrenRealized if any realized children should be checked or not - */ - void restorePendingStateOnUpdate(final TreePath path, final int modelIndex, final boolean knowsHasChildren, - final boolean knowsChildCount, final boolean checkChildrenRealized) - { - Assert.isTrue( fContentProvider.getViewer().getDisplay().getThread() == Thread.currentThread() ); - - if (fPendingState == null) { - return; - } + } + } + + + /** + * Perform any restoration required for the given tree path. + * <p> + * This method is called after every viewer update completion to continue + * restoring the expansion state that was previously saved. + * + * @param path the tree path to update + * @param modelIndex the index in the current model + * @param knowsHasChildren if the content provider knows it has children already + * @param knowsChildCount if the content provider knows the current child count already + * @param checkChildrenRealized if any realized children should be checked or not + */ + void restorePendingStateOnUpdate(final TreePath path, final int modelIndex, final boolean knowsHasChildren, + final boolean knowsChildCount, final boolean checkChildrenRealized) + { + Assert.isTrue( fContentProvider.getViewer().getDisplay().getThread() == Thread.currentThread() ); + + if (fPendingState == null) { + return; + } IModelDeltaVisitor visitor = (delta, depth) -> { @@ -1000,81 +1000,81 @@ class ViewerStateTracker { return element.equals(potentialMatch); }; - try { - fInStateRestore = true; - fPendingState.accept(visitor); - } - finally { - fInStateRestore = false; - } - checkIfRestoreComplete(); - } - - /** - * Checks whether restoring pending state is already complete. - */ - void checkIfRestoreComplete() { - Assert.isTrue( fContentProvider.getViewer().getDisplay().getThread() == Thread.currentThread() ); - - if (fPendingState == null) { - return; - } - - /** - * Used to determine when restoration delta has been processed - */ - class CheckState implements IModelDeltaVisitor { - private boolean complete = true; - - @Override + try { + fInStateRestore = true; + fPendingState.accept(visitor); + } + finally { + fInStateRestore = false; + } + checkIfRestoreComplete(); + } + + /** + * Checks whether restoring pending state is already complete. + */ + void checkIfRestoreComplete() { + Assert.isTrue( fContentProvider.getViewer().getDisplay().getThread() == Thread.currentThread() ); + + if (fPendingState == null) { + return; + } + + /** + * Used to determine when restoration delta has been processed + */ + class CheckState implements IModelDeltaVisitor { + private boolean complete = true; + + @Override public boolean visit(IModelDelta delta, int depth) { - // Filter 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 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) { - TreePath deltaPath = fContentProvider.getViewerTreePath(delta); - if ( !fContentProvider.areElementUpdatesPending(deltaPath) && - (!(delta.getElement() instanceof IMemento) || !areMementoUpdatesPending(delta)) ) - { - removeDelta(delta); - return false; - } - } - - if (flags != IModelDelta.REVEAL || (delta.getElement() instanceof IMemento)) { - complete = false; - return false; - } - } - return true; - } - - public boolean isComplete() { - return complete; - } - - private boolean areMementoUpdatesPending(IModelDelta delta) { + // Filter 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 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) { + TreePath deltaPath = fContentProvider.getViewerTreePath(delta); + if ( !fContentProvider.areElementUpdatesPending(deltaPath) && + (!(delta.getElement() instanceof IMemento) || !areMementoUpdatesPending(delta)) ) + { + removeDelta(delta); + return false; + } + } + + if (flags != IModelDelta.REVEAL || (delta.getElement() instanceof IMemento)) { + complete = false; + return false; + } + } + return true; + } + + public boolean isComplete() { + return complete; + } + + private boolean areMementoUpdatesPending(IModelDelta delta) { for (CompareRequestKey key : fCompareRequestsInProgress.keySet()) { - if (delta.getElement().equals(key.fDelta.getElement())) { - return true; - } - } - return false; - } - - private void removeDelta(IModelDelta delta) { - if (DebugUIPlugin.DEBUG_STATE_SAVE_RESTORE && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(fContentProvider.getPresentationContext())) { - DebugUIPlugin.trace("\tRESTORE REMOVED: " + delta.getElement()); //$NON-NLS-1$ - } + if (delta.getElement().equals(key.fDelta.getElement())) { + return true; + } + } + return false; + } + + private void removeDelta(IModelDelta delta) { + if (DebugUIPlugin.DEBUG_STATE_SAVE_RESTORE && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(fContentProvider.getPresentationContext())) { + DebugUIPlugin.trace("\tRESTORE REMOVED: " + delta.getElement()); //$NON-NLS-1$ + } delta.accept((_visitorDelta, depth) -> { ModelDelta visitorDelta = (ModelDelta) _visitorDelta; @@ -1083,285 +1083,285 @@ class ViewerStateTracker { return true; }); - } - } - - CheckState state = new CheckState(); - fPendingState.accept(state); - if (state.isComplete()) { - // notify restore complete if REVEAL was restored also, otherwise - // postpone until then. - if (fPendingSetTopItem == null) { - if (DebugUIPlugin.DEBUG_STATE_SAVE_RESTORE && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(fContentProvider.getPresentationContext())) { - DebugUIPlugin.trace("STATE RESTORE COMPELTE: " + fPendingState); //$NON-NLS-1$ - } - - notifyStateUpdate(fPendingState.getElement(), STATE_RESTORE_SEQUENCE_COMPLETE, null); - } - - fPendingState = null; - } - } - - /** - * Restores the pending state in the given delta node. This method is called - * once the state tracker has found the element which matches the element in - * the given delta node. - * @param delta the {@link ModelDelta} to restore from - * @param knowsHasChildren if the content provider has computed its children - * @param knowsChildCount if the content provider has already computed the child count - * @param checkChildrenRealized if any realized children should be checked - */ - void restorePendingStateNode(final ModelDelta delta, boolean knowsHasChildren, boolean knowsChildCount, boolean checkChildrenRealized) { - final TreePath treePath = fContentProvider.getViewerTreePath(delta); - final IInternalTreeModelViewer viewer = fContentProvider.getViewer(); - - // Attempt to expand the node only if the children are known. - if (knowsHasChildren) { - if ((delta.getFlags() & IModelDelta.EXPAND) != 0) { - if (DebugUIPlugin.DEBUG_STATE_SAVE_RESTORE && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(fContentProvider.getPresentationContext())) { - DebugUIPlugin.trace("\tRESTORE EXPAND: " + treePath.getLastSegment()); //$NON-NLS-1$ - } - viewer.expandToLevel(treePath, 1); - delta.setFlags(delta.getFlags() & ~IModelDelta.EXPAND); - } - if ((delta.getFlags() & IModelDelta.COLLAPSE) != 0) { - if (DebugUIPlugin.DEBUG_STATE_SAVE_RESTORE && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(fContentProvider.getPresentationContext())) { - DebugUIPlugin.trace("\tRESTORE COLLAPSE: " + treePath.getLastSegment()); //$NON-NLS-1$ - } - // Check auto-expand before collapsing an element (bug 335734) - int autoexpand = fContentProvider.getViewer().getAutoExpandLevel(); - if (autoexpand != ITreeModelViewer.ALL_LEVELS && autoexpand < (treePath.getSegmentCount() + 1)) { - fContentProvider.getViewer().setExpandedState(treePath, false); - } - delta.setFlags(delta.getFlags() & ~IModelDelta.COLLAPSE); - } - } - - if ((delta.getFlags() & IModelDelta.SELECT) != 0) { - delta.setFlags(delta.getFlags() & ~IModelDelta.SELECT); - if (DebugUIPlugin.DEBUG_STATE_SAVE_RESTORE && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(fContentProvider.getPresentationContext())) { - DebugUIPlugin.trace("\tRESTORE SELECT: " + treePath.getLastSegment()); //$NON-NLS-1$ - } - ITreeSelection currentSelection = (ITreeSelection)viewer.getSelection(); - if (currentSelection == null || currentSelection.isEmpty()) { - viewer.setSelection(new TreeSelection(treePath), false, false); - } else { - TreePath[] currentPaths = currentSelection.getPaths(); - boolean pathInSelection = false; - for (int i = 0; i < currentPaths.length; i++) { - if (currentPaths[i].equals(treePath)) { - pathInSelection = true; - break; - } - } - // Only set the selection if the element is not yet in - // selection. Otherwise the setSelection() call will - // update selection listeners needlessly. - if (!pathInSelection) { - TreePath[] newPaths = new TreePath[currentPaths.length + 1]; - System.arraycopy(currentPaths, 0, newPaths, 0, currentPaths.length); - newPaths[newPaths.length - 1] = treePath; - viewer.setSelection(new TreeSelection(newPaths), false, false); - } - } - } - - if ((delta.getFlags() & IModelDelta.REVEAL) != 0) { - delta.setFlags(delta.getFlags() & ~IModelDelta.REVEAL); - // Look for the reveal flag in the child deltas. If - // A child delta has the reveal flag, do not set the - // top element yet. - boolean setTopItem = true; - IModelDelta[] childDeltas = delta.getChildDeltas(); - for (int i = 0; i < childDeltas.length; i++) { - IModelDelta childDelta = childDeltas[i]; - int modelIndex = childDelta.getIndex(); - if (modelIndex >= 0 && (childDelta.getFlags() & IModelDelta.REVEAL) != 0) { - setTopItem = false; - } - } - - if (setTopItem) { - Assert.isTrue(fPendingSetTopItem == null); - - fPendingSetTopItem = new PendingRevealDelta(treePath, delta); - viewer.addViewerUpdateListener(fPendingSetTopItem); - } - } - - // If we know the child count of the element, look for the reveal - // flag in the child deltas. For the children with reveal flag start - // a new update. - // If the child delta's index is out of range, strip the reveal flag - // since it is no longer applicable. - if (knowsChildCount) { - int childCount = viewer.getChildCount(treePath); - if (childCount >= 0) { - ModelDelta[] childDeltas = (ModelDelta[])delta.getChildDeltas(); - for (int i = 0; i < childDeltas.length; i++) { - ModelDelta childDelta = childDeltas[i]; - int modelIndex = childDelta.getIndex(); - if (modelIndex >= 0 && (childDelta.getFlags() & IModelDelta.REVEAL) != 0) { - if (modelIndex < childCount) { - fContentProvider.doUpdateElement(treePath, modelIndex); - } else { - childDelta.setFlags(childDelta.getFlags() & ~IModelDelta.REVEAL); - } - } - } - } - } - - // Some children of this element were just updated. If all its - // children are now realized, clear out any elements that still - // have flags, because they represent elements that were removed. - if ((checkChildrenRealized && - !fContentProvider.areChildrenUpdatesPending(treePath) && - fContentProvider.getViewer().getElementChildrenRealized(treePath)) || - (knowsHasChildren && !viewer.getHasChildren(treePath)) ) - { - if (DebugUIPlugin.DEBUG_STATE_SAVE_RESTORE && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(fContentProvider.getPresentationContext())) { - DebugUIPlugin.trace("\tRESTORE CONTENT: " + treePath.getLastSegment()); //$NON-NLS-1$ - } - delta.setFlags(delta.getFlags() & ~IModelDelta.CONTENT); - } - } - - /** - * Utility that reveals the saved top item in the viewer. It listens for - * all content updates to complete in order to avoid having the desired top item - * scroll out as view content is filled in. - * <br> - * Revealing some elements can trigger expanding some of elements - * that have been just revealed. Therefore, we have to check one - * more time after the new triggered updates are completed if we - * have to set again the top index - */ - private class PendingRevealDelta implements IViewerUpdateListener { - - private final TreePath fPathToReveal; - private final ModelDelta fRevealDelta; - - PendingRevealDelta(TreePath pathToReveal, ModelDelta revealDelta) { - fPathToReveal = pathToReveal; - fRevealDelta = revealDelta; - } - - /** - * Counter that tracks how many time the viewer updates were completed. - */ - private int fCounter = 0; - private Object fModelInput = fPendingState.getElement(); - - @Override + } + } + + CheckState state = new CheckState(); + fPendingState.accept(state); + if (state.isComplete()) { + // notify restore complete if REVEAL was restored also, otherwise + // postpone until then. + if (fPendingSetTopItem == null) { + if (DebugUIPlugin.DEBUG_STATE_SAVE_RESTORE && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(fContentProvider.getPresentationContext())) { + DebugUIPlugin.trace("STATE RESTORE COMPELTE: " + fPendingState); //$NON-NLS-1$ + } + + notifyStateUpdate(fPendingState.getElement(), STATE_RESTORE_SEQUENCE_COMPLETE, null); + } + + fPendingState = null; + } + } + + /** + * Restores the pending state in the given delta node. This method is called + * once the state tracker has found the element which matches the element in + * the given delta node. + * @param delta the {@link ModelDelta} to restore from + * @param knowsHasChildren if the content provider has computed its children + * @param knowsChildCount if the content provider has already computed the child count + * @param checkChildrenRealized if any realized children should be checked + */ + void restorePendingStateNode(final ModelDelta delta, boolean knowsHasChildren, boolean knowsChildCount, boolean checkChildrenRealized) { + final TreePath treePath = fContentProvider.getViewerTreePath(delta); + final IInternalTreeModelViewer viewer = fContentProvider.getViewer(); + + // Attempt to expand the node only if the children are known. + if (knowsHasChildren) { + if ((delta.getFlags() & IModelDelta.EXPAND) != 0) { + if (DebugUIPlugin.DEBUG_STATE_SAVE_RESTORE && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(fContentProvider.getPresentationContext())) { + DebugUIPlugin.trace("\tRESTORE EXPAND: " + treePath.getLastSegment()); //$NON-NLS-1$ + } + viewer.expandToLevel(treePath, 1); + delta.setFlags(delta.getFlags() & ~IModelDelta.EXPAND); + } + if ((delta.getFlags() & IModelDelta.COLLAPSE) != 0) { + if (DebugUIPlugin.DEBUG_STATE_SAVE_RESTORE && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(fContentProvider.getPresentationContext())) { + DebugUIPlugin.trace("\tRESTORE COLLAPSE: " + treePath.getLastSegment()); //$NON-NLS-1$ + } + // Check auto-expand before collapsing an element (bug 335734) + int autoexpand = fContentProvider.getViewer().getAutoExpandLevel(); + if (autoexpand != ITreeModelViewer.ALL_LEVELS && autoexpand < (treePath.getSegmentCount() + 1)) { + fContentProvider.getViewer().setExpandedState(treePath, false); + } + delta.setFlags(delta.getFlags() & ~IModelDelta.COLLAPSE); + } + } + + if ((delta.getFlags() & IModelDelta.SELECT) != 0) { + delta.setFlags(delta.getFlags() & ~IModelDelta.SELECT); + if (DebugUIPlugin.DEBUG_STATE_SAVE_RESTORE && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(fContentProvider.getPresentationContext())) { + DebugUIPlugin.trace("\tRESTORE SELECT: " + treePath.getLastSegment()); //$NON-NLS-1$ + } + ITreeSelection currentSelection = (ITreeSelection)viewer.getSelection(); + if (currentSelection == null || currentSelection.isEmpty()) { + viewer.setSelection(new TreeSelection(treePath), false, false); + } else { + TreePath[] currentPaths = currentSelection.getPaths(); + boolean pathInSelection = false; + for (int i = 0; i < currentPaths.length; i++) { + if (currentPaths[i].equals(treePath)) { + pathInSelection = true; + break; + } + } + // Only set the selection if the element is not yet in + // selection. Otherwise the setSelection() call will + // update selection listeners needlessly. + if (!pathInSelection) { + TreePath[] newPaths = new TreePath[currentPaths.length + 1]; + System.arraycopy(currentPaths, 0, newPaths, 0, currentPaths.length); + newPaths[newPaths.length - 1] = treePath; + viewer.setSelection(new TreeSelection(newPaths), false, false); + } + } + } + + if ((delta.getFlags() & IModelDelta.REVEAL) != 0) { + delta.setFlags(delta.getFlags() & ~IModelDelta.REVEAL); + // Look for the reveal flag in the child deltas. If + // A child delta has the reveal flag, do not set the + // top element yet. + boolean setTopItem = true; + IModelDelta[] childDeltas = delta.getChildDeltas(); + for (int i = 0; i < childDeltas.length; i++) { + IModelDelta childDelta = childDeltas[i]; + int modelIndex = childDelta.getIndex(); + if (modelIndex >= 0 && (childDelta.getFlags() & IModelDelta.REVEAL) != 0) { + setTopItem = false; + } + } + + if (setTopItem) { + Assert.isTrue(fPendingSetTopItem == null); + + fPendingSetTopItem = new PendingRevealDelta(treePath, delta); + viewer.addViewerUpdateListener(fPendingSetTopItem); + } + } + + // If we know the child count of the element, look for the reveal + // flag in the child deltas. For the children with reveal flag start + // a new update. + // If the child delta's index is out of range, strip the reveal flag + // since it is no longer applicable. + if (knowsChildCount) { + int childCount = viewer.getChildCount(treePath); + if (childCount >= 0) { + ModelDelta[] childDeltas = (ModelDelta[])delta.getChildDeltas(); + for (int i = 0; i < childDeltas.length; i++) { + ModelDelta childDelta = childDeltas[i]; + int modelIndex = childDelta.getIndex(); + if (modelIndex >= 0 && (childDelta.getFlags() & IModelDelta.REVEAL) != 0) { + if (modelIndex < childCount) { + fContentProvider.doUpdateElement(treePath, modelIndex); + } else { + childDelta.setFlags(childDelta.getFlags() & ~IModelDelta.REVEAL); + } + } + } + } + } + + // Some children of this element were just updated. If all its + // children are now realized, clear out any elements that still + // have flags, because they represent elements that were removed. + if ((checkChildrenRealized && + !fContentProvider.areChildrenUpdatesPending(treePath) && + fContentProvider.getViewer().getElementChildrenRealized(treePath)) || + (knowsHasChildren && !viewer.getHasChildren(treePath)) ) + { + if (DebugUIPlugin.DEBUG_STATE_SAVE_RESTORE && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(fContentProvider.getPresentationContext())) { + DebugUIPlugin.trace("\tRESTORE CONTENT: " + treePath.getLastSegment()); //$NON-NLS-1$ + } + delta.setFlags(delta.getFlags() & ~IModelDelta.CONTENT); + } + } + + /** + * Utility that reveals the saved top item in the viewer. It listens for + * all content updates to complete in order to avoid having the desired top item + * scroll out as view content is filled in. + * <br> + * Revealing some elements can trigger expanding some of elements + * that have been just revealed. Therefore, we have to check one + * more time after the new triggered updates are completed if we + * have to set again the top index + */ + private class PendingRevealDelta implements IViewerUpdateListener { + + private final TreePath fPathToReveal; + private final ModelDelta fRevealDelta; + + PendingRevealDelta(TreePath pathToReveal, ModelDelta revealDelta) { + fPathToReveal = pathToReveal; + fRevealDelta = revealDelta; + } + + /** + * Counter that tracks how many time the viewer updates were completed. + */ + private int fCounter = 0; + private Object fModelInput = fPendingState.getElement(); + + @Override public void viewerUpdatesComplete() { - Assert.isTrue( fContentProvider.getViewer().getDisplay().getThread() == Thread.currentThread() ); - - IInternalTreeModelViewer viewer = fContentProvider.getViewer(); - if (viewer == null || fPendingSetTopItem != this) { - return; - } - - TreePath topPath = viewer.getTopElementPath(); - if (!fPathToReveal.equals(topPath)) { - TreePath parentPath = fPathToReveal.getParentPath(); - int index = viewer.findElementIndex(parentPath, fPathToReveal.getLastSegment()); - if (index >= 0) { - if (DebugUIPlugin.DEBUG_STATE_SAVE_RESTORE && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(fContentProvider.getPresentationContext())) { - DebugUIPlugin.trace("\tRESTORE REVEAL: " + fPathToReveal.getLastSegment()); //$NON-NLS-1$ - } - viewer.reveal(parentPath, index); - - } - } - - fCounter++; - // in case the pending state was already set to null, we assume that - // all others elements are restored, so we don't expect that REVEAL will - // trigger other updates - if (fCounter > 1 || fPendingState == null) { - dispose(); - } - } - - @Override + Assert.isTrue( fContentProvider.getViewer().getDisplay().getThread() == Thread.currentThread() ); + + IInternalTreeModelViewer viewer = fContentProvider.getViewer(); + if (viewer == null || fPendingSetTopItem != this) { + return; + } + + TreePath topPath = viewer.getTopElementPath(); + if (!fPathToReveal.equals(topPath)) { + TreePath parentPath = fPathToReveal.getParentPath(); + int index = viewer.findElementIndex(parentPath, fPathToReveal.getLastSegment()); + if (index >= 0) { + if (DebugUIPlugin.DEBUG_STATE_SAVE_RESTORE && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(fContentProvider.getPresentationContext())) { + DebugUIPlugin.trace("\tRESTORE REVEAL: " + fPathToReveal.getLastSegment()); //$NON-NLS-1$ + } + viewer.reveal(parentPath, index); + + } + } + + fCounter++; + // in case the pending state was already set to null, we assume that + // all others elements are restored, so we don't expect that REVEAL will + // trigger other updates + if (fCounter > 1 || fPendingState == null) { + dispose(); + } + } + + @Override public void viewerUpdatesBegin() {} - @Override + @Override public void updateStarted(IViewerUpdate update) {} - @Override + @Override public void updateComplete(IViewerUpdate update) {} - /** - * Returns delta that is used to reveal the item. - * @return delta to be revealed. - */ - public ModelDelta getDelta() { - return fRevealDelta; - } - - /** - * Resets the item - */ - public void dispose() { - // top item is set - fPendingSetTopItem = null; - - IInternalTreeModelViewer viewer = fContentProvider.getViewer(); - if (viewer == null) { + /** + * Returns delta that is used to reveal the item. + * @return delta to be revealed. + */ + public ModelDelta getDelta() { + return fRevealDelta; + } + + /** + * Resets the item + */ + public void dispose() { + // top item is set + fPendingSetTopItem = null; + + IInternalTreeModelViewer viewer = fContentProvider.getViewer(); + if (viewer == null) { return; } - // remove myself as viewer update listener - viewer.removeViewerUpdateListener(this); - - if (fPendingState == null) { - if (DebugUIPlugin.DEBUG_STATE_SAVE_RESTORE && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(fContentProvider.getPresentationContext())) { - DebugUIPlugin.trace("STATE RESTORE COMPELTE: " + fPendingState); //$NON-NLS-1$ - } - notifyStateUpdate(fModelInput, STATE_RESTORE_SEQUENCE_COMPLETE, null); - } else { - checkIfRestoreComplete(); - } - } - - } - - /** - * Restore selection/expansion based on items already in the viewer - * @param delta the {@link ModelDelta} to restore from - */ - protected void doInitialRestore(ModelDelta delta) { - // Find the reveal delta and mark nodes on its path - // to reveal as elements are updated. - markRevealDelta(delta); - - // Restore visible items. - // Note (Pawel Piech): the initial list of items is normally - // empty, so in most cases the code below does not do anything. - // Instead doRestore() is called when various updates complete. - int count = fContentProvider.getViewer().getChildCount(TreePath.EMPTY); - for (int i = 0; i < count; i++) { - Object data = fContentProvider.getViewer().getChildElement(TreePath.EMPTY, i); - if (data != null) { - restorePendingStateOnUpdate(new TreePath(new Object[]{data}), i, false, false, false); - } - } - - } - - /** - * Finds the delta with the reveal flag, then it walks up this - * delta and marks all the parents of it with the reveal flag. - * These flags are then used by the restore logic to restore - * and reveal all the nodes leading up to the element that should - * be ultimately at the top. - * @param rootDelta Delta to search - * @return The node just under the rootDelta which contains - * the reveal flag. <code>null</code> if no reveal flag was found. - */ - private ModelDelta markRevealDelta(ModelDelta rootDelta) { - final ModelDelta[] revealDelta = new ModelDelta[1]; + // remove myself as viewer update listener + viewer.removeViewerUpdateListener(this); + + if (fPendingState == null) { + if (DebugUIPlugin.DEBUG_STATE_SAVE_RESTORE && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(fContentProvider.getPresentationContext())) { + DebugUIPlugin.trace("STATE RESTORE COMPELTE: " + fPendingState); //$NON-NLS-1$ + } + notifyStateUpdate(fModelInput, STATE_RESTORE_SEQUENCE_COMPLETE, null); + } else { + checkIfRestoreComplete(); + } + } + + } + + /** + * Restore selection/expansion based on items already in the viewer + * @param delta the {@link ModelDelta} to restore from + */ + protected void doInitialRestore(ModelDelta delta) { + // Find the reveal delta and mark nodes on its path + // to reveal as elements are updated. + markRevealDelta(delta); + + // Restore visible items. + // Note (Pawel Piech): the initial list of items is normally + // empty, so in most cases the code below does not do anything. + // Instead doRestore() is called when various updates complete. + int count = fContentProvider.getViewer().getChildCount(TreePath.EMPTY); + for (int i = 0; i < count; i++) { + Object data = fContentProvider.getViewer().getChildElement(TreePath.EMPTY, i); + if (data != null) { + restorePendingStateOnUpdate(new TreePath(new Object[]{data}), i, false, false, false); + } + } + + } + + /** + * Finds the delta with the reveal flag, then it walks up this + * delta and marks all the parents of it with the reveal flag. + * These flags are then used by the restore logic to restore + * and reveal all the nodes leading up to the element that should + * be ultimately at the top. + * @param rootDelta Delta to search + * @return The node just under the rootDelta which contains + * the reveal flag. <code>null</code> if no reveal flag was found. + */ + private ModelDelta markRevealDelta(ModelDelta rootDelta) { + final ModelDelta[] revealDelta = new ModelDelta[1]; IModelDeltaVisitor visitor = (delta, depth) -> { if ((delta.getFlags() & IModelDelta.REVEAL) != 0) { revealDelta[0] = (ModelDelta) delta; @@ -1370,106 +1370,106 @@ class ViewerStateTracker { return revealDelta[0] == null; }; - rootDelta.accept(visitor); - if (revealDelta[0] != null) { - ModelDelta parentDelta = (ModelDelta)revealDelta[0].getParentDelta(); - while(parentDelta.getParentDelta() != null) { - revealDelta[0] = parentDelta; - revealDelta[0].setFlags(revealDelta[0].getFlags() | IModelDelta.REVEAL); - parentDelta = (ModelDelta)parentDelta.getParentDelta(); - } - } - return revealDelta[0]; - } - - /** - * Builds a delta with the given root delta for expansion/selection state. - * - * @param delta - * root delta - */ - private void buildViewerState(ModelDelta delta) { - IInternalTreeModelViewer viewer = fContentProvider.getViewer(); - viewer.saveElementState(TreeModelContentProvider.EMPTY_TREE_PATH, delta, IModelDelta.SELECT | IModelDelta.EXPAND); - - // Add memento for top item if it is mapped to an element. The reveal memento - // is in its own path to avoid requesting unnecessary data when restoring it. - TreePath topElementPath = viewer.getTopElementPath(); - if (topElementPath != null) { - ModelDelta parentDelta = delta; - TreePath parentPath = TreeModelContentProvider.EMPTY_TREE_PATH; - for (int i = 0; i < topElementPath.getSegmentCount(); i++) { - Object element = topElementPath.getSegment(i); - int index = viewer.findElementIndex(parentPath, element); - ModelDelta childDelta = parentDelta.getChildDelta(element); - if (childDelta == null) { - parentDelta = parentDelta.addNode(element, index, IModelDelta.NO_CHANGE); - } else { - parentDelta = childDelta; - } - parentPath = parentPath.createChildPath(element); - } - parentDelta.setFlags(parentDelta.getFlags() | IModelDelta.REVEAL); - } - } - - /** - * Cancels any outstanding compare requests for given element and its children. - * @param path Path of element to cancel updates for. - */ - void cancelStateSubtreeUpdates(TreePath path) { + rootDelta.accept(visitor); + if (revealDelta[0] != null) { + ModelDelta parentDelta = (ModelDelta)revealDelta[0].getParentDelta(); + while(parentDelta.getParentDelta() != null) { + revealDelta[0] = parentDelta; + revealDelta[0].setFlags(revealDelta[0].getFlags() | IModelDelta.REVEAL); + parentDelta = (ModelDelta)parentDelta.getParentDelta(); + } + } + return revealDelta[0]; + } + + /** + * Builds a delta with the given root delta for expansion/selection state. + * + * @param delta + * root delta + */ + private void buildViewerState(ModelDelta delta) { + IInternalTreeModelViewer viewer = fContentProvider.getViewer(); + viewer.saveElementState(TreeModelContentProvider.EMPTY_TREE_PATH, delta, IModelDelta.SELECT | IModelDelta.EXPAND); + + // Add memento for top item if it is mapped to an element. The reveal memento + // is in its own path to avoid requesting unnecessary data when restoring it. + TreePath topElementPath = viewer.getTopElementPath(); + if (topElementPath != null) { + ModelDelta parentDelta = delta; + TreePath parentPath = TreeModelContentProvider.EMPTY_TREE_PATH; + for (int i = 0; i < topElementPath.getSegmentCount(); i++) { + Object element = topElementPath.getSegment(i); + int index = viewer.findElementIndex(parentPath, element); + ModelDelta childDelta = parentDelta.getChildDelta(element); + if (childDelta == null) { + parentDelta = parentDelta.addNode(element, index, IModelDelta.NO_CHANGE); + } else { + parentDelta = childDelta; + } + parentPath = parentPath.createChildPath(element); + } + parentDelta.setFlags(parentDelta.getFlags() | IModelDelta.REVEAL); + } + } + + /** + * Cancels any outstanding compare requests for given element and its children. + * @param path Path of element to cancel updates for. + */ + void cancelStateSubtreeUpdates(TreePath path) { for (Iterator<CompareRequestKey> itr = fCompareRequestsInProgress.keySet().iterator(); itr.hasNext();) { CompareRequestKey key = itr.next(); - if (key.fPath.startsWith(path, null)) { - ElementCompareRequest compareRequest = fCompareRequestsInProgress.get(key); - compareRequest.cancel(); - itr.remove(); - } - } - } - - void compareFinished(ElementCompareRequest request, ModelDelta delta) { - notifyStateUpdate(request.getViewerInput(), TreeModelContentProvider.UPDATE_COMPLETE, request); - if (DebugUIPlugin.DEBUG_STATE_SAVE_RESTORE && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(fContentProvider.getPresentationContext())) { - DebugUIPlugin.trace("\tSTATE END: " + request + " = " + false); //$NON-NLS-1$ //$NON-NLS-2$ - } - - fCompareRequestsInProgress.remove(new CompareRequestKey(request.getElementPath(), delta)); - if (!request.isCanceled()) { - if (request.isEqual()) { - delta.setElement(request.getElement()); - restorePendingStateNode(delta, request.knowsHasChildren(), request.knowChildCount(), request.checkChildrenRealized()); - } else if (request.getModelIndex() != -1) { - // Comparison failed. - // Check if the delta has a reveal flag, and if its index - // matches the index of the element that it was compared - // against. If this is the case, strip the reveal flag from - // the delta as it is most likely not applicable anymore. - if ((delta.getFlags() & IModelDelta.REVEAL) != 0 && delta.getIndex() == request.getModelIndex()) { - delta.setFlags(delta.getFlags() & ~IModelDelta.REVEAL); - } - } - } - checkIfRestoreComplete(); - } - - - void addStateUpdateListener(IStateUpdateListener listener) { - fStateUpdateListeners.add(listener); - } - - void removeStateUpdateListener(IStateUpdateListener listener) { - fStateUpdateListeners.remove(listener); - } - - void notifyStateUpdate(final Object input, final int type, final IViewerUpdate update) { - if (!fStateUpdateListeners.isEmpty()) { + if (key.fPath.startsWith(path, null)) { + ElementCompareRequest compareRequest = fCompareRequestsInProgress.get(key); + compareRequest.cancel(); + itr.remove(); + } + } + } + + void compareFinished(ElementCompareRequest request, ModelDelta delta) { + notifyStateUpdate(request.getViewerInput(), TreeModelContentProvider.UPDATE_COMPLETE, request); + if (DebugUIPlugin.DEBUG_STATE_SAVE_RESTORE && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(fContentProvider.getPresentationContext())) { + DebugUIPlugin.trace("\tSTATE END: " + request + " = " + false); //$NON-NLS-1$ //$NON-NLS-2$ + } + + fCompareRequestsInProgress.remove(new CompareRequestKey(request.getElementPath(), delta)); + if (!request.isCanceled()) { + if (request.isEqual()) { + delta.setElement(request.getElement()); + restorePendingStateNode(delta, request.knowsHasChildren(), request.knowChildCount(), request.checkChildrenRealized()); + } else if (request.getModelIndex() != -1) { + // Comparison failed. + // Check if the delta has a reveal flag, and if its index + // matches the index of the element that it was compared + // against. If this is the case, strip the reveal flag from + // the delta as it is most likely not applicable anymore. + if ((delta.getFlags() & IModelDelta.REVEAL) != 0 && delta.getIndex() == request.getModelIndex()) { + delta.setFlags(delta.getFlags() & ~IModelDelta.REVEAL); + } + } + } + checkIfRestoreComplete(); + } + + + void addStateUpdateListener(IStateUpdateListener listener) { + fStateUpdateListeners.add(listener); + } + + void removeStateUpdateListener(IStateUpdateListener listener) { + fStateUpdateListeners.remove(listener); + } + + void notifyStateUpdate(final Object input, final int type, final IViewerUpdate update) { + if (!fStateUpdateListeners.isEmpty()) { for (IStateUpdateListener iStateUpdateListener : fStateUpdateListeners) { final IStateUpdateListener listener = iStateUpdateListener; - SafeRunner.run(new ISafeRunnable() { - @Override + SafeRunner.run(new ISafeRunnable() { + @Override public void run() throws Exception { - switch (type) { + switch (type) { case STATE_SAVE_SEQUENCE_BEGINS: listener.stateSaveUpdatesBegin(input); break; @@ -1490,15 +1490,15 @@ class ViewerStateTracker { break; default: break; - } - } + } + } - @Override + @Override public void handleException(Throwable exception) { - DebugUIPlugin.log(exception); - } - }); - } - } - } + DebugUIPlugin.log(exception); + } + }); + } + } + } } 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 8be777195..cf706ed4a 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 @@ -47,111 +47,111 @@ public abstract class ViewerUpdateMonitor extends Request implements IViewerUpda */ private IElementContentProvider fElementContentProvider; - /** - * Whether this request's 'done' method has been called. - */ - private boolean fDone = false; - - /** - * Whether this request has been started - */ - private boolean fStarted = false; - - /** - * Viewer input at the time the request was made - */ - private Object fViewerInput = null; - - /** - * Whether this update has been delegated to another content provider - * @since 3.4 - */ - private boolean fIsDelegated = false; - - /** - * Presentation context - */ - private IPresentationContext fContext; - - /** - * Constructs an update for the given content provider - * - * @param contentProvider content provider - * @param viewerInput Viewer input for update - * @param elementPath path to associated model element - empty for root element - * @param element associated model element - * @param elementContentProvider Content provider for this update. - * @param context Presentation contest for this update - */ - public ViewerUpdateMonitor(TreeModelContentProvider contentProvider, Object viewerInput, TreePath elementPath, Object element, IElementContentProvider elementContentProvider, IPresentationContext context) { - fContext = context; + /** + * Whether this request's 'done' method has been called. + */ + private boolean fDone = false; + + /** + * Whether this request has been started + */ + private boolean fStarted = false; + + /** + * Viewer input at the time the request was made + */ + private Object fViewerInput = null; + + /** + * Whether this update has been delegated to another content provider + * @since 3.4 + */ + private boolean fIsDelegated = false; + + /** + * Presentation context + */ + private IPresentationContext fContext; + + /** + * Constructs an update for the given content provider + * + * @param contentProvider content provider + * @param viewerInput Viewer input for update + * @param elementPath path to associated model element - empty for root element + * @param element associated model element + * @param elementContentProvider Content provider for this update. + * @param context Presentation contest for this update + */ + public ViewerUpdateMonitor(TreeModelContentProvider contentProvider, Object viewerInput, TreePath elementPath, Object element, IElementContentProvider elementContentProvider, IPresentationContext context) { + fContext = context; // Bug 380288: Catch and log a race condition where the viewer input is null. - if (viewerInput == null) { - DebugUIPlugin.log(new NullPointerException("Input to viewer update should not be null")); //$NON-NLS-1$ - } - fViewerInput = viewerInput; - fElementContentProvider = elementContentProvider; - fContentProvider = contentProvider; - fElement = element; - fElementPath = elementPath; - } - - /** - * Returns the scheduling rule for viewer update job. - * - * @return rule or <code>null</code> - */ - protected ISchedulingRule getUpdateSchedulingRule() { - return AsynchronousSchedulingRuleFactory.getDefault().newSerialPerObjectRule(getContentProvider()); - } - - /** - * Returns the model content provider this update is being performed for. - * - * @return the model content provider this update is being performed for - */ - protected TreeModelContentProvider getContentProvider() { - return fContentProvider; - } - - /** - * Returns the element content provider to use for this request - * - * @return element content provider - */ - protected IElementContentProvider getElementContentProvider() { - return fElementContentProvider; - } - - @Override + if (viewerInput == null) { + DebugUIPlugin.log(new NullPointerException("Input to viewer update should not be null")); //$NON-NLS-1$ + } + fViewerInput = viewerInput; + fElementContentProvider = elementContentProvider; + fContentProvider = contentProvider; + fElement = element; + fElementPath = elementPath; + } + + /** + * Returns the scheduling rule for viewer update job. + * + * @return rule or <code>null</code> + */ + protected ISchedulingRule getUpdateSchedulingRule() { + return AsynchronousSchedulingRuleFactory.getDefault().newSerialPerObjectRule(getContentProvider()); + } + + /** + * Returns the model content provider this update is being performed for. + * + * @return the model content provider this update is being performed for + */ + protected TreeModelContentProvider getContentProvider() { + return fContentProvider; + } + + /** + * Returns the element content provider to use for this request + * + * @return element content provider + */ + protected IElementContentProvider getElementContentProvider() { + return fElementContentProvider; + } + + @Override public final void done() { - synchronized (this) { - if (isDone()) { - return; - } - fDone = true; + synchronized (this) { + if (isDone()) { + return; + } + fDone = true; } - scheduleViewerUpdate(); + scheduleViewerUpdate(); } - /** - * Returns whether this request is done yet. - * - * @return True if this update is done. - */ - protected synchronized boolean isDone() { - return fDone; - } + /** + * Returns whether this request is done yet. + * + * @return True if this update is done. + */ + protected synchronized boolean isDone() { + return fDone; + } - protected void scheduleViewerUpdate() { - getContentProvider().scheduleViewerUpdate(this); - } + protected void scheduleViewerUpdate() { + getContentProvider().scheduleViewerUpdate(this); + } - /** + /** * Notification this update has been completed and should now be applied to * this update's viewer. This method is called in the UI thread. */ - protected abstract void performUpdate(); + protected abstract void performUpdate(); @Override public IPresentationContext getPresentationContext() { @@ -183,7 +183,7 @@ public abstract class ViewerUpdateMonitor extends Request implements IViewerUpda * @param path Element path to check. * @return True if this update contains the given update path. * - * @since 3.6 + * @since 3.6 */ abstract boolean containsUpdate(TreePath path); @@ -252,15 +252,15 @@ public abstract class ViewerUpdateMonitor extends Request implements IViewerUpda @Override public boolean equals(Object obj) { - if (obj instanceof ViewerUpdateMonitor) { - return doEquals((ViewerUpdateMonitor)obj); - } - return false; + if (obj instanceof ViewerUpdateMonitor) { + return doEquals((ViewerUpdateMonitor)obj); + } + return false; } @Override public int hashCode() { - return doHashCode(); + return doHashCode(); } /** @@ -268,34 +268,34 @@ public abstract class ViewerUpdateMonitor extends Request implements IViewerUpda * the same type of update and its updating the same elements. * @param update Update to compare to. * @return True if the given update is equals - * @since 3.8 + * @since 3.8 */ abstract protected boolean doEquals(ViewerUpdateMonitor update); /** * Calculates the hash code of the given update using the same parameters as doEquals(). * @return Update's hash code. - * @since 3.8 + * @since 3.8 + */ + abstract protected int doHashCode(); + + /** + * Executes the given runnable in the UI thread. If method is called in + * UI thread, then runnable is executed immediately, otherwise it's executed + * using <code>Display.asyncExec()</code>. Runnable is not executed if update is + * canceled or content provider is disposed. + * @since 3.8 */ - abstract protected int doHashCode(); - - /** - * Executes the given runnable in the UI thread. If method is called in - * UI thread, then runnable is executed immediately, otherwise it's executed - * using <code>Display.asyncExec()</code>. Runnable is not executed if update is - * canceled or content provider is disposed. - * @since 3.8 - */ protected void execInDisplayThread(Runnable runnable) { - ITreeModelViewer viewer = getContentProvider().getViewer(); - if (viewer != null && !isCanceled()) { - Display display = viewer.getDisplay(); - if (Thread.currentThread() == display.getThread()) { - runnable.run(); - } else { - display.asyncExec(runnable); - } - } + ITreeModelViewer viewer = getContentProvider().getViewer(); + if (viewer != null && !isCanceled()) { + Display display = viewer.getDisplay(); + if (Thread.currentThread() == display.getThread()) { + runnable.run(); + } else { + display.asyncExec(runnable); + } + } } } diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/VirtualCopyToClipboardActionDelegate.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/VirtualCopyToClipboardActionDelegate.java index 2425e4e3c..cdc5dfd0b 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/VirtualCopyToClipboardActionDelegate.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/VirtualCopyToClipboardActionDelegate.java @@ -65,50 +65,50 @@ public class VirtualCopyToClipboardActionDelegate extends AbstractDebugActionDel private class VirtualViewerListener implements ILabelUpdateListener, IVirtualItemListener { VirtualTreeModelViewer fVirtualViewer; - IProgressMonitor fProgressMonitor; - int fSelectionRootDepth; + IProgressMonitor fProgressMonitor; + int fSelectionRootDepth; Set<VirtualItem> fItemsToUpdate; - @Override + @Override public void labelUpdateStarted(ILabelUpdate update) {} - @Override + @Override public void labelUpdateComplete(ILabelUpdate update) { - VirtualItem updatedItem = fVirtualViewer.findItem(update.getElementPath()); - if (fItemsToUpdate.remove(updatedItem)) { - incrementProgress(1); - } - } - @Override + VirtualItem updatedItem = fVirtualViewer.findItem(update.getElementPath()); + if (fItemsToUpdate.remove(updatedItem)) { + incrementProgress(1); + } + } + @Override public void labelUpdatesBegin() { - } - @Override + } + @Override public void labelUpdatesComplete() { - } + } - @Override + @Override public void revealed(VirtualItem item) { - } + } - @Override + @Override public void disposed(VirtualItem item) { - if (fItemsToUpdate.remove(item)) { - incrementProgress(1); - } - } - - private void incrementProgress(int count) { - IProgressMonitor pm; - synchronized (VirtualCopyToClipboardActionDelegate.this) { - pm = fProgressMonitor; - } - if (pm != null) { - pm.worked(count); - if (fItemsToUpdate.isEmpty()) { - pm.done(); - } - } - } - } + if (fItemsToUpdate.remove(item)) { + incrementProgress(1); + } + } + + private void incrementProgress(int count) { + IProgressMonitor pm; + synchronized (VirtualCopyToClipboardActionDelegate.this) { + pm = fProgressMonitor; + } + if (pm != null) { + pm.worked(count); + if (fItemsToUpdate.isEmpty()) { + pm.done(); + } + } + } + } /** * @see AbstractDebugActionDelegate#initialize(IAction, ISelection) @@ -176,76 +176,76 @@ public class VirtualCopyToClipboardActionDelegate extends AbstractDebugActionDel Set<VirtualItem> fItemsToCopy = Collections.EMPTY_SET; Set<VirtualItem> fItemsToValidate = Collections.EMPTY_SET; - @Override + @Override public boolean isItemVisible(VirtualItem item) { - return fItemsToValidate.contains(item); - } + return fItemsToValidate.contains(item); + } - @Override + @Override public void showItem(VirtualItem item) { - } + } void setItemsToCopy(Set<VirtualItem> itemsToCopy) { - fItemsToCopy = itemsToCopy; + fItemsToCopy = itemsToCopy; fItemsToValidate = new HashSet<>(); for (VirtualItem itemToCopy : itemsToCopy) { - while (itemToCopy != null) { - fItemsToValidate.add(itemToCopy); - itemToCopy = itemToCopy.getParent(); - } - } - } + while (itemToCopy != null) { + fItemsToValidate.add(itemToCopy); + itemToCopy = itemToCopy.getParent(); + } + } + } } private VirtualTreeModelViewer initVirtualViewer(TreeModelViewer clientViewer, VirtualViewerListener listener, ItemsToCopyVirtualItemValidator validator) { - Object input = clientViewer.getInput(); - ModelDelta stateDelta = new ModelDelta(input, IModelDelta.NO_CHANGE); - clientViewer.saveElementState(TreePath.EMPTY, stateDelta, IModelDelta.EXPAND); - VirtualTreeModelViewer virtualViewer = new VirtualTreeModelViewer( - clientViewer.getDisplay(), - SWT.VIRTUAL, - clientViewer.getPresentationContext(), - validator); - virtualViewer.setFilters(clientViewer.getFilters()); - virtualViewer.addLabelUpdateListener(listener); - virtualViewer.getTree().addItemListener(listener); - String[] columns = clientViewer.getPresentationContext().getColumns(); - virtualViewer.setInput(input); - if (virtualViewer.canToggleColumns()) { - virtualViewer.setShowColumns(clientViewer.isShowColumns()); - virtualViewer.setVisibleColumns(columns); - } - virtualViewer.updateViewer(stateDelta); - - // Parse selected items from client viewer and add them to the virtual viewer selection. - listener.fSelectionRootDepth = Integer.MAX_VALUE; - TreeItem[] selection = getSelectedItems(clientViewer); + Object input = clientViewer.getInput(); + ModelDelta stateDelta = new ModelDelta(input, IModelDelta.NO_CHANGE); + clientViewer.saveElementState(TreePath.EMPTY, stateDelta, IModelDelta.EXPAND); + VirtualTreeModelViewer virtualViewer = new VirtualTreeModelViewer( + clientViewer.getDisplay(), + SWT.VIRTUAL, + clientViewer.getPresentationContext(), + validator); + virtualViewer.setFilters(clientViewer.getFilters()); + virtualViewer.addLabelUpdateListener(listener); + virtualViewer.getTree().addItemListener(listener); + String[] columns = clientViewer.getPresentationContext().getColumns(); + virtualViewer.setInput(input); + if (virtualViewer.canToggleColumns()) { + virtualViewer.setShowColumns(clientViewer.isShowColumns()); + virtualViewer.setVisibleColumns(columns); + } + virtualViewer.updateViewer(stateDelta); + + // Parse selected items from client viewer and add them to the virtual viewer selection. + listener.fSelectionRootDepth = Integer.MAX_VALUE; + TreeItem[] selection = getSelectedItems(clientViewer); Set<VirtualItem> vSelection = new HashSet<>(selection.length * 4 / 3); - for (int i = 0; i < selection.length; i++) { - TreePath parentPath = fClientViewer.getTreePathFromItem(selection[i].getParentItem()); - listener.fSelectionRootDepth = Math.min(parentPath.getSegmentCount() + 1, listener.fSelectionRootDepth); - VirtualItem parentVItem = virtualViewer.findItem(parentPath); - if (parentVItem != null) { - int index = -1; - TreeItem parentItem = selection[i].getParentItem(); - if (parentItem != null) { - index = parentItem.indexOf(selection[i]); - } else { - Tree parentTree = selection[i].getParent(); - index = parentTree.indexOf(selection[i]); - } - index = ((ITreeModelContentProvider)clientViewer.getContentProvider()).viewToModelIndex(parentPath, index); - vSelection.add( parentVItem.getItem(new Index(index)) ); - } - } - validator.setItemsToCopy(vSelection); + for (int i = 0; i < selection.length; i++) { + TreePath parentPath = fClientViewer.getTreePathFromItem(selection[i].getParentItem()); + listener.fSelectionRootDepth = Math.min(parentPath.getSegmentCount() + 1, listener.fSelectionRootDepth); + VirtualItem parentVItem = virtualViewer.findItem(parentPath); + if (parentVItem != null) { + int index = -1; + TreeItem parentItem = selection[i].getParentItem(); + if (parentItem != null) { + index = parentItem.indexOf(selection[i]); + } else { + Tree parentTree = selection[i].getParent(); + index = parentTree.indexOf(selection[i]); + } + index = ((ITreeModelContentProvider)clientViewer.getContentProvider()).viewToModelIndex(parentPath, index); + vSelection.add( parentVItem.getItem(new Index(index)) ); + } + } + validator.setItemsToCopy(vSelection); listener.fItemsToUpdate = new HashSet<>(vSelection); - virtualViewer.getTree().validate(); - return virtualViewer; + virtualViewer.getTree().validate(); + return virtualViewer; } protected TreeItem[] getSelectedItems(TreeModelViewer clientViewer) { - return clientViewer.getTree().getSelection(); + return clientViewer.getTree().getSelection(); } /** @@ -254,9 +254,9 @@ public class VirtualCopyToClipboardActionDelegate extends AbstractDebugActionDel */ @Override public void run(final IAction action) { - if (fClientViewer.getSelection().isEmpty()) { - return; - } + if (fClientViewer.getSelection().isEmpty()) { + return; + } final VirtualViewerListener listener = new VirtualViewerListener(); ItemsToCopyVirtualItemValidator validator = new ItemsToCopyVirtualItemValidator(); @@ -270,17 +270,17 @@ public class VirtualCopyToClipboardActionDelegate extends AbstractDebugActionDel IRunnableWithProgress runnable = new IRunnableWithProgress() { @Override public void run(final IProgressMonitor m) throws InvocationTargetException, InterruptedException { - synchronized(listener) { - listener.fProgressMonitor = m; - listener.fProgressMonitor.beginTask(DebugUIPlugin.removeAccelerators(getAction().getText()), listener.fItemsToUpdate.size()); - } - - while (!listener.fItemsToUpdate.isEmpty() && !listener.fProgressMonitor.isCanceled()) { - Thread.sleep(1); - } - synchronized(listener) { - listener.fProgressMonitor = null; - } + synchronized(listener) { + listener.fProgressMonitor = m; + listener.fProgressMonitor.beginTask(DebugUIPlugin.removeAccelerators(getAction().getText()), listener.fItemsToUpdate.size()); + } + + while (!listener.fItemsToUpdate.isEmpty() && !listener.fProgressMonitor.isCanceled()) { + Thread.sleep(1); + } + synchronized(listener) { + listener.fProgressMonitor = null; + } } }; try { @@ -293,24 +293,24 @@ public class VirtualCopyToClipboardActionDelegate extends AbstractDebugActionDel } if (!monitor.isCanceled()) { - copySelectionToClipboard(virtualViewer, validator.fItemsToCopy, listener.fSelectionRootDepth); + copySelectionToClipboard(virtualViewer, validator.fItemsToCopy, listener.fSelectionRootDepth); } - virtualViewer.removeLabelUpdateListener(listener); - virtualViewer.getTree().removeItemListener(listener); + virtualViewer.removeLabelUpdateListener(listener); + virtualViewer.getTree().removeItemListener(listener); virtualViewer.dispose(); } private void copySelectionToClipboard(VirtualTreeModelViewer virtualViewer, Set<VirtualItem> itemsToCopy, int selectionRootDepth) { - StringBuffer buffer = new StringBuffer(); - writeItemToBuffer (virtualViewer.getTree(), itemsToCopy, buffer, -selectionRootDepth); - writeBufferToClipboard(buffer); + StringBuffer buffer = new StringBuffer(); + writeItemToBuffer (virtualViewer.getTree(), itemsToCopy, buffer, -selectionRootDepth); + writeBufferToClipboard(buffer); } protected void writeItemToBuffer(VirtualItem item, Set<VirtualItem> itemsToCopy, StringBuffer buffer, int indent) { - if (itemsToCopy.contains(item)) { - append(item, buffer, indent); - } + if (itemsToCopy.contains(item)) { + append(item, buffer, indent); + } VirtualItem[] children = item.getItems(); if (children != null) { for (int i = 0; i < children.length; i++) { @@ -324,8 +324,8 @@ public class VirtualCopyToClipboardActionDelegate extends AbstractDebugActionDel return; } - TextTransfer plainTextTransfer = TextTransfer.getInstance(); - Clipboard clipboard= new Clipboard(fClientViewer.getControl().getDisplay()); + TextTransfer plainTextTransfer = TextTransfer.getInstance(); + Clipboard clipboard= new Clipboard(fClientViewer.getControl().getDisplay()); try { clipboard.setContents( new String[]{buffer.toString()}, @@ -338,7 +338,7 @@ public class VirtualCopyToClipboardActionDelegate extends AbstractDebugActionDel writeBufferToClipboard(buffer); } } finally { - clipboard.dispose(); + clipboard.dispose(); } } @@ -359,11 +359,11 @@ public class VirtualCopyToClipboardActionDelegate extends AbstractDebugActionDel @Override protected boolean getEnableStateForSelection(IStructuredSelection selection) { - if (selection.isEmpty()) { - return true; - } else { - return super.getEnableStateForSelection(selection); - } + if (selection.isEmpty()) { + return true; + } else { + return super.getEnableStateForSelection(selection); + } } @Override diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/VirtualFindAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/VirtualFindAction.java index ba26f4622..8a9d49627 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/VirtualFindAction.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/VirtualFindAction.java @@ -62,69 +62,69 @@ import com.ibm.icu.text.MessageFormat; */ public class VirtualFindAction extends Action implements IUpdate { - private TreeModelViewer fClientViewer; + private TreeModelViewer fClientViewer; private class VirtualViewerListener implements IViewerUpdateListener, ILabelUpdateListener { - private boolean fViewerUpdatesComplete = false; - private boolean fLabelUpdatesComplete = false; - private IProgressMonitor fProgressMonitor; - private int fRemainingUpdatesCount = 0; + private boolean fViewerUpdatesComplete = false; + private boolean fLabelUpdatesComplete = false; + private IProgressMonitor fProgressMonitor; + private int fRemainingUpdatesCount = 0; - @Override + @Override public void labelUpdateStarted(ILabelUpdate update) {} - @Override + @Override public void labelUpdateComplete(ILabelUpdate update) { - incrementProgress(1); - } - @Override + incrementProgress(1); + } + @Override public void labelUpdatesBegin() { - fLabelUpdatesComplete = false; - } - @Override + fLabelUpdatesComplete = false; + } + @Override public void labelUpdatesComplete() { - fLabelUpdatesComplete = true; - completeProgress(); - } + fLabelUpdatesComplete = true; + completeProgress(); + } - @Override + @Override public void updateStarted(IViewerUpdate update) {} - @Override + @Override public void updateComplete(IViewerUpdate update) { - if (update instanceof IChildrenUpdate) { - incrementProgress(((IChildrenUpdate)update).getLength()); - } - } - @Override + if (update instanceof IChildrenUpdate) { + incrementProgress(((IChildrenUpdate)update).getLength()); + } + } + @Override public void viewerUpdatesBegin() { - fViewerUpdatesComplete = false; - } - @Override + fViewerUpdatesComplete = false; + } + @Override public void viewerUpdatesComplete() { - fViewerUpdatesComplete = true; - completeProgress(); - } - - private void completeProgress() { - IProgressMonitor pm; - synchronized (this) { - pm = fProgressMonitor; - } - if (pm != null && fLabelUpdatesComplete && fViewerUpdatesComplete) { - pm.done(); - } - } - - private void incrementProgress(int count) { - IProgressMonitor pm; - synchronized (this) { - pm = fProgressMonitor; - fRemainingUpdatesCount -= count; - } - if (pm != null && fLabelUpdatesComplete && fViewerUpdatesComplete) { - pm.worked(count); - } - } + fViewerUpdatesComplete = true; + completeProgress(); + } + + private void completeProgress() { + IProgressMonitor pm; + synchronized (this) { + pm = fProgressMonitor; + } + if (pm != null && fLabelUpdatesComplete && fViewerUpdatesComplete) { + pm.done(); + } + } + + private void incrementProgress(int count) { + IProgressMonitor pm; + synchronized (this) { + pm = fProgressMonitor; + fRemainingUpdatesCount -= count; + } + if (pm != null && fLabelUpdatesComplete && fViewerUpdatesComplete) { + pm.worked(count); + } + } } @@ -133,26 +133,26 @@ public class VirtualFindAction extends Action implements IUpdate { private Map<VirtualItem, String> fTextCache = new HashMap<>(); public FindLabelProvider(VirtualTreeModelViewer viewer, List<VirtualItem> items) { - fVirtualViewer = viewer; - for (int i = 0; i < items.size(); i++) { - VirtualItem item = items.get(i); - fTextCache.put(item, fVirtualViewer.getText(item, 0)); - } + fVirtualViewer = viewer; + for (int i = 0; i < items.size(); i++) { + VirtualItem item = items.get(i); + fTextCache.put(item, fVirtualViewer.getText(item, 0)); + } } @Override public Image getImage(Object element) { - return fVirtualViewer.getImage((VirtualItem) element, 0); + return fVirtualViewer.getImage((VirtualItem) element, 0); } @Override public String getText(Object element) { - return fTextCache.get(element); + return fTextCache.get(element); } } public VirtualFindAction(TreeModelViewer viewer) { - fClientViewer = viewer; + fClientViewer = viewer; setText(ActionMessages.FindAction_0); setId(DebugUIPlugin.getUniqueIdentifier() + ".FindElementAction"); //$NON-NLS-1$ @@ -162,31 +162,31 @@ public class VirtualFindAction extends Action implements IUpdate { } private VirtualTreeModelViewer initVirtualViewer(TreeModelViewer clientViewer, VirtualViewerListener listener) { - Object input = clientViewer.getInput(); - ModelDelta stateDelta = new ModelDelta(input, IModelDelta.NO_CHANGE); - clientViewer.saveElementState(TreePath.EMPTY, stateDelta, IModelDelta.EXPAND); - listener.fRemainingUpdatesCount = calcUpdatesCount(stateDelta); - VirtualTreeModelViewer fVirtualViewer = new VirtualTreeModelViewer( - clientViewer.getDisplay(), - SWT.NONE, - clientViewer.getPresentationContext()); - fVirtualViewer.setFilters(clientViewer.getFilters()); - fVirtualViewer.addViewerUpdateListener(listener); - fVirtualViewer.addLabelUpdateListener(listener); - String[] columns = clientViewer.getPresentationContext().getColumns(); - fVirtualViewer.setInput(input); - if (fVirtualViewer.canToggleColumns()) { - fVirtualViewer.setShowColumns(clientViewer.isShowColumns()); - fVirtualViewer.setVisibleColumns(columns); - } - fVirtualViewer.updateViewer(stateDelta); - return fVirtualViewer; + Object input = clientViewer.getInput(); + ModelDelta stateDelta = new ModelDelta(input, IModelDelta.NO_CHANGE); + clientViewer.saveElementState(TreePath.EMPTY, stateDelta, IModelDelta.EXPAND); + listener.fRemainingUpdatesCount = calcUpdatesCount(stateDelta); + VirtualTreeModelViewer fVirtualViewer = new VirtualTreeModelViewer( + clientViewer.getDisplay(), + SWT.NONE, + clientViewer.getPresentationContext()); + fVirtualViewer.setFilters(clientViewer.getFilters()); + fVirtualViewer.addViewerUpdateListener(listener); + fVirtualViewer.addLabelUpdateListener(listener); + String[] columns = clientViewer.getPresentationContext().getColumns(); + fVirtualViewer.setInput(input); + if (fVirtualViewer.canToggleColumns()) { + fVirtualViewer.setShowColumns(clientViewer.isShowColumns()); + fVirtualViewer.setVisibleColumns(columns); + } + fVirtualViewer.updateViewer(stateDelta); + return fVirtualViewer; } @Override public void run() { - final VirtualViewerListener listener = new VirtualViewerListener(); - VirtualTreeModelViewer virtualViewer = initVirtualViewer(fClientViewer, listener); + final VirtualViewerListener listener = new VirtualViewerListener(); + VirtualTreeModelViewer virtualViewer = initVirtualViewer(fClientViewer, listener); ProgressMonitorDialog dialog = new TimeTriggeredProgressMonitorDialog(fClientViewer.getControl().getShell(), 500); final IProgressMonitor monitor = dialog.getProgressMonitor(); @@ -194,23 +194,23 @@ public class VirtualFindAction extends Action implements IUpdate { try { dialog.run( - true, true, - new IRunnableWithProgress() { - @Override + true, true, + new IRunnableWithProgress() { + @Override public void run(final IProgressMonitor m) throws InvocationTargetException, InterruptedException { - synchronized(listener) { - listener.fProgressMonitor = m; - listener.fProgressMonitor.beginTask(DebugUIPlugin.removeAccelerators(getText()), listener.fRemainingUpdatesCount); - } - - while ((!listener.fLabelUpdatesComplete || !listener.fViewerUpdatesComplete) && !listener.fProgressMonitor.isCanceled()) { - Thread.sleep(1); - } - synchronized(listener) { - listener.fProgressMonitor = null; - } - } - }); + synchronized(listener) { + listener.fProgressMonitor = m; + listener.fProgressMonitor.beginTask(DebugUIPlugin.removeAccelerators(getText()), listener.fRemainingUpdatesCount); + } + + while ((!listener.fLabelUpdatesComplete || !listener.fViewerUpdatesComplete) && !listener.fProgressMonitor.isCanceled()) { + Thread.sleep(1); + } + synchronized(listener) { + listener.fProgressMonitor = null; + } + } + }); } catch (InvocationTargetException e) { DebugUIPlugin.log(e); return; @@ -225,30 +225,30 @@ public class VirtualFindAction extends Action implements IUpdate { FindLabelProvider labelProvider = new FindLabelProvider(virtualViewer, list); VirtualItem result = performFind(list, labelProvider); if (result != null) { - setSelectionToClient(virtualViewer, labelProvider, result); + setSelectionToClient(virtualViewer, labelProvider, result); } } - virtualViewer.removeLabelUpdateListener(listener); - virtualViewer.removeViewerUpdateListener(listener); - virtualViewer.dispose(); + virtualViewer.removeLabelUpdateListener(listener); + virtualViewer.removeViewerUpdateListener(listener); + virtualViewer.dispose(); } private int calcUpdatesCount(IModelDelta stateDelta) { - final int[] count = new int[] {0}; - stateDelta.accept( new IModelDeltaVisitor() { - @Override + final int[] count = new int[] {0}; + stateDelta.accept( new IModelDeltaVisitor() { + @Override public boolean visit(IModelDelta delta, int depth) { - if ((delta.getFlags() & IModelDelta.EXPAND) != 0) { - count[0] += delta.getChildCount(); - return true; - } - return false; - } - }); - - // Double it to account for separate element and label update ticks. - return count[0] * 2; + if ((delta.getFlags() & IModelDelta.EXPAND) != 0) { + count[0] += delta.getChildCount(); + return true; + } + return false; + } + }); + + // Double it to account for separate element and label update ticks. + return count[0] * 2; } private void collectAllChildren(VirtualItem element, List<VirtualItem> collect) { @@ -265,52 +265,52 @@ public class VirtualFindAction extends Action implements IUpdate { protected VirtualItem performFind(List<VirtualItem> items, FindLabelProvider labelProvider) { FindElementDialog dialog = new FindElementDialog( - fClientViewer.getControl().getShell(), - labelProvider, - items.toArray()); + fClientViewer.getControl().getShell(), + labelProvider, + items.toArray()); dialog.setTitle(ActionMessages.FindDialog_3); dialog.setMessage(ActionMessages.FindDialog_1); if (dialog.open() == Window.OK) { Object[] elements = dialog.getResult(); if (elements.length == 1) { - return (VirtualItem)elements[0]; + return (VirtualItem)elements[0]; } } return null; } protected void setSelectionToClient(VirtualTreeModelViewer virtualViewer, ILabelProvider labelProvider, VirtualItem findItem) { - virtualViewer.getTree().setSelection(new VirtualItem[] { findItem } ); - ModelDelta stateDelta = new ModelDelta(virtualViewer.getInput(), IModelDelta.NO_CHANGE); - virtualViewer.saveElementState(TreePath.EMPTY, stateDelta, IModelDelta.SELECT); - // Set the force flag to all select delta in order to override model's selection policy. - stateDelta.accept(new IModelDeltaVisitor() { - @Override + virtualViewer.getTree().setSelection(new VirtualItem[] { findItem } ); + ModelDelta stateDelta = new ModelDelta(virtualViewer.getInput(), IModelDelta.NO_CHANGE); + virtualViewer.saveElementState(TreePath.EMPTY, stateDelta, IModelDelta.SELECT); + // Set the force flag to all select delta in order to override model's selection policy. + stateDelta.accept(new IModelDeltaVisitor() { + @Override public boolean visit(IModelDelta delta, int depth) { - if ((delta.getFlags() & IModelDelta.SELECT) != 0) { - ((ModelDelta)delta).setFlags(delta.getFlags() | IModelDelta.FORCE); - } - return true; - } - }); - fClientViewer.updateViewer(stateDelta); - - ISelection selection = fClientViewer.getSelection(); - if (!selection.isEmpty() && - selection instanceof IStructuredSelection && - ((IStructuredSelection)selection).getFirstElement().equals(findItem.getData()) ) { - } else { - DebugUIPlugin.errorDialog( - fClientViewer.getControl().getShell(), - ActionMessages.VirtualFindAction_0, + if ((delta.getFlags() & IModelDelta.SELECT) != 0) { + ((ModelDelta)delta).setFlags(delta.getFlags() | IModelDelta.FORCE); + } + return true; + } + }); + fClientViewer.updateViewer(stateDelta); + + ISelection selection = fClientViewer.getSelection(); + if (!selection.isEmpty() && + selection instanceof IStructuredSelection && + ((IStructuredSelection)selection).getFirstElement().equals(findItem.getData()) ) { + } else { + DebugUIPlugin.errorDialog( + fClientViewer.getControl().getShell(), + ActionMessages.VirtualFindAction_0, MessageFormat.format(ActionMessages.VirtualFindAction_1, new Object[] { labelProvider.getText(findItem) }), - new Status(IStatus.ERROR, DebugUIPlugin.getUniqueIdentifier(), ActionMessages.VirtualFindAction_1)); - } + new Status(IStatus.ERROR, DebugUIPlugin.getUniqueIdentifier(), ActionMessages.VirtualFindAction_1)); + } } @Override public void update() { - setEnabled( fClientViewer.getInput() != null && fClientViewer.getChildCount(TreePath.EMPTY) > 0 ); + setEnabled( fClientViewer.getInput() != null && fClientViewer.getChildCount(TreePath.EMPTY) > 0 ); } } diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/ICheckUpdate.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/ICheckUpdate.java index 4be545f67..14afa964f 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/ICheckUpdate.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/ICheckUpdate.java @@ -22,18 +22,18 @@ package org.eclipse.debug.internal.ui.viewers.model.provisional; */ public interface ICheckUpdate extends ILabelUpdate { - /** - * Property of the presentation context which indicates that the viewer - * has the check box style. - */ - String PROP_CHECK = "org.eclipse.debug.ui.check"; //$NON-NLS-1$ + /** + * Property of the presentation context which indicates that the viewer + * has the check box style. + */ + String PROP_CHECK = "org.eclipse.debug.ui.check"; //$NON-NLS-1$ - /** - * Sets the check state of the tree node. - * - * @param checked Whether element should be checked. - * @param grayed Whether element should be grayed out. - */ - void setChecked(boolean checked, boolean grayed); + /** + * Sets the check state of the tree node. + * + * @param checked Whether element should be checked. + * @param grayed Whether element should be grayed out. + */ + void setChecked(boolean checked, boolean grayed); } diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/ICheckboxModelProxy.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/ICheckboxModelProxy.java index c85c55220..d8c9f3c99 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/ICheckboxModelProxy.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/ICheckboxModelProxy.java @@ -26,22 +26,22 @@ import org.eclipse.jface.viewers.TreePath; */ public interface ICheckboxModelProxy { - /** - * Notifies the receiver that the given element has had its - * checked state modified in the viewer. - * <p> - * This method is called in the UI thread. Clients that execute long running operations or - * communicate with a potentially unreliable or blocking model should run those operations - * asynchronously. - * </p> - * - * @param context Presentation context in which the element was updated. - * @param viewerInput The root element of the viewer where the check - * selection took place. - * @param path Path of the element that had its checked state changed - * @param checked The new checked state of the element - * @return false if the check state should not change - */ - boolean setChecked(IPresentationContext context, Object viewerInput, TreePath path, boolean checked); + /** + * Notifies the receiver that the given element has had its + * checked state modified in the viewer. + * <p> + * This method is called in the UI thread. Clients that execute long running operations or + * communicate with a potentially unreliable or blocking model should run those operations + * asynchronously. + * </p> + * + * @param context Presentation context in which the element was updated. + * @param viewerInput The root element of the viewer where the check + * selection took place. + * @param path Path of the element that had its checked state changed + * @param checked The new checked state of the element + * @return false if the check state should not change + */ + boolean setChecked(IPresentationContext context, Object viewerInput, TreePath path, boolean checked); } diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IElementContentProvider.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IElementContentProvider.java index 67c0b8bbf..6d43b485a 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IElementContentProvider.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IElementContentProvider.java @@ -42,7 +42,7 @@ public interface IElementContentProvider { * * @param updates Each update specifies children to update and stores results. * The update array is guaranteed to have at least one element, and for - * all updates to have the same presentation context. + * all updates to have the same presentation context. */ void update(IChildrenUpdate[] updates); diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IElementMementoProvider.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IElementMementoProvider.java index 8ab79d3ad..93bbd0c0e 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IElementMementoProvider.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IElementMementoProvider.java @@ -35,7 +35,7 @@ public interface IElementMementoProvider { * * @param requests Specifies elements and provides memento stores. * The requests array is guaranteed to have at least one element, and for - * all requests to have the same presentation context. + * all requests to have the same presentation context. */ void encodeElements(IElementMementoRequest[] requests); @@ -44,7 +44,7 @@ public interface IElementMementoProvider { * * @param requests Specifies each element and previously created memento. * The requests array is guaranteed to have at least one element, and for - * all requests to have the same presentation context. + * all requests to have the same presentation context. */ void compareElements(IElementCompareRequest[] requests); diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/ILabelUpdate.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/ILabelUpdate.java index cee30bef4..351a5db90 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/ILabelUpdate.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/ILabelUpdate.java @@ -41,37 +41,37 @@ public interface ILabelUpdate extends IViewerUpdate { * @param text to set to viewer * @param columnIndex column index (0 when no columns) */ - void setLabel(String text, int columnIndex); + void setLabel(String text, int columnIndex); - /** - * Sets the font of the label. - * - * @param fontData to set to viewer - * @param columnIndex column index (0 when no columns) - */ - void setFontData(FontData fontData, int columnIndex); + /** + * Sets the font of the label. + * + * @param fontData to set to viewer + * @param columnIndex column index (0 when no columns) + */ + void setFontData(FontData fontData, int columnIndex); - /** - * Sets the image of the label. - * - * @param image to set to viewer - * @param columnIndex column index (0 when no columns) - */ - void setImageDescriptor(ImageDescriptor image, int columnIndex); + /** + * Sets the image of the label. + * + * @param image to set to viewer + * @param columnIndex column index (0 when no columns) + */ + void setImageDescriptor(ImageDescriptor image, int columnIndex); - /** - * Sets the foreground color of the label. - * - * @param foreground to set to viewer - * @param columnIndex column index (0 when no columns) - */ - void setForeground(RGB foreground, int columnIndex); + /** + * Sets the foreground color of the label. + * + * @param foreground to set to viewer + * @param columnIndex column index (0 when no columns) + */ + void setForeground(RGB foreground, int columnIndex); - /** - * Sets the background color of the label. - * - * @param background to set to viewer - * @param columnIndex column index (0 when no columns) - */ - void setBackground(RGB background, int columnIndex); + /** + * Sets the background color of the label. + * + * @param background to set to viewer + * @param columnIndex column index (0 when no columns) + */ + void setBackground(RGB background, int columnIndex); } diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IModelProxy.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IModelProxy.java index 975081ff1..5fd7ca553 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IModelProxy.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IModelProxy.java @@ -69,8 +69,8 @@ public interface IModelProxy { * This method is called by the asynchronous viewer framework and should not * be called by clients. * </p> - * @param viewer viewer - * @see IModelProxy2#initialize(ITreeModelViewer) + * @param viewer viewer + * @see IModelProxy2#initialize(ITreeModelViewer) * @since 3.3 */ void installed(Viewer viewer); diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IModelProxy2.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IModelProxy2.java index c6eb135ab..eaeccfd63 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IModelProxy2.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IModelProxy2.java @@ -26,20 +26,20 @@ import org.eclipse.jface.viewers.Viewer; */ public interface IModelProxy2 extends IModelProxy { - /** - * Initialize model proxy with given tree model viewer. This method is - * called on the viewer's Display thread and is guaranteed to be called - * before the dispose() method is called on the same proxy. The default - * implementation of this method calls {@link #init(IPresentationContext)} - * and {@link #installed(Viewer)} asynchornously and not in the Display - * thread. - * <p> - * This method is called by the asynchronous viewer framework and should - * not be called by clients. - * </p> - * @param viewer Viewer that is installing this model proxy. - * - */ - void initialize(ITreeModelViewer viewer); + /** + * Initialize model proxy with given tree model viewer. This method is + * called on the viewer's Display thread and is guaranteed to be called + * before the dispose() method is called on the same proxy. The default + * implementation of this method calls {@link #init(IPresentationContext)} + * and {@link #installed(Viewer)} asynchornously and not in the Display + * thread. + * <p> + * This method is called by the asynchronous viewer framework and should + * not be called by clients. + * </p> + * @param viewer Viewer that is installing this model proxy. + * + */ + void initialize(ITreeModelViewer viewer); } diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IModelSelectionPolicy.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IModelSelectionPolicy.java index 9107eecc9..cf846b64f 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IModelSelectionPolicy.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IModelSelectionPolicy.java @@ -85,5 +85,5 @@ public interface IModelSelectionPolicy { * the selection after the update, or <code>null</code> if none * @return new selection or <code>null</code> if none */ - ISelection replaceInvalidSelection(ISelection invalidSelection, ISelection newSelection); + ISelection replaceInvalidSelection(ISelection invalidSelection, ISelection newSelection); } diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IPresentationContext.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IPresentationContext.java index 4cc72bfe2..bc411b429 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IPresentationContext.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IPresentationContext.java @@ -44,91 +44,91 @@ public interface IPresentationContext { */ String PROPERTY_DISPOSED = "PROPERTY_DISPOSED"; //$NON-NLS-1$ - /** - * Returns identifiers of the visible columns in the order - * labels should be provided, or <code>null</code> if columns - * are not being displayed. Label providers use this - * information. - * - * @return visible column identifiers or <code>null</code> - * @see IColumnPresentation - */ - String[] getColumns(); + /** + * Returns identifiers of the visible columns in the order + * labels should be provided, or <code>null</code> if columns + * are not being displayed. Label providers use this + * information. + * + * @return visible column identifiers or <code>null</code> + * @see IColumnPresentation + */ + String[] getColumns(); - /** - * Registers the given listener for property change notification. - * - * @param listener property listener - */ - void addPropertyChangeListener(IPropertyChangeListener listener); + /** + * Registers the given listener for property change notification. + * + * @param listener property listener + */ + void addPropertyChangeListener(IPropertyChangeListener listener); - /** - * Unregisters the given listener from property change notification. - * - * @param listener property listener. - */ - void removePropertyChangeListener(IPropertyChangeListener listener); + /** + * Unregisters the given listener from property change notification. + * + * @param listener property listener. + */ + void removePropertyChangeListener(IPropertyChangeListener listener); - /** - * Returns the id of this presentation context. Usually this is the id of - * the associated part. However, when no part is associated with this context, - * the id may exist on its own. Allows for a context that is not tied to a part. - * - * @return id - * @since 3.3 - */ - String getId(); + /** + * Returns the id of this presentation context. Usually this is the id of + * the associated part. However, when no part is associated with this context, + * the id may exist on its own. Allows for a context that is not tied to a part. + * + * @return id + * @since 3.3 + */ + String getId(); - /** - * Sets the specified property and notifies listeners of changes. - * - * @param property property name - * @param value property value - */ - void setProperty(String property, Object value); + /** + * Sets the specified property and notifies listeners of changes. + * + * @param property property name + * @param value property value + */ + void setProperty(String property, Object value); - /** - * Returns the property with the specified name or <code>null</code> - * if none. - * - * @param property property name - * @return property value or <code>null</code> - */ - Object getProperty(String property); + /** + * Returns the property with the specified name or <code>null</code> + * if none. + * + * @param property property name + * @return property value or <code>null</code> + */ + Object getProperty(String property); - /** - * Disposes this presentation context. Called by the framework - * when the associated viewer is disposed. - */ - void dispose(); + /** + * Disposes this presentation context. Called by the framework + * when the associated viewer is disposed. + */ + void dispose(); - /** - * Returns all keys of properties currently set in this context, - * possibly an empty collection - * - * @return keys of all current properties - * @since 3.4 - */ - String[] getProperties(); + /** + * Returns all keys of properties currently set in this context, + * possibly an empty collection + * + * @return keys of all current properties + * @since 3.4 + */ + String[] getProperties(); - /** - * Returns the part that this presentation context is associated with. - * May return <code>null</code> if the presentation is not associated - * with a part. - * - * @return IWorkbenchPart or <code>null</code> - * @since 3.6 - */ - IWorkbenchPart getPart(); + /** + * Returns the part that this presentation context is associated with. + * May return <code>null</code> if the presentation is not associated + * with a part. + * + * @return IWorkbenchPart or <code>null</code> + * @since 3.6 + */ + IWorkbenchPart getPart(); - /** - * Returns the window that this presentation context is associated with. - * May return <code>null</code> if the presentation is not associated - * with a window. - * - * @return IWorkbenchWindow or <code>null</code> - * @since 3.6 - */ - IWorkbenchWindow getWindow(); + /** + * Returns the window that this presentation context is associated with. + * May return <code>null</code> if the presentation is not associated + * with a window. + * + * @return IWorkbenchWindow or <code>null</code> + * @since 3.6 + */ + IWorkbenchWindow getWindow(); } diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IStateUpdateListener.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IStateUpdateListener.java index 198b97a0e..fddacb5cd 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IStateUpdateListener.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IStateUpdateListener.java @@ -32,30 +32,30 @@ public interface IStateUpdateListener { * Notification that viewer updates are complete. Corresponds to * a <code>viewerUpdatesBegin()</code> notification. * - * @param input Input object for the state operation. + * @param input Input object for the state operation. */ void stateSaveUpdatesComplete(Object input); /** - * Notification that a sequence of viewer updates are starting. - * - * @param input Input object for the state operation. - */ - void stateRestoreUpdatesBegin(Object input); + * Notification that a sequence of viewer updates are starting. + * + * @param input Input object for the state operation. + */ + void stateRestoreUpdatesBegin(Object input); - /** - * Notification that viewer updates are complete. Corresponds to - * a <code>viewerUpdatesBegin()</code> notification. - * - * @param input Input object for the state operation. - */ - void stateRestoreUpdatesComplete(Object input); + /** + * Notification that viewer updates are complete. Corresponds to + * a <code>viewerUpdatesBegin()</code> notification. + * + * @param input Input object for the state operation. + */ + void stateRestoreUpdatesComplete(Object input); /** * Notification that a specific update has started within * a sequence of updates. * - * @param input Input object for the state operation. + * @param input Input object for the state operation. * @param update update */ void stateUpdateStarted(Object input, IViewerUpdate update); @@ -64,7 +64,7 @@ public interface IStateUpdateListener { * Notification that a specific update has completed within a * sequence of updates. * - * @param input Input object for the state operation. + * @param input Input object for the state operation. * @param update update */ void stateUpdateComplete(Object input, IViewerUpdate update); diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IStatusMonitor.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IStatusMonitor.java index 6e63beb16..5c7b18f74 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IStatusMonitor.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IStatusMonitor.java @@ -42,20 +42,20 @@ import org.eclipse.core.runtime.IStatus; */ public interface IStatusMonitor extends IProgressMonitor { - /** - * Sets the status for a request, possibly <code>null</code>. - * When a request fails, the status indicates why the request failed. - * A <code>null</code> status is considered to be successful. - * - * @param status request status - */ - void setStatus(IStatus status); + /** + * Sets the status for a request, possibly <code>null</code>. + * When a request fails, the status indicates why the request failed. + * A <code>null</code> status is considered to be successful. + * + * @param status request status + */ + void setStatus(IStatus status); - /** - * Returns the status of this request, or <code>null</code>. - * - * @return request status - <code>null</code> is equivalent - * to an OK status - */ - IStatus getStatus(); + /** + * Returns the status of this request, or <code>null</code>. + * + * @return request status - <code>null</code> is equivalent + * to an OK status + */ + IStatus getStatus(); } diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/ITreeModelViewer.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/ITreeModelViewer.java index 8c0dc9887..b7ba38a9a 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/ITreeModelViewer.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/ITreeModelViewer.java @@ -31,251 +31,251 @@ import org.eclipse.swt.widgets.Display; */ public interface ITreeModelViewer extends ISelectionProvider { - /** - * Constant indicating that all levels of the tree should be expanded or - * collapsed. - * - * @see #setAutoExpandLevel(int) - * @see #getAutoExpandLevel() - */ - int ALL_LEVELS = -1; + /** + * Constant indicating that all levels of the tree should be expanded or + * collapsed. + * + * @see #setAutoExpandLevel(int) + * @see #getAutoExpandLevel() + */ + int ALL_LEVELS = -1; - /** - * Returns the Display object that this viewer is in. The - * display object can be used by clients to access the display thread - * to call the viewer methods. - * - * @return The display. - */ - Display getDisplay(); + /** + * Returns the Display object that this viewer is in. The + * display object can be used by clients to access the display thread + * to call the viewer methods. + * + * @return The display. + */ + Display getDisplay(); - /** - * Returns this viewer's presentation context. - * - * @return presentation context - */ - IPresentationContext getPresentationContext(); + /** + * Returns this viewer's presentation context. + * + * @return presentation context + */ + IPresentationContext getPresentationContext(); - /** - * Returns the current input of this viewer, or <code>null</code> - * if none. The viewer's input provides the "model" for the viewer's - * content. - * - * @return Input object - */ - Object getInput(); + /** + * Returns the current input of this viewer, or <code>null</code> + * if none. The viewer's input provides the "model" for the viewer's + * content. + * + * @return Input object + */ + Object getInput(); - /** - * Sets the input of this viewer. Setting the input resets the - * viewer's contents and triggers an update starting at the input - * element. - * - * @param object Input element, or <code>null</code> if none. - */ - void setInput(Object object); + /** + * Sets the input of this viewer. Setting the input resets the + * viewer's contents and triggers an update starting at the input + * element. + * + * @param object Input element, or <code>null</code> if none. + */ + void setInput(Object object); - /** - * Returns the current selection in viewer. - * - * @return selection object - */ - @Override ISelection getSelection(); + /** + * Returns the current selection in viewer. + * + * @return selection object + */ + @Override ISelection getSelection(); - /** - * Sets a new selection for this viewer and optionally makes it visible. - * The selection is not set if the model selection policy overrides the - * attempt to set the selection. - * - * @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 - */ - void setSelection(ISelection selection, boolean reveal, boolean force); + /** + * Sets a new selection for this viewer and optionally makes it visible. + * The selection is not set if the model selection policy overrides the + * attempt to set the selection. + * + * @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 + */ + void setSelection(ISelection selection, boolean reveal, boolean force); - /** - * Attempts to set the selection for this viewer and optionally makes it visible. - * The selection is not set if the model selection policy overrides the - * attempt to set the selection. - * - * @param selection the new selection - * @param reveal whether to make the selection visible after successfully setting - * the selection - * @param force whether to force the selection (override the model selection policy) - * @return <code>true</code> if the selection was set and <code>false</code> if the - * model selection policy overrides the selection attempt - */ - boolean trySelection(ISelection selection, boolean reveal, boolean force); + /** + * Attempts to set the selection for this viewer and optionally makes it visible. + * The selection is not set if the model selection policy overrides the + * attempt to set the selection. + * + * @param selection the new selection + * @param reveal whether to make the selection visible after successfully setting + * the selection + * @param force whether to force the selection (override the model selection policy) + * @return <code>true</code> if the selection was set and <code>false</code> if the + * model selection policy overrides the selection attempt + */ + boolean trySelection(ISelection selection, boolean reveal, boolean force); - /** - * Returns the auto-expand level. - * - * @return non-negative level, or <code>ALL_LEVELS</code> if all levels of - * the tree are expanded automatically - * @see #setAutoExpandLevel - */ - int getAutoExpandLevel(); + /** + * Returns the auto-expand level. + * + * @return non-negative level, or <code>ALL_LEVELS</code> if all levels of + * the tree are expanded automatically + * @see #setAutoExpandLevel + */ + int getAutoExpandLevel(); - /** - * Sets the auto-expand level to be used when the input of the viewer is set - * using {@link #setInput(Object)}. The value 0 means that there is no - * auto-expand; 1 means that the invisible root element is expanded (since - * most concrete implementations do not show the root element, there is usually - * no practical difference between using the values 0 and 1); 2 means that - * top-level elements are expanded, but not their children; 3 means that - * top-level elements are expanded, and their children, but not - * grandchildren; and so on. - * <p> - * The value <code>ALL_LEVELS</code> means that all subtrees should be - * expanded. - * </p> - * - * @param level - * non-negative level, or <code>ALL_LEVELS</code> to expand all - * levels of the tree - */ - void setAutoExpandLevel(int level); + /** + * Sets the auto-expand level to be used when the input of the viewer is set + * using {@link #setInput(Object)}. The value 0 means that there is no + * auto-expand; 1 means that the invisible root element is expanded (since + * most concrete implementations do not show the root element, there is usually + * no practical difference between using the values 0 and 1); 2 means that + * top-level elements are expanded, but not their children; 3 means that + * top-level elements are expanded, and their children, but not + * grandchildren; and so on. + * <p> + * The value <code>ALL_LEVELS</code> means that all subtrees should be + * expanded. + * </p> + * + * @param level + * non-negative level, or <code>ALL_LEVELS</code> to expand all + * levels of the tree + */ + void setAutoExpandLevel(int level); - /** - * Returns the label data for the given element and for the given column, - * Returns <code>null</code> if the given element is not found or is not - * materialized in the virtual viewer. Clients may listen to label update - * events to be notified when element labels are updated. - * - * @param path Path of the element. - * @param columnId ID of the column for which to return the label data. - * @return Label object containing the label information. Can be - * <code>null</code> if the given element is not found or is not - * materialized in the virtual viewer. - */ - ViewerLabel getElementLabel(TreePath path, String columnId); + /** + * Returns the label data for the given element and for the given column, + * Returns <code>null</code> if the given element is not found or is not + * materialized in the virtual viewer. Clients may listen to label update + * events to be notified when element labels are updated. + * + * @param path Path of the element. + * @param columnId ID of the column for which to return the label data. + * @return Label object containing the label information. Can be + * <code>null</code> if the given element is not found or is not + * materialized in the virtual viewer. + */ + ViewerLabel getElementLabel(TreePath path, String columnId); - /** - * Registers the specified listener for view update notifications. - * - * @param listener Listener to add - */ - void addViewerUpdateListener(IViewerUpdateListener listener); + /** + * Registers the specified listener for view update notifications. + * + * @param listener Listener to add + */ + void addViewerUpdateListener(IViewerUpdateListener listener); - /** - * Removes the specified listener from update notifications. - * - * @param listener Listener to remove - */ - void removeViewerUpdateListener(IViewerUpdateListener listener); + /** + * Removes the specified listener from update notifications. + * + * @param listener Listener to remove + */ + void removeViewerUpdateListener(IViewerUpdateListener listener); - /** - * Registers the specified listener for state update notifications. - * - * @param listener Listener to add - */ - void addStateUpdateListener(IStateUpdateListener listener); + /** + * Registers the specified listener for state update notifications. + * + * @param listener Listener to add + */ + void addStateUpdateListener(IStateUpdateListener listener); - /** - * Removes the specified listener from state update notifications. - * - * @param listener Listener to remove - */ - void removeStateUpdateListener(IStateUpdateListener listener); + /** + * Removes the specified listener from state update notifications. + * + * @param listener Listener to remove + */ + void removeStateUpdateListener(IStateUpdateListener listener); - /** - * Registers the specified listener for view label update notifications. - * - * @param listener Listener to add - */ - void addLabelUpdateListener(ILabelUpdateListener listener); + /** + * Registers the specified listener for view label update notifications. + * + * @param listener Listener to add + */ + void addLabelUpdateListener(ILabelUpdateListener listener); - /** - * Removes the specified listener from view label update notifications. - * - * @param listener Listener to remove - */ - void removeLabelUpdateListener(ILabelUpdateListener listener); + /** + * Removes the specified listener from view label update notifications. + * + * @param listener Listener to remove + */ + void removeLabelUpdateListener(ILabelUpdateListener listener); - /** - * Registers the given listener for model delta notification. - * This listener is called immediately after the viewer processes - * the delta. - * - * @param listener Listener to add - */ - void addModelChangedListener(IModelChangedListener listener); + /** + * Registers the given listener for model delta notification. + * This listener is called immediately after the viewer processes + * the delta. + * + * @param listener Listener to add + */ + void addModelChangedListener(IModelChangedListener listener); - /** - * Removes the given listener from model delta notification. - * - * @param listener Listener to remove - */ - void removeModelChangedListener(IModelChangedListener listener); + /** + * Removes the given listener from model delta notification. + * + * @param listener Listener to remove + */ + void removeModelChangedListener(IModelChangedListener listener); - /** - * Writes state information into a delta for the sub-tree at the given - * path. It adds delta nodes and IModelDelta.EXPAND and IModelDelta.SELECT - * as it parses the sub-tree. - * - * @param path Path where to start saving the state. - * @param delta The delta where the state is to be saved. - * @param flagsToSave The flags to preserve during the state save. The - * supported flags are <code>IModelDelta.SELECT</code>, - * <code>IModelDelta.EXPAND</code>, <code>IModelDelta.COLLAPSE</code>. - * @return Returns whether the state was saved for the given path. Will - * return <code>false</code> if an element at the given path cannot - * be found. - */ - boolean saveElementState(TreePath path, ModelDelta delta, int flagsToSave); + /** + * Writes state information into a delta for the sub-tree at the given + * path. It adds delta nodes and IModelDelta.EXPAND and IModelDelta.SELECT + * as it parses the sub-tree. + * + * @param path Path where to start saving the state. + * @param delta The delta where the state is to be saved. + * @param flagsToSave The flags to preserve during the state save. The + * supported flags are <code>IModelDelta.SELECT</code>, + * <code>IModelDelta.EXPAND</code>, <code>IModelDelta.COLLAPSE</code>. + * @return Returns whether the state was saved for the given path. Will + * return <code>false</code> if an element at the given path cannot + * be found. + */ + boolean saveElementState(TreePath path, ModelDelta delta, int flagsToSave); - /** - * Causes the viewer to process the given delta as if it came from a - * model proxy. This method is intended to be used to restore state - * saved using {@link #saveElementState(TreePath, ModelDelta, int)}. - * - * @param delta Delta to process. - */ - void updateViewer(IModelDelta delta); + /** + * Causes the viewer to process the given delta as if it came from a + * model proxy. This method is intended to be used to restore state + * saved using {@link #saveElementState(TreePath, ModelDelta, int)}. + * + * @param delta Delta to process. + */ + void updateViewer(IModelDelta delta); - /** - * Triggers an update of the given element and its children. If - * multiple instances of the given element are found in the tree, - * they will all be updated. - * - * @param element Element to update. - */ - void refresh(Object element); + /** + * Triggers an update of the given element and its children. If + * multiple instances of the given element are found in the tree, + * they will all be updated. + * + * @param element Element to update. + */ + void refresh(Object element); - /** - * Triggers a full update of all the elements in the tree. - */ - void refresh(); + /** + * Triggers a full update of all the elements in the tree. + */ + void refresh(); - /** - * Returns the paths at which the given element is found realized in viewer - * or an empty array if not found. - * - * @param element Element to find. - * @return Array of paths for given element. - */ - TreePath[] getElementPaths(Object element); + /** + * Returns the paths at which the given element is found realized in viewer + * or an empty array if not found. + * + * @param element Element to find. + * @return Array of paths for given element. + */ + TreePath[] getElementPaths(Object element); - /** - * Returns filters currently configured in viewer. - * - * @return filter array in viewer. - */ - ViewerFilter[] getFilters(); + /** + * Returns filters currently configured in viewer. + * + * @return filter array in viewer. + */ + ViewerFilter[] getFilters(); - /** - * Add a new filter to use in viewer. - * - * @param filter Filter to add. - */ - void addFilter(ViewerFilter filter); + /** + * Add a new filter to use in viewer. + * + * @param filter Filter to add. + */ + void addFilter(ViewerFilter filter); - /** - * Sets viewer filters to the filters in array. - * - * @param filters New filter array to use. - */ + /** + * Sets viewer filters to the filters in array. + * + * @param filters New filter array to use. + */ void setFilters(ViewerFilter... filters); } diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IViewerUpdate.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IViewerUpdate.java index a7141a47e..dda5ce605 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IViewerUpdate.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IViewerUpdate.java @@ -31,27 +31,27 @@ public interface IViewerUpdate extends IRequest { */ IPresentationContext getPresentationContext(); - /** - * Returns the model element associated with this request. - * - * @return associated model element - */ - Object getElement(); + /** + * Returns the model element associated with this request. + * + * @return associated model element + */ + Object getElement(); - /** - * Returns the viewer tree path to the model element associated with this - * request. An empty path indicates a root element. - * - * @return tree path, possibly empty - */ - TreePath getElementPath(); + /** + * Returns the viewer tree path to the model element associated with this + * request. An empty path indicates a root element. + * + * @return tree path, possibly empty + */ + TreePath getElementPath(); - /** - * Returns the element that was the viewer input at the time the - * request was made, possibly <code>null</code>. - * - * @return viewer input element, possibly <code>null</code> - * @since 3.4 - */ - Object getViewerInput(); + /** + * Returns the element that was the viewer input at the time the + * request was made, possibly <code>null</code>. + * + * @return viewer input element, possibly <code>null</code> + * @since 3.4 + */ + Object getViewerInput(); } diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IVirtualItemListener.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IVirtualItemListener.java index 41d449be7..bee1e2b4c 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IVirtualItemListener.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IVirtualItemListener.java @@ -22,20 +22,20 @@ package org.eclipse.debug.internal.ui.viewers.model.provisional; */ public interface IVirtualItemListener { - /** - * Called when the item has been shown in the virtual viewer's - * view-port. This indicates to the viewer that it should check - * the item's status and request needed data. - * - * @param item The item that was revealed. - */ - void revealed(VirtualItem item); + /** + * Called when the item has been shown in the virtual viewer's + * view-port. This indicates to the viewer that it should check + * the item's status and request needed data. + * + * @param item The item that was revealed. + */ + void revealed(VirtualItem item); - /** - * Called when an item is disposed. It tells the viewer to - * clean up any remaining mappings and cached data of this item. - * - * @param item The itam that was disposed. - */ - void disposed(VirtualItem item); + /** + * Called when an item is disposed. It tells the viewer to + * clean up any remaining mappings and cached data of this item. + * + * @param item The itam that was disposed. + */ + void disposed(VirtualItem item); }
\ No newline at end of file diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IVirtualItemValidator.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IVirtualItemValidator.java index d0054865b..981a842e0 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IVirtualItemValidator.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IVirtualItemValidator.java @@ -23,19 +23,19 @@ package org.eclipse.debug.internal.ui.viewers.model.provisional; */ public interface IVirtualItemValidator { - /** - * Allows the validator to determine whether the given item is to be deemed - * visible in the virtual tree. - * - * @param item Item to be tested. - * @return returns true if the item should be considered visible. - */ - boolean isItemVisible(VirtualItem item); + /** + * Allows the validator to determine whether the given item is to be deemed + * visible in the virtual tree. + * + * @param item Item to be tested. + * @return returns true if the item should be considered visible. + */ + boolean isItemVisible(VirtualItem item); - /** - * Indicates that the viewer requested to reveal the given item in viewer. - * - * @param item Item to show. - */ - void showItem(VirtualItem item); + /** + * Indicates that the viewer requested to reveal the given item in viewer. + * + * @param item Item to show. + */ + void showItem(VirtualItem item); } diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/ModelDelta.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/ModelDelta.java index 369307a8f..cb147026e 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/ModelDelta.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/ModelDelta.java @@ -64,8 +64,8 @@ public class ModelDelta implements IModelDelta { */ public ModelDelta(Object element, Object replacement, int flags) { this(element, flags); - fReplacement = replacement; - } + fReplacement = replacement; + } /** * Constructs a new delta for the given element to be inserted at @@ -75,10 +75,10 @@ public class ModelDelta implements IModelDelta { * @param index insertion position * @param flags change flags */ - public ModelDelta(Object element, int index, int flags) { + public ModelDelta(Object element, int index, int flags) { this(element, flags); - fIndex = index; - } + fIndex = index; + } /** * Constructs a new delta for the given element at the specified index @@ -89,12 +89,12 @@ public class ModelDelta implements IModelDelta { * @param flags change flags * @param childCount number of children this node has */ - public ModelDelta(Object element, int index, int flags, int childCount) { + public ModelDelta(Object element, int index, int flags, int childCount) { this(element, index, flags); - fChildCount = childCount; - } + fChildCount = childCount; + } - @Override + @Override public Object getElement() { return fElement; } @@ -126,74 +126,74 @@ public class ModelDelta implements IModelDelta { * @return corresponding delta node, or <code>null</code> */ public ModelDelta getChildDelta(Object element) { - if (fNodesMap == null) { - mapNodes(); - } - Object nodeOrNodes = fNodesMap.get(element); - if (nodeOrNodes instanceof ModelDelta) { - return (ModelDelta)nodeOrNodes; - } else if (nodeOrNodes instanceof ModelDelta[]) { - return ((ModelDelta[])nodeOrNodes)[0]; - } - return null; + if (fNodesMap == null) { + mapNodes(); + } + Object nodeOrNodes = fNodesMap.get(element); + if (nodeOrNodes instanceof ModelDelta) { + return (ModelDelta)nodeOrNodes; + } else if (nodeOrNodes instanceof ModelDelta[]) { + return ((ModelDelta[])nodeOrNodes)[0]; + } + return null; } /** - * Returns the child delta for the given element and index, or <code>null</code> if none. - * - * @param element Element of the child delta to find - * @param index Index of the child delta to find. - * @return corresponding delta node, or <code>null</code> - * - * @since 3.8 - */ - public ModelDelta getChildDelta(Object element, int index) { - if (fNodesMap == null) { - mapNodes(); - } - Object nodeOrNodes = fNodesMap.get(element); - if (nodeOrNodes instanceof ModelDelta) { - ModelDelta node = (ModelDelta)nodeOrNodes; - if (index == node.getIndex()) { - return node; - } - } else if (nodeOrNodes instanceof ModelDelta[]) { - ModelDelta[] nodes = (ModelDelta[])nodeOrNodes; - for (int i = 0; i < nodes.length; i++) { - if (index == nodes[i].getIndex()) { - return nodes[i]; - } - } - } - return null; - } + * Returns the child delta for the given element and index, or <code>null</code> if none. + * + * @param element Element of the child delta to find + * @param index Index of the child delta to find. + * @return corresponding delta node, or <code>null</code> + * + * @since 3.8 + */ + public ModelDelta getChildDelta(Object element, int index) { + if (fNodesMap == null) { + mapNodes(); + } + Object nodeOrNodes = fNodesMap.get(element); + if (nodeOrNodes instanceof ModelDelta) { + ModelDelta node = (ModelDelta)nodeOrNodes; + if (index == node.getIndex()) { + return node; + } + } else if (nodeOrNodes instanceof ModelDelta[]) { + ModelDelta[] nodes = (ModelDelta[])nodeOrNodes; + for (int i = 0; i < nodes.length; i++) { + if (index == nodes[i].getIndex()) { + return nodes[i]; + } + } + } + return null; + } private void mapNodes() { - if (fNodesList == null) { + if (fNodesList == null) { fNodesMap = new HashMap<>(1); - return; - } - // Create a map with capacity for all child nodes. + return; + } + // Create a map with capacity for all child nodes. fNodesMap = new HashMap<>(fNodesList.size() * 4 / 3); - for (int i = 0; i < fNodesList.size(); i++) { - mapNode( fNodesList.get(i) ); - } + for (int i = 0; i < fNodesList.size(); i++) { + mapNode( fNodesList.get(i) ); + } } private void mapNode(ModelDelta node) { - Object oldValue = fNodesMap.put(node.getElement(), node); - if (oldValue instanceof ModelDelta) { - // Edge case: already a node for given element was added. - ModelDelta[] nodes = new ModelDelta[] { (ModelDelta)oldValue, node }; - fNodesMap.put(node.getElement(), nodes); - } else if (oldValue instanceof ModelDelta[]) { - // Even more remote case: multiple delta nodes for the same element were already added - ModelDelta[] oldNodes = (ModelDelta[])oldValue; - ModelDelta[] newNodes = new ModelDelta[oldNodes.length + 1]; - System.arraycopy(oldNodes, 0, newNodes, 0, oldNodes.length); - newNodes[newNodes.length - 1] = node; - fNodesMap.put(node.getElement(), newNodes); - } + Object oldValue = fNodesMap.put(node.getElement(), node); + if (oldValue instanceof ModelDelta) { + // Edge case: already a node for given element was added. + ModelDelta[] nodes = new ModelDelta[] { (ModelDelta)oldValue, node }; + fNodesMap.put(node.getElement(), nodes); + } else if (oldValue instanceof ModelDelta[]) { + // Even more remote case: multiple delta nodes for the same element were already added + ModelDelta[] oldNodes = (ModelDelta[])oldValue; + ModelDelta[] newNodes = new ModelDelta[oldNodes.length + 1]; + System.arraycopy(oldNodes, 0, newNodes, 0, oldNodes.length); + newNodes[newNodes.length - 1] = node; + fNodesMap.put(node.getElement(), newNodes); + } } @@ -207,51 +207,51 @@ public class ModelDelta implements IModelDelta { * @param flags change flags * @return newly created child delta */ - public ModelDelta addNode(Object element, Object replacement, int flags) { - ModelDelta node = new ModelDelta(element, replacement, flags); - node.setParent(this); - addDelta(node); - return node; - } - - /** - * Adds a child delta to this delta to insert the specified element at - * the given index, and returns the newly created child delta. - * - * @param element child element in insert - * @param index index of insertion - * @param flags change flags - * @return newly created child delta - */ - public ModelDelta addNode(Object element, int index, int flags) { - ModelDelta node = new ModelDelta(element, index, flags); - node.setParent(this); - addDelta(node); - return node; - } - - /** - * Adds a child delta to this delta at the specified index with the - * given number of children, and returns the newly created child delta. - * - * @param element child element in insert - * @param index index of the element relative to parent - * @param flags change flags - * @param numChildren the number of children the element has - * @return newly created child delta - */ - public ModelDelta addNode(Object element, int index, int flags, int numChildren) { - ModelDelta node = new ModelDelta(element, index, flags, numChildren); - node.setParent(this); - addDelta(node); - return node; - } - - /** - * Sets the parent delta of this delta - * - * @param node parent delta - */ + public ModelDelta addNode(Object element, Object replacement, int flags) { + ModelDelta node = new ModelDelta(element, replacement, flags); + node.setParent(this); + addDelta(node); + return node; + } + + /** + * Adds a child delta to this delta to insert the specified element at + * the given index, and returns the newly created child delta. + * + * @param element child element in insert + * @param index index of insertion + * @param flags change flags + * @return newly created child delta + */ + public ModelDelta addNode(Object element, int index, int flags) { + ModelDelta node = new ModelDelta(element, index, flags); + node.setParent(this); + addDelta(node); + return node; + } + + /** + * Adds a child delta to this delta at the specified index with the + * given number of children, and returns the newly created child delta. + * + * @param element child element in insert + * @param index index of the element relative to parent + * @param flags change flags + * @param numChildren the number of children the element has + * @return newly created child delta + */ + public ModelDelta addNode(Object element, int index, int flags, int numChildren) { + ModelDelta node = new ModelDelta(element, index, flags, numChildren); + node.setParent(this); + addDelta(node); + return node; + } + + /** + * Sets the parent delta of this delta + * + * @param node parent delta + */ void setParent(ModelDelta node) { fParent = node; } @@ -261,21 +261,21 @@ public class ModelDelta implements IModelDelta { return fParent; } - @Override + @Override public Object getReplacementElement() { - return fReplacement; - } + return fReplacement; + } - @Override + @Override public int getIndex() { - return fIndex; - } + return fIndex; + } @Override public IModelDelta[] getChildDeltas() { - if (fNodes == null) { - fNodes = fNodesList.toArray(new ModelDelta[fNodesList.size()]); - } + if (fNodes == null) { + fNodes = fNodesList.toArray(new ModelDelta[fNodesList.size()]); + } return fNodes; } @@ -283,11 +283,11 @@ public class ModelDelta implements IModelDelta { if (fNodesList == null) { fNodesList = new ArrayList<>(4); } - fNodesList.add(delta); - fNodes = null; - if (fNodesMap != null) { - mapNode(delta); - } + fNodesList.add(delta); + fNodes = null; + if (fNodesMap != null) { + mapNode(delta); + } } @Override @@ -300,11 +300,11 @@ public class ModelDelta implements IModelDelta { } private void appendDetail(String indent, StringBuffer buf, IModelDelta delta) { - buf.append(indent); + buf.append(indent); buf.append("Element: "); //$NON-NLS-1$ buf.append(delta.getElement()); buf.append('\n'); - buf.append(indent); + buf.append(indent); buf.append(" Flags: "); //$NON-NLS-1$ int flags = delta.getFlags(); if (flags == 0) { @@ -316,9 +316,9 @@ public class ModelDelta implements IModelDelta { if ((flags & IModelDelta.CONTENT) > 0) { buf.append("CONTENT | "); //$NON-NLS-1$ } - if ((flags & IModelDelta.COLLAPSE) > 0) { - buf.append("COLLAPSE | "); //$NON-NLS-1$ - } + if ((flags & IModelDelta.COLLAPSE) > 0) { + buf.append("COLLAPSE | "); //$NON-NLS-1$ + } if ((flags & IModelDelta.EXPAND) > 0) { buf.append("EXPAND | "); //$NON-NLS-1$ } @@ -344,15 +344,15 @@ public class ModelDelta implements IModelDelta { buf.append("UNINSTALL | "); //$NON-NLS-1$ } if ((flags & IModelDelta.REVEAL) > 0) { - buf.append("REVEAL | "); //$NON-NLS-1$ - } - if ((flags & IModelDelta.FORCE) > 0) { - buf.append("FORCE | "); //$NON-NLS-1$ - } + buf.append("REVEAL | "); //$NON-NLS-1$ + } + if ((flags & IModelDelta.FORCE) > 0) { + buf.append("FORCE | "); //$NON-NLS-1$ + } } buf.append('\n'); - buf.append(indent); + buf.append(indent); buf.append(" Index: "); //$NON-NLS-1$ buf.append(delta.getIndex()); buf.append(" Child Count: "); //$NON-NLS-1$ @@ -401,23 +401,23 @@ public class ModelDelta implements IModelDelta { fFlags = flags; } - /** - * Sets this delta's index - * - * @param index new index to set - * @since 3.6 - */ - public void setIndex(int index) { - fIndex = index; - } + /** + * Sets this delta's index + * + * @param index new index to set + * @since 3.6 + */ + public void setIndex(int index) { + fIndex = index; + } /** - * Sets this delta's child count. - * - * @param count new child count to set - */ - public void setChildCount(int count) { - fChildCount = count; - } + * Sets this delta's child count. + * + * @param count new child count to set + */ + public void setChildCount(int count) { + fChildCount = count; + } } diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/PresentationContext.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/PresentationContext.java index 6cf38ac23..7fed0f718 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/PresentationContext.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/PresentationContext.java @@ -40,63 +40,63 @@ import org.eclipse.ui.PlatformUI; */ public class PresentationContext implements IPresentationContext { - private static final String PRESENTATION_CONTEXT_PROPERTIES = "PRESENTATION_CONTEXT_PROPERTIES"; //$NON-NLS-1$ - private static final String BOOLEAN = "BOOLEAN"; //$NON-NLS-1$ - private static final String STRING = "STRING"; //$NON-NLS-1$ - private static final String INTEGER = "INTEGER"; //$NON-NLS-1$ - private static final String PERSISTABLE = "PERSISTABLE"; //$NON-NLS-1$ + private static final String PRESENTATION_CONTEXT_PROPERTIES = "PRESENTATION_CONTEXT_PROPERTIES"; //$NON-NLS-1$ + private static final String BOOLEAN = "BOOLEAN"; //$NON-NLS-1$ + private static final String STRING = "STRING"; //$NON-NLS-1$ + private static final String INTEGER = "INTEGER"; //$NON-NLS-1$ + private static final String PERSISTABLE = "PERSISTABLE"; //$NON-NLS-1$ - final private String fId; + final private String fId; final private ListenerList<IPropertyChangeListener> fListeners = new ListenerList<>(); final private Map<String, Object> fProperties = new HashMap<>(); - private IWorkbenchWindow fWindow; - private IWorkbenchPart fPart; - - /** - * Constructs a presentation context for the given id. - * - * @param id presentation context id - */ - public PresentationContext(String id) { - this (id, null, null); - } - - /** - * Constructs a presentation context for the given id and window. - * - * @param id presentation context id - * @param window presentation context window, may be <code>null</code> - */ - public PresentationContext(String id, IWorkbenchWindow window) { - this (id, window, null); - } - - /** - * Constructs a presentation context for the given id and part. - * The presentation context window is derived from the part. - * - * @param id presentation context id - * @param part presentation context part, may be <code>null</code> - */ - public PresentationContext(String id, IWorkbenchPart part) { - this (id, part == null ? null : part.getSite().getWorkbenchWindow(), part); - } - - /** - * Constructs a presentation context for the given id and part. - * The presentation context id and window are derived from the part. - * - * @param part presentation context part, can NOT be <code>null</code> - */ - public PresentationContext(IWorkbenchPart part) { - this (part.getSite().getId(), part.getSite().getWorkbenchWindow(), part); - } - - private PresentationContext(String id, IWorkbenchWindow window, IWorkbenchPart part) { - fId = id; - fWindow = window; - fPart = part; - } + private IWorkbenchWindow fWindow; + private IWorkbenchPart fPart; + + /** + * Constructs a presentation context for the given id. + * + * @param id presentation context id + */ + public PresentationContext(String id) { + this (id, null, null); + } + + /** + * Constructs a presentation context for the given id and window. + * + * @param id presentation context id + * @param window presentation context window, may be <code>null</code> + */ + public PresentationContext(String id, IWorkbenchWindow window) { + this (id, window, null); + } + + /** + * Constructs a presentation context for the given id and part. + * The presentation context window is derived from the part. + * + * @param id presentation context id + * @param part presentation context part, may be <code>null</code> + */ + public PresentationContext(String id, IWorkbenchPart part) { + this (id, part == null ? null : part.getSite().getWorkbenchWindow(), part); + } + + /** + * Constructs a presentation context for the given id and part. + * The presentation context id and window are derived from the part. + * + * @param part presentation context part, can NOT be <code>null</code> + */ + public PresentationContext(IWorkbenchPart part) { + this (part.getSite().getId(), part.getSite().getWorkbenchWindow(), part); + } + + private PresentationContext(String id, IWorkbenchWindow window, IWorkbenchPart part) { + fId = id; + fWindow = window; + fPart = part; + } @Override public String[] getColumns() { @@ -136,8 +136,8 @@ public class PresentationContext implements IPresentationContext { @Override public void dispose() { - fProperties.clear(); - setProperty(PROPERTY_DISPOSED, Boolean.TRUE); + fProperties.clear(); + setProperty(PROPERTY_DISPOSED, Boolean.TRUE); fListeners.clear(); // Free the reference to fWindow (Bug 321658). fWindow = null; @@ -168,18 +168,18 @@ public class PresentationContext implements IPresentationContext { @Override public void setProperty(String property, Object value) { - Object oldValue = null; - boolean propertySet = false; + Object oldValue = null; + boolean propertySet = false; synchronized (fProperties) { oldValue = fProperties.get(property); if (!isEqual(oldValue, value)) { - propertySet = true; + propertySet = true; fProperties.put(property, value); } } if (propertySet) { - firePropertyChange(property, oldValue, value); + firePropertyChange(property, oldValue, value); } } @@ -188,46 +188,46 @@ public class PresentationContext implements IPresentationContext { * @param memento Memento to restore from. */ public void initProperties(IMemento memento) { - IMemento presentationMemento = null; - - IMemento[] mementos = memento.getChildren(PRESENTATION_CONTEXT_PROPERTIES); - for (int i = 0; i < mementos.length; i++) { - if (getId().equals(mementos[i].getID())) { - presentationMemento = mementos[i]; - break; - } - } - - if (presentationMemento != null) { - IMemento[] stringProperties = presentationMemento.getChildren(STRING); - for (int i = 0; i < stringProperties.length; i++) { - fProperties.put(stringProperties[i].getID(), stringProperties[i].getString(STRING)); - } - - IMemento[] integerMementos = presentationMemento.getChildren(INTEGER); - for (int i = 0; i < integerMementos.length; i++) { - fProperties.put(integerMementos[i].getID(), integerMementos[i].getInteger(INTEGER)); - } - - IMemento[] booleanMementos = presentationMemento.getChildren(BOOLEAN); - for (int i = 0; i < booleanMementos.length; i++) { - fProperties.put(booleanMementos[i].getID(), booleanMementos[i].getBoolean(BOOLEAN)); - } - - IMemento[] persistableMementos = presentationMemento.getChildren(PERSISTABLE); - for (int i = 0; i < persistableMementos.length; i++) { - String factoryID = persistableMementos[i].getString(PERSISTABLE); - if (factoryID != null) { - IElementFactory factory = PlatformUI.getWorkbench().getElementFactory(factoryID); - if (factory != null) { - Object element = factory.createElement(persistableMementos[i]); - if (element != null) { - fProperties.put(persistableMementos[i].getID(), element); - } - } - } - } - } + IMemento presentationMemento = null; + + IMemento[] mementos = memento.getChildren(PRESENTATION_CONTEXT_PROPERTIES); + for (int i = 0; i < mementos.length; i++) { + if (getId().equals(mementos[i].getID())) { + presentationMemento = mementos[i]; + break; + } + } + + if (presentationMemento != null) { + IMemento[] stringProperties = presentationMemento.getChildren(STRING); + for (int i = 0; i < stringProperties.length; i++) { + fProperties.put(stringProperties[i].getID(), stringProperties[i].getString(STRING)); + } + + IMemento[] integerMementos = presentationMemento.getChildren(INTEGER); + for (int i = 0; i < integerMementos.length; i++) { + fProperties.put(integerMementos[i].getID(), integerMementos[i].getInteger(INTEGER)); + } + + IMemento[] booleanMementos = presentationMemento.getChildren(BOOLEAN); + for (int i = 0; i < booleanMementos.length; i++) { + fProperties.put(booleanMementos[i].getID(), booleanMementos[i].getBoolean(BOOLEAN)); + } + + IMemento[] persistableMementos = presentationMemento.getChildren(PERSISTABLE); + for (int i = 0; i < persistableMementos.length; i++) { + String factoryID = persistableMementos[i].getString(PERSISTABLE); + if (factoryID != null) { + IElementFactory factory = PlatformUI.getWorkbench().getElementFactory(factoryID); + if (factory != null) { + Object element = factory.createElement(persistableMementos[i]); + if (element != null) { + fProperties.put(persistableMementos[i].getID(), element); + } + } + } + } + } } /** @@ -235,27 +235,27 @@ public class PresentationContext implements IPresentationContext { * @param memento Memento to save to. */ public void saveProperites(IMemento memento) { - if (fProperties.isEmpty()) { - return; - } - IMemento properties = memento.createChild(PRESENTATION_CONTEXT_PROPERTIES, getId()); + if (fProperties.isEmpty()) { + return; + } + IMemento properties = memento.createChild(PRESENTATION_CONTEXT_PROPERTIES, getId()); for (Entry<String, Object> entry : fProperties.entrySet()) { - if (entry.getValue() instanceof String) { - IMemento value = properties.createChild(STRING, entry.getKey()); - value.putString(STRING, (String)entry.getValue()); - } else if (entry.getValue() instanceof Integer) { - IMemento value = properties.createChild(INTEGER, entry.getKey()); - value.putInteger(INTEGER, ((Integer)entry.getValue()).intValue()); - } else if (entry.getValue() instanceof Boolean) { - IMemento value = properties.createChild(BOOLEAN, entry.getKey()); - value.putBoolean(BOOLEAN, ((Boolean)entry.getValue()).booleanValue()); - } else if (entry.getValue() instanceof IPersistableElement) { - IPersistableElement persistable = (IPersistableElement)entry.getValue(); - IMemento value = properties.createChild(PERSISTABLE, entry.getKey()); - value.putString(PERSISTABLE, persistable.getFactoryId()); - persistable.saveState(value); - } - } + if (entry.getValue() instanceof String) { + IMemento value = properties.createChild(STRING, entry.getKey()); + value.putString(STRING, (String)entry.getValue()); + } else if (entry.getValue() instanceof Integer) { + IMemento value = properties.createChild(INTEGER, entry.getKey()); + value.putInteger(INTEGER, ((Integer)entry.getValue()).intValue()); + } else if (entry.getValue() instanceof Boolean) { + IMemento value = properties.createChild(BOOLEAN, entry.getKey()); + value.putBoolean(BOOLEAN, ((Boolean)entry.getValue()).booleanValue()); + } else if (entry.getValue() instanceof IPersistableElement) { + IPersistableElement persistable = (IPersistableElement)entry.getValue(); + IMemento value = properties.createChild(PERSISTABLE, entry.getKey()); + value.putString(PERSISTABLE, persistable.getFactoryId()); + persistable.saveState(value); + } + } } private boolean isEqual(Object a, Object b) { @@ -273,15 +273,15 @@ public class PresentationContext implements IPresentationContext { } } - @Override + @Override public IWorkbenchPart getPart() { - return fPart; - } + return fPart; + } - @Override + @Override public IWorkbenchWindow getWindow() { - return fWindow; - } + return fWindow; + } } diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/TreeModelViewer.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/TreeModelViewer.java index eb6492cd3..a1a498ecb 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/TreeModelViewer.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/TreeModelViewer.java @@ -128,7 +128,7 @@ public class TreeModelViewer extends InternalTreeModelViewer { /** * Initializes viewer state from the memento * - * @param memento the {@link IMemento} to read from + * @param memento the {@link IMemento} to read from */ @Override public void initState(IMemento memento) { @@ -138,16 +138,16 @@ public class TreeModelViewer extends InternalTreeModelViewer { /** * Save viewer state into the given memento. * - * @param memento the {@link IMemento} to save to + * @param memento the {@link IMemento} to save to */ @Override public void saveState(IMemento memento) { super.saveState(memento); } - /** - * @return Returns true if columns are being displayed currently. - */ + /** + * @return Returns true if columns are being displayed currently. + */ @Override public boolean isShowColumns() { return super.isShowColumns(); @@ -187,8 +187,8 @@ public class TreeModelViewer extends InternalTreeModelViewer { super.setVisibleColumns(ids); } - @Override + @Override public ViewerLabel getElementLabel(TreePath path, String columnId) { - return super.getElementLabel(path, columnId); - } + return super.getElementLabel(path, columnId); + } } diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/TreeModelViewerFilter.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/TreeModelViewerFilter.java index f48408a7b..54153c113 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/TreeModelViewerFilter.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/TreeModelViewerFilter.java @@ -30,12 +30,12 @@ import org.eclipse.jface.viewers.ViewerFilter; */ abstract public class TreeModelViewerFilter extends ViewerFilter { - /** - * Determines whether the filter applies to the given parent element. - * @return Returns true if the viewer should use the given filter on the - * given element. - * @param viewer The viewer that is using this filter to select elements. - * @param parentElement Parent element to check filter for. - */ - abstract public boolean isApplicable(ITreeModelViewer viewer, Object parentElement); + /** + * Determines whether the filter applies to the given parent element. + * @return Returns true if the viewer should use the given filter on the + * given element. + * @param viewer The viewer that is using this filter to select elements. + * @param parentElement Parent element to check filter for. + */ + abstract public boolean isApplicable(ITreeModelViewer viewer, Object parentElement); } diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/ViewerInputService.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/ViewerInputService.java index 51e385737..a52928877 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/ViewerInputService.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/ViewerInputService.java @@ -28,18 +28,18 @@ import org.eclipse.debug.internal.ui.viewers.model.ViewerInputUpdate; */ public class ViewerInputService { - /** - * An input object which will yield a null input element. - * - * @since 3.6 - */ - public final static Object NULL_INPUT = new IViewerInputProvider() { - @Override + /** + * An input object which will yield a null input element. + * + * @since 3.6 + */ + public final static Object NULL_INPUT = new IViewerInputProvider() { + @Override public void update(IViewerInputUpdate update) { - update.setInputElement(null); - update.done(); - } - }; + update.setInputElement(null); + update.done(); + } + }; // previous update request, cancelled when a new request comes in private IViewerInputUpdate fPendingUpdate = null; @@ -63,7 +63,7 @@ public class ViewerInputService { /** * Constructs a viewer input service for the given requester and presentation context. * - * @param viewer for which inputs are required + * @param viewer for which inputs are required * @param requestor client requesting viewer inputs */ public ViewerInputService(ITreeModelViewer viewer, IViewerInputRequestor requestor) { @@ -90,7 +90,7 @@ public class ViewerInputService { } if (provdier == null) { fPendingUpdate.setInputElement(source); - fPendingUpdate.done(); + fPendingUpdate.done(); } else { provdier.update(fPendingUpdate); } @@ -100,9 +100,9 @@ public class ViewerInputService { * Disposes this viewer input service, canceling any pending jobs. */ public synchronized void dispose() { - if (fPendingUpdate != null) { - fPendingUpdate.cancel(); - fPendingUpdate = null; - } + if (fPendingUpdate != null) { + fPendingUpdate.cancel(); + fPendingUpdate = null; + } } } diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/VirtualItem.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/VirtualItem.java index 0c817a971..0115e8b0a 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/VirtualItem.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/VirtualItem.java @@ -31,534 +31,534 @@ import org.eclipse.debug.internal.core.IInternalDebugCoreConstants; */ public class VirtualItem { - // Data keys for display attributes of an item. - public static String LABEL_KEY = "LABEL_KEY"; //$NON-NLS-1$ - public static String IMAGE_KEY = "IMAGE_KEY"; //$NON-NLS-1$ - public static String FONT_KEY = "FONT_KEY"; //$NON-NLS-1$ - public static String FOREGROUND_KEY = "FOREGROUND_KEY"; //$NON-NLS-1$ - public static String BACKGROUND_KEY = "BACKGROUND_KEY"; //$NON-NLS-1$ - - public static String ELEMENT_DATA_KEY = "element"; //$NON-NLS-1$ - - /** - * Index object of a tree item. It allows the indexes to be modified - * as items are inserted and removed. - */ + // Data keys for display attributes of an item. + public static String LABEL_KEY = "LABEL_KEY"; //$NON-NLS-1$ + public static String IMAGE_KEY = "IMAGE_KEY"; //$NON-NLS-1$ + public static String FONT_KEY = "FONT_KEY"; //$NON-NLS-1$ + public static String FOREGROUND_KEY = "FOREGROUND_KEY"; //$NON-NLS-1$ + public static String BACKGROUND_KEY = "BACKGROUND_KEY"; //$NON-NLS-1$ + + public static String ELEMENT_DATA_KEY = "element"; //$NON-NLS-1$ + + /** + * Index object of a tree item. It allows the indexes to be modified + * as items are inserted and removed. + */ public static class Index implements Comparable<Object> { - private Integer fIndexValue; + private Integer fIndexValue; - public Index(int index) { - fIndexValue = Integer.valueOf(index); - } + public Index(int index) { + fIndexValue = Integer.valueOf(index); + } - @Override + @Override public boolean equals(Object obj) { - return obj instanceof Index && ((Index)obj).fIndexValue.equals(fIndexValue); - } + return obj instanceof Index && ((Index)obj).fIndexValue.equals(fIndexValue); + } - @Override + @Override public int hashCode() { - return fIndexValue.hashCode(); - } + return fIndexValue.hashCode(); + } - public void increment() { - fIndexValue = Integer.valueOf(fIndexValue.intValue() + 1); - } + public void increment() { + fIndexValue = Integer.valueOf(fIndexValue.intValue() + 1); + } - public void decrement() { - fIndexValue = Integer.valueOf(fIndexValue.intValue() - 1); - } + public void decrement() { + fIndexValue = Integer.valueOf(fIndexValue.intValue() - 1); + } - public int intValue() { - return fIndexValue.intValue(); - } + public int intValue() { + return fIndexValue.intValue(); + } - @Override + @Override public int compareTo(Object obj) { - return obj instanceof Index ? fIndexValue.compareTo(((Index)obj).fIndexValue) : 0; - } + return obj instanceof Index ? fIndexValue.compareTo(((Index)obj).fIndexValue) : 0; + } - @Override + @Override public String toString() { - return fIndexValue.toString(); - } - } - - /** - * Parent items of this item. - */ - final private VirtualItem fParent; - - /** - * The index of this item. - */ - final private Index fIndex; - - /** - * Map of child items. The key to the map is the item's index, which - * must be the same object instance as the index in the item. The tree map - * keeps the items sorted while allowing indexes (keys) to be modified as - * child items are inserted and removed. - */ + return fIndexValue.toString(); + } + } + + /** + * Parent items of this item. + */ + final private VirtualItem fParent; + + /** + * The index of this item. + */ + final private Index fIndex; + + /** + * Map of child items. The key to the map is the item's index, which + * must be the same object instance as the index in the item. The tree map + * keeps the items sorted while allowing indexes (keys) to be modified as + * child items are inserted and removed. + */ private Map<Index, VirtualItem> fItems = new TreeMap<>(); - /** - * Flag indicating whether this item has child items. - */ - private boolean fHasItems = false; - - /** - * Indicates that this item has been expanded. It should only - * be set to <code>true</code> if fHasItems is <code>true</code>. - */ - private boolean fExpanded = false; - - /** - * The count of child items. <code>-1</code> indicates that the count - * is not known. - */ - private int fItemCount = -1; - - /** - * The data held by this item. It includes the element as well as the item - * display attributes. - */ + /** + * Flag indicating whether this item has child items. + */ + private boolean fHasItems = false; + + /** + * Indicates that this item has been expanded. It should only + * be set to <code>true</code> if fHasItems is <code>true</code>. + */ + private boolean fExpanded = false; + + /** + * The count of child items. <code>-1</code> indicates that the count + * is not known. + */ + private int fItemCount = -1; + + /** + * The data held by this item. It includes the element as well as the item + * display attributes. + */ private Map<String, Object> fData = new HashMap<>(1); - /** - * Flag indicating that the item needs to have it's label updated. - */ - private boolean fNeedsLabelUpdate = true; - - /** - * Flag indicating that the item's count needs to be updated. - */ - private boolean fNeedsCountUpdate = true; - - /** - * Flag indicating that the item's element needs to be updated. - */ - private boolean fNeedsDataUpdate = true; - - /** - * Indicates that this item has been disposed. - */ - private boolean fDisposed = false; - - - /** - * Virtual item constructor. - * @param parent parent virtual item - * @param index index of the item in the parent - */ - public VirtualItem(VirtualItem parent, Index index) { - fParent = parent; - fIndex = index; - } - - /** - * Clears the child item at the given index. - * @param index index of item to clear. - */ - public void clear(Index index) { - VirtualItem item = fItems.remove(index); - if (item != null) { - item.dispose(); - } - } - - /** - * Clears all child items. - * - * @since 3.9 - */ - public void clearAll() { - fData.clear(); + /** + * Flag indicating that the item needs to have it's label updated. + */ + private boolean fNeedsLabelUpdate = true; + + /** + * Flag indicating that the item's count needs to be updated. + */ + private boolean fNeedsCountUpdate = true; + + /** + * Flag indicating that the item's element needs to be updated. + */ + private boolean fNeedsDataUpdate = true; + + /** + * Indicates that this item has been disposed. + */ + private boolean fDisposed = false; + + + /** + * Virtual item constructor. + * @param parent parent virtual item + * @param index index of the item in the parent + */ + public VirtualItem(VirtualItem parent, Index index) { + fParent = parent; + fIndex = index; + } + + /** + * Clears the child item at the given index. + * @param index index of item to clear. + */ + public void clear(Index index) { + VirtualItem item = fItems.remove(index); + if (item != null) { + item.dispose(); + } + } + + /** + * Clears all child items. + * + * @since 3.9 + */ + public void clearAll() { + fData.clear(); for (VirtualItem item : fItems.values()) { item.dispose(); - } - fItems.clear(); - } - /** - * Returns the parent item. - * @return parent item. - */ - public VirtualItem getParent() { - return fParent; - } - - /** - * @return Returns the index of this item. - */ - public Index getIndex() { - return fIndex; - } - - /** - * Finds the given item in the child items of this element. - * @param element Data object of the item to be found. - * @return Item if found, <code>null</code> if not. - */ - public VirtualItem findItem(Object element) { + } + fItems.clear(); + } + /** + * Returns the parent item. + * @return parent item. + */ + public VirtualItem getParent() { + return fParent; + } + + /** + * @return Returns the index of this item. + */ + public Index getIndex() { + return fIndex; + } + + /** + * Finds the given item in the child items of this element. + * @param element Data object of the item to be found. + * @return Item if found, <code>null</code> if not. + */ + public VirtualItem findItem(Object element) { for (VirtualItem item : fItems.values()) { Object nextData = item.getData(); - if ( (element != null && element.equals(nextData)) || (element == null && nextData == null) ) { + if ( (element != null && element.equals(nextData)) || (element == null && nextData == null) ) { return item; - } - } - return null; - } - - /** - * @return Returns whether the data element of this item is stale. - */ - public boolean needsDataUpdate() { - return fNeedsDataUpdate; - } - - /** - * Marks the item as having a stale data item. - */ - public void setNeedsDataUpdate() { - fNeedsDataUpdate = true; - } - - /** - * Clears the stale status of the item's data element. - */ - public void clearNeedsDataUpdate() { - fNeedsDataUpdate = false; - } - - /** - * @return Returns whether the item has stale item count. - */ - public boolean needsCountUpdate() { - return fNeedsCountUpdate; - } - - /** - * Marks the item as having a stale child count. - */ - public void setNeedsCountUpdate() { - fNeedsCountUpdate = true; - fItemCount = -1; - } - - /** - * Clears the stale status of the item's child count. - */ - public void clearNeedsCountUpdate() { - fNeedsCountUpdate = false; - } - - /** - * @return Returns whether the item has stale label. - */ - public boolean needsLabelUpdate() { - return fNeedsLabelUpdate; - } - - /** - * Marks the item as having a stale label data. - */ - public void setNeedsLabelUpdate() { - fNeedsLabelUpdate = true; - } - - /** - * Clears the stale status of the item's label. - */ - public void clearNeedsLabelUpdate() { - fNeedsLabelUpdate = false; - } - - /** - * @return Returns whether the item has been disposed. - */ - public boolean isDisposed() { - return fDisposed; - } - - /** - * Disposes the item. - */ - public void dispose() { - clearAll(); - - fDisposed = true; - findTree().fireItemDisposed(this); - } - - /** - * @param key Key to retrieve data for. - * @return Returns item data corresponding to given key. - */ - public Object getData (String key) { - return fData.get(key); - } - - /** - * Sets given data element for given key. - * @param key Key for data. - * @param data Data value. - */ - public void setData(String key, Object data) { - fData.put(key, data); - } - - /** - * Sets the item's data element. - * @param data Item's new element. - */ - public void setData(Object data) { - fData.put(ELEMENT_DATA_KEY, data); - } - - /** - * @return Returns item's data element. - */ - public Object getData () { - return fData.get(ELEMENT_DATA_KEY); - } - - /** - * Marks the given item as expanded or collapsed. - * @param expanded If true, item will be marked as expanded. - */ - public void setExpanded(boolean expanded) { - if (fExpanded == expanded) { - return; - } - fExpanded = expanded; - - if (fExpanded && getItemCount() == -1) { - setNeedsCountUpdate(); - } - - - Assert.isTrue(!fExpanded || hasItems()); - - // If collapsed, make sure that all the children are collapsed as well. - if (!fExpanded) { + } + } + return null; + } + + /** + * @return Returns whether the data element of this item is stale. + */ + public boolean needsDataUpdate() { + return fNeedsDataUpdate; + } + + /** + * Marks the item as having a stale data item. + */ + public void setNeedsDataUpdate() { + fNeedsDataUpdate = true; + } + + /** + * Clears the stale status of the item's data element. + */ + public void clearNeedsDataUpdate() { + fNeedsDataUpdate = false; + } + + /** + * @return Returns whether the item has stale item count. + */ + public boolean needsCountUpdate() { + return fNeedsCountUpdate; + } + + /** + * Marks the item as having a stale child count. + */ + public void setNeedsCountUpdate() { + fNeedsCountUpdate = true; + fItemCount = -1; + } + + /** + * Clears the stale status of the item's child count. + */ + public void clearNeedsCountUpdate() { + fNeedsCountUpdate = false; + } + + /** + * @return Returns whether the item has stale label. + */ + public boolean needsLabelUpdate() { + return fNeedsLabelUpdate; + } + + /** + * Marks the item as having a stale label data. + */ + public void setNeedsLabelUpdate() { + fNeedsLabelUpdate = true; + } + + /** + * Clears the stale status of the item's label. + */ + public void clearNeedsLabelUpdate() { + fNeedsLabelUpdate = false; + } + + /** + * @return Returns whether the item has been disposed. + */ + public boolean isDisposed() { + return fDisposed; + } + + /** + * Disposes the item. + */ + public void dispose() { + clearAll(); + + fDisposed = true; + findTree().fireItemDisposed(this); + } + + /** + * @param key Key to retrieve data for. + * @return Returns item data corresponding to given key. + */ + public Object getData (String key) { + return fData.get(key); + } + + /** + * Sets given data element for given key. + * @param key Key for data. + * @param data Data value. + */ + public void setData(String key, Object data) { + fData.put(key, data); + } + + /** + * Sets the item's data element. + * @param data Item's new element. + */ + public void setData(Object data) { + fData.put(ELEMENT_DATA_KEY, data); + } + + /** + * @return Returns item's data element. + */ + public Object getData () { + return fData.get(ELEMENT_DATA_KEY); + } + + /** + * Marks the given item as expanded or collapsed. + * @param expanded If true, item will be marked as expanded. + */ + public void setExpanded(boolean expanded) { + if (fExpanded == expanded) { + return; + } + fExpanded = expanded; + + if (fExpanded && getItemCount() == -1) { + setNeedsCountUpdate(); + } + + + Assert.isTrue(!fExpanded || hasItems()); + + // If collapsed, make sure that all the children are collapsed as well. + if (!fExpanded) { for (VirtualItem item : fItems.values()) { item.setExpanded(expanded); - } - } - } - - /** - * @return Returns item's expanded state. - */ - public boolean getExpanded() { - return fExpanded; - } - - /** - * Sets the flag indicating whether item has child items. - * @param hasChildren Set to true if child has items. - */ - public void setHasItems(boolean hasChildren) { - fHasItems = hasChildren; - if (!fHasItems) { - if (getItemCount() != 0) { - setItemCount(0); - } - } else if (getItemCount() == 0) { - setItemCount(-1); - } - } - - /** - * @return Returns true if item has child items. - */ - public boolean hasItems() { - return fHasItems; - } - - /** - * Sets the item's child count. - * @param count Child count. - */ - public void setItemCount(int count) { - fItemCount = count; + } + } + } + + /** + * @return Returns item's expanded state. + */ + public boolean getExpanded() { + return fExpanded; + } + + /** + * Sets the flag indicating whether item has child items. + * @param hasChildren Set to true if child has items. + */ + public void setHasItems(boolean hasChildren) { + fHasItems = hasChildren; + if (!fHasItems) { + if (getItemCount() != 0) { + setItemCount(0); + } + } else if (getItemCount() == 0) { + setItemCount(-1); + } + } + + /** + * @return Returns true if item has child items. + */ + public boolean hasItems() { + return fHasItems; + } + + /** + * Sets the item's child count. + * @param count Child count. + */ + public void setItemCount(int count) { + fItemCount = count; for (Iterator<Entry<Index, VirtualItem>> itr = fItems.entrySet().iterator(); itr.hasNext();) { Entry<Index, VirtualItem> entry = itr.next(); - int index = entry.getKey().intValue(); - if (index >= count) { - VirtualItem item = entry.getValue(); - item.dispose(); - itr.remove(); - } - } - if (fItemCount == 0) { - if (hasItems()) { - setHasItems(false); - } - if (getExpanded()) { - setExpanded(false); - } - } else { - if (!hasItems()) { - setHasItems(true); - } - } - } - - /** - * @return Returns item's child count. - */ - public int getItemCount() { - return fItemCount; - } - - /** - * Returns the child item at given index. Child item is created if needed. - * - * @param index Index of the child item. - * @return Child item. - */ - public VirtualItem getItem(Index index) { - ensureItems(); - - VirtualItem item = fItems.get(index); - if (item == null) { - item = new VirtualItem(this, index); - fItems.put(index, item); - } - return item; - } - - /** - * @return Returns true if any of the child items need a data update. - */ - public boolean childrenNeedDataUpdate() { - if (getItemCount() == 0) { - return false; - } - if (fItems == null || fItems.size() != fItemCount) { - return true; - } + int index = entry.getKey().intValue(); + if (index >= count) { + VirtualItem item = entry.getValue(); + item.dispose(); + itr.remove(); + } + } + if (fItemCount == 0) { + if (hasItems()) { + setHasItems(false); + } + if (getExpanded()) { + setExpanded(false); + } + } else { + if (!hasItems()) { + setHasItems(true); + } + } + } + + /** + * @return Returns item's child count. + */ + public int getItemCount() { + return fItemCount; + } + + /** + * Returns the child item at given index. Child item is created if needed. + * + * @param index Index of the child item. + * @return Child item. + */ + public VirtualItem getItem(Index index) { + ensureItems(); + + VirtualItem item = fItems.get(index); + if (item == null) { + item = new VirtualItem(this, index); + fItems.put(index, item); + } + return item; + } + + /** + * @return Returns true if any of the child items need a data update. + */ + public boolean childrenNeedDataUpdate() { + if (getItemCount() == 0) { + return false; + } + if (fItems == null || fItems.size() != fItemCount) { + return true; + } for (VirtualItem child : fItems.values()) { - if (child.needsDataUpdate()) { - return true; - } - } - return false; - } - - /** - * Returns an array of current child items. The returned array contains - * only the items that have been created. It may not contain as many items as the - * item count. - * - * @return Child items array. - */ - public VirtualItem[] getItems() { - return fItems.values().toArray(new VirtualItem[fItems.size()]); - } - - /** - * Adds a child item at the given index position. - * @param position The index position to inser the new item at. - * @return Returns the added item. - */ - public VirtualItem addItem(int position) { - if (!fHasItems) { - fHasItems = true; - } - if (fItemCount < 0) { - fItemCount = 0; - } - - // Increment all items with an index higher than the given position. - fItemCount++; - ensureItems(); + if (child.needsDataUpdate()) { + return true; + } + } + return false; + } + + /** + * Returns an array of current child items. The returned array contains + * only the items that have been created. It may not contain as many items as the + * item count. + * + * @return Child items array. + */ + public VirtualItem[] getItems() { + return fItems.values().toArray(new VirtualItem[fItems.size()]); + } + + /** + * Adds a child item at the given index position. + * @param position The index position to inser the new item at. + * @return Returns the added item. + */ + public VirtualItem addItem(int position) { + if (!fHasItems) { + fHasItems = true; + } + if (fItemCount < 0) { + fItemCount = 0; + } + + // Increment all items with an index higher than the given position. + fItemCount++; + ensureItems(); for (Index childIndex : fItems.keySet()) { - if (childIndex.intValue() >= position) { - childIndex.increment(); - } - } - - // Note: the same index object used to create the item has to - // be used as the key into the map. - Index childIndex = new Index(position); - VirtualItem newChild = new VirtualItem(this, childIndex); - fItems.put(childIndex, newChild); - return newChild; - } - - /** - * Removes the item at the given index. - * @param position Index of the item to remove. - */ - public void remove(Index position) { - fItemCount--; - if (fItemCount < 0) { - fHasItems = false; - } - - ensureItems(); - - VirtualItem removedItem = null; + if (childIndex.intValue() >= position) { + childIndex.increment(); + } + } + + // Note: the same index object used to create the item has to + // be used as the key into the map. + Index childIndex = new Index(position); + VirtualItem newChild = new VirtualItem(this, childIndex); + fItems.put(childIndex, newChild); + return newChild; + } + + /** + * Removes the item at the given index. + * @param position Index of the item to remove. + */ + public void remove(Index position) { + fItemCount--; + if (fItemCount < 0) { + fHasItems = false; + } + + ensureItems(); + + VirtualItem removedItem = null; for (Iterator<Entry<Index, VirtualItem>> itr = fItems.entrySet().iterator(); itr.hasNext();) { Entry<Index, VirtualItem> entry = itr.next(); - Index childIndex = entry.getKey(); - if (childIndex.intValue() > position.intValue()) { - childIndex.decrement(); - } else if (childIndex.intValue() == position.intValue()) { - removedItem = entry.getValue(); - removedItem.dispose(); - itr.remove(); - } - } - } - - private void ensureItems() { - if (fItems == null) { + Index childIndex = entry.getKey(); + if (childIndex.intValue() > position.intValue()) { + childIndex.decrement(); + } else if (childIndex.intValue() == position.intValue()) { + removedItem = entry.getValue(); + removedItem.dispose(); + itr.remove(); + } + } + } + + private void ensureItems() { + if (fItems == null) { fItems = new HashMap<>(Math.max(1, Math.min(fItemCount, 16))); - } - } - - private VirtualTree findTree() { - VirtualItem item = this; - while (!(item instanceof VirtualTree)) { - item = item.fParent; - } - return (VirtualTree)item; - } - - @Override + } + } + + private VirtualTree findTree() { + VirtualItem item = this; + while (!(item instanceof VirtualTree)) { + item = item.fParent; + } + return (VirtualTree)item; + } + + @Override public String toString() { - StringBuffer buffer = new StringBuffer(); - toStringItem(buffer, IInternalDebugCoreConstants.EMPTY_STRING); - return buffer.toString(); - } - - void toStringItem(StringBuffer buffer, String indent) { - buffer.append(indent); - buffer.append(toStringElement()); - buffer.append("\n"); //$NON-NLS-1$ - indent = indent + " "; //$NON-NLS-1$ - for (int i = 0; i < fItemCount; i++) { - VirtualItem item = fItems.get(new Index(i)); - if (item != null) { - item.toStringItem(buffer, indent); - } else { - buffer.append("<no item>\n"); //$NON-NLS-1$ - } - } - } - - private String toStringElement() { - String[] label = (String[])fData.get(LABEL_KEY); - if (label != null && label.length != 0) { - return label[0]; - } - Object data = fData.get(ELEMENT_DATA_KEY); - if (data != null) { - return data.toString(); - } - return "<no data>"; //$NON-NLS-1$ - } + StringBuffer buffer = new StringBuffer(); + toStringItem(buffer, IInternalDebugCoreConstants.EMPTY_STRING); + return buffer.toString(); + } + + void toStringItem(StringBuffer buffer, String indent) { + buffer.append(indent); + buffer.append(toStringElement()); + buffer.append("\n"); //$NON-NLS-1$ + indent = indent + " "; //$NON-NLS-1$ + for (int i = 0; i < fItemCount; i++) { + VirtualItem item = fItems.get(new Index(i)); + if (item != null) { + item.toStringItem(buffer, indent); + } else { + buffer.append("<no item>\n"); //$NON-NLS-1$ + } + } + } + + private String toStringElement() { + String[] label = (String[])fData.get(LABEL_KEY); + if (label != null && label.length != 0) { + return label[0]; + } + Object data = fData.get(ELEMENT_DATA_KEY); + if (data != null) { + return data.toString(); + } + return "<no data>"; //$NON-NLS-1$ + } } diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/VirtualTree.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/VirtualTree.java index 6eca256f3..3395b071e 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/VirtualTree.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/VirtualTree.java @@ -29,193 +29,193 @@ import org.eclipse.swt.SWT; */ public class VirtualTree extends VirtualItem { - /** - * Lazy virtual tree does not retrieve elements or labels, - * except for the selected elements. - */ - private boolean fLazy; + /** + * Lazy virtual tree does not retrieve elements or labels, + * except for the selected elements. + */ + private boolean fLazy; - private IVirtualItemValidator fValidator; + private IVirtualItemValidator fValidator; - private class SelectedItemValidator implements IVirtualItemValidator { - @Override + private class SelectedItemValidator implements IVirtualItemValidator { + @Override public boolean isItemVisible(VirtualItem item) { - // visible items. For now only mark the selected items as visible. - for (int i = 0; i < fSelection.length; i++) { - VirtualItem selectionItem = fSelection[i]; - while (selectionItem != null) { - if (item.equals(selectionItem)) { - return true; - } - selectionItem = selectionItem.getParent(); - } - } - return false; - } - - @Override + // visible items. For now only mark the selected items as visible. + for (int i = 0; i < fSelection.length; i++) { + VirtualItem selectionItem = fSelection[i]; + while (selectionItem != null) { + if (item.equals(selectionItem)) { + return true; + } + selectionItem = selectionItem.getParent(); + } + } + return false; + } + + @Override public void showItem(VirtualItem item) { - } - } + } + } - /** - * Set of listeners of the virtual tree. - */ + /** + * Set of listeners of the virtual tree. + */ private Set<IVirtualItemListener> fVirtualItemListeners = new HashSet<>(1); - /** - * The currently selected items. This array contains only - * the leaf items which are selected. - */ - private VirtualItem[] fSelection = new VirtualItem[0]; - - /** - * Constructs the virtual tree with the given style and validator. - * - * @param style The style flag. Only SWT.VIRTUAL flag is used. - * @param validator Item validator used to determine item visibility. - */ - public VirtualTree(int style, IVirtualItemValidator validator) { - super(null, new VirtualItem.Index(0)); - fLazy = (style & SWT.VIRTUAL) != 0; - if (fLazy && validator == null) { - fValidator = new SelectedItemValidator(); - } else { - fValidator = validator; - } - clearNeedsLabelUpdate(); - clearNeedsDataUpdate(); - } - - /** - * Disposes the virtual tree. - */ - @Override + /** + * The currently selected items. This array contains only + * the leaf items which are selected. + */ + private VirtualItem[] fSelection = new VirtualItem[0]; + + /** + * Constructs the virtual tree with the given style and validator. + * + * @param style The style flag. Only SWT.VIRTUAL flag is used. + * @param validator Item validator used to determine item visibility. + */ + public VirtualTree(int style, IVirtualItemValidator validator) { + super(null, new VirtualItem.Index(0)); + fLazy = (style & SWT.VIRTUAL) != 0; + if (fLazy && validator == null) { + fValidator = new SelectedItemValidator(); + } else { + fValidator = validator; + } + clearNeedsLabelUpdate(); + clearNeedsDataUpdate(); + } + + /** + * Disposes the virtual tree. + */ + @Override public void dispose() { - super.dispose(); - fVirtualItemListeners.clear(); - } + super.dispose(); + fVirtualItemListeners.clear(); + } - @Override + @Override public void setNeedsCountUpdate() { - super.setNeedsCountUpdate(); - clearNeedsLabelUpdate(); - clearNeedsDataUpdate(); - } + super.setNeedsCountUpdate(); + clearNeedsLabelUpdate(); + clearNeedsDataUpdate(); + } - @Override + @Override public void setNeedsLabelUpdate() { - // no-op - } + // no-op + } - @Override + @Override public void setData(String key, Object data) { - super.setData(key, data); - if (data == null) { - clearNeedsDataUpdate(); - } - } - - /** - * Adds a listener for when virtual items are revealed in the view. - * @param listener Listener to add to list of listeners. - */ - public void addItemListener(IVirtualItemListener listener) { - fVirtualItemListeners.add(listener); - } - - public void removeItemListener(IVirtualItemListener listener) { - fVirtualItemListeners.remove(listener); - } - - public VirtualItem[] getSelection() { - return fSelection; - } - - public void setSelection(VirtualItem[] items) { - fSelection = items; - } - - public void showItem(VirtualItem item) { - if (fValidator != null) { - fValidator.showItem(item); - } - } - - public void fireItemDisposed(VirtualItem item) { + super.setData(key, data); + if (data == null) { + clearNeedsDataUpdate(); + } + } + + /** + * Adds a listener for when virtual items are revealed in the view. + * @param listener Listener to add to list of listeners. + */ + public void addItemListener(IVirtualItemListener listener) { + fVirtualItemListeners.add(listener); + } + + public void removeItemListener(IVirtualItemListener listener) { + fVirtualItemListeners.remove(listener); + } + + public VirtualItem[] getSelection() { + return fSelection; + } + + public void setSelection(VirtualItem[] items) { + fSelection = items; + } + + public void showItem(VirtualItem item) { + if (fValidator != null) { + fValidator.showItem(item); + } + } + + public void fireItemDisposed(VirtualItem item) { for (IVirtualItemListener listener : fVirtualItemListeners) { listener.disposed(item); - } - } + } + } - public void fireItemRevealed(VirtualItem item) { + public void fireItemRevealed(VirtualItem item) { for (IVirtualItemListener listener : fVirtualItemListeners) { listener.revealed(item); - } - } + } + } - @Override + @Override public void setData(Object data) { - super.setData(data); - // The root item always has children as long as the input is non-null, - // so that it should be expanded. - setHasItems(data != null); - } + super.setData(data); + // The root item always has children as long as the input is non-null, + // so that it should be expanded. + setHasItems(data != null); + } - @Override + @Override public void setHasItems(boolean hasChildren) { - super.setHasItems(hasChildren); - // The root item is always expanded as long as it has children. - if (hasChildren) { - setExpanded(true); - } - } - - /** - * Returns whether the given item is considered visible by the tree as - * determined by its virtual item validator. - * - * @param item Item to check. - * @return true if items is vislble. - * @see IVirtualItemValidator - */ - public boolean isItemVisible(VirtualItem item) { - if (fLazy) { - return fValidator.isItemVisible(item); - } - return true; - } - - /** - * Validates the entire tree. - */ - public void validate() { - validate(VirtualTree.this); - } - - /** - * Validates the item and its children, identifying children which were - * revealed and need to be updated. - * - * @param item The item which to validate. - */ - public void validate(VirtualItem item) { - if (item.needsDataUpdate()) { - if (isItemVisible(item)) { - fireItemRevealed(item); - } - } else if (item.getData() != null) { - if ( item.needsLabelUpdate() || (item.needsCountUpdate() && item.hasItems() && item.getExpanded()) ) { - if (isItemVisible(item)) { - fireItemRevealed(item); - } - } - - if (item.getData() != null && item.getItemCount() > 0 && item.getExpanded()) { - for (int i = 0; i < item.getItemCount(); i++) { - validate(item.getItem(new Index(i))); - } - } - } - } + super.setHasItems(hasChildren); + // The root item is always expanded as long as it has children. + if (hasChildren) { + setExpanded(true); + } + } + + /** + * Returns whether the given item is considered visible by the tree as + * determined by its virtual item validator. + * + * @param item Item to check. + * @return true if items is vislble. + * @see IVirtualItemValidator + */ + public boolean isItemVisible(VirtualItem item) { + if (fLazy) { + return fValidator.isItemVisible(item); + } + return true; + } + + /** + * Validates the entire tree. + */ + public void validate() { + validate(VirtualTree.this); + } + + /** + * Validates the item and its children, identifying children which were + * revealed and need to be updated. + * + * @param item The item which to validate. + */ + public void validate(VirtualItem item) { + if (item.needsDataUpdate()) { + if (isItemVisible(item)) { + fireItemRevealed(item); + } + } else if (item.getData() != null) { + if ( item.needsLabelUpdate() || (item.needsCountUpdate() && item.hasItems() && item.getExpanded()) ) { + if (isItemVisible(item)) { + fireItemRevealed(item); + } + } + + if (item.getData() != null && item.getItemCount() > 0 && item.getExpanded()) { + for (int i = 0; i < item.getItemCount(); i++) { + validate(item.getItem(new Index(i))); + } + } + } + } } diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/VirtualTreeModelViewer.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/VirtualTreeModelViewer.java index c822846f8..1913181ba 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/VirtualTreeModelViewer.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/VirtualTreeModelViewer.java @@ -39,187 +39,187 @@ import org.eclipse.ui.IMemento; public class VirtualTreeModelViewer extends InternalVirtualTreeModelViewer { - /** - * Creates a virtual tree model viewer. - * @param display Display used by the viewer to call the data providers - * on the UI thread. - * @param style Stlye flags. - * @param context Viewer's presentation context. - */ - public VirtualTreeModelViewer(Display display, int style, IPresentationContext context) { - super(display, style, context, null); - } - - /** - * Creates a virtual tree model viewer. - * @param display Display used by the viewer to call the data providers - * on the UI thread. - * @param style style flags. - * @param context Viewer's presentation context. - * @param validator Optional validator that is used to determine which items should be - * considered visible when SWT.VIRTUAL style is used. If <code>null</code> then the - * standard validator is used that updates only the selected items. - * - * @since 3.8 - */ - public VirtualTreeModelViewer(Display display, int style, IPresentationContext context, IVirtualItemValidator validator) { - super(display, style, context, validator); - } - - /** - * Returns this viewer's presentation context. - * - * @return presentation context - */ - @Override + /** + * Creates a virtual tree model viewer. + * @param display Display used by the viewer to call the data providers + * on the UI thread. + * @param style Stlye flags. + * @param context Viewer's presentation context. + */ + public VirtualTreeModelViewer(Display display, int style, IPresentationContext context) { + super(display, style, context, null); + } + + /** + * Creates a virtual tree model viewer. + * @param display Display used by the viewer to call the data providers + * on the UI thread. + * @param style style flags. + * @param context Viewer's presentation context. + * @param validator Optional validator that is used to determine which items should be + * considered visible when SWT.VIRTUAL style is used. If <code>null</code> then the + * standard validator is used that updates only the selected items. + * + * @since 3.8 + */ + public VirtualTreeModelViewer(Display display, int style, IPresentationContext context, IVirtualItemValidator validator) { + super(display, style, context, validator); + } + + /** + * Returns this viewer's presentation context. + * + * @return presentation context + */ + @Override public IPresentationContext getPresentationContext() { - return super.getPresentationContext(); - } - - /** - * Registers the given listener for model delta notification. - * - * @param listener model delta listener - */ - @Override + return super.getPresentationContext(); + } + + /** + * Registers the given listener for model delta notification. + * + * @param listener model delta listener + */ + @Override public void addModelChangedListener(IModelChangedListener listener) { - super.addModelChangedListener(listener); - } - - /** - * Unregisters the given listener from model delta notification. - * - * @param listener model delta listener - */ - @Override + super.addModelChangedListener(listener); + } + + /** + * Unregisters the given listener from model delta notification. + * + * @param listener model delta listener + */ + @Override public void removeModelChangedListener(IModelChangedListener listener) { - super.removeModelChangedListener(listener); - } - - /** - * Registers the specified listener for view update notifications. - * - * @param listener listener - */ - @Override + super.removeModelChangedListener(listener); + } + + /** + * Registers the specified listener for view update notifications. + * + * @param listener listener + */ + @Override public void addViewerUpdateListener(IViewerUpdateListener listener) { - super.addViewerUpdateListener(listener); - } - - /** - * Removes the specified listener from update notifications. - * - * @param listener listener - */ - @Override + super.addViewerUpdateListener(listener); + } + + /** + * Removes the specified listener from update notifications. + * + * @param listener listener + */ + @Override public void removeViewerUpdateListener(IViewerUpdateListener listener) { - super.removeViewerUpdateListener(listener); - } - - /** - * Returns whether columns can be toggled on/off for this viewer's current - * input element. - * - * @return whether columns can be toggled on/off - */ - @Override + super.removeViewerUpdateListener(listener); + } + + /** + * Returns whether columns can be toggled on/off for this viewer's current + * input element. + * + * @return whether columns can be toggled on/off + */ + @Override public boolean canToggleColumns() { - return super.canToggleColumns(); - } - - /** - * Returns the current column presentation for this viewer, or <code>null</code> - * if none. - * - * @return column presentation or <code>null</code> - */ - @Override + return super.canToggleColumns(); + } + + /** + * Returns the current column presentation for this viewer, or <code>null</code> + * if none. + * + * @return column presentation or <code>null</code> + */ + @Override public IColumnPresentation getColumnPresentation() { - return super.getColumnPresentation(); - } - - /** - * Returns identifiers of the visible columns in this viewer, or <code>null</code> - * if there are currently no columns. - * - * @return visible columns identifiers or <code>null</code> - */ - @Override + return super.getColumnPresentation(); + } + + /** + * Returns identifiers of the visible columns in this viewer, or <code>null</code> + * if there are currently no columns. + * + * @return visible columns identifiers or <code>null</code> + */ + @Override public String[] getVisibleColumns() { - return super.getVisibleColumns(); - } - - /** - * Initializes viewer state from the memento - * - * @param memento the {@link IMemento} to read from - */ - @Override + return super.getVisibleColumns(); + } + + /** + * Initializes viewer state from the memento + * + * @param memento the {@link IMemento} to read from + */ + @Override public void initState(IMemento memento) { - super.initState(memento); - } - - /** - * Save viewer state into the given memento. - * - * @param memento the {@link IMemento} to save to - */ - @Override + super.initState(memento); + } + + /** + * Save viewer state into the given memento. + * + * @param memento the {@link IMemento} to save to + */ + @Override public void saveState(IMemento memento) { - super.saveState(memento); - } + super.saveState(memento); + } - /** - * @return Returns true if columns are being displayed currently. - */ - @Override + /** + * @return Returns true if columns are being displayed currently. + */ + @Override public boolean isShowColumns() { - return super.isShowColumns(); - } - - /** - * Toggles columns on/off for the current column presentation, if any. - * - * @param show whether to show columns if the current input supports - * columns - */ - @Override + return super.isShowColumns(); + } + + /** + * Toggles columns on/off for the current column presentation, if any. + * + * @param show whether to show columns if the current input supports + * columns + */ + @Override public void setShowColumns(boolean show) { - super.setShowColumns(show); - } - - /** - * Sets the visible columns for this viewer. Id's correspond to - * column identifiers from a column presentation. Use <code>null</code> - * or an empty collection to display default columns for the current - * column presentation. Only affects the current column presentation. - * - * @param ids column identifiers or <code>null</code> - */ - @Override + super.setShowColumns(show); + } + + /** + * Sets the visible columns for this viewer. Id's correspond to + * column identifiers from a column presentation. Use <code>null</code> + * or an empty collection to display default columns for the current + * column presentation. Only affects the current column presentation. + * + * @param ids column identifiers or <code>null</code> + */ + @Override public void setVisibleColumns(String[] ids) { - super.setVisibleColumns(ids); - } + super.setVisibleColumns(ids); + } - @Override + @Override public void updateViewer(IModelDelta delta) { - super.updateViewer(delta); - } + super.updateViewer(delta); + } - @Override + @Override public ViewerLabel getElementLabel(TreePath path, String columnId) { - return super.getElementLabel(path, columnId); - } + return super.getElementLabel(path, columnId); + } - @Override + @Override public VirtualItem[] findItems(Object elementOrTreePath) { - return super.findItems(elementOrTreePath); - } + return super.findItems(elementOrTreePath); + } - @Override + @Override public VirtualItem findItem(TreePath path) { - return super.findItem(path); - } + return super.findItem(path); + } |