diff options
Diffstat (limited to 'org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model')
8 files changed, 402 insertions, 375 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 4f209f9fe..84f75aff8 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 @@ -78,43 +78,50 @@ 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; - } + 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 + 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; - } + execInDisplayThread(new Runnable() { + @Override + public void run() { + if (!getContentProvider().isDisposed() && !isCanceled()) { + performUpdate(); + } + } + }); + } + }; + execInDisplayThread(new Runnable() { + @Override + public void run() { + fChildrenUpdate.startRequest(); + } + }); + return; + } } else { - super.scheduleViewerUpdate(); + super.scheduleViewerUpdate(); } } 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 668284e64..433b8d38f 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 @@ -65,26 +65,24 @@ public class ElementCompareRequest extends MementoUpdate implements IElementComp fEqual = equal; } - /* - * (non-Javadoc) + /* (non-Javadoc) * @see org.eclipse.core.runtime.IProgressMonitor#done() */ @Override public void done() { - ITreeModelViewer viewer = getContentProvider().getViewer(); - if (viewer == null) { - return; // disposed - } - 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); - }); - } + ITreeModelViewer viewer = getContentProvider().getViewer(); + if (viewer == null) return; // disposed + if (viewer.getDisplay().getThread() == Thread.currentThread()) { + fProvider.getStateTracker().compareFinished(ElementCompareRequest.this, fDelta); + } else { + viewer.getDisplay().asyncExec(new Runnable() { + @Override + public void run() { + if (getContentProvider().isDisposed()) return; + fProvider.getStateTracker().compareFinished(ElementCompareRequest.this, fDelta); + } + }); + } } public boolean isEqual() { 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 2c54dc77f..6e53cf171 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 @@ -47,21 +47,24 @@ class ElementMementoRequest extends MementoUpdate implements IElementMementoRequ */ @Override public void done() { + ITreeModelViewer viewer = getContentProvider().getViewer(); - if (viewer == null) { - return; // disposed - } + if (viewer == null) return; // disposed if (viewer.getDisplay().getThread() == Thread.currentThread()) { - doComplete(); + doComplete(); } else { - viewer.getDisplay().asyncExec(() -> doComplete()); + viewer.getDisplay().asyncExec(new Runnable() { + @Override + public void run() { + doComplete(); + } + }); } + } private void doComplete() { - if (getContentProvider().isDisposed()) { - return; - } + if (getContentProvider().isDisposed()) return; if (!isCanceled() && (getStatus() == null || getStatus().isOK())) { // replace the element with a memento 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 02a8f502e..fafeebd65 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 @@ -306,49 +306,53 @@ public class InternalVirtualTreeModelViewer extends Viewer @Override public void remove(final Object parentOrTreePath, final int index) { final List<TreePath> oldSelection = new LinkedList<TreePath>(Arrays.asList(((TreeSelection) getSelection()).getPaths())); - preservingSelection(() -> { - TreePath removedPath = null; - VirtualItem[] parentItems = findItems(parentOrTreePath); - for (int i = 0; i < parentItems.length; i++) { - VirtualItem parentItem = parentItems[i]; - if (parentItem.isDisposed()) { - continue; - } - - // Parent item is not expanded so just update its contents so - // that - // the plus sign gets refreshed. - if (!parentItem.getExpanded()) { - parentItem.setNeedsCountUpdate(); - parentItem.setItemCount(-1); - virtualLazyUpdateHasChildren(parentItem); - } - - if (index < parentItem.getItemCount()) { - VirtualItem item = parentItem.getItem(new VirtualItem.Index(index)); - - if (item.getData() != null) { - removedPath = getTreePathFromItem(item); - disassociate(item); + preservingSelection(new Runnable() { + @Override + public void run() { + TreePath removedPath = null; + VirtualItem[] parentItems = findItems(parentOrTreePath); + for (int i = 0; i < parentItems.length; i++) { + VirtualItem parentItem = parentItems[i]; + if (parentItem.isDisposed()) { + continue; } - parentItem.remove(item.getIndex()); - } - } - - if (removedPath != null) { - boolean removed = false; - for (Iterator<TreePath> it = oldSelection.iterator(); it.hasNext();) { - TreePath path = it.next(); - if (path.startsWith(removedPath, null)) { - it.remove(); - removed = true; - } - } - if (removed) { - setSelection(new TreeSelection(oldSelection.toArray(new TreePath[oldSelection.size()])), false); - } - } - }); + + // Parent item is not expanded so just update its contents so that + // the plus sign gets refreshed. + if (!parentItem.getExpanded()) { + parentItem.setNeedsCountUpdate(); + parentItem.setItemCount(-1); + virtualLazyUpdateHasChildren(parentItem); + } + + if (index < parentItem.getItemCount()) { + VirtualItem item =parentItem.getItem(new VirtualItem.Index(index)); + + if (item.getData() != null) { + removedPath = getTreePathFromItem(item); + disassociate(item); + } + parentItem.remove(item.getIndex()); + } + } + + if (removedPath != null) { + boolean removed = false; + for (Iterator<TreePath> it = oldSelection.iterator(); it.hasNext();) { + TreePath path = it.next(); + if (path.startsWith(removedPath, null)) { + it.remove(); + removed = true; + } + } + if (removed) { + setSelection( + new TreeSelection(oldSelection.toArray(new TreePath[oldSelection.size()])), + false); + } + } + } + }); } @Override @@ -545,17 +549,20 @@ public class InternalVirtualTreeModelViewer extends Viewer } } - private void validate() { - if (fValidateRunnable == null) { - fValidateRunnable = () -> { - if (!fTree.isDisposed()) { - fValidateRunnable = null; - fTree.validate(); - } - }; - getDisplay().asyncExec(fValidateRunnable); - } - } + private void validate() { + if (fValidateRunnable == null) { + fValidateRunnable = new Runnable() { + @Override + public void run() { + if (!fTree.isDisposed()) { + fValidateRunnable = null; + fTree.validate(); + } + } + }; + getDisplay().asyncExec(fValidateRunnable); + } + } @Override protected void inputChanged(Object input, Object oldInput) { @@ -621,51 +628,57 @@ public class InternalVirtualTreeModelViewer extends Viewer } } - @Override + @Override public void setChildCount(final Object elementOrTreePath, final int count) { - preservingSelection(() -> { - VirtualItem[] items = findItems(elementOrTreePath); - for (int i = 0; i < items.length; i++) { - VirtualItem[] children = items[i].getItems(); - for (int j = 0; j < children.length; j++) { - if (children[j].getData() != null && children[j].getIndex().intValue() >= count) { - disassociate(children[j]); - } - } + preservingSelection(new Runnable() { + @Override + public void run() { + VirtualItem[] items = findItems(elementOrTreePath); + for (int i = 0; i < items.length; i++) { + VirtualItem[] children = items[i].getItems(); + for (int j = 0; j < children.length; j++) { + if (children[j].getData() != null && children[j].getIndex().intValue() >= count) { + disassociate(children[j]); + } + } - items[i].setItemCount(count); - } - }); - validate(); - } + items[i].setItemCount(count); + } + } + }); + validate(); + } - @Override + @Override public void setHasChildren(final Object elementOrTreePath, final boolean hasChildren) { - preservingSelection(() -> { - VirtualItem[] items = findItems(elementOrTreePath); - for (int i = 0; i < items.length; i++) { - VirtualItem item = items[i]; - - if (!hasChildren) { - VirtualItem[] children = item.getItems(); - for (int j = 0; j < children.length; j++) { - if (children[j].getData() != null) { - disassociate(children[j]); - } - } - } - - item.setHasItems(hasChildren); - if (hasChildren) { - if (!item.getExpanded()) { - item.setItemCount(-1); - } else { - virtualLazyUpdateChildCount(item); - } - } - } - }); - } + preservingSelection(new Runnable() { + @Override + public void run() { + VirtualItem[] items = findItems(elementOrTreePath); + for (int i = 0; i < items.length; i++) { + VirtualItem item = items[i]; + + if (!hasChildren) { + VirtualItem[] children = item.getItems(); + for (int j = 0; j < children.length; j++) { + if (children[j].getData() != null) { + disassociate(children[j]); + } + } + } + + item.setHasItems(hasChildren); + if (hasChildren) { + if (!item.getExpanded()) { + item.setItemCount(-1); + } else { + virtualLazyUpdateChildCount(item); + } + } + } + } + }); + } @Override public boolean getHasChildren(Object elementOrTreePath) { 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 e264a72dd..128101422 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 @@ -196,35 +196,40 @@ public class TimeTriggeredProgressMonitorDialog extends ProgressMonitorDialog { return wrapperedMonitor; } - /* - * (non-Javadoc) - * @see org.eclipse.jface.operations.IRunnableContext#run(boolean, boolean, - * IRunnableWithProgress) - */ - @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]; - Runnable dialogWaitRunnable = () -> { - try { - TimeTriggeredProgressMonitorDialog.super.run(fork, cancelable, runnable); - } catch (InvocationTargetException e1) { - invokes[0] = e1; - } catch (InterruptedException e2) { - interrupt[0] = e2; - } - }; - final Display display = PlatformUI.getWorkbench().getDisplay(); - if (display == null) { + /* + * (non-Javadoc) + * + * @see org.eclipse.jface.operations.IRunnableContext#run(boolean, boolean, IRunnableWithProgress) + */ + @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]; + Runnable dialogWaitRunnable = new Runnable() { + @Override + public void run() { + try { + TimeTriggeredProgressMonitorDialog.super.run(fork, cancelable, runnable); + } catch (InvocationTargetException e) { + invokes[0] = e; + } catch (InterruptedException e) { + interrupt[0]= e; + } + } + }; + 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 ad7be8233..9afa548cf 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 @@ -724,76 +724,73 @@ public class TreeModelContentProvider implements ITreeModelContentProvider, ICon notifyUpdate(UPDATE_BEGINS, update); } - /** - * Notification an update request has completed - * - * @param updates the updates to notify - */ + /** + * 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. - getViewer().getDisplay().asyncExec(() -> { - if (isDisposed()) { - return; - } + 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$ + } + } - for (int i = 0; i < updates.size(); i++) { - ViewerUpdateMonitor update = updates.get(i); - - // Search for update in list using identity test. Otherwise a - // completed canceled - // update may trigger removal of up-to-date running update on - // the same element. - List<ViewerUpdateMonitor> requests = fRequestsInProgress.get(update.getSchedulingPath()); - boolean found = false; - if (requests != null) { - for (int j = 0; j < requests.size(); j++) { - if (requests.get(j) == update) { - found = true; - requests.remove(j); - break; - } - } + // Wait a single cycle to allow viewer to queue requests triggered by completed updates. + getViewer().getDisplay().asyncExec(new Runnable() { + @Override + public void run() { + if (isDisposed()) { + return; } - if (found) { - // Trigger may initiate new updates, so wait to remove - // requests array from - // fRequestsInProgress map. This way updateStarted() will - // not send a - // redundant "UPDATE SEQUENCE STARTED" notification. - trigger(update.getSchedulingPath()); - } else { - // Update may be removed from in progress list if it was - // canceled by schedule(). - Assert.isTrue(update.isCanceled()); - } - if (requests != null && requests.isEmpty()) { - fRequestsInProgress.remove(update.getSchedulingPath()); - } - } - if (fRequestsInProgress.isEmpty() && fWaitingRequests.isEmpty() && fModelSequenceRunning) { - fModelSequenceRunning = false; - if (fRevealPath != null) { - getViewer().reveal(fRevealPath, fRevealIndex); - fRevealPath = null; - } - if (DebugUIPlugin.DEBUG_UPDATE_SEQUENCE && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(getPresentationContext())) { - DebugUIPlugin.trace("MODEL SEQUENCE ENDS"); //$NON-NLS-1$ - } - notifyUpdate(UPDATE_SEQUENCE_COMPLETE, null); - } - }); + for (int i = 0; i < updates.size(); i++) { + ViewerUpdateMonitor update = updates.get(i); + + // Search for update in list using identity test. Otherwise a completed canceled + // update may trigger removal of up-to-date running update on the same element. + List<ViewerUpdateMonitor> requests = fRequestsInProgress.get(update.getSchedulingPath()); + boolean found = false; + if (requests != null) { + for (int j = 0; j < requests.size(); j++) { + if (requests.get(j) == update) { + found = true; + requests.remove(j); + break; + } + } + } + + if (found) { + // Trigger may initiate new updates, so wait to remove requests array from + // fRequestsInProgress map. This way updateStarted() will not send a + // redundant "UPDATE SEQUENCE STARTED" notification. + trigger(update.getSchedulingPath()); + } else { + // Update may be removed from in progress list if it was canceled by schedule(). + Assert.isTrue( update.isCanceled() ); + } + if (requests != null && requests.isEmpty()) { + fRequestsInProgress.remove(update.getSchedulingPath()); + } + } + if (fRequestsInProgress.isEmpty() && fWaitingRequests.isEmpty() && fModelSequenceRunning) { + fModelSequenceRunning = false; + if (fRevealPath != null) { + getViewer().reveal(fRevealPath, fRevealIndex); + fRevealPath = null; + } + if (DebugUIPlugin.DEBUG_UPDATE_SEQUENCE && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(getPresentationContext())) { + DebugUIPlugin.trace("MODEL SEQUENCE ENDS"); //$NON-NLS-1$ + } + notifyUpdate(UPDATE_SEQUENCE_COMPLETE, null); + } + } + }); - } + } /** * @return Returns true if there are outstanding updates in the viewer. @@ -882,56 +879,53 @@ public class TreeModelContentProvider implements ITreeModelContentProvider, ICon 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<ViewerUpdateMonitor>(); - 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()) { - 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)); - } - } + 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(new Runnable() { + @Override + public void run() { + 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, @@ -1768,37 +1762,40 @@ public class TreeModelContentProvider implements ITreeModelContentProvider, ICon } /** - * Schedules given update to be performed on the viewer. Updates are queued - * up if they are completed in the same UI cycle. - * + * Schedules given update to be performed on the viewer. + * Updates are queued up if they are completed in the same + * UI cycle. * @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) { - fCompletedUpdatesRunnable = () -> { - if (!isDisposed()) { - performUpdates(); - } - }; - updateJob = fCompletedUpdatesRunnable; - } - } + display = getViewer().getDisplay(); + fCompletedUpdates.add(update); + if (fCompletedUpdatesRunnable == null) { + fCompletedUpdatesRunnable = new Runnable() { + @Override + public void run() { + if (!isDisposed()) { + performUpdates(); + } + } + }; + updateJob = fCompletedUpdatesRunnable; + } + } - if (updateJob != null) { - if (Thread.currentThread() == display.getThread()) { - performUpdates(); - } else { - display.asyncExec(updateJob); - } - } + if (updateJob != null) { + if (Thread.currentThread() == display.getThread()) { + performUpdates(); + } else { + display.asyncExec(updateJob); + } + } } /** 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 2692ae93e..705b10734 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 @@ -100,17 +100,7 @@ public class TreeModelLabelProvider extends ColumnLabelProvider */ private List<ILabelUpdate> fUpdatesInProgress = new ArrayList<ILabelUpdate>(); - private final class RunnableImplementation implements Runnable { - @Override - public void run() { - if (isDisposed()) { - return; - } - startRequests(this); - } - } - - /** + /** * Delta visitor actively cancels the outstanding label updates for * elements that are changed and are about to be updated. */ @@ -273,25 +263,33 @@ 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<ILabelUpdate>(); - fPendingUpdates.put(presentation, updates); - } - updates.add(new LabelUpdate(fViewer.getInput(), elementPath, this, visibleColumns, fViewer.getPresentationContext())); - fPendingUpdatesRunnable = new RunnableImplementation(); - fViewer.getDisplay().asyncExec(fPendingUpdatesRunnable); + fPendingUpdates.put(presentation, updates); + } + updates.add(new LabelUpdate(fViewer.getInput(), elementPath, this, visibleColumns, fViewer.getPresentationContext())); + fPendingUpdatesRunnable = new Runnable() { + @Override + public void run() { + if (isDisposed()) { + return; + } + startRequests(this); + } + }; + fViewer.getDisplay().asyncExec(fPendingUpdatesRunnable); return true; } else { - return false; + return false; } } @@ -389,38 +387,41 @@ 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; } if (fComplete == null) { fComplete = new LinkedList<ILabelUpdate>(); - fViewer.getDisplay().asyncExec(() -> { - if (isDisposed()) { - return; - } - List<ILabelUpdate> updates = null; - synchronized (TreeModelLabelProvider.this) { - updates = fComplete; - fComplete = null; - } - for (ILabelUpdate itrUpdate : updates) { - if (itrUpdate.isCanceled()) { - updateComplete(itrUpdate); - } else { - ((LabelUpdate) itrUpdate).performUpdate(); + fViewer.getDisplay().asyncExec(new Runnable() { + @Override + public void run() { + if (isDisposed()) { + return; } - } + List<ILabelUpdate> updates = null; + synchronized (TreeModelLabelProvider.this) { + updates = fComplete; + fComplete = null; + } + for (ILabelUpdate itrUpdate : updates) { + if (itrUpdate.isCanceled()) { + updateComplete(itrUpdate); + } else { + ((LabelUpdate) itrUpdate).performUpdate(); + } + } + } }); } fComplete.add(update); - } + } @Override public void addLabelUpdateListener(ILabelUpdateListener listener) { 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 e3ee51ae1..6368a43df 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 @@ -285,25 +285,28 @@ class ViewerStateTracker { // 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())) { - ModelDelta stateDelta2 = fViewerStates.remove(keyMementoString); - if (stateDelta2 != null) { - if (DebugUIPlugin.DEBUG_STATE_SAVE_RESTORE && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(fContentProvider.getPresentationContext())) { - DebugUIPlugin.trace("STATE RESTORE BEGINS"); //$NON-NLS-1$ - DebugUIPlugin.trace("\tRESTORE: " + stateDelta2.toString()); //$NON-NLS-1$ - notifyStateUpdate(input, STATE_RESTORE_SEQUENCE_BEGINS, null); - } - stateDelta2.setElement(input); - fPendingState = stateDelta2; - doInitialRestore(fPendingState); - } - } else { - if (DebugUIPlugin.DEBUG_STATE_SAVE_RESTORE && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(fContentProvider.getPresentationContext())) { - DebugUIPlugin.trace("STATE RESTORE CANCELED."); //$NON-NLS-1$ - } - } - }); + fContentProvider.getViewer().getDisplay().asyncExec(new Runnable() { + @Override + public void run() { + if (!fContentProvider.isDisposed() && input.equals(fContentProvider.getViewer().getInput())) { + ModelDelta stateDelta2 = fViewerStates.remove(keyMementoString); + if (stateDelta2 != null) { + if (DebugUIPlugin.DEBUG_STATE_SAVE_RESTORE && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(fContentProvider.getPresentationContext())) { + DebugUIPlugin.trace("STATE RESTORE BEGINS"); //$NON-NLS-1$ + DebugUIPlugin.trace("\tRESTORE: " + stateDelta2.toString()); //$NON-NLS-1$ + notifyStateUpdate(input, STATE_RESTORE_SEQUENCE_BEGINS, null); + } + stateDelta2.setElement(input); + fPendingState = stateDelta2; + doInitialRestore(fPendingState); + } + } else { + if (DebugUIPlugin.DEBUG_STATE_SAVE_RESTORE && DebugUIPlugin.DEBUG_TEST_PRESENTATION_ID(fContentProvider.getPresentationContext())) { + DebugUIPlugin.trace("STATE RESTORE CANCELED."); //$NON-NLS-1$ + } + } + } + }); } 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$ |