blob: c9a6700844d703ac9cba03484872b8a7a318a73d [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2006 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.team.internal.ccvs.ui.subscriber;
import java.lang.reflect.InvocationTargetException;
import org.eclipse.compare.structuremergeviewer.IDiffElement;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.osgi.util.NLS;
import org.eclipse.team.core.TeamException;
import org.eclipse.team.core.synchronize.*;
import org.eclipse.team.core.synchronize.FastSyncInfoFilter.*;
import org.eclipse.team.core.variants.IResourceVariant;
import org.eclipse.team.internal.ccvs.core.*;
import org.eclipse.team.internal.ccvs.ui.CVSUIMessages;
import org.eclipse.team.internal.ccvs.ui.operations.RemoteCompareOperation.CompareTreeBuilder;
import org.eclipse.team.internal.core.subscribers.ChangeSet;
import org.eclipse.team.internal.core.subscribers.CheckedInChangeSet;
import org.eclipse.team.internal.ui.synchronize.ChangeSetDiffNode;
import org.eclipse.team.ui.synchronize.*;
import com.ibm.icu.text.DateFormat;
class OpenChangeSetAction extends SynchronizeModelAction {
protected OpenChangeSetAction(ISynchronizePageConfiguration configuration) {
super(CVSUIMessages.OpenCommitSetAction_20, configuration);
}
@Override
protected FastSyncInfoFilter getSyncInfoFilter() {
return new AndSyncInfoFilter(new FastSyncInfoFilter[] {
new FastSyncInfoFilter() {
@Override
public boolean select(SyncInfo info) {
return info.getLocal().getType() == IResource.FILE;
}
},
new OrSyncInfoFilter(new FastSyncInfoFilter[] {
new SyncInfoDirectionFilter(new int[] { SyncInfo.INCOMING, SyncInfo.CONFLICTING }),
new FastSyncInfoFilter() {
@Override
public boolean select(SyncInfo info) {
return !info.getComparator().isThreeWay();
}
}
})
});
}
private ChangeSet getChangeSet(IStructuredSelection selection) {
// First, check to see if a change set is selected directly
if (selection.size() == 1) {
Object o = selection.getFirstElement();
if (o instanceof IAdaptable) {
ChangeSet set = ((IAdaptable)o).getAdapter(ChangeSet.class);
if (set != null)
return set;
}
}
// Failing that, check to see if all the selected elements and their childen are in the same change set
return getChangeSet(selection.toArray());
}
private ChangeSet getChangeSet(Object[] elements) {
ChangeSet foundSet = null;
for (int i = 0; i < elements.length; i++) {
Object object = elements[i];
ChangeSet set = getChangeSet((ISynchronizeModelElement)object);
if (set == null) return null;
if (foundSet == null) {
foundSet = set;
} else if (foundSet != set) {
return null;
}
}
return foundSet;
}
private ChangeSet getChangeSet(ISynchronizeModelElement element) {
if (element == null) return null;
if (element instanceof IAdaptable) {
ChangeSet set = ((IAdaptable)element).getAdapter(ChangeSet.class);
if (set != null)
return set;
}
return getChangeSet((ISynchronizeModelElement)element.getParent());
}
@Override
protected boolean updateSelection(IStructuredSelection selection) {
boolean enabled = super.updateSelection(selection);
if (enabled) {
// The selection only contains appropriate files so
// only enable if the selection is contained within a single change set
ChangeSet set = getChangeSet(selection);
return set != null;
}
return false;
}
@Override
protected SynchronizeModelOperation getSubscriberOperation(ISynchronizePageConfiguration configuration, IDiffElement[] elements) {
return new SynchronizeModelOperation(configuration, elements) {
@Override
public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
SyncInfoSet set = getSyncInfoSet();
SyncInfo[] infos = set.getSyncInfos();
if (infos.length > 0) {
ICVSRepositoryLocation location = getLocation(infos[0]);
if (location == null) {
handle(new CVSException(CVSUIMessages.OpenCommitSetAction_21));
return;
}
CompareTreeBuilder builder = new CompareTreeBuilder(location, null, null);
if (buildTrees(builder, infos)) {
try {
builder.cacheContents(monitor);
builder.openCompareEditor(getConfiguration().getSite().getPart().getSite().getPage(), getCompareTitle(), getCompareToolTip());
} catch (CVSException e) {
handle(e);
return;
}
}
}
}
private String getCompareToolTip() {
IDiffElement[] elements = getSelectedDiffElements();
for (int i = 0; i < elements.length; i++) {
IDiffElement element = elements[i];
while (element != null) {
if (element instanceof ChangeSetDiffNode) {
return ((ChangeSetDiffNode)element).getName();
}
element = element.getParent();
}
}
return null;
}
private String getCompareTitle() {
IDiffElement[] elements = getSelectedDiffElements();
ChangeSet set = getChangeSet(elements);
if (set instanceof CheckedInChangeSet) {
CheckedInChangeSet cics = (CheckedInChangeSet)set;
String date = DateFormat.getDateTimeInstance().format(cics.getDate());
return NLS.bind(CVSUIMessages.OpenChangeSetAction_0, new String[] {cics.getAuthor(), date});
}
return CVSUIMessages.OpenChangeSetAction_1;
}
private ICVSRepositoryLocation getLocation(SyncInfo info) {
IResourceVariant remote = info.getRemote();
if (remote == null) {
remote = info.getBase();
}
if (remote != null) {
return ((ICVSRemoteResource)remote).getRepository();
}
return null;
}
/*
* Build the trees that will be compared
*/
private boolean buildTrees(CompareTreeBuilder builder, SyncInfo[] infos) {
for (int i = 0; i < infos.length; i++) {
SyncInfo info = infos[i];
IResourceVariant remote = info.getRemote();
if (remote == null) {
IResourceVariant predecessor = info.getBase();
if (predecessor instanceof ICVSRemoteFile) {
builder.addToTrees((ICVSRemoteFile)predecessor, null);
}
} else if (remote instanceof ICVSRemoteFile) {
try {
ICVSRemoteFile predecessor = getImmediatePredecessor(remote);
builder.addToTrees(predecessor, (ICVSRemoteFile)remote);
} catch (TeamException e) {
handle(e);
return false;
}
}
}
return true;
}
};
}
private ICVSRemoteFile getImmediatePredecessor(IResourceVariant remote) throws TeamException {
CVSChangeSetCollector changeSetCollector = getChangeSetCollector();
if (changeSetCollector != null) {
return changeSetCollector.getImmediatePredecessor((ICVSRemoteFile)remote);
}
return null;
}
private CVSChangeSetCollector getChangeSetCollector() {
return (CVSChangeSetCollector)getConfiguration().getProperty(CVSChangeSetCollector.CVS_CHECKED_IN_COLLECTOR);
}
}