Точка расширения обработчиков - это развитие экспериментального элемента handlerSubmission
, появившегося в Eclipse 3.0. Обработчики задают поведение команды в зависимости от различных условий. У команды может быть как несколько обработчиков, так и не одного. Но в любой момент времени у нее может быть только один активный обработчик, либо его вообще может не быть. Активный обработчик отвечает за поведение команды в данный момент времени. Такая концепция аналогична концепции обработчиков действий и действий с переменными объектами.
Точка расширения обработчиков позволяет разработчикам модулей задавать условия, при которых те или иные обработчики должны становиться активными. Если обработчик неактивный, то команды не будут его использовать. Если обработчик отключен, то он не будет выполняться; его выполнение будет блокировано. Условия задаются с помощью языка выражений, добавленного в версии 3.0, через предложения activeWhen
и enabledWhen
.
Рабочая среда предоставляет некоторые переменные, от которых эти выражения зависят. Поддерживаемые переменные: активные контексты, активный редактор, активный компонент, текущее выделение. Не смотря на то, что это не предусмотрено изначально, все же возможно добавлять другие переменные вручную или из модулей.
Обработчик по умолчанию - это обработчик без указанных условий. Он становится активным только если условия остальных обработчиков не выполняются. Если условия выполняются у нескольких обработчиков, то будет произведено сравнение условий по степени важности. Больший приоритет будет иметь обработчик с более конкретными или локальными условиями. Для этого просматриваются переменные, на которые ссылается каждое условие. Условие, ссылающееся на более подробные переменные получит больший приоритет. Степень подробности (от наименьшей до наибольшей) определяется в org.eclipse.ui.ISources
.
Если конфликт разрешить не удается, то ни один их обработчиков не становится активным. При наличии соответствующей опции трассировки, это также приведет к записи сообщения в файл протокола. Конфликт также может возникнуть при наличии двух стандартных обработчиков. За то, чтобы это не произошло, должны отвечать разработчики модулей и интеграционные тестировщики. Условия используются для избежания ненужных загрузок модулей. За загрузку обработчиков отвечают классы-посредники. Для загрузки обработчика классом-посредником, должны выполняться условия обработчика, и он должен быть вызван командой.
<!ELEMENT extension (handler)>
<!ATTLIST extension
point CDATA #REQUIRED
id CDATA #IMPLIED
name CDATA #IMPLIED>
<!ELEMENT handler (activeWhen? | class? | enabledWhen?)>
<!ATTLIST handler
commandId CDATA #REQUIRED
class CDATA #IMPLIED>
<!ELEMENT activeWhen (not | and | or | instanceof | test | systemTest | equals | count | with | resolve | adapt | iterate)>
<!ELEMENT enabledWhen (not | and | or | instanceof | test | systemTest | equals | count | with | resolve | adapt | iterate)>
<!ATTLIST class
class CDATA #IMPLIED>
<!ELEMENT parameter EMPTY>
<!ATTLIST parameter
name CDATA #REQUIRED
value CDATA #REQUIRED>
<extension point=
"org.eclipse.ui.handlers"
>
<handler commandId=
"commandId"
class=
"org.eclipse.compare.Command"
>
<activeWhen>
<with variable=
"selection"
>
<count value=
"1"
/>
<iterate operator=
"and"
>
<adapt type=
"IResource"
/>
</iterate>
</with>
</activeWhen>
</handler>
</extension>
Для избежания загрузки модуля можно также указать условия, при каких он включен. Если класс-посредник еще не загрузил обработчика, то для определения, включен ли он, используются только выражения. Если обработчик уже загружен, то выражения используются первыми. Если выражения равны true, то самому обработчику поступает запрос о его состоянии (иными словами, это "логическое И" между выражениями и состоянием обработчика).
<extension point=
"org.eclipse.ui.handlers"
>
<handler commandId=
"commandId"
class=
"org.eclipse.Handler"
>
<enabledWhen>
<with variable=
"context"
>
<property id=
"id"
value=
"debugging"
/>
</with>
</enabledWhen>
</handler>
</extension>
Все обработчики должны реализовывать org.eclipse.core.commands.IHandler
. В рамках рабочей среды, обработчики можно активировать и дезактивировать с помощью интерфейса org.eclipse.ui.handlers.IHandlerService
. Он может быть получен из объектов, поддерживающих рабочую среду, в т.ч. из самого IWorkbench
. Для этого нужно использовать вызов наподобие IWorkbench.getAdapter(IHandlerService.class)
.
Активировать и дезактивировать обработчики можно также с помощью кода в рабочей среде. Для этого нужно использовать механизм, показанный ниже. Он полезен для клиентов, дополняющих меню и панели инструментов с помощью действий.
IWorkbenchPartSite mySite; IAction myAction; myAction.setActionDefinitionId(commandId); IKeyBindingService service = mySite.getKeyBindingService(); service.registerAction(myAction);
Copyright (c) 2005 IBM Corporation и другие.
Все права защищены. Эта программа и сопутствующие материалы распространяются на условиях Eclipse Public License v1.0, поставляемой вместе с продуктом и доступной на Web-сайте
http://www.eclipse.org/legal/epl-v10.html