Hemos visto muchas contribuciones de acciones que especifican la vía de acceso para la ubicación de dichas acciones. Veamos con más detalle lo que significan estas vías de acceso. Examinaremos las vías de acceso en el menú Ayuda del entorno de trabajo.
Las ubicaciones para insertar menús, elementos de menú o elementos de barra de herramientas nuevos se definen mediante grupos con nombre. Un grupo con nombre es como una ranura o espacio reservado que le permite insertar contribuciones de menú y barra de herramientas en puntos concretos de un menú o de una barra de herramientas.
El entorno de trabajo define todos sus nombres de ranura de grupo en la clase IWorkbenchActionConstants. En cada menú del entorno de trabajo, los grupos con nombre se colocan en ubicaciones en las que se espera que los conectores inserten acciones nuevas.
La siguiente descripción del menú de ayuda se ha adaptado de la definición de la clase IWorkbenchActionConstants.
Acciones del menú Ayuda estándar Principio del grupo - HELP_START - "start" Fin del grupo - HELP_END - "end" Acción Acerca de - ABOUT - "About"
El menú de ayuda estándar del entorno de trabajo se compone de un grupo con nombre llamado "start", seguido de un grupo con nombre llamado "end", seguido de la acción "About". La definición de dos grupos proporciona a los conectores más control sobre dónde se situarán en el menú Ayuda los elementos con los que se ha contribuido. Cuando defina un menú, podrá definir el número de ranuras que desee. Si se añaden más ranuras, los otros conectores tendrán más control sobre el lugar en que aparecen sus contribuciones en relación a las contribuciones existentes.
Pero eso no es todo. Sabemos que hay otros elementos en el menú Ayuda. Los añaden los conectores. Por ejemplo, el conector de ayuda añade al entorno de trabajo un conjunto de acciones que contiene el menú "Contenido de la ayuda". A continuación, se muestran los códigos XML del archivo plugin.xml del conector org.eclipse.help.ui.
<extension point="org.eclipse.ui.actionSets"> <actionSet id="org.eclipse.help.internal.ui.HelpActionSet" label="%help" visible="true"> <action id="org.eclipse.help.internal.ui.HelpAction" menubarPath="help/helpEnd" label="%helpcontents" class="org.eclipse.help.ui.internal.HelpContentsAction" icon="icons/view.gif" helpContextId="org.eclipse.help.ui.helpContentsMenu" tooltip="%openhelpcontents"/> ...
La nueva acción de ayuda se colocará en el menú Ayuda, dentro del grupo helpEnd. Si ningún otro conector ha contribuido en el menú Ayuda, esto significa que el elemento de menú "Contenido de la ayuda" aparecerá como primer elemento del menú, más arriba del elemento "Acerca de". Si otro conector quisiera contribuir con un elemento que siempre apareciera más arriba del elemento "Contenido de la ayuda", podría especificar el grupo helpStart en su vía de acceso.
Las vías de acceso de la barra de herramientas funcionan de manera similar. Siempre que se especifique una vía de acceso, debe terminar con el nombre de un grupo de la barra de herramientas.
El formato de las vías de acceso de menú o barra de herramientas completas es "nombre de menú/nombre de grupo". En el entorno de trabajo, los nombres de menú se definen en la interfaz IWorkbenchActionConstants. Esta clase permite averiguar que el nombre de vía de acceso totalmente calificado de nuestra acción de ayuda es "help/helpEnd".
Algunos menús contienen submenús anidados. Esto hace que las vías de acceso sean más largas. Si el menú de ayuda tuviera definido un submenú llamado "submenu" con un grupo con nombre llamado "submenuStart", la vía de acceso totalmente calificada del menú para una acción del nuevo submenú sería "help/submenu/submenuStart".
El ejemplo anterior hace una demostración de una técnica que permite externalizar las series que aparecen en la UI. Las series externalizadas sirven para simplificar la traducción de la UI del conector a otros idiomas. Podemos externalizar las series de nuestros archivos plugin.xml sustituyendo cada serie por una clave (por ejemplo, %help, %helpcontents) y creando en el archivo plugin.properties entradas con este formato:
help = "Ayuda" helpContents = "Contenido de la ayuda"
El archivo plugin.properties se puede traducir a los distintos idiomas y no será necesario modificar el archivo plugin.xml.
En la mayoría de los ejemplos que hemos visto hasta ahora, las acciones con las que los conectores de ejemplo han contribuido se han añadido a los grupos con nombre existentes en los menús y las barras de herramientas.
Los puntos de extensión actionSets, viewActions, editorActions y popupMenus también le permiten definir menús y grupos nuevos en sus contribuciones. Esto significa que puede definir submenús o menús desplegables nuevos y contribuir suministrando acciones a dichos menús. En este caso, la vía de acceso de la acción nueva contendrá el nombre del menú definido recientemente.
Vimos cómo se aplicaba esta técnica cuando la herramienta readme definió un menú nuevo para su conjunto de acciones. Ahora que hemos explicado las vías de acceso de menú de manera más detallada, examinemos los códigos XML una vez más.
<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.gif" class="org.eclipse.ui.examples.readmetool.WindowActionDelegate" enablesFor="1"> <selection class="org.eclipse.core.resources.IFile" name="*.readme"> </selection> </action> ...
Hemos añadido un menú nuevo, llamado "org_eclipse_ui_examples_readmetool", cuya etiqueta está definida por la clave "%ActionSet.name" en el archivo de propiedades. Dentro de este menú, definimos tres grupos con nombre: "slot1", "slot2" y "slot3". Añadimos este menú nuevo a la vía de acceso "window/additions".
Si regresamos a IWorkbenchActionConstants, vemos la siguiente definición del menú de ventana en el javadoc:
* <h3>Acciones del menú Ventana estándar</h3> * <ul> * <li>Grupo de acciones adicionales al estilo de Ventana (<code>WINDOW_EXT</code>)</li>
Si seguimos mirando la definición de clase, veremos estas definiciones relacionadas:
public static final String MENU_PREFIX = ""; ... public static final String M_WINDOW = MENU_PREFIX+"window"; ... public static final String MB_ADDITIONS = "additions"; // Grupo. ... public static final String WINDOW_EXT = MB_ADDITIONS; // Grupo.
A partir de esta información, podemos componer la vía de acceso para añadir algún elemento al menú "Ventana" del entorno de trabajo. El propio menú se llama "window" y define una ranura llamada "additions". Para añadir el menú nuevo, utilizaremos la vía de acceso "window/additions".
En la declaración del conjunto de acciones, añadimos una acción al menú recién definido utilizando la vía de acceso "window/org_eclipse_ui_examples_readmetool/slot1".
Los otros conectores podrían añadir uno de sus propios menús al nuestro utilizando esta misma vía de acceso (o tal vez una de las ranuras restantes).
En general, no conviene contribuir en el menú o en la barra de herramientas de otro conector a base de derivar el nombre de vía de acceso del archivo plugin.xml. Ello se debe a la posibilidad de que una versión futura del conector cambiase los nombres de las vías de acceso. Lo aconsejable es definir una interfaz pública (como IWorkbenchActionConstants) que especifique exactamente qué menús, grupos de barras de herramientas y ranuras se consideran fiables para que las utilicen los otros conectores.