Pomoc za LibreOffice 24.8
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.
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 dosěga, aby doglědowanje dokumentowego tšojenja iniciěrowało a skóńcyło. Wubjeŕśo meni rejtarik: , 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.
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 a .
# -*- 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 Module Python importěrowaś za dalšne informacije.
a 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 a zapśimjeś a pušćiś. CytajśoZ pomocu menija 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.
rejtarik: tšojenje inicializaciju
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
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.
Objekt Broadcaster API lisćinu tšojenjow k dispoziciji staja, za kótaruž jo zagronity:
# -*- 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.
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