Ранее мы видели, как из контекстных меню некоторых приложений исключались заданные опции. Это было возможно с учетом периферийной информации, такой как число выбранных ресурсов, имя файла на диске, тип ресурса и т.д. Иногда была доступна также какая-то информация о содержимом ресурса, что позволяло заметно уменьшить число неиспользуемых опций меню. Такая информация могла бы быть успешно использована в файле 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 приведены подробные сведения об использовании этого класса описателя контента.