Desarrollo plugin callout
Desarrollo de Plugins – Callout
Esto es una traducción de la documentación creada por Jan Thielemann from evenos que se encuentra en siguiente enlace [1]
Finalidad del Tutorial
La finalidad de este tutorial es mostrar como desarrollar callouts en nuestro plug-in. Para ello existen diferentes formas de implementar callouts y ponerlos en funcionamiento. Apredenderas las siguientes maneras:
Crear un Callout usando IColumnCallout interface y extension de puntos. Crear un Callout usando Java puro y el Diccionario de Aplicación. Crear un Callout usuando IColumnCalloutFactory y una definicion de componente.
Prerequisitos Antes de iniciar el desarrollo de plug-ins, debes echar un vistazo a Developing Plug-Ins without affecting trunk y Get your Plug-In started.
El Flujo de Trabajo
Usuando una Extensión
Desarrollar un Callout usando una extensión es una de las formas mas faciles pero es un poco anticuado. Esto tambien puede causar conflicntos en versiones futuras de Idempiere, asi que siempre es una buena idea usar el enfoque factory/component si es posible. En primer lugar crea tu plug-in siguiendo los prerequisitos de este tutorial. Despues, crea un nuevo paquete y una clase. Nosotros llamamos a nuestra clase IColumnCallout en este caso. Implementa IColumnCallout interface y agrega alguno registro para el metodo start():
Abre el MANIFEST.MF y ve a pestaña extesion. Agrega la extesion org.adempiere.base.IColumnCallout. Ahora haz click en agregar un nuevo callout. Luego click en el boton browser y selecciona la clase creada anteriormente. Como nombre de la tabla (tableName) nosotros elegimos "M_Product" y como nombre de columna (columnName) “Help”. Como prioridad (priority) escogimos 1:
Copia el nombre de la clase completo y seleciona de nuevo org.adempiere.base.IColumnCallout. Pega y agrega “.help”. Con esto se puede definir mejor ente diferentes callouts si estan dentro de la misma clase.
Basicamente esto es todo. Inicia un cliente y abre la ventana Producto. Introduzca o cambie algo en el campo de ayuda (help) y deje el campo. Observe los registros en su consola.
Puedes usar una clase para diferectes Tablas/Columnas. Si deseas hacer esto, solo agrega otra extesión pero con diferente nombre de tabla y nombre de columna (tableName/columnName). En el metodo start() de la clase Callout. Comprueba con mTab.getTableName() y mField.getColumnName() para dedicir cual metodo callout quieres llamar. CalloutInfoWindow.java es una buena referencia para ver como se puede hacer.
Usando Java
Esta forma es algo anticuado y más incomoda que los otros enfoques, pero por motivos de exhaustividad, se les motrara. En primer lugar se crea otra clase llamada JavaCallout, la cual hereda de “CalloutEngine” y se crea un nuevo metodo siguiendo la siguiente estructura:
public String myMethodName(Properties ctx, int WindowNo, GridTab mTab, GridField mField, Object value)
Se agrega algun registro para mostrar en consola y al final retornar en nulo (null). Si la sentencia de retorno no es nulo, el CalloutEngine lo manejará como un error:
Abrir el MANIFEST.MF y selecciona la pestaña Runtime. Se agregar el paquete donde tu clase JavaCallout este localizda.
Hasta ahora no hay problema. Debido a que no utiliza una extensión o un componente, ¿cómo debería el CalloutEngine localizar nuestra clase? Bueno para ello, cambie a la pestaña MANIFEST.MF y añada la siguiente línea: "Eclipse-Registerbuddy: org.adempiere.base". Porfavor tome en cuenta que esto no es una de las mejores practicas! Guarde el Manifest e inice el cliente. Ingrese como SuperUser/System y abra la ventana Tabla y Columna (Table and Column). Busque la tabla M_Product y cambie a la pestalla Columna. Encuentre la columna Descripción e introduzca el nombre de la clase seguida por un punto y el nombre del metodo en el campo Callout.
Restaure el cliente y asegúrese que el plug-in esta activado. Ingrese como GardenAdmin/GardenWorld y abra la ventana Producto. Ingrese o cambie algo en el campo descripción y cambie de campo. Ahora observe los regitros en consola, debe ver algo como esto:
Usando CalloutFactory
Este debe ser el enfoque preferido. Se crean 2 clases. Una para el Factory y una para el callout actual. Nosostros la llamamos CalloutFactory y CalloutFromFactory. Copie el código de la IColumnCalloutcallout al CalloutFromFactory o observa como hacerlo. Se implementa IColumnCallout interface y tiene sólo un registro en su método start().
Ahora, la parte interesante. En la clase CalloutFractory implemente IColumnCalloutFactory interface y es necesario el metodo getColumnCallouts(). Aquí se comprueba el nombre de lacolumna / nombre de tabla (columnname/tablename ) y decide, si desea proporcionar un callout . Se comprueba para MProduct.Table_Name y MProduct.COLUMNNAME_DocumentNote:
Click on next and chose a name of your choice. Make sure the name is unique. Also click on browse and select you CalloutFactory class: Haga click en siguiente y escoja el nombre . Asegúrese de que el nombre sea único. También, haga click en Examinar(browser) y seleccione la clase que CalloutFactory:
Abra el component.xml (en nuestro caso calloutfactory.xml) y cambie a la pestaña servicio(service tab). Añada org.adempiere.base.IColumnCalloutFactory a la sección de Servicios (Provides Services):
Inicie el cliente e inicie sesión como GardenAdmin / Gardenworld. Abra la ventana del producto e introduzca o cambie algo en el campo Nota de documentos. Deje el campo y comprobe su registro en la consola. Debería ver algo como esto:
