Вклады объектов, зависящие от контента

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

XMLRootElementContentDescriber

С их помощью возможно задать вклад объектов для конкретного файла 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

BinarySignatureDescriber - это описатель контента, который находит заданную двоичную 'сигнатуру' по заданному смещению в файле. Этот описатель используется также, как и XMLRootElementContentDescriber, но принимает параметры "signature", "offset" и "required" вместо "element" or "dtd". В Javadoc для BinarySignatureDescriber приведены подробные сведения об использовании этого класса описателя контента.