隨着歡樂,這個問題持續到4.4.2。
在其基礎上,問題是兼容性層WorkbenchPart.getViewReferences()僅搜索當前活動的透視圖。這種行爲與3.x不同。來自4.4.2 Eclipse WorkbenchPart的相關代碼在這裏(注意getCurrentPerspective()的調用)。
public IViewReference[] getViewReferences() {
MPerspective perspective = getCurrentPerspective();
if (perspective != null) {
List<MPlaceholder> placeholders = modelService.findElements(window, null,
MPlaceholder.class, null, EModelService.PRESENTATION);
List<IViewReference> visibleReferences = new ArrayList<IViewReference>();
for (ViewReference reference : viewReferences) {
for (MPlaceholder placeholder : placeholders) {
if (reference.getModel() == placeholder.getRef()
&& placeholder.isToBeRendered()) {
// only rendered placeholders are valid view references
visibleReferences.add(reference);
}
}
}
return visibleReferences.toArray(new IViewReference[visibleReferences.size()]);
}
return new IViewReference[0];
}
因此,如果一個人有開放的圖,然後改變到未示出的是一個視圖的角度來看,saveState和()方法將不被調用。
我們爲UIEvents.UILifeCycle.appShutdownStarted添加了一個OSGI事件偵聽器,並調用了saveState()。但是,有必要手動獲取IMemento,因爲它不存在。示例代碼位於org.eclipse.ui.internal.ViewReference(http://grepcode.com/file/repository.grepcode.com/java/eclipse.org/4.2.2/org.eclipse.ui/workbench/3.104.0/org/eclipse/ui/internal/ViewReference.java#ViewReference)中。
如果用戶關閉視圖而不是關閉應用程序,還可以使用IPartListener類添加一部分關閉偵聽器,以便可能保留設置。
我們還沒有找到正在關閉的零件的OSGI事件,但可能有一個。
這個討論(Eclipse call ViewPart saveState on View close)建議使用IDialogSettings而不是IMemento。這個討論也提出了可能在dispose()方法中增加了一些東西,但是在調用dispose()的時候還不清楚還有多少資源可用。