diff options
author | Michael Valenta | 2004-09-14 20:43:57 +0000 |
---|---|---|
committer | Michael Valenta | 2004-09-14 20:43:57 +0000 |
commit | 9b12119ce8397232987e6e52d4499837e8c44152 (patch) | |
tree | 9b87d2ae41659bc373e809e72fa0030bd1e5d3d1 | |
parent | a3f81226f9f76df7405026efba6fe4dd28f6e0d2 (diff) | |
download | eclipse.platform.team-9b12119ce8397232987e6e52d4499837e8c44152.tar.gz eclipse.platform.team-9b12119ce8397232987e6e52d4499837e8c44152.tar.xz eclipse.platform.team-9b12119ce8397232987e6e52d4499837e8c44152.zip |
Bug 73875 [Sync View] Commit set layout does not preserve expansion/selection
2 files changed, 50 insertions, 18 deletions
diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/ChangeLogModelProvider.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/ChangeLogModelProvider.java index 1d6841c73..fdacfff6f 100644 --- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/ChangeLogModelProvider.java +++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/ChangeLogModelProvider.java @@ -368,6 +368,7 @@ public class ChangeLogModelProvider extends CompositeModelProvider implements IC private class FetchLogEntriesJob extends Job { private Set syncSets = new HashSet(); + private boolean restoreExpansionState; public FetchLogEntriesJob() { super(Policy.bind("ChangeLogModelProvider.4")); //$NON-NLS-1$ setUser(false); @@ -387,7 +388,7 @@ public class ChangeLogModelProvider extends CompositeModelProvider implements IC for (int i = 0; i < updates.length; i++) { calculateRoots(updates[i], monitor); } - refreshViewer(); + refreshViewer(restoreExpansionState); } return Status.OK_STATUS; @@ -401,6 +402,9 @@ public class ChangeLogModelProvider extends CompositeModelProvider implements IC public boolean shouldRun() { return !syncSets.isEmpty(); } + public void setRestoreExpansionState(boolean restoreExpansionState) { + this.restoreExpansionState = restoreExpansionState; + } }; /* ***************************************************************************** @@ -474,25 +478,29 @@ public class ChangeLogModelProvider extends CompositeModelProvider implements IC } // Start building the model from scratch - startUpdateJob(getSyncInfoSet()); + startUpdateJob(getSyncInfoSet(), true /* restore expansion state when done */); } return new IDiffElement[0]; } - private void startUpdateJob(SyncInfoSet set) { + private void startUpdateJob(SyncInfoSet set, boolean restoreExpansion) { if(fetchLogEntriesJob == null) { fetchLogEntriesJob = new FetchLogEntriesJob(); } + fetchLogEntriesJob.setRestoreExpansionState(true); fetchLogEntriesJob.add(set); } - private void refreshViewer() { + private void refreshViewer(final boolean restoreExpansionState) { UIJob updateUI = new UIJob("") { //$NON-NLS-1$ public IStatus runInUIThread(IProgressMonitor monitor) { BusyIndicator.showWhile(getDisplay(), new Runnable() { public void run() { StructuredViewer tree = getViewer(); tree.refresh(); + if (restoreExpansionState) { + restoreViewerState(); + } ISynchronizeModelElement root = getModelRoot(); if(root instanceof SynchronizeModelElement) ((SynchronizeModelElement)root).fireChanges(); @@ -914,7 +922,7 @@ public class ChangeLogModelProvider extends CompositeModelProvider implements IC syncInfoSet = new SyncInfoSet((SyncInfo[]) queuedAdditions.toArray(new SyncInfo[queuedAdditions.size()])); queuedAdditions.clear(); } - startUpdateJob(syncInfoSet); + startUpdateJob(syncInfoSet, false /* don't restore expansion state */); } /* (non-Javadoc) @@ -982,7 +990,7 @@ public class ChangeLogModelProvider extends CompositeModelProvider implements IC handleRemoval(resource); } } - startUpdateJob(new SyncInfoSet((SyncInfo[]) infos.toArray(new SyncInfo[infos.size()]))); + startUpdateJob(new SyncInfoSet((SyncInfo[]) infos.toArray(new SyncInfo[infos.size()])), false /* don't restore expansion state */); } }; if (performSyncExec) { diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/AbstractSynchronizeModelProvider.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/AbstractSynchronizeModelProvider.java index ce10a6d4f..61cbc7265 100644 --- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/AbstractSynchronizeModelProvider.java +++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/AbstractSynchronizeModelProvider.java @@ -288,7 +288,7 @@ public abstract class AbstractSynchronizeModelProvider implements ISynchronizeMo if(root instanceof SynchronizeModelElement) { ((SynchronizeModelElement)root).fireChanges(); } - TeamUIPlugin.getStandardDisplay().asyncExec(new Runnable() { + Utils.asyncExec(new Runnable() { public void run() { StructuredViewer viewer = getViewer(); if (viewer != null && !viewer.getControl().isDisposed()) { @@ -297,7 +297,7 @@ public abstract class AbstractSynchronizeModelProvider implements ISynchronizeMo restoreViewerState(); } } - }); + }, getViewer()); } /** @@ -363,6 +363,10 @@ public abstract class AbstractSynchronizeModelProvider implements ISynchronizeMo } } + /** + * Restore the expansion state and seleciton of the viewer. + * This method must be invoked from within the UI thread. + */ protected void restoreViewerState() { // restore expansion state and selection state final StructuredViewer viewer = getViewer(); @@ -374,11 +378,15 @@ public abstract class AbstractSynchronizeModelProvider implements ISynchronizeMo if (savedExpansionState != null) { for (Iterator it = savedExpansionState.iterator(); it.hasNext();) { String path = (String) it.next(); - IResource resource = container.findMember(path, true /* include phantoms */); + IResource resource = getResourceForPath(container, path); ISynchronizeModelElement[] elements = getModelObjects(resource); for (int i = 0; i < elements.length; i++) { ISynchronizeModelElement element = elements[i]; - expandedElements.add(element); + // Add all parents of the element to the expansion set + while (element != null) { + expandedElements.add(element); + element = (ISynchronizeModelElement)element.getParent(); + } } } } @@ -386,7 +394,7 @@ public abstract class AbstractSynchronizeModelProvider implements ISynchronizeMo if (savedSelectionState != null) { for (Iterator it = savedSelectionState.iterator(); it.hasNext();) { String path = (String) it.next(); - IResource resource = container.findMember(path, true /* include phantoms */); + IResource resource = getResourceForPath(container, path); ISynchronizeModelElement[] elements = getModelObjects(resource); for (int i = 0; i < elements.length; i++) { ISynchronizeModelElement element = elements[i]; @@ -394,16 +402,32 @@ public abstract class AbstractSynchronizeModelProvider implements ISynchronizeMo } } } - Utils.asyncExec(new Runnable() { - public void run() { - ((AbstractTreeViewer) viewer).setExpandedElements(expandedElements.toArray()); - viewer.setSelection(new StructuredSelection(selectedElements)); - } - }, viewer); + ((AbstractTreeViewer) viewer).setExpandedElements(expandedElements.toArray()); + viewer.setSelection(new StructuredSelection(selectedElements)); } } - /** + /* + * Convert a path to a resource by first looking in the resource + * tree and, if that fails, by using the path format to create + * a handle. + */ + private IResource getResourceForPath(IContainer container, String path) { + IResource resource = container.findMember(path, true /* include phantoms */); + if (resource == null) { + // The resource doesn't have an entry on the resources tree + // but may still appear in the view so try to deduce the type + // from the path + if (path.endsWith(Character.toString(Path.SEPARATOR))) { + resource = container.getFolder(new Path(path)); + } else { + resource = container.getFile(new Path(path)); + } + } + return resource; + } + + /** * Return all the model objects in this provider that represent the given resource * @param resource the resource * @return the model objects for the resource |