上面有讲ChinaEditor类继承EditorPart抽象类时,只实现了init,createPartControl两个方法,本节将逐步讲解其他的5个方法的用法.
EditorPart方法的执行情况.
要使用好EditorPart,首先得了解其方法在各种情况下的执行流程,在类的每一个方法中加上一个打印语句.运行后看打印输出,就可以得到如下方法执行流程.
(1)双击列表项打开编辑器时
init--->isDirty--->createPartContorl--->isDirty--->isDirty--->isDirty--->isDirty--->isDirty--->setFocus--->isDirty--->isSaveAsAllowed.
(2)关闭编辑器时,setFocus--->isDirty--->isSaveAsAllowed--->isDirty--->isSaveAsAllowed--->setFocus--->isDirty如果保存保存编辑器,则最后还会执行doSave()方法.
(3)单击编辑器标题时:setFocus
(4)编辑器失去焦点时:isDirty--->isSavedAsAllowed--->isDirty----->isSaveASAllowed.
(5)编辑器得到焦点时:setFocus---->isDirty---->isSaveAsAllowed---->isDirty----->isSaveAsAllowed.
(6)当编辑器可以保存,选择主菜单"文件--->保存"或按Ctrl+S快捷键时:isDirty--->doSave.
各个方法的作用以及含义:
1.boolean isDirty()
由此方法获知编辑器是否脏了(所谓"脏"是指编辑器中的值已经发生了改变),true表示脏了,当其返回true时,会出现两个效果:编辑器的标题出现一个"*"号,主菜单"文件"下的"保存"项可用.
特别要注意的是:编辑器不会自己判断自己是否脏了,这需要在程序中用语句手动设置,例如:在编辑器的文本框加入一个键盘监听事件,当在文本框中输入字符时,则将isDirty方法返回值设置为true(脏).
在方法执行的过程中,可以看到此方法的执行是最频繁的,所以不要在此方法中加入太耗时的执行语句.否则会影响程序执行速度.
2.void doSave()
在这个方法中编写保存编辑器的代码,当选择主菜单"文件---->保存"时也会执行此方法.但因在isDirty返回true时,"保存"菜单和Ctrl+S快捷键才能用,也即isDirty方法控制着doSave方法的执行.
当保存成功时,要注意将脏的状态设置回false,并调用firePropertyChange方法将编辑器的界面状态更新(编辑器标题前的"*"号以及"保存"菜单).
3.boolean isSaveAsAllowed()
是否允许编辑器使用"另存为"功能,如果此返回false,则不能使用"另存为"功能,而且主菜单"文件"下的"另存为"项被置灰.
4.void doSaveAs()
和doSave的作用相似,在这里书写"另存为"功能的处理代码.
5.void setFocus()
当编辑器获得焦点时执行该方法.
一个编辑器实例
在本例子中,当修改ChinaEditor编辑器中文本框的文字时候,编辑器标题前出现"*"而且主菜单"文件---->保存"可用,当编辑器保存后,"*"消失并且"保存"菜单不可用,当编辑器为脏时,关闭编辑器会弹出一个提示保存的对话框.
ChinaEditor.java(前面的我贴的代码就是全部的,这里再贴 一遍)
1 public class ChinaEditor extends EditorPart { 2 private boolean dirty = true; // 编辑器是否为脏的标识 3 4 // Editor的初始化方法。本方法前两句是固定不变的 5 public void init(IEditorSite site, IEditorInput input) throws PartInitException { 6 System.out.println("init"); 7 setSite(site); 8 setInput(input); 9 // 下一句设置Editor标题栏的显示名称,否则名称用plugin.xml中的name属性 10 // setPartName(input.getName()); 11 // 下一句设置Editor标题栏的图标,否则会自动使用一个默认的图标 12 // setTitleImage(input.getImageDescriptor().createImage()); 13 } 14 15 // 在此方法中创建Editor中的界面组件 16 public void createPartControl(Composite parent) { 17 System.out.println("createPartControl"); 18 Composite topComp = new Composite(parent, SWT.NONE); 19 topComp.setLayout(new FillLayout()); 20 Text text = new Text(topComp, SWT.BORDER); 21 text.setText("中国之编辑器"); 22 23 text.addKeyListener(new KeyAdapter() { 24 public void keyPressed(KeyEvent e) { 25 // 如果编辑器不脏(即没有修改),则标志它脏并刷新界面状态 26 if (!isDirty()) { 27 setDirty(true); 28 firePropertyChange(IEditorPart.PROP_DIRTY); 29 } 30 } 31 }); 32 } 33 34 // 保存的处理代码在这种方法中,当按Ctrl+S键时会执行此方法。 35 // 最后别忘记标志为非脏及刷新界面状态 36 public void doSave(IProgressMonitor monitor) { 37 if (isDirty()) { 38 // ……保存编辑器事件处理代码(省略) 39 setDirty(false); 40 firePropertyChange(IEditorPart.PROP_DIRTY); 41 } 42 } 43 44 // 是否允许“另存为”,false不允许 45 public boolean isSaveAsAllowed() { 46 return false; 47 } 48 49 // “另存为”的代码写在这里,本例不实现它 50 public void doSaveAs() {} 51 52 // dirty标识的set方法,由此方法设置编辑器为脏 53 public void setDirty(boolean dirty) { 54 this.dirty = dirty; 55 } 56 57 // 编辑器的内容是否脏了。true脏,false不脏 58 public boolean isDirty() { 59 return dirty; 60 } 61 62 // 当编辑器获得焦点时会执行此方法,本例空实现 63 public void setFocus() {} 64 }
程序说明:firePropertyChange(IEditorPart.PROP_DIRTY)这一句除了能将界面状态刷新之外,如果IEditorPart对象添加了如下监听器,则还可以触发其中的propertyChange事件.
chinaEditor.addPropertyListener(new IPropertyListener(){
//此时source为ChinaEditor对象,propId为IEditorPart.PROP_DIRTY这个常量值
public void propertyChanged(Object source,int propId){
//......事件处理代码,这里省略
}
})