Escolta els esdeveniments del document

Escoltar els esdeveniments del document pot ajudar en les següents situacions:

Al costat d'assignar macros als esdeveniments, es poden monitoritzar els esdeveniments llençats pels documents de Collabora Office. Els emissors de la interfície de programació d'aplicacions (API) són els responsables de cridar als scripts dels esdeveniments. A diferència dels supervisors que requereixen definir tots els mètodes que suporten encara que no s'utilitzin, els monitors de documents només requereixen dos mètodes junt amb els scripts dels esdeveniments connectats.

Monitoratge dels esdeveniments del document

A continuació s'il·lustra la supervisió per als llenguatges Basic i Python utilitzant programació orientada a objectes. Assignar l'script OnLoad a l'esdeveniment Obrir document, és suficient per iniciar i finalitzar la supervisió d'esdeveniments del document. El menú Eines - Personalitzar de la pestanya Esdeveniments s'utilitza per assignar qualsevol dels scripts.

Interceptar esdeveniments ajuda a establir les pre- i postcondicions dels scripts com ara la càrrega i descàrrega de biblioteques o el seguiment del processament dels scripts en segon pla. L'ús del mòdul Access2Base.Trace il·lustra aquest segon context.

Amb Python

El monitoratge d'esdeveniments comença quan s'instancià l'objecte i s'atura quan Python l'allibera. Els informes dels esdeveniments es llencen utilitzant la consola d'Access2Base.

note

Els esdeveniments OnLoad i OnUnload es poden utilitzar per, respectivament, activar i desactivar la ruta dels programes Python. Es descriuen com a Document obert i Document tancat.


# -*- coding: utf-8 -*-
from __future__ import unicode_literals

import os.path, uno, unohelper
from com.sun.star.document import DocumentEvent, \
    XDocumentEventListener as AdapterPattern
from com.sun.star.lang import EventObject

class UiDocument(unohelper.Base, AdapterPattern):
    """Monitoritza esdeveniments del document"""
    '''
    adaptat de l'script 'Python per monitoritzar l'esdeveniment OnSave' a
    https://forum.openoffice.org/en/forum/viewtopic.php?t=68887
    '''
    def __init__(self):
        """Monitor d’esdeveniments del document"""
        '''informa utilitzant la consola Access2Base.Trace OR
        informe al 1r full, 1a columna per a documents del Calc'''
        ctx = uno.getComponentContext()
        smgr = ctx.getServiceManager()
        desktop = smgr.createInstanceWithContext(
        'com.sun.star.frame.Desktop' , ctx)
        self.doc = desktop.CurrentComponent
        #self.row = 0 # descomentar només per als documents del Calc
        Console.setLevel("DEBUG")
        auto.listen() # Inicia el monitoratge d'esdeveniments del document

    @property
    def Filename(self) -> str:
        sys_filename = uno.fileUrlToSystemPath(self.doc.URL)
        return os.path.basename(sys_filename)

    def setCell(self, calcDoc, txt: str):
        """Sortida dels esdeveniments del document a la primera columna d'un full de càlcul"""
        sheet = calcDoc.getSheets().getByIndex(0)
        sheet.getCellByPosition(0,self.row).setString(txt)
        self.row = self.row + 1

    def listen(self, *args):  # OnLoad/OnNew la primera vegada
        """Inicia el seguiment d'esdeveniments del document """
        self.doc.addDocumentEventListener(self)
        Console.log("INFO" "Els esdeveniments del document s'estan registrant", True)

    def sleep(self *args) # OnUnload la darrera (opcional)
        """Atura el seguiment dels esdeveniments del document"""
        self.doc.removeDocumentEventListener(self)
        Console.log("INFO" "Els esdeveniments del document s'han registrat", True)

    def documentEventOccured(self, event: DocumentEvent):
        """Intercepta tots els esdeveniments del document""
        #self.setCell(event.Source event.EventName) # només per a documents del Calc
        Console.log("DEBUG",
            event.EventName+" in "+self.Filename,
            False)

    def disposing(self, event: EventObject):
        """Allibera totes les activitats"""
        self.sleep()
        Console.show()

def OnLoad(*args) # Esdeveniment 'Open Document'
    listener = UiDocument()  # Inicialitza l'escolta

def OnUnload(*args) # Esdeveniment 'El document s'ha tancat'
    pass # (opcional) realitzat durant la supressió

g_exportedScripts = (OnLoad,)

from com.sun.star.script.provider import XScript
class Console():
    """
    Consola (Fons/Primer pla) per informar/registrar l'execució de programes.
    """
    @staticmethod
    def trace(*args,**kwargs):
        """ Imprimeix la llista d'elements lliures a la consola """
        scr = Console._a2bScript(script='DebugPrint', module='Compatible')
        scr.invoke((args),(),())
    @staticmethod
    def log(level: str, text: str, msgBox=False):
        """ Afegeix el missatge de registre a la consola, sol·licitud d'usuari opcional """
        scr = Console._a2bScript(script='TraceLog')
        scr.invoke((level,text,msgBox),(),())
    @staticmethod
    def setLevel(logLevel: str):
        """ Estableix el límit inferior per als missatges de registre ""
        scr = Console._a2bScript(script='TraceLevel')
        scr.invoke((logLevel,),(),())
    @staticmethod
    def show():
        """ Mostra el contingut de la consola/diàleg ""
        scr = Console._a2bScript(script='TraceConsole')
        scr.invoke((),(),())
    @staticmethod
    def _a2bScript(script: str, library='Access2Base',
        module='Trace') -> XScript:
        ''' Captura l'script Basic basat en aplicacions '''
        sm = uno.getComponentContext().ServiceManager
        mspf = sm.createInstanceWithContext(
            "com.sun.star.script.provider.MasterScriptProviderFactory",
            uno.getComponentContext())
        scriptPro = mspf.createScriptProvider("")
        scriptName = "vnd.sun.star.script:"+library+"."+module+"."+script+"?language=Basic&location=application"
        xScript = scriptPro.getScript(scriptName)
        return xScript
