由于 Scout 在项目中支持模块化,我们决定将事物模块化。问题是当我们向项目添加大纲时:如何将页面添加到该大纲,但是当页面存在于子项目中时。将页面添加到大纲的函数位于大纲内部,问题是我们不应该让父级依赖于子级,因为我们会在依赖关系中得到循环。
大纲是 AbstractExtensibleOutline 类型,可能支持基于类头中的名称和注释的扩展/扩展,但我还没有弄清楚在哪里以及如何做到这一点。
由于 Scout 在项目中支持模块化,我们决定将事物模块化。问题是当我们向项目添加大纲时:如何将页面添加到该大纲,但是当页面存在于子项目中时。将页面添加到大纲的函数位于大纲内部,问题是我们不应该让父级依赖于子级,因为我们会在依赖关系中得到循环。
大纲是 AbstractExtensibleOutline 类型,可能支持基于类头中的名称和注释的扩展/扩展,但我还没有弄清楚在哪里以及如何做到这一点。
我不怀疑您的编程解决方案是否有效,但我想提出另一个使用 eclipse 扩展点的解决方案。我认为这是使用此 API 的预期方式。
在您的扩展中,您根本不需要 a DesktopExtension
。
mycore.client (Core Project)
|
\- Desktop
|
\- MyOutline
myext.client (Extended Project)
|
\- MyPage
如果MyOutline
extends AbstractExtensibleOutline
,您可以MyPage
直接使用(使用扩展点)添加到MyOutline
(在核心中定义)。pageContribution
org.eclipse.scout.rt.extension.client.pages
如果显示文本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 版本同时支持新的和旧的可扩展性模式。从长远来看,我认为只会支持新模式。
如果你扩展你的项目,你最终会得到桌面扩展而不是桌面。
桌面扩展在父桌面之后初始化,因此您可以预期父桌面内的大纲已经准备好。
所以假设你有这种结构:
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 函数。