From 1fb103ef0d3336ea4d5eac144056badc3766761c Mon Sep 17 00:00:00 2001 From: Jean Michel-Lemieux Date: Wed, 5 May 2004 03:01:20 +0000 Subject: Released model provider that supports grouping changes by comment. This is currently disabled. --- .../ccvs/ui/operations/RemoteLogOperation.java | 2 +- .../ui/operations/RepositoryLocationOperation.java | 5 +- .../ccvs/ui/subscriber/ChangeLogModelManager.java | 91 +++++++++++++++++ .../ccvs/ui/subscriber/ChangeLogModelProvider.java | 108 +++++++++++++-------- .../ui/subscriber/MergeSynchronizeParticipant.java | 2 + 5 files changed, 165 insertions(+), 43 deletions(-) create mode 100644 bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/ChangeLogModelManager.java diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/operations/RemoteLogOperation.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/operations/RemoteLogOperation.java index 75c5b6d53..999cf234e 100644 --- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/operations/RemoteLogOperation.java +++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/operations/RemoteLogOperation.java @@ -29,7 +29,7 @@ public class RemoteLogOperation extends RepositoryLocationOperation { private RLog rlog = new RLog(); private Map entries = new HashMap(); - protected RemoteLogOperation(IWorkbenchPart part, ICVSRemoteResource[] remoteResources) { + public RemoteLogOperation(IWorkbenchPart part, ICVSRemoteResource[] remoteResources) { super(part, remoteResources); } diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/operations/RepositoryLocationOperation.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/operations/RepositoryLocationOperation.java index 09ed474c6..0da7eaaec 100644 --- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/operations/RepositoryLocationOperation.java +++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/operations/RepositoryLocationOperation.java @@ -11,7 +11,6 @@ package org.eclipse.team.internal.ccvs.ui.operations; import java.util.*; -import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.team.internal.ccvs.core.*; import org.eclipse.team.internal.ccvs.ui.Policy; @@ -29,7 +28,7 @@ public abstract class RepositoryLocationOperation extends RemoteOperation { /* (non-Javadoc) * @see org.eclipse.team.internal.ccvs.ui.operations.CVSOperation#execute(org.eclipse.core.runtime.IProgressMonitor) */ - protected void execute(IProgressMonitor monitor) throws CVSException, InterruptedException { + public void execute(IProgressMonitor monitor) throws CVSException, InterruptedException { Map table = getLocationMapping(getRemoteResources()); Set keySet = table.keySet(); monitor.beginTask(null, keySet.size() * 100); @@ -37,7 +36,7 @@ public abstract class RepositoryLocationOperation extends RemoteOperation { while (iterator.hasNext()) { ICVSRepositoryLocation location = (ICVSRepositoryLocation)iterator.next(); List list = (List)table.get(location); - ICVSRemoteResource[] remoteResources = (ICVSRemoteResource[])list.toArray(new IResource[list.size()]); + ICVSRemoteResource[] remoteResources = (ICVSRemoteResource[])list.toArray(new ICVSRemoteResource[list.size()]); execute(location, remoteResources, Policy.subMonitorFor(monitor, 100)); } } diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/ChangeLogModelManager.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/ChangeLogModelManager.java new file mode 100644 index 000000000..0fa4fd363 --- /dev/null +++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/ChangeLogModelManager.java @@ -0,0 +1,91 @@ +/******************************************************************************* + * 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.ccvs.ui.subscriber; + +import org.eclipse.jface.util.IPropertyChangeListener; +import org.eclipse.jface.util.PropertyChangeEvent; +import org.eclipse.team.core.synchronize.SyncInfoTree; +import org.eclipse.team.internal.ui.IPreferenceIds; +import org.eclipse.team.internal.ui.TeamUIPlugin; +import org.eclipse.team.internal.ui.synchronize.*; +import org.eclipse.team.ui.synchronize.ISynchronizePageConfiguration; + + +/** + * Manager for hierarchical models + */ +public class ChangeLogModelManager extends SynchronizeModelManager implements IPropertyChangeListener { + + /** + * @param configuration + */ + public ChangeLogModelManager(ISynchronizePageConfiguration configuration) { + super(configuration); + configuration.addPropertyChangeListener(this); + } + + /* (non-Javadoc) + * @see org.eclipse.team.internal.ui.synchronize.SynchronizeModelManager#dispose() + */ + public void dispose() { + getConfiguration().removePropertyChangeListener(this); + super.dispose(); + } + + /* (non-Javadoc) + * @see org.eclipse.team.internal.ui.synchronize.SynchronizeModelManager#getSupportedModelProviders() + */ + protected ISynchronizeModelProviderDescriptor[] getSupportedModelProviders() { + return new ISynchronizeModelProviderDescriptor[] { + new HierarchicalModelProvider.HierarchicalModelProviderDescriptor(), + new CompressedFoldersModelProvider.CompressedFolderModelProviderDescriptor(), + new ChangeLogModelProvider.ChangeLogModelProviderDescriptor()}; + } + + /* (non-Javadoc) + * @see org.eclipse.team.internal.ui.synchronize.SynchronizeModelManager#createModelProvider(java.lang.String) + */ + protected ISynchronizeModelProvider createModelProvider(String id) { + if(id == null) { + if (getShowCompressedFolders()) { + id = CompressedFoldersModelProvider.CompressedFolderModelProviderDescriptor.ID; + } else { + id = HierarchicalModelProvider.HierarchicalModelProviderDescriptor.ID; + } + } + if(id.endsWith(CompressedFoldersModelProvider.CompressedFolderModelProviderDescriptor.ID)) { + return new CompressedFoldersModelProvider(getSyncInfoSet()); + } else if(id.endsWith(HierarchicalModelProvider.HierarchicalModelProviderDescriptor.ID)) { + return new HierarchicalModelProvider(getSyncInfoSet()); + } else { + return new ChangeLogModelProvider(getSyncInfoSet()); + } + } + + private SyncInfoTree getSyncInfoSet() { + return (SyncInfoTree)getConfiguration().getProperty(ISynchronizePageConfiguration.P_SYNC_INFO_SET); + } + + /** + * Return the state of the compressed folder setting. + * + * @return the state of the compressed folder setting. + */ + private boolean getShowCompressedFolders() { + return TeamUIPlugin.getPlugin().getPreferenceStore().getBoolean(IPreferenceIds.SYNCVIEW_COMPRESS_FOLDERS); + } + + /* (non-Javadoc) + * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent) + */ + public void propertyChange(PropertyChangeEvent event) { + } +} \ No newline at end of file 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 3a14c395a..722a62528 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 @@ -25,10 +25,12 @@ import org.eclipse.team.internal.ccvs.core.resources.CVSWorkspaceRoot; import org.eclipse.team.internal.ccvs.core.resources.RemoteFile; import org.eclipse.team.internal.ccvs.core.syncinfo.ResourceSyncInfo; import org.eclipse.team.internal.ccvs.ui.CVSUIPlugin; +import org.eclipse.team.internal.ccvs.ui.ICVSUIConstants; +import org.eclipse.team.internal.ccvs.ui.operations.RemoteLogOperation; import org.eclipse.team.internal.ui.TeamUIPlugin; +import org.eclipse.team.internal.ui.Utils; import org.eclipse.team.internal.ui.synchronize.*; -import org.eclipse.team.ui.ISharedImages; -import org.eclipse.team.ui.TeamImages; +import org.eclipse.team.ui.synchronize.ISynchronizeManager; import org.eclipse.team.ui.synchronize.ISynchronizeModelElement; import org.eclipse.ui.progress.UIJob; @@ -101,10 +103,14 @@ public class ChangeLogModelProvider extends SynchronizeModelProvider { private SyncInfoSet set; public FetchLogEntriesJob() { super("Fetching CVS logs"); //$NON-NLS-1$; + setUser(true); } public void setSyncInfoSet(SyncInfoSet set) { this.set = set; } + public boolean belongsTo(Object family) { + return family == ISynchronizeManager.FAMILY_SYNCHRONIZE_OPERATION; + } public IStatus run(IProgressMonitor monitor) { if (set != null && !shutdown) { final ISynchronizeModelElement[] nodes = calculateRoots(getSyncInfoSet(), monitor); @@ -123,15 +129,15 @@ public class ChangeLogModelProvider extends SynchronizeModelProvider { }; public static class ChangeLogModelProviderDescriptor implements ISynchronizeModelProviderDescriptor { - public static final String ID = TeamUIPlugin.ID + ".modelprovider_hierarchical"; + public static final String ID = TeamUIPlugin.ID + ".modelprovider_cvs_changelog"; public String getId() { return ID; } public String getName() { - return "Change Log"; + return "Grouped By Comment (useful for browing incoming changes)"; } public ImageDescriptor getImageDescriptor() { - return TeamImages.getImageDescriptor(ISharedImages.IMG_IGNORE_WHITESPACE); + return CVSUIPlugin.getPlugin().getImageDescriptor(ICVSUIConstants.IMG_DATE); } }; private static final ChangeLogModelProviderDescriptor descriptor = new ChangeLogModelProviderDescriptor(); @@ -170,58 +176,82 @@ public class ChangeLogModelProvider extends SynchronizeModelProvider { } private ISynchronizeModelElement[] calculateRoots(SyncInfoSet set, IProgressMonitor monitor) { - commentRoots.clear(); - SyncInfo[] infos = set.getSyncInfos(); - monitor.beginTask("fetching from server", set.size() * 100); - for (int i = 0; i < infos.length; i++) { - if(monitor.isCanceled()) { - break; - } - ILogEntry logEntry = getSyncInfoComment((CVSSyncInfo) infos[i], monitor); - if(logEntry != null) { - DateComment dateComment = new DateComment(logEntry.getDate(), logEntry.getComment(), logEntry.getAuthor()); - ChangeLogDiffNode changeRoot = (ChangeLogDiffNode) commentRoots.get(dateComment); - if (changeRoot == null) { - changeRoot = new ChangeLogDiffNode(getModelRoot(), logEntry); - commentRoots.put(dateComment, changeRoot); + try { + commentRoots.clear(); + SyncInfo[] infos = set.getSyncInfos(); + RemoteLogOperation logs = getSyncInfoComment(infos, monitor); + monitor.beginTask("fetching from server", set.size() * 100); + for (int i = 0; i < infos.length; i++) { + if(monitor.isCanceled()) { + break; + } + // TODO: handle outgoing additions that don't have log entries!! + ILogEntry logEntry = logs.getLogEntry(getRemoteResource((CVSSyncInfo)infos[i])); + if(logEntry != null) { + DateComment dateComment = new DateComment(logEntry.getDate(), logEntry.getComment(), logEntry.getAuthor()); + ChangeLogDiffNode changeRoot = (ChangeLogDiffNode) commentRoots.get(dateComment); + if (changeRoot == null) { + changeRoot = new ChangeLogDiffNode(getModelRoot(), logEntry); + commentRoots.put(dateComment, changeRoot); + } + ISynchronizeModelElement element = new FullPathSyncInfoElement(changeRoot, infos[i]); + associateDiffNode(element); } - ISynchronizeModelElement element = new FullPathSyncInfoElement(changeRoot, infos[i]); - associateDiffNode(element); + monitor.worked(100); } - monitor.worked(100); + return (ChangeLogDiffNode[]) commentRoots.values().toArray(new ChangeLogDiffNode[commentRoots.size()]); + } catch (CVSException e) { + Utils.handle(e); + return new ISynchronizeModelElement[0]; + } catch (InterruptedException e) { + return new ISynchronizeModelElement[0]; } - return (ChangeLogDiffNode[]) commentRoots.values().toArray(new ChangeLogDiffNode[commentRoots.size()]); } /** * How do we tell which revision has the interesting log message? Use the later * revision, since it probably has the most up-to-date comment. */ - private ILogEntry getSyncInfoComment(CVSSyncInfo info, IProgressMonitor monitor) { - try { - if(info.getLocal().getType() != IResource.FILE) { - return null; + private RemoteLogOperation getSyncInfoComment(SyncInfo[] infos, IProgressMonitor monitor) throws CVSException, InterruptedException { + List remotes = new ArrayList(); + for (int i = 0; i < infos.length; i++) { + CVSSyncInfo info = (CVSSyncInfo)infos[i]; + if (info.getLocal().getType() != IResource.FILE) { + continue; + } + ICVSRemoteResource remote = getRemoteResource(info); + if(remote != null) { + remotes.add(remote); } - - ICVSRemoteResource remote = (ICVSRemoteResource)info.getRemote(); - ICVSRemoteResource base = (ICVSRemoteResource)info.getBase(); - ICVSRemoteResource local = (ICVSRemoteFile)CVSWorkspaceRoot.getRemoteResourceFor(info.getLocal()); - + } + if(! remotes.isEmpty()) { + RemoteLogOperation op = new RemoteLogOperation(null, (ICVSRemoteResource[]) remotes.toArray(new ICVSRemoteResource[remotes.size()])); + op.execute(monitor); + return op; + } + return null; + } + + private ICVSRemoteResource getRemoteResource(CVSSyncInfo info) { + try { + ICVSRemoteResource remote = (ICVSRemoteResource) info.getRemote(); + ICVSRemoteResource base = (ICVSRemoteResource) info.getBase(); + ICVSRemoteResource local = (ICVSRemoteFile) CVSWorkspaceRoot.getRemoteResourceFor(info.getLocal()); + String baseRevision = getRevisionString(base); String remoteRevision = getRevisionString(remote); String localRevision = getRevisionString(local); - - // TODO: handle new files where there is no local or remote + boolean useRemote = true; - if(local != null && remote != null) { + if (local != null && remote != null) { useRemote = ResourceSyncInfo.isLaterRevision(remoteRevision, localRevision); - } else if(remote == null) { + } else if (remote == null) { useRemote = false; } if (useRemote) { - return ((RemoteFile) remote).getLogEntry(monitor); - } else if (local != null){ - return ((RemoteFile) local).getLogEntry(monitor); + return remote; + } else if (local != null) { + return local; } return null; } catch (CVSException e) { diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/MergeSynchronizeParticipant.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/MergeSynchronizeParticipant.java index 3e4421541..59823b580 100644 --- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/MergeSynchronizeParticipant.java +++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/MergeSynchronizeParticipant.java @@ -22,6 +22,7 @@ import org.eclipse.team.internal.ccvs.ui.CVSUIPlugin; import org.eclipse.team.internal.ccvs.ui.Policy; import org.eclipse.team.internal.ui.Utils; import org.eclipse.team.internal.ui.synchronize.ActionDelegateWrapper; +import org.eclipse.team.internal.ui.synchronize.SynchronizePageConfiguration; import org.eclipse.team.ui.TeamUI; import org.eclipse.team.ui.synchronize.*; import org.eclipse.ui.*; @@ -197,5 +198,6 @@ public class MergeSynchronizeParticipant extends CVSParticipant { configuration.setSupportedModes(ISynchronizePageConfiguration.INCOMING_MODE | ISynchronizePageConfiguration.CONFLICTING_MODE); configuration.setMode(ISynchronizePageConfiguration.INCOMING_MODE); configuration.addActionContribution(new MergeParticipantActionContribution()); + configuration.setProperty(SynchronizePageConfiguration.P_MODEL_MANAGER, new ChangeLogModelManager(configuration)); } } \ No newline at end of file -- cgit v1.2.3