ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 【原创】开发编辑器插件(十七)

【原创】开发编辑器插件(十七)

原创 Linux操作系统 作者:阿-甘 时间:2008-07-07 10:54:53 0 删除 编辑


编辑器是工作台页面内的可视组件,它通常用来编辑或浏览文档或输入对象。要打开编辑器,用户通常将对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

point="org.eclipse.ui.editors">
class="com.free.editor.fileeditor.FileEditor"
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”以及编辑器的大纲、属性视图等,如果时间允许,笔者将会在后面的篇幅进行介绍。


>下载(com.free.editor.fileeditor.rar)

image002.jpg

image004.jpg

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/13081368/viewspace-374294/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: com.free.view.treeview
请登录后发表评论 登录
全部评论

注册时间:2008-02-14

  • 博文量
    49
  • 访问量
    246602