Menu- og værktøjslinjestier

Vi har set mange funktionsbidrag, som angiver stien til placeringen af deres funktion. Lad os se nærmere på, hvad disse stier betyder.   

Menustier

Vi skal først se på menustierne ved at se på menuen Hjælp på arbejdsbænken.

Navngivne grupper på arbejdsbænken

De placeringer, hvor nye menuer og menupunkter kan indsættes, defineres med navngivne grupper. Du kan tænke på en navngiven gruppen som en skuffe eller en pladsholder, der giver dig mulighed for at indsætte menupunkter bestemte steder på en menulinje eller en menu.

Arbejdsbænken definerer alle sine gruppeskuffenavne i klasserne IWorkbenchActionConstants og IIDEActionConstants. Der bruges to forskellige klasser, fordi ressourcerelaterede menupunkter fravælges på den generiske arbejdsbænk. For hver arbejdsbænksmenu placeres navngivne grupper på menuen på de steder, hvor det forventes, at plugins indsætter nye funktioner.

Følgende beskrivelse af menuen Hjælp er hentet fra klassedefinitionen IWorkbenchActionConstants.

   Standardfunktioner på menuen Hjælp
   Start group - HELP_START - "start"
   End group - HELP_END - "end"

Standardmenuen Hjælp på arbejdsbænken definerer en navngiven gruppe kaldet "start" efterfulgt af en navngiven gruppe kaldet "end". Definitionen af de to grupper giver plugins bedre kontrol over, hvor deres elementbidrag placeres på menuen Hjælp. Du kan definere lige så mange skuffer, du ønsker, når du definerer en menu. Hvis der tilføjes flere skuffer, får andre plugins bedre kontrol over, hvor deres bidrag placeres i forhold til eksisterende bidrag.

Plugins, der tilføjer et menupunkt til menuen Hjælp, kan bruge gruppenavnene til at beslutte, hvor deres menupunkt skal placeres. Plugin'en til snydeark tilføjer f.eks. et funktionssæt med menuen "Snydeark..." til arbejdsbænken. Følgende er koden fra filen plugin.xml til plugin'en org.eclipse.ui.cheatsheets.

<extension
	point="org.eclipse.ui.actionSets">
	<actionSet
		label="%CHEAT_SHEETS"
		visible="true"
		id="org.eclipse.ui.cheatsheets.actionSet">
		<action
			label="%CHEAT_SHEETS_MENU"
			class="org.eclipse.ui.internal.cheatsheets.actions.CheatSheetHelpMenuAction"
			menubarPath="help/helpStart"
			id="org.eclipse.ui.cheatsheets.actions.CheatSheetHelpMenuAction">
		</action>
	</actionSet>
</extension>   

Den nye hjælpefunktion placeres inde i gruppen helpStart på menuen Hjælp.

Fuldstændige menustier

En fuldstændig menusti er "menunavn/gruppenavn". De fleste menunavne til arbejdsbænken er defineret i IWorkbenchActionConstants. De ressourcerelaterede menunavne er defineret i IIDEActionConstants. Hvis der søges efter navnet på menuen Hjælp i denne klasse, ses det, at det fuldstændige stinavn til hjælpefunktionen er "help/helpEnd".

Nogle menuer har indlejrede undermenuer. Her bruges der længere stier. Hvis menuen Hjælp har en defineret undermenu kaldet "submenu" med en navngiven gruppe kaldet "submenuStart", vil den fuldstændige menusti for en funktion i den nye undermenu være "help/submenu/submenuStart".

Eksternalisér brugergrænsefladeetiketter

Ovenstående eksempel viser en teknik til at eksternalisere strenge, der vises i brugergrænsefladen. Eksternaliserede strenge bruges til at lette oversættelsen af plugin'ens brugergrænseflade til andre sprog. Vi kan eksternalisere strengene i plugin.xml-filerne ved at erstatte strengen med en nøgle (%CHEAT_SHEETS_MENU) og oprette indgange i filen plugin.properties med formatet:

	CHEAT_SHEETS_MENU = Snydeark...

Filen plugin.properties kan oversættes til andre sprog, og det vil ikke være nødvendigt at ændre plugin.xml.

Tilføj nye menuer og grupper

I mange af de viste eksempler er funktionsbidragene fra eksempel-plugin'en blevet tilføjet til eksisterende navngivne grupper i menuer.

Udvidelsespunkterne actionSets, viewActions, editorActions og popupMenus giver dig også mulighed for at definere nye menuer og grupper i dit bidrag. Det betyder, at du kan definere nye undermenuer eller nye rullemenuer og bidrage med dine funktioner til de nye menuer. I det tilfælde indeholder stien til den nye funktion navnet på den nyligt definerede menu.

