OvervÄke Dokumenthendelser

Ved siden av tilordne makroer til hendelser , kan man overvÄke LibreOffice-dokumenthendelser. Applikasjonsprogrammeringsgrensesnitt (API) kringkastere er ansvarlige for Ä kalle opp hendelsesskript. I motsetning til lyttere som mÄ ha definert alle stÞttede metoder, selv om de ikke brukes, krever dokumentovervÄkere bare to metoder ved siden av lenkede hendelseskript.

Lytter til Dokumenthendelser

OvervĂ„king er illustrert for Basic- og Python-sprĂ„k ved hjelp av objektorientert programmering. Å tilordne OnLoad -skriptet til hendelsen Åpne Dokument hendelsen, er tilstrekkelig til Ă„ starte og avslutte dokumenthendelsesovervĂ„king. VerktĂžy - Tilpass -menyen Hendelse -fanen brukes til Ă„ tilordne begge skriptene.

Avlytting av hendelser hjelper til med Ă„ sette skript pre og post betingelser, for eksempel lasting og lossing av biblioteker eller spor av skriptbehandling i bakgrunnen. Access2Base.Trace modulbruk viser den andre konteksten.

Med Python

OvervÄkning av hendelser starter fra objektinstansering og stopper til slutt nÄr Python slipper objektet. Hevede hendelser rapporteres ved Ä bruke Access2Base konsollen.

note

