eclipse中编辑器状态的保存

经过两天的查阅与实验,在此总结RCP产品中的编辑器状态的保存。

要保存RCP当前透视图的状态。首先需要在ApplicationWorkbenchAdavisor类中的

initialize(IWorkbenchConfigurer configurer)

{

        super.initialize(configurer);

        // 应用程序退出时保存各窗口的状态

        configurer.setSaveAndRestore(true);

       ……

}

这样,之后,各view的状态已经保存了,同时还有个actionbar等等。

 

下面要说的是编辑器的保存与恢复。编辑器的保存和view一样,都是通过IMemento对象完成的。view在保存时,eclipse会记住viewid,我们需要在viewsaveState()方法中保存我们自定义的view内各个控件的状态就可以了,如果我们不修改saveState()方法,也不会报错,只是各个控件(比如Text内无文本等)无内容。恢复时,init(XX,IMemento)方法,将保存的东西复原。

编辑器的保存与view有所不同,编辑器有这个方法publicvoid init(IEditorSite site, IEditorInput input) 我们需要关注的是IeditorInput,因为在input内包含了编辑器的id和真正的内容,rcpopenEditor时,就是需要传入idinput。因此input就是我们需要在IMemento中保存的对象。

input为了能保存,就要在该类的getPersistable()中返回一个IPersistentElement对象,一般地,我们让input实现IPersistentElement接口,这样直接返回对象本身就可以了,IpersistentElement有两个方法,一个是getFactoryId(),这个是返回创建input对象的工厂的id(下面说),一个是saveState(Imemento)这个就与view中的同名方法一样的作用。

publicvoid 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就是上面所说的factoryid。其类必须实现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/

另一份资料:viewPart的IMemento

Eclipse 的工作台 Workbench 被关闭的时候,会执行每个视图 (ViewPart) saveState 方法,一个 IMemento 对象就会传入到 saveState 方法中,在 IMemento 对象中可以存储整型、字符串型、浮点型等数据,我们就可以将一些状态信息等存储到 IMemento 中,平台会将这些数据存储到 org.eclipse.ui metadata 目录下的 workbench.xml 文件中。下次打开视图时,平台还会从 workbench.xml 重新读取 IMemento 对象,并且传入视图的 init 方法。那么 init 方法就可以恢复上一次关闭前的状态了。打开视图的时候先执行 init,再执行视图的 createPartControl 方法,也就是说 init 的执行在创建组件之前,因此可以保存 init 方法的 IMemento 对象参数的引用,在 createPartControl 方法里使用,获得 IMemento 中存放的信息,这样就可以恢复上一次关闭前一些组件的属性值等。

public void init(IViewSite site, IMemento memento)

 {

    super.init(site, memento);

    String initData = memento.getString("initdata");

  }

 public void saveState(IMemento memento)

 {

    // 改变状态的话,就在关闭的时候存储到 IMemento

     memento.putString("initdata", "IMemento init");

  }

 

在这里我们保存的是editor/view中的东西,如果需要保存整个透视图的布局,必须对插件的WorkbenchAdvisor类的public void initialize(IWorkbenchConfigurer configurer)方法进行重写,添加configurer.setSaveAndRestore(true);这个方法就可以打开保存机制。如果没有这个步骤,上面的工作不会起任何效果。

参见:http://www.blogjava.net/nighty/archive/2007/10/30/156952.html

猜你喜欢

转载自sdfx.iteye.com/blog/1561644