过滤第三方插件扩展点
在开发rcp过程中,不可避免的需要加入第三方插件,与此同时会引入很多我们不想要的扩展点,不改动源码包的情况下我们可以选择用代码的方式过滤不想要的扩展点。
我们可以在我们定义的WorkbenchWindowAdvisor的postWindowStart()方法中对这些第三方扩展点进行过滤。
第一种情况,过滤主菜单、工具栏。eclipse机制中的IWorkbenchWindow里面保存了菜单、工具栏等相关信息,我们可通过它来移除IContributionItem(可通过传入IContributionItem实例或者对应的ID),下面以过滤CoolBar来作为示例。
static void filterCoolbar(IWorkbenchWindow window){ CoolBarManager cbm = window.getCoolBarManager(); cbm.remove("org.eclipse.ui.workbench.navigate"); }
上面的代码过滤了工具栏中的导航菜单。
这个“org.eclipse.ui.workbench.navigate”id如何获取得到呢?我们可以通过以下代码:
for(IContributionItem item : cbm.getItems()){ System.out.println(item.getId()); }
输出所有的ID。
第二种情况,直接过滤扩展点,例如说首选项、透视图、视图;下面以过滤视图的代码为例子。
static void filterViews() { IViewRegistry viewRegistry = WorkbenchPlugin.getDefault() .getViewRegistry(); IViewDescriptor[] descriptors = viewRegistry.getViews(); List<String> needIDs = new ArrayList<String>(); needIDs.add("org.eclipse.ui.views.ContentOutline"); for (IViewDescriptor descriptor : descriptors) { ViewDescriptor vDescriptor = (ViewDescriptor)descriptor; if (!needIDs.contains(vDescriptor.getId())) { IExtension extension = vDescriptor.getConfigurationElement().getDeclaringExtension(); ((ViewRegistry) viewRegistry).removeExtension(extension,new Object[] { descriptor });}}}
上述代码功能是将除大纲视图外的所有视图对应扩展点过滤,其它类似的扩展点可通过类似代码解决。