Eclipse 4 - 为SashForm添加部分

时间:2017-03-07 14:37:27

标签: java eclipse eclipse-plugin eclipse-pde

如果你懒得阅读所有这些,通常问题是:如何将Composite父项传递给现有部分,假设这些部分是由Eclipse创建的,而不是手动创建的。

我正在开发Eclipse 4插件。我在不同的类中有不同的部分(视图),通过事件进行通信。一切都很好并且分开,直到我必须实现包含2个部分的SashForm。我已经看过一些例子,但它们主要显示SashForm的简单用法。 我想要的是保持这种模块化与所有依赖注入和自动事件接收(通过注释)。 但我无法弄清楚如何做到这一点。 我最好的尝试是使用IEclipseContext这样:

@Inject
private EventPool eventPool;

@Inject
private EventBroker eventBroker;

@Inject
private CMTreeContentProvider contentProvider;

@Inject
private LoginService loginService;

@PostConstruct
public void createPartControl(Composite shell) {
    SashForm form = new SashForm(shell, SWT.HORIZONTAL);
    form.setLayout(new FillLayout());
    renderCMTree(form);
    renderProjects(form);
}

private void renderCMTree(SashForm form) {
    Composite child = new Composite(form, SWT.NONE);
    child.setLayout(new FillLayout());
    IEclipseContext context = EclipseContextFactory.create();
    context.set(Composite.class, child);
    context.set(EventPool.class, eventPool);
    context.set(EventBroker.class, eventBroker);
    context.set(CMTreeContentProvider.class, contentProvider);
    ContextInjectionFactory.make(CMTreeView.class, context);
    context.dispose();
}

private void renderProjects(SashForm form) {
    Composite child = new Composite(form, SWT.NONE);
    child.setLayout(new FillLayout());
    IEclipseContext context = EclipseContextFactory.create();
    context.set(Composite.class, child);
    context.set(EventPool.class, eventPool);
    context.set(EventBroker.class, eventBroker);
    ContextInjectionFactory.make(CMTicketView.class, context);
    context.dispose();
}

如您所见,我必须通过上下文手动注入所有依赖项。使用这种方法,事件消耗不会在CMTreeViewCMTicketView内工作(但是,我可以手动订阅事件)。我可以忍受这个但也许有更好的方法来保持模块化?我真的不希望这个课程长达2000多行。

1 个答案:

答案 0 :(得分:1)

您应该尝试使用Application.e4xmi中的“Part Sash Container”之类的内容来包含这些部分。

如果您必须使用ContextInjectionFactory.make创建内容,则可以使用使用两个IEclipseContext参数传递主要上下文的表单以及仅包含您的值的辅助上下文:

@Inject
IEclipseContext context; // injected existing context


IEclipseContext staticContext = EclipseContextUtil.createContext();

// Only need to put your own values in staticContext
staticContext.set(Composite.class, child);

// Pass in both contexts to make
ContextInjectionFactory.make(CMTreeView.class, context, staticContext);

这两个上下文将用于查找注入CMTreeView所需的值。

注意:您应该使用内部IEventBroker EventBroker