当前位置: 首页 > 知识库问答 >
问题:

有没有办法通过编程定义MToolberElements在MToolBar中的位置?

濮阳和泰
2023-03-14

我正在开发一个Eclipse rcp应用程序,其中提供了各种插件。每个插件都有自己的处理器,可以通过编程将更多元素插入到可能存在的MToolbares中(使用现有的MToolBarElements)。插入元素的顺序取决于插件的初始化顺序,除了插件之间的依赖关系外,初始化顺序是不确定的。但是,在插件之间创建一个人工依赖项来强制插件的初始化顺序并不是一种选择。

是否有一种开箱即用的方法来相对于彼此排列元素?例如,元素X必须始终以id“foo.bar”插入元素Y之后的工具栏。或者我必须自己管理元素添加到工具栏的顺序?

每个插件都定义了自己的处理器

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,该方法有效地将MToolberElement添加到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,尽管它们自己的Application ationModelProcess在“org.eclipse.e4.workbench.model”扩展点注册。

提供工具栏项目1和2的插件

另一个插件提供工具栏项3

启动应用程序时

然后,工具栏项目的顺序必须恒定(项目的绝对顺序并不重要,但顺序应始终保持不变)

目前有时为1,2,3或3,2,1

共有1个答案

慎志国
2023-03-14

最终的解决方案是将实现从直接将MToolBarElements添加到MToolBar更改为添加MToolBar贡献,并让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);
  }
}
 类似资料:
  • 问题内容: 我来自iOS开发,我想知道是否可以像iOS中那样以编程方式设置?并添加in代码。还是设置a 使用绑定的唯一方法? 谢谢! 问题答案: 感谢@stevesliva为我指出了 。我将其转换为Swift。这就是我得到的。 我在ViewController中创建一个NSCollectionView: 在ViewController中创建的CollectionViewItem只需加载一个视图,即

  • 问题内容: 我一直在寻找一个问题:从其字符串名称实例化一个类,该字符串名称描述了如何在具有名称时实例化一个类。有没有办法用Java做到这一点?我将拥有包名称和类名称,并且我需要能够创建具有该特定名称的对象。 问题答案: 两种方式: 方法1-仅适用于具有无参数构造函数的类 如果你的类具有无参数构造函数,则可以使用并使用该方法创建一个实例(尽管请注意,此方法通常被认为是有害的,因为它可以击败Java的

  • 问题内容: 有没有办法在Linux中创建用户定义的信号?我的信号(信号号)应该与任何现有信号号都不匹配。 换句话说,我想创建自己的唯一信号,该信号将由我的处理程序注册并捕获。 可能吗?如果是,怎么办? 提前致谢。 问题答案: 您无法添加或注册自己的SIGWHATEVER。 请参阅,它是固定大小。见熊陷阱。

  • 问题内容: 我有一些要发送到我的应用程序中的芹菜任务的对象。这些对象显然无法使用默认json库进行json序列化。有没有一种方法可以使celery使用自定义JSON / 对这些对象进行序列化/反序列化? 问题答案: 这里有些晚,但是您应该能够通过在kombu序列化程序注册表中注册自定义编码器和解码器,如docs中所示: http [//docs.celeryproject.org/en/lates

  • 当我点击任何编辑文本时,我想调整我的键盘。我在Android清单中使用windowSoftInputMode,但当我使用搜索编辑文本时,它覆盖了整个区域。键盘和底部布局覆盖整个区域

  • 问题内容: 即时消息插件可以接收IM消息,例如“ 在10秒钟内构建XYZ”,并将作业设置为在10秒内运行。它通过Java API来调度Job [0]。 我想知道是否可以通过REST API [1] 传递一些魔术参数,使我能够以相同的方式“延迟”作业? 谢谢。 [0] - https://github.com/jenkinsci/instant-messaging- plugin/blob/mast