Cambiar a contenido. | Saltar a navegación

Screen styles
Usted está aquí: Inicio Documentación Tutorial Creando extensiones para OpenOffice.org con PyUNO

Creando extensiones para OpenOffice.org con PyUNO

Nota: Ésta es la vista de impresión del Tutorial completo en una sola página. Si lo prefiere puede encontrar la versión original aquí.

Este tutorial se encofa en la creacion y configuracion de extensiones para OpenOffice.org utilizando Python y el puente con su API. Se muestra una tarea muy basica tratando de enfocar la atencion al empaquetamiento y archivos especiales para componetizar el codigo.

Extensiones de OpenOffice.org

Mostramos la estructura basica de una extension.

Python es un lenguage que puedes usar para desarrollar extensiones de OpenOffice.org. Con una extension es mas facil poder distribuirlo en una organizacion, ya que el instalador de extensiones de OpenOffice.org lo reconoce de forma mas instananea que una macro donde el usuario debera activarla y validarla.

Tambien una extension te permite manipular la interfaz y definir donde en el menu o en las barras de herramientas necesitas tu disparador via archivos de XML en XCU. Una extension es un archivo ZIP el cual contiene una estructura especifica donde se tiene una serie de folders que validan el archivo coomo META-INF, archivos que igual declaran donde ira cada parte de la informacion de la aplicacion llamada XCU, un folder con imagenes que declaran la posible iconografia y finalmente el archivo con el codigo de Python que hara la logica de la aplciacion.

Es importante aprender las partes importantes a declarar en un XCU asi como tener un XCU base para poder ahorrarnos mucho tiempo creando nodos que va predeterminado.  Por otra parte en python que debemos registrar en la cabeza y talon el codigo que vayamos a generar en python para poder hacerlo funcionar como extension.

--> Extension.oxt
  |-- Addon.xcu
  |-- Codigo.py
  |-- images/
       |-- icono.bmp

Una extensión mas compleja puede tener también otros archivos XCU que definan en donde queremos nuestros iconos, si tenemos otras formas de ejecutar nuestra herramienta como en la barra de tareas, si tenemos o necesitamos compatibilidad con otros idiomas y configuraciones. A continuación una representación de una extensión avanzada y rica en archivos.

--> Extension.oxt
  |-- Addon.xcu
  |-- ProtocolHandler.xcu
  |-  META-INF/
        |-- manifest.xml
  |-- images/
       |-- icono,png
       |-- icono32x32.png
       |-- icono64x64.png
  |-- LICENSE.txt 
  |-- Codigo.py

Codigo Python

Disectamos la estructura del script de python en partes para su estudio.

Una vez aprendido la estructura, ahora podemos empezar a estudiar nuestro codigo. Este codigo se puede dividir en grandes rasgos en tres partes.

  • Insertar los modulos correspondientes
  • Declarar los servicios y componentes para el desarrollo
  • Insertar el gImplmentationHelper para declarar que es una extension

 

Para la primera parte es importante insertar los modulos JobExecutor, unohelper y uno.

 

import uno

import unohelper

from com.sun.star.task import XJobExecutor

 

Para el siguiente punto necesitamos una clase con la abstraccion de los componentes incluyendo el componente de escritorio, de aplicacion, de hoja y finalmente de celda.

 

class HelloWorldJob(unohelper.Base, XJobExecutor):

    def __init__(self, ctx):

        # store the component context for later use

        self.ctx = ctx

 

    def trigger(self, args):

        # Retrieve the desktop object

        desktop = self.ctx.ServiceManager.createInstanceWithContext("com.sun.star.frame.Desktop", self.ctx)

        spreadsheet = desktop.getCurrentComponent()

        sheets = spreadsheet.getSheets()

        cell = sheets.getByIndex(0).getCellByPosition(0, 0)

        if cell.getFormula():

            cell.setFormula("Hello " + cell.getFormula())

        else:

            cell.setFormula("Hello world")

 

Este codigo tiene muchas similitudes con el codigo del tutorial pasado que se escribio en Python.com.mx. Aqui llamamos a los servicios de "Desktop", "CurrentComponent" pero a diferencia del procesador de texto en una hoja de calculo usamos getSheets(), y en vez de posicionarnos con el cursor lo hacemos por la celda con getCellByPosition().

 

Calc tiene sus propios servicios y metodos incluyendo aqui donde obtenemos la formula actual con getFormula() y setFormula().

 

