2013-05-20 47 views
0

我有一個eclipse-plugin,它有兩個透視圖。有一種視圖可以用兩種視角之一來擴展ViewPart。在這個視圖中,我重寫了ViewPart的saveState方法來保存我的數據。當工作區關閉時,Eclipse 4.2(juno)沒有調用ViewPart的saveState方法

首先,我打開了這個觀點。然後我在視圖中添加一些數據,這些數據應該保存在saveState中。 接下來,我導航到沒有此視圖的另一個視角。 最後,我關閉了eclipse的工作區。

在eclipse 4.2(juno)中,saveState方法的視圖沒有被調用過。我的數據丟失了。 在eclipse 3.6(Helios)中,視圖的saveState方法已被調用。我的約會一直持續下去。

有誰知道原因?如何確保在所有版本的eclipse上關閉工作區時都會調用saveState?

回答

0

Eclipse e4沒有ApplicationWorkbenchAdvisor類,應用程序模型沒有屬性來設置它,這與Eclipse 3.x完全不同。
您可以從wikivogella tutorial blog中獲得更多信息。

0

隨着歡樂,這個問題持續到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()的時候還不清楚還有多少資源可用。

相關問題