OnLoad og OnUnload hendelser kan brukes til henholdsvis Ă„ sette og deaktivere stien til Python -programmer. De beskrives som Åpne Dokument og Steng Dokument.



         # -*- 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
             
         klasse UiDocument(unohelper.Base, AdapterPattern):
             ""OvervÄk dokumenthendelser""
             '''
             tilpasset fra 'Python script for Ä overvÄke OnSave event' ved
             https://forum.openoffice.org/en/forum/viewtopic.php?t=68887
             '''
             def __init__(self):
                 "" "OvervÄkning av dokumenthendelser" ""
                 '' 'rapport ved bruk av Access2Base.Sporings-konsoll ELLER
                 rapport i 1. ark, fĂžrste kolonne for Calc-dokumenter '''
                 ctx = uno.getComponentContext()
                 smgr = ctx.getServiceManager()
                 desktop = smgr.createInstanceWithContext(
                 'com.sun.star.frame.Desktop' , ctx)
                 self.doc = desktop.CurrentComponent
                 #self.row = 0   # avkommenter for Calc-dokumenter
                 Console.setLevel("DEBUG")
                 self.listen ()    # Begynn Ä overvÄke dok. hendelser
             
             @property
             def Filename(self) -> str:
                 sys_filename = uno.fileUrlToSystemPath(self.doc.URL)
                 return os.path.basename(sys_filename)
             
             def setCell(self, calcDoc, txt: str):
                 """Output doc. Hendelser i fĂžrste kolonne i et Calc regneark" ""
                 sheet = calcDoc.getSheets().getByIndex(0)
                 sheet.getCellByPosition(0,self.row).setString(txt)
                 self.row = self.row + 1
             
             def listen (self, * args):    # OnLoad / OnNew tidligst
                 """Start dokument. OvervÄkning av hendelser"""
                 self.doc.addDocumentEventListener(self)
                 Console.log ("INFO", "Dokumenthendelser logges", Aktiv)
             
             def sov(selv, * args): # OnUnload senest (valgfritt)
                 """ Stopp dok.-hendelsesovervÄking """
                 self.doc.removeDocumentEventListener(self)
                 Konsoll.log ("INFO", "Dokumenthendelser er logget", Sant)
             
             def documentEventOccured(self, event: DocumentEvent):
                 """ Oppfanger alle dok- hendelser """
                 #self.setCell(event.Source, event.EventName) # kun for Calc-dokument
                 Console.log("DEBUG",
                     event.EventName+" in "+self.Filename,
                     False)
             
             def disposing(self, event: EventObject):
                 """ Frislipp alle aktiviteter """
                 self.sleep()
                 Console.show()
             
         def OnLoad(*args):  # 'Open Document'-hendelse
             listener = UiDocument()  # Initiates listening
             
         def OnUnload(*args):  # «Dokument har blitt lukket»-hendelse
             send # (valgfritt) utfÞrt nÄr det avsluttes
             
         g_exportedScripts = (OnLoad,)
             
         from com.sun.star.script.provider import XScript
         class Console():
             """
             (Bak/For) grunnkonsoll for Ă„ rapportere / logge programkjĂžring.
             """
             @staticmethod
             def trace(*args,**kwargs):
                 """Skriv ut frie gjenstandsliste 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, valgfri brukerspĂžrring """
                 scr = Console._a2bScript(script='TraceLog')
                 scr.invoke((level,text,msgBox),(),())
             @staticmethod
             def setLevel(logLevel: str):
                 """Sett nedre grense for loggmeldinger """
                 scr = Console._a2bScript(script='TraceLevel')
                 scr.invoke((logLevel,),(),())
             @staticmethod
             def show():
                 """ Vis konsollinnhold/dialog """
                 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
      
warning

Husk den feilstavede metoden documentEventOccured som arver en skrivefeil fra LibreOffice Application Programming Interface (API).


Tipsikon

Start program og Lukk program -hendelser kan henholdsvis brukes til Ă„ angi og deaktivere Python -stien for brukerskript eller LibreOffice -skript. PĂ„ lignende mĂ„te kan dokumentbaserte Python -biblioteker eller moduler lastes og avsluttes ved hjelp av Åpent dokument og Dokument lukke hendelser. Se Importere Python Moduler for mer informasjon.


Med LibreOffice Basic

Onload -skriptet er tilordnet Åpne dokument -hendelsen ved hjelp av VerktĂžy - Tilpass -menyen Hendelse -fanen. HendelsesovervĂ„king starter fra det Ăžyeblikket et ConsoleLogger -objekt blir instantiert og stopper til slutt nĂ„r Basic -motoren dropper det. OnLoad hendelse laster nĂždvendige grunnleggende biblioteker, mens fangede hendelser rapporteres ved hjelp av Access2Base.Trace modulen.


          REM controller.Events-modul
          Option Explicit
          Privat _obj As Object ' Kontroller.KonsollLogger-forekomst
              
          Sub OnLoad(evt As com.sun.star.document.DocumentEvent) ' >> pne Dokument <<
              _obj = New ConsoleLogger : _obj.Start(evt)
          End Sub ' controller.OnLoad
          ' ----
          REM kontroller.KonsollLogger-klassemodul
          Option Explicit
          Option Compatible
          Option ClassModule
              
          ' ADAPTER design mĂžnster objekt som skal instantieres i "Open Document" hendelse
          Private Const UI_PROMPT = True
          Private Const UI_NOPROMPT = False ' Set it to True to visualise documents events
              
          ' CONSTRUCTOR/DESTRUCTOR
          Private Sub Class_Initialize()
          End Sub ' controller.ConsoleLogger.Initialize
          Private Sub Class_Terminate()
          End Sub ' controller.ConsoleLogger.Terminate
              
          ' MEDLEMMER
          Private _evtAdapter As Object ' com.sun.star.document.XDocumentEventBroadcaster
              
          ' PROPERTIES
          Private Property Get FileName As String
              ''' Systemavhengig filnavn '''
              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
              
          ' METODER
          Private Sub _documentEventOccured(evt As com.sun.star.document.DocumentEvent)
              ''' OvervÄking av dokumenthendelser '''
              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)
              ''' Igangsetting av dokumenthendelseslogging '''
              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 & "-") & "Dokumenthendelser logges", _
                  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)
              ''' Avslutt loggfĂžring av dokumenthendelser '''
              ThisComponent.removeDocumentEventListener( _evtAdapter )
              Access2Base.Trace.TraceLog("INFO", _
                  IIf(IsMissing(evt),"",evt.EventName & "-") & "Dokumenthendelser er loggfĂžrt", _
                  UI_PROMPT)
              Access2Base.Trace.TraceConsole() ' Captured events dialog
          End Sub ' controller.ConsoleLogger._Stop
              
          ' EVENTS
          ' Koden din for hÄndterte hendelser lagres her
      
warning

VÊr oppmerksom pÄ den feilstavede metoden _documentEventOccured som arver en skrivefeil fra LibreOffice Application Programming Interface (API).


Oppdaging av dokumenthendelser

Kringkaster-API-objektet inneholder listen over hendelser den er ansvarlig for:

Med Python


         # -*- coding: utf-8 -*-
         from __future__ import unicode_literals
             
         import uno, apso_utils as ui
             
         def displayAvailableEvents():
             "" "Vis dokumenthendelser" ""
             '''
             tilpasset fra 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,)
      
note

Alternativ Python Script Organizer (APSO) utvidelse brukes til Ä gjengi hendelsesinformasjon pÄ skjermen.


Med LibreOffice Basic


         Sub DisplayAvailableEvents
             '''Vis dokumenthendelser'''
             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