Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Valenta2004-09-14 20:43:57 +0000
committerMichael Valenta2004-09-14 20:43:57 +0000
commit9b12119ce8397232987e6e52d4499837e8c44152 (patch)
tree9b87d2ae41659bc373e809e72fa0030bd1e5d3d1
parenta3f81226f9f76df7405026efba6fe4dd28f6e0d2 (diff)
downloadeclipse.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
-rw-r--r--bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/ChangeLogModelProvider.java20
-rw-r--r--bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/AbstractSynchronizeModelProvider.java48
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

Back to the top