// ============================================================================
//
// Copyright (C) 2006-2016 Talend Inc. - www.talend.com
//
// This source code is available under agreement available at
// %InstallDIR%\features\org.talend.rcp.branding.%PRODUCTNAME%\%PRODUCTNAME%license.txt
//
// You should have received a copy of the agreement
// along with this program; if not, write to Talend SA
// 9 rue Pages 92150 Suresnes, France
//
// ============================================================================
package com.amalto.workbench.compare;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.lang.reflect.InvocationTargetException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.eclipse.compare.BufferedContent;
import org.eclipse.compare.CompareConfiguration;
import org.eclipse.compare.CompareEditorInput;
import org.eclipse.compare.CompareUI;
import org.eclipse.compare.IModificationDate;
import org.eclipse.compare.IStreamContentAccessor;
import org.eclipse.compare.ITypedElement;
import org.eclipse.compare.structuremergeviewer.DiffNode;
import org.eclipse.compare.structuremergeviewer.Differencer;
import org.eclipse.compare.structuremergeviewer.IDiffContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.graphics.Image;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.IWorkbenchWindowActionDelegate;
/**
* just for test
*
* @author achen
*
*/
public class CompareEditorAction implements IWorkbenchWindowActionDelegate {
private static Log log = LogFactory.getLog(CompareEditorAction.class);
CompareConfiguration cc = new CompareConfiguration();
public void run(IAction action) {
cc.setLeftEditable(true);
cc.setRightEditable(false);
// cc.setAncestorLabel("ancestor");
IProject prj = CompareManager.getInstance().createProject("test1111");//$NON-NLS-1$
IFile leftF = prj.getFile("left");//$NON-NLS-1$
IFile rightF = prj.getFile("right");//$NON-NLS-1$
String left = "aaaaaaaaa\n\nee";//$NON-NLS-1$
String right = ";dfeadf\n";//$NON-NLS-1$
try {
leftF.create(new ByteArrayInputStream(left.getBytes()), IFile.FORCE, null);
rightF.create(new ByteArrayInputStream(right.getBytes()), IFile.FORCE, null);
} catch (CoreException e) {
log.error(e.getMessage(), e);
}
ResourceCompareInput input = new ResourceCompareInput(cc);
StructuredSelection sel = new StructuredSelection(new IFile[] { leftF, rightF });
input.setSelection(sel, null);
CompareUI.openCompareEditor(input);
// CompareUI.openCompareEditor(new MyCompareInput(cc));
}
class CompareInput extends CompareEditorInput {
public CompareInput() {
super(cc);
}
protected Object prepareInput(IProgressMonitor pm) {
CompareItem ancestor = new CompareItem("Common", "contents");//$NON-NLS-1$//$NON-NLS-2$
CompareItem left = new CompareItem("Left", "new contents\nadd\n\ndddddd");//$NON-NLS-1$//$NON-NLS-2$
CompareItem right = new CompareItem("Right", "old contents");//$NON-NLS-1$//$NON-NLS-2$
return new DiffNode(null, Differencer.CONFLICTING, ancestor, left, right);
}
@Override
public void saveChanges(IProgressMonitor monitor) throws CoreException {
super.saveChanges(monitor);
}
@Override
public boolean isSaveNeeded() {
return true;
}
}
class CompareItem implements IStreamContentAccessor, ITypedElement, IModificationDate {
private String contents, name;
private long time;
CompareItem(String name, String contents, long time) {
this.name = name;
this.contents = contents;
this.time = time;
}
CompareItem(String name, String contents) {
this(name, contents, System.currentTimeMillis());
}
public InputStream getContents() throws CoreException {
return new ByteArrayInputStream(contents.getBytes());
}
public Image getImage() {
return null;
}
public long getModificationDate() {
return time;
}
public String getName() {
return name;
}
public String getString() {
return contents;
}
public String getType() {
return ITypedElement.TEXT_TYPE;
}
}
public void dispose() {
}
public void init(IWorkbenchWindow window) {
}
public void selectionChanged(IAction action, ISelection selection) {
}
class MyCompareInput extends CompareEditorInput {
public MyCompareInput(CompareConfiguration configuration) {
super(configuration);
// TODO Auto-generated constructor stub
}
@Override
protected Object prepareInput(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
Differencer d = new Differencer() {
protected Object visit(Object parent, int description, Object ancestor, Object left, Object right) {
return new MyDiffNode((IDiffContainer) parent, description, (ITypedElement) ancestor, (ITypedElement) left,
(ITypedElement) right);
}
};
MyCompareNode ancester = new MyCompareNode("aaaaaaaaa");//$NON-NLS-1$
MyCompareNode left = new MyCompareNode("aaaaaaaaa");//$NON-NLS-1$
MyCompareNode right = new MyCompareNode("aaaaaaaaa\nnd\neefaa");//$NON-NLS-1$
return d.findDifferences(true, null, null, ancester, left, right);
}
@Override
public void saveChanges(IProgressMonitor monitor) throws CoreException {
super.saveChanges(monitor);
}
@Override
public boolean isDirty() {
return super.isDirty();
}
class MyDiffNode extends DiffNode {
private boolean fDirty = false;
private ITypedElement fLastId;
private String fLastName;
public MyDiffNode(IDiffContainer parent, int description, ITypedElement ancestor, ITypedElement left,
ITypedElement right) {
super(parent, description, ancestor, left, right);
}
public void fireChange() {
super.fireChange();
setDirty(true);
fDirty = true;
}
void clearDirty() {
fDirty = false;
}
public String getName() {
if (fLastName == null)
fLastName = super.getName();
if (fDirty)
return '<' + fLastName + '>';
return fLastName;
}
public ITypedElement getId() {
ITypedElement id = super.getId();
if (id == null)
return fLastId;
fLastId = id;
return id;
}
}
class MyCompareNode extends BufferedContent implements ITypedElement {
private String fResource;
MyCompareNode(String resource) {
fResource = resource;
}
protected InputStream createStream() throws CoreException {
InputStream is = null;
is = new ByteArrayInputStream(fResource.getBytes());
return is;
}
public Image getImage() {
return null;
}
public String getName() {
return null;
}
public String getType() {
return ITypedElement.TEXT_TYPE;
}
}
}
}