以前,通过排除特定菜单选项来限制某些应用程序的上下文菜单。此行为基于已知外围信息的,例如,所选资源的数目、文件的物理名称以及资源的类型等等。在某些情况下,对于资源的内容知道的信息有限,这会大大减少不可用的菜单选项。这些信息在 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)。
现在可以定义特定于具有给定顶级标记或指定给定 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 是检测文件内给定位移处的指定二进制“特征符”的内容描述器。除了此描述器使用参数“signature”、“offset”和“required”而不使用“element”或“dtd”之外,它的使用方式与 XMLRootElementContentDescriber 相同。BinarySignatureDescriber 的 Javadoc 提供了有关此内容描述器的类用法的完整详细信息。