Есть ли способ программно определить положение MToolbarElements в MToolBar? - PullRequest
1 голос
/ 16 мая 2019

Я занимаюсь разработкой приложения Rcl для Eclipse, в которое входят различные плагины.Каждый плагин имеет свой собственный процессор, который программно вставляет дополнительные элементы в возможно существующие MToolBars (с существующими MToolBarElements).Порядок вставленных элементов зависит от порядка инициализации плагинов, который не является детерминированным, за исключением зависимостей между плагинами.Но создание искусственной зависимости между плагинами для наведения порядка инициализации плагинов не является альтернативой.

Существует ли нестандартный способ размещения элементов относительно друг друга?Например, элемент X всегда должен вставляться в панель инструментов после элемента Y с идентификатором «foo.bar».Или я должен сам управлять порядком, в котором элементы добавляются на панель инструментов?

Каждый из плагинов определяет свой собственный процессор

public class ApplicationModelProcessor {
  @Execute 
  public void execute(
    final MApplication application, 
    final ToolBarBuilder toolbarBuilder) {
  // ToolBarBuilder is a class providing methods to configure toolbar
  // elements and appending them to existing toolbars. So after the
  // configuration of the builder "build" is called and toolbar elements
  // are added to (existing) toolbars according to the configuration of
  // the builder
  toolbarBuilder.doSomeConfiguration();
  toolbarBuilder.build();
}

В классе ToolBarBuilder существует метод updateToolItemкоторый эффективно добавляет MToolBarElement к MToolBar

public class TooBarBuilder {
  public MToolBarElement build() {
    // The code happening here basically searches for existing MToolBar or 
    // creates a new MToolBar according to a given configuration of the 
    // builder
    MToolBar toolbar = findOrCreateToolBar();

    // and adds a new MToolBarElement to the given MToolBar
    return updateToolItem(toolbar);
  }


  // This method is invoked at some point during the execution of the provided processor. The toolBar is looked up before and provided to the method-
  private MToolBarElement updateToolItem(final MToolBar toolBar) {
    final MToolBarElement result = createHandleToolItem();

    // At this point I could manage the order by myself but is there a better way to do this?
    toolBar.getChildren().add(result);

    return result;
  }
}

Некоторые плагины предоставляют MToolBarElements для того же MToolBar, хотя их собственный ApplicationModelProcessor зарегистрирован в точке расширения "org.eclipse.e4.workbench.model".

GIVEN плагин, обеспечивающий элементы панели инструментов 1 и 2

И еще один плагин, обеспечивающий панель инструментов элементов 3

WHEN запускВ приложении

THEN порядок элементов панели инструментов должен быть постоянным (абсолютный порядок элементов не так важен, но порядок всегда должен оставаться неизменным)

В настоящее время иногда это 1,2,3 или 3,2,1

1 Ответ

0 голосов
/ 22 мая 2019

Окончательное решение состояло в том, чтобы изменить реализацию от непосредственного добавления MToolBarElements к MToolBar к добавлению MToolBarContributions и позволить Eclipse позаботиться о добавлении MToolBarElements, на который ссылается MToolBarContripution, в правильную позицию в MToolBar:

@Creatable
public class TooBarBuilder {

  @Inject
  private MApplication application;

  private String positionInParent;

  // The positionInParent is an expression that represents a position
  // relative to another element in the MToolBar, for example:
  // "after=another.toolbar.item.id"
  public ToolBarBuilder positionInParent(final String positionInParent) {
    this.positionInParent = positionInParent;
    return this;
  }

  public MToolBarElement build() {
    // The code happening here basically searches for existing MToolBar or 
    // creates a new MToolBar according to a given configuration of the 
    // builder
    MToolBar toolbar = findOrCreateToolBar();

    // and adds a new MToolBarElement to the given MToolBar
    return updateToolItem(toolbar);
  }


  // This method is invoked at some point during the execution of the provided processor. 
  // The toolBar is looked up before and provided to the method.
  private MToolBarElement updateToolItem(final MToolBar toolBar) {
    final MToolBarElement result = createHandleToolItem();
    MToolBarContribution contribution = MMenuFactory.INSTANCE.createToolBarContribution();
    contribution.setElementId(getContributionId()); // any elementId is ok, details how the id is created are not of interest for the solution
    contribution.setParentId(toolbar.getElementId());
    contribution.setPositionInParent(positionInParent);

    // after all model processors have been executed the MToolBarContribtions 
    // are evaluated. MToolBarElements in the created MToolBarContributions 
    // are added to the MToolBars referenced by the parentId. During this process 
    // the MToolBarElements are positioned relatively to each other according to
    // "positionInParent"
    application.getToolBarContributions().add(contribution);
  }
}
...