Pomoc LibreOffice 24.8
Nałuchiwanie zdarzeń w dokumencie może pomóc w następujących sytuacjach:
Zidentyfikowanie nowego dokumentu w momencie otwarcia, w przeciwieństwie do istniejących, i wykonanie dedykowanej konfiguracji.
Kontrolowanie przetwarzania żądań zapisania, kopiowania dokumentów, drukowania lub korespondencji seryjnej.
Przeliczanie spisu treści, indeksów lub wpisów w tabeli dokumentu programu Writer, gdy dokument ma zostać zamknięty
Importowanie pakietów matematycznych Pythona przed otwarciem dokumentu programu Calc. Zwolnienie tych pakietów po zamknięciu dokumentu.
Oprócz przypisywania makr do zdarzeń, można monitorować zdarzenia wywoływane przez dokumenty LibreOffice. Rozgłaszacze API (Application Programming Interface) są odpowiedzialni za wywoływanie skryptów zdarzeń. W przeciwieństwie do detektorów, które wymagają zdefiniowania wszystkich obsługiwanych metod, nawet jeśli nie są używane, monitory dokumentów wymagają tylko dwóch metod obok przechwyconych skryptów zdarzeń.
Monitorowanie jest tutaj zilustrowane dla języków Basic i Python przy użyciu programowania obiektowego. Przypisanie skryptu OnLoad do zdarzenia wystarczy do zainicjowania i zakończenia monitorowania zdarzeń dokumentu. Menu karta służy do przypisania obu skryptów.
Przechwytywanie zdarzeń pomaga w ustawianiu warunków wstępnych i końcowych skryptów, takich jak ładowanie i wyładowywanie bibliotek lub śledzenie przetwarzania skryptu w tle. Wykorzystanie modułu Access2Base.Trace ilustruje ten drugi kontekst.
Monitorowanie zdarzeń rozpoczyna się od utworzenia instancji obiektu i ostatecznie kończy się, gdy Python zwolni obiekt. Wywołane zdarzenia są zgłaszane za pomocą konsoli Access2Base.
Zdarzenia OnLoad i OnUnload mogą być używane do odpowiednio ustawiania i usuwania ścieżki programów Pythona. Są one opisane jako i .
         # -*- 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):
             """ Monitoruj zdarzenia dokumentu """
             '''
             przystosowano ze „Skryptu Pythona do monitorowania zdarzenia OnSave” pod adresem
             https://forum.openoffice.org/en/forum/viewtopic.php?t=68887
             '''
             def __init__(self):
                 """ Monitor zdarzeń dokumentu """
                 ''' raport za pomocą konsoli Access2Base.Trace LUB
                 raport w 1. arkuszu, 1. kolumnie dla dokumentów Calc '''
                 ctx = uno.getComponentContext()
                 smgr = ctx.getServiceManager()
                 desktop = smgr.createInstanceWithContext(
                 'com.sun.star.frame.Desktop' , ctx)
                 self.doc = desktop.CurrentComponent
                 #self.row = 0  odkomentowanie tylko dla dokumentów programu Calc
                 Console.setLevel("DEBUG")
                 self.listen()  # Rozpocznij monitorowanie zdzarzenia dokumentu
             
             @property
             def Filename(self) -> str:
                 sys_filename = uno.fileUrlToSystemPath(self.doc.URL)
                 return os.path.basename(sys_filename)
             
             def setCell(self, calcDoc, txt: str):
                 """ Wypisz zdarzenia dokumentu w pierwszej kolumnie arkusza kalkulacyjnego Calc """
                 sheet = calcDoc.getSheets().getByIndex(0)
                 sheet.getCellByPosition(0,self.row).setString(txt)
                 self.row = self.row + 1
             
             def listen(self, *args):  # OnLoad/OnNew najwcześniej
                 """ Rozpocznij monitorowanie zdarzeń dokumentu """
                 self.doc.addDocumentEventListener(self)
                 Console.log("INFO", "Zdarzenia dotyczące dokumentów są rejestrowane", True)
             
             def sleep(self, *args):  # OnUnload najpóźniej (opcjonalnie)
                 """ Zatrzymaj monitorowanie zdarzeń dokumentu """
                 self.doc.removeDocumentEventListener(self)
                 Console.log("INFO", "Zdarzenia dotyczące dokumentów zostały zarejestrowane", True)
             
             def documentEventOccured(self, event: DocumentEvent):
                 """ Przechwytuje wszystkie zdarzenia dokumentu """
                 #self.setCell(event.Source, event.EventName) # tylko dla dokumentów Calc
                 Console.log("DEBUG",
                     event.EventName+" in "+self.Filename,
                     False)
             
             def disposing(self, event: EventObject):
                 """ Zwolnij wszystkie działania """
                 self.sleep()
                 Console.show()
             
         def OnLoad(*args):  # Zdarzenie 'Otwórz dokument'
             listener = UiDocument()  # Inicjuje nasłuchiwanie
             
         def OnUnload(*args):  # Zdarzenie 'Dokument został zamknięty'
             pass  # (opcjonalnie) wykonywane w przypadku utylizacji
             
         g_exportedScripts = (OnLoad,)
             
         from com.sun.star.script.provider import XScript
         class Console():
             """
             Konsola tła lub pierwszego planu do nagrywania wykonywania programu.
             """
             @staticmethod
             def trace(*args,**kwargs):
                 """ Wypisz w konsoli wolną listę elementów """
                 scr = Console._a2bScript(script='DebugPrint', module='Compatible')
                 scr.invoke((args),(),())
             @staticmethod
             def log(level: str, text: str, msgBox=False):
                 """ Dołącz komunikat dziennika do konsoli, opcjonalny monit użytkownika """
                 scr = Console._a2bScript(script='TraceLog')
                 scr.invoke((level,text,msgBox),(),())
             @staticmethod
             def setLevel(logLevel: str):
                 """ Ustaw dolny limit komunikatów dziennika """
                 scr = Console._a2bScript(script='TraceLevel')
                 scr.invoke((logLevel,),(),())
             @staticmethod
             def show():
                 """ Wyświetl zawartość/okno konsoli """
                 scr = Console._a2bScript(script='TraceConsole')
                 scr.invoke((),(),())
             @staticmethod
             def _a2bScript(script: str, library='Access2Base',
                 module='Trace') -> XScript:
                 ''' Chwyć oparty na aplikacji skrypt Basic '''
                 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
      Zwróć uwagę na błędnie napisaną metodę documentEventOccured, która dziedziczy literówkę z API (Application Programming Interface) LibreOffice.