warning

Observeu l'error que hi ha al mètode documentEventOccured, que ha heretat una falta d'ortografia de la interfície de programació d'aplicacions (API) del Collabora Office.


Icona de consell

Els events Iniciar l'aplicació i Tancar l'aplicació es poden utilitzar, respectivament, per establir i desestablir el camí de Python als scripts d'usuari o de Collabora Office. De forma similar, les llibreries o mòduls de Python basats en documents, es poden carregar i alliberar mitjançant els esdeveniments Obre document i Tanca document. Consulteu Importació de mòduls de Python per obtenir més informació.


Amb Basic de Collabora Office

Utilitzant el menú Eines ▸ Personalitza de la pestanya Events, l'event Obre document llença la inicialització ConsoleLogger. La rutina _documentEventOccured, establerta per ConsoleLogger, serveix com a punt d'entrada únic per a capturar tots els esdeveniments del document.

Mòdul controller.Events

Option Explicit

Global _obj As Object 'Instància de controller.ConsoleLogger

Sub OnLoad(evt As com.sun.star.document.DocumentEvent)' >> Obre document <<
    _obj = New ConsoleLogger : _obj.StartAdapter(evt)
End Sub ' controller.OnLoad
Sub _documentEventOccured(evt As com.sun.star.document.DocumentEvent)
    ''' punt d'entrada únic de ConsoleLogger '''
     _obj.DocumentEventOccurs(evt)
End Sub ' controller._documentEventOccured

Mòdul de classe controller.ConsoleLogger

La supervisió d'esdeveniments comença des del moment en què s'instancia un objecte ConsoleLogger i finalment s'atura en tancar el document. La rutina StartAdapter carrega les llibreries bàsiques necessàries, mentre que els esdeveniments capturats es reporten mitjançant el mòdul Access2Base.Trace.

Option Explicit
Option Compatible
Option ClassModule

'Objecte patró de disseny ADAPTER que instanciarà l'esdeveniment "Obre document"
Private Const UI_PROMPT = True
Private Const UI_NOPROMPT = False ' Establiu-lo a True per visualitzar els esdeveniments dels documents

' MEMBRES
Private _evtAdapter As Object ' com.sun.star.document.XDocumentEventBroadcaster
Private _txtMsg As String ' missatge de text a registrar a la consola

