只需要依赖插件:org.eclipse.compare;bundle-version="3.5.200"
例子,建一个RCP邮件那个demo,用下面的代码替换掉MessagePopupAction类
参考http://www.ibm.com/developerworks/cn/opensource/os-cn-ecl-compare/
package wwww;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.InvocationTargetException;
import org.eclipse.compare.BufferedContent;
import org.eclipse.compare.CompareConfiguration;
import org.eclipse.compare.CompareEditorInput;
import org.eclipse.compare.CompareUI;
import org.eclipse.compare.IEditableContent;
import org.eclipse.compare.IModificationDate;
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.IProgressMonitor;
import org.eclipse.jface.action.Action;
import org.eclipse.swt.graphics.Image;
import org.eclipse.ui.IWorkbenchWindow;
public class MessagePopupAction extends Action {
private final IWorkbenchWindow window;
MessagePopupAction(final String text, final IWorkbenchWindow window) {
super(text);
this.window = window;
// The id is used to refer to the action in a menu or toolbar
setId(ICommandIds.CMD_OPEN_MESSAGE);
// Associate the action with a pre-defined command, to allow key bindings.
setActionDefinitionId(ICommandIds.CMD_OPEN_MESSAGE);
setImageDescriptor(Activator.getImageDescriptor("/icons/sample3.gif"));
}
@Override
public void run() {
final CompareConfiguration config = new CompareConfiguration();
config.setProperty(CompareConfiguration.SHOW_PSEUDO_CONFLICTS, Boolean.FALSE);
// left
config.setLeftEditable(true);
config.setLeftLabel("Left");
// right
config.setRightEditable(true);
config.setRightLabel("Right");
final CompareEditorInput editorInput = new CompareEditorInput(config) {
CompareItem left = new CompareItem("C:/A.txt");
CompareItem right = new CompareItem("C:/Inject.log");
@Override
protected Object prepareInput(final IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
return new DiffNode(null, Differencer.CONFLICTING, null, left, right);
}
@Override
public void saveChanges(final IProgressMonitor pm) throws CoreException {
super.saveChanges(pm);
left.writeFile();
right.writeFile();
}
};
editorInput.setTitle("文件比较");
// CompareUI.openCompareEditor(editorInput);
CompareUI.openCompareDialog(editorInput);
}
class CompareItem extends BufferedContent implements ITypedElement, IModificationDate, IEditableContent {
private final String fileName;
private final long time;
CompareItem(final String fileName) {
this.fileName = fileName;
time = System.currentTimeMillis();
}
/**
* @see org.eclipse.compare.BufferedContent#createStream()
*/
@Override
protected InputStream createStream() throws CoreException {
try {
return new FileInputStream(new File(fileName));
} catch (final FileNotFoundException e) {
e.printStackTrace();
}
return new ByteArrayInputStream(new byte[0]);
}
/**
* @see org.eclipse.compare.IModificationDate#getModificationDate()
*/
@Override
public long getModificationDate() {
return time;
}
/**
* @see org.eclipse.compare.ITypedElement#getImage()
*/
@Override
public Image getImage() {
return CompareUI.DESC_CTOOL_NEXT.createImage();
}
/**
* @see org.eclipse.compare.ITypedElement#getName()
*/
@Override
public String getName() {
return fileName;
}
/**
* @see org.eclipse.compare.ITypedElement#getType()
*/
@Override
public String getType() {
return ITypedElement.TEXT_TYPE;
}
/**
* @see org.eclipse.compare.IEditableContent#isEditable()
*/
@Override
public boolean isEditable() {
return true;
}
/**
* @see org.eclipse.compare.IEditableContent#replace(org.eclipse.compare.ITypedElement, org.eclipse.compare.ITypedElement)
*/
@Override
public ITypedElement replace(final ITypedElement dest, final ITypedElement src) {
return null;
}
public void writeFile() {
this.writeFile(fileName, getContent());
}
private void writeFile(final String fileName, final byte[] newContent) {
FileOutputStream fos = null;
try {
final File file = new File(fileName);
if (file.exists()) {
file.delete();
}
file.createNewFile();
fos = new FileOutputStream(file);
fos.write(newContent);
fos.flush();
} catch (final IOException e) {
e.printStackTrace();
} finally {
try {
fos.close();
} catch (final IOException e) {
e.printStackTrace();
}
fos = null;
}
}
}
}
。