内容相关对象添加项

以前,通过排除特定菜单选项来限制某些应用程序的上下文菜单。此行为基于已知外围信息的,例如,所选资源的数目、文件的物理名称以及资源的类型等等。在某些情况下,对于资源的内容知道的信息有限,这会大大减少不可用的菜单选项。这些信息在 XML 文件中可发挥巨大的作用,因为在很多情况下,某个操作适用于某种类型的 XML 文件但不适用于另一种类型的 XML 文件(例如,包含 Ant 脚本的 XML 文件)。操作运行 Ant... 虽然在上下文菜单中是符合逻辑的,但它不是适用于用来定义插件的 XML 文件的操作。

通过添加扩展点 org.eclipse.core.runtime.contentTypes,Eclipse 现在提供一种“内容类型”,允许将插件添加到“平台”内容类型目录,另外,还提供了称为“内容类型描述器”的类。对于提供他们自己的内容类型的开发者,提供了两种可定制的内置内容描述器:BinarySignatureDescriber(用于二进制内容类型)和 XMLRootElementContentDescriber(用于文本和基于 XML 的内容类型)。此外,插件提供者可创建他们自己的内容描述器,有关详细信息,请参阅 Platform Plug-in Developer Guide(Programmer's Guide > Runtime overview > Content types)。

XMLRootElementContentDescriber

现在可以定义特定于具有给定顶级标记或指定给定 DTD 的 XML 文件的对象添加项。为此,使用 XMLRootElementContentDescriber 的描述器类和指示顶级标记名称或 DTD 名称的参数定义对 org.eclipse.core.runtime.contentTypes 扩展点的扩展,如下所示:

      <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 表示在 XML 文件中看到的 DTD 的名称。

考虑 plugin.xml 文件中的以下对象添加项:

      <extension
       point="org.eclipse.core.runtime.contentTypes">
       <content-type
           id="topElementContentType"
           name="Tests top-level element recognition" 	
           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="Tests dtd element recognition" 	
           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>

只要 IFile 只要包含 myTag 作为顶级 XML 标记或使用名为 MyDTD.xml 的 DTD,就会使得名为 *.xml 的任何 IFile 可看到 action1。因此下列 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 是检测文件内给定位移处的指定二进制“特征符”的内容描述器。除了此描述器使用参数“signature”、“offset”和“required”而不使用“element”或“dtd”之外,它的使用方式与 XMLRootElementContentDescriber 相同。BinarySignatureDescriber 的 Javadoc 提供了有关此内容描述器的类用法的完整详细信息。