e4 вклады в динамическое меню

Эта функция была реализована начиная с Kepler M4, для получения подробной информации об использовании см. мой блог

Я хочу реализовать полностью динамический вклад меню в меню обработчика, расположенного на панели инструментов представления. В Eclipse 3 можно было добавить «динамический» вклад org.eclipse.ui.menus в меню!

Я уже узнал о www.vogella.com/blog/2010/ 10/26/processors-e4-model объясняет, как динамически вносить вклад в меню с помощью расширений модели процессора, но я говорю о полностью динамической реализации меню, которая меняется при каждом вызове соотв. подменю. Как уже упоминалось, это было легко реализовать в Eclipse 3.x с помощью вклада динамического меню и установки isDynamic() в true.

Я уже пробовал несколько подходов:

Открытые, непроверенные решения

  • Вставка ToolControl, чтобы попробовать подход SWT -> довольно сложно, но может работать

Я уже некоторое время ломаю голову, но не могу понять правильную реализацию этой проблемы в E4.

-- Этот вопрос также задавался на форуме Eclipse — Динамическое меню вкладов

----- ОБНОВЛЕНИЕ

До сих пор я пробовал другой подход:

Я добавил HandledToolItem в меню (пожалуйста, смотрите следующее изображение)

Командный подход фрагмента

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

@CanExecute
    public boolean canExecute(@Optional MApplication application) {
        System.out.println("CanExecute Counter="+counter);
            // --- 1 ---
        // Find the required MMenu Entry in the Application Model
        if(application == null) return true;
        EModelService modelService = (EModelService) application.getContext().get(EModelService.class.getName());
        MPart part = (MPart) modelService.find("at.medevit.emr.contacts.ui.contactselector", application);
        List<MToolBarElement> lmte = part.getToolbar().getChildren();
        HandledToolItemImpl htil = null;
        for (MToolBarElement mToolBarElement : lmte) {
            if(mToolBarElement.getElementId().equals("at.medevit.emr.contacts.ui.contactselector.toolbar.handledtoolitem.filter")) htil = (HandledToolItemImpl) mToolBarElement;
        }
        if(htil != null) {
            MMenu elemMenu = htil.getMenu();
        // --- 2 ---
            // Found it hopefully, let's start the real work, simply add a new item
        MDirectMenuItem mdi = MMenuFactory.INSTANCE.createDirectMenuItem();
        mdi.setLabel("Counter "+counter);
        counter++;
            // --- 3 ---
        elemMenu.getChildren().add(mdi); // ConcurrentModificationException
        }

Как видите, этот код запрашивается после создания меню, чтобы определить, является ли команда исполняемой или нет. Весь код с 1 по 2 предназначен для поиска правильного элемента MMenu для работы. Код от 2 до 3 создает MenuItem и увеличивает счетчик в поле.

НО в 3 я сталкиваюсь с java.util.ConcurrentModificationException при первом открытии меню! Я предполагаю, что в этот самый момент меню перебирает elemMenu.getChildren(), и мне не разрешено включать!

Так что же это за шумиха о том, что вся модель e4 постоянно меняется ;) (шучу, я знаю, что это хреновый хак!!!)

Дело в том, что я действительно считаю, что возможность добавления полностью динамических частей меню является одним из лучших инструментов юзабилити, и если это невозможно реализовать в Е4, как это было в Е3, то это очень серьезная деградация возможностей!!!

-- ОБНОВЛЕНИЕ

Для этого https://bugs.eclipse.org/bugs/show_bug.cgi?id=389063


person col.panic    schedule 07.09.2012    source источник


Ответы (1)


Надлежащие обновления динамической модели должны обрабатываться в обнаруженной вами ошибке. В качестве обходного пути в Eclipse4 в Juno можно создать MRenderedMenuItem в Eclipse4, чтобы обеспечить эквивалентную функциональность для элемента dynamic (хотя, если вы используете 4.2, вы просто использовали бы org.eclipse.ui.menus ).

ex:

ContextFunction generator = new ContextFunction() {
    @Override
    public Object compute(IEclipseContext context) {
        return new MyCompoundContributionItem(context);
    }
};

MRenderedMenuItem menuItem = MenuFactoryImpl.eINSTANCE.createRenderedMenuItem();
menuItem.setElementId(id);
menuItem.setContributionItem(generator);
container.getChildren().add(menuItem);

Это эффективно предоставляет CompoundContributionItem непосредственно средству визуализации меню Eclipse4.

person Paul Webster    schedule 10.09.2012
comment
Большой! Спасибо за помощь в понимании! :) - person col.panic; 11.09.2012
comment
Привет, я добавил вызов этого кода после запуска приложения с помощью «display.asyncExec», но ничего не происходит. Есть ли где-нибудь рабочий фрагмент? Полдня трачу на поиски но результата нет. Отладка также бесполезна. - person Ezhik; 28.06.2013