Obiekty dodawane zależnie od treści

Do niedawna menu kontekstowe niektórych aplikacji były ograniczone ze względu na wykluczenie niektórych opcji menu. Było to zależne od znanych informacji peryferyjnych, takich jak liczba wybranych zasobów, fizyczna nazwa pliku, typ zasobu itd. W niektórych przypadkach dostępna była ograniczona ilość informacji o treści zasobu, co pozwalało znacząco zredukować nieprzydatne opcje menu. Takie informacje mogą być szczególnie przydatne w przypadku pliku XML, ponieważ istnieje wiele sytuacji, w których dana akcja odnosi się tylko do określonego typu pliku XML (na przykład do plików XML zawierających skrypty Ant). Z logicznego punktu widzenia akcja Wykonaj Ant należy do menu kontekstowego pliku XML służącego do definiowania modułu dodatkowego, ale nie odnosi się do tego pliku.

Dzięki dodaniu punktu rozszerzenia org.eclipse.core.runtime.contentTypes środowisko Eclipse udostępnia obecnie typ treści, dzięki czemu moduły dodatkowe mogą rozszerzać katalog typów treści tej platformy. Co więcej, dostępne są również klasy nazywane obiektami opisu typu treści. Dla programistów dostarczających własne typy treści zapewniono dwa wbudowane, dostosowywalne obiekty opisu typu treści: BinarySignatureDescriber (dla binarnych typów treści) i XMLRootElementContentDescriber (dla typów treści opartych na tekście i języku XML). Oprócz tego, dostawcy modułów dodatkowych mogą tworzyć własne obiekty opisu treści. Szczegółowe informacje na ten temat zawiera Podręcznik programisty modułów dodatkowych platformy Eclipse (Podręcznik programisty > Przegląd środowiska wykonawczego > Typy treści).

XMLRootElementContentDescriber

Obecnie możliwe jest zdefiniowanie uzupełnień obiektu odnoszących się do pliku XML zawierającego określony znacznik najwyższego poziomu lub określającego wybraną definicję DTD. W tym celu należy zdefiniować rozszerzenie punktu rozszerzenia org.eclipse.core.runtime.contentTypes z użyciem klasy obiektu opisu XMLRootElementContentDescriber i parametrów wskazujących nazwę znacznika najwyższego poziomu lub nazwę definicji DTD. Odbywa się to w następujący sposób:

      <extension
       point="org.eclipse.core.runtime.contentTypes">
       <content-type
           id=<identyfikator>
           name=<nazwa> 	
           base-type="org.eclipse.core.runtime.xml">
           <describer class="org.eclipse.core.runtime.content.XMLRootElementContentDescriber">
               <parameter name="element" value=wartośćZnacznika />
           </describer>
       </content-type>
    </extension>
lub
      <extension
       point="org.eclipse.core.runtime.contentTypes">
       <content-type
           id=<identyfikator>
           name=<nazwa> 	
           base-type="org.eclipse.core.runtime.xml">
           <describer class="org.eclipse.core.runtime.content.XMLRootElementContentDescriber">
               <parameter name="dtd" value=wartośćDTD />
           </describer>
       </content-type>
    </extension>
gdzie wartośćZnacznika reprezentuje nazwę znacznika najwyższego poziomu, który należy dopasować, a

wartośćDTD reprezentuje nazwę definicji DTD z pliku XML.

Rozważmy następujące uzupełnienie obiektu w pliku plugin.xml:

      <extension
       point="org.eclipse.core.runtime.contentTypes">
       <content-type
           id="topElementContentType"
           name="Testuje rozpoznawanie elementu najwyższego poziomu" 	
           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>

Sprawi to, że akcja action1 będzie widoczna dla dowolnego pliku IFile o nazwie zgodnej z wzorcem *xml, pod warunkiem, że zawiera on znacznik myTag jako znacznik XML najwyższego poziomu lub wykorzystuje definicję DTD o nazwie myDTD.xml. Dopasowane zostaną następujące pliki 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>

lub

  <?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 to obiekt opisu treści, który wykrywa w pliku podaną "sygnaturę" binarną w miejscu o określonym przesunięciu. Ten obiekt jest używany w identyczny sposób co obiekt XMLRootElementContentDescriber, ale zamiast parametrów "element" lub "dtd" należy użyć parametrów "signature", "offset" i "required". Dokumentacja Javadoc dla klasy BinarySignatureDescriber udostępnia pełne informacje na temat sposobu użycia klasy tego obiektu opisu treści.