2012-10-13 102 views
2

如果IApplication.start返回IApplication.EXIT_RESTART,則將重新啓動基於3. *的RCP應用程序。類E4Application似乎總是返回EXIT_OK。如何重新啓動e4 RCP應用程序

org.eclipse.ui.IWorkbench也有一個重啓方法,org.eclipse.e4.ui.workbench.IWorkbench沒有。

那麼如何重新啓動e4 RCP應用程序?

回答

1

Eclipse 4.2中的當前實現會生成一個id爲org.eclipse.ui.file.restartWorkbench的命令,最終導致處理器類RestartWorkbenchHandler。這個類實現如下

public Object execute(ExecutionEvent event){ 

    PlatformUI.getWorkbench().restart(); 
    return null; 
} 

這意味着,它是Eclipse的依賴3.x中,作爲PlatformUI類不是在純Eclipse的4基於應用程序中可用了。所以如果你想在你的e4應用程序中解決這個任務,創建一個命令,實現處理程序,並且目前你將有一些E3代碼依賴性!

2

直到此功能引入到e4我的解決方法如下所示:我使用我的IApplication實現作爲E4Application的包裝。這樣,我可以從start方法返回IApplication.EXIT_RESTART,Equniox將重新啓動。

請注意,這個解決方法使用了一個內部API,這在未來可能會改變!

package de.emsw.gosa.e4.application; 

import org.eclipse.e4.ui.internal.workbench.swt.E4Application; 
import org.eclipse.equinox.app.IApplication; 
import org.eclipse.equinox.app.IApplicationContext; 

public class MyE4Application implements IApplication { 

    private static MyE4Application instance; 

    public static MyE4Application getInstance() { 
     return instance; 
    } 

    private Integer exitRet = IApplication.EXIT_OK; 
    private E4Application e4app; 

    public void setRestart() { 
     exitRet = IApplication.EXIT_RESTART; 
    } 

    @Override 
    public Object start(IApplicationContext context) throws Exception { 
     instance = this; 
     e4app = new E4Application(); 
     e4app.start(context); 
     return exitRet; 
    } 

    @Override 
    public void stop() { 
     e4app.stop(); 
    } 
} 

當你要重新啓動,現在你可以使用Singleton設置返回值:

@Execute 
public void execute(IWorkbench workbench) { 
    MyE4Application.getInstance().setRestart(); 
    workbench.close(); 
} 

我用一個Singleton在這裏,因爲它更容易解釋這種方式。更好的解決方案是將您的IApplication註冊爲OSGi服務,並將DI注入您的處理程序。

2

org.eclipse.e4.ui.workbench.IWorkbench在Eclipse Kepler(4.3)中現在有一個restart方法。