您的位置:首页 > 编程语言 > Java开发

Eclipse rcp 实现文本内容对比功能

2014-06-19 13:53 232 查看


一 相关知识

org.eclipse.compare 插件项目,用于进行文本、源码比对的一个插件,提供了一个Editor或Dialog可方便调用。

org.eclipse.compare.CompareEditorInput.CompareEditorInput 是用于给Compare Editor 的EditorInput, 需要自己实现。

org.eclipse.compare.CompareConfiguration 对CompareEditor的配置。是否允许左边内容被修改,或是否允许右边内容被修改;左右两边的label,image等。

org.eclipse.compare.ITypedElement 接口,本意为指代有图片、名称、类型的元素。而在Compare中,为一个基本的对比单元。

org.eclipse.compare.IEditableContent 接口,是否可编辑的元素

org.eclipse.compare.IModificationDate 接口,修改时间

org.eclipse.compare.IStreamContentAccessor 获得内容的接口,内容是以InputStream流的方式获得。

org.eclipse.compare.IContentChangeNotifier 内容变化的通知接口

org.eclipse.compare.BufferedContent 抽象类,实现了 org.eclipse.compare.IStreamContentAccessor org.eclipse.compare.IContentChangeNotifier 2个接口

在BufferedContent中持有了一个byte[], 表示缓存有界面上修改的内容,当然,最后需要你在CompareEditorInupt中将修改后的byte[]内容保存(比如保存至文件等)

二 代码

(1)解决项目依赖

创建简单的项目, 添加对org.eclipse.compare 的依赖

(2)定义一个表示比对的元素

可继承与BufferedContent,并实现ITypeElement 等接口。主要代码如下:

Java代码



class CompareItem extends BufferedContent implements ITypedElement, IModificationDate, IEditableContent {

private String fileName;

private long time;

CompareItem(String fileName) {

this.fileName = fileName;

this.time = System.currentTimeMillis();

}

/**

* @see org.eclipse.compare.BufferedContent#createStream()

*/

protected InputStream createStream() throws CoreException {

try {

return new FileInputStream(new File(fileName));

} catch (FileNotFoundException e) {

e.printStackTrace();

}

return new ByteArrayInputStream(new byte[0]);

}

/**

* @see org.eclipse.compare.IModificationDate#getModificationDate()

*/

public long getModificationDate() {

return time;

}

/**

* @see org.eclipse.compare.ITypedElement#getImage()

*/

public Image getImage() {

return CompareUI.DESC_CTOOL_NEXT.createImage();

}

/**

* @see org.eclipse.compare.ITypedElement#getName()

*/

public String getName() {

return fileName;

}

/**

* @see org.eclipse.compare.ITypedElement#getType()

*/

public String getType() {

return ITypedElement.TEXT_TYPE;

}

/**

* @see org.eclipse.compare.IEditableContent#isEditable()

*/

public boolean isEditable() {

return true;

}

/**

* @see org.eclipse.compare.IEditableContent#replace(org.eclipse.compare.ITypedElement, org.eclipse.compare.ITypedElement)

*/

public ITypedElement replace(ITypedElement dest, ITypedElement src) {

return null;

}

public void writeFile() {

this.writeFile(this.fileName, this.getContent());

}

private void writeFile(String fileName, byte[] newContent) {

FileOutputStream fos = null;

try {

File file = new File(fileName);

if (file.exists()) {

file.delete();

}

file.createNewFile();

fos = new FileOutputStream(file);

fos.write(newContent);

fos.flush();

} catch (IOException e) {

e.printStackTrace();

} finally {

try {

fos.close();

} catch (IOException e) {

e.printStackTrace();

}

fos = null;

}

}

}

(3)配置CompareConfiguration

Java代码



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");

(4)定义CompareEditorInput

Java代码



CompareEditorInput editorInput = new CompareEditorInput(config) {

CompareItem left = new CompareItem("C:/A.txt");

CompareItem right = new CompareItem("C:/Inject.log"); //要比较的两个文件也可做成自己选取比较文件

@Override

protected Object prepareInput(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {

return new DiffNode(null, Differencer.CONFLICTING, null, left, right);

}

@Override

public void saveChanges(IProgressMonitor pm) throws CoreException {

super.saveChanges(pm);

left.writeFile();

right.writeFile();

}

};

editorInput.setTitle("文件比较");

(5)弹出Compare Editor或Dialog

Java代码



CompareUI.openCompareEditor(editorInput); // 打开对比Editor

CompareUI.openCompareDialog(editorInput); // 弹出对比Dialog

三 效果

选取不要比较的文件路径



(1)Editor效果



(2)Dialog效果



下载:http://download.csdn.net/detail/luoww1/7521193 可运行的elipse rcp 工程
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: