lunes, 15 de diciembre de 2014

Creación plugin menú emergente para eclise 3.6 y superior

Buenas, os dejo aquí una entrada rapidida para un tema que debería ser tratado más a fondo, pero ante la carencia de tiempo y el interés que creo tiene el tema, la pondré lo mejor que pueda.

El caso es que tenía la necesidad de crear un simple plugin para eclipse de forma que al pulsar con el botón derecho sobre el código se incluyera en el menú emergente una entrada que al ser pulsada insertara código en el punto donde hemos hecho click. Encontré documentación y ejemplos, pero ninguno valía pues creo que todos eran aplicables a versiones de eclipse inferiores a la 3.6 (no estoy muy seguro del límite) el caso es que al final lo conseguí (tras muuucas pruebas) y la verdad es que sabiendolo hacer no era dificil.

El caso, me salto tan solo bosquejo los pasos normales para la creación de un plugin de menú emergente pues están documentados en varios sitios. Me centraré en los puntos donde veo mayor dificultar. Al lío.
  • Crear proyecto de plugin de eclipse.
  • Usar el asistentes para la creación del plugin cogiendo la opción de plugin de menú emergente. 
  • Al terminar de ejecutar el asistente se abrirá automáticamente el fichero plugin.xml pero el título mostrado en la pestaña del editor será el nombre que hayamos puesto al plugin.
  • Dentro del editor, seleccionar la pestaña inferior plugin.xml.
  • Sustituir la línea: 
            objectClass="org.eclipse.core.resources.IFile
          por
           objectClass="org.eclipse.ui.IEditorInput"
            nameFilter="*.java"

  • Esto hará que nuestro plugin se muestre como submenú dentro del menu emergente al pulsar sobre un editor de un fichero java.
  • Cada entrada dentro del submenú será un bloque action dentro del fichero plugin.xml, por lo que deberemos completar dicho fichero según nuestras necesidades. Podremos hacerlos a capón, de forma más bonita desde la pestaña inferior Extensions del mismo editor del fichero plugin.xml
  • Dentro de cada bloque action encontramos el campo: id="prueba.newAction"  que se pasará como parámetro al método run de la clase accion del plugin.
  • Abrir el fichero NewAction.java dentro del package prueba.popup.action. Estos son los nombres que yo he usado para este tutorial. En cualquier caso será el fichero dentro del package action.
  • Actualizar el método run(IAction) con el siguiente código:
 public void run(IAction action) {
        try {
            //Obtención del editor
            IEditorPart editorPart = Activator.getDefault().getWorkbench()
                    .getActiveWorkbenchWindow().getActivePage()
                    .getActiveEditor();
          
            //Obtención del proveedor de datos del editor
            TextFileDocumentProvider textFileDocumentProvider = new TextFileDocumentProvider();
            textFileDocumentProvider.connect(editorPart.getEditorInput());

            //Obtención del documento asociado
            IDocument doc = textFileDocumentProvider.getDocument(editorPart.getEditorInput());

            //Posición del cursor
            ITextSelection textSelection = (ITextSelection) editorPart
                    .getSite().getSelectionProvider().getSelection();
            int offset = textSelection.getOffset();

            //Obtener la instrucción que necesitamos en función de la opción seleccionada.
            String texto=obtenerIntrucciones(action.getId());
          
            //Inserción de texto
            doc.replace(offset, 0, texto+"\n");
          
            //Desconexión del proveedor de datos
            textFileDocumentProvider.disconnect(editorPart.getEditorInput());
          
        } catch (CoreException e) {
            e.printStackTrace();
        } catch (BadLocationException e) {
            e.printStackTrace();
        }
    }

  •  A vosotros os dejo el estudio del código, que bien comentado está.
  • La línea marcada en amarillo es la que obtiene el texto a usar a partir de una llamada a otro método que es:
 /**
     * Devuelve el trozo de código asociado al indentificador que se le indica.
     * @param Identificador del trozo de código fuente que queremos.
     * @return Código fuente asociado al identificador.
     */
    private String obtenerIntrucciones(String id) {

        int posIni=15;
        String cod=id.substring(posIni,id.length());
               
        return (String) identificador.get(cod);
           
    }


  •  Este método lo que hará será usar el identificador que le pasamos (en realidad un trozo de él, a partir del carácter 15 que es la posición que a mi me interesaba) para buscar el texto a devolver dentro de un hashmap que previamente hemos declarado. 
  • Declararemos este hashmap al principio de la clase (marcado en amarillo):
public class NewAction implements IObjectActionDelegate {

    private Shell shell;
    private HashMap identificador = new HashMap();
    private String texto="";


 ....

  •  Añadimos en el constructor la carga de datos en el hasmap:
     /**
     * Constructor for Action1.
     */
    public NewAction() {

        super();
        
       //Primer texto
        texto="Texto 1 a insertar";
        identificador.put("identificador1",texto);
       
        //Texto 2
        texto="Texto 2 a insertar";
        identificador.put("identificador2", texto);
    }


  • El primer valor que se mete en el hashmap ha de corresponderse con el final de cada uno de los  identificadores que hayamos usado en cada bloque action del plugin.xml. El segundo valor será el texto que insertaremos.
  • Probamos y ampliamos debidamente nuestro plugin y cuando estemos ya contentos con el resultado exportamos el proyecto seleccionando la opción export->Plugin development->Deployable plugin and fragments.
  • Para instalar el plugin, el jar obtenido hemos de ponerlo dentro del fichero plugin de la instalación de eclipse y reiniciar el ecplise.
Bueno, se que debería detallar mas cosas, pero tiempo no hay. De verdad que funciona, pero si tenéis problemas, comentadlo y os ayudaré en cantado.

Espero sea útil.

=:)