Vi har set på teknikken, da Readme-værktøjet definerede en ny menu til dets funktionssæt. Lad os se på koden en gang til, nu hvor vi har gennemgået menustier mere grundigt.

   <extension point = "org.eclipse.ui.actionSets">
   <actionSet id="org_eclipse_ui_examples_readmetool_actionSet"
	   label="%ActionSet.name"
	   visible="true">
	   <menu id="org_eclipse_ui_examples_readmetool"
		   label="%ActionSet.menu"
		   path="window/additions"> 
		   <separator name="slot1"/>
		   <separator name="slot2"/>
		   <separator name="slot3"/>
	   </menu>
	   <action id="org_eclipse_ui_examples_readmetool_readmeAction"
		   menubarPath="window/org_eclipse_ui_examples_readmetool/slot1"
		   toolbarPath="readme"
		   label="%ReadmeAction.label"
		   tooltip="%ReadmeAction.tooltip"
		   helpContextId="org.eclipse.ui.examples.readmetool.open_browser_action_context"
		   icon="icons/ctool16/openbrwsr.png"
		   class="org.eclipse.ui.examples.readmetool.WindowActionDelegate"
		   enablesFor="1">
		   <selection class="org.eclipse.core.resources.IFile"
				name="*.readme">
		   </selection>
	   </action>
	   ...

Vi tilføjede en ny menu kaldet "org_eclipse_ui_examples_readmetool", hvis etiket er defineret med nøglen "%ActionSet.name" i properties-filen. Der er defineret tre navngivne grupper på menuen:   "slot1," "slot2" og "slot3."  Den nye menu tilføjes til stien "window/additions."

Hvis vi går tilbage til IWorkbenchActionConstants, ses denne definition af vinduesmenuen i javadoc:

    * <h3>Standardfunktioner på menuen Vindue</h3>
    * <ul>
    * <li>Ekstra Vindue-lignende funktionsgruppe (<code>WINDOW_EXT</code>)</li>

Hvis der ses nærmere på klassedefinitionen, ses disse relaterede definitioner:

   public static final String MENU_PREFIX = "";
   ...
   public static final String M_WINDOW = MENU_PREFIX+"window";
   ...
   public static final String MB_ADDITIONS = "additions";  // Group.
   ...
   public static final String WINDOW_EXT = MB_ADDITIONS;   // Group.

Med disse oplysninger kan vi udlede stien til at tilføje noget til menuen "Vindue" på arbejdsbænken. Selve menuen kaldes "window", og den definerer en skuffe ved navn "additions".  Brug stien "window/additions" til at tilføje den nye menu.

Der tilføjes en funktion til den nye definerede menu i erklæringen af funktionssættet ved brug af stien "window/org_eclipse_ui_examples_readmetool/slot1."

Andre plugins kan bruge den samme sti (eller måske en af de andre skuffer) til at tilføje en af deres egne menuer til menuen.   

Attributten separator bruges til at identificere gruppenavnene i eksemplet med Readme-værktøjet. Den opretter en skillelinje mellem grupperne, når de indeholder elementer. Du kan også bruge attributten groupMarker i stedet for, hvis du vil definere en navngiven gruppe uden at vise skillelinjer på menuen til at skelne mellem grupperne.

Værktøjslinjestier

Værktøjslinjestier bruges på samme måde som menustier.   

Navngivne værktøjslinjer på arbejdsbænken

Arbejdsbænkens værktøjslinje består af værktøjslinjer, som forskellige plugins, inklusive selve arbejdsbænken, bidrager med. I de enkelte værktøjslinjer er der navngivne grupper eller skuffer, der kan bruges til at indsætte nye værktøjslinjeelementer.    

Følgende beskrivelse af værktøjslinjer på arbejdsbænken er hentet fra klassedefinitionen IWorkbenchActionConstants.

// Workbench toolbar ids
public static final String TOOLBAR_FILE = "org.eclipse.ui.workbench.file"
public static final String TOOLBAR_NAVIGATE = "org.eclipse.ui.workbench.navigate"; 

// Workbench toolbar group ids.  To add an item at the beginning of the group, 
// use the GROUP id.  To add an item at the end of the group, use the EXT id.
public static final String PIN_GROUP = "pin.group"; 
public static final String HISTORY_GROUP = "history.group"; 
public static final String NEW_GROUP = "new.group"; 
public static final String SAVE_GROUP = "save.group"; 
public static final String BUILD_GROUP = "build.group"; 

I det mest enkle tilfælde kan en plugin bidrage med et værktøjslinjeelement på dens egen værktøjslinje. Readme-værktøjets funktioner, som er bidraget til menuen, har f.eks. også en værktøjslinjesti:

<action id="org_eclipse_ui_examples_readmetool_readmeAction"  
   menubarPath="window/org_eclipse_ui_examples_readmetool/slot1"
   toolbarPath="readme"
...

Eftersom der ikke er nogen reference til arbejdsbænkens værktøjslinjestier eller -grupper, vises Readme-funktioner i deres egen gruppe på værktøjslinjen. Hvis du angiver følgende sti, placeres elementet i filværktøjslinjen i gruppen Gem:

...
<action id="org_eclipse_ui_examples_readmetool_readmeAction"  
   menubarPath="window/org_eclipse_ui_examples_readmetool/slot1"
   toolbarPath="org.eclipse.ui.workbench.file/save.group"
...

Værktøjslinjestierne til andre plugins kan referere til de stier, der er defineret i IWorkbenchActionConstants.

Tilføj til funktionssæt for en anden plugin

Antag, at en plugin skal have sine værktøjslinjeelementer bedre integreret med funktioner fra en anden plugin. Lad os se på, hvordan plugin'en til eksterne værktøjer (org.eclipse.ui.externaltools) integrerer sin funktion med fejlfindingens værktøjslinje. Fejlfindingen (org.eclipse.debug.ui) definerer sine værktøjslinjefunktioner sådan:

<extension
      point="org.eclipse.ui.actionSets">
   <actionSet
         label="%LaunchActionSet.label"
         visible="false"
         id="org.eclipse.debug.ui.launchActionSet">
   ...
   <action
         toolbarPath="debug"
         id="org.eclipse.debug.internal.ui.actions.RunDropDownAction"
         hoverIcon="icons/full/ctool16/run_exc.png"
         class="org.eclipse.debug.internal.ui.actions.RunToolbarAction"
         disabledIcon="icons/full/dtool16/run_exc.png"
         icon="icons/full/etool16/run_exc.png"
         helpContextId="run_action_context"
         label="%RunDropDownAction.label"
         pulldown="true">
   </action>
   ...

På samme måde som Readme-værktøjet, definerer fejlfindings-plugin'en sin egen værktøjslinjesti, hvilket betyder, at dens værktøjslinjeelementer er placeret i deres egen værktøjslinje på arbejdsbænken. Hvad gør plugin'en til eksterne værktøjer?

<extension point="org.eclipse.ui.actionSets">
	<actionSet
		id="org.eclipse.ui.externaltools.ExternalToolsSet"
		label="%ActionSet.externalTools"
		visible="true">
		...
		<action
			id="org.eclipse.ui.externaltools.ExternalToolMenuDelegateToolbar"
			definitionId= "org.eclipse.ui.externaltools.ExternalToolMenuDelegateToolbar"
			label="%Action.externalTools"
			toolbarPath="org.eclipse.debug.ui.launchActionSet/debug"
			disabledIcon="icons/full/dtool16/external_tools.png"
			icon="icons/full/etool16/external_tools.png"
			hoverIcon="icons/full/ctool16/external_tools.png"
			tooltip="%Action.externalToolsTip"
			pulldown="true"
			class="org.eclipse.ui.externaltools.internal.menu.ExternalToolMenuDelegate">
		</action>
	</actionSet>
 </extension>

Bemærk brugen af fejlfindingens funktionssæt-id i værktøjslinjestien. Brug af en funktionssæt-id i stien betyder, at værktøjslinjeelementet skal placeres i den værktøjslinje, som det refererede funktionssæt bruger. Inden for en værktøjslinjegruppe sorteres elementerne af funktionssæt-id'en, så den eksterne værktøjsfunktion i dette eksempel vises efter fejlfindingsfunktionerne. 

Når der tilføjes til et funktionssæts værktøjslinje, kan der også defineres nye grupper. Hvis plugin'en for eksterne værktøjer definerer sin toolbarpath som "org.eclipse.debug.ui.launchActionSet/external", oprettes der en ny gruppe for funktionen på værktøjslinjen. Værktøjslinjegrupper afgrænses med skillelinjer på samme måde som menuer.  

Brug stier fra en anden plugin

Det er generelt ikke en god skik at bidrage til en anden plugins menu eller værktøjslinje ved at udlede stinavnet fra plugin.xml, medmindre det er specielt markeret som tilgængeligt for klienter. Der er muligt, at en fremtidig version af plugin'en ændrer navnene på stierne. Der er to almindelige måder at markere din plugin's funktionssæt-id'er og stier som værende brugbare: