Listening to Document Events

Listening to document events can help in the following situations:

┼áalia makrokomand┼│ priskyrimas ─»vykiams galima steb─Śti ─»vykius, kuriuos generuoja ÔÇ×%{PRODUCTNAME}ÔÇť dokumentai. Program┼│ s─ůsajos (API) transliuotojai yra atsakingi u┼ż ─»vyki┼│ scenarij┼│ i┼íkvietim─ů. Skirtingai nuo k┼źr─Śj┼│, kuriems reikia apibr─Ś┼żti visus palaikomus metodus, net jei jie nenaudojami, dokument┼│ steb─Śjimo priemon─Śms ┼íalia ─»jungt┼│ ─»vyki┼│ scenarij┼│ reikia tik dviej┼│ b┼źd┼│.

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.

Intercepting events helps setting scripts pre- and post-conditions such as loading and unloading libraries or track script processing in the background. Access2Base.Trace module usage is illustrating that second context.

Naudojant Piton─ů

─«vyki┼│ steb─Śjimas prasideda nuo objekto inicijavimo ir galiausiai sustoja, kai Pitonas paskelbia objekt─ů. Apie esamus ─»vykius prane┼íama naudojant konsol─Ö Access2Base.

note

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):
             """ Dokumentini┼│ ─»vyki┼│ steb─Śjimas """
             '''
             adaptuota pagal 'Pitono skriptas OnSave ─»vykiams' at
             https://forum.openoffice.org/en/forum/viewtopic.php?t=68887
             '''
             def __init__(self):
                 """ Dokumentini┼│ ─»vyki┼│ steb─Śjimas """
                 ''' ataskaita naudojant ÔÇ×Access2Base.TraceÔÇť konsol─Ö OR
                 prane┼íamas apie ÔÇ×Calc docsÔÇť 1-ojo lak┼íto 1-─ůj─» stulpel─»  '''
                 ctx = uno.getComponentContext()
                 smgr = ctx.getServiceManager()
                 desktop = smgr.createInstanceWithContext(
                 'com.sun.star.frame.Desktop' , ctx)
                 self.doc = desktop.CurrentComponent
                 #self.row = 0  # tik ÔÇ×CalcÔÇť documentams n─Śra komentar┼│
                 Console.setLevel("DEBUG")
                 self.listen()  # pradedama steb─Śti doc. events
             
             @property
             def Filename(self) -> str:
                 sys_filename = uno.fileUrlToSystemPath(self.doc.URL)
                 return os.path.basename(sys_filename)
             
             def setCell(self, calcDoc, txt: str):
                 """ Rezultato doc. ─»vykiai ÔÇ×CalcÔÇť skai─Źiuokl─Śs 1-ame stulpelyje """
                 sheet = calcDoc.getSheets().getByIndex(0)
                 sheet.getCellByPosition(0,self.row).setString(txt)
                 self.row = self.row + 1
             
             def listen(self, *args):  # OnLoad/OnNew anks─Źiausiai
                 """ Prad─Śkite steb─Śti doc. ─»vykius ""
                 self.doc.addDocumentEventListener(self)
                 Console.log("INFO", "Dokument┼│ ─»vykiai registruojami", True)
             
             def sleep(self, *args):  # OnUnload v─Śliausiai (pasirinktinai)
                 """ Stabdykite steb─Śti doc. ─»vykius ""
                 self.doc.removeDocumentEventListener(self)
                 Console.log("INFO", "Dokument┼│ ─»vykiai registruojami", True)
             
             def documentEventOccured(self, event: DocumentEvent):
                 """ Perima visus doc. ─»vykius """
                 #self.setCell(event.Source, event.EventName) # tik Calc docs
                 Console.log("DEBUG",
                     event.EventName+" in "+self.Filename,
                     False)
             
             def disposing(self, event: EventObject):
                 """ Išleisti visas veiklas """
                 self.sleep()
                 Console.show()
             
         def OnLoad(*args):  # 'Atverti dokument─ů' ─»vykis
             listener = UiDocument()  # Initiates listening
             
         def OnUnload(*args):  # 'Dokumentas u┼żvertas' ─»vykis
             pass  # (pasirinktinai) atliekama pašalinus
             
         g_exportedScripts = (OnLoad,)
             
         from com.sun.star.script.provider import XScript
         class Console():
             """
             (Back/Fore) ant┼żemin─Ś konsol─Ś, skirta prane┼íti ar registruoti programos vykdym─ů.
             """
             @staticmethod
             def trace(*args,**kwargs):
                 """ Spausdinkite element┼│ s─ůra┼í─ů ─» konsol─Ö """
                 scr = Console._a2bScript(script='DebugPrint', module='Compatible')
                 scr.invoke((args),(),())
             @staticmethod
             def log(level: str, text: str, msgBox=False):
                 """ Prid─Śkite ┼żurnalo prane┼íim─ů prie konsol─Śs, pasirinktinis vartotojo raginimas """
                 scr = Console._a2bScript(script='TraceLog')
                 scr.invoke((level,text,msgBox),(),())
             @staticmethod
             def setLevel(logLevel: str):
                 """ Nustatykite ┼żurnalo prane┼íim┼│ apatin─Ö rib─ů """
                 scr = Console._a2bScript(script='TraceLevel')
                 scr.invoke((logLevel,),(),())
             @staticmethod
             def show():
                 """ Rodyti konsol─Śs turin─» ar 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

Tur─Śkite omenyje klaidingai para┼íyt─ů metod─ů documentEventOccured, kuris perima ra┼íybos klaid─ů i┼í ÔÇ×LibreOfficeÔÇť taikom┼│j┼│ program┼│ s─ůsajos (API).


Tip Icon

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.


Naudojant ÔÇ×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) ' >> Atverti 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 dizaino modelio objektas, kuris bus paruo┼ítas ─»vykiui ÔÇ×Atverti dokument─ůÔÇť
          Private Const UI_PROMPT = True
          Private Const UI_NOPROMPT = False ' Set it to True to visualise documents events
              
          ' NARIAI
          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
              ''' Nuo sistemos priklausomas failo vardas '''
              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
              
          ' METODAI
          Public Sub DocumentEventOccurs(evt As com.sun.star.document.DocumentEvent)
              ''' Dokumentini┼│ ─»vyki┼│ steb─Śjimas '''
              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)
              ''' Inicializuokite dokumento ─»vyki┼│ registravim─ů '''
              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)
              ''' Nutraukite dokumento ─»vyki┼│ registravim─ů '''
              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
          ' ─îia nurodomas j┼źs┼│ tvarkom┼│ ─»vyki┼│ kodas
      
warning

Tur─Śkite omenyje klaidingai para┼íyt─ů metod─ů _documentEventOccured, kuris perima ra┼íybos klaid─ů i┼í ÔÇ×LibreOfficeÔÇť taikom┼│j┼│ program┼│ s─ůsajos (API).


Dokument┼│ rengini┼│ atradimas

Transliuotojo API objektas pateikia ─»vyki┼│, u┼ż kuriuos yra atsakingas, s─ůra┼í─ů:

Naudojant ÔÇ×Python"


         # -*- coding: utf-8 -*-
         from __future__ import unicode_literals
             
         import uno, apso_utils as ui
             
         def displayAvailableEvents():
             """ Rodyti dokumento ─»vykius """
             '''
             DisplayAvailableEvents() adaptavo 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

Alternatyvus ÔÇ×PythonÔÇť skripto organizacijos (APSO) pl─Śtinys naudojamas ─»vyki┼│ informacijai pateikti ekrane.


Naudojant ÔÇ×LibreOffice BasicÔÇť


         Sub DisplayAvailableEvents
             ''' Rodyti dokumentinius ─»vykius '''
             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
      

Paremkite mus!