Ранее мы видели, как из контекстных меню некоторых приложений исключались заданные опции. Это было возможно с учетом периферийной информации, такой как число выбранных ресурсов, имя файла на диске, тип ресурса и т.д. Иногда была доступна также какая-то информация о содержимом ресурса, что позволяло заметно уменьшить число неиспользуемых опций меню. Такая информация могла бы быть успешно использована в файле XML. Существует множество ситуаций, в которых действие применимо для одного типа XML, но неприменимо для другого, как для файлов XML, содержащих сценарии Ant. Действие Запустить Ant..., логичное для контекстного меню такого сценария, неприменимо к файлу XML, определяющему модуль.
Вместе с реализацией точки расширения, org.eclipse.core.runtime.contentTypes, Eclipse поддерживает параметр 'content type'. Благодаря этому модули могут вносить свой вклад в каталог типов контента Платформы. Кроме того, доступны также классы, называемые описателями типа контента. Для разработчиков, создающих собственные типы контента, существуют два настраиваемых встроенных описателя типа контента: BinarySignatureDescriber (для двоичных типов) и XMLRootElementContentDescriber (для текстовых типов, основанных на XML). Поставщики модулей могут также создавать и свои собственные описатели контента. Подробные сведения об этом приведены в документе Platform Plug-in Developer Guide (Programmer's Guide > Runtime overview > Content types).
С их помощью возможно задать вклад объектов для конкретного файла XML с помощью тега верхнего уровня или задания DTD. Для того чтобы это осуществить, задайте расширения точки org.eclipse.core.runtime.contentTypes с классом описания XMLRootElementContentDescriber и параметрами, задающими тег верхнего уровня или файл dtd, как показано ниже:
<extension
point="org.eclipse.core.runtime.contentTypes">
<content-type
id=<id>
name=<name>
base-type="org.eclipse.core.runtime.xml">
<describer class="org.eclipse.core.runtime.content.XMLRootElementContentDescriber">
<parameter name="element" value=tagValue />
</describer>
</content-type>
</extension> или <extension
point="org.eclipse.core.runtime.contentTypes">
<content-type
id=<id>
name=<name>
base-type="org.eclipse.core.runtime.xml">
<describer class="org.eclipse.core.runtime.content.XMLRootElementContentDescriber">
<parameter name="dtd" value=dtdValue />
</describer>
</content-type>
</extension>
где tagValue представляет имя тега верхнего уровня,а dtdValue - имя DTD, указанного в файле XML.
Рассмотрим следующий вклад объекта в файл plugin.xml:
<extension
point="org.eclipse.core.runtime.contentTypes">
<content-type
id="topElementContentType"
name="Проверка распознавания элемента верхнего уровня"
base-type="org.eclipse.core.runtime.xml"
priority="high">
<describer class="org.eclipse.core.runtime.content.XMLRootElementContentDescriber">
<parameter name="element" value="myTag" />
</describer>
</content-type>
</extension>
<extension
point="org.eclipse.core.runtime.contentTypes">
<content-type
id="dtdContentType"
name="Проверка распознавания элемента dtd"
base-type="org.eclipse.core.runtime.xml"
priority="high">
<describer class="org.eclipse.core.runtime.content.XMLRootElementContentDescriber">
<parameter name="dtd" value="myDTD.xml" />
</describer>
</content-type>
</extension> <extension point="org.eclipse.ui.popupMenus">
<objectContribution
id="org.eclipse.ui.examples.objectContributions"
objectClass="org.eclipse.core.resources.IFile"
nameFilter="*.xml">
<visibility>
<or>
<objectState
name="contentTypeId"
value="org.eclipse.ui.examples.topElementContentType"/>
<objectState
name="contentTypeId"
value="org.eclipse.ui.examples.dtdContentType"/>
</or>
</visibility>
<action id="org.eclipse.ui.examples.objectContributions.action1"
label="%PopupMenus.action"
icon="icons/ctool16/openbrwsr.png"
menubarPath="additions"
class="org.eclipse.ui.examples.objectContributions.PopupMenuActionDelegate"
enablesFor="1">
</action>
</objectContribution>
</extension>
Действие action1 будет доступно в любом файле IFile, имя которого соответствует *.xml, если myTag - это тег верхнего уровня в XML или используется DTD с именем myDTD.xml. Следующие файлы XML удовлетворяют этим условиям:
<?xml version="1.0" encoding="UTF-8"?> <myTag id="org.eclipse.ui.workbench" name="%pluginName" version="3.0.0" provider-name="%providerName" class="org.eclipse.ui.internal.WorkbenchPlugin"> </myTag>
или
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE Book SYSTEM "myDTD.xml"> <fragment id="org.eclipse.ui.workbench" name="%pluginName" version="3.0.0" provider-name="%providerName" class="org.eclipse.ui.internal.WorkbenchPlugin"> <runtime> <library name="workbench.jar"> <export name="*"/> <packages prefixes="org.eclipse.ui, org.eclipse.jface"/> </library> </runtime> </fragment>
BinarySignatureDescriber - это описатель контента, который находит заданную двоичную 'сигнатуру' по заданному смещению в файле. Этот описатель используется также, как и XMLRootElementContentDescriber, но принимает параметры "signature", "offset" и "required" вместо "element" or "dtd". В Javadoc для BinarySignatureDescriber приведены подробные сведения об использовании этого класса описателя контента.