Sledování událostí v dokumentu
Kromě přiřazování maker k událostem je možné události vyvolané dokumenty LibreOffice sledovat. Za volání skriptů pro události jsou zodpovědné broadcastery z rozhraní pro programování aplikací (API). Na rozdíl od posluchačů, u nichž je nutné definovat všechny podporované metody (i nepoužité), funkce pro sledování dokumentu vyžadují kromě skriptů pro událost, ke které se vztahují, pouze dvě metody.
Naslouchání událostem v dokumentu
Sledování je níže ukázáno pro jazyky Basic a Python a objektově orientované programování. Přiřadíte-li události OpenDocument skript OnLoad, můžete sledovat události inicializace a zavření dokumentu. K přiřazení skriptů slouží karta z nabídky .
Zastavování událostí napomáhá tomu, abyste nastavili prostředí pro skripty, například můžete načíst nebo uvolnit knihovny nebo nastavit na pozadí sledování skriptů. Příkladem posledně jmenované činnosti je použití modulu Access2Base Trace.
Pomocí Pythonu
Sledování událostí začíná při vytvoření instance objektu a končí, když je objekt v Pythonu uvolněn. Vyvolané události jsou zaznamenávány pomocí konzole Access2Base.
Události OnLoad a OnUnload můžete využít k tomu, abyste nastavili, případně zrušili nastavení cesty k programům Pythonu. Tyto události jsou uváděny pod názvy Otevřít dokument a Dokument zavřen.
# -*- 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):
""" Sledování události v dokumentu """
'''
upraveno ze stránky 'Python script to monitor OnSave event' na
https://forum.openoffice.org/en/forum/viewtopic.php?t=68887
'''
def __init__(self):
""" Sledování událostí v dokumentu """
''' záznam pomocí konzole Access2Base.Trace nebo
do prvního sloupce na prvním listu v dokumentu Calcu '''
ctx = uno.getComponentContext()
smgr = ctx.getServiceManager()
desktop = smgr.createInstanceWithContext(
'com.sun.star.frame.Desktop' , ctx)
self.doc = desktop.CurrentComponent
#self.row = 0 # odkomentovat pouze pro dokumenty Calcu
Console.setLevel("DEBUG")
self.listen() # Začne sledovat události v dokumentu
@property
def Filename(self) -> str:
sys_filename = uno.fileUrlToSystemPath(self.doc.URL)
return os.path.basename(sys_filename)
def setCell(self, calcDoc, txt: str):
""" Vypíše události v dokumentu do prvního sloupce sešitu Calcu """
sheet = calcDoc.getSheets().getByIndex(0)
sheet.getCellByPosition(0,self.row).setString(txt)
self.row = self.row + 1
def listen(self, *args): # nejprve OnLoad/OnNew
""" Začne sledovat události v dokumentu """
self.doc.addDocumentEventListener(self)
Console.log("INFO", "Události v dokumentu se zaznamenávají", True)
def sleep(self, *args): # nakonec OnUnload (nepovinné)
""" Zastaví sledování událostí v dokumentu """
self.doc.removeDocumentEventListener(self)
Console.log("INFO", "Události v dokumentu byly zaznamenány", True)
def documentEventOccured(self, event: DocumentEvent):
""" Přeruší každou událost v dokumentu """
#self.setCell(event.Source, event.EventName) # pouze pro dokumenty Calcu
Console.log("DEBUG",
event.EventName+" in "+self.Filename,
False)
def disposing(self, event: EventObject):
""" Uvolní všechny činnosti """
self.sleep()
Console.show()
def OnLoad(*args): # Událost 'Otevřít dokument'
listener = UiDocument() # Initiates listening
def OnUnload(*args): # Událost 'Dokument zavřen'
pass # (nepovinné) provedeno při uvolňování
g_exportedScripts = (OnLoad,)
from com.sun.star.script.provider import XScript
class Console():
"""
Konzole na pozadí nebo v popředí pro záznam vykonávání programu.
"""
@staticmethod
def trace(*args,**kwargs):
""" Vypíše do konzole libovolně dlouhý seznam položek """
scr = Console._a2bScript(script='DebugPrint', module='Compatible')
scr.invoke((args),(),())
@staticmethod
def log(level: str, text: str, msgBox=False):
""" Přidá do konzole zprávu protokolu, volitelně s uživatelským vstupem """
scr = Console._a2bScript(script='TraceLog')
scr.invoke((level,text,msgBox),(),())
@staticmethod
def setLevel(logLevel: str):
""" Nastaví dolní mez pro úroveň zpráv protokolu """
scr = Console._a2bScript(script='TraceLevel')
scr.invoke((logLevel,),(),())
@staticmethod
def show():
""" Zobrazí obsah konzole """
scr = Console._a2bScript(script='TraceConsole')
scr.invoke((),(),())
@staticmethod
def _a2bScript(script: str, library='Access2Base',
module='Trace') -> XScript:
''' Grab application-based Basic script '''
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
Název metody documentEventOccured obsahuje pravopisnou chybu, protože stejná chyba se nachází v rozhraní pro programování aplikací (API) pro LibreOffice.
Události Spustit aplikaci a Ukončit aplikaci je možné použít k tomu, abyste nastavili či zrušili nastavení cesty k Pythonu pro uživatelské skripty nebo skripty LibreOffice. Podobným způsobem, pomocí událostí Otevřít dokument a Dokument zavřen, lze načítat a uvolňovat knihovny nebo moduly Pythonu vložené v dokumentu. Další informace naleznete v části Import modulů Pythonu.
Pomocí jazyka LibreOffice Basic
Skript Onload je přiřazen k události Otevřít dokument pomocí volby a následně na kartě . Sledování události začíná ve chvíli, kdy je inicializován objekt ConsoleLogger a končí tehdy, když Basic tento objekt uvolní. Událost OnLoad načte nezbytné knihovny Basicu, zachycené události jsou hlášeny modulem Access2Base.Trace.
REM modul controller.Events
Option Explicit
Private _obj As Object ' instance objektu controller.ConsoleLogger
Sub OnLoad(evt As com.sun.star.document.DocumentEvent) ' "Otevřít dokument"
_obj = New ConsoleLogger : _obj.Start(evt)
End Sub ' controller.OnLoad
' ----
REM modul třídy controller.ConsoleLogger
Option Explicit
Option Compatible
Option ClassModule
' objekt návrhového vzoru adaptér, který se inicializuje v události "Otevřít dokument"
Private Const UI_PROMPT = True
Private Const UI_NOPROMPT = False ' Set it to True to visualise documents events
' konstruktor/destruktor
Private Sub Class_Initialize()
End Sub ' controller.ConsoleLogger.Initialize
Private Sub Class_Terminate()
End Sub ' controller.ConsoleLogger.Terminate
' členové
Private _evtAdapter As Object ' com.sun.star.document.XDocumentEventBroadcaster
' PROPERTIES
Private Property Get FileName As String
''' Název souboru závislý na operačním systému '''
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
' metody
Private Sub _documentEventOccured(evt As com.sun.star.document.DocumentEvent)
''' Sleduje události v dokumentu '''
Access2Base.Trace.TraceLog("DEBUG", _
evt.EventName &" in "& Filename(evt.Source.URL), _
UI_NOPROMPT)
Select Case evt.EventName
Case "OnUnload" : _Stop(evt)
End Select
End Sub ' controller.ConsoleLogger._documentEventOccured
Private Sub _disposing(evt As com.sun.star.lang.EventObject)
End Sub ' controller.ConsoleLogger.disposing
Public Sub Start(Optional evt As com.sun.star.document.DocumentEvent)
''' Inicializuje zápis událostí v dokumentu do protokolu '''
Const _LIBRARY = "Access2Base" : With GlobalScope.BasicLibraries
If Not .IsLibraryLoaded(_LIBRARY) Then .LoadLibrary(_LIBRARY)
End With : Access2Base.Trace.TraceLevel("DEBUG")
Access2Base.Trace.TraceLog("INFO", _
IIf(IsMissing(evt),"",evt.EventName & "-") & "Události v dokumentu se zapisují do protokolu", _
UI_PROMPT)
_evtAdapter = CreateUnoListener( "_", "com.sun.star.document.XDocumentEventListener" )
ThisComponent.addDocumentEventListener( _evtAdapter )
End Sub ' controller.ConsoleLogger.Start
Private Sub _Stop(Optional evt As com.sun.star.document.DocumentEvent)
''' Ukončí zápis událostí v dokumentu do protokolu '''
ThisComponent.removeDocumentEventListener( _evtAdapter )
Access2Base.Trace.TraceLog("INFO", _
IIf(IsMissing(evt),"",evt.EventName & "-") & "Události v dokumentu byly zapsány do protokolu", _
UI_PROMPT)
Access2Base.Trace.TraceConsole() ' Captured events dialog
End Sub ' controller.ConsoleLogger._Stop
' EVENTS
' Místo pro kód pro zpracovávané události
Název metody documentEventOccured obsahuje pravopisnou chybu, protože stejná chyba se nachází v rozhraní pro programování aplikací (API) pro LibreOffice.
Seznam událostí v dokumentu
Broadcaster, objekt API, umožňuje získat seznam událostí, za něž je zodpovědný:
Pomocí Pythonu
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import uno, apso_utils as ui
def displayAvailableEvents():
""" Zobrazí události v dokumentu """
'''
upraveno z funkce DisplayAvailableEvents() od A. Pitonyaka
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,)
Pro výpis informací o událostech na obrazovku se používá rozšíření Alternative Python Script Organizer (APSO).
Pomocí jazyka LibreOffice Basic
Sub DisplayAvailableEvents
''' Zobrazí události v dokumentu '''
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