/*******************************************************************************
* Copyright (c) 2012, 2013 Tasktop Technologies and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Tasktop Technologies - initial API and implementation
* Sebastien Dubois (Ericsson) - Improvements for bug 400266
*******************************************************************************/
package org.eclipse.mylyn.internal.reviews.ui.compare;
import java.io.InputStream;
import org.eclipse.compare.ICompareInputLabelProvider;
import org.eclipse.compare.ITypedElement;
import org.eclipse.compare.structuremergeviewer.DiffNode;
import org.eclipse.compare.structuremergeviewer.Differencer;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.mylyn.commons.workbench.CommonImageManger;
import org.eclipse.mylyn.internal.reviews.ui.providers.FileItemNodeLabelProvider;
import org.eclipse.mylyn.reviews.core.model.IFileItem;
import org.eclipse.mylyn.reviews.core.model.IFileVersion;
import org.eclipse.mylyn.reviews.ui.ReviewBehavior;
import org.eclipse.swt.graphics.Image;
/**
* @author Steffen Pingel
* @author Sebastien Dubois
*/
public class FileItemNode extends DiffNode {
private final IFileItem fileItem;
private IPath path;
private String name;
private ICompareInputLabelProvider labelProvider;
public FileItemNode(ReviewBehavior behavior, IFileItem fileItem, IProgressMonitor monitor) {
super(Differencer.NO_CHANGE);
this.fileItem = fileItem;
String targetPath = fileItem.getTarget().getPath();
int kind = Differencer.CHANGE;
if (targetPath == null) {
targetPath = fileItem.getBase().getPath();
kind = Differencer.ADDITION;
}
String basePath = fileItem.getBase().getPath();
if (basePath == null) {
basePath = targetPath;
kind = Differencer.DELETION;
}
if (targetPath.equals("/COMMIT_MSG")) { //$NON-NLS-1$
kind = Differencer.NO_CHANGE;
}
setLeft(getElement(behavior, fileItem.getBase(), basePath, monitor));
setRight(getElement(behavior, fileItem.getTarget(), targetPath, monitor));
labelProvider = new FileItemNodeLabelProvider();
setKind(kind);
IPath path = Path.fromPortableString(targetPath);
setPath(path);
this.name = path.lastSegment();
}
//Check if we can match the reviewed file with the workspace history contents
private ITypedElement getElement(ReviewBehavior behavior, IFileVersion reviewFileVersion, String path,
IProgressMonitor monitor) {
org.eclipse.team.core.history.IFileRevision repoFileRevision = behavior.getFileRevision(reviewFileVersion);
if (repoFileRevision != null) {
InputStream repoFileContents = null;
try {
repoFileContents = repoFileRevision.getStorage(monitor).getContents();
if (repoFileContents != null) {
//First option: The file under review is in sync with a version in history for a workspace file,
//open the file Revision. Best effort navigability.
return new FileRevisionTypedElement(repoFileRevision, monitor);
}
} catch (CoreException e) {
// This can be safely ignored. We will use the fallback option below
}
}
//Fallback option: No match i.e the repository is not in workspace or does not contain this version of the file. No navigability.
return new ByteArrayInput(CompareUtil.getContent(reviewFileVersion), path);
}
public FileItemNode(String name) {
super(Differencer.NO_CHANGE);
this.name = name;
this.fileItem = null;
}
public IFileItem getFileItem() {
return fileItem;
}
private static CommonImageManger imageManger;
@Override
public Image getImage() {
if (imageManger == null) {
imageManger = new CommonImageManger();
}
return (fileItem != null) ? imageManger.getFileImage(getName()) : imageManger.getFolderImage();
}
@Override
public String getName() {
return name;
}
public IPath getPath() {
return path;
}
@Override
public String getType() {
return (fileItem != null) ? super.getType() : FOLDER_TYPE;
}
public void setPath(IPath path) {
this.path = path;
}
public void setName(String name) {
this.name = name;
}
public ICompareInputLabelProvider getLabelProvider() {
return labelProvider;
}
}