做编辑器Editor插件,肯定离不开对“脏”的处理。以前虽然也写过部分编辑器,总感觉对脏的处理比较零乱。今天偶尔翻看了一下原来的代码,整理如下文:
(本文对脏的处理不求正规,仅求使用)大家如有好的方法or捷径,欢迎拍砖
背景:多页编辑器+gef
对editor的处理:
//第一步,对editor的构造函数添加EditDomain
public MyGraphicalEditor() {
setEditDomain(new DefaultEditDomain(this));
}
//第二步,对Command堆栈进行监听
public void init(IEditorSite site, IEditorInput input) throws PartInitException {
super.init(site, input);
getCommandStack().addCommandStackListener(this);
}
//第三步,重载CommandStackListener的CommandStackChanged()方法
public void commandStackChanged(EventObject event) {
super.commandStackChanged(event);
firePropertyChange(IEditorPart.PROP_DIRTY);// 别忘了
}
//第四步,定义一个boolean类型的变量dirty,并写其set方法。供涉及Command堆栈之外的操作对“脏”状态改的需求
public void setDirty(boolean dirty){
if (dirty != this.dirty) {
this.dirty = dirty;
firePropertyChange(IEditorPart.PROP_DIRTY);
}
}
//第五步,重载editor的isDirty()方法
public boolean isDirty() {
return (getCommandStack().isDirty()) | dirty;
}
// 最后一步,doSave()方法的处理
public void doSave(IProgressMonitor arg0) {
getCommandStack().markSaveLocation();
dirty = false;
firePropertyChange(IEditorPart.PROP_DIRTY);
// Todo others.....
}
在edtor中可以直接调用setDirty() 来设置编辑器的“脏”状态,在其他页面(非editor类中),我们可以通过以下方法获取编辑器editor:
private MyGraphicalEditor getEditor(){
IEditorPart editor = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor();
if(editor instanceof MyGraphicalEditor)
return (MyGraphicalEditor)editor;
return null;
}
然后就可以设置编辑器的脏状态了。
over。。。。