Overvak dokumenthendingar

Innhald
Innhaldsliste 🔎︎

# Lytta til dokumenthendingar

Å lytta til dokumenthendingar kan vera til nytte i desse situasjonane:

- Identify a new document at opening time, as opposed to existing ones, and perform a dedicated setup.

- Control the processing of document save, document copy, print or mailmerge requests.

- Recalculate table of contents, indexes or table entries of a Writer document when document is going to be closed

- Import math Python packages before opening a Calc document. Release these packages when the document closes.

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.

## Monitoring Document Events

Monitoring is illustrated herewith for Basic and Python languages using object-oriented programming. Assigning OnLoad script, to the Open Document event, suffices to initiate and terminate document event monitoring. Tools - Customize menu Events tab is used to assign either scripts.

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.

OnLoad and OnUnload events can be used to respectively set and unset Python programs path. They are described as Open document and 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
                 listener = UiDocument()  # Initiates listening

             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:
                     ''' 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

Ver merksam på den feilstava documentEventOccured-metoden som arvar ein trykkfeil frå LibreOffice API (Application Programming Interface, grensesnittet for programmet).

Start application and Close application events can respectively be used to set and to unset Python path for user scripts or LibreOffice scripts. In a similar fashion, document based Python libraries or modules can be loaded and released using Open document and Document closed events. Refer to Importing Python Modules for more information.

### Med LibreOffice Basic

Using Tools - Customize menu Events tab, the Open document event fires a ConsoleLogger initialisation. _documentEventOccured routine - set by ConsoleLogger - serves as a unique entry point to trap all document events.

#### controller.Events module

            Option Explicit

            Global _obj As Object ' controller.ConsoleLogger instance

            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 unique entry point '''
                 _obj.DocumentEventOccurs(evt)
            End Sub ' controller._documentEventOccured

#### controller.ConsoleLogger class module

Events monitoring starts from the moment a ConsoleLogger object is instantiated and ultimately stops upon document closure. StartAdapter routine loads necessary Basic libraries, while caught events are reported using Access2Base.Trace module.

              Option Explicit
              Option Compatible
              Option ClassModule

              ' ADAPTER-utformingsmønster-objekt som skal opnast i hendinga «Opna dokument»
              Private Const UI_PROMPT = True
              Private Const UI_NOPROMPT = False ' Set it to True to visualise documents events

              ' MEMBERS
              Private _evtAdapter As Object ' com.sun.star.document.XDocumentEventBroadcaster
              Private _txtMsg As String ' text message to log in console

              ' PROPERTIES
              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 & "Document events are being logged", 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 & "Document events have been logged", UI_PROMPT)
                  Access2Base.Trace.TraceConsole() ' Captured events dialog
              End Sub ' controller.ConsoleLogger._StopAdapter

              ' EVENTS
              ' 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