首页 > Linux操作系统 > Linux操作系统 > 【原创】开发编辑器插件(十七)
编辑器是工作台页面内的可视组件,它通常用来编辑或浏览文档或输入对象。要打开编辑器,用户通常将对IFile调用“打开”。当执行此操作时,将查阅工作台注册表以便为文件类型确定适当的编辑器,然后创建编辑器类型的新实例,实际结果取决于编辑器的类型。
工作台能够创建内部编辑器(它已紧密集成到工作台中)和外部编辑器(它是在单独的框架窗口中启动的)。这些编辑器之间还具有各种级别的集成。用户可以扩展“org.eclipse.ui. editors”扩展点实现自己的编辑器。
编辑器分类
Eclipse中同一时间只有一个编辑器可见(视图可以有多个),但能打开同一编辑器的多个实例(视图只有一个实例)。编辑器一般来说有两种类型。
文本编辑器:文本编辑器负责对文本的编辑,通常所见的Java文件编辑器就是文本编辑器。
图形编辑器:图形编辑器负责对图形的编辑,例如GEF实现的图形编辑器(后面章节会介绍GEF实现的图形编辑器)。
常用编辑器可实现的功能
常用编辑器具有的功能如下。
打开文件
保存文件
编辑文件
撤销、重做
另外,编辑器还能够根据文件的内容初始化编辑区域的显示,例如插件的清单文件是一个文本文件,编辑器会根据文件的内容决定显示的方式。
编辑器和视图的区别
编辑器和视图都是工作台页面中显示的可视化组件,两者间区别如下。
保存:在视图中所做的修改将被立即反映到工作区,而编辑器则有一个“打开-修改-保存”的生命周期。也就是说,只有当用户明确执行保存操作时,在编辑器中所做的修改才会被保存。
输入:编辑器是由用户选中特定元素后打开的,这个元素就成为了编辑器的输入(每个输入不同,所以编辑器编辑的内容就不同)。视图没有预定的输入,每个视图各自决定到哪里去获得自己的输入数据。
用户界面:视图有自己的本地工具栏,编辑器则只有全局的工具栏。编辑器只能在工作台的“主编辑器”区域出现,视图则可以在工作台中任意摆放,唯一的限制是不能放在编辑器的前面或者后面。
实例数量:在一个工作台页面中,一个特定类型的视图最多只会出现一次。而同一类型的编辑器可以在同一个工作台页面中打开多次,各个编辑器实例对应不同的输入。
自定义文本编辑器
创建文本编辑器插件步骤如下。
1. 创建一个空插件项目。
2. 添加编辑器要实现的扩展点“org.eclipse.ui.editors”,如图1所示。
图1 文件编辑器插件扩展点
文本编辑器插件实现了扩展点“org.eclipse.ui.editors”。插件plugin.xml文件如例程1所示。
例程1 plugin.xml
default="false"
extensions="gan"
icon="icons/sample.gif"
id="com.free.editor.fileeditor"
name="filee ditor"/>
“plugin.xml”实现了“org.eclipse.ui.editors”扩展点,实现类为“com.free.editor.fileeditor.FileEditor”。
实现类“FileEditor”
FileEditor负责初始化编辑器,根据文件的内容决定编辑器的显示方式。FileEditor通过重载setInput(IEditorInput input)方法获得输入信息,通过doSave(IProgressMonitor monitor)方法保存编辑器中的内容,代码如例程2所示。
例程2 FileEditor.java
public class FileEditor extends EditorPart {
StyledText text = null;
private String contentString = "";
private boolean myDirty = false;
public FileEditor() {
super();
}
//保存编辑器内容
public void doSave(IProgressMonitor monitor) {
try {
IFile file = ((IFileEditorInput) getEditorInput()).getFile();
ByteArrayInputStream bi = new ByteArrayInputStream(text.getText()
.getBytes());
file.setContents(bi, true, false, monitor);
myDirty = false;
} catch (Exception e) {
e.printStackTrace();
}
}
public void doSaveAs() {
}
//初始化编辑器
public void init(IEditorSite site, IEditorInput input) throws PartInitException {
setSite(site);
setInput(input);
setPartName("text editor");
}
//取得文件输入的信息
public void setInput(IEditorInput input) {
super.setInput(input);
IFile file = ((IFileEditorInput) input).getFile();
try {
InputStream is = file.getContents(false);
byte[] inputByte = new byte[is.available()];
is.read(inputByte);
contentString = new String(inputByte);
} catch (Exception e) {
e.printStackTrace();
}
}
//编辑器中内容是否被修改过
public boolean isDirty() {
return myDirty;
}
public boolean isSaveAsAllowed() {
return false;
}
//构建编辑器的组件
public void createPartControl(Composite parent) {
text = new StyledText(parent, SWT.LEFT);
text.setText(contentString);
text.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
myDirty = true;
}
});
}
public void setFocus() {
}
}
FileEditor实现的功能非常简单,但作为自定义编辑器的实例已经足够了。通过FileEditor能处理磁盘文件的输入,并显示信息,还能够保存编辑的内容到文件中。
运行文本编辑器
文本编辑器功能非常简单,主要目的是让读者了解如何获得编辑器的输入数据,读者也可以对数据进行解析构建自己的编辑器。文本编辑器运行效果如图2所示。
图2 文本编辑器
FileEditor类处理的是文本信息,如果把读写文本信息改成读写XML文件,编辑器就能够处理XML文件了。
当然,编辑器要想开发出复杂的编辑器,用户还得具备其它的一些技术,例如编辑器的输入“EditorInput”以及编辑器的大纲、属性视图等,如果时间允许,笔者将会在后面的篇幅进行介绍。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/13081368/viewspace-374294/ ,如需转载,请注明出处,否则将追究法律责任。