1

由于 Scout 在项目中支持模块化,我们决定将事物模块化。问题是当我们向项目添加大纲时:如何将页面添加到该大纲,但是当页面存在于子项目中时。将页面添加到大纲的函数位于大纲内部,问题是我们不应该让父级依赖于子级,因为我们会在依赖关系中得到循环。

大纲是 AbstractExtensibleOutline 类型,可能支持基于类头中的名称和注释的扩展/扩展,但我还没有弄清楚在哪里以及如何做到这一点。

4

2 回答 2

2

我不怀疑您的编程解决方案是否有效,但我想提出另一个使用 eclipse 扩展点的解决方案。我认为这是使用此 API 的预期方式。

在您的扩展中,您根本不需要 a DesktopExtension

mycore.client (Core Project)
  |
  \- Desktop
        |
        \- MyOutline

myext.client (Extended Project)
  |
  \- MyPage

如果MyOutlineextends AbstractExtensibleOutline,您可以MyPage直接使用(使用扩展点)添加到MyOutline(在核心中定义)。pageContributionorg.eclipse.scout.rt.extension.client.pages

插件编辑器 - Eclipse

如果显示文本plugin.xml,客户端扩展包 ( ) 文件的外观如下所示:myext.client

<?xml version="1.0" encoding="UTF-8"?>
<plugin>
   <extension
         point="org.eclipse.scout.rt.extension.client.pages">
      <pageContribution
            active="true"
            class="myext.client.pages.MyPage"
            order="1">
         <outline
               class="mycore.client.ui.desktop.outlines.MyOutline">
         </outline>
      </pageContribution>
   </extension>
</plugin>

使用 Order 字段,您可以指示页面列表中的位置(这样您可以在列表中间插入页面)。

您还可以注册:

  • pageModification
  • pageRemoval

... 取决于您的需要。

另请查看此论坛帖子,其中我描述了您如何Menu以相同的方式做出贡献:多模块 - 菜单扩展


另请注意,对于 Mars(从版本 4.2 开始),我们引入了另一种可扩展性机制。查看此 wiki 页面以了解更多信息:Scout 概念 - 可扩展性

这种新机制比我们在 Kepler (Scout 3.9) 中引入的机制更强大。Mars 版本同时支持新的和旧的可扩展性模式。从长远来看,我认为只会支持新模式。

于 2015-02-23T16:45:16.477 回答
0

如果你扩展你的项目,你最终会得到桌面扩展而不是桌面。

桌面扩展在父桌面之后初始化,因此您可以预期父桌面内的大纲已经准备好。

所以假设你有这种结构:

Core Project
        |
        -- Desktop
               |
               -- MyOutline

Extended Project
        |
        -- Desktop Extension
        |
        -- My Page

因此,在桌面扩展的扩展项目中,您需要覆盖初始化函数

@Override
protected ContributionCommand execInit() throws ProcessingException {

    ContributionCommand command = super.execInit();

    for (IOutline outline : getCoreDesktop().getAvailableOutlines()) {
      List<IPage> pages = new ArrayList<IPage>();

      MyPage myPage = new MyPage();
      pages.add(myPage);

      AbstractPageWithNodes pageWithNode = (AbstractPageWithNodes) outline.getRootNode();
      pageWithNode.getTree().addChildNodes(pageWithNode, pages);
    }

    return command;
 }  

这样 MyPage 将被添加到所有大纲中。如果要添加特定使用 instanceof 函数。

于 2015-02-20T09:05:13.710 回答