Наборы действий с изменяемыми целями

Набор действий утилиты 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 или панель Схема не будут активны.

Меню редактора файлов 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);
	...
}

Для редактора больше ничего не требуется.  При активации редактора эти действия должны становиться доступными.

Меню редактора файлов Readme с доступным действиями 

Обратите внимание, метка для первого действия с изменяемыми целями ("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);
}

При включении схематичного представления содержимого эти действия с измененными метками должны быть видимыми.

Меню редактора файлов Readme с переименованным действием