Auparavant, les menus contextuels de quelques applications étaient limités par l'exclusion de certaines options de menu. Cela était en fonction des informations périphériques recensées, par exemple, le nombre de ressources sélectionnées, le nom physique du fichier, le type de ressource, etc. Dans certains cas, une quantité limitée d'informations relatives au contenu d'une ressource était disponible, ce qui réduisait considérablement les options de menu inutilisables. Les informations de ce type pouvaient être très utiles dans un fichier XML dans la mesure où il existe de nombreuses situations où une action est applicable à un seul type de fichier XML et non à d'autres, par exemple, les fichiers XML qui contiennent des scripts Ant. L'action Exécuter Ant..., qui est logique dans son menu contextuel, ne s'applique pas un fichier XML qui sert à définir un plug-in.
Grâce à l'ajout du point d'extension, org.eclipse.core.runtime.contentTypes, Eclipse propose désormais un 'type de contenu' permettant aux plug-in de contribuer au catalogue de types de contenu de plateforme ; en outre, des classes appelées descripteurs de type de contenu sont également disponibles. Pour les développeurs qui fournissent leur propre type de contenu, les deux descripteurs de type de contenu intégrés personnalisables sont disponibles : BinarySignatureDescriber (pour les types de contenu binaires) et XMLRootElementContentDescriber (pour les types de contenu XML au format texte). En outre, les fournisseurs de plug-in peuvent créer leurs propres descripteurs de contenu. Pour plus de détails, voir Platform Plug-in Developer Guide (Guide du programmeur > Présentation de l'exécution > Types de contenu).
Il est désormais possible de définir des contributions d'objet spécifiques à un fichier XML qui est doté d'une balise de niveau supérieur donnée ou qui indique un DTD donné. Pour cela, définissez une extension sur le point d'extension org.eclipse.core.runtime.contentTypes à l'aide d'une classe de descripteur de XMLRootElementContentDescriber et des paramètres indiquant le nom de la balise de niveau supérieur ou le nom de dtd, en procédant comme suit :
<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=valeur_balise /> </describer> </content-type> </extension>ou
<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=valeur_dt /> </describer> </content-type> </extension>
où valeur_balise représente le nom de la balise de niveau supérieure correspondante, etvaleur_dt représente le nom de DTD, comme indiqué dans le fichier XML.
Prenez en considération la contribution d'objet suivante dans un fichier 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>
Cela permet d'afficher action1 pour tout IFile dont le nom correspond à *.xml, à condition qu'il contienne myTag comme balise XML de niveau supérieur ou qu'il utilise le DTD intitule myDTD.xml. Les fichiers XML suivants sont donc concordants :
<?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>
ou
<?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 est un descripteur de contenu qui détecte une 'signature' binaire spécifiée dans une position donnée d'un fichier. Ce descripteur est utilisé de la même façon que XMLRootElementContentDescriber à ceci près qu'il utilise les paramètres "signature", "offset" et "required" à la place des paramètres "element" ou "dtd". La documentation Java de BinarySignatureDescriber contient des détails complets sur la syntaxe de classe de ce descripteur de contenu.