blob: 72f6053cd37f81e8cc15926d883e44a597abe993 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006, 2017 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.ui.history;
import java.lang.reflect.InvocationTargetException;
import org.eclipse.compare.CompareConfiguration;
import org.eclipse.compare.IEditableContent;
import org.eclipse.compare.ITypedElement;
import org.eclipse.compare.structuremergeviewer.Differencer;
import org.eclipse.compare.structuremergeviewer.ICompareInput;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFileState;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IStorage;
import org.eclipse.core.runtime.Adapters;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.osgi.util.NLS;
import org.eclipse.osgi.util.TextProcessor;
import org.eclipse.team.internal.core.history.LocalFileRevision;
import org.eclipse.team.internal.ui.TeamUIMessages;
import org.eclipse.team.internal.ui.TeamUIPlugin;
import org.eclipse.team.internal.ui.Utils;
import org.eclipse.team.internal.ui.mapping.AbstractCompareInput;
import org.eclipse.team.internal.ui.mapping.CompareInputChangeNotifier;
import org.eclipse.team.internal.ui.synchronize.LocalResourceTypedElement;
import org.eclipse.team.ui.synchronize.SaveableCompareEditorInput;
import org.eclipse.ui.IWorkbenchPage;
public class CompareFileRevisionEditorInput extends SaveableCompareEditorInput {
private ITypedElement left;
private ITypedElement right;
CompareInputChangeNotifier notifier = new CompareInputChangeNotifier() {
@Override
protected IResource[] getResources(ICompareInput input) {
IResource resource = getResource(input);
if (resource == null)
return new IResource[0];
return new IResource[] { resource };
}
};
/*
* Returns <code>true</code> if the other object is of type
* <code>CompareFileRevisionEditorInput</code> and both of their
* corresponding left and right objects are identical. The content is not
* considered.
*/
@Override
public boolean equals(Object obj) {
if (obj == this)
return true;
if (obj instanceof CompareFileRevisionEditorInput) {
CompareFileRevisionEditorInput other = (CompareFileRevisionEditorInput) obj;
return other.getLeft().equals(left)
&& other.getRightRevision().equals(right);
}
return false;
}
public class MyDiffNode extends AbstractCompareInput {
public MyDiffNode(ITypedElement left, ITypedElement right) {
super(Differencer.CHANGE, null, left, right);
}
@Override
public void fireChange() {
super.fireChange();
}
@Override
protected CompareInputChangeNotifier getChangeNotifier() {
return notifier;
}
@Override
public boolean needsUpdate() {
// The remote never changes
return false;
}
@Override
public void update() {
fireChange();
}
}
/**
* Creates a new CompareFileRevisionEditorInput.
* @param left
* @param right
* @param page
*/
public CompareFileRevisionEditorInput(ITypedElement left, ITypedElement right, IWorkbenchPage page) {
super(new CompareConfiguration(), page);
this.left = left;
this.right = right;
setTitle(NLS.bind(TeamUIMessages.SyncInfoCompareInput_title, new String[] { left.getName() }));
}
@Override
protected ICompareInput prepareCompareInput(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
ICompareInput input = createCompareInput();
getCompareConfiguration().setLeftEditable(isLeftEditable(input));
getCompareConfiguration().setRightEditable(false);
ensureContentsCached(getLeftRevision(), getRightRevision(), monitor);
initLabels(input);
return input;
}
protected FileRevisionTypedElement getRightRevision() {
if (right instanceof FileRevisionTypedElement) {
return (FileRevisionTypedElement) right;
}
return null;
}
protected FileRevisionTypedElement getLeftRevision() {
if (left instanceof FileRevisionTypedElement) {
return (FileRevisionTypedElement) left;
}
return null;
}
private static void ensureContentsCached(FileRevisionTypedElement left, FileRevisionTypedElement right,
IProgressMonitor monitor) {
if (left != null) {
try {
left.cacheContents(monitor);
} catch (CoreException e) {
TeamUIPlugin.log(e);
}
}
if (right != null) {
try {
right.cacheContents(monitor);
} catch (CoreException e) {
TeamUIPlugin.log(e);
}
}
}
private boolean isLeftEditable(ICompareInput input) {
Object left = input.getLeft();
if (left instanceof IEditableContent) {
return ((IEditableContent) left).isEditable();
}
return false;
}
private IResource getResource(ICompareInput input) {
LocalResourceTypedElement localElement = getLocalElement();
if (localElement != null) {
return localElement.getResource();
}
return null;
}
private ICompareInput createCompareInput() {
MyDiffNode input = new MyDiffNode(left,right);
return input;
}
private void initLabels(ICompareInput input) {
CompareConfiguration cc = getCompareConfiguration();
if (getLeftRevision() != null) {
String leftLabel = getFileRevisionLabel(getLeftRevision());
cc.setLeftLabel(leftLabel);
} else if (left instanceof LocalResourceTypedElement) {
String name= TextProcessor.process(input.getLeft().getName());
String leftLabel= getLocalResourceRevisionLabel((LocalResourceTypedElement)left, name);
cc.setLeftLabel(leftLabel);
} else if (getResource(input) != null) {
String leftLabel= NLS.bind(TeamUIMessages.CompareFileRevisionEditorInput_workspace, new Object[] { TextProcessor.process(input.getLeft().getName()) });
cc.setLeftLabel(leftLabel);
}
if (getRightRevision() != null) {
String rightLabel = getFileRevisionLabel(getRightRevision());
cc.setRightLabel(rightLabel);
}
}
private String getLocalResourceRevisionLabel(LocalResourceTypedElement localElement, String name) {
if (Utils.isShowAuthor()) {
String author= localElement.getAuthor();
if (author == null) {
try {
localElement.fetchAuthor(null);
} catch (CoreException e) {
TeamUIPlugin.log(e);
}
author= localElement.getAuthor();
}
if (author != null)
return NLS.bind(TeamUIMessages.CompareFileRevisionEditorInput_workspace_authorExists, new Object[] { name, author });
}
return NLS.bind(TeamUIMessages.CompareFileRevisionEditorInput_workspace, new Object[] { name });
}
private String getFileRevisionLabel(FileRevisionTypedElement element) {
Object fileObject = element.getFileRevision();
if (fileObject instanceof LocalFileRevision){
IFileState state = ((LocalFileRevision) fileObject).getState();
if (state != null) {
return NLS.bind(TeamUIMessages.CompareFileRevisionEditorInput_localRevision, new Object[]{TextProcessor.process(element.getName()), element.getTimestamp()});
}
} else {
if (Utils.isShowAuthor())
return NLS.bind(TeamUIMessages.CompareFileRevisionEditorInput_repository, new Object[] { element.getName(), element.getContentIdentifier(), element.getAuthor() });
else
return NLS.bind(TeamUIMessages.CompareFileRevisionEditorInput_repositoryWithoutAuthor, new Object[] { element.getName(), element.getContentIdentifier() });
}
return ""; //$NON-NLS-1$
}
@Override
public String getToolTipText() {
Object[] titleObject = new Object[3];
titleObject[0] = getLongName(left);
titleObject[1] = getContentIdentifier(getLeftRevision());
titleObject[2] = getContentIdentifier(getRightRevision());
return NLS.bind(TeamUIMessages.CompareFileRevisionEditorInput_compareResourceAndVersions, titleObject);
}
@Override
public String getTitle() {
Object[] titleObject = new Object[3];
titleObject[0] = getShortName(left);
titleObject[1] = getContentIdentifier(getLeftRevision());
titleObject[2] = getContentIdentifier(getRightRevision());
return NLS.bind(TeamUIMessages.CompareFileRevisionEditorInput_compareResourceAndVersions, titleObject);
}
@SuppressWarnings("unchecked")
@Override
public <T> T getAdapter(Class<T> adapter) {
if (adapter == IFile.class || adapter == IResource.class) {
if (getLocalElement() != null) {
return (T) getLocalElement().getResource();
}
return null;
}
return super.getAdapter(adapter);
}
private String getShortName(ITypedElement element) {
if (element instanceof FileRevisionTypedElement){
FileRevisionTypedElement fileRevisionElement = (FileRevisionTypedElement) element;
return fileRevisionElement.getName();
}
else if (element instanceof LocalResourceTypedElement){
LocalResourceTypedElement typedContent = (LocalResourceTypedElement) element;
return typedContent.getResource().getName();
}
return element.getName();
}
private String getLongName(ITypedElement element) {
if (element instanceof FileRevisionTypedElement){
FileRevisionTypedElement fileRevisionElement = (FileRevisionTypedElement) element;
return fileRevisionElement.getPath();
}
else if (element instanceof LocalResourceTypedElement){
LocalResourceTypedElement typedContent = (LocalResourceTypedElement) element;
return typedContent.getResource().getFullPath().toString();
}
return element.getName();
}
private String getContentIdentifier(ITypedElement element){
if (element instanceof FileRevisionTypedElement){
FileRevisionTypedElement fileRevisionElement = (FileRevisionTypedElement) element;
Object fileObject = fileRevisionElement.getFileRevision();
if (fileObject instanceof LocalFileRevision){
try {
IStorage storage = ((LocalFileRevision) fileObject).getStorage(new NullProgressMonitor());
if (Adapters.adapt(storage, IFileState.class) != null){
//local revision
return TeamUIMessages.CompareFileRevisionEditorInput_0;
} else if (Adapters.adapt(storage, IFile.class) != null) {
//current revision
return TeamUIMessages.CompareFileRevisionEditorInput_1;
}
} catch (CoreException e) {
}
} else {
return fileRevisionElement.getContentIdentifier();
}
}
return TeamUIMessages.CompareFileRevisionEditorInput_2;
}
@Override
protected void fireInputChange() {
((MyDiffNode)getCompareResult()).fireChange();
}
@Override
protected void contentsCreated() {
super.contentsCreated();
notifier.initialize();
}
@Override
protected void handleDispose() {
super.handleDispose();
notifier.dispose();
if (getLocalElement() != null) {
getLocalElement().discardBuffer();
}
}
public LocalResourceTypedElement getLocalElement() {
if (left instanceof LocalResourceTypedElement) {
return (LocalResourceTypedElement) left;
}
return null;
}
public ITypedElement getLeft() {
return left;
}
}