Download
Getting Started
Members
Projects
Community
Marketplace
Events
Planet Eclipse
Newsletter
Videos
Participate
Report a Bug
Forums
Mailing Lists
Wiki
IRC
How to Contribute
Working Groups
Automotive
Internet of Things
LocationTech
Long-Term Support
PolarSys
Science
OpenMDM
More
Community
Marketplace
Events
Planet Eclipse
Newsletter
Videos
Participate
Report a Bug
Forums
Mailing Lists
Wiki
IRC
How to Contribute
Working Groups
Automotive
Internet of Things
LocationTech
Long-Term Support
PolarSys
Science
OpenMDM
Toggle navigation
Bugzilla – Attachment 62724 Details for
Bug 173898
[logical structures] Stepping with logical structure expanded results in blank labels
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
Log In
[x]
|
Terms of Use
|
Copyright Agent
Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read
this important communication.
[patch]
work in progress
seq-update.patch (text/plain), 35.34 KB, created by
Darin Wright
on 2007-04-02 17:49:45 EDT
(
hide
)
Description:
work in progress
Filename:
MIME Type:
Creator:
Darin Wright
Created:
2007-04-02 17:49:45 EDT
Size:
35.34 KB
patch
obsolete
>### Eclipse Workspace Patch 1.0 >#P org.eclipse.debug.ui >Index: ui/org/eclipse/debug/internal/ui/viewers/model/ViewerUpdateMonitor.java >=================================================================== >RCS file: /cvsroot/eclipse/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ViewerUpdateMonitor.java,v >retrieving revision 1.6 >diff -u -r1.6 ViewerUpdateMonitor.java >--- ui/org/eclipse/debug/internal/ui/viewers/model/ViewerUpdateMonitor.java 27 Mar 2007 02:08:32 -0000 1.6 >+++ ui/org/eclipse/debug/internal/ui/viewers/model/ViewerUpdateMonitor.java 2 Apr 2007 21:49:33 -0000 >@@ -16,6 +16,7 @@ > import org.eclipse.core.runtime.jobs.ISchedulingRule; > import org.eclipse.debug.internal.core.commands.Request; > import org.eclipse.debug.internal.ui.viewers.AsynchronousSchedulingRuleFactory; >+import org.eclipse.debug.internal.ui.viewers.model.provisional.IElementContentProvider; > import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext; > import org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdate; > import org.eclipse.jface.viewers.TreePath; >@@ -37,6 +38,11 @@ > * Element > */ > private Object fElement; >+ >+ /** >+ * Element content provider >+ */ >+ private IElementContentProvider fElementContentProvider; > > /** > * Whether this request's 'done' method has been called. >@@ -44,9 +50,9 @@ > private boolean fDone = false; > > /** >- * Associated batch operation, or <code>null</code> >+ * Whether this request has been started > */ >- private BatchUpdate fBatchUpdate = null; >+ private boolean fStarted = false; > > protected WorkbenchJob fViewerUpdateJob = new WorkbenchJob("Asynchronous viewer update") { //$NON-NLS-1$ > public IStatus runInUIThread(IProgressMonitor monitor) { >@@ -72,14 +78,14 @@ > * @param elementPath path to associated model element - empty for root element > * @param element associated model element > */ >- public ViewerUpdateMonitor(ModelContentProvider contentProvider, TreePath elementPath, Object element) { >+ public ViewerUpdateMonitor(ModelContentProvider contentProvider, TreePath elementPath, Object element, IElementContentProvider elementContentProvider) { >+ fElementContentProvider = elementContentProvider; > fContentProvider = contentProvider; > fElement = element; > fElementPath = elementPath; > // serialize updates per viewer > fViewerUpdateJob.setRule(getUpdateSchedulingRule()); > fViewerUpdateJob.setSystem(true); >- contentProvider.updateStarted(this); > } > > /** >@@ -98,7 +104,16 @@ > */ > protected ModelContentProvider getContentProvider() { > return fContentProvider; >- } >+ } >+ >+ /** >+ * Returns the element content provider to use for this request >+ * >+ * @return element content provider >+ */ >+ protected IElementContentProvider getElementContentProvider() { >+ return fElementContentProvider; >+ } > > /* (non-Javadoc) > * @see org.eclipse.core.runtime.IProgressMonitor#done() >@@ -110,11 +125,7 @@ > } > fDone = true; > } >- if (fBatchUpdate != null) { >- fBatchUpdate.done(this); >- } else { >- scheduleViewerUpdate(); >- } >+ scheduleViewerUpdate(); > } > > /** >@@ -162,16 +173,33 @@ > } > > /** >- * Whether this update is rooted at or below the given path. >+ * Returns whether this request can coalesce the given request, and performs the >+ * coalesce if it can. > * >- * @param path >- * @return whether this update is rooted at or below the given path >+ * @param update request to coalesce with this request >+ * @return whether it worked > */ >- abstract boolean isContained(TreePath path); >+ abstract boolean coalesce(ViewerUpdateMonitor update); > >- synchronized void setBatchUpdate(BatchUpdate batchUpdate) { >- fBatchUpdate = batchUpdate; >- batchUpdate.batch(this); >- } >+ /** >+ * Starts this request. Subclasses must override startRequest(). >+ */ >+ final void start() { >+ synchronized (this) { >+ if (fStarted) { >+ return; >+ } >+ fStarted = true; >+ } >+ getContentProvider().updateStarted(this); >+ if (!isCanceled()) { >+ startRequest(); >+ } else { >+ done(); >+ } >+ } >+ >+ abstract void startRequest(); > >+ abstract int getPriority(); > } >Index: ui/org/eclipse/debug/internal/ui/viewers/model/TreeModelContentProvider.java >=================================================================== >RCS file: /cvsroot/eclipse/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/TreeModelContentProvider.java,v >retrieving revision 1.13 >diff -u -r1.13 TreeModelContentProvider.java >--- ui/org/eclipse/debug/internal/ui/viewers/model/TreeModelContentProvider.java 27 Mar 2007 02:08:32 -0000 1.13 >+++ ui/org/eclipse/debug/internal/ui/viewers/model/TreeModelContentProvider.java 2 Apr 2007 21:49:33 -0000 >@@ -10,21 +10,13 @@ > *******************************************************************************/ > package org.eclipse.debug.internal.ui.viewers.model; > >-import java.util.ArrayList; >-import java.util.HashMap; > import java.util.HashSet; >-import java.util.List; >-import java.util.Map; > import java.util.Set; >-import java.util.Timer; >-import java.util.TimerTask; > > import org.eclipse.core.runtime.IProgressMonitor; > import org.eclipse.core.runtime.IStatus; > import org.eclipse.core.runtime.Status; >-import org.eclipse.debug.internal.ui.viewers.model.provisional.IChildrenUpdate; > import org.eclipse.debug.internal.ui.viewers.model.provisional.IElementContentProvider; >-import org.eclipse.debug.internal.ui.viewers.model.provisional.IHasChildrenUpdate; > import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDelta; > import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext; > import org.eclipse.debug.internal.ui.viewers.model.provisional.ModelDelta; >@@ -49,23 +41,6 @@ > protected static final String[] STATE_PROPERTIES = new String[]{IBasicPropertyConstants.P_TEXT, IBasicPropertyConstants.P_IMAGE}; > > /** >- * Map of parent paths to requests >- */ >- private Map fPendingChildRequests = new HashMap(); >- >- /** >- * Map of content adapters to requests >- */ >- private Map fPendingCountRequests = new HashMap(); >- >- /** >- * Map of content adapters to requests >- */ >- private Map fPendingHasChildrenRequests = new HashMap(); >- >- private Timer fTimer = new Timer(); >- >- /** > * Re-filters any filtered children of the given parent element. > * > * @param path parent element >@@ -85,49 +60,17 @@ > Object element = getElement(path); > IElementContentProvider contentAdapter = getContentAdapter(element); > if (contentAdapter != null) { >- ChildrenCountUpdate request = new ChildrenCountUpdate(this, path, element); >- List requests = (List) fPendingCountRequests.get(contentAdapter); >- if (requests != null) { >- requests.add(request); >- return; >- } >- requests = new ArrayList(); >- requests.add(request); >- fPendingCountRequests.put(contentAdapter, requests); >- final IElementContentProvider adapter = contentAdapter; >- fTimer.schedule(new TimerTask() { >- public void run() { >- List updates = null; >- synchronized (TreeModelContentProvider.this) { >- updates = (List) fPendingCountRequests.remove(adapter); >- } >- ChildrenCountUpdate[] array = (ChildrenCountUpdate[]) updates.toArray(new ChildrenCountUpdate[updates.size()]); >- batch(array); >- adapter.update(array); >- } >- }, 10L); >+ ChildrenCountUpdate request = new ChildrenCountUpdate(this, path, element, contentAdapter); >+ schedule(request); > } > } > > protected synchronized void doUpdateElement(TreePath parentPath, int modelIndex) { >- ChildrenUpdate request = (ChildrenUpdate) fPendingChildRequests.get(parentPath); >- if (request != null) { >- if (request.coalesce(modelIndex)) { >- return; >- } else { >- request.start(); >- } >- } > Object parent = getElement(parentPath); > IElementContentProvider contentAdapter = getContentAdapter(parent); > if (contentAdapter != null) { >- final ChildrenUpdate newRequest = new ChildrenUpdate(this, parentPath, parent, modelIndex, contentAdapter); >- fPendingChildRequests.put(parentPath, newRequest); >- fTimer.schedule(new TimerTask() { >- public void run() { >- newRequest.start(); >- } >- }, 10L); >+ ChildrenUpdate request = new ChildrenUpdate(this, parentPath, parent, modelIndex, contentAdapter); >+ schedule(request); > } > } > >@@ -135,44 +78,11 @@ > Object element = getElement(path); > IElementContentProvider contentAdapter = getContentAdapter(element); > if (contentAdapter != null) { >- HasChildrenUpdate request = new HasChildrenUpdate(this, path, element); >- List requests = (List) fPendingHasChildrenRequests.get(contentAdapter); >- if (requests != null) { >- requests.add(request); >- return; >- } >- requests = new ArrayList(); >- requests.add(request); >- fPendingHasChildrenRequests.put(contentAdapter, requests); >- final IElementContentProvider adapter = contentAdapter; >- fTimer.schedule(new TimerTask() { >- public void run() { >- List list = null; >- synchronized (TreeModelContentProvider.this) { >- list = (List) fPendingHasChildrenRequests.remove(adapter); >- } >- adapter.update((IHasChildrenUpdate[]) list.toArray(new IHasChildrenUpdate[list.size()])); >- } >- }, 10L); >+ HasChildrenUpdate request = new HasChildrenUpdate(this, path, element, contentAdapter); >+ schedule(request); > } > } > >- /** >- * Batches the given update requests into one UI job on completion >- * >- * @param updates updates to batch >- */ >- protected void batch(ViewerUpdateMonitor[] updates) { >- BatchUpdate batch = new BatchUpdate(); >- for (int i = 0; i < updates.length; i++) { >- updates[i].setBatchUpdate(batch); >- } >- } >- >- protected synchronized void childRequestStarted(IChildrenUpdate update) { >- fPendingChildRequests.remove(update.getElementPath()); >- } >- > /* (non-Javadoc) > * @see org.eclipse.debug.internal.ui.viewers.model.provisional.viewers.ModelContentProvider#getPresentationContext() > */ >@@ -322,13 +232,6 @@ > getTreeViewer().update(delta.getElement(), STATE_PROPERTIES); > } > >- public synchronized void dispose() { >- fTimer.cancel(); >- fPendingChildRequests.clear(); >- fPendingCountRequests.clear(); >- super.dispose(); >- } >- > /* (non-Javadoc) > * @see org.eclipse.debug.internal.ui.viewers.model.provisional.viewers.ModelContentProvider#buildViewerState(org.eclipse.debug.internal.ui.viewers.provisional.ModelDelta) > */ >Index: ui/org/eclipse/debug/internal/ui/viewers/model/ModelContentProvider.java >=================================================================== >RCS file: /cvsroot/eclipse/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ModelContentProvider.java,v >retrieving revision 1.15 >diff -u -r1.15 ModelContentProvider.java >--- ui/org/eclipse/debug/internal/ui/viewers/model/ModelContentProvider.java 27 Mar 2007 02:08:32 -0000 1.15 >+++ ui/org/eclipse/debug/internal/ui/viewers/model/ModelContentProvider.java 2 Apr 2007 21:49:32 -0000 >@@ -83,9 +83,15 @@ > private ListenerList fUpdateListeners = new ListenerList(); > > /** >- * List of updates in progress >+ * Map of updates in progress: element path -> list of requests > */ >- private List fUpdatesInProgress = new ArrayList(); >+ private Map fRequestsInProgress = new HashMap(); >+ >+ /** >+ * Map of dependent requests waiting for parent requests to complete: >+ * element path -> list of requests >+ */ >+ private Map fWaitingRequests = new HashMap(); > > /** > * Map of viewer states keyed by viewer input mementos >@@ -164,10 +170,14 @@ > */ > public synchronized void dispose() { > // cancel pending updates >- synchronized (fUpdatesInProgress) { >- Iterator iterator = fUpdatesInProgress.iterator(); >+ synchronized (fRequestsInProgress) { >+ Iterator iterator = fRequestsInProgress.values().iterator(); > while (iterator.hasNext()) { >- ((IRequest) iterator.next()).cancel(); >+ List requests = (List) iterator.next(); >+ Iterator reqIter = requests.iterator(); >+ while (reqIter.hasNext()) { >+ ((IRequest) reqIter.next()).cancel(); >+ } > } > } > fModelListeners.clear(); >@@ -797,6 +807,7 @@ > protected void unmapPath(TreePath path) { > //System.out.println("Unmap " + path.getLastSegment()); > fTransform.clear(path); >+ cancelSubtreeUpdates(path); > } > > /** >@@ -845,9 +856,14 @@ > */ > void updateStarted(IViewerUpdate update) { > boolean begin = false; >- synchronized (fUpdatesInProgress) { >- begin = fUpdatesInProgress.isEmpty(); >- fUpdatesInProgress.add(update); >+ synchronized (fRequestsInProgress) { >+ begin = fRequestsInProgress.isEmpty(); >+ List requests = (List) fRequestsInProgress.get(update.getElementPath()); >+ if (requests == null) { >+ requests = new ArrayList(); >+ fRequestsInProgress.put(update.getElementPath(), requests); >+ } >+ requests.add(update); > } > if (begin) { > if (DEBUG_UPDATE_SEQUENCE) { >@@ -868,9 +884,16 @@ > */ > void updateComplete(IViewerUpdate update) { > boolean end = false; >- synchronized (fUpdatesInProgress) { >- fUpdatesInProgress.remove(update); >- end = fUpdatesInProgress.isEmpty(); >+ synchronized (fRequestsInProgress) { >+ List requests = (List) fRequestsInProgress.get(update.getElementPath()); >+ if (requests != null) { >+ requests.remove(update); >+ trigger(update); >+ if (requests.isEmpty()) { >+ fRequestsInProgress.remove(update.getElementPath()); >+ } >+ } >+ end = fRequestsInProgress.isEmpty(); > } > notifyUpdate(UPDATE_COMPLETE, update); > if (DEBUG_UPDATE_SEQUENCE) { >@@ -915,14 +938,141 @@ > } > > protected void cancelSubtreeUpdates(TreePath path) { >- synchronized (fUpdatesInProgress) { >- for (int i = 0; i < fUpdatesInProgress.size(); i++) { >- ViewerUpdateMonitor update = (ViewerUpdateMonitor) fUpdatesInProgress.get(i); >- if (update.isContained(path)) { >- update.cancel(); >+ synchronized (fRequestsInProgress) { >+ Iterator iterator = fRequestsInProgress.entrySet().iterator(); >+ while (iterator.hasNext()) { >+ Entry entry = (Entry) iterator.next(); >+ TreePath entryPath = (TreePath) entry.getKey(); >+ if (entryPath.startsWith(path, null)) { >+ List requests = (List) entry.getValue(); >+ Iterator reqIter = requests.iterator(); >+ while (reqIter.hasNext()) { >+ ((IRequest)reqIter.next()).cancel(); >+ } >+ } >+ } >+ List purge = new ArrayList(); >+ iterator = fWaitingRequests.keySet().iterator(); >+ while (iterator.hasNext()) { >+ TreePath entryPath = (TreePath) iterator.next(); >+ if (entryPath.startsWith(path, null)) { >+ purge.add(entryPath); > } > } >+ iterator = purge.iterator(); >+ while (iterator.hasNext()) { >+ fWaitingRequests.remove(iterator.next()); >+ } >+ } >+ } >+ >+ /** >+ * Returns whether this given request should be run, or should wait for parent >+ * update to complete. >+ * >+ * @param update >+ * @return whether to start the given request >+ */ >+ void schedule(ViewerUpdateMonitor update) { >+ synchronized (fRequestsInProgress) { >+ List requests = (List) fWaitingRequests.get(update.getElementPath()); >+ if (requests == null) { >+ // no waiting requests >+ TreePath parentPath = update.getElementPath(); >+ while (fRequestsInProgress.get(parentPath) == null) { >+ parentPath = parentPath.getParentPath(); >+ if (parentPath == null) { >+ // no running requests: start request >+ update.start(); >+ return; >+ } >+ } >+ // request running on parent, add to waiting list >+ requests = new ArrayList(); >+ fWaitingRequests.put(update.getElementPath(), requests); >+ requests.add(update); >+ } else { >+ // there are waiting requests: coalesce with existing request? >+ Iterator reqIter = requests.iterator(); >+ while (reqIter.hasNext()) { >+ ViewerUpdateMonitor waiting = (ViewerUpdateMonitor) reqIter.next(); >+ if (waiting.coalesce(update)) { >+ // coalesced with existing request, done >+ return; >+ } >+ } >+ // add to list of waiting requests >+ requests.add(update); >+ return; >+ } >+ } >+ } >+ >+ /** >+ * Triggers waiting requests based on the given request that just completed. >+ * >+ * TODO: do we cancel updates if the request has been canceled? >+ * >+ * @param request >+ */ >+ void trigger(IViewerUpdate request) { >+ if (fWaitingRequests.isEmpty()) { >+ return; >+ } >+ TreePath completedPath = request.getElementPath(); >+ List waiting = (List) fWaitingRequests.get(completedPath); >+ if (waiting != null && waiting.isEmpty()) { >+ // TODO: why does this happen >+ fWaitingRequests.remove(completedPath); >+ waiting = null; >+ } >+ if (waiting == null) { >+ // no waiting, update the entry with the shortest path >+ int length = Integer.MAX_VALUE; >+ Iterator entries = fWaitingRequests.entrySet().iterator(); >+ Entry candidate = null; >+ while (entries.hasNext()) { >+ Entry entry = (Entry) entries.next(); >+ TreePath key = (TreePath) entry.getKey(); >+ if (key.getSegmentCount() < length) { >+ candidate = entry; >+ length = key.getSegmentCount(); >+ } >+ } >+ if (candidate != null) { >+ startHighestPriorityRequest(completedPath, (List) candidate.getValue()); >+ } >+ } else { >+ // start the highest priority request >+ startHighestPriorityRequest(completedPath, waiting); >+ } >+ } >+ >+ /** >+ * @param completedPath >+ * @param waiting >+ */ >+ private void startHighestPriorityRequest(TreePath completedPath, List waiting) { >+ if (waiting.isEmpty()) { >+ // TODO: this should not happen? >+ fWaitingRequests.remove(completedPath); >+ return; >+ } >+ int priority = 4; >+ ViewerUpdateMonitor next = null; >+ Iterator requests = waiting.iterator(); >+ while (requests.hasNext()) { >+ ViewerUpdateMonitor vu = (ViewerUpdateMonitor) requests.next(); >+ if (vu.getPriority() < priority) { >+ next = vu; >+ priority = next.getPriority(); >+ } >+ } >+ waiting.remove(next); >+ if (waiting.isEmpty()) { >+ fWaitingRequests.remove(completedPath); > } >+ next.start(); > } > > /** >Index: ui/org/eclipse/debug/internal/ui/viewers/model/ChildrenCountUpdate.java >=================================================================== >RCS file: /cvsroot/eclipse/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ChildrenCountUpdate.java,v >retrieving revision 1.7 >diff -u -r1.7 ChildrenCountUpdate.java >--- ui/org/eclipse/debug/internal/ui/viewers/model/ChildrenCountUpdate.java 27 Mar 2007 02:08:32 -0000 1.7 >+++ ui/org/eclipse/debug/internal/ui/viewers/model/ChildrenCountUpdate.java 2 Apr 2007 21:49:32 -0000 >@@ -11,6 +11,7 @@ > package org.eclipse.debug.internal.ui.viewers.model; > > import org.eclipse.debug.internal.ui.viewers.model.provisional.IChildrenCountUpdate; >+import org.eclipse.debug.internal.ui.viewers.model.provisional.IElementContentProvider; > import org.eclipse.jface.viewers.TreePath; > import org.eclipse.jface.viewers.TreeViewer; > >@@ -24,8 +25,8 @@ > /** > * @param contentProvider > */ >- public ChildrenCountUpdate(ModelContentProvider contentProvider, TreePath elementPath, Object element) { >- super(contentProvider, elementPath, element); >+ public ChildrenCountUpdate(ModelContentProvider contentProvider, TreePath elementPath, Object element, IElementContentProvider elementContentProvider) { >+ super(contentProvider, elementPath, element, elementContentProvider); > } > > /* (non-Javadoc) >@@ -49,13 +50,6 @@ > public void setChildCount(int numChildren) { > fCount = numChildren; > } >- >- /* (non-Javadoc) >- * @see org.eclipse.debug.internal.ui.viewers.model.ViewerUpdateMonitor#isContained(org.eclipse.jface.viewers.TreePath) >- */ >- boolean isContained(TreePath path) { >- return getElementPath().startsWith(path, null); >- } > > public String toString() { > StringBuffer buf = new StringBuffer(); >@@ -64,4 +58,27 @@ > return buf.toString(); > } > >+ /* (non-Javadoc) >+ * @see org.eclipse.debug.internal.ui.viewers.model.ViewerUpdateMonitor#coalesce(org.eclipse.debug.internal.ui.viewers.model.ViewerUpdateMonitor) >+ */ >+ boolean coalesce(ViewerUpdateMonitor request) { >+ if (request instanceof ChildrenCountUpdate) { >+ return getElementPath().equals(request.getElementPath()); >+ } >+ return false; >+ } >+ >+ /* (non-Javadoc) >+ * @see org.eclipse.debug.internal.ui.viewers.model.ViewerUpdateMonitor#startRequest() >+ */ >+ void startRequest() { >+ getElementContentProvider().update(new IChildrenCountUpdate[]{this}); >+ } >+ >+ /* (non-Javadoc) >+ * @see org.eclipse.debug.internal.ui.viewers.model.ViewerUpdateMonitor#getPriority() >+ */ >+ int getPriority() { >+ return 2; >+ } > } >Index: ui/org/eclipse/debug/internal/ui/viewers/model/BatchUpdate.java >=================================================================== >RCS file: ui/org/eclipse/debug/internal/ui/viewers/model/BatchUpdate.java >diff -N ui/org/eclipse/debug/internal/ui/viewers/model/BatchUpdate.java >--- ui/org/eclipse/debug/internal/ui/viewers/model/BatchUpdate.java 27 Mar 2007 02:08:32 -0000 1.4 >+++ /dev/null 1 Jan 1970 00:00:00 -0000 >@@ -1,105 +0,0 @@ >-/******************************************************************************* >- * Copyright (c) 2006, 2007 IBM Corporation and others. >- * All rights reserved. This program and the accompanying materials >- * are made available under the terms of the Eclipse Public License v1.0 >- * which accompanies this distribution, and is available at >- * http://www.eclipse.org/legal/epl-v10.html >- * >- * Contributors: >- * IBM Corporation - initial API and implementation >- *******************************************************************************/ >-package org.eclipse.debug.internal.ui.viewers.model; >- >-import java.util.ArrayList; >-import java.util.HashSet; >-import java.util.Iterator; >-import java.util.List; >-import java.util.Set; >- >-import org.eclipse.core.runtime.IProgressMonitor; >-import org.eclipse.core.runtime.IStatus; >-import org.eclipse.core.runtime.Status; >-import org.eclipse.ui.progress.WorkbenchJob; >- >-/** >- * A group of viewer updates to batch together into one UI update job. >- * >- * @since 3.3 >- */ >-class BatchUpdate { >- >- /** >- * Pending batched updates >- */ >- private Set fPending = new HashSet(); >- >- /** >- * List of updates needing to run a UI job >- */ >- private List fComplete = null; >- >- protected WorkbenchJob fViewerUpdateJob = new WorkbenchJob("Asynchronous viewer update") { //$NON-NLS-1$ >- public IStatus runInUIThread(IProgressMonitor monitor) { >- // necessary to check if viewer is disposed >- Iterator updates = fComplete.iterator(); >- while (updates.hasNext()) { >- ViewerUpdateMonitor update = (ViewerUpdateMonitor) updates.next(); >- try { >- if (!update.isCanceled() && !update.getContentProvider().isDisposed()) { >- IStatus status = update.getStatus(); >- if (status == null || status.isOK()) { >- update.performUpdate(); >- } >- } >- } finally { >- update.getContentProvider().updateComplete(update); >- } >- } >- return Status.OK_STATUS; >- } >- }; >- >- /** >- * Creates a new batch update. >- */ >- BatchUpdate() { >- fViewerUpdateJob.setSystem(true); >- } >- >- /** >- * Batch the given update with this group. >- * >- * @param update update to batch >- */ >- public synchronized void batch(ViewerUpdateMonitor update) { >- fPending.add(update); >- } >- >- /** >- * Notification the given update is done. >- * >- * @param update update completed >- */ >- public void done(ViewerUpdateMonitor update) { >- boolean allDone = false; >- synchronized (this) { >- fPending.remove(update); >- allDone = fPending.isEmpty(); >- if (!update.isCanceled()) { >- if (fComplete == null) { >- fComplete = new ArrayList(fPending.size() + 1); >- } >- fComplete.add(update); >- } >- } >- if (update.isCanceled()) { >- update.getContentProvider().updateComplete(update); >- } >- synchronized (this) { >- if (allDone && fComplete != null) { >- fViewerUpdateJob.schedule(); >- } >- } >- } >- >-} >Index: ui/org/eclipse/debug/internal/ui/viewers/model/InternalTreeModelViewer.java >=================================================================== >RCS file: /cvsroot/eclipse/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/InternalTreeModelViewer.java,v >retrieving revision 1.10 >diff -u -r1.10 InternalTreeModelViewer.java >--- ui/org/eclipse/debug/internal/ui/viewers/model/InternalTreeModelViewer.java 27 Mar 2007 02:08:32 -0000 1.10 >+++ ui/org/eclipse/debug/internal/ui/viewers/model/InternalTreeModelViewer.java 2 Apr 2007 21:49:32 -0000 >@@ -1042,4 +1042,36 @@ > ((TreeModelLabelProvider)getLabelProvider()).removeLabelUpdateListener(listener); > } > >+ public void replace(final Object parentElementOrTreePath, final int index, >+ final Object element) { >+ preservingSelection(new Runnable() { >+ public void run() { >+ if (internalIsInputOrEmptyPath(parentElementOrTreePath)) { >+ if (index < getTree().getItemCount()) { >+ updateItem(getTree().getItem(index), element); >+ } >+ } else { >+ Widget[] parentItems = internalFindItems(parentElementOrTreePath); >+ for (int i = 0; i < parentItems.length; i++) { >+ TreeItem parentItem = (TreeItem) parentItems[i]; >+ if (index < parentItem.getItemCount()) { >+ TreeItem item = parentItem.getItem(index); >+ boolean clear = false; >+ if (item.getData() != null) { >+ if (!item.getData().equals(element)) { >+ clear = true; >+ } >+ } >+ updateItem(item, element); >+ if (clear) { >+ System.out.println("CLEAR ALL: " + element); >+ item.clearAll(true); >+ } >+ } >+ } >+ } >+ } >+ >+ }); >+ } > } >Index: ui/org/eclipse/debug/internal/ui/viewers/model/HasChildrenUpdate.java >=================================================================== >RCS file: /cvsroot/eclipse/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/HasChildrenUpdate.java,v >retrieving revision 1.6 >diff -u -r1.6 HasChildrenUpdate.java >--- ui/org/eclipse/debug/internal/ui/viewers/model/HasChildrenUpdate.java 1 Dec 2006 21:47:44 -0000 1.6 >+++ ui/org/eclipse/debug/internal/ui/viewers/model/HasChildrenUpdate.java 2 Apr 2007 21:49:32 -0000 >@@ -10,6 +10,10 @@ > *******************************************************************************/ > package org.eclipse.debug.internal.ui.viewers.model; > >+import java.util.ArrayList; >+import java.util.List; >+ >+import org.eclipse.debug.internal.ui.viewers.model.provisional.IElementContentProvider; > import org.eclipse.debug.internal.ui.viewers.model.provisional.IHasChildrenUpdate; > import org.eclipse.jface.viewers.TreePath; > import org.eclipse.jface.viewers.TreeViewer; >@@ -21,11 +25,13 @@ > > private boolean fHasChildren = false; > >+ private List fBatchedRequests = null; >+ > /** > * @param contentProvider > */ >- public HasChildrenUpdate(ModelContentProvider contentProvider, TreePath elementPath, Object element) { >- super(contentProvider, elementPath, element); >+ public HasChildrenUpdate(ModelContentProvider contentProvider, TreePath elementPath, Object element, IElementContentProvider elementContentProvider) { >+ super(contentProvider, elementPath, element, elementContentProvider); > } > > /* (non-Javadoc) >@@ -50,17 +56,50 @@ > fHasChildren = hasChildren; > } > >- /* (non-Javadoc) >- * @see org.eclipse.debug.internal.ui.viewers.model.ViewerUpdateMonitor#isContained(org.eclipse.jface.viewers.TreePath) >- */ >- boolean isContained(TreePath path) { >- return getElementPath().startsWith(path, null); >- } >- > public String toString() { > StringBuffer buf = new StringBuffer(); > buf.append("IHasChildrenUpdate: "); //$NON-NLS-1$ > buf.append(getElement()); > return buf.toString(); >+ } >+ >+ /* (non-Javadoc) >+ * @see org.eclipse.debug.internal.ui.viewers.model.ViewerUpdateMonitor#coalesce(org.eclipse.debug.internal.ui.viewers.model.ViewerUpdateMonitor) >+ */ >+ boolean coalesce(ViewerUpdateMonitor request) { >+ if (request instanceof HasChildrenUpdate) { >+ if (getElementPath().equals(request.getElementPath())) { >+ // duplicate request >+ return true; >+ } else if (getElementContentProvider().equals(request.getElementContentProvider())) { >+ if (fBatchedRequests == null) { >+ fBatchedRequests = new ArrayList(); >+ fBatchedRequests.add(this); >+ } >+ fBatchedRequests.add(request); >+ return true; >+ } >+ } >+ return false; >+ } >+ >+ /* (non-Javadoc) >+ * @see org.eclipse.debug.internal.ui.viewers.model.ViewerUpdateMonitor#startRequest() >+ */ >+ void startRequest() { >+ if (fBatchedRequests == null) { >+ getElementContentProvider().update(new IHasChildrenUpdate[]{this}); >+ } else { >+ // TODO: batching does not seem to work >+ //System.out.println("batched: " + fBatchedRequests.size()); >+ getElementContentProvider().update((IHasChildrenUpdate[]) fBatchedRequests.toArray(new IHasChildrenUpdate[fBatchedRequests.size()])); >+ } >+ } >+ >+ /* (non-Javadoc) >+ * @see org.eclipse.debug.internal.ui.viewers.model.ViewerUpdateMonitor#getPriority() >+ */ >+ int getPriority() { >+ return 1; > } > } >Index: ui/org/eclipse/debug/internal/ui/viewers/model/FilterTransform.java >=================================================================== >RCS file: /cvsroot/eclipse/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/FilterTransform.java,v >retrieving revision 1.4 >diff -u -r1.4 FilterTransform.java >--- ui/org/eclipse/debug/internal/ui/viewers/model/FilterTransform.java 27 Mar 2007 02:08:32 -0000 1.4 >+++ ui/org/eclipse/debug/internal/ui/viewers/model/FilterTransform.java 2 Apr 2007 21:49:32 -0000 >@@ -203,15 +203,19 @@ > return childIndex; > } > int offset = 0; >+ System.out.print("filtered: "); > for (int i = 0; i < filteredChildren.length; i++) { > if (childIndex == filteredChildren[i] ) { >+ System.out.println("none"); > return -1; > } else if (childIndex > filteredChildren[i]) { >+ System.out.print(filteredChildren[i]); > offset++; > } else { > break; > } > } >+ System.out.println(); > return childIndex - offset; > } > >@@ -280,6 +284,9 @@ > * @param path element path > */ > public synchronized void clear(TreePath path) { >+ if (path.getSegmentCount() > 0) { >+ System.out.println("clear: " + path.getLastSegment().toString()); >+ } > root.clear(path, 0); > } > >@@ -290,6 +297,9 @@ > * @param index index to clear > */ > public synchronized void clear(TreePath parentPath, int index) { >+ if (parentPath.getSegmentCount() > 0) { >+ System.out.println("clear index: " + parentPath.getLastSegment().toString() + " " + index); >+ } > root.clear(parentPath, index, 0); > } > >Index: ui/org/eclipse/debug/internal/ui/viewers/model/ChildrenUpdate.java >=================================================================== >RCS file: /cvsroot/eclipse/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ChildrenUpdate.java,v >retrieving revision 1.6 >diff -u -r1.6 ChildrenUpdate.java >--- ui/org/eclipse/debug/internal/ui/viewers/model/ChildrenUpdate.java 1 Dec 2006 21:47:45 -0000 1.6 >+++ ui/org/eclipse/debug/internal/ui/viewers/model/ChildrenUpdate.java 2 Apr 2007 21:49:32 -0000 >@@ -22,8 +22,6 @@ > private Object[] fElements; > private int fIndex; > private int fLength; >- private IElementContentProvider fContentProvider; >- private boolean fStarted = false; > > /** > * Constructs a request to update an element >@@ -31,11 +29,10 @@ > * @param node node to update > * @param model model containing the node > */ >- public ChildrenUpdate(ModelContentProvider provider, TreePath elementPath, Object element, int index, IElementContentProvider presentation) { >- super(provider, elementPath, element); >+ public ChildrenUpdate(ModelContentProvider provider, TreePath elementPath, Object element, int index, IElementContentProvider elementContentProvider) { >+ super(provider, elementPath, element, elementContentProvider); > fIndex = index; > fLength = 1; >- fContentProvider = presentation; > } > > /* >@@ -69,6 +66,9 @@ > } > viewer.insert(elementPath, element, insertIndex); > } else { >+ if (viewIndex == 2 && modelIndex == 2) { >+ System.out.println("stop"); >+ } > if (ModelContentProvider.DEBUG_CONTENT_PROVIDER) { > System.out.println("replace(" + getElement() + ", modelIndex: " + modelIndex + " viewIndex: " + viewIndex + ", " + element + ")"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ > } >@@ -93,37 +93,30 @@ > } > fElements[index - fIndex] = child; > } >- >- /** >- * Coalesce the request with the given index. Return whether the requests can be >- * coalesced. >- * >- * @param index >- * @return whether it worked >+ >+ /* (non-Javadoc) >+ * @see org.eclipse.debug.internal.ui.viewers.model.ViewerUpdateMonitor#coalesce(org.eclipse.debug.internal.ui.viewers.model.ViewerUpdateMonitor) > */ >- public boolean coalesce(int index) { >- if (index == fIndex + fLength) { >- fLength++; >- return true; >- } >- return false; >- } >- >- public void start() { >- synchronized (this) { >- if (fStarted) { >- return; >+ boolean coalesce(ViewerUpdateMonitor request) { >+ if (request instanceof ChildrenUpdate) { >+ ChildrenUpdate cu = (ChildrenUpdate) request; >+ int end = fIndex + fLength; >+ int otherStart = cu.getOffset(); >+ if (otherStart == end) { >+ fLength = fLength + cu.getLength(); >+ return true; >+ } else if (otherStart == fIndex) { >+ if (cu.getLength() > getLength()) { >+ fLength = cu.getLength(); >+ } >+ return true; >+ } else if ((otherStart > fIndex) && (otherStart < end)) { >+ int otherEnd = otherStart + cu.getLength(); >+ fLength = otherEnd - fIndex; >+ return true; > } >- fStarted = true; >- } >- //System.out.println("\tRequest (" + fParent + "): " + fIndex + " length: " + fLength); >- TreeModelContentProvider contentProvider = (TreeModelContentProvider)getContentProvider(); >- contentProvider.childRequestStarted(this); >- if (!isCanceled()) { >- fContentProvider.update(new IChildrenUpdate[]{this}); >- } else { >- done(); > } >+ return false; > } > > /* (non-Javadoc) >@@ -139,14 +132,15 @@ > public int getOffset() { > return fIndex; > } >- >+ > /* (non-Javadoc) >- * @see org.eclipse.debug.internal.ui.viewers.model.ViewerUpdateMonitor#isContained(org.eclipse.jface.viewers.TreePath) >+ * @see org.eclipse.debug.internal.ui.viewers.model.ViewerUpdateMonitor#startRequest() > */ >- boolean isContained(TreePath path) { >- return getElementPath().startsWith(path, null); >+ void startRequest() { >+ System.out.println("Children Batched: " + fLength); >+ getElementContentProvider().update(new IChildrenUpdate[]{this}); > } >- >+ > public String toString() { > StringBuffer buf = new StringBuffer(); > buf.append("IChildrenUpdate: "); //$NON-NLS-1$ >@@ -157,6 +151,13 @@ > buf.append(getLength()); > buf.append("}"); //$NON-NLS-1$ > return buf.toString(); >+ } >+ >+ /* (non-Javadoc) >+ * @see org.eclipse.debug.internal.ui.viewers.model.ViewerUpdateMonitor#getPriority() >+ */ >+ int getPriority() { >+ return 3; > } > } >
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 173898
:
58789
|
58979
|
62724
|
62792
|
62822