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

Eclipse 在运行时删除视图操作扩展,eclipse,view,registry,rcp,Eclipse,View,Registry,Rcp,我确实创建了一个视图,这些视图在多个产品中使用,我们已经交付了。 视图放置在一个功能中,这些功能不知道产品规格,该功能不应该知道 其他插件通过实现扩展点为视图提供操作,如视图工具栏标题所示 “org.eclipse.ui.viewActions” 根据系统属性(产品规范将在运行时设置),所有参与的视图操作都应隐藏或不隐藏 问题: 我找不到用于删除特殊扩展点的扩展的类。我知道 WorkbenchPlugin.getDefault().getActionSetRegistry() 可以删除操

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

其他插件通过实现扩展点为视图提供操作,如视图工具栏标题所示

  • “org.eclipse.ui.viewActions”
根据系统属性(产品规范将在运行时设置),所有参与的视图操作都应隐藏或不隐藏

问题: 我找不到用于删除特殊扩展点的扩展的类。我知道

  • WorkbenchPlugin.getDefault().getActionSetRegistry()
可以删除操作集,但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);
        }
    }
}
Field privateStringField=ExtensionRegistry.class.getDeclaredField(“主令牌”)//$非NLS-1$
privateStringField.setAccessible(true);
Object masterToken=privateStringField.get(注册表);
//读取外部数据类型提供程序
IExtensionPoint extensionPoint=registry.getExtensionPoint(“org.eclipse.ui.viewActions”)//$非NLS-1$
IConfigurationElement[]extensionPointArray=extensionPoint.getConfigurationElements();
for(int i=0;i
您可以在加载扩展XML时使用它来修改扩展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>


您还可以尝试隐藏viewActions。每个需要添加的产品都将包括禁用的活动,以使viewActions扩展消失。

我只想在RCP应用程序中添加这一点,您可以使用首选项
IRegistryConstants.PROP\u REGISTRY\u NULL\u USER\u TOKEN
将用户TOKEN设置为NULL,然后不需要反射。看见