Zdarzenia i mogą odpowiednio służyć do ustawiania i wyłączania ścieżki Pythona dla skryptów użytkownika lub skryptów LibreOffice. W podobny sposób biblioteki lub moduły Pythona oparte na dokumentach mogą być ładowane i zwalniane przy użyciu zdarzeń i . Zobacz Importowanie modułów Pythona, aby uzyskać więcej informacji.
Po ustawieniu na karcie z menu zdarzenie wyzwala inicjalizację instancji dla ConsoleLogger. Podprocedura _documentEventOccured, która ustawia ConsoleLogger, służy jako pojedynczy punkt wejścia do przechwytywania wszystkich zdarzeń w dokumencie.
        Option Explicit
        
        Instancja Global _obj As Object ' controller.ConsoleLogger
        
        Sub OnLoad(evt As com.sun.star.document.DocumentEvent) ' >> Otwórz dokument <<
            _obj = New ConsoleLogger : _obj.StartAdapter(evt)
        End Sub ' controller.OnLoad
        Sub _documentEventOccured(evt As com.sun.star.document.DocumentEvent)
            ''' Unikalny punkt wejścia ConsoleLogger'''
             _obj.DocumentEventOccurs(evt)
        End Sub ' controller._documentEventOccured
      Monitorowanie zdarzeń rozpoczyna się od momentu utworzenia instancji obiektu ConsoleLogger i ostatecznie zatrzymuje się po zamknięciu dokumentu. Procedura StartAdapter wymaga ładowania bibliotek Basic, natomiast przechwycone zdarzenia są raportowane za pomocą modułu Access2Base.Trace.
          Option Explicit
          Option Compatible
          Option ClassModule
              
          ' Obiekt wzorca projektowego ADAPTER, który ma zostać utworzony w zdarzeniu "Otwórz dokument".
          Private Const UI_PROMPT = True
          Private Const UI_NOPROMPT = False ' Ustaw wartość True, aby wizualizować zdarzenia w dokumentach
              
          ' CZŁONKOWIE
          Private _evtAdapter As Object ' com.sun.star.document.XDocumentEventBroadcaster
          Private _txtMsg As String ' Wiadomość tekstowa do rejestrowania w konsoli
              
          ' WŁAŚCIWOŚCI
          Private Property Get FileName As String
              ''' Nazwa pliku zależna od systemu '''
              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
              
          ' METODY
          Public Sub DocumentEventOccurs(evt As com.sun.star.document.DocumentEvent)
              ''' Monitoruj zdarzenia dokumentu '''
              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)
              ''' Zainicjuj rejestrowanie zdarzeń dokumentu '''
              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 & "Zdarzenia dokumentu są rejestrowane", 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)
              ''' Zakończ rejestrowanie zdarzeń dokumentu '''
              ThisComponent.removeDocumentEventListener( _evtAdapter )
              If IsMissing(evt) Then _txtMsg = "" Else _txtMsg = evt.EventName & "-"
              Access2Base.Trace.TraceLog("INFO", _txtMsg & "Zdarzenia dokumentu zostały zarejestrowane", UI_PROMPT)
              Access2Base.Trace.TraceConsole() ' Okno dialogowe z przechwyconymi zdarzeniami
          End Sub ' controller.ConsoleLogger._StopAdapter
              
          ' ZDARZENIA
          ' Twój kod obsługiwanych zdarzeń znajduje się tutaj
      Zwróć uwagę na błędnie napisaną metodę _documentEventOccured, która dziedziczy literówkę z API (Application Programming Interface) LibreOffice.
Obiekt API nadawcy udostępnia listę zdarzeń, za które jest odpowiedzialny:
         # -*- coding: utf-8 -*-
         from __future__ import unicode_literals
             
         import uno, apso_utils as ui
             
         def displayAvailableEvents():
             """ Wyświetl zdarzenia dokumentu """
             '''
             przystosowano z DisplayAvailableEvents() autorstwa A. Pitonyaka
             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,)
      Rozszerzenie Alternative Python Script Organizer (APSO) służy do renderowania informacji o zdarzeniach na ekran
         Sub DisplayAvailableEvents
             ''' Wyświetl zdarzenia dokumentu '''
             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