Включение и/или область видимости действия определяются с помощью элементов enablement и visibility соответственно. В обоих этих элементах содержится вычисляемое булевское выражение.
Синтаксис элементов enablement и visibility одинаков. Оба содержат только один субэлемент - булевское выражение. В простейшем случае это элемент objectClass, objectState, pluginState или systemProperty. В более сложном случае в булевское выражение могут быть добавлены элементы and, or и not. У элементов and и or должно быть по два субэлемента. У элемента not - один субэлемент.
<!ELEMENT extension (actionSet+)>
<!ATTLIST extension
point CDATA #REQUIRED
id CDATA #IMPLIED
name CDATA #IMPLIED>
<!ELEMENT actionSet (menu* , action*)>
<!ATTLIST actionSet
id CDATA #REQUIRED
label CDATA #REQUIRED
visible (true | false)
description CDATA #IMPLIED>
Этот элемент служит для определения группы действий и меню.
<!ELEMENT action (selection* | enablement?)>
<!ATTLIST action
id CDATA #REQUIRED
label CDATA #REQUIRED
accelerator CDATA #IMPLIED
definitionId CDATA #IMPLIED
menubarPath CDATA #IMPLIED
toolbarPath CDATA #IMPLIED
icon CDATA #IMPLIED
disabledIcon CDATA #IMPLIED
hoverIcon CDATA #IMPLIED
tooltip CDATA #IMPLIED
helpContextId CDATA #IMPLIED
style (push|radio|toggle|pulldown) "push"
state (true | false)
pulldown (true | false)
class CDATA #IMPLIED
retarget (true | false)
allowLabelUpdate (true | false)
enablesFor CDATA #IMPLIED>
Этот элемент определяет действие, которое пользователь может выполнять в UI.
push | - обычный пункт меню или панели инструментов. | |
radio | - пункт меню или панели инструментов в виде радиокнопки. Действия стиля radio в пределах данной группы в меню или панели инструментов объединяются в набор радиокнопок. Начальное значение задается атрибутом state. | |
toggle | - пункт меню в виде галочки или пункт панели инструментов в виде переключателя. Начальное значение задается атрибутом state. | |
pulldown | - пункт меню в виде каскадного меню или пункт панели инструментов в виде выпадающего меню. |
! | - не выбран ни один элемент | |
? | - выбрано не более одного элемента | |
+ | - выбрано не менее одного элемента | |
multiple, 2+ | - выбрано не менее двух элементов | |
n | - точное число выбранных элементов. Например, enablesFor=" 4" включает действие только в том случае, если выбрано четыре элемента | |
* | - выбрано произвольное число элементов |
<!ELEMENT menu (separator+ , groupMarker*)>
<!ATTLIST menu
id CDATA #REQUIRED
label CDATA #REQUIRED
path CDATA #IMPLIED>
Этот элемент служит для определения нового меню.
<!ELEMENT separator EMPTY>
<!ATTLIST separator
name CDATA #REQUIRED>
Этот элемент служит для создания разделителя меню в новом меню.
<!ELEMENT groupMarker EMPTY>
<!ATTLIST groupMarker
name CDATA #REQUIRED>
Этот элемент служит для создания группы с именем в новом меню. В отличие от элемента separator, он не представлен визуально в новом меню.
<!ELEMENT selection EMPTY>
<!ATTLIST selection
class CDATA #REQUIRED
name CDATA #IMPLIED>
Этот элемент помогает выяснить, включено ли действие, на основе текущего выбора. Если задан элемент enablement, то данный элемент игнорируется.
<!ELEMENT enablement (and | or | not | objectClass | objectState | pluginState | systemProperty)>
Этот элемент служит для определения состояния активности расширения.
<!ELEMENT visibility (and | or | not | objectClass | objectState | pluginState | systemProperty)>
Этот элемент служит для определения состояния видимости расширения.
<!ELEMENT and (and | or | not | objectClass | objectState | pluginState | systemProperty)>
Это - булевская операция AND над результатами вычисления двух операндов выражения.
<!ELEMENT or (and | or | not | objectClass | objectState | pluginState | systemProperty)>
Это - булевская операция OR над результатами вычисления двух операндов выражения.
<!ELEMENT not (and | or | not | objectClass | objectState | pluginState | systemProperty)>
Это - булевская операция NOT над результатами вычисления двух операндов выражения.
<!ELEMENT objectClass EMPTY>
<!ATTLIST objectClass
name CDATA #REQUIRED>
Этот элемент служит для проверки класса или интерфейса каждого объекта в текущем выборе. Если каждый выбранный объект реализует заданный класс или интерфейс, то результатом выражения будет true.
<!ELEMENT objectState EMPTY>
<!ATTLIST objectState
name CDATA #REQUIRED
value CDATA #REQUIRED>
Этот элемент служит для проверки состояния атрибута каждого объекта в текущем выборе. Если у каждого выбранного объекта атрибут находится в заданном состоянии, то результатом выражения будет true. Для вычисления выражения этого типа каждый выбранный объект должен реализовывать интерфейс org.eclipse.ui.IActionFilter или преобразовывать к нему.
<!ELEMENT pluginState EMPTY>
<!ATTLIST pluginState
id CDATA #REQUIRED
value (installed|activated) "installed">
Этот элемент применяется для выяснения состояния модуля. Состояние модуля может принимать значения: installed (соответствует "resolved" в OSGi) или activated (соответствует "active" в OSGi).
<!ELEMENT systemProperty EMPTY>
<!ATTLIST systemProperty
name CDATA #REQUIRED
value CDATA #REQUIRED>
Этот элемент применяется для выяснения состояния некоторого системного свойства. Значение свойства извлекается из java.lang.System.
<extension point =
"org.eclipse.ui.actionSets"
>
<actionSet id=
"com.xyz.actionSet"
label=
"Действия"
>
<menu id=
"com.xyz.xyzMenu"
label=
"Меню XYZ"
path=
"additions"
>
<separator name=
"group1"
/>
<separator name=
"option1"
/>
</menu>
<action id=
"com.xyz.runXYZ"
label=
"&Запустить инструмент XYZ"
style=
"toggle"
state=
"false"
menubarPath=
"com.xyz.xyzMenu/group1"
icon=
"icons/runXYZ.gif"
tooltip=
"Запустить инструмент XYZ"
helpContextId=
"com.xyz.run_action_context"
class=
"com.xyz.actions.RunXYZ"
enablesFor=
"1"
>
<selection class=
"org.eclipse.core.resources.IFile"
name=
"*.java"
/>
</action>
<action id=
"com.xyz.runABC"
label=
"&Запустить инструмент ABC"
style=
"push"
menubarPath=
"com.xyz.xyzMenu/group1"
toolbarPath=
"Normal/XYZ"
icon=
"icons/runABC.gif"
tooltip=
"Запустить инструмент ABC"
helpContextId=
"com.xyz.run_abc_action_context"
retarget=
"true"
allowLabelUpdate=
"true"
>
<enablement>
<and>
<objectClass name=
"org.eclipse.core.resources.IFile"
/>
<not>
<objectState name=
"extension"
value=
"java"
/>
</not>
</and>
</enablement>
</action>
<action id=
"com.xyz.runDEF"
label=
"&Запустить инструмент DEF"
style=
"radio"
state=
"true"
menubarPath=
"com.xyz.xyzMenu/option1"
icon=
"icons/runDEF.gif"
tooltip=
"Запустить инструмент DEF"
class=
"com.xyz.actions.RunDEF"
helpContextId=
"com.xyz.run_def_action_context"
>
</action>
<action id=
"com.xyz.runGHI"
label=
"&Запустить инструмент GHI"
style=
"radio"
state=
"false"
menubarPath=
"com.xyz.xyzMenu/option1"
icon=
"icons/runGHI.gif"
tooltip=
"Запустить инструмент GHI"
class=
"com.xyz.actions.RunGHI"
helpContextId=
"com.xyz.run_ghi_action_context"
>
</action>
<action id=
"com.xyz.runJKL"
label=
"&Запустить инструмент JKL"
style=
"radio"
state=
"false"
menubarPath=
"com.xyz.xyzMenu/option1"
icon=
"icons/runJKL.gif"
tooltip=
"Запустить инструмент JKL"
class=
"com.xyz.actions.RunJKL"
helpContextId=
"com.xyz.run_jkl_action_context"
>
</action>
</actionSet>
</extension>
В приведенном выше примере указанный набор действий, названный "Действия", первоначально невидим во всех проекциях, потому что атрибут visible не задан.
Действие XYZ будет показано в виде пункта меню - переключателя, первоначального не отмеченного. Оно будет включено только в том случае, когда число выбранных элементов равно 1 и среди них есть ресурс файла Java.
Действие ABC будет показано и в меню, и в панели инструментов. Оно будет включено только в том случае, когда среди выбранных элементов нет ресурсов файлов Java. Заметьте, что это также перенаправляющее действие с меткой, поэтому оно не поддерживает атрибут class.
Действия DEF, GHI и JKL будут показаны в виде пунктов меню - радиокнопок. Они будут включены всегда, независимо от числа выбранных элементов.
Критерий включения для расширения действия первоначально определен элементом enablesFor, а также либо элементом selection, либо элементом enablement. Однако, если создан экземпляр делегата действия, то он может управлять состоянием активности действия непосредственно с помощью своего метода selectionChanged.
Важно отметить, что рабочая среда не создает меню от имени модуля. Пути к меню должны соответствовать уже существующим меню.
Метки действий и меню могут содержать специальные символы, обозначающие мнемоники, согласно следующим правилам:
Элементы selection и enablement взаимоисключающи. Элемент enablement может заменить элемент selection с помощью субэлементов objectClass и objectState. Например, фрагмент:
эквивалентен следующему:<selection class=
"org.eclipse.core.resources.IFile"
name=
"*.java"
>
</selection>
<enablement>
<and>
<objectClass name=
"org.eclipse.core.resources.IFile"
/>
<objectState name=
"extension"
value=
"java"
/>
</and>
</enablement>
Меню верхнего уровня создаются с помощью следующих значений атрибута path:
Группы по умолчанию в окне рабочей среды определяются в интерфейсе IWorkbenchActionConstants. Эти константы можно использовать в коде для динамического добавления. Значения можно также скопировать в файл XML для более сложной интеграции с существующими меню и панелью инструментов рабочей среды.
Различные пункты меню и панели инструментов в окне рабочей среды определяются алгоритмически. В этих случаях расширение окна следует выполнять с помощью отдельного механизма. Например, при добавлении новой панели рабочей среды в меню Проекция появляется новый пункт меню. Расширения - мастеры импорта, экспорта и создания также добавляются в окно автоматически.
Copyright (c) 2000, 2004 IBM Corporation and others.
Все права защищены. Эта программа и сопутствующие материалы распространяются на условиях Eclipse Public License v1.0, поставляемой вместе с продуктом и доступной на Web-сайте
http://www.eclipse.org/legal/epl-v10.html