我正在考虑从基于Eclipse 3.x的大型应用程序中开始使用Eclipse RCP e4工具。出于这个原因,我没有e4xmi文件。
应用程序模型确实存在于兼容层下面,但是很难从代码中获取它(请注意,您可以使用依赖项注入来获取所有内容,但只有在您说服框架开始为您创建对象之后)
这是获得我能找到的模型的唯一方法:
PartSite ps = (PartSite)PlatformUI.getWorkbench().getActiveWorkbenchWindow()
.getActivePage().getActivePart().getSite();
IEclipseContext iec = ps.getContext();
MApplication ma = iec.get(MApplication.class);
暂时忽略PartSite是内部API的事实,是否有更简单的方法来掌握模型?为什么这么难找?
答案 0 :(得分:1)
要做你想做的事,你可以使用这个片段。
IWorkbench workbench = getService(IWorkbench.class, IWorkbench.class);
MApplication mApplication = workbench.getApplication();
EModelService modelService = mApplication.getContext().get(EModelService.class);
这是我从OSGi获得服务的方式
private <T> T getService(Class<T> pClass, Class pContextClass) {
BundleContext context = FrameworkUtil.getBundle(pContextClass).getBundleContext();
ServiceReference<T> reference = context.getServiceReference(pClass);
if(reference == null){
return null;}
T service = context.getService(reference);
return service;
}
之后你可以这样做:
MWindow window = modelService.createModelElement(MWindow.class);
window.setHeight(100);
window.setWidth(100);
window.setLabel("Hello");
window.setVisible(true);
mApplication.getChildren().add(window);
希望这有帮助。
维姆
答案 1 :(得分:0)
您可以使用“修剪窗口”。
MTrimmedWindow trimmedWindow = modelService.createModelElement(MTrimmedWindow.class);
trimmedWindow.setX(100);
trimmedWindow.setY(50);
trimmedWindow.setWidth(100);
trimmedWindow.setHeight(50);
window.setLabel("Hello");
window.setVisible(true);
mApplication.getChildren().add(window);
如果您使用MWindow
,则可能会遇到异常
org.eclipse.e4.core.di.InjectionException: Unable to process "WorkbenchWindow.model"
在这种情况下,您需要使用MTrimmedWindow
。