Puede añadir un asistente a las opciones del menú Archivo >Nuevo > del entorno de trabajo utilizando el punto de extensión org.eclipse.ui.newWizards. En el ejemplo de la herramienta readme se utiliza esta definición de punto de extensión para añadir el asistente Archivo readme:
<extension point = "org.eclipse.ui.newWizards"> <category id = "org.eclipse.ui.examples.readmetool.new" parentCategory="org.eclipse.ui.Examples" name="%NewWizard.category"> </category> <wizard id = "org.eclipse.ui.examples.readmetool.wizards.new.file" name = "%NewWizard.name" class="org.eclipse.ui.examples.readmetool.ReadmeCreationWizard" category="org.eclipse.ui.Examples/org.eclipse.ui.examples.readmetool.new" icon="icons/obj16/newreadme_wiz.png"> <description>%NewWizard.desc</description> <selection class="org.eclipse.core.resources.IResource"/> </wizard> </extension>
El parámetro category describe el grupo del asistente. Un parámetro parentCategory opcional establece la categoría nueva como hija de una categoría existente.
Las categorías del nivel más alto aparecerán en el menú Archivo > Nuevo. En este ejemplo, la parentCategory se ha establecido en una categoría "Examples". ¿De dónde procede la categoría padre? El conector org.eclipse.ui define una categoría de ejemplos estándar en su código:
<extension point="org.eclipse.ui.newWizards"> <category name="%NewWizards.Category.Examples" id="org.eclipse.ui.Examples"> </category> ...
Esta categoría aparece en el menú Archivo > Nuevo.
El nombre de la categoría de la herramienta readme define la etiqueta utilizada para la siguiente capa de agrupación por debajo de la categoría padre. Estas categorías se muestran como segundo nivel en el árbol que aparece en el asistente Ejemplo nuevo. El nombre y el icono del asistente se muestran debajo cuando se expande la categoría. La descripción del asistente seleccionado se muestra en la parte superior del asistente cuando éste se selecciona.
Esta información relativa al asistente aparece en virtud de los códigos del archivo plugin.xml. No se ejecuta ninguna parte del código del conector hasta que el usuario pulsa el botón Siguiente. Acto seguido, el entorno de trabajo creará una instancia de la clase (atributo class) del asistente especificada en los códigos y le pasará una clase de selección esperada.
La clase identificada en esta extensión (ReadmeCreationWizard) debe implementar la interfaz INewWizard. La mayoría de los asistentes lo hacen ampliando la clase Wizard de la plataforma, aunque este es un mecanismo de implementación y el punto de extensión no lo necesita.
La acción del asistente es mínima, pero crea las páginas dentro de él. Veamos en primer lugar la implementación de la página, para insistir después en el asistente.
El entorno de trabajo proporciona clases de páginas de asistente básicas que soportan el tipo de proceso efectuado para cada punto de extensión de asistente. Puede utilizar estas páginas o ampliarlas para añadir proceso adicional.
El objetivo de ReadmeCreationWizard es crear un archivo nuevo, añadir el contenido necesario al archivo y, como opción, abrir un editor en el archivo. La página necesita definir los controles que permiten al usuario especificar qué contenido se incluye en el archivo y si debe lanzarse un editor.
Creamos la página del asistente, ReadmeCreationPage, ampliando la clase WizardNewFileCreationPage. Los controles de una página de asistente se definen de manera similar a como se definen para una vista o un editor. La página implementa el método createControl, creando los widgets de SWT necesarios como hijos del objeto Composite suministrado. Puesto que la superclase ya añade widgets que soportan el proceso de archivo nuevo, solo tendremos que ampliar el método createControl en nuestra página del asistente para añadir los recuadros de selección adicionales que controlan la generación de secciones y la apertura del editor.
public void createControl(Composite parent) { // heredar widgets de especificación de nombre y contenedor por omisión super.createControl(parent); Composite composite = (Composite)getControl(); ... // grupo para la generación de secciones de ejemplo Group group = new Group(composite,SWT.NONE); group.setLayout(new GridLayout()); group.setText(MessageUtil.getString("Automatic_sample_section_generation")); group.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL)); ... // recuadros de selección para la generación de secciones de ejemplo sectionCheckbox = new Button(group,SWT.CHECK); sectionCheckbox.setText(MessageUtil.getString("Generate_sample_section_titles")); sectionCheckbox.setSelection(true); sectionCheckbox.addListener(SWT.Selection,this); subsectionCheckbox = new Button(group,SWT.CHECK); subsectionCheckbox.setText(MessageUtil.getString("Generate_sample_subsection_titles")); subsectionCheckbox.setSelection(true); subsectionCheckbox.addListener(SWT.Selection,this); ... // recuadro de selección de abrir archivo para edición openFileCheckbox = new Button(composite,SWT.CHECK); openFileCheckbox.setText(MessageUtil.getString("Open_file_for_editing_when_done")); openFileCheckbox.setSelection(true); ... }
Debe poder seguir este código si comprende los conceptos del tema Juego de herramientas de widgets estándar (SWT).
Los patrones básicos para implementar una página son:
La clase ReadmeCreationPage hereda gran parte de este comportamiento de la clase WizardNewFileCreationPage. Examine la implementación de estas clases para obtener más información.
Ahora que entendemos lo que hace una página, veamos de nuevo el asistente.
El asistente se encarga de crear las páginas y de proporcionar la lógica de "finalización".
Los patrones básicos para implementar un asistente son:
public void init(IWorkbench workbench,IStructuredSelection selection) { this.workbench = workbench; this.selection = selection; setWindowTitle(MessageUtil.getString("New_Readme_File")); setDefaultPageImageDescriptor(ReadmeImages.README_WIZARD_BANNER); }
public void addPages() { mainPage = new ReadmeCreationPage(workbench, selection); addPage(mainPage); }
public boolean performFinish() { return mainPage.finish(); }
El asistente completado tiene este aspecto: