在eclipse e4中支持多个视图实例

时间:2014-11-27 18:32:27

标签: java eclipse eclipse-plugin eclipse-rcp

在eclipse 3.x中,我们可以通过提供不同的辅助ID来打开多个视图部分实例。如何在eclipse 4中实现相同的行为,我无法找到支持此行为的部分属性。

其他问题是我使用compat层将3.x应用程序迁移到4.x,我在应用程序模型中导入了3.x视图,并使用占位符在透视图中添加它们。我的问题是,如果我打开相同视图的第一个实例,它会在应用程序模型中定义的适当的partsashcontainer中打开,但之后如果我打开另一个视图实例,它会在透视图的任何区域打开而不是定义的布局?

那么如果我同时打开多个视图实例,我如何强制eclipse 4在一个布局区域中打开一个视图呢?

1 个答案:

答案 0 :(得分:1)

解决方案是@ greg-449所建议的,我必须使用EpartService创建零件,然后将零件附加到partstack。因为我正在使用comapt层,所以它不是直接的,必须写一些脏代码来实现:

                IEclipseContext serviceContext = E4Workbench
                        .getServiceContext();
                final IEclipseContext appContext = (IEclipseContext) serviceContext
                        .getActiveChild(); 

                EModelService modelService = appContext
                        .get(EModelService.class);
                MApplication app = serviceContext.get(MApplication.class);
                EPartService partService = serviceContext
                        .get(EPartService.class);
                MPartStack stack = (MPartStack) modelService.find(
                        "partstack.2", app);
                MPart part = modelService.createModelElement(MPart.class);
                part.setElementId("viewID");
                part.setContributionURI("bundleclass://org.eclipse.ui.workbench/org.eclipse.ui.internal.e4.compatibility.CompatibilityView");
                part.setCloseable(true);
                part.getTags().add(EPartService.REMOVE_ON_HIDE_TAG);

                stack.getChildren().add(part); // Add part to stack
                MPart viewPart = partService.showPart(part,
                        PartState.ACTIVATE); // Show part
                ViewReference ref = ((WorkbenchPage) PlatformUI
                        .getWorkbench().getActiveWorkbenchWindow()
                        .getActivePage()).getViewReference(part);
                IViewPart viewRef = ref.getView(true);

使用这个我们可以使用E4打开视图并获取IViewpart的实例来执行3.X的其他操作