Eclipse扩展点扩展的排序/排序

时间:2009-07-30 08:41:06

标签: eclipse plugins

在Eclipse中,您可以发布要使用的下游插件的扩展点。 循环遍历您的点的扩展时,从注册表返回,是否有办法知道/控制它们返回的顺序。

eclipse如何根据磁盘上的文件顺序查找扩展名?名称?

更新
有人问我为什么要这样做,所以我会举例说明用例

在eclipse中,如果运行MultiPageEditor插件示例,则将创建一个包含三个选项卡的编辑器。如果我发布了一个扩展,允许添加选项卡,并希望它们以特定/逻辑/上下文顺序添加,而不是随机/特定于操作系统的文件排序顺序。

2 个答案:

答案 0 :(得分:2)

您对解析或返回的顺序没有任何直接控制权,但这无关紧要。为什么按特定顺序归还他们很重要?值得一提的是,我依旧回忆起每个扩展位置按照它们的定义顺序依次读取,并且该位置的每个插件都按字母顺序读取,但这可能已经改变,因为P2在Eclipse 3.4中出现,因为处理非常不同。我不会依赖任何读取顺序,因为你不应该知道这种知识。

如果您需要订购贡献,当您从注册表获得扩展时,可以将它们添加到列表中,实现比较器,并根据需要对它们进行排序。或者您可以按顺序迭代它们并在继续之前对结果对象进行排序。

article有点旧,但我相信仍然有效。它为您提供了有关扩展点处理的一些指示。

答案 1 :(得分:2)

当我想订购扩展点贡献时,我添加了一个优先级编号,如int 10。

我只使用数字10,20,30,...因为您可以在将来轻松放置元素。这可用于订购按钮,复合材料或您无法按名称订购的所有内容。

您可以将此优先级添加到用于定义扩展点的界面中。或者您可以在扩展点描述中使用字段。

当您收集所有扩展点贡献时,您可以要求优先级,并在返回之前在链接列表中订购贡献。

 String tmpExtensionPoint = "EXTENSION POINT ID"; //$NON-NLS-1$
 IExtensionRegistry registry = Platform.getExtensionRegistry();
 IConfigurationElement[] elements = registry.getConfigurationElementsFor(tmpExtensionPoint);

    List references = new LinkedList();
    if (elements != null && elements.length > 0) {
        for (int i = 0; i < elements.length; i++) {
            try {
                Object obj = elements[i].createExecutableExtension("class");
                references.add((IExtensionPointInterface)obj); //$NON-NLS-1$
            } catch (CoreException e) {
                logger.error("Get Extension Point For " + tmpExtensionPoint, e);
            }
        }
    }

//...
//ORDER here

return references;

订单代码可能是这样的:

Arrays.sort(references, new Comparator() {
        public int compare(Object arg0, Object arg1) {
            if (!(arg0 instanceof IExtensionPointInterface )) {
                return -1;
            }

            if (!(arg1 instanceof IExtensionPointInterface )) {
                return -1;
            }

            IExtensionPointInterface part0 = (IExtensionPointInterface)arg0;
            IExtensionPointInterface part1 = (IExtensionPointInterface)arg1;

            if (part0.getPriority() < part1.getPriority()) {
                return -1;
            }

            if (part0.getPriority() > part1.getPriority()) {
                return 1;
            }

            return 0;
        }
    });