如何在部件之外或在LifeCycle Manager中获取/注入EPartService或如何在真正意义上控制e4 RCP应用程序的生命周期?

时间:2015-12-16 06:19:33

标签: eclipse-rcp rcp e4

我的应用程序由许多部分组成,它们在应用程序的e4xmi文件中定义。我想隐藏并动态显示它们。我正在使用EpartService在处理程序中执行此操作,我可以在其中注入它。

但是我也希望用生命周期管理器控制部件的显示/隐藏,我不能注入EPartService。有没有办法实现并完全控制RCP应用程序的生命周期?

这里似乎存在完全相同的问题而且没有解决方案: https://www.eclipse.org/forums/index.php/t/595958/

我想实现'记住我喜欢的功能',其中显示有登录屏幕的部分而不是其他部分。退出后,还会显示相同的登录部分。所以我需要控制RCP app的生命周期。但是,在启动应用程序的e4xmi之前,我无法注入EPartService。

2 个答案:

答案 0 :(得分:1)

如果要从注入的内容(例如LifeCycle类)创建类,则可以使用ContextInjectionFactory创建注入类:

@Inject
IEclipseContext context;


MyClass myClass = ContextInjectionFactory.make(MyClass.class, context);

或者,如果您只是将IEclipseContext传递给该课程,则可以使用以下方式获取部分服务:

EPartService partService = context.get(EPartService.class);

注意:每个零件都有一个单独的零件服务实例。根据您的工作情况,您可能需要确保为活动部件提供服务。

答案 1 :(得分:0)

如果您没有使用SWT,则可以使用e(fx)clipse e4渲染器代替JavaFX。

e(fx)clipse有更多可能来控制应用程序的生命周期。例如,您可以从Boolean返回@PostContextCreate,以表示您是否要继续启动。你不能在这里使用EPartService,但你可以使用依赖注入来滚动你自己的登录对话框,正如greg-449在他的回答中描述的那样。

public class StartupHook {

    @PostContextCreate
    public Boolean startUp(IEclipseContext context) {
        // show your login dialog
        LoginManager loginManager = ContextInjectionFactory.make(LoginManager.class, context);
        if(!loginManager.askUserToLogin()) {
            return Boolean.FALSE;
        }
        return Boolean.TRUE;
    }

}

(您也可以重新启动应用程序。表单  更多详情请见http://tomsondev.bestsolution.at/2014/11/03/efxclipse-1-1-new-features-api-to-restart-your-e4-app-on-startup/)。