Сортировка / Заказ расширений вашей точки расширения Eclipse - PullRequest
3 голосов
/ 30 июля 2009

В Eclipse вы можете опубликовать точку расширения для использования нижестоящими плагинами. При циклическом просмотре расширений для вашей точки, возвращаемых из реестра, существует ли способ узнать / контролировать порядок их возврата.

Как eclipse находит расширения по порядку файлов на диске ?, name?

Обновление:
Кто-то спросил, почему я хотел бы сделать это, поэтому я приведу и пример использования

В eclipse, если вы запустите пример плагина MultiPageEditor, вы создадите редактор с тремя вкладками. Если я опубликую расширение, разрешающее добавление к нему вкладок, и хочу, чтобы они добавлялись в определенном / логическом / контекстном порядке, а не в произвольном порядке / в порядке порядка файлов для конкретной ОС.

Ответы [ 2 ]

2 голосов
/ 30 июля 2009

Когда я хочу заказать вклады точек расширения, я добавляю номер приоритета, например, 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;
        }
    });
2 голосов
/ 30 июля 2009

У вас нет прямого контроля над порядком их анализа или возврата, но это не должно иметь значения. Почему для вас важно, чтобы они были возвращены в определенном порядке? Для чего стоит смутно напомнить, что каждое местоположение расширения читается по очереди в порядке, в котором они определены, и каждый плагин в местоположении читается в алфавитном порядке, но это могло измениться, поскольку P2 появился в Eclipse 3.4, так как обработка очень отличается , В любом случае, я бы не стал полагаться на порядок чтения, поскольку вы не должны быть осведомлены об этом.

Если вам нужно упорядочить свои вклады, когда вы получаете расширения из реестра, вы можете добавить их в список, внедрить компаратор и отсортировать их при желании. Или вы можете перебирать их по порядку и сортировать результирующие объекты, прежде чем продолжить.

Эта статья немного устарела, но я все еще верна. Он дает вам несколько советов по обработке точек расширения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...