Эта функция была реализована начиная с Kepler M4, для получения подробной информации об использовании см. мой блог
Я хочу реализовать полностью динамический вклад меню в меню обработчика, расположенного на панели инструментов представления. В Eclipse 3 можно было добавить «динамический» вклад org.eclipse.ui.menus в меню!
Я уже узнал о www.vogella.com/blog/2010/ 10/26/processors-e4-model объясняет, как динамически вносить вклад в меню с помощью расширений модели процессора, но я говорю о полностью динамической реализации меню, которая меняется при каждом вызове соотв. подменю. Как уже упоминалось, это было легко реализовать в Eclipse 3.x с помощью вклада динамического меню и установки isDynamic() в true.
Я уже пробовал несколько подходов:
- Регистрация обработчика, подключающегося к меню => динамическое добавление невозможно (новые элементы просто не отображаются, также обсуждается в Форум Eclipse — невозможно заменить элементы меню во время выполнения)
- Прослушивание UIEventTopic для события создания меню, получение виджета для Modification => модификации собранного swt.Menu просто игнорируются (каждый слушатель, элемент и т. д.) (для информации Модель событий RCP
Открытые, непроверенные решения
- Вставка 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