Nota: Si solo pensamos poner texto tambien existe el setString().

 

La ultima parte de nuestro codigo es la razon por la cual llamamos a unohelper y a XJobExecutor. Esta es una parte predeterminada para poder correrlo como una extension.

 

g_ImplementationHelper = unohelper.ImplementationHelper()

 

g_ImplementationHelper.addImplementation( \

        HelloWorldJob,                                # UNO clase de objeto

        "org.openoffice.comp.pyuno.demo.HelloWorld",  # Nombre de la implementacion

        ("com.sun.star.task.Job",),)                  # Lista de servicios implementados

 

En estas lineas podemos ver la declaraciones importantes que une nuestro script al XML que veremos mas adelante. La clase con el objeto que tiene la logica de la aplicacion, seguido del identificador de la implementacion, esta es algo arbitraria pero debe ser la misma presentada en el XML, finalmente el servicio de task.Job el cual implementara en el addImplementation().

 

Analizando el XCU

Diseccion del Addon.xcu el cual declara partes reelevantes para una extension trabaje en OOo.

Con estos datos podemos empezar a organizar el XML que veremos representado con una XCU:
<?xml version="1.0" encoding="UTF-8"?>
<oor:node xmlns:oor="http://openoffice.org/2001/registry"
             xmlns:xs="http://www.w3.org/2001/XMLSchema"
             oor:name="Addons" oor:package="org.openoffice.Office">
  <node oor:name="AddonUI">
    <node oor:name="AddonMenu">
      <node oor:name="org.openoffice.comp.pyuno.demo.HelloWorld" oor:op="replace">
        <prop oor:name="URL" oor:type="xs:string">
          <value>service:org.openoffice.comp.pyuno.demo.HelloWorld?insert</value>
        </prop>
        <prop oor:name="ImageIdentifier" oor:type="xs:string">
          <value>private:image/3216</value>
        </prop>
        <prop oor:name="Title" oor:type="xs:string">
          <value xml:lang="en-US">Insert Hello World</value>
        </prop>
      </node>
    </node>
  </node>
</oor:node>

La primera parte es la declaracion del paquete de OpenOffice.org tiene el esquema que se define con el namespace propio de la aplicacion, se le declara el nombre de Addons y como paquete ofimatico.
<oor:node xmlns:oor="http://openoffice.org/2001/registry"
             xmlns:xs="http://www.w3.org/2001/XMLSchema"
             oor:name="Addons" oor:package="org.openoffice.Office">

La segunda parte especifica los nodos AddonUI -> AddonMenu -> org.openoffice.comp.pyuno.demo.HelloWorld
  <node oor:name="AddonUI">
    <node oor:name="AddonMenu">
      <node oor:name="org.openoffice.comp.pyuno.demo.HelloWorld" oor:op="replace">

Finalmente esta es una parte mas personalizada, el cual trae el ID del script que llamamos en nuestro JobExecutor. Este tambien inserta el comando despues del ?.
        <prop oor:name="URL" oor:type="xs:string">
          <value>service:org.openoffice.comp.pyuno.demo.HelloWorld?insert</value>
        </prop>

Despues de esto asignamos el imageidentifier el cual sera el icono para la aplicacion asi como el texto por el cual tu plugin sera identificado.
        <prop oor:name="ImageIdentifier" oor:type="xs:string">
          <value>private:image/3216</value>
        </prop>
        <prop oor:name="Title" oor:type="xs:string">
          <value xml:lang="en-US">Insert Hello World</value>
        </prop>

El valor private:image/3216 con el nombre de ImageIdentifier y Title ubicado bajo la categoria de idioma en-US, lo cual nos dice que tambien podremos incluir otros nodos como es_ES o es_MX/AR/CL etc.

Finalmente cerramos los nodos y terminamos nuestro arbol XCU. 

Instalando el plugin

OpenOffice.org desde su version 3.0 ya incluye todo un dialogo que puede insertar e instalar asi como comprobar la version de nuestras extensiones. Pero tambien podemos hacer esto via la linea de comaando usando el comando unopkg. El comando sencillamente debe de hacer esto:

unopkg add /home/user/extension.oxt

 

Esto sera suficiente para instalar el paquete sin necesitar mayor interaccion. Espero que este tutorial haya sido practico, otras ideas que se agradecerian sera el de construir un generador de codigo y automatizar mucho del codigo prediseñado asi como un asistente que nos permita escoger estos parametros de moda dinamica y autogenere el arbol con todas sus configuraciones.