Usuario:Luis.perez/pyunoaytozgz/pyuno

Instalación de Libreoffice (Ubuntu)

 * Basta con tener instalado libreoffice si solo se van a hacer macros.
 * Si se van a crear componentes instalar adicionalmente el paquete libreoffice-dev
 * Vamos a utilizar libreoffice 3.5, que usa python 2.7

Interfaces

 * Un conjunto de métodos y/o atributos que exponen funcionalidad. Aspectos de la implementación de un objeto.
 * En el api de UNO, todos los nombres de interfaces empiezan con X
 * Todos los interfaces extienden XInterface

Servicios

 * Servicios "New-style": Especifica que objetos que implementan un determinado interfaz (ej: com.sun.star.bridge.XUnoUrlResolver), estarán disponibles bajo un determinado nombre (ej: com.sun.star.bridge.UnoUrlResolver) en el service manager del component context (ver más adelante). Para que un objeto que implementa un servicio pueda implementar varios aspectos o interfaces, el interfaz que implementa heredará de varios otros interfaces.


 * Servicios "Old-style": Los servicios oldstyle pueden verse como un conjunto de interfaces y/o propiedades.
 * Pueden o no exponerse a través del service manager, servir como base de otros servicios (en el new-style, el mecanismo preferido para proporcionar servicios base es implementar interfaces que heredan de varios interfaces), o simplemente servir para agrupar un conjunto de propiedades.
 * Pueden implementar interfaces opcionales
 * Pueden incluir otros servicios, lo que significa que expondrán el conjunto de sus interfaces y de los otros servicios.

Obtener un servicio a través del serviceManager:  Más adelante se hablará del serviceManager y del component context

Obtener los nombres de servicio que soporta un objeto

Propiedades

 * Pares de nombre-valor que expone un servicio.
 * Normalmente suelen ser utilizados para atributos no estructurales (ej: color, tamaño, pero no objetos padre o hijos)
 * Se suelen acceder mediante com.sun.star.beans.XPropertySet, pero también en algunos casos, a través de com.sun.star.beans.XPropertyAccess ó com.sun.star.beans.XMultiPropertySet

Obtener propiedad (XPropertySet):

Establecer propiedad:

Obtener propiedades de un objeto:

Singletons

 * Implementación de interface del que solo existe una instancia accesible desde el component context.

Componentes / extensiones

 * Son librerías que contienen implementaciones de uno o varios servicios en cualquiera de los lenguajes que soporta UNO

Estructuras, Constantes, y Enumeraciones

 * Estructuras: Conjunto de miembros, similar a la estructuras en C. Soportan herencia simple.
 * Instanciando una estructura:


 * Constants: tipo que agrupa varios valores constantes
 * Obteniendo el valor de una constante


 * Enum: Similar a una enumeración en c++

Módulos

 * Espacios de nombres, similares a los namespaces de C++ o a los paquetes en Java. Agrupan servicios, interfaces, structs...

ComponentContext

 * Objeto con el que se obtene el singleton de ServiceManager
 * Puede obtenerse dependiendo de si el código a ejecutar va a ser una macro o un componente.

ServiceManager

 * Objeto con el que se instancian servicios

Macros
Son pequeños programas que usan el api UNO para automatizar tareas en documentos

Ejemplo:


 * XSCRIPTCONTEXT: variable global en el script que contiene Document (el objeto que representa un documento), Desktop y ComponentContext
 * Por defecto todas las funciones del script se exportan como macros. Para limitarlos:
 * El comentario de una función se muestra como descripción de la macro en el diálogo de macros

Ejecución de macros
Puede hacerse a través del díalogo tools -> macros -> run macro... o a través de tools -> macros -> organize macros -> python...

