保存你的RCP視圖狀態(轉)
每當做開發的時候,你有可能在一次調試程序的過程中打開很多個編輯器,或是對Eclipse默認的視圖布局不滿意,手工作了一些調整。如果在工作的過程你因為有事離開或是不小心把Eclipse關掉了,不用擔心,在你下次打開的時候,Eclipse仍然會為您記住上次的工作場景。下面是一個例子場景:
Eclipse會記住“包資源管理器”的當前展開元素、被選中元素、視圖大小、位置、過濾、排序等狀態。不止于視圖和編輯器,Eclipse還提供了對全局狀態的持久化機制。包括向導,Action等
GUI狀態持久化不是必須的,只是一種可選的增強功能。一個完整的復雜的產品,特別是針對IDE類型的RCP,這個特征就顯得比較人性化。
下面介紹一些個人的實踐心得,愿大家有所收獲,主要是針對視圖(IViewPart)。
一般視圖都是繼承自ViewPart類或是實現IViewPart接口,在ViewPart中可以發現有























這二個方法就是實現界面狀態持久化的關鍵,注意saveState方法是在IPersistable接口中定義的。這些我們暫時忽略,主要是看如何使用這些機制。
如果去看JDT的實現或是org.eclipse.ui.ide一些視圖的實現,你可以發現一些比較常用的實現形式。下面先看一段示例












這是重寫你自定義視圖的init方法,定義一個全局的IMemento對象,初始化的時候為它賦值。并定義一系列的標識常量,用來表示你要保存的數據的標識。這一點與IDialogSettings是一致的。
下面是保存視圖實現代碼,如果你第一次接觸可能有點暈,不過沒關系,熟悉了以后你會發現Eclipse的內部實現也是類似的。下面的代碼就是從Eclipse里面改過來的。





































要保存的數據是key--value形式,可以定義Boolean Integer Float String等基本類型對應的值,這些值就以key--value形式持久化到文件中。
上面的實現內容其實就是把視圖中的樹組件中的二部分狀態轉換成數據:展開元素和被選中元素。通過把它們轉換成String類型(其實就是樹路徑)保存起來。IMemento的具體用法請查找Eclipse幫助文檔。
完成了保存,下面我們看如何重新把數據取出來,使得打開的時候還原之前關閉時的狀態。
init()方法調用的時候界面控件是還沒有被創建的,所以不能在init()方法中添加還原的方法,應用在控件都創建完成后還原。














完成控件創建后就調用restoreState方法,這是我們自定義的用于還原視圖狀態的方法。下面看一下,內容基本上就是saveState方法的逆向。





































這些工作就可以完成視圖狀態的保存與還原,還有一個特別要注意的地方,你必須對插件的WorkbenchAdvisor類的public void initialize(IWorkbenchConfigurer configurer)方法進行重寫,添加configurer.setSaveAndRestore(true);這個方法就可以打開保存機制。如果沒有這個步驟,上面的工作不會起任何效果。
GUI狀態的持久化都保存在運行時生成的.metadata\.plugins目錄下的xml文件,你可以手動去打開這些文件查看數據結果是否跟你預期的一樣。IEditorPart以及Perspective和其它的全局信息持久化的也是同樣的原理。只是復雜度不一樣。建議可以查看org.eclipse.ui.ide中的實現原理。
posted on 2007-10-31 08:46 liaojiyong 閱讀(1315) 評論(0) 編輯 收藏