blob: bdb35a6d8e55eae13042594a544f1abd91e7f70d [file] [log] [blame]
package org.eclipse.team.internal.ccvs.ui.merge;
/*
* (c) Copyright IBM Corp. 2000, 2002.
* All Rights Reserved.
*/
import org.eclipse.compare.structuremergeviewer.ICompareInput;
import org.eclipse.compare.structuremergeviewer.IDiffContainer;
import org.eclipse.compare.structuremergeviewer.IDiffElement;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.team.core.TeamException;
import org.eclipse.team.core.sync.IRemoteResource;
import org.eclipse.team.core.sync.IRemoteSyncElement;
import org.eclipse.team.internal.ccvs.core.CVSTag;
import org.eclipse.team.internal.ccvs.core.resources.CVSRemoteSyncElement;
import org.eclipse.team.internal.ccvs.core.resources.CVSWorkspaceRoot;
import org.eclipse.team.internal.ccvs.core.resources.RemoteFile;
import org.eclipse.team.internal.ccvs.ui.Policy;
import org.eclipse.team.internal.ccvs.ui.sync.CVSSyncCompareInput;
import org.eclipse.team.internal.ui.sync.MergeResource;
import org.eclipse.team.internal.ui.sync.SyncView;
import org.eclipse.team.internal.ui.sync.TeamFile;
public class MergeEditorInput extends CVSSyncCompareInput {
CVSTag start;
CVSTag end;
public MergeEditorInput(IResource[] resources, CVSTag start, CVSTag end) {
// we have to perform content comparison since files in different branches
// may have different revisions but the same contents. Consider these files
// for merge purposes as equal.
super(resources, IRemoteSyncElement.GRANULARITY_CONTENTS);
this.start = start;
this.end = end;
}
public Viewer createDiffViewer(Composite parent) {
Viewer viewer = super.createDiffViewer(parent);
getViewer().syncModeChanged(SyncView.SYNC_MERGE);
return viewer;
}
protected IRemoteSyncElement[] createSyncElements(IProgressMonitor monitor) throws TeamException {
IResource[] resources = getResources();
IRemoteSyncElement[] trees = new IRemoteSyncElement[resources.length];
int work = 100 * resources.length;
monitor.beginTask(null, work);
try {
for (int i = 0; i < trees.length; i++) {
IResource resource = resources[i];
IRemoteResource base = CVSWorkspaceRoot.getRemoteTree(resource, start, Policy.subMonitorFor(monitor, 50));
IRemoteResource remote = CVSWorkspaceRoot.getRemoteTree(resource, end, Policy.subMonitorFor(monitor, 50));
trees[i] = new CVSRemoteSyncElement(true /*three way*/, resource, base, remote);
}
} finally {
monitor.done();
}
return trees;
}
public CVSTag getStartTag() {
return start;
}
public CVSTag getEndTag() {
return end;
}
public String getTitle() {
return Policy.bind("MergeEditorInput.title", start.getName(), end.getName()); //$NON-NLS-1$
}
public boolean isSaveNeeded() {
return false;
}
protected void contentsChanged(ICompareInput source) {
}
/*
* Override collectResourceChanges to only determine the true sync state for incomming changes
*/
protected IDiffElement collectResourceChanges(IDiffContainer parent, IRemoteSyncElement tree, IProgressMonitor pm) {
if ( ! tree.isContainer()) {
CVSRemoteSyncElement cvsTree = (CVSRemoteSyncElement)tree;
RemoteFile base = (RemoteFile)cvsTree.getBase();
RemoteFile remote = (RemoteFile)cvsTree.getRemote();
if (base != null && remote != null && base.getRevision().equals(remote.getRevision())) {
// If the base and remote are the same, we don't have an incomming change
MergeResource mergeResource = new MergeResource(tree);
TeamFile file = new TeamFile(parent, mergeResource, IRemoteSyncElement.IN_SYNC, getShell());
return file;
}
}
return super.collectResourceChanges(parent, tree, pm);
}
}