Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Valenta2003-07-10 16:10:54 +0000
committerMichael Valenta2003-07-10 16:10:54 +0000
commit6ce52650bb77caf619e52cd9a0e5b7aee7ec569e (patch)
treebe88dfae8010d1d254e20769f99c1dad12f50dd8
parente0d5793fc180940be2faa9bbb83437ce7d3b55d6 (diff)
downloadeclipse.platform.team-6ce52650bb77caf619e52cd9a0e5b7aee7ec569e.tar.gz
eclipse.platform.team-6ce52650bb77caf619e52cd9a0e5b7aee7ec569e.tar.xz
eclipse.platform.team-6ce52650bb77caf619e52cd9a0e5b7aee7ec569e.zip
39146: [live sync view] port compact tree content provider
-rw-r--r--bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/TeamUIPlugin.java3
-rw-r--r--bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/sync/actions/OpenInCompareAction.java8
-rw-r--r--bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/sync/actions/OpenWithActionGroup.java8
-rw-r--r--bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/sync/views/CompressedFolder.java24
-rw-r--r--bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/sync/views/CompressedFolderContentProvider.java136
-rw-r--r--bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/sync/views/SyncResource.java78
-rw-r--r--bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/sync/views/SyncSet.java145
-rw-r--r--bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/sync/views/SyncSetContentProvider.java95
-rw-r--r--bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/sync/views/SyncSetTableContentProvider.java11
-rw-r--r--bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/sync/views/SyncSetTreeContentProvider.java20
-rw-r--r--bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/sync/views/SyncTreeViewer.java7
-rw-r--r--bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/sync/views/SyncViewer.java7
-rw-r--r--bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/sync/views/SyncViewerLabelProvider.java51
-rw-r--r--bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/sync/views/SyncViewerSorter.java5
-rw-r--r--bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/ISharedImages.java3
15 files changed, 390 insertions, 211 deletions
diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/TeamUIPlugin.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/TeamUIPlugin.java
index 2082340fd..0e5528887 100644
--- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/TeamUIPlugin.java
+++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/TeamUIPlugin.java
@@ -335,6 +335,9 @@ public class TeamUIPlugin extends AbstractUIPlugin implements IPropertyChangeLis
// Wizard banners
createImageDescriptor(ISharedImages.IMG_PROJECTSET_IMPORT_BANNER, baseURL);
createImageDescriptor(ISharedImages.IMG_PROJECTSET_EXPORT_BANNER, baseURL);
+
+ // Live Sync View icons
+ createImageDescriptor(ISharedImages.IMG_COMPRESSED_FOLDER, baseURL);
}
/**
diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/sync/actions/OpenInCompareAction.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/sync/actions/OpenInCompareAction.java
index b8e27bf7d..e8f8ee189 100644
--- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/sync/actions/OpenInCompareAction.java
+++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/sync/actions/OpenInCompareAction.java
@@ -17,8 +17,8 @@ import org.eclipse.jface.action.Action;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.team.core.subscribers.SyncInfo;
+import org.eclipse.team.internal.ui.actions.TeamAction;
import org.eclipse.team.internal.ui.sync.compare.SyncInfoCompareInput;
-import org.eclipse.team.internal.ui.sync.views.SyncSet;
import org.eclipse.team.internal.ui.sync.views.SyncViewer;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IEditorReference;
@@ -62,13 +62,17 @@ public class OpenInCompareAction extends Action {
private CompareEditorInput getCompareInput() {
ISelection selection = viewer.getViewer().getSelection();
Object obj = ((IStructuredSelection)selection).getFirstElement();
- SyncInfo info = SyncSet.getSyncInfo(obj);
+ SyncInfo info = getSyncInfo(obj);
if (info != null && info.getLocal() instanceof IFile) {
return new SyncInfoCompareInput(info);
}
return null;
}
+ private SyncInfo getSyncInfo(Object obj) {
+ return (SyncInfo)TeamAction.getAdapter(obj, SyncInfo.class);
+ }
+
private IEditorPart reuseCompareEditor(SyncInfoCompareInput input) {
IWorkbenchPage page = viewer.getSite().getPage();
IEditorReference[] editorRefs = page.getEditorReferences();
diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/sync/actions/OpenWithActionGroup.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/sync/actions/OpenWithActionGroup.java
index 25245a420..dd2259dd5 100644
--- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/sync/actions/OpenWithActionGroup.java
+++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/sync/actions/OpenWithActionGroup.java
@@ -15,7 +15,7 @@ import org.eclipse.core.resources.IResource;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.team.internal.ui.sync.views.SyncSet;
+import org.eclipse.team.internal.ui.actions.TeamAction;
import org.eclipse.team.internal.ui.sync.views.SyncViewer;
import org.eclipse.ui.actions.OpenFileAction;
import org.eclipse.ui.actions.OpenWithMenu;
@@ -54,7 +54,7 @@ public class OpenWithActionGroup extends SyncViewerActionGroup {
if (selection.size() != 1)
return;
Object element = selection.getFirstElement();
- IResource resource = SyncSet.getIResource(element);
+ IResource resource = getResource(element);
if (!(resource instanceof IFile)) {
return;
}
@@ -81,4 +81,8 @@ public class OpenWithActionGroup extends SyncViewerActionGroup {
openFileAction.run();
}
}
+
+ private IResource getResource(Object obj) {
+ return (IResource)TeamAction.getAdapter(obj, IResource.class);
+ }
} \ No newline at end of file
diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/sync/views/CompressedFolder.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/sync/views/CompressedFolder.java
new file mode 100644
index 000000000..78da6b8d3
--- /dev/null
+++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/sync/views/CompressedFolder.java
@@ -0,0 +1,24 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2003 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.team.internal.ui.sync.views;
+
+import org.eclipse.core.resources.IResource;
+
+/**
+ * A compressed folder appears under a project and contains out-of-sync resources
+ */
+public class CompressedFolder extends SyncResource {
+
+ public CompressedFolder(SyncSet syncSet, IResource resource) {
+ super(syncSet, resource);
+ }
+
+}
diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/sync/views/CompressedFolderContentProvider.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/sync/views/CompressedFolderContentProvider.java
new file mode 100644
index 000000000..ec4b6d980
--- /dev/null
+++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/sync/views/CompressedFolderContentProvider.java
@@ -0,0 +1,136 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2003 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.team.internal.ui.sync.views;
+
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.jface.viewers.AbstractTreeViewer;
+import org.eclipse.team.core.subscribers.SyncInfo;
+
+/**
+ * The contents provider compressed in-sync folder paths
+ */
+public class CompressedFolderContentProvider extends SyncSetTreeContentProvider {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.team.internal.ui.sync.views.SyncSetContentProvider#handleResourceAdditions(org.eclipse.team.internal.ui.sync.views.SyncSetChangedEvent)
+ */
+ protected void handleResourceAdditions(SyncSetChangedEvent event) {
+ AbstractTreeViewer tree = getTreeViewer();
+ if (tree != null) {
+ // TODO: For now, refresh any projects with additions
+ IResource[] roots = event.getAddedRoots();
+ refreshProjects(tree, roots);
+ } else {
+ super.handleResourceRemovals(event);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.team.internal.ui.sync.views.SyncSetContentProvider#handleResourceRemovals(org.eclipse.team.internal.ui.sync.views.SyncSetChangedEvent)
+ */
+ protected void handleResourceRemovals(SyncSetChangedEvent event) {
+ AbstractTreeViewer tree = getTreeViewer();
+ if (tree != null) {
+ // TODO: For now, refresh any projects with deletions
+ IResource[] roots = event.getRemovedRoots();
+ refreshProjects(tree, roots);
+ } else {
+ super.handleResourceRemovals(event);
+ }
+ }
+
+ private void refreshProjects(AbstractTreeViewer tree, IResource[] roots) {
+ if (roots.length == 0) return;
+ Set projects = new HashSet();
+ for (int i = 0; i < roots.length; i++) {
+ projects.add(getModelObject(roots[i].getProject()));
+ }
+ for (Iterator iter = projects.iterator(); iter.hasNext();) {
+ Object element = (Object) iter.next();
+ tree.refresh(element);
+ }
+ }
+
+ public Object getParent(Object element) {
+ if (element instanceof CompressedFolder) {
+ // The parent of a compressed folder is always the project
+ return getModelObject(getResource(element).getProject());
+ }
+ Object parent = super.getParent(element);
+ if (parent instanceof SyncResource) {
+ SyncInfo info = ((SyncResource)parent).getSyncInfo();
+ if (info == null) {
+ // The resource is in-sync so return a compressed folder
+ IResource resource = ((SyncResource)parent).getResource();
+ if (resource.getType() == IResource.FOLDER) {
+ return new CompressedFolder(((SyncResource)parent).getSyncSet(), resource);
+ }
+ }
+ }
+ return parent;
+ }
+
+ public Object[] getChildren(Object element) {
+ IResource resource = getResource(element);
+ if (resource != null && resource.getType() == IResource.PROJECT) {
+ return getProjectChildren((IProject)resource);
+ }
+ return super.getChildren(element);
+ }
+
+ private Object[] getProjectChildren(IProject project) {
+ SyncInfo[] outOfSync = getSyncSet().getOutOfSyncDescendants(project);
+ Set result = new HashSet();
+ for (int i = 0; i < outOfSync.length; i++) {
+ SyncInfo info = outOfSync[i];
+ IResource local = info.getLocal();
+ if (local.getProjectRelativePath().segmentCount() == 1) {
+ // If the resource is a child of the project, include it uncompressed
+ result.add(getModelObject(local));
+ } else {
+ IContainer container = getLowestInSyncParent(local);
+ if (container.getType() == IResource.FOLDER) {
+ result.add(getModelObject(container));
+ }
+ }
+ }
+ return (Object[]) result.toArray(new Object[result.size()]);
+ }
+
+ /**
+ * Return a compressed folder if the provided resource is an in-sync folder.
+ * Warning: This method will return a compressed folder for any in-sync
+ * folder, even those that do not contain out-of-sync resources (i.e. those that
+ * are not visible in the view).
+ */
+ public Object getModelObject(IResource resource) {
+ if (resource.getType() == IResource.FOLDER && getSyncSet().getSyncInfo(resource) == null) {
+ return new CompressedFolder(getSyncSet(), resource);
+ }
+ return super.getModelObject(resource);
+ }
+
+ private IContainer getLowestInSyncParent(IResource resource) {
+ if (resource.getType() == IResource.ROOT) return (IContainer)resource;
+ IContainer parent = resource.getParent();
+ if (getSyncSet().getSyncInfo(parent) == null) {
+ return parent;
+ }
+ return getLowestInSyncParent(parent);
+ }
+
+}
diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/sync/views/SyncResource.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/sync/views/SyncResource.java
index f4e3378be..28c4a7d0d 100644
--- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/sync/views/SyncResource.java
+++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/sync/views/SyncResource.java
@@ -10,10 +10,6 @@
*******************************************************************************/
package org.eclipse.team.internal.ui.sync.views;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.team.core.subscribers.SyncInfo;
@@ -28,20 +24,21 @@ public class SyncResource implements IAdaptable {
private SyncSet syncSet;
private IResource resource;
- /**
- * @param info
- */
public SyncResource(SyncSet syncSet, IResource resource) {
this.syncSet = syncSet;
this.resource = resource;
}
+ public SyncSet getSyncSet() {
+ return syncSet;
+ }
+
/* (non-Javadoc)
* @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
*/
public Object getAdapter(Class adapter) {
if (adapter == IResource.class) {
- return getLocalResource();
+ return getResource();
} else if (adapter == SyncInfo.class) {
return getSyncInfo();
}
@@ -51,13 +48,6 @@ public class SyncResource implements IAdaptable {
/**
* @return
*/
- public IResource getLocalResource() {
- return resource;
- }
-
- /**
- * @return
- */
public SyncInfo getSyncInfo() {
return syncSet.getSyncInfo(resource);
}
@@ -67,21 +57,8 @@ public class SyncResource implements IAdaptable {
* a non-null sync-info.
* @return
*/
- public SyncResource[] getOutOfSyncDescendants() {
- List result = new ArrayList();
- SyncInfo info = getSyncInfo();
- if (info != null) {
- result.add(this);
- }
- Object[] members = SyncSet.members(syncSet, getLocalResource());
- for (int i = 0; i < members.length; i++) {
- Object object = members[i];
- if (object instanceof SyncResource) {
- SyncResource child = (SyncResource) object;
- result.addAll(Arrays.asList(child.getOutOfSyncDescendants()));
- }
- }
- return (SyncResource[]) result.toArray(new SyncResource[result.size()]);
+ public SyncInfo[] getOutOfSyncDescendants() {
+ return syncSet.getOutOfSyncDescendants(resource);
}
/* (non-Javadoc)
@@ -90,7 +67,7 @@ public class SyncResource implements IAdaptable {
public boolean equals(Object object) {
if (object instanceof SyncResource) {
SyncResource syncResource = (SyncResource) object;
- return getLocalResource().equals(syncResource.getLocalResource());
+ return getResource().equals(syncResource.getResource());
}
return super.equals(object);
}
@@ -99,46 +76,9 @@ public class SyncResource implements IAdaptable {
* @see java.lang.Object#hashCode()
*/
public int hashCode() {
- return getLocalResource().hashCode();
- }
-
- /**
- * @return
- */
- public int getChangeType() {
- return getKind() & SyncInfo.CHANGE_MASK;
- }
-
- /**
- * @return
- */
- public int getChangeDirection() {
- return getKind() & SyncInfo.DIRECTION_MASK;
- }
-
- /**
- * @return
- */
- public int getKind() {
- SyncInfo info = getSyncInfo();
- if (info == null) return 0;
- return info.getKind();
+ return getResource().hashCode();
}
- /**
- * @return
- */
- public SyncResource getParent() {
- Object parent = SyncSet.getParent(syncSet, this);
- if (parent instanceof SyncResource) {
- return (SyncResource)parent;
- }
- return null;
- }
-
- /**
- * @return
- */
public IResource getResource() {
return resource;
}
diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/sync/views/SyncSet.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/sync/views/SyncSet.java
index 410987a95..77eb6a6dd 100644
--- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/sync/views/SyncSet.java
+++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/sync/views/SyncSet.java
@@ -50,103 +50,6 @@ public class SyncSet {
resetChanges();
}
- /**
- * Return the IResource for the given model object that was returned by
- * SyncSet#members(IResource). Return <code>null</code> if the given
- * object does not have a corresponding IResource.
- *
- * @param element
- * @return
- */
- public static IResource getIResource(Object element) {
- IResource resource = null;
- if (element instanceof IResource) {
- return (IResource)element;
- } if (element instanceof SyncInfo) {
- resource = ((SyncInfo) element).getLocal();
- } else if (element instanceof SyncResource) {
- resource = ((SyncResource)element).getLocalResource();
- }
- return resource;
- }
-
- /**
- * Return the sync kind for the given model object that was returned by
- * SyncSet#members(IResource). If syncSet is null, then the
- * sync kind for SyncContainers will always be 0.
- *
- * @param element
- * @return
- */
- public static int getSyncKind(SyncSet syncSet, Object element) {
- SyncInfo info = getSyncInfo(syncSet, element);
- if (info != null) {
- return info.getKind();
- }
- return 0;
- }
-
- public static Object[] members(SyncSet syncSet, IResource resource) {
- return syncSet.members(resource);
- }
-
- /**
- * Return the SyncInfo for the given model object that was returned by
- * SyncSet#members(IResource). If syncSet is null, then the
- * sync info will also be null.
- *
- * @param element
- * @return
- */
- public static SyncInfo getSyncInfo(SyncSet syncSet, Object element) {
- if (element instanceof SyncInfo) {
- return ((SyncInfo) element);
- } else if (element instanceof SyncResource) {
- SyncResource syncResource = (SyncResource)element;
- return syncResource.getSyncInfo();
- }
- return null;
- }
-
- public static SyncInfo getSyncInfo(Object element) {
- if (element instanceof SyncInfo) {
- return ((SyncInfo) element);
- } else if (element instanceof SyncResource) {
- SyncResource syncResource = (SyncResource)element;
- return syncResource.getSyncInfo();
- }
- return null;
- }
-
- /**
- * Get the model object (SyncSet, SyncInfo or SyncContainer) that is the
- * parent of the given model object.
- *
- * @param syncSet
- * @param object
- * @return
- */
- public static Object getParent(SyncSet syncSet, Object object) {
- IResource resource = getIResource(object);
- if (resource == null) return null;
- IContainer parent = resource.getParent();
- return getModelObject(syncSet, parent);
- }
-
-
- /**
- * Return the model object for the given IResource.
- * @param resource
- */
- public static Object getModelObject(SyncSet syncSet, IResource resource) {
- if (resource.getType() == IResource.ROOT) {
- // TODO: A subscriber may not be rooted at the project!!!
- return syncSet;
- } else {
- return new SyncResource(syncSet, resource);
- }
- }
-
protected void resetChanges() {
changes = new SyncSetChangedEvent(this);
stats.clear();
@@ -281,14 +184,11 @@ public class SyncSet {
* Return the children of the given container who are either out-of-sync or contain
* out-of-sync resources.
*
- * TODO: How does an IWorkbecnhAdapter fit into this picture (i.e. should
- * the adapter be converting SyncInfo to SyncResource
- *
* @param container
* @return
*/
- public Object[] members(IResource resource) {
- if (resource.getType() == IResource.FILE) return new Object[0];
+ public IResource[] members(IResource resource) {
+ if (resource.getType() == IResource.FILE) return new IResource[0];
IContainer parent = (IContainer)resource;
if (parent.getType() == IResource.ROOT) return getRoots(parent);
// TODO: must be optimized so that we don't traverse all the deep children to find
@@ -301,36 +201,61 @@ public class SyncSet {
Object next = it.next();
IResource element = (IResource)next;
IPath childPath = element.getFullPath();
- Object modelObject = null;
+ IResource modelObject = null;
if(childPath.segmentCount() == (path.segmentCount() + 1)) {
- modelObject = getModelObject(this, element);
+ modelObject = element;
} else if (childPath.segmentCount() > path.segmentCount()) {
IContainer childFolder = parent.getFolder(new Path(childPath.segment(path.segmentCount())));
- modelObject = getModelObject(this, childFolder);
+ modelObject = childFolder;
}
if (modelObject != null) {
children.add(modelObject);
}
}
}
- return (Object[]) children.toArray(new Object[children.size()]);
+ return (IResource[]) children.toArray(new IResource[children.size()]);
}
-
+
/**
+ * Return the out-of-sync descendants of the given resource. If the given resource
+ * is out of sync, it will be included in the result.
+ *
+ * @param container
* @return
*/
- private Object[] getRoots(IContainer root) {
+ public SyncInfo[] getOutOfSyncDescendants(IResource resource) {
+ if (resource.getType() == IResource.FILE) {
+ SyncInfo info = getSyncInfo(resource);
+ if (info == null) {
+ return new SyncInfo[0];
+ } else {
+ return new SyncInfo[] { info };
+ }
+ };
+ IContainer container = (IContainer)resource;
+ IPath path = container.getFullPath();
+ Set children = (Set)parents.get(path);
+ SyncInfo[] infos = new SyncInfo[children.size()];
+ int i = 0;
+ for (Iterator iter = children.iterator(); iter.hasNext();) {
+ IResource child = (IResource) iter.next();
+ infos[i++] = getSyncInfo(child);
+ }
+ return infos;
+ }
+
+ private IResource[] getRoots(IContainer root) {
Set possibleChildren = parents.keySet();
Set children = new HashSet();
for (Iterator it = possibleChildren.iterator(); it.hasNext();) {
Object next = it.next();
IResource element = ((IWorkspaceRoot)root).findMember((IPath)next);
if (element != null) {
- children.add(getModelObject(this, element.getProject()));
+ children.add(element.getProject());
}
}
- return (Object[]) children.toArray(new Object[children.size()]);
+ return (IResource[]) children.toArray(new IResource[children.size()]);
}
protected boolean hasMembers(IContainer container) {
diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/sync/views/SyncSetContentProvider.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/sync/views/SyncSetContentProvider.java
index 5df4e7fd5..9612ae1a9 100644
--- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/sync/views/SyncSetContentProvider.java
+++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/sync/views/SyncSetContentProvider.java
@@ -10,12 +10,14 @@
*******************************************************************************/
package org.eclipse.team.internal.ui.sync.views;
+import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IResource;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.StructuredViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.widgets.Control;
import org.eclipse.team.core.subscribers.SyncInfo;
+import org.eclipse.team.internal.ui.actions.TeamAction;
/**
* This class provides the contents for a StructuredViewer using a SyncSet as the model
@@ -111,7 +113,7 @@ public abstract class SyncSetContentProvider implements IStructuredContentProvid
// Refresh the viewer for each changed resource
SyncInfo[] infos = event.getChangedResources();
for (int i = 0; i < infos.length; i++) {
- ((StructuredViewer) viewer).refresh(SyncSet.getModelObject(getSyncSet(), infos[i].getLocal()), true);
+ ((StructuredViewer) viewer).refresh(getModelObject(infos[i].getLocal()), true);
}
}
@@ -126,7 +128,7 @@ public abstract class SyncSetContentProvider implements IStructuredContentProvid
IResource[] removed = event.getRemovedRoots();
for (int i = 0; i < removed.length; i++) {
IResource resource = removed[i];
- ((StructuredViewer) viewer).refresh(SyncSet.getModelObject(getSyncSet(), resource));
+ ((StructuredViewer) viewer).refresh(getModelObject(resource));
}
}
@@ -141,7 +143,7 @@ public abstract class SyncSetContentProvider implements IStructuredContentProvid
IResource[] added = event.getAddedRoots();
for (int i = 0; i < added.length; i++) {
IResource resource = added[i];
- ((StructuredViewer) viewer).refresh(SyncSet.getModelObject(getSyncSet(), resource.getParent()));
+ ((StructuredViewer) viewer).refresh(getModelObject(resource.getParent()));
}
}
@@ -149,20 +151,91 @@ public abstract class SyncSetContentProvider implements IStructuredContentProvid
return (StructuredViewer)viewer;
}
- protected Object getModelObject(IResource resource) {
- return SyncSet.getModelObject(getSyncSet(), resource);
+ /**
+ * Return the IResource for the given model object that was returned by
+ * SyncSet#members(IResource). Return <code>null</code> if the given
+ * object does not have a corresponding IResource.
+ *
+ * @param element
+ * @return
+ */
+ public IResource getResource(Object obj) {
+ return (IResource)TeamAction.getAdapter(obj, IResource.class);
}
- protected Object getModelObject(SyncInfo info) {
- return getModelObject(info.getLocal());
+ /**
+ * Return the sync kind for the given model object that was returned by
+ * SyncSet#members(IResource). If syncSet is null, then the
+ * sync kind for SyncContainers will always be 0.
+ *
+ * @param element
+ * @return
+ */
+ public int getSyncKind(SyncSet syncSet, Object element) {
+ SyncInfo info = getSyncInfo(element);
+ if (info != null) {
+ return info.getKind();
+ }
+ return 0;
}
- protected Object[] getModelObjects(SyncInfo[] infos) {
- Object[] resources = new Object[infos.length];
+ /**
+ * Return the children of the given container who are either out-of-sync or contain
+ * out-of-sync resources.
+ */
+ public Object[] members(IResource resource) {
+ IResource[] resources = getSyncSet().members(resource);
+ Object[] result = new Object[resources.length];
for (int i = 0; i < resources.length; i++) {
- resources[i] = getModelObject(infos[i]);
+ IResource child = resources[i];
+ result[i] = getModelObject(child);
+ }
+ return result;
+ }
+
+ /**
+ * Return the SyncInfo for the given model object that was returned by
+ * SyncSet#members(IResource). If syncSet is null, then the
+ * sync info will also be null.
+ *
+ * @param element
+ * @return
+ */
+ public SyncInfo getSyncInfo(Object element) {
+ if (element instanceof SyncInfo) {
+ return ((SyncInfo) element);
+ } else if (element instanceof SyncResource) {
+ SyncResource syncResource = (SyncResource)element;
+ return syncResource.getSyncInfo();
+ }
+ return null;
+ }
+
+ /**
+ * Get the model object (SyncSet, SyncInfo or SyncContainer) that is the
+ * parent of the given model object.
+ *
+ * @param syncSet
+ * @param object
+ * @return
+ */
+ public Object getParent(Object object) {
+ IResource resource = getResource(object);
+ if (resource == null) return null;
+ IContainer parent = resource.getParent();
+ return getModelObject(parent);
+ }
+
+ /**
+ * Return the model object for the given IResource.
+ * @param resource
+ */
+ public Object getModelObject(IResource resource) {
+ if (resource.getType() == IResource.ROOT) {
+ return getSyncSet();
+ } else {
+ return new SyncResource(getSyncSet(), resource);
}
- return resources;
}
protected Object[] getModelObjects(IResource[] resources) {
diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/sync/views/SyncSetTableContentProvider.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/sync/views/SyncSetTableContentProvider.java
index da6e48209..c43c881f0 100644
--- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/sync/views/SyncSetTableContentProvider.java
+++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/sync/views/SyncSetTableContentProvider.java
@@ -61,4 +61,15 @@ public class SyncSetTableContentProvider extends SyncSetContentProvider {
}
}
+ protected Object getModelObject(SyncInfo info) {
+ return getModelObject(info.getLocal());
+ }
+
+ protected Object[] getModelObjects(SyncInfo[] infos) {
+ Object[] resources = new Object[infos.length];
+ for (int i = 0; i < resources.length; i++) {
+ resources[i] = getModelObject(infos[i]);
+ }
+ return resources;
+ }
}
diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/sync/views/SyncSetTreeContentProvider.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/sync/views/SyncSetTreeContentProvider.java
index 2d8c97318..e610d30b0 100644
--- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/sync/views/SyncSetTreeContentProvider.java
+++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/sync/views/SyncSetTreeContentProvider.java
@@ -32,11 +32,11 @@ public class SyncSetTreeContentProvider extends SyncSetContentProvider implement
* @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)
*/
public Object[] getChildren(Object element) {
- IResource resource = SyncSet.getIResource(element);
+ IResource resource = getResource(element);
if (resource != null) {
- return SyncSet.members(getSyncSet(), resource);
+ return members(resource);
} else if (element instanceof SyncSet) {
- return SyncSet.members(getSyncSet(), ResourcesPlugin.getWorkspace().getRoot());
+ return members(ResourcesPlugin.getWorkspace().getRoot());
}
return new Object[0];
}
@@ -52,10 +52,10 @@ public class SyncSetTreeContentProvider extends SyncSetContentProvider implement
* @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
*/
public Object getParent(Object element) {
- IResource resource = SyncSet.getIResource(element);
+ IResource resource = getResource(element);
if (resource == null) return null;
IContainer parent = resource.getParent();
- return SyncSet.getModelObject(getSyncSet(), parent);
+ return getModelObject(parent);
}
public AbstractTreeViewer getTreeViewer() {
@@ -79,9 +79,9 @@ public class SyncSetTreeContentProvider extends SyncSetContentProvider implement
if (resource.getType() == IResource.PROJECT) {
parent = getSyncSet();
} else {
- parent = SyncSet.getModelObject(getSyncSet(), resource.getParent());
+ parent = getModelParent(resource);
}
- tree.add(parent, SyncSet.getModelObject(getSyncSet(), resource));
+ tree.add(parent, getModelObject(resource));
}
} else {
super.handleResourceAdditions(event);
@@ -98,11 +98,15 @@ public class SyncSetTreeContentProvider extends SyncSetContentProvider implement
if (roots.length == 0) return;
Object[] modelRoots = new Object[roots.length];
for (int i = 0; i < modelRoots.length; i++) {
- modelRoots[i] = SyncSet.getModelObject(getSyncSet(), roots[i]);
+ modelRoots[i] = getModelObject(roots[i]);
}
tree.remove(modelRoots);
} else {
super.handleResourceRemovals(event);
}
}
+
+ protected Object getModelParent(IResource resource) {
+ return getModelObject(resource.getParent());
+ }
}
diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/sync/views/SyncTreeViewer.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/sync/views/SyncTreeViewer.java
index 7e937d9e1..d8fc4347c 100644
--- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/sync/views/SyncTreeViewer.java
+++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/sync/views/SyncTreeViewer.java
@@ -41,7 +41,11 @@ public class SyncTreeViewer extends TreeViewer implements INavigableControl {
for (int i= 0; i < changed.length; i++) {
Object curr = changed[i];
if (curr instanceof IResource) {
- curr = SyncSet.getModelObject(viewer.getInput().getFilteredSyncSet(), (IResource)curr);
+ // TODO: This may be the wrong model object!
+ SyncSetContentProvider provider = viewer.getContentProvider();
+ if (provider != null) {
+ curr = provider.getModelObject((IResource)curr);
+ }
}
others.add(curr);
}
@@ -209,4 +213,5 @@ public class SyncTreeViewer extends TreeViewer implements INavigableControl {
}
}
}
+
} \ No newline at end of file
diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/sync/views/SyncViewer.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/sync/views/SyncViewer.java
index 3fc13d3e9..d90a945d2 100644
--- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/sync/views/SyncViewer.java
+++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/sync/views/SyncViewer.java
@@ -59,6 +59,7 @@ import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.team.core.TeamException;
import org.eclipse.team.core.subscribers.ITeamResourceChangeListener;
+import org.eclipse.team.core.subscribers.SyncInfo;
import org.eclipse.team.core.subscribers.TeamDelta;
import org.eclipse.team.core.subscribers.TeamProvider;
import org.eclipse.team.core.subscribers.TeamSubscriber;
@@ -626,7 +627,7 @@ public class SyncViewer extends ViewPart implements ITeamResourceChangeListener,
Object object = selected[i];
if (object instanceof SyncResource) {
SyncResource syncResource = (SyncResource) object;
- SyncResource[] infos = syncResource.getOutOfSyncDescendants();
+ SyncInfo[] infos = syncResource.getOutOfSyncDescendants();
result.addAll(Arrays.asList(infos));
}
}
@@ -812,4 +813,8 @@ public class SyncViewer extends ViewPart implements ITeamResourceChangeListener,
}
return false;
}
+
+ public SyncSetContentProvider getContentProvider() {
+ return (SyncSetContentProvider)getViewer().getContentProvider();
+ }
} \ No newline at end of file
diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/sync/views/SyncViewerLabelProvider.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/sync/views/SyncViewerLabelProvider.java
index 30134cc82..546c3c61e 100644
--- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/sync/views/SyncViewerLabelProvider.java
+++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/sync/views/SyncViewerLabelProvider.java
@@ -7,7 +7,11 @@ import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.swt.graphics.Image;
+import org.eclipse.team.core.subscribers.SyncInfo;
import org.eclipse.team.core.sync.IRemoteSyncElement;
+import org.eclipse.team.internal.ui.TeamUIPlugin;
+import org.eclipse.team.internal.ui.actions.TeamAction;
+import org.eclipse.team.ui.ISharedImages;
import org.eclipse.ui.internal.WorkbenchPlugin;
import org.eclipse.ui.model.WorkbenchLabelProvider;
@@ -20,12 +24,24 @@ public class SyncViewerLabelProvider extends LabelProvider implements ITableLabe
private static final int COL_RESOURCE = 0;
private static final int COL_PARENT = 1;
+ private Image compressedFolderImage;
+
// Keep track of the compare and workbench image providers
// so they can be properly disposed
CompareConfiguration compareConfig = new CompareConfiguration();
WorkbenchLabelProvider workbenchLabelProvider = new WorkbenchLabelProvider();
/**
+ * @return
+ */
+ public Image getCompressedFolderImage() {
+ if (compressedFolderImage == null) {
+ compressedFolderImage = TeamUIPlugin.getImageDescriptor(ISharedImages.IMG_COMPRESSED_FOLDER).createImage();
+ }
+ return compressedFolderImage;
+ }
+
+ /**
* Returns a sync view label provider that is hooked up to the decorator
* mechanism.
*
@@ -46,13 +62,20 @@ public class SyncViewerLabelProvider extends LabelProvider implements ITableLabe
}
public String getText(Object element) {
- IResource resource = SyncSet.getIResource(element);
+ if (element instanceof CompressedFolder) {
+ IResource resource = getResource(element);
+ return resource.getProjectRelativePath().toString();
+ }
+ IResource resource = getResource(element);
return workbenchLabelProvider.getText(resource);
}
public Image getImage(Object element) {
- IResource resource = SyncSet.getIResource(element);
- int kind= SyncSet.getSyncKind(null /* sync set */, element);
+ if (element instanceof CompressedFolder) {
+ return compareConfig.getImage(getCompressedFolderImage(), 0);
+ }
+ IResource resource = getResource(element);
+ int kind = getSyncKind(element);
switch (kind & IRemoteSyncElement.DIRECTION_MASK) {
case IRemoteSyncElement.OUTGOING:
kind = (kind &~ IRemoteSyncElement.OUTGOING) | IRemoteSyncElement.INCOMING;
@@ -72,6 +95,8 @@ public class SyncViewerLabelProvider extends LabelProvider implements ITableLabe
super.dispose();
workbenchLabelProvider.dispose();
compareConfig.dispose();
+ if (compressedFolderImage != null)
+ compressedFolderImage.dispose();
}
/* (non-Javadoc)
@@ -81,7 +106,7 @@ public class SyncViewerLabelProvider extends LabelProvider implements ITableLabe
if (columnIndex == COL_RESOURCE) {
return getImage(element);
} else if (columnIndex == COL_PARENT) {
- IResource resource = SyncSet.getIResource(element);
+ IResource resource = getResource(element);
return null;
}
return null;
@@ -94,9 +119,25 @@ public class SyncViewerLabelProvider extends LabelProvider implements ITableLabe
if (columnIndex == COL_RESOURCE) {
return getText(element);
} else if (columnIndex == COL_PARENT) {
- IResource resource = SyncSet.getIResource(element);
+ IResource resource = getResource(element);
return resource.getParent().getFullPath().toString();
}
return null;
}
+
+ private IResource getResource(Object obj) {
+ return (IResource)TeamAction.getAdapter(obj, IResource.class);
+ }
+
+ private SyncInfo getSyncInfo(Object obj) {
+ return (SyncInfo)TeamAction.getAdapter(obj, SyncInfo.class);
+ }
+
+ private int getSyncKind(Object element) {
+ SyncInfo info = getSyncInfo(element);
+ if (info != null) {
+ return info.getKind();
+ }
+ return 0;
+ }
} \ No newline at end of file
diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/sync/views/SyncViewerSorter.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/sync/views/SyncViewerSorter.java
index a5680c34a..78e24ba1c 100644
--- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/sync/views/SyncViewerSorter.java
+++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/sync/views/SyncViewerSorter.java
@@ -12,6 +12,7 @@ package org.eclipse.team.internal.ui.sync.views;
import org.eclipse.core.resources.IResource;
import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.team.internal.ui.actions.TeamAction;
/**
* This class sorts the model elements that appear in the SyncViewer
@@ -33,8 +34,8 @@ public class SyncViewerSorter extends ViewerSorter {
return super.category(element);
}
- protected IResource getResource(Object element) {
- return SyncSet.getIResource(element);
+ protected IResource getResource(Object obj) {
+ return (IResource)TeamAction.getAdapter(obj, IResource.class);
}
}
diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/ISharedImages.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/ISharedImages.java
index ea7f25287..5133f00ee 100644
--- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/ISharedImages.java
+++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/ISharedImages.java
@@ -76,5 +76,8 @@ public interface ISharedImages {
//objects
public final String IMG_SITE_ELEMENT = "clcl16/site_element.gif"; //$NON-NLS-1$
public final String IMG_CHANGE_FILTER = "clcl16/change_filter.gif"; //$NON-NLS-1$
+
+ // TODO: I just picked an image. We should get a custom image
+ public final String IMG_COMPRESSED_FOLDER = "obj/share_project.gif"; //$NON-NLS-1$
}

Back to the top