如果你懒得阅读所有这些,通常问题是:如何将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();
}
如您所见,我必须通过上下文手动注入所有依赖项。使用这种方法,事件消耗不会在CMTreeView
和CMTicketView
内工作(但是,我可以手动订阅事件)。我可以忍受这个但也许有更好的方法来保持模块化?我真的不希望这个课程长达2000多行。
答案 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
。