在运行时删除视图操作扩展

时间:2011-11-18 08:00:10

标签: eclipse view registry rcp

我确实创建了一个View,这些View用于多个产品,我们已经提供了。 视图放在一个功能中,这些功能不知道产品规格,功能不应该知道。

其他插件通过实现扩展点为视图提供操作,这些操作显示在视图工具栏标题中

  • “的org.eclipse.ui.viewActions”

根据系统属性(产品规范将在运行时设置),应隐藏所有提供的视图操作。

问题: 我无法找到一个类,因为删除了特殊扩展点的删除扩展名。

我知道
  • WorkbenchPlugin.getDefault()。getActionSetRegistry()

可以删除actionSets,但是为viewActions做了类似的事情吗?

我查看了代码并找到了一个解决方案,但这是完全不可接受的,因为当我更新我的eclipse目标平台时,由于反射调用,它可能/将会中断。

Field privateStringField = ExtensionRegistry.class.getDeclaredField("masterToken"); //$NON-NLS-1$
privateStringField.setAccessible(true);
Object masterToken = privateStringField.get(registry);

// Reads the External Datatype Providers
IExtensionPoint extensionPoint = registry.getExtensionPoint("org.eclipse.ui.viewActions"); //$NON-NLS-1$
IConfigurationElement[] extensionPointArray = extensionPoint.getConfigurationElements();

for (int i = 0; i < extensionPointArray.length; i++) {
    IConfigurationElement element = extensionPointArray[i];
    if (element.getAttribute("targetID").equalsIgnoreCase(pPartId)) { //$NON-NLS-1$
        IConfigurationElement[] childs = element.getChildren();
        for (int j = 0; j < childs.length; j++) {
            registry.removeExtension(element.getDeclaringExtension(), masterToken);
        }
    }
}

1 个答案:

答案 0 :(得分:1)

您可以使用Product Customization修改XML加载时的扩展名。然后需要的产品可以使用产品定制和样式表。例如,压制行动:

  <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:template match="actionSet[@id='org.eclipse.ui.edit.text.actionSet.convertLineDelimitersTo']">
   </xsl:template>
   <xsl:template match="node()|@*">
       <xsl:copy>
           <xsl:apply-templates select="node()|@*"/>
       </xsl:copy>
   </xsl:template>
 </xsl:stylesheet>

您还可以尝试Activities/Capabilities隐藏viewActions。每个需要包含禁用活动的产品都会使viewActions扩展名消失。