经过两天的查阅与实验,在此总结RCP产品中的编辑器状态的保存。
要保存RCP当前透视图的状态。首先需要在ApplicationWorkbenchAdavisor类中的
initialize(IWorkbenchConfigurer configurer)
{
??????? super.initialize(configurer);
??????? // 应用程序退出时保存各窗口的状态
??????? configurer.setSaveAndRestore(true);
?????? ……
}
这样,之后,各view的状态已经保存了,同时还有个actionbar等等。
?
下面要说的是编辑器的保存与恢复。编辑器的保存和view一样,都是通过IMemento对象完成的。view在保存时,eclipse会记住view的id,我们需要在view的saveState()方法中保存我们自定义的view内各个控件的状态就可以了,如果我们不修改saveState()方法,也不会报错,只是各个控件(比如Text内无文本等)无内容。恢复时,init(XX,IMemento)方法,将保存的东西复原。
编辑器的保存与view有所不同,编辑器有这个方法 public void init(IEditorSite site, IEditorInput input) 我们需要关注的是IeditorInput,因为在input内包含了编辑器的id和真正的内容,rcp将openEditor时,就是需要传入id和input。因此input就是我们需要在IMemento中保存的对象。
input为了能保存,就要在该类的getPersistable()中返回一个IPersistentElement对象,一般地,我们让input实现IPersistentElement接口,这样直接返回对象本身就可以了,IpersistentElement有两个方法,一个是getFactoryId(),这个是返回创建input对象的工厂的id(下面说),一个是saveState(Imemento)这个就与view中的同名方法一样的作用。
public void saveState(IMemento memento)
??? {
??????? IMemento editorMem =? memento.createChild(TAG_KEY);
??????? editorMem.putString(TAG_EDITOR_ID, this.id);
??????? editorMem.putString(TAG_PATH, this.path.toOSString());
??? }
下面创建input的工厂。
这个工厂在eclipse启动时就加载,该工厂必须扩展org.eclipse.ui.elementFactories扩展点,它的id就是上面所说的factory的id。其类必须实现IElementFactory接口。该接口中有方法:createElement(IMemento)我们就在这个方法中根据IMemento创建input。注意该方法不能返回null,否则将报错。memento中的东西就是我们在上面的saveState中保存的东西。
public IAdaptable createElement(IMemento memento)
{
?? IMemento childMem = memento.getChild(EditorInput.TAG_KEY);
??? String id = childMem.getString(EditorInput.TAG_EDITOR_ID);
??? String path = childMem.getString(EditorInput.TAG_PATH);
……
Object obj = ……//你的editorInput初始化的对象
??? EditorInput input = new EditorInput(id,obj);
return input;
}
需要注意的是obj在你的程序中仅此一份,比如一个文件,你new了一份,其他的地方再使用的时候看看是否是同一对象,否则引起麻烦。比如,将obj放在摸一个地方,大家都能访问的到。如果obj对应的数据库内容等不完全,这是需要new一个obj传进去。
看起来已经完成了,如果不能打开上次未关闭的编辑器,可能是在EditorInput中的方法
????public?boolean?exists()?{
????????return?true;
????}exists返回ture,告知系统这个input是否还存在。
参考:http://www.cnblogs.com/seag/