Innhald
Innhaldsliste 🔎︎

# Lytta til dokumenthendingar

Å 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.

## Overvaking av dokumenthendingar

Overvakinga vert vist her for språka Basic og Python med objektorientert programmering. Tildeling av skriptet OnLoad til hendinga Open Document er nok for å byrja og avslutta overvakinga. Fana Hendingar i menyen Verktøy → Tilpass 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.

### Med Python

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 Open document og Document closed.

             # -*- 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 Start application og Close application 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 Open document og >Document closed-hendingar. Du finn meir om dette på Importing Python Modules.

### Med LibreOffice Basic

Ved å bruka menyen Verktøy → Tilpass og fana Hendingar, vil hendinga Opna dokument gjera ei initialisering av Konsoll-Loggar. Rutinen _documentEventOccured – gjeve av ConsoleLogger – fungerer som eit unikt inngangspunkt for å fanga alle dokumenthendingar.

#### controller.Events-modulen

            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

#### controller.ConsoleLogger-klasse-modul

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

## Oppdagar dokumenthendingar

API-objektet for kringkastaren gjev deg lista over hendingar det er ansvarleg for:

### Med Python

             # -*- 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.

### Med LibreOffice Basic

             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

Liknande emne

Oppretting av hendingslyttarar

Importera Phyton-modular

Laga ein handsamar for dialogvindauge

Pythonprogrammering, eksempel

Programmering med Python-skript

Kalla opp Basic-makroar frå Python