Distribución de macros
Existen varios modos de distribuir una macro
 * En directorio de usuario:
 * ~/.openoffice.org/3/:user/Scripts/python
 * ~/.config/libreoffice/3/user/Scripts/python
 * En directorio compartido (para todos los usuarios)
 * /usr/lib/libreoffice/share/Scripts/python
 * /usr/lib/openoffice/share/Scripts/python
 * Embebido en documentos:
 * 1) Descomprimir documento con unzip
 * 2) Incluir el script en cualquier ruta bajo el directorio Scripts
 * 3) Modificar META-INF/manifest.mf, incluyendo referencia al script:
 * 4) Volver a comprimir el documento
 * Empaquetado
 * Se creará una estructura de archivos:


 * Donde description.xml sirve para dar información sobre el paquete (ver 2_simplemacropkg), y manifest.mf referencia la ruta base de los scripts del siguiente modo:

Transformando código Java a Python: diferencias
Una buena forma de aprender sobre UNO es mediante los ejemplos que hay disponibles. Lamentablemente la mayoría de código es Java o C++. Esto se traduce a:
 * La primera diferencia es obvia: python no es estáticamente tipado
 * Para obtener y usar un servicio, no es necesario instanciar el servicio y luego hacer un UnoRuntime.queryInterface para obtener el interface deseado del tipo correcto. Basta con instanciar el servicio o componente, y usarlo directamente. Ej:


 * Los arrays y listas se transforman de y hacia python como tuplas, NO como listas!.
 * Lo anterior en python sería:

Conectando con libreoffice
Podemos ejecutar scripts python para que se conecten a libreoffice.


 * Arrancar libreoffice escuchando en un puerto


 * Conectarse a libreoffice y obtener objetos necesarios

Calc: Api



 * La mayor parte del api que nos interesa está bajo:
 * com.sun.star.sheet
 * com.sun.star.table


 * Filtros de exportación / Importacion:
 * http://wiki.openoffice.org/wiki/Documentation/DevGuide/Spreadsheets/Filter_Options

Componentes y extensiones en PyUNO

 * Se encuentra en: /usr/lib/libreoffice/program/unopkg




 * Los componentes pueden crearse en python extendiendo de unohelper.Base, e implementando los interfaces necesarios.
 * Pueden implementar interfaces ya existentes en el api de UNO, o crear nuevos
 * Los nuevos interfaces y servicios se declaran mediante UNOIDL en un fichero .idl

Herramienta unopkg
Es la herramienta con la que se pueden instalar, listar, y desinstalar paquetes


 * Instalar extensión:


 * Instalar extensión para todos los usuarios:


 * Listar las extensiones instaladas


 * Eliminar una extensión

Creación de extensión que exponga algún servicio/interfaz

 * 1) Compilar .idl a .urd:
 * 2) meter .urd en .rdb con regmerge
 * 3) Implementación del servicio/interfaz en python
 * 4) Crear description.xml
 * 5) crear .xcu
 * 6) crear META-INF/MANIFEST.MF
 * 7) Empaquetar todo en zip, nombrandolo como myextension.oxt
 * 8) Instalar con unopkg , ó abriendo la extensión con libreoffice.

Jobs

 * Componentes que pueden ser ejecutados como respuesta a un evento en el sistema, o también directamente
 * Han de implementar com.sun.star.task.XJob
 * Son ejecutados por el servicio com.sun.star.task.JobExecutor
 * Pueden ejecutarse mediante eventos estandar del sistema, o mediante eventos personalizados

http://wiki.openoffice.org/wiki/Documentation/DevGuide/WritingUNO/Jobs/List_of_Supported_Events
 * Lista de eventos estándar del sistema

Dialogos
Se pueden crear de dos modos:
 * Directamente con el api de com.sun.star.awt
 * Usando diálogos creados con el IDE básico de dialogos de openoffice, e instanciandolos desde el componente o macro python:

Aumentar nivel de logs
/usr/lib/libreoffice/share/extensions/script-provider-for-python/pythonscript.py
 * Modificar:

Obtener ruta de un paquete desplegado

 * útil para acceder a ficheros de la extensión desplegada, ver ejemplo de toolpanel