2017-02-01 18 views
0

У меня странная проблема с моим приложением RCP Eclipse 4, которое иногда не переводит некоторые элементы меню из-за отсутствия contributorURI.МенюИнтемы, внесенные фрагментом.e4xmi не переводятся, contributorURI отсутствует

Ситуация

В настоящее время я работаю над приложением RCP Eclipse, 4, который состоит из нескольких локализованных плагинов.

Один из этих плагинов - com.mobatime.nms.masterclock.common.ui. Его fragment.e4xmi вносит некоторые локализованные MenuItems в строку главного меню, которая «контролируется» Application.e4xmi другого плагина (com.mobatime.nms.app). С локализованным я имею в виду, что метка MenuItem представляет собой переменную OSGI (например, %commands.somecommand), которая определена в файле OSGI-INF/l10n/bundle.properties.

Однако на около 50% всех запусков моего приложения, то MenuItems вклад в masterclock плагин не переводится, так что имя переменной OSGI используется в качестве метки для MenuItem.

Вещи, которые я уже узнал

  • После некоторых исследований в Интернете, я нашел this thread, который, по-видимому описывает проблему относительно похож на мой. Тем не менее, поток уже пять лет, и описанная ошибка, обнаруженная ими, была исправлена ​​в более старой версии Eclipse SDK.

  • Я импортировал плагин ModelSpy в свое приложение, так как помог найти ошибку в упомянутой выше теме. После проверки MenuItemsя обнаружил, что contributorURI каждого элемента не установлен, когда перевод отсутствует.

  • Когда перевод сделан правильно, contributerURI предоставленного взноса MenuItem содержит platform:/plugin/com.mobatime.nms.masterclock.common.ui.

Дополнительная информация

  • Мы используем новейшую версию библиотеки Eclipse (SDK, RCP и т.д.).
  • Проблема также встречается в более старой версии этих библиотек (раньше мы использовали версию 4.4.2).
  • Нет никакой разницы между регулярными сборками и сеансами отладки в Eclipse IDE, ошибка происходит везде.
  • На других позициях contributorURI заполняется правильно.
  • В файле workbench.xmi метаданных org.eclipse.e4.workbench вкладчикURI не сохраняется на пораженном MenuItems.
  • При использовании -clearPersistedState проблема не возникает.

Есть ли у кого-нибудь идеи, как это можно исправить?

+1

Вы используете сохраненное состояние, так что модель перезагружается из сохраненного состояния или вы используете '-clearPersistedState', чтобы предотвратить это (так модель строится из фрагментов каждый раз)? –

+0

Я не использую 'clearPersistedState', но когда я добавляю его в свою конфигурацию отладки, проблема больше не возникает. Вероятно, ошибка в логике настойчивости Eclipse? – appnic

+1

Вы можете посмотреть сохраненное состояние в файле 'workbench.xmi' в метаданных' org.eclipse.e4.workbench', чтобы узнать, сохраняется ли contributorURI или нет. –

ответ

0

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

Внесенный вкладчик из затронутых MenuItems правильно сохраняется в этот файл (в отличие от того, что я написал в моем первоначальном сообщении), однако, когда модель приложения загружается из файла, Uri либо неправильно считывается из файла или не установлен в MenuItem.

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

MTrimmedWindow trim = (MTrimmedWindow) modelService.find("your-window-id", application); 
MMenu menu = (MMenu)modelService.find("your-menu-id", trim.getMainMenu()); 
if(menu != null) { 
    for(MMenuElement item : menu.getChildren()) { 
     if(item instanceof MHandledMenuItem && item.getElementId().contains("some-common-string-in-the-menuitem-id")) { 
       item.setContributorURI("platform:/plugin/com.example.yourcontributingplugin"); 
     } 
    } 
}