Dokumentu-gertaerak entzutea

Dokumentu-gertaerak entzutea lagungarria izan daiteke honako egoeratan:

Gertaerei makroak esleitzeaz gain, posible da LibreOffice dokumentuek sortutako gertaerak kontrolatzea. Gertaeren scriptak deitzeko, Application Programming Interface (API) igorleak erabiltzen dira. Onartutako metodo guztiak, baita erabiltzen ez direnak ere, definitzea behar duten entzuleek ez bezala, dokumentuen kontrolek bi metodo besterik ez dute behar, gakotutako gertaera-scripten alboan.

Dokumentu-gertaerak monitorizatzea

Kontrolaren adibide bat erakusten da ondoren Basic eta Python lengoaietarako, objektuei orientatutako programazioa erabilita. Aski da OnLoad scripta Dokumentu irekia gertaerari esleitzea dokumentu-gertaeren kontrola abiarazteko eta amaitzeko. Scriptak esleitzeko, Tresnak - Pertsonalizatu... menuko Gertareak fitxa erabiltzen da.

Gertaerak atzematen direnean, scripten aurreko eta ondoko baldintzak ezarri daitezke, esaterako liburutegiak kargatzea eta deskargatzea edo scripten prozesatzearen jarraipena egitea atzeko planoan. Access2Base Trace moduluaren erabilerak bigarren testuinguru hori irudikatzen du.

Python bidez

Gertaeren kontrola objektuaren instantzia sortzean hasten da eta Pythonek objektua askatzen duenean gelditzen da. Sortutako gertaerak Access2Base kontsola erabilita jakinarazten dira.

note

OnLoad eta OnUnload gertaerak Python programa-bideak ezartzeko eta ezarpena ezabatzeko erabili daitezke. Dokumentu irekia eta Dokumentu itxia modura deskribatuta daude.



         # -*- 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):
             """ Kontrolatu dokumentu-gertaerak """
             '''
             'Python script to monitor OnSave event' argitalpenetik moldatua, hemen:
             https://forum.openoffice.org/en/forum/viewtopic.php?t=68887
             '''
             def __init__(self):
                 """ Dokumentu-gertaeren kontrola """
                 ''' jakinarazi Access2Base.Trace kontsola erabilita EDO
                 jakinarazi Calc dokumentuen 1. orrian, 1. zutabean '''
                 ctx = uno.getComponentContext()
                 smgr = ctx.getServiceManager()
                 desktop = smgr.createInstanceWithContext(
                 'com.sun.star.frame.Desktop' , ctx)
                 self.doc = desktop.CurrentComponent
                 #self.row = 0  # kendu iruzkina Calc dokumentuetan soilik
                 Console.setLevel("DEBUG")
                 self.listen()  # Hasi dokumentu-gertaerak kontrolatzen
             
             @property
             def Filename(self) -> str:
                 sys_filename = uno.fileUrlToSystemPath(self.doc.URL)
                 return os.path.basename(sys_filename)
             
             def setCell(self, calcDoc, txt: str):
                 """ doc. gertaeren irteera Calc kalkulu-orri baten 1. zutabean """
                 sheet = calcDoc.getSheets().getByIndex(0)
                 sheet.getCellByPosition(0,self.row).setString(txt)
                 self.row = self.row + 1
             
             def listen(self, *args):  # OnLoad/OnNew ahalik eta lehenen
                 """ Hasi dokumentu-gertaerak kontrolatzen """
                 self.doc.addDocumentEventListener(self)
                 Console.log("INFO", "Dokumentu-gertaerak egunkarian gordetzen ari dira", True)
             
             def sleep(self, *args):  # OnUnload ahalik eta beranduen (aukerakoa)
                 """ Gelditu dokumentu-gertaerak kontrolatzen """
                 self.doc.removeDocumentEventListener(self)
                 Console.log("INFO", "Dokumentu-gertaerak egunkarian gorde dira", True)
             
             def documentEventOccured(self, event: DocumentEvent):
                 """ doc. gertaera guztiak atzematen ditu """
                 #self.setCell(event.Source, event.EventName) # Calc dokumentuetan soilik
                 Console.log("DEBUG",
                     event.EventName+" in "+self.Filename,
                     False)
             
             def disposing(self, event: EventObject):
                 """ Askatu jarduera guztiak """
                 self.sleep()
                 Console.show()
             
         def OnLoad(*args):  # 'Dokumentu irekia' gertarea
             listener = UiDocument()  # Entzutea hasieratzen du
             
         def OnUnload(*args):  # 'Dokumentua itxi da' gertaera
             pass  # (aukerakoa) erabilgarri dagoenean gauzatzen da
             
         g_exportedScripts = (OnLoad,)
             
         from com.sun.star.script.provider import XScript
         class Console():
             """
             Atzeko/aurreko planoko kontsola programaren exekuzioaren txostena egiteko/egunkarian jasotzeko.
             """
             @staticmethod
             def trace(*args,**kwargs):
                 """ Inprimatu elementu askeen zerrenda kontsolan """
                 scr = Console._a2bScript(script='DebugPrint', module='Compatible')
                 scr.invoke((args),(),())
             @staticmethod
             def log(level: str, text: str, msgBox=False):
                 """ Erantsi egunkari-mezua kontsolari, aukeran erakutsi gonbita erabiltzaileari """
                 scr = Console._a2bScript(script='TraceLog')
                 scr.invoke((level,text,msgBox),(),())
             @staticmethod
             def setLevel(logLevel: str):
                 """ Ezarri egunkari-mezuen beheko muga """
                 scr = Console._a2bScript(script='TraceLevel')
                 scr.invoke((logLevel,),(),())
             @staticmethod
             def show():
                 """ B istaratu kontsolaren edukia/elkarrizkea """
                 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

