Как отобразить действия отмены и повтора на панели инструментов в приложении rcp

#java #eclipse #swt #rcp

#java #eclipse #swt #rcp

Вопрос:

Я работаю над приложением rcp с панелью инструментов для быстрого доступа к определенным действиям, включая отмену и повтор. Моя проблема в том, что эти два конкретных действия не отображаются на панели инструментов. Я обнаружил причину в workbench.xmi файле, который генерируется при запуске приложения. Тег persistedState с атрибутом key="persp.hiddenItems" содержится persp.hideToolbarSC:org.eclipse.ui.edit.undo,persp.hideToolbarSC:org.eclipse.ui.edit.redo в value="..." атрибуте. Если я удалю эти записи из workbench.xmi , действия отмены и повтора отображаются на панели инструментов так, как они должны.

Мой вопрос: что я могу сделать, чтобы org.eclipse.ui.edit.undo и org.eclipse.ui.edit.redo изначально не попадали в этот атрибут?

Изначально я использовал eclipse neon без этой проблемы, но при обновлении до eclipse 2018-12 это начало происходить.

Редактировать:

Я, наконец, заставил это работать, изменив идентификаторы моих действий отмены и повтора на что-то другое. Мне пришлось установить идентификатор с помощью setId(...) и setActionDefinedId(...) в конструкторах действий, а затем команды должны были быть определены в plugin.xml под <extension point="org.eclipse.ui.commands"> в <command id="..." name="Undo"></command> теге.

Это решение больше похоже на обходной путь, чем на реальное решение, но оно работает для меня.

Ответ №1:

Это задается hiddenToolBarItem элементом org.eclipse.ui.perspectiveExtensions точки расширения.

org.eclipse.ui.ide Плагин использует это, чтобы отключить эти элементы панели инструментов:

   <extension
         point="org.eclipse.ui.perspectiveExtensions">
      <perspectiveExtension targetID="*">
         <!--
              disable "print" button which is defined by org.eclipse.ui.actions.ActionFactory.PRINT
              and contributed by org.eclipse.ui.internal.ide.WorkbenchActionBuilder
         -->
         <hiddenToolBarItem id="print" />
         <!--
              disable "undo" button which is defined by org.eclipse.ui.actions.ActionFactory.UNDO
              and contributed by org.eclipse.ui.internal.ide.WorkbenchActionBuilder
         -->
         <hiddenToolBarItem id="org.eclipse.ui.edit.undo" />
         <!--
              disable "redo" button which is defined by org.eclipse.ui.actions.ActionFactory.REDO
              and contributed by org.eclipse.ui.internal.ide.WorkbenchActionBuilder
         -->
         <hiddenToolBarItem id="org.eclipse.ui.edit.redo" />
      </perspectiveExtension>
   </extension>
  

Я не вижу способа очистить это, кроме как исключить подключаемый модуль.

Комментарии:

1. Похоже, что приложению это необходимо org.eclipse.ui.ide , поэтому исключение этого не сработало бы для меня. Еще одна вещь, которую я пробовал, — это присвоить моим действиям отмены и повтора разные идентификаторы, что, похоже, в какой-то степени работает. Проблема в том, что исключения выводятся на консоль. Я обновлю вопрос с помощью этой информации.

2. Неважно, я заставил это работать, изменив идентификаторы. Я обновлю свой запрос тем, что я должен был сделать.

Ответ №2:

Я столкнулся с той же проблемой. Отмена / повтор исчезли после обновления до eclipse 2019.

Один из способов переопределить жесткое кодирование в глобальном параметре перспективы org.eclipse.ui.ide — это напрямую изменить состояние перспективы. Например. в ApplicationWorkbenchWindowAdvisor.postWindowOpen()

         WorkbenchPage page = (WorkbenchPage) PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
            String str = page.getCurrentPerspective().getPersistedState().get(ModeledPageLayout.HIDDEN_ITEMS_KEY);
            str=str.replace("persp.hideToolbarSC:org.eclipse.ui.edit.undo,", "");
            str=str.replace("persp.hideToolbarSC:org.eclipse.ui.edit.redo,", "");
            page.getCurrentPerspective().getPersistedState().put(ModeledPageLayout.HIDDEN_ITEMS_KEY,str);