Набор действий утилиты readme также определяет действия с изменяемыми целями. Действие остается видимым, пока остается видимым набор действий readme, но только пока панель или редактор, реализующий действие, активны. При использовании наборов действий для указания действий с изменяемыми целями, действия создаются в описании набора действий, а не в коде. Ниже приведен фрагмент определения набора действий утилиты readme:
<extension point = "org.eclipse.ui.actionSets"> <actionSet id="org_eclipse_ui_examples_readmetool_actionSet" label="%ActionSet.name" visible="true"> ... <action id="org_eclipse_ui_examples_readmetool_readmeRetargetAction" menubarPath="window/org_eclipse_ui_examples_readmetool/slot1" toolbarPath="readme" label="%ReadmeRetargetAction.label" tooltip="%ReadmeRetargetAction.tooltip" helpContextId="org.eclipse.ui.examples.readmetool.open_browser_action_context" icon="icons/ctool16/openbrwsr.png" retarget="true"> </action> <action id="org_eclipse_ui_examples_readmetool_readmeRelabelRetargetAction" menubarPath="window/org_eclipse_ui_examples_readmetool/slot1" toolbarPath="readme" label="%ReadmeRelabelRetargetAction.label" tooltip="%ReadmeRelabelRetargetAction.tooltip" helpContextId="org.eclipse.ui.examples.readmetool.open_browser_action_context" icon="icons/ctool16/openbrwsr.png" retarget="true" allowLabelUpdate="true"> </action> ...
Действия с изменяемыми целями задаются с помощью атрибута retarget="true". Это приводит к созданию RetargetAction в наборе действий. Обратите внимание, что действия с изменяемыми целями не указывают реализующий класс, так как каждая панель или редактор в модуле может самостоятельно создать обработчик, реализующий каждое действие. Если allowLabelUpdate имеет значение истина, то вместо этого будет создан LabelRetargetAction .
Действия с изменяемыми целями будут показаны в меню окна, когда набор действий readme будет видимым. Однако они не будут доступны, если редактор утилиты readme или панель Схема не будут активны.
Что должны делать панель и редактор? Как и ранее, клиентская часть похожа на регистрацию обработчика для рабочей среды или действие редактора с изменяемой целью. Указанный в описании ИД действия следует использовать при регистрации обработчика глобальных действий.
ReadmeEditorActionBarContributor выполняет это для редактора. Сначала задаются обработчики для действий.
public ReadmeEditorActionBarContributor() { ... handler4 = new EditorAction(MessageUtil.getString("Editor_Action4")); handler5 = new EditorAction(MessageUtil.getString("Editor_Action5")); handler5.setToolTipText(MessageUtil.getString("Readme_Editor_Action5")); ... }
Обработчики регистрируются одновременно с регистрацией обработчиков действий редактора с изменяемыми целями.
public void init(IActionBars bars, IWorkbenchPage page) { ... bars.setGlobalActionHandler(IReadmeConstants.ACTION_SET_RETARGET4, handler4); bars.setGlobalActionHandler(IReadmeConstants.ACTION_SET_LABELRETARGET5, handler5); ... }
Вспомните, что дополняющие классы панели действий являются общими для различных экземпляров одного редактора. Это означает, что обработчики должны быть уведомлены, если активный редактор для ReadmeEditorActionBarContributor был изменен.
public void setActiveEditor(IEditorPart editor) { ... handler4.setActiveEditor(editor); handler5.setActiveEditor(editor); ... }
Для редактора больше ничего не требуется. При активации редактора эти действия должны становиться доступными.
Обратите внимание, метка для первого действия с изменяемыми целями ("Editor Action 4") не использована, так как в XML набора действий не задан allowLabelUpdate.
ReadmeContentOutlinePage задает свои обработчики там же, где были определены обработчики действий редактора с изменяемыми целями:
public void createControl(Composite parent) { ... action = new OutlineAction(MessageUtil.getString("Outline_Action4")); getSite().getActionBars().setGlobalActionHandler( IReadmeConstants.ACTION_SET_RETARGET4, action); action = new OutlineAction(MessageUtil.getString("Outline_Action5")); action.setToolTipText(MessageUtil.getString("Readme_Outline_Action5")); getSite().getActionBars().setGlobalActionHandler( IReadmeConstants.ACTION_SET_LABELRETARGET5, action); }
При включении схематичного представления содержимого эти действия с измененными метками должны быть видимыми.