Приложение для совместимости с E4: предварительная загрузка перспективы из фрагмента через меню, определенное e4xmi

Я разрабатываю режим совместимости Eclipse RCP на основе Neon.

В плагине я добавляю новую перспективу через 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) возвращает null, если перспектива не была ранее открыта через панель инструментов перспективы (в этот момент ее значок также появляется на панели инструментов для себя).

Отсюда мой вопрос: Есть ли способ «предварительно загрузить» перспективу, чтобы она была доступна в модели во время обработки входа в меню, даже если перспектива не была открыта раньше?< /сильный>


person s.d    schedule 07.03.2018    source источник
comment
Вы пробовали EPartService.switchPerspective?   -  person greg-449    schedule 07.03.2018
comment
Да, это дает мне !ENTRY org.eclipse.e4.ui.workbench 4 0 2018-03-07 13:40:23.420 !MESSAGE Perspective with ID ... not found in the current window.. Хотите знать, является ли причиной этого определение перспективы в snippets, и должен ли я прикрепить ее где-то еще (на основе окна приложения)? Приложение org.eclipse.e4.legacy.ide.application.   -  person s.d    schedule 07.03.2018
comment
Действительно странно, что EPartService.switchPerspective(String ID) не работает. Я тоже столкнулся с проблемой.   -  person Denis Kalinin    schedule 08.05.2018


Ответы (1)


Удалось заставить его работать, программно добавив перспективу к дочерним элементам родительского элемента 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);
}
person s.d    schedule 07.03.2018