Adi gaizki idatzitako documentEventOccured metodoari, akats bat heredatu du LibreOffice APItik (Application Programming Interface).


Iradokizun-ikonoa

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.


LibreOffice Basic bidez

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) ' >> Dokumentu irekia <<
            _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
              
          ' MOLDATZAILEA 'Dokumentu irekia' gertaeran instantziatuko den eredu-objektua
          Private Const UI_PROMPT = True
          Private Const UI_NOPROMPT = False ' Set it to True to visualise documents events
              
          ' KIDEAK
          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
              ''' Sistemaren araberako fitxategi-izena '''
              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
              
          ' METODOAK
          Public Sub DocumentEventOccurs(evt As com.sun.star.document.DocumentEvent)
              ''' Kontrolatu dokumentu-gertaerak '''
              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)
              ''' Hasieratu dokumentu-gertaerak egunkarian gordetzea '''
              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)
              ''' Amaitu dokumentu-gertaerak egunkarian gordetzea '''
              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
              
          ' GERTAERAK
          'Maneiatutako gertaeretarako duzun kodea hemen doa
      
warning

Adi gaizki idatzitako _documentEventOccured metodoari, akats bat heredatu du LibreOffice APItik (Application Programming Interface).


Dokumentu-gertaera aurkitzea

Igorlea API objektuak haren ardura diren gertaeren zerrenda bat ematen du:

Python bidez


         # -*- coding: utf-8 -*-
         from __future__ import unicode_literals
             
         import uno, apso_utils as ui
             
         def displayAvailableEvents():
             """ Bistaratu dokumentu-gertaerak """
             '''
             A. Pitonyak programatzailearen DisplayAvailableEvents() kodetik moldatua
             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

Alternative Python Script Organizer (APSO) hedapena erabiltzen da gertaeren informazioa pantailan idazteko.


LibreOffice Basic bidez


         Sub DisplayAvailableEvents
             ''' Bistaratu dokumentu-gertaerak '''
             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