Innhold

# Lytte til dokumenthendelser

Å lytte til dokumenthendelser kan hjelpe i følgende situasjoner:

- Identifiser et nytt dokument ved åpningstidspunktet, i motsetning til eksisterende, og gjøre et eget oppsett.

- Kontroller behandlingen av forespørsler om lagring av dokumenter, kopiering av dokumenter, utskrift eller sammenslåing.

- Oppdater innholdsfortegnelse, indekser eller tabelloppføringer i et Writer -dokument på nytt når dokumentet skal lukkes

- Importer matte Python -pakker før du åpner et Calc -dokument. Frigjør disse pakkene når dokumentet lukkes.

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.

## Overvåking av dokumenthendelser

Overvåking vises her for Basic- og Python-språkene ved bruk av objektorientert programmering. Å tilordne OnLoad-skript til Open Document-hendelsen, er tilstrekkelig for å starte og avslutte dokumenthendelsesovervåking. Verktøy - Tilpass-menyen Hendelser 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.

OnLoad og OnUnload hendelser kan brukes til å henholdsvis sette og deaktivere Python-programbanen. De beskrives som Åpne dokument og Dokument lukket.

             # -*- 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):
                 ""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
                 lytter = UiDocument() # Starter lytting

             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:
                     ''' Ta tak i applikasjonsbasert 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

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

Hendelser som Start applikasjon og Lukk applikasjon kan brukes til å aktivere og deaktivere Python-bane for brukerskript eller LibreOffice-skript. På lignende måte kan dokumentbaserte Python-biblioteker eller -moduler lastes og frigis ved å bruke Åpne dokument og Dokument lukket-hendelser. Se Importere Python-moduler for mer informasjon.

### Med LibreOffice Basic

Ved å bruke Verktøy - Tilpass -menyen Events -fanen, utløser Åpne dokument hendelsen en Konsoll-Logger initialisering. _documentEventOccured rutine - angitt av ConsoleLogger - fungerer som et unikt inngangspunkt for å fange alle dokumenthendelser.

#### controller.Hendelsesmodul

            Option Explicit

            Global _obj As Object ' controller.ConsoleLogger instans

            Sub OnLoad(evt As com.sun.star.document.DocumentEvent) ' >> pne 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

#### controller. ConsoleLogger -klassemodul

Hendelsesovervåking starter fra det øyeblikket et ConsoleLogger -objekt blir instantiert og stopper til slutt, når dokumentet lukkes. StartAdapter rutine laster nødvendige grunnleggende biblioteker, mens oppfangede hendelser rapporteres ved hjelp av Access2Base.Trace -modulen.

              Option Explicit
              Option Compatible
              Option ClassModule

              ' ADAPTER design mønster objekt som skal instantieres i "Open Document" hendelse
              Private Const UI_PROMPT = True
              Privat Const UI_NOPROMPT = False 'Sett den til True for å visualisere dokumenthendelser

              ' MEDLEMMER
              Private _evtAdapter As Object ' com.sun.star.document.XDocumentEventBroadcaster
              Privat tekstmelding for _txtMsg As String for å logge i konsollen

              ' EGENSKAPER
              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
              Public Sub DocumentEventOccurs(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" : _StopAdapter(evt)
                  End Select
              End Sub ' controller.ConsoleLogger.DocumentEventOccurs

              Public Sub StartAdapter(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")
                  If IsMissing(evt) Then _txtMsg = "" Else _txtMsg = evt.EventName & "-"
                  Access2Base.Trace.TraceLog ("INFO", _txtMsg og "Dokumenthendelser logges", 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)
                  ''' Avslutt loggføring av dokumenthendelser '''
                  ThisComponent.removeDocumentEventListener( _evtAdapter )
                  If IsMissing(evt) Then _txtMsg = "" Else _txtMsg = evt.EventName & "-"
                  Access2Base.Trace.TraceLog ("INFO", _txtMsg og "Dokumenthendelser er logget", UI_PROMPT)
                  Access2Base.Trace.TraceConsole () 'Dialogbok for oppfangede hendelser
              End Sub ' controller.ConsoleLogger._StopAdapter

              ' HENDELSER
              ' Koden din for håndterte hendelser lagres her

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,)

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

Lignende emner

Oppretting av handlingsLyttere

Importerer Phyton Moduler

Opprett en dialoghåndterer

Pythonprogrammering, eksempel

Programmering med Python-skript

Anroper Basic Makroer fraPython

Supporter oss!