' PROPIETATS
Private Property Get FileName As String
    ''' nom de fitxer depenent del sistema '''
    Const _LIBRARY = "Tools" : With GlobalScope.BasicLibraries
        If Not .IsLibraryLoaded(_LIBRARY) Then .LoadLibrary(_LIBRARY)
    End With
    Filename = Tools.Strings.FilenameOutofPath(ThisComponent.URL)
End Property ' controller.ConsoleLogger.Filename

' MÈTODES
Public Sub DocumentEventOccurs(evt As com.sun.star.document.DocumentEvent)
    ''' Monitorització dels esdeveniments del document '''
    Access2Base.Trace.TraceLog("DEBUG", _
        evt.EventName &" in "& Filename(evt.Source.URL), _
        UI_NOPROMPT)
    Select Case evt.EventName
        Case "OnUnload" : _StopAdapter(evt)
    End Select
End Sub ' controller.ConsoleLogger.DocumentEventOccurs

Public Sub StartAdapter(Optional evt As com.sun.star.document.DocumentEvent)
    ''' Inicialitza el registre d'esdeveniments del document '''
    Const _LIBRARY = "Access2Base" : With GlobalScope.BasicLibraries
        If Not .IsLibraryLoaded(_LIBRARY) Then .LoadLibrary(_LIBRARY)
    End With : Access2Base.Trace.TraceLevel("DEBUG")
    If IsMissing(evt) Then _txtMsg = "" Else _txtMsg = evt.EventName & "-"
    Access2Base.Trace.TraceLog("INFO", _txtMsg & "Els esdeveniments del document s'estan registrant", UI_PROMPT)
    _evtAdapter = CreateUnoListener( "_", "com.sun.star.document.XDocumentEventListener" )
    ThisComponent.addDocumentEventListener( _evtAdapter )
End Sub ' controller.ConsoleLogger.StartAdapter

Private Sub _StopAdapter(Optional evt As com.sun.star.document.DocumentEvent)
    ''' Finalitza el registre d'esdeveniments del document '''
    ThisComponent.removeDocumentEventListener( _evtAdapter )
    If IsMissing(evt) Then _txtMsg = "" Else _txtMsg = evt.EventName & "-"
    Access2Base.Trace.TraceLog("INFO", _txtMsg & "Els esdeveniments del document s'estan registrant", UI_PROMPT)
    Access2Base.Trace.TraceConsole() ' Diàleg amb els esdeveniments capturats
End Sub ' controller.ConsoleLogger._StopAdapter

' ESDEVENIMENTS
' El codi per al gestor d'esdeveniments va aquí
warning

Pareu atenció al mètode mal escrit _documentEventOccured, la grafia del qual és heretada de la interfície de programació d'aplicacions (API) de Collabora Office.


Descobriment dels esdeveniments del document

L'API de l'objecte locutor proporciona la llista d'esdeveniments dels quals és responsable:

Amb Python

# -*- coding: utf-8 -*-
from __future__ import unicode_literals

import uno, apso_utils as ui

def displayAvailableEvents():
    """ Mostra els esdeveniments del document """
    '''
    adaptat de DisplayAvailableEvents() per A. Pitonyak
    https://forum.openoffice.org/en/forum/viewtopic.php?&t=43689
    '''
    ctx = XSCRIPTCONTEXT.getComponentContext()
    smgr = ctx.ServiceManager
    geb = smgr.createInstanceWithContext(
        "com.sun.star.frame.GlobalEventBroadcaster", ctx)
    events = geb.Events.getElementNames()
    ui.msgbox('; '.join(events))

g_exportedScripts = (displayAvailableEvents,)
note

L'extensió Organitzador de l'script Python alternatiu (OSPA) s'utilitza per renderitzar informació dels esdeveniments sobre la pantalla


Amb el Basic de Collabora Office

Sub DisplayAvailableEvents
    ''' Mostra els esdeveniments del document '''
    Dim geb As Object ' com.sun.star.frame.GlobalEventBroadcaster
    Dim events() As String
    geb = CreateUnoService("com.sun.star.frame.GlobalEventBroadcaster")
    events = geb.Events.ElementNames()
    MsgBox Join(events, "; ")
End Sub

Ens cal la vostra ajuda!