LibreOffice 24.8 Hjelp
Å lytta til dokumenthendingar kan vera til nytte i desse situasjonane:
Identifiser eit nytt dokument ved opninga, i motsetnad til dei som finst frå før, og utfør eit dedikert oppsett.
Kontroller handsaminga av førespurnadar om lagring av dokument, kopiering av dokument, utskrift eller samanslåing.
Oppdater innhaldslister, indeksar eller tabelloppføringar i eit Writer-dokument på nytt når dokumentet skal lukkast
Importer matematiske Python-pakker før du opnar eit Calc -dokument. Frigjer desse pakkene når dokumentet vert lukka.
I tillegg til å knytte makroar til hendingar kan ein overvaka hendingar frå LibreOffice-dokument. API (Application Programming Interface)-sendarane er ansvarlege for å kalla opp hendings-skript. I motsetnad til lydarane som skal definera alle støtta metodar, også ubrukte, krev dokumentovervakarane berre to metodar ved sida av skript for lenkja hendingar.
Overvakinga vert vist her for språka Basic og Python med objektorientert programmering. Tildeling av skriptet OnLoad til hendinga er nok for å byrja og avslutta overvakinga. Fana i menyen vert brukt for å tilordna begge skripta.
Innhenting av hendingar gjer det enklare å setja skript før og etter vilkåra, for eksempel inn- og utlesing av bibliotek eller sporing av skripthandsaming i bakgrunnen. Bruken av modulen Access2Base Trace viser denne sistnemnde samanhengen.
Overvakinga av hendingar byrjar med opprettinga av objekt og sluttar når Python gjev objektet fri. Hendingar som er registrerte, vert rapporterte ved hjelp av Access2Base -konsollen.
Hendingane OnLoad og OnUnload kan brukast til å setja og oppheva programstien for Python. Dei er omtalte som og .
# -*- 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):
""" Overvak dokumenthendingar """
'''
omforma frå «Python-script til å overvaka OnSave-hendingar» på
https://forum.openoffice.org/en/forum/viewtopic.php?t=68887
'''
def __init__(self):
""" Overvaking av dokumenthendingar """
''' rapporter med Access2Base.Trace-konsollen ELLER
rapporter på Ark 1, første kolonne for Calc-dokument '''
ctx = uno.getComponentContext()
smgr = ctx.getServiceManager()
desktop = smgr.createInstanceWithContext(
'com.sun.star.frame.Desktop' , ctx)
self.doc = desktop.CurrentComponent
#self.row = 0 # utkommenterer berre for Calc-dokument
Console.setLevel("DEBUG")
self.listen() # Start overvaking av doc.-hendingar
@property
def Filename(self) -> str:
sys_filename = uno.fileUrlToSystemPath(self.doc.URL)
return os.path.basename(sys_filename)
def setCell(self, calcDoc, txt: str):
""" Vis dokumenthendingar i første kolonne i eit Calc-rekneark """
sheet = calcDoc.getSheets().getByIndex(0)
sheet.getCellByPosition(0,self.row).setString(txt)
self.row = self.row + 1
def listen(self, *args): # OnLoad/OnNew først
""" Start overvaking av dokumenthendingar """
self.doc.addDocumentEventListener(self)
Console.log("INFO", "Dokumenthendingar vert logga", True)
def sleep(self, *args): # OnUnload sist (valfri)
""" Stopp overvaking av dokumenthendingar """
self.doc.removeDocumentEventListener(self)
Console.log("INFO", "Dokumenthendingar vert logga", True)
def documentEventOccured(self, event: DocumentEvent):
""" Overvakar alle dokumenthendingar """
#self.setCell(event.Source, event.EventName) # berre for Calc-dokument
Console.log("DEBUG",
event.EventName+" in "+self.Filename,
False)
def disposing(self, event: EventObject):
""" Frigjev alle aktivitetar """
self.sleep()
Console.show()
def OnLoad(*args): # 'Opna dokumenthending
lyttar = UiDocument() # Byrjar lytting
def OnUnload(*args): # 'Dokument er lukka'-hending
pass # (valfri) vert utført ved avslutning
g_exportedScripts = (OnLoad,)
from com.sun.star.script.provider import XScript
class Console():
"""
(Bak-/For-)grunnskonsoll til rapportering/logging av program.
"""
@staticmethod
def trace(*args,**kwargs):
""" Skriv liste over frie element til konsollen """
scr = Console._a2bScript(script='DebugPrint', module='Compatible')
scr.invoke((args),(),())
@staticmethod
def log(level: str, text: str, msgBox=False):
""" Legg loggmelding til konsollen, valfri brukarførespurnad """
scr = Console._a2bScript(script='TraceLog')
scr.invoke((level,text,msgBox),(),())
@staticmethod
def setLevel(logLevel: str):
""" Sett nedre grense for loggmeldingar """
scr = Console._a2bScript(script='TraceLevel')
scr.invoke((logLevel,),(),())
@staticmethod
def show():
""" Vis konsollinnhald/-dialog """
scr = Console._a2bScript(script='TraceConsole')
scr.invoke((),(),())
@staticmethod
def _a2bScript(script: str, library='Access2Base',
module='Trace') -> XScript:
''' Ta tak i programbasert Basic skript '''
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
Ver merksam på den feilstava documentEventOccured-metoden som arvar ein trykkfeil frå LibreOffice API (Application Programming Interface, grensesnittet for programmet).
Hendingane Importing Python Modules.
og kan brukast for å setja og frigjera Python-stien til brukar-skript eller LibreOffice-skript. På same måten kan dokumentbaserte Python-bibliotek setjast eller frigjevast med og -hendingar. Du finn meir om dette påVed å bruka menyen Konsoll-Loggar. Rutinen _documentEventOccured – gjeve av ConsoleLogger – fungerer som eit unikt inngangspunkt for å fanga alle dokumenthendingar.
og fana , vil hendinga gjera ei initialisering av
Option Explicit
Global _obj As Object ' Førekomst av controller.ConsoleLogger
Sub OnLoad(evt As com.sun.star.document.DocumentEvent) ' >> Opna dokument <<
_obj = New ConsoleLogger : _obj.StartAdapter(evt)
End Sub ' controller.OnLoad
Sub _documentEventOccured(evt As com.sun.star.document.DocumentEvent)
'' 'ConsoleLogger unikt inngangspunkt' ''
_obj.DocumentEventOccurs(evt)
End Sub ' controller._documentEventOccured
Hendingsovervakinga byrjar når eit ConsoleLogger-objekt startar og stoppar når dokumentet vert lukka. Rutinen StartAdapter lastar nødvendige grunnleggjande bibliotek, medan oppfanga hendingar vert rapporterte ved hjelp av modulen Access2Base.Trace.
Option Explicit
Option Compatible
Option ClassModule
' ADAPTER-utformingsmønster-objekt som skal opnast i hendinga «Opna dokument»
Private Const UI_PROMPT = True
Privat Const UI_NOPROMPT = False 'Set han til True for å visualisere dokumenthendingar
' MEMBERS
Private _evtAdapter As Object ' com.sun.star.document.XDocumentEventBroadcaster
Privat tekstmelding for _txtMsg As String for å logga i konsollen
' EIGENSKAPAR
Private Property Get FileName As String
''' System-avhengig filnamn '''
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)
''' Overvak dokumenthendingar '''
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)
''' Slå på logging av dokumenthendingar '''
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 & "Dokumenthendingar vert logga", 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)
''' Slå av logging av dokumenthendingar '''
ThisComponent.removeDocumentEventListener( _evtAdapter )
If IsMissing(evt) Then _txtMsg = "" Else _txtMsg = evt.EventName & "-"
Access2Base.Trace.TraceLog ("INFO", _txtMsg & "Dokumenthendingar er logga", UI_PROMPT)
Access2Base.Trace.TraceConsole () ' Dialog for oppfanga hendingar
End Sub ' controller.ConsoleLogger._StopAdapter
' HENDINGAR
' Her skriv du inn koden for handsaming av hendingar
Ver merksam på den feilstava documentEventOccured-metoden som arvar ein trykkfeil frå LibreOffice API (Application Programming Interface, grensesnittet for programmet).
API-objektet for kringkastaren gjev deg lista over hendingar det er ansvarleg for:
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import uno, apso_utils as ui
def displayAvailableEvents():
""" Vis dokumenthendingar """
'''
tilpassa etter DisplayAvailableEvents() av 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,)
Utvidinga Alternative Python Script Organizer (APSO = Alternativ Python-Script-organisator) vert brukt for å levera hendingsinformasjon til skjermen.
Sub DisplayAvailableEvents
''' Vis dokumenthendingar '''
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