Ajuda do LibreOffice 26.2
A monitorização de eventos pode ser útil nas seguintes situações:
Identifique um novo documento no momento da abertura, em vez dos documentos existentes, e efetue uma configuração específica.
Controlar o processamento de pedidos de gravação, cópia, impressão ou mala direta de documentos.
Recalcular o índice, os índices ou as entradas da tabela de um documento do Writer quando o documento estiver prestes a ser fechado
Importe os pacotes matemáticos do Python antes de abrir um documento do Calc. Liberte esses pacotes quando o documento for fechado.
Além de atribuir macros a eventos, você pode monitorizar eventos criados por documentos do LibreOffice. Os difusores da API (Application Programming Interface) são responsáveis pelas chamadas a macros de eventos. Diferente dos recetores que requerem a definição de todos os métodos suportados, mesmo que não utilizados, a monitorização de documentos requer somente dois métodos além dos scripts de eventos relacionados.
A monitorização é aqui ilustrada para as linguagens Basic e Python, utilizando programação orientada para objetos. Basta atribuir o script OnLoad ao evento para iniciar e encerrar a monitorização de eventos do documento. A guia do menu é utilizada para atribuir qualquer um dos scripts.
A interceção de eventos ajuda a definir pré-condições e pós-condições para scripts, tais como o carregamento e descarregamento de bibliotecas, ou a acompanhar o processamento de scripts em segundo plano. A utilização do módulo Access2Base.Trace ilustra esse segundo contexto.
A monitorização de eventos começa da instanciação do objeto, e termina quando o Python liberta o objeto. Os eventos criados são reportados ao utilizar a consola do Access2Base.
Os eventos OnLoad e OnUnload podem ser utilizados para definir e anular, respetivamente, o caminho dos programas Python. São descritos como e .
# -*- 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):
""" Monitorizar eventos de documento """
'''
adaptado de 'Python script to monitor OnSave event' de
https://forum.openoffice.org/en/forum/viewtopic.php?t=68887
'''
def __init__(self):
""" Monitorizar eventos de documento """
''' reportar utilizando a consola Access2Base.Trace OU
reportar na 1.ª folha, 1.ª coluna para documentos do Calc '''
ctx = uno.getComponentContext()
smgr = ctx.getServiceManager()
desktop = smgr.createInstanceWithContext(
'com.sun.star.frame.Desktop' , ctx)
self.doc = desktop.CurrentComponent
#self.row = 0 # remover comentário apenas em documentos do Calc
Console.setLevel("DEBUG")
self.listen() # Começar a monitorizar eventos de documento
@property
def Filename(self) -> str:
sys_filename = uno.fileUrlToSystemPath(self.doc.URL)
return os.path.basename(sys_filename)
def setCell(self, calcDoc, txt: str):
""" Saída dos eventos de doc. na 1.ª coluna de uma folha Calc """
sheet = calcDoc.getSheets().getByIndex(0)
sheet.getCellByPosition(0,self.row).setString(txt)
self.row = self.row + 1
def listen(self, *args): # OnLoad/OnNew o mais cedo
""" Começar monitorização de eventos de documento """
self.doc.addDocumentEventListener(self)
Console.log("INFO", "Os eventos de documento estão a ser registados", True)
def sleep(self, *args): # OnUnload por último (opcional)
""" Encerrar monitorização de eventos de documento """
self.doc.removeDocumentEventListener(self)
Console.log("INFO", "Os eventos de documento foram registados", True)
def documentEventOccured(self, event: DocumentEvent):
""" Intercetar todos os eventos de documento """
#self.setCell(event.Source, event.EventName) # apenas em documentos do Calc
Console.log("DEBUG",
event.EventName+" in "+self.Filename,
False)
def disposing(self, event: EventObject):
""" Libertar todas as atividades """
self.sleep()
Console.show()
def OnLoad(*args): # evento 'Abrir documento'
listener = UiDocument() # Inicia a escuta
def OnUnload(*args): # evento 'Documento foi fechado'
pass # (opcional) executado quando dispensado
g_exportedScripts = (OnLoad,)
from com.sun.star.script.provider import XScript
class Console():
"""
Consola para trás ou para a frente para reportar/registar execução de programa.
"""
@staticmethod
def trace(*args,**kwargs):
""" Imprimir lista de itens livre na consola """
scr = Console._a2bScript(script='DebugPrint', module='Compatible')
scr.invoke((args),(),())
@staticmethod
def log(level: str, text: str, msgBox=False):
""" Anexar mensagem de registo na consola, pergunta opcional ao utilizador """
scr = Console._a2bScript(script='TraceLog')
scr.invoke((level,text,msgBox),(),())
@staticmethod
def setLevel(logLevel: str):
""" Definir limite inferior em mensagens de registo """
scr = Console._a2bScript(script='TraceLevel')
scr.invoke((logLevel,),(),())
@staticmethod
def show():
""" Exibir o conteúdo ou diálogo da consola """
scr = Console._a2bScript(script='TraceConsole')
scr.invoke((),(),())
@staticmethod
def _a2bScript(script: str, library='Access2Base',
module='Trace') -> XScript:
''' Script básico baseado na aplicação Grab '''
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
Preste atenção ao erro no método documentEventOccured que herda um erro da LibreOffice Application Programming Interface (API).
Os eventos e podem ser utilizados, respetivamente, para definir e anular o caminho Python para scripts do utilizador ou scripts LibreOffice. De forma semelhante, as bibliotecas ou módulos Python baseados em documentos podem ser carregados e libertados utilizando os eventos e . Consulte Importação de módulos Python para obter mais informações.
Ao utilizar o menu e o separador , o evento aciona a inicialização do ConsoleLogger. A rotina _documentEventOccured — definida pelo ConsoleLogger — serve como um ponto de entrada único para capturar todos os eventos de documento.
Option Explicit
Global _obj como Object ' instância de controller.ConsoleLogger
Sub OnLoad(evt As com.sun.star.document.DocumentEvent) ' >> Abrir documento <<
_obj = New ConsoleLogger : _obj.StartAdapter(evt)
End Sub ' controller.OnLoad
Sub _documentEventOccured(evt As com.sun.star.document.DocumentEvent)
''' Ponto de entrada único do ConsoleLogger '''
_obj.DocumentEventOccurs(evt)
End Sub ' controller._documentEventOccured
A monitorização de eventos começa no momento em que um objeto ConsoleLogger é instanciado e termina quando o documento é fechado. A rotina StartAdapter carrega as bibliotecas Basic necessárias, enquanto os eventos capturados são comunicados através do módulo Access2Base.Trace.
Option Explicit
Option Compatible
Option ClassModule
' Objeto do padrão de design ADAPTER a ser instanciado no evento «Abrir Documento»
Private Const UI_PROMPT = True
Private Const UI_NOPROMPT = False ' Defina como True para visualizar os eventos dos documentos
' MEMBERS
Private _evtAdapter As Object ' com.sun.star.document.XDocumentEventBroadcaster
Private _txtMsg As String ' mensagem de texto a registar na consola
' CARACTERÍSTICAS
Private Property Get FileName As String
''' Nome de ficheiro dependente do 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
' METHODS
Public Sub DocumentEventOccurs(evt As com.sun.star.document.DocumentEvent)
''' Monitorizar eventos de documento '''
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)
''' Inicializar registo de eventos de documento '''
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 & "Os eventos do documento estão a ser registados", 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)
''' Terminar registo de eventos de documento '''
ThisComponent.removeDocumentEventListener( _evtAdapter )
If IsMissing(evt) Then _txtMsg = "" Else _txtMsg = evt.EventName & "-"
Access2Base.Trace.TraceLog("INFO", _txtMsg & "Os eventos do documento foram registados", UI_PROMPT)
Access2Base.Trace.TraceConsole() ' Caixa de diálogo de eventos capturados
End Sub ' controller.ConsoleLogger._StopAdapter
' EVENTOS
' O seu código para tratar eventos segue aqui
Preste atenção ao erro no método _documentEventOccured que herda um erro ortográfico da LibreOffice Application Programming Interface (API).
O objeto API emissor fornece a lista de eventos dos quais é responsável:
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import uno, apso_utils as ui
def displayAvailableEvents():
""" Exibir eventos de documento """
'''
adaptado de DisplayAvailableEvents() por 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,)
A extensão Alternative Python Script Organizer (APSO) é utilizada para mostrar informações de eventos no ecrã.
Sub DisplayAvailableEvents
''' Exibir eventos de documento '''
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