Python : Dokumentu-gertaerak kontrolatzea

Edukiak
Indizea 🔎︎

# Dokumentu-gertaerak kontrolatzea

Gertaerei makroak esleitu ondoren, LibreOffice dokumentuek sortutako gertaerak kontrolatu daitezke. Application Programming Interface (API) igorleak gertaeren scriptak deitzeko ardura dute. 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 entzutea

Kontrolaren adibide bat erakusten da ondoren Basic eta Python lengoaietarako, objektuei orientatutako programazioa erabilita. OnLoad scripta Dokumentu irekia gertaerari esleituta, aski da 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.

OnLoad eta OnUnload gertaerak Python programen bide-izenak ezartzeko eta ezarpena kentzeko 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()  # Initiates listening

             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

Kontuan izan gaizki idatzitako documentEventOccured metodoa, LibreOffice APItik (Application Programming Interface) akats bat heredatu du.

Hasi aplikazioa eta Itxi aplikazioa gertaerak erabiltzaile-scriptetarako edo LibreOffice scriptetarako Python programen bide-izenak ezartzeko eta ezarpena kentzeko erabili daitezke, hurrenez hurren. Era berean, dokumentuetan oinarritutako Python liburutegiak edo moduluak kargatu eta deskargatu daitezke Dokumentu irekia eta Dokumentu itxia gertaerak erabilita. Ikus Python moduluak inportatzea informazio gehiagorako.

### LibreOffice Basic bidez

Onload scripta Dokumentu irekia gertaerari esleitzen zaio Tresnak – Pertsonalizatu... menuko Gertaerak fitxa erabilita. Gertaeren kontrola hasten da ConsoleLogger objektu bat instantziatzen denean eta amaitzen da Basic motorrak hura askatzen duenean. OnLoad gertaerak beharrezko Basic liburutegiak kargatzen ditu, eta harrapatutako gertaerak Access2Base.Trace modulua erabilita jakinarazten dira.

              REM controller.Events modulua
              Option Explicit
              Private _obj As Object ' controller.ConsoleLogger instantzia

              Sub OnLoad(evt As com.sun.star.document.DocumentEvent) ' >> Dokumentu irekia <<
                  _obj = New ConsoleLogger : _obj.Start(evt)
              End Sub ' controller.OnLoad
              ' ----
              REM controller.ConsoleLogger klase-modulua
              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

              ' ERAIKITZAILEA/SUNTSITZAILEA
              Private Sub Class_Initialize()
              End Sub ' controller.ConsoleLogger.Initialize
              Private Sub Class_Terminate()
              End Sub ' controller.ConsoleLogger.Terminate

              ' KIDEAK
              Private _evtAdapter As Object ' com.sun.star.document.XDocumentEventBroadcaster

              ' 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
              Private Sub _documentEventOccured(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" : _Stop(evt)
                  End Select
              End Sub ' controller.ConsoleLogger._documentEventOccured

              Private Sub _disposing(evt As com.sun.star.lang.EventObject)
              End Sub ' controller.ConsoleLogger.disposing

              Public Sub Start(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")
                  Access2Base.Trace.TraceLog("INFO", _
                      IIf(IsMissing(evt),"",evt.EventName & "-") & "Dokumentu-gertaerak egunkarian gordetzen ari dira", _
                      UI_PROMPT)

                  _evtAdapter = CreateUnoListener( "_", "com.sun.star.document.XDocumentEventListener" )
                  ThisComponent.addDocumentEventListener( _evtAdapter )
              End Sub ' controller.ConsoleLogger.Start

              Private Sub _Stop(Optional evt As com.sun.star.document.DocumentEvent)
                  ''' Amaitu dokumentu-gertaerak egunkarian gordetzea '''
                  ThisComponent.removeDocumentEventListener( _evtAdapter )
                  Access2Base.Trace.TraceLog("INFO", _
                      IIf(IsMissing(evt),"",evt.EventName & "-") & "Dokumentu-gertaerak egunkarian gorde dira", _
                      UI_PROMPT)
                  Access2Base.Trace.TraceConsole() ' Captured events dialog
              End Sub ' controller.ConsoleLogger._Stop

              ' EVENTS
              'Maneiatutako gertaeretarako duzun kodea hemen doa

Kontuan izan gaizki idatzitako _documentEventOccured metodoa, LibreOffice APItik (Application Programming Interface) akats bat heredatu du.

## 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,)

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

Erlazionatutako gaiak

Gertaeren entzuleak sortzea

Python moduluak inportatzea

Elkarrizketa-koadroen maneiatzailea sortzea

Python programazioko adibideak

Python scriptekin programatzea

Basic makroak deitzea Pythonetik