Действия с изменяемыми целями

Распространенной практикой для панелей и редакторов модулей является реализация действий, семантически схожих с имеющимися действиями рабочей среды, наподобие команд Вырезать, Скопировать, Вставить буфера обмена, Обновить панель или Свойства.  Всплывающие меню панелей или редакторов могут стать громоздкими, если каждая панель или редактор будет задавать уникальные действия для этих операций и включать их в свои меню. 

Для решения этой проблемы рабочая среда определяет действия с изменяемыми целями (также называемые глобальными), которые могут быть обработаны любой панелью или редактором.  Когда панель или редактор активен, при выборе действия из меню или панели инструментов рабочей среды выполняется его обработчик.  Это позволяет панелям и редакторам иметь общее пространство меню для семантически схожих действий.

IWorkbenchActionConstants документирует все действия рабочей среды и обозначает действия с изменяемыми целями как глобальные.  Например, ниже приведено определение действия Properties.

public static final String PROPERTIES = "properties"; // глобальное. 

В следующей таблице приведены сведения о некоторых наиболее часто используемых действиях с изменяемыми целями, реализованными панелями и редакторами:

  Меню Файл Меню Правка Меню Навигация Меню Проект
панели переместить
переименовать
обновить
свойства
  перейти к
перейти к ресурсу
синхронизация с редактором
назад
переслать
вверх
далее
назад
открыть
закрыть
скомпоновать
перекомпоновать
редакторы вернуть
печать
поиск    
панели и редакторы   вырезать
копировать
вставить
удалить
выбрать все
отменить
повторить
   

Действия с изменяемыми целями создаются с помощью RetargetAction.  Ниже приведен фрагмент из WorkbenchActionBuilder.

 propertiesAction = createGlobalAction(IWorkbenchActionConstants.PROPERTIES, "file", false); 

Метод createGlobalAction задает, как можно создавать RetargetAction.

private RetargetAction createGlobalAction(String id, String actionDefPrefix, boolean labelRetarget) {
	RetargetAction action;
	if (labelRetarget) {
		action = new LabelRetargetAction(id, WorkbenchMessages.getString("Workbench." + id)); 
	}
	else {
		action = new RetargetAction(id, WorkbenchMessages.getString("Workbench." + id)); 
	}
	...
	return action;
}

При создании действия с изменяемой целью рабочая среда присваивает ИД для действия и метку по умолчанию.  Обратите внимание, что есть два стиля изменения целей действий.  RetargetAction просто позволяет панели или редактору повторно реализовать действие.  LabelRetargetAction также позволяет панелям и редакторам сбросить метку действия.   Это удобно для того, чтобы сделать метку меню более конкретной, например сменить метку действия Отменить на Отменить ввод текста.  

Так задаются действия с изменяемыми целями в рабочей среде.  Рассмотрим, как панели и редакторы предоставляют реализацию действий с изменяемыми целями.  Это делается с помощью Задания обработчика глобальных событий.