Dokumentowe tšojenja doglědowaś

Doglědowanje dokumentowych tšojenjow móžo w slědujucych situacijach pomagaś:

Mimo pśipokazowanja makrow k tšojenjam móžośo tšojenja doglědowaś, kótarež se pśez dokumenty LibreOffice zapušćiju. Sćelaki Nałožeńskego programowěrańskego zwězowańskego městna (API) su za wuwołanje tšojeńskich skriptow zagronite. Na rozdźěl wót pśisłuchakow, kótarež muse wšykne pódprěte metody definěrowaś, samo gaž njeby se wužywali, dokumentowe doglědowanja jano dwě metoźe mimo tšojeńskich skriptow trjebaju.

Dokumentowe tšojenja doglědowaś

Doglědowanje se dołojce za rěcy Basic a Python z pomocu na objekt orientěrowanego programěrowanja znaglědnja. Pśipokazowanje skripta OnLoad tšojenjeju Open Document dosěga, aby doglědowanje dokumentowego tšojenja iniciěrowało a skóńcyło. Wubjeŕśo meni Rědy – Pśiměriś rejtarik: Tšojenja, aby wobej skripta pśipokazał.

Wótpópadnjenje tšojenjow pomaga, wuměnjenja skriptow nastajiś, na pśikład aby se biblioteki zacytali a pušćili abo se pśeźěłowanje skriptow w slězynje slědujo. Wužywanje modula Access2Base.Trace drugi kontekst znaglědnja.

Z Python

Doglědowanje tšojenjow se wót objektowego instanciěrowanja zachopina a kóńcy se, gaž Python objekt pušća. Wuwabjone tšojenja se z pomocu konsole Access2Base k wěsći daju.

note

Tšojeni OnLoad a OnUnload datej se wužywaś, abyj sćažku programow Python nastajiłej resp. wótpórałej. Wopisujotej se ako Dokument wócyniś a Dokument zacynjony.



         # -*- 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):
             """ Dokumentowe tšojenja doglědowaś """
             '''
             pó 'skripśe Python za doglědowanje tšojenja OnSave' pśi
             https://forum.openoffice.org/en/forum/viewtopic.php?t=68887
             '''
             def __init__(self):
                 """ Monitor dokumentowych tšojenjow """
                 ''' rozpšawa z konsolu Access2Base.Trace ABO
                 rozpšawa w 1. słupje 1. tabele dokumentow Calc '''
                 ctx = uno.getComponentContext()
                 smgr = ctx.getServiceManager()
                 desktop = smgr.createInstanceWithContext(
                 'com.sun.star.frame.Desktop' , ctx)
                 self.doc = desktop.CurrentComponent
                 #self.row = 0 # wótwónoźujo komentary jano za dokumenty Calc
                 Console.setLevel("DEBUG")
                 self.listen() # Doglědowanje dokumentowych tšojenjow startowaś
             
             @property
             def Filename(self) -> str:
                 sys_filename = uno.fileUrlToSystemPath(self.doc.URL)
                 return os.path.basename(sys_filename)
             
             def setCell(self, calcDoc, txt: str):
                 """ Wudaśowe dokumentowe tšojenja w prědnem słupje tabele Calc """
                 sheet = calcDoc.getSheets().getByIndex(0)
                 sheet.getCellByPosition(0,self.row).setString(txt)
                 self.row = self.row + 1
             
             def listen(self, *args): # OnLoad/OnNew nanejjěsnjej
                 """ Doglědowanje dokumentowych tšojenjow startowaś """
                 self.doc.addDocumentEventListener(self)
                 Console.log("INFO", "Dokumentowe tšojenja se protokěroluju", True)
             
             def sleep(self, *args): # OnUnload nejpózdźej (opcionalne)
                 """ Doglědowanje dokumentowych tšojenjow zastajiś """
                 self.doc.removeDocumentEventListener(self)
                 Console.log("INFO", "Dokumentowe tšojenja su se protokolěrowali", True)
             
             def documentEventOccured(self, event: DocumentEvent):
                 """ Wótpópadnjo wšykne dokumentowe tšojenja """
                 #self.setCell(event.Source, event.EventName) # jano za dokumenty Calc
                 Console.log("DEBUG",
                     event.EventName+" in "+self.Filename,
                     False)
             
             def disposing(self, event: EventObject):
                 """ Wšykne aktiwity pušćiś """
                 self.sleep()
                 Console.show()
             
         def OnLoad(*args): # Tšojenje 'Dokument wócyniś'
             listener = UiDocument() # Iniciěrujo doglědowanje
             
         def OnUnload(*args): # Tšojenje 'Dokument jo se zacynił'
             pass # (opcionalny) pśewjeźony, gaž póstajony
             
         g_exportedScripts = (OnLoad,)
             
         from com.sun.star.script.provider import XScript
         class Console():
             """
             (Prědkowa/Slězynowa) konsola za powěźeńku/protokolěrowanje programowego wuwjeźenja.
             """
             @staticmethod
             def trace(*args,**kwargs):
                 """ Lichu lisćinu zapiskow do konsole wudaś """
                 scr = Console._a2bScript(script='DebugPrint', module='Compatible')
                 scr.invoke((args),(),())
             @staticmethod
             def log(level: str, text: str, msgBox=False):
                 """ Ku konsoli protokolowu powěźeńku pśipowjesyś, opcionalne wužywaŕske napominanje """
                 scr = Console._a2bScript(script='TraceLog')
                 scr.invoke((level,text,msgBox),(),())
             @staticmethod
             def setLevel(logLevel: str):
                 """ Dolnu granicu za protokolowu powěźeńku póstajiś """
                 scr = Console._a2bScript(script='TraceLevel')
                 scr.invoke((logLevel,),(),())
             @staticmethod
             def show():
                 """ Konsolowe wopśimjeśe/dialog pokazaś """
                 scr = Console._a2bScript(script='TraceConsole')
                 scr.invoke((),(),())
             @staticmethod
             def _a2bScript(script: str, library='Access2Base',
                 module='Trace') -> XScript:
                 ''' Na nałoženju bazěrowany skript Basic wótwołaś '''
                 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

Źiwajśo na wopak napisanu metodu documentEventOccured, kótaraž pisańsku zmólku wót nałožeńskego programěrowańskego zwězowańskego městna (API) derbnjo.


Symbol Tip

Tšojeni Nałoženje startowaś a Nałoženje zacyniś móžotej sćažku Python za wužywaŕske skripty abo skripty LibreOffice nastajiś a wótpóraś. Na pódobny nałog daju se biblioteki abo module Python z tšojenjoma Dokument wócyniś a Dokument zacynjony zapśimjeś a pušćiś. Cytajśo Module Python importěrowaś za dalšne informacije.


Z LibreOffice Basic

Z pomocu menija Rědy – Pśiměriś rejtarik: Tšojenja tšojenje Dokument wócyniś inicializaciju Console Logger startujo. Rutina _documentEventOccured – póstajona pśez Console Logger –jako jadnorazowy zastupny dypk słužy, aby wšykne dokumentowe tšojenja wótpópadnuła.

Modul controller.Events


        Option Explicit
        
        Global _obj As Object ' Instanca controller.ConsoleLogger
        
        Sub OnLoad(evt As com.sun.star.document.DocumentEvent) ' >> Dokument wócyniś <<
            _obj = New ConsoleLogger : _obj.StartAdapter(evt)
        End Sub ' controller.OnLoad
        Sub _documentEventOccured(evt As com.sun.star.document.DocumentEvent)
            ''' Jadnorazowy zastupny dypk za ConsoleLogger '''
             _obj.DocumentEventOccurs(evt)
        End Sub ' controller._documentEventOccured
      

Klasowy modul controller.ConsoleLogger

Doglědowanje tšojenjow se wót wokognuśa zachopina, w kótaremž se objekt ConsoleLogger instancěrujo a se slědkoju ze zacynjanim dokumenta kóńcy. Rutina StartAdapter trjebne biblioteki Basic zacytajo, mjaztym až se wótpópadnjone tšojenja z pomocu modula Access2Base.Trace k wěsći daju.


          Option Explicit
          Option Compatible
          Option ClassModule
              
          ' Nacerjeński mustrowy objekt ADAPTER, kótaryž se ma w tšojenju „Dokument wócyniś“ instancěrowaś
          Private Const UI_PROMPT = True
          Private Const UI_NOPROMPT = False ' Na True nastajiś, aby se dokumentowe tšojenja wizualizěrowali
              
          ' CŁONKI
          Private _evtAdapter As Object ' com.sun.star.document.XDocumentEventBroadcaster
          Private _txtMsg As String ' tekstowa powěźeńka za protokolěrowanje w konsoli
              
          ' KAKOSĆI
          Private Property Get FileName As String
              ''' Wót systema wótwisne datajowe mě '''
              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)
              ''' Dokumentowe tšojenja doglědowaś '''
              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)
              ''' Protokolěrowanje dokumentowych tšojenjow inicializěrowaś '''
              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 & "Dokumentowe tšojenja se protokolěruju", 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)
              ''' Protokolěrowanje dokumentowych tšojenjow skóńcyś '''
              ThisComponent.removeDocumentEventListener( _evtAdapter )
              If IsMissing(evt) Then _txtMsg = "" Else _txtMsg = evt.EventName & "-"
              Access2Base.Trace.TraceLog("INFO", _txtMsg & "Dokumentowe tšojenja su se protokolěrowali", UI_PROMPT)
              Access2Base.Trace.TraceConsole() ' Dialog wótpópadnjonych tšojenjow
          End Sub ' controller.ConsoleLogger._StopAdapter
              
          ' TŠOJENJA
          ' Waš kod za pśeźěłane tšojenja jo how
      
warning

Źiwajśo na wopak napisanu metodu documentEventOccured, kótaraž pisańsku zmólku wót nałožeńskego programěrowańskego zwězowańskego městna (API) derbnjo.


Dokumentowe tšojenja namakaś

Objekt Broadcaster API lisćinu tšojenjow k dispoziciji staja, za kótaruž jo zagronity:

Z Python


         # -*- coding: utf-8 -*-
         from __future__ import unicode_literals
             
         import uno, apso_utils as ui
             
         def displayAvailableEvents():
             """ Dokumentowe tšojenja pokazaś """
             '''
             adaptěrowany wót DisplayAvailableEvents() wót 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,)
      
note

Rozšyrjenje Alternative Python Script Organizer (APSO) se wužywa, aby tšojeńske informacije na wobrazowce renderowało.


Z LibreOffice Basic


         Sub DisplayAvailableEvents
             """ Dokumentowe tšojenja pokazaś """
             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
      

Pšosym pódprějśo nas!