Wobsah

# Dokumentowe podawki dohladować

Dohladowanje dokumentowych podawkow móže w slědowacych situacijach pomhać:

- Nowy dokument za wočinjenje identifikować, na rozdźěl wot eksistowacych, a přewjedźe wotpowědnu konfiguraciju.

- Předźěłowanje naprašowanjow składowanja, kopěrowanja, ćišćenja abo serijoweho ćišća wodźić.

- Zapis wobsaha, hesłarja abo tabelowe zapiski dokumenta Writer aktualizować, hdyž so ma dokumenta začinić

- Pakety math Python importować, prjedy hač so dokument Calc wočinja. Tute pakety přewostajić, hdyž so dokument začinja.

Nimo připokazowanja makrow k podawkam móžeće podawki dohladować, kotrež so přez dokumenty LibreOfficeDev pušćeja. Sćelaki Nałoženskeje programowanskej tykački (API) su za wuwołanje podawkowych skriptow zamołwite. Na rozdźěl wot posłuchakow, kotrež dyrbja wšě podpěrane metody definować, samo hdyž so njewužiwaja, dokumentowe dohladowanja jenož dwě metodźe nimo podawkowych skriptow trjebaja.

## Dokumentowe podawki dohladować

Dohladowanje so deleka za rěči Basic a Python z pomocu na objekt orientowaneho programowanja zwobraznjuje. Připokazowanje skripta OnLoad podawkej Open Document dosaha, zo by dohladowanje dokumentoweho podawka iniciěrowało a skónčiło. Wubjerće meni Nastroje – Přiměrić rajtark: Podawki, zo byšće wobaj skriptaj připokazał.

Wotpopadnjenje podawkow pomha, wuměnjenja skriptow nastajić, na přikład zo bychu so biblioteki zapřijimali a wuswobodźili abo so předźěłowanje skriptow w pozadku slěduje. Wužiwanje modula Access2Base.Trace druhi kontekst zwobraznjuje.

### Z Python

Dohladowanje podawkow so wot objektowego instanciěrowanja započina a kónči so, hdyž Python objekt pušća. Wuwabjene podawki so z pomocu konsole Access2Base zdźěleja.

Podawkaj OnLoad a OnUnload datej so wužiwać, zo byštej šćežku programow Python nastajiłoj resp. zběhnyłoj. Wopisujetej so jako Dokument wočinić a Dokument začinjeny.

             # -*- 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 podawki dohladować """
                 '''
                 po 'skripće Python za dohladowanje podawka OnSave' při
                 https://forum.openoffice.org/en/forum/viewtopic.php?t=68887
                 '''
                 def __init__(self):
                     """ Monitor dokumentowych podawkow """
                     ''' rozprawa z konsolu Access2Base.Trace ABO
                     rozprawa w 1. špalće 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 # wotstronja komentary jenož za dokumenty Calc
                     Console.setLevel("DEBUG")
                     self.listen() # Dohladowanje dokumentowych podawkow 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 podawki w prěnjej špalće 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 najzašo
                     """ Dohladowanje dokumentowych podawkow startować """
                     self.doc.addDocumentEventListener(self)
                     Console.log("INFO", "Dokumentowe podawki so protokoluja", True)

                 def sleep(self, *args): # OnUnload najpozdźe (opcionalne)
                     """ Dohladowanje dokumentowych podawkow zastajić """
                     self.doc.removeDocumentEventListener(self)
                     Console.log("INFO", "Dokumentowe podawki su so protokolowali", True)

                 def documentEventOccured(self, event: DocumentEvent):
                     """ Wotpopadnje wšě dokumentowe podawki """
                     #self.setCell(event.Source, event.EventName) # jenož za dokumenty Calc
                     Console.log("DEBUG",
                         event.EventName+" in "+self.Filename,
                         False)

                 def disposing(self, event: EventObject):
                     """ Wšě aktiwity dopušćić """
                     self.sleep()
                     Console.show()

             def OnLoad(*args): # Podawk 'Dokument wočinić'
                 listener = UiDocument() # Iniciěruje dohladowanje

             def OnUnload(*args): # Podawk 'Dokument je so začinił'
                 pass # (opcionalny) přewjedźeny, hdyž postajeny

             g_exportedScripts = (OnLoad,)

             from com.sun.star.script.provider import XScript
             class Console():
                 """
                 (Prědkowa/Pozadkowa) konsola za zdźělenje/protokolowanje programoweho wuwjedźenja.
                 """
                 @staticmethod
                 def trace(*args,**kwargs):
                     """ Swobodnu 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):
                     """ Ke konsoli protokolowu zdźělenku připowěsnyć, opcionalna wužiwarska namołwa"""
                     scr = Console._a2bScript(script='TraceLog')
                     scr.invoke((level,text,msgBox),(),())
                 @staticmethod
                 def setLevel(logLevel: str):
                     """ Delnju mjezu za protokolowu zdźělenku postajić """
                     scr = Console._a2bScript(script='TraceLevel')
                     scr.invoke((logLevel,),(),())
                 @staticmethod
                 def show():
                     """ Konsolowy wobsah/dialog pokazać """
                     scr = Console._a2bScript(script='TraceConsole')
                     scr.invoke((),(),())
                 @staticmethod
                 def _a2bScript(script: str, library='Access2Base',
                     module='Trace') -> XScript:
                     ''' Na nałoženju bazowany skript Basic wotwoł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

Dźiwajće na wopak napisanu metodu documentEventOccured, kotraž pisanski zmylk wot nałoženskeje programowanskeje tykački (API) namrěwa.

Podawkaj Nałoženje startować a Nałoženje začinić móžetej šćežku Python za wužiwarske skripty abo skripty LibreOfficeDev nastajić a zběhnyć. Na podobne wašnje dadźa so biblioteki abo module Python z podawkomaj Dokument wočinić a Dokument začinjeny zapřijeć a pušćić. Čitajće Module Python importować za dalše informacije.

### Z LibreOfficeDev Basic

Z pomocu menija Nastroje – Přiměrić rajtark: Podawki podawk Dokument wočinić inicializaciju Console Logger startuje. Rutina _documentEventOccured – postajena přez Console Logger – jako jónkróčny zastupny dypk słuži, zo by wšě dokumentowe podawki wotpopadnyła.

#### Modul controller.Events

            Option Explicit

            Global _obj As Object ' Instanca controller.ConsoleLogger

            Sub OnLoad(evt As com.sun.star.document.DocumentEvent) ' >> Dokument wočinić <<
                _obj = New ConsoleLogger : _obj.StartAdapter(evt)
            End Sub ' controller.OnLoad
            Sub _documentEventOccured(evt As com.sun.star.document.DocumentEvent)
                ''' Jónkróćny zastupny dypk za ConsoleLogger '''
                 _obj.DocumentEventOccurs(evt)
            End Sub ' controller._documentEventOccured

#### Klasowy modul controller.ConsoleLogger

Dohladowanje podawkow so wot wokomika započina, w kotrymž so objekt ConsoleLogger instancuje a naposledk so ze začinjenjom dokumenta kónči. Rutina StartAdapter trěbne biblioteki Basic zapřijima, mjeztym zo so wotpopadnjene podawki z pomocu modula Access2Base.Trace zdźěleja.

              Option Explicit
              Option Compatible
              Option ClassModule

              ' Naćiskowy mustrowy objekt ADAPTER, kotryž so ma w podawku „Dokument wočinić“ instancować
              Private Const UI_PROMPT = True
              Private Const UI_NOPROMPT = False ' Na True nastajić, zo bychu so dokumentowe podawki wizualizowali

              ' ČŁONOJO
              Private _evtAdapter As Object ' com.sun.star.document.XDocumentEventBroadcaster
              Private _txtMsg As String ' tekstowa zdźělenka za protokolowanje w konsoli

              ' KAJKOSĆE
              Private Property Get FileName As String
                  ''' Wot systema wotwisne datajowe mjeno '''
                  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 podawki dohladować '''
                  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)
                  ''' Protokolowanje dokumentowych podawkow inicializować '''
                  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 podawki so protokoluja", 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)
                  ''' Protokolowanje dokumentowych podawkow skónčić '''
                  ThisComponent.removeDocumentEventListener( _evtAdapter )
                  If IsMissing(evt) Then _txtMsg = "" Else _txtMsg = evt.EventName & "-"
                  Access2Base.Trace.TraceLog("INFO", _txtMsg & "Dokumentowe podawki su so protokolowali", UI_PROMPT)
                  Access2Base.Trace.TraceConsole() ' Dialog wotpopadnjenych podawkow
              End Sub ' controller.ConsoleLogger._StopAdapter

              ' PODAWKI
              ' Waš kod za předźěłane podawki je tu

Dźiwajće na wopak napisanu metodu _documentEventOccured, kotraž pisanski zmylk wot nałoženskeje programowanskeje tykački (API) namrěwa.

## Dokumentowe podawki namakać

Objekt Broadcaster API lisćinu podawkow k dispoziciji staja, za kotruž je zamołwity:

### Z Python

             # -*- coding: utf-8 -*-
             from __future__ import unicode_literals

             import uno, apso_utils as ui

             def displayAvailableEvents():
                 """ Dokumentowe podawki pokazać """
                 '''
                 adaptowany wot DisplayAvailableEvents() wot 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šěrjenje Alternative Python Script Organizer (APSO) so wužiwa, zo by podawkowe informacije na wobrazowce renderowało.

### Z LibreOfficeDev Basic

             Sub DisplayAvailableEvents
                 """ Dokumentowe podawki 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

Podobne temy

Podawkowe posłuchaki wutworić

Module Python importować

Dialogowy předźěłowak wutworić

programowanske přikłady Python

Programowanje ze skriptami Python

Makra Basic z Python wuwołać

Prošu podpěrajće nas!