Dokumentu-gertaerak entzutea

Dokumentu-gertaerak entzutea lagungarria izan daiteke honako egoeratan:

Gertaerei makroak esleitzeaz gain, posible da Collabora Office 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:
        ''' Atzitu aplikazioan oinarritutako Basic scripta '''
        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 Collabora Office APItik (Application Programming Interface).


Iradokizun-ikonoa

Erabiltzaile-scriptetarako edo Collabora Office scriptetarako Python bide-izenak ezartzeko edo ezarpena kentzeko, Hasi aplikazioa eta Itxi aplikazioa gertaerak erabili daitezke, hurrenez hurren. Modu berean, dokumentuetan oinarritutako Python liburutegiak edo moduluak kargatzeko edo askatzeko, Dokumentu irekia eta Dokumentu itxia gertaerak erabili daitezke. Begiratu Python moduluak inportatzea informazio gehiagorako.


Collabora Office Basic bidez

Tresnak - Pertsonalizatu menuko Gertaerak fitxa erabilita, Dokumentu irekia gertaerak ConsoleLogger hasieratze bat abiarazten du. _documentEventOccured errutinak - ConsoleLogger-ek ezartzen duena - dokumentuko gertaera guztiak harrapatzeko sarrera-puntu bakar gisa balio du.

controller.Events modulua

Option Explicit

Global _obj As Object ' controller.ConsoleLogger instantzia

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 sarrera-puntu bakarra '''
     _obj.DocumentEventOccurs(evt)
End Sub ' controller._documentEventOccured

controller.ConsoleLogger klase-modulua

Gertaeren monitorizazioa hasten da ConsoleLogger objektuaren instantzia sortzen denean eta amaitzen da dokumentua ixten denean. StartAdapter errutinak beharrezkoak diren Basic liburutegiak kargatzen ditu, eta harrapatutako gertaeren berri Access2Base.Trace moduluaren bidez ematen da.

Option Explicit
Option Compatible
Option ClassModule

' MOLDATZAILEA 'Dokumentu irekia' gertaeran instantziatuko den eredu-objektua
Private Const UI_PROMPT = True
Private Const UI_NOPROMPT = False ' Ezarri True dokumentuen gertaerak bistaratu nahi badituzu

' KIDEAK
Private _evtAdapter As Object ' com.sun.star.document.XDocumentEventBroadcaster
Private _txtMsg As String ' Kontsolan erregistratuko den testu-mezua

' PROPIETATEAK
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 & "Dokumentu-gertaerak egunkarian gordetzen ari dira", 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 & "Dokumentu-gertaerak egunkarian gorde dira", UI_PROMPT)
    Access2Base.Trace.TraceConsole() ' Kapturatutako gertaeren elkarrizketa-koadroa
End Sub ' controller.ConsoleLogger._StopAdapter

' GERTAERAK
'Maneiatutako gertaeretarako duzun kodea hemen doa
warning

Adi gaizki idatzitako _documentEventOccured metodoari, akats bat heredatu du Collabora Office 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.


Collabora Office 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

Emaguzu laguntza!