Программное открытие DialectEditor за пределами основной области редактора (гибрид E3/E4)

что я хочу сделать:

В моем RCP гибриде E3/E4 у меня есть проект и библиотека, основанные на дереве Сириуса. Пользователь может перетащить элемент из дерева библиотеки в дерево проекта. Это прекрасно работает, и встроить его не составило особых проблем. Теперь я хочу сделать пользовательский интерфейс более удобным для использования. Это должно выглядеть так:

введите здесь описание изображения что работает:

После запуска приложения я открываю презентацию своей библиотеки с помощью DialectUIManager.

final DialectEditor editor = (DialectEditor) 
DialectUIManager.INSTANCE.openEditor(siriusSession, description, monitor);

Ладно, это работает. Но открывает его в редакторе в части маркета как org.eclipse.ui.editorss. Это не то, что я хочу

введите здесь описание изображения

что не работает:

Я хочу показать это в "Библиотечной части". Я могу переместить его вручную с помощью мыши после открытия редактора, но как я могу сказать DialectUIManager, чтобы открыть его прямо там. Или как я могу программно его туда переместить.

Я провожу много исследований в Google, но не нашел решения. Единственное, что я нашел, это подсказка Пьера-Шарля Давида https://%20www.%20eclipse.org/forums/index.php?t=msg&th=998476&goto=1631138&#msg_1631138

Если вам нужно просто показать редактор за пределами основной области редактора, это возможно, начиная с Eclipse 4.2 (e4 на самом деле не рассматривает основную область редактора как что-то особенное), поэтому вы можете иметь свой редактор «вокруг» другого редактора в середина других взглядов.

Но на этом шаге я застрял. Я также спрашиваю об этом на форуме Sirius, но они говорят, что это проблема Eclipse E4.

Спасибо за помощь, фрагменты кода или ссылки на правильную часть руководства.


person Fry123    schedule 30.08.2017    source источник
comment
Я не знаю, что такое DialectUIManager, но, предположительно, он использует API 3.x для открытия редактора — эти API не могут сказать, где открыт редактор.   -  person greg-449    schedule 31.08.2017
comment
DialectUIManager является частью Sirius API, и вы правы, он использует 3. x API. Редактор имеет тип IEditorPart. Если невозможно открыть редактор непосредственно в другой детали, можно ли программно переместить его в библиотечную часть?   -  person Fry123    schedule 31.08.2017


Ответы (1)


Я нашел решение. Это не очень приятно, но это работает. Я выполняю этот код здесь после открытия редакторов.

Что делает код:

Он ищет MPlaceholder с идентификатором: org. затмение. пользовательский интерфейс редакторы. Там он спускается, пока не окажется с частями. Они находятся в режиме редактора Compatible. Затем он выбирает часть, из которой мы хотим выйти, и прикрепляет их к цели MPartStack.

  public static void movePart(MApplication application, 
            EModelService modelService) {

    MPart partToMove = null;
    MUIElement muiElement = 
            modelService.find("org.eclipse.ui.editorss", application);

    if (muiElement instanceof MPlaceholder) {
      MPlaceholder placeholder = (MPlaceholder) muiElement;
      MUIElement ref = placeholder.getRef();

      if (ref instanceof MArea) {
        MArea area = (MArea) ref;
        List<MPartSashContainerElement> children = area.getChildren();

        for (MPartSashContainerElement mPartSashContainerElement 
                                                       : children) {

          if (mPartSashContainerElement instanceof MPartStack) {
            MPartStack partStack = (MPartStack) mPartSashContainerElement;
            List<MStackElement> children2 = partStack.getChildren();
            for (MStackElement mStackElement : children2) {
              if (mStackElement instanceof MPart) {
                MPart part = (MPart) mStackElement;
                // Library is the Editor Name wiche I want to move
                if (part.getLabel().equals("Library")) {
                  partToMove = part;
                  break;
                }
              }
            }
          }
        }

      }
    }

    if (partToMove != null) {
      moveElement(modelService, application, partToMove);
    }
  }

  private static void moveElement(EModelService modelService, 
                    MApplication application, MPart part) {
    // target PartStack
    MUIElement find = modelService.find("de.bsg.onesps.rcp.
                               partstack.library", application);

    if (find instanceof MPartStack) {
      MPartStack mPartStack = (MPartStack) find;

      mPartStack.getChildren().add(part);
      mPartStack.setSelectedElement(part);
    }
  }
person Fry123    schedule 06.09.2017