Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/AbstractSynchronizeModelProvider.java136
1 files changed, 92 insertions, 44 deletions
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 57f988b1f..9f7670c87 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
@@ -10,29 +10,58 @@
*******************************************************************************/
package org.eclipse.team.internal.ui.synchronize;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
import org.eclipse.compare.structuremergeviewer.IDiffContainer;
import org.eclipse.compare.structuremergeviewer.IDiffElement;
-import org.eclipse.core.resources.*;
-import org.eclipse.core.runtime.*;
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IResourceStatus;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.ISafeRunnable;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.jface.util.*;
-import org.eclipse.jface.viewers.*;
+import org.eclipse.jface.util.IPropertyChangeListener;
+import org.eclipse.jface.util.ListenerList;
+import org.eclipse.jface.util.PropertyChangeEvent;
+import org.eclipse.jface.viewers.AbstractTreeViewer;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.StructuredViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.swt.events.TreeEvent;
+import org.eclipse.swt.events.TreeListener;
+import org.eclipse.swt.widgets.Tree;
import org.eclipse.team.core.ITeamStatus;
-import org.eclipse.team.core.synchronize.*;
+import org.eclipse.team.core.synchronize.ISyncInfoSetChangeEvent;
+import org.eclipse.team.core.synchronize.ISyncInfoSetChangeListener;
+import org.eclipse.team.core.synchronize.ISyncInfoTreeChangeEvent;
+import org.eclipse.team.core.synchronize.SyncInfo;
+import org.eclipse.team.core.synchronize.SyncInfoSet;
import org.eclipse.team.internal.core.Assert;
import org.eclipse.team.internal.core.TeamPlugin;
-import org.eclipse.team.internal.ui.*;
import org.eclipse.team.internal.ui.Policy;
-import org.eclipse.team.ui.synchronize.*;
+import org.eclipse.team.internal.ui.TeamUIPlugin;
+import org.eclipse.team.internal.ui.Utils;
+import org.eclipse.team.ui.synchronize.ISynchronizeModelElement;
+import org.eclipse.team.ui.synchronize.ISynchronizePage;
+import org.eclipse.team.ui.synchronize.ISynchronizePageConfiguration;
+import org.eclipse.team.ui.synchronize.SynchronizePageActionGroup;
/**
* This class is reponsible for creating and maintaining a presentation model of
* {@link SynchronizeModelElement} elements that can be shown in a viewer. The model
* is based on the synchronization information contained in the provided {@link SyncInfoSet}.
*/
-public abstract class AbstractSynchronizeModelProvider implements ISynchronizeModelProvider, ISyncInfoSetChangeListener {
+public abstract class AbstractSynchronizeModelProvider implements ISynchronizeModelProvider, ISyncInfoSetChangeListener, TreeListener {
/**
* Property constant for the expansion state for the elements displayed by the page. The
@@ -77,6 +106,7 @@ public abstract class AbstractSynchronizeModelProvider implements ISynchronizeMo
// The update handler will register for sync change events
// with the sync set when the handler is activated
updateHandler = new SynchronizeModelUpdateHandler(this);
+ getTree().addTreeListener(this);
} else {
// We will use the parent's update handler and register for changes with the given set
updateHandler = parentProvider.updateHandler;
@@ -84,7 +114,11 @@ public abstract class AbstractSynchronizeModelProvider implements ISynchronizeMo
}
}
- /**
+ private Tree getTree() {
+ return ((Tree)((AbstractTreeViewer)getViewer()).getControl());
+ }
+
+ /**
* Cosntructor for creating a root model provider.
* @param configuration the sync page configuration
* @param set the sync info set from which the model is built
@@ -273,7 +307,7 @@ public abstract class AbstractSynchronizeModelProvider implements ISynchronizeMo
*/
protected void reset() {
// save expansion state
- if(hasViewerState()) {
+ if(isRootProvider() && hasViewerState()) {
saveViewerState();
}
@@ -296,7 +330,8 @@ public abstract class AbstractSynchronizeModelProvider implements ISynchronizeMo
viewer.getControl().setRedraw(false);
viewer.refresh();
// restore expansion state
- restoreViewerState();
+ if (isRootProvider())
+ restoreViewerState();
} finally {
viewer.getControl().setRedraw(true);
}
@@ -324,6 +359,11 @@ public abstract class AbstractSynchronizeModelProvider implements ISynchronizeMo
* after validating that the viewer is still valid.
*/
protected IResource[] getExpandedResources() {
+ IResource[] resourcesToExpand = getCachedResources(P_VIEWER_EXPANSION_STATE);
+ if (resourcesToExpand.length > 0) {
+ // There is still saved state for the expanded resources so use it
+ return resourcesToExpand;
+ }
final StructuredViewer viewer = getViewer();
Object[] objects = ((AbstractTreeViewer) viewer).getVisibleExpandedElements();
return getResources(objects);
@@ -349,20 +389,8 @@ public abstract class AbstractSynchronizeModelProvider implements ISynchronizeMo
}
}
}
- ((AbstractTreeViewer) viewer).setExpandedElements(expandedElements.toArray());
- }
-
- private ISynchronizeModelElement[] getModelElements(IResource[] resources) {
- Set result = new HashSet();
- for (int j = 0; j < resources.length; j++) {
- IResource resource = resources[j];
- ISynchronizeModelElement[] elements = getModelObjects(resource);
- for (int i = 0; i < elements.length; i++) {
- ISynchronizeModelElement element = elements[i];
- result.add(element);
- }
- }
- return (ISynchronizeModelElement[]) result.toArray(new ISynchronizeModelElement[result.size()]);
+ if (!expandedElements.isEmpty())
+ ((AbstractTreeViewer) viewer).setExpandedElements(expandedElements.toArray());
}
protected IResource[] getResources(Object[] objects) {
@@ -379,6 +407,10 @@ public abstract class AbstractSynchronizeModelProvider implements ISynchronizeMo
return (IResource[]) result.toArray(new IResource[result.size()]);
}
+ private void clearResourceCache(String configProperty) {
+ getConfiguration().setProperty(configProperty, null);
+ }
+
private void cacheResources(IResource[] resources, String configProperty) {
if (resources.length > 0) {
ISynchronizePageConfiguration config = getConfiguration();
@@ -388,20 +420,22 @@ public abstract class AbstractSynchronizeModelProvider implements ISynchronizeMo
paths.add(resource.getFullPath().toString());
}
config.setProperty(configProperty, paths);
+ } else {
+ clearResourceCache(configProperty);
}
}
private IResource[] getCachedResources(String configProperty) {
List paths = (List)getConfiguration().getProperty(configProperty);
+ if (paths == null)
+ return new IResource[0];
IContainer container = ResourcesPlugin.getWorkspace().getRoot();
ArrayList resources = new ArrayList();
- if (paths != null) {
- for (Iterator it = paths.iterator(); it.hasNext();) {
- String path = (String) it.next();
- IResource resource = getResourceForPath(container, path);
- if (resource != null) {
- resources.add(resource);
- }
+ for (Iterator it = paths.iterator(); it.hasNext();) {
+ String path = (String) it.next();
+ IResource resource = getResourceForPath(container, path);
+ if (resource != null) {
+ resources.add(resource);
}
}
return (IResource[]) resources.toArray(new IResource[resources.size()]);
@@ -449,17 +483,16 @@ public abstract class AbstractSynchronizeModelProvider implements ISynchronizeMo
private void selectResources(IResource[] resourcesToSelect) {
StructuredViewer viewer = getViewer();
final ArrayList selectedElements = new ArrayList();
- if (resourcesToSelect != null) {
- for (int i = 0; i < resourcesToSelect.length; i++) {
- IResource resource = resourcesToSelect[i];
- ISynchronizeModelElement[] elements = getModelObjects(resource);
- // Only preserve the selection if there is one element for the resource
- if (elements.length == 1) {
- selectedElements.add(elements[0]);
- }
- }
- }
- viewer.setSelection(new StructuredSelection(selectedElements));
+ for (int i = 0; i < resourcesToSelect.length; i++) {
+ IResource resource = resourcesToSelect[i];
+ ISynchronizeModelElement[] elements = getModelObjects(resource);
+ // Only preserve the selection if there is one element for the resource
+ if (elements.length == 1) {
+ selectedElements.add(elements[0]);
+ }
+ }
+ if (!selectedElements.isEmpty())
+ viewer.setSelection(new StructuredSelection(selectedElements));
}
/*
@@ -482,6 +515,20 @@ public abstract class AbstractSynchronizeModelProvider implements ISynchronizeMo
return resource;
}
+ /* (non-Javadoc)
+ * @see org.eclipse.swt.events.TreeListener#treeCollapsed(org.eclipse.swt.events.TreeEvent)
+ */
+ public void treeCollapsed(TreeEvent e) {
+ clearResourceCache(P_VIEWER_EXPANSION_STATE);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.swt.events.TreeListener#treeExpanded(org.eclipse.swt.events.TreeEvent)
+ */
+ public void treeExpanded(TreeEvent e) {
+ clearResourceCache(P_VIEWER_EXPANSION_STATE);
+ }
+
/**
* Return all the model objects in this provider that represent the given resource
* @param resource the resource
@@ -530,6 +577,7 @@ public abstract class AbstractSynchronizeModelProvider implements ISynchronizeMo
// directly associated with this provider
if (isRootProvider()) {
updateHandler.dispose();
+ getTree().removeTreeListener(this);
} else {
set.removeSyncSetChangedListener(this);
}

Back to the top