Příspěvky objektů v závislosti na obsahu

Dříve byly kontextové nabídky některých aplikací omezeny vyloučením určitých voleb nabídek. To bylo založeno na známých periferních informacích, jako je počet vybraných prostředků, fyzický název souboru, typ prostředku atd. V některých instancích bylo známo omezené množství informací o obsahu prostředku a toto významně snížilo počet nepoužitelných voleb nabídek. Takové informace by mohly mít rozsáhlé využití u souboru XML, jelikož existuje mnoho situací, ve kterých je nějaká akce použitelná pro jeden typ souboru XML a není pro jiný, jako např. pro soubory XML obsahující skripty Ant. Akce Spustit Ant..., která je logická v jejich kontextové nabídce, není akcí použitelnou u souboru XML, který je použit k definici modulu plug-in.

S dodatkem bodu rozšíření, org.eclipse.core.runtime.contentTypes, platforma Eclipse nyní nabízí 'typ obsahu', který umožňuje modulům plug-in přispívat do Katalogu typů obsahu platformy, a dále jsou také dostupné třídy nazývané Popisovač typu obsahu (Content Type Describer). Pro vývojáře poskytující vlastní typy obsahu jsou k dispozici dva přizpůsobitelné vestavěné popisovače typu obsahu: BinarySignatureDescriber (pro binární typy obsahu) a XMLRootElementContentDescriber (pro textové typy obsahu založené na XML). Navíc mohou poskytovatelé modulů plug-in vytvářet své vlastní popisovače obsahu - podrobné informace najdete v části Příručka vývojáře modulu plug-in platformy (Příručka programátora > Přehled běhového modulu > Typy obsahu).

XMLRootElementContentDescriber

Nyní je možné definovat příspěvky objektu specifické k souboru XML danou značkou nejvyšší úrovně nebo toto specifikuje daná definice typu dokumentu DTD. Chcete-li toto provést, definujte rozšíření k bodu rozšíření org.eclipse.core.runtime.contentTypes extension pomocí třídy popisovače XMLRootElementContentDescriber a parametrů indikujících název značky nejvyšší úrovně nebo název DTD následujícím způsobem:

   <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>
nebo
   <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>
kde tagValue představuje název značky nejvyšší úrovně k odsouhlasení a

dtdValue představuje název DTD, jak se zobrazuje v souboru XML.

Uvažujme následující příspěvek objektu v souboru 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>

Toto zviditelní action1 pro každý soubor IFile s názvem odpovídajícím *.xml za předpokladu, že obsahuje myTag jako značku XML nejvyšší úrovně nebo používá DTD s názvem myDTD.xml. Takže odpovídat budou následující soubory:

<?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>

nebo

<?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 je popisovač obsahu, který detekuje zadaný binární 'podpis' na daném offsetu v rámci souboru. Tento popisovač se používá stejným způsobem jako XMLRootElementContentDescriber s výjimkou toho, že přebírá parametry "signature", "offset" a "required" namísto "element" nebo "dtd". Dokumentace Javadoc pro popisovač BinarySignatureDescriber nabízí všechny podrobnosti o použití této třídy popisovače obsahu.