diff options
author | Michael Valenta | 2003-07-10 16:10:54 +0000 |
---|---|---|
committer | Michael Valenta | 2003-07-10 16:10:54 +0000 |
commit | 6ce52650bb77caf619e52cd9a0e5b7aee7ec569e (patch) | |
tree | be88dfae8010d1d254e20769f99c1dad12f50dd8 | |
parent | e0d5793fc180940be2faa9bbb83437ce7d3b55d6 (diff) | |
download | eclipse.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
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$ } |