в настоящее время мы выполняем миграцию с eclipse Juno на Eclipse 4.24, поэтому у нас есть некоторые проблемы. Мы находимся в среде Eclipse RCP, используя eclipse e4, с правильной настройкой файла e4xmi.
WorkbenchContext нашего приложения Eclipse RCP больше не является нашим обработчиком в атрибутах localValues, поэтому наш HIM не работает, потому что он не может выполнить обнаруженную команду. Если мы попытаемся выполнить команду через EHandlerService, это вызовет ошибку.
org.eclipse.core.commands.NotHandledException: для команды rf.command.configuration.addconfigurationsystem не существует обработчика
lHandlerService.executeHandler(lCmd);
Вот как мы динамически заполняем нашу FirstPage HIM:
final EHandlerService lHandlerService = pContext.get(EHandlerService.class);
final ECommandService lCommandService = pContext.get(ECommandService.class);
EModelService lModelService = pContext.get(EModelService.class);
ImageRegistry lImageRegistry = pContext.get(ImageRegistry.class);
for (IConfigurationElement lElt : lReg
.getConfigurationElementsFor(EXTENSION_ID)) {
logger.info("Extension ID: {}", EXTENSION_ID);
List<MHandledToolItem> lItems = lModelService.findElements(lWindow,
lElt.getAttribute(TOOLITEM_ID), MHandledToolItem.class, null);
logger.info("ToolItem Id {}",lElt.getAttribute(TOOLITEM_ID));
for (final MHandledToolItem lItem : lItems) {
logger.info("Processing tool item ID: {}", lItem.getElementId());
logger.info("Processing tool item Class : {}", lItem.getClass());
logger.info("Processing tool item, Command ID: {}", lItem.getCommand().getElementId());
Object handler = pContext.getActiveLeaf().get("handler::" + lItem.getCommand().getElementId());
logger.info("Object handler : {}", handler);
ToolItem lToolItem = new ToolItem(lToolBar, SWT.NONE);
lToolItem.setImage(lImageRegistry.get(lElt.getAttribute(IMAGE_URI)));
lToolItem.setToolTipText(lItem.getTooltip());
lToolItem.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent pEvent) {
executeCommand(lItem);
}
@Override
public void widgetDefaultSelected(SelectionEvent pEvent) {
executeCommand(lItem);
}
private void executeCommand(MHandledToolItem pItem) {
MCommand lCommand = pItem.getCommand();
ParameterizedCommand lCmd = lCommandService.createCommand(
lCommand.getElementId(), null);
if (lHandlerService.canExecute(lCmd)) {
lHandlerService.executeHandler(lCmd);
}
}
});
}
}
}
The result of my log on Eclipse Juno :
INFO [main] [FirstPage.java:95] Processing tool item ID: rf.handledtoolitem.configuration.addconfigurationsystem
INFO [main] [FirstPage.java:97] Processing tool item Class : class org.eclipse.e4.ui.model.application.ui.menu.impl.HandledToolItemImpl
INFO [main] [FirstPage.java:98] Processing tool item, Command ID: rf.command.configuration.addconfigurationsystem
INFO [main] [FirstPage.java:101] Object handler : rf.configuration.administrator.handlers.system.AddConfigSystemHandler@847f3e7
Новый журнал в Eclipse 4.24:
INFO [main] [FirstPage.java:95] Extension ID: rf.plateform.tools.firstPage
INFO [main] [FirstPage.java:98] ToolItem Id rf..handledtoolitem.configuration.addconfigurationsystem
INFO [main] [FirstPage.java:101] Processing tool item ID: rf.handledtoolitem.configuration.addconfigurationsystem
INFO [main] [FirstPage.java:103] Processing tool item Class : class org.eclipse.e4.ui.model.application.ui.menu.impl.HandledToolItemImpl
INFO [main] FirstPage [FirstPage.java:104] Processing tool item, Command ID: rf.command.configuration.addconfigurationsystem
INFO [main] FirstPage [FirstPage.java:106] Object handler : null
Я проверил свой фрагмент.e4xmi, который идеально подходит
<elements xsi:type = "commands:Command" xmi:id = "_HTKGMPdqEeG-14Xhj6dtog" elementId = "rf.command.configuration.addconfigurationsystem" commandName = "Nouvelle configuration système"/>
<elements xsi:type = "commands:Handler" xmi:id = "_GxVLgPdqEeG-14Xhj6dtog" elementId = "rf.handler.configuration.addconfigurationsystem" contributionURI = "bundleclass://rf.configuration.view.administrator/rf.configuration.administrator.handlers.system.AddConfigSystemHandler" command = "_HTKGMPdqEeG-14Xhj6dtog"/>
Я также безуспешно пытался реализовать IHandler или расширить AbstractHandler до моего Handler:
@SuppressWarnings("restriction")
public class AddConfigSystemHandler {
/**
* Execution of the Command
*
* @param pPartManager
* PartByModel Service
* @param pConfigurationService
* Configuration Service
*/
@Execute
public void execute(IModelService pConfigurationService, EPartManager pPartManager) {
// Creation of a new element
try {
Configuration lNewElement = (Configuration) pConfigurationService
.create((EObject) null, ConfigPackage.Literals.CONFIGURATION);
// Display the part
MPart lPart = pPartManager.showPart(
ConfigurationPartId.administrator, lNewElement);
lPart.setDirty(true);
} catch (ConfigurationException lException) {
MessageDialog.openError(null,
"Impossible to create the element of configuration",
lException.getMessage());
}
}
Каков процесс добавления его снова в WorkbenchContext?
Привет, Грег, мы уже всегда запускаем наше приложение с -clearPersistedState, чтобы быть уверенным, что модель каждый раз строится из фрагмента.
Содержит ли объединенный workbench.xmi
, сохраненный в .metadata/.plugins/org.eclipse.e4.workbench
, фрагмент?
Да, если вы говорите о workspace/.metadata
, у меня есть фрагмент, я вырезал информацию, чтобы ее было легче читать, я мог бы дать вам больше, если это будет полезно. XML <persistedState key = "memento" tooltip=".e4xmi&rf.configuration.view.administrator/fragmentquot;>
<persistable path="/rf.configuration.view.administrator/fragment.e4xmi"/>
<
В наших классах-обработчиках и фрагменте.e4xmi все было правильно настроено. Проблема возникла из-за нашего Application.e4xmi, у которого отсутствовал обработчик обработки Addon.
До нашей миграции Application.e4xmi обрабатывал только команды и привязки.
<addons xmi:id = "_2fQh2MauEeGMWL3OiqAGkw" elementId = "org.eclipse.e4.ui.workbench.contexts.model" contributionURI = "bundleclass://org.eclipse.e4.ui.workbench/org.eclipse.e4.ui.internal.workbench.addons.ContextProcessingAddon"/>
<addons xmi:id = "_2fQh2cauEeGMWL3OiqAGkw" elementId = "org.eclipse.e4.ui.workbench.bindings.model" contributionURI = "bundleclass://org.eclipse.e4.ui.workbench.swt/org.eclipse.e4.ui.workbench.swt.util.BindingProcessingAddon"/>
Но в Eclipse 4.24 нам пришлось добавить эти дополнения в контекст, чтобы EclipseContext мог правильно читать и находить классы Handler.
<addons xmi:id = "_6wlLdsgZEeSyMNYR5xypkQ" elementId = "org.eclipse.e4.ui.workbench.handler.model" contributionURI = "bundleclass://org.eclipse.e4.ui.workbench/org.eclipse.e4.ui.internal.workbench.addons.HandlerProcessingAddon"/>
Сохраняется ли состояние рабочей среды и, возможно, используется старое состояние — попробуйте запустить с помощью
-clearPersistedState
.