Zuvor waren die Kontextmenüs einiger Anwendungen durch den Ausschluss bestimmter Menüoptionen begrenzt. Dies basierte auf den bekannten peripheren Informationen, wie z.B. Anzahl der ausgewählten Ressourcen, physischer Name der Datei, Typ der Ressource usw. In einigen Exemplaren war nur eine begrenzte Menge an Informationen über den Inhalt einer Ressource bekannt, und dies hat unverwendbare Menüoptionen deutlich verringert. Solche Informationen könnten in einer XML-Datei von großem Nutzen sein, da es zahlreiche Situationen gibt, in denen eine Aktion nur für einen Typ einer XML-Datei und nicht für einen anderen Typ ausführbar ist, z.B. XML-Dateien, die Ant-Scripts enthalten. Die Aktion Ant ausführen... ist, obschon sie logisch in ihrem Kontextmenü ist, keine Aktion, die auf eine XML-Datei anwendbar ist, die zur Definition eines Plug-ins verwendet wird.
Durch Hinzufügung des Erweiterungspunkts 'org.eclipse.core.runtime.contentTypes' stellt Eclipse nun einen 'Inhaltstyp' zur Verfügung, der die Aufnahme von Plug-ins in den Inhaltstypkatalog der Plattform erlaubt, Zusätzlich stehen auch Klassen namens 'Inhaltstypbeschreibungsfunktionen' zur Verfügung. Für Entwickler, die ihre eigenen Inhaltstypen zur Verfügung stellen, gibt es zwei anpassbare, integrierte Inhaltstypbeschreibungsfunktionen: 'BinarySignatureDescriber' (für Typen mit binärem Inhalt) und 'XMLRootElementContentDescriber' (für Typen mit auf XML basierendem Textinhalt). Zusätzlich können Plug-in-Provider ihre eigenen Inhaltsbeschreibungsfunktionen erstellen. Detaillierte Informationen dazu finden Sie im Plattform-Plug-in - Entwicklerhandbuch (Programmiererhandbuch > Übersicht über Laufzeit > Inhaltstypen).
Es besteht nun die Möglichkeit, Objektbeiträge spezifisch für eine XML-Datei, die ein bestimmtes Tag auf höchster Ebene hat oder eine bestimmte DTD angibt, zu definieren. Um dies zu tun, definieren Sie eine Erweiterung des Erweiterungspunkts 'org.eclipse.core.runtime.contentTypes' mit einer Beschreibungsfunktionsklasse 'XMLRootElementContentDescriber' und Parametern, die den Namen des Tags auf höchster Ebene oder den DTD-Namen wie folgt anzeigen:
<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>oder
<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>
wobei 'tagValue' den Namen des entsprechenden Tags auf höchster Ebene darstellt und'dtdValue' den Namen der DTD darstellt, so wie er in der XML-Datei zu sehen ist.
Beachten Sie den folgenden Objektbeitrag in einer plugin.xml-Datei:
<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>
Dadurch wird 'action1' sichtbar für jede IFile mit einem Namen, der mit '*.xml' übereinstimmt, vorausgesetzt, sie enthält 'myTag' als XML-Tag der höchsten Ebene oder sie verwendet die DTD mit dem Namen 'myDTD.xml'. Die folgenden XML-Dateien stimmen daher überein:
<?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>
oder
<?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>
Die Funktion 'BinarySignatureDescriber' ist eine Inhaltsbeschreibungsfunktion, die eine angegebene binäre 'Signatur' an einer bestimmten relativen Position innerhalb einer Datei entdeckt. Diese Beschreibungsfunktion wird in ähnlicher Weise wie die Funktion 'XMLRootElementContentDescriber' verwendet, mit der Ausnahme, dass sie die Parameter "Signatur", "relative Position" und "erforderlich" anstelle von "Element" oder "DTD" übernimmt. Die Javadoc für BinarySignatureDescriber enthält alle Einzelheiten über die Verwendung dieser Inhaltsbeschreibungsfunktionsklasse.