Wopśimjeśe

# Dokumentowe tšojenja doglědowaś

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

- Nowy dokument za wócynjanje identificěrowaś, na rozdźěl wót eksistěrujucych, a pśewjeźo wótpowědnu konfiguraciju.

- Pśeźěłowanje napšašowanjow składowanja, kopěrowanja, śišćanja abo serijowego śišća wóźiś.

- Zapis wopśimjeśa, gronidłowy zapis abo tabelowe zapiski dokumenta Writer aktualizěrowaś, gaž se ma dokumenta zacyniś

- Pakety math Python importěrowaś, nježli až se dokument Calc wócynja. Toś te pakety pśewóstajiś, gaž se dokument zacynja.

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.

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

Ź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.

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

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

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ódobne temy

Tšojeńske pśisłuchaki napóraś

Module Python importěrowaś

Dialogowy pśeźěłowak napóraś

programěrowańske pśikłady Python

Programěrowanje ze skriptami Python

Makra Basic z Python wuwołaś

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