E4 compat 应用程序:"Pre-load" 从 fragment 通过 e4xmi 定义的菜单透视

E4 compat app: "Pre-load" perspective from fragment via e4xmi-defined menu

我开发了一个基于 Neon 兼容模式的 Eclipse RCP。

在一个插件中,我通过fragment.e4xmi添加了一个新的视角,如下所示。

<?xml version="1.0" encoding="ASCII"?>
<fragment:ModelFragments xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:advanced="http://www.eclipse.org/ui/2010/UIModel/application/ui/advanced" xmlns:basic="http://www.eclipse.org/ui/2010/UIModel/application/ui/basic" xmlns:fragment="http://www.eclipse.org/ui/2010/UIModel/fragment" xmi:id="_BxaXACerEeWxCPrV0pAZQQ">
  <fragments xsi:type="fragment:StringModelFragment" xmi:id="_j2XU0CE8EeicB9o_IvsRpg" featurename="snippets" parentElementId="org.eclipse.e4.legacy.ide.application">
    <elements xsi:type="advanced:Perspective" xmi:id="_-awZgCE8EeicB9o_IvsRpg" elementId="net.my.editor.ui.perspective.editing" selectedElement="_HyeW0CE9EeicB9o_IvsRpg" label="Editing Perspective">
      <children xsi:type="basic:PartSashContainer" xmi:id="_HyeW0CE9EeicB9o_IvsRpg" elementId="net.my.editor.ui.partsashcontainer.0" selectedElement="_KOMLUCE9EeicB9o_IvsRpg" horizontal="true">
        <children xsi:type="basic:PartStack" xmi:id="_iprjYCH5EeilmepNhpTrFQ" elementId="net.my.editor.ui.partstack.navigation" containerData="20">
          <children xsi:type="advanced:Placeholder" xmi:id="_RcRHECH3EeilmepNhpTrFQ" elementId="net.my.plugin.views.navigation" ref="_F0GUoCH4EeilmepNhpTrFQ" closeable="true"/>
        </children>
        <children xsi:type="basic:PartStack" xmi:id="_KOMLUCE9EeicB9o_IvsRpg" elementId="net.my.editor.ui.partstack.editing" containerData="80" selectedElement="_0KJQ0CH2EeilmepNhpTrFQ">
          <children xsi:type="basic:Part" xmi:id="_0KJQ0CH2EeilmepNhpTrFQ" elementId="net.my.editor.ui.part.splitter" contributionURI="bundleclass://net.my.editor.ui/net.my.editor.ui.parts.SplitterView" label="splitter" iconURI="platform:/plugin/net.my.editor.ui/icons/Sample.png" closeable="true"/>
          <children xsi:type="basic:Part" xmi:id="_LXR6UCE9EeicB9o_IvsRpg" elementId="net.my.editor.ui.parts.MyEditor.static" contributionURI="bundleclass://net.my.editor.ui/net.my.editor.ui.parts.MyEditor" label="Editor" iconURI="platform:/plugin/net.my.editor.ui/icons/Sample.png">
          </children>
        </children>
      </children>
    </elements>
  </fragments>
  <fragments xsi:type="fragment:StringModelFragment" xmi:id="_HSMw4FS4Eeacy4vmBL0tEQ" featurename="sharedElements" parentElementId="IDEWindow">
    <elements xsi:type="basic:Part" xmi:id="_F0GUoCH4EeilmepNhpTrFQ" elementId="net.my.plugin.views.navigation" contributionURI="bundleclass://org.eclipse.ui.workbench/org.eclipse.ui.internal.e4.compatibility.CompatibilityView"/>
  </fragments>
</fragment:ModelFragments>

透视效果很好,我可以从透视工具栏打开它。

我想在主菜单中提供一个以编程方式打开透视图的菜单项。在这里,我 运行 遇到了问题。

我添加了一个菜单项、命令和处理程序来以编程方式打开透视图。其中,EModelService除非事先打开,否则无法找到视角。

即,modelService.find(perspectiveId, application) returns null,除非之前通过透视工具栏打开了透视图(此时它的图标本身也会出现在工具栏中)。

因此我的问题是:有没有一种方法可以 "pre-load" 透视图,以便它在处理菜单项时在模型中可用,即使透视图没有以前打开过吗?

设法通过以编程方式将视角添加到当前活动视角的 PerspectiveStack 父级的子级来使其工作。

有点暴力的味道,所以我仍然对更好的解决方案感兴趣!

MPerspective myPerspective = null;
List<MUIElement> snips = application.getSnippets();
for (MUIElement snip : snips) {
    if (snip.getElementId().equals(myPerspectiveId)) {
        if (snip instanceof MPerspective) {
            myPerspective = (MPerspective) snip;
        }
    }
}
if (myPerspective != null) {
    MPerspective activePerspective = modelService.getActivePerspective(window);
    MPerspectiveStack perspectiveStack = (MPerspectiveStack) (MElementContainer<?>) activePerspective
    .getParent();
    perspectiveStack.getChildren().add(myPerspective);
    partService.switchPerspective(myPerspective);
}