Pakikinig sa Mga Kaganapang Dokumento

Ang pakikinig sa mga kaganapan sa dokumento ay makakatulong sa mga sumusunod na sitwasyon:

Sa tabi pagtatalaga ng mga macro sa mga kaganapan , masusubaybayan ng isa ang mga kaganapang itinaas ng mga dokumento ng LibreOffice. Ang Application Programming Interface (API) broadcasters ay may pananagutan sa pagtawag sa mga script ng kaganapan. Hindi tulad ng mga tagapakinig na nangangailangang tukuyin ang lahat ng sinusuportahang pamamaraan, kahit na hindi ginagamit, ang mga monitor ng dokumento ay nangangailangan lamang ng dalawang pamamaraan sa tabi ng mga naka-hook na script ng kaganapan.

Pagsubaybay sa Mga Kaganapan sa Dokumento

Ang pagsubaybay ay inilalarawan dito para sa Basic at Python na mga wika gamit ang object-oriented programming. Pagtatalaga OnLoad script, sa Buksan ang Dokumento kaganapan, sapat na upang simulan at wakasan ang pagsubaybay sa kaganapan ng dokumento. Mga Tool - I-customize menu Mga kaganapan tab ay ginagamit upang magtalaga ng alinman sa mga script.

Ang pagharang sa mga kaganapan ay nakakatulong sa pagtatakda ng mga script bago at pagkatapos ng mga kundisyon gaya ng pag-load at pag-unload ng mga library o pagsubaybay sa pagpoproseso ng script sa background. Access2Base.Trace Ang paggamit ng module ay naglalarawan sa pangalawang konteksto.

Gamit ang Python

Ang pagsubaybay sa mga kaganapan ay nagsisimula sa object instantiation at sa huli ay hihinto kapag inilabas ng Python ang object. Iniuulat ang mga nakataas na kaganapan gamit ang Access2Base console.

note

OnLoad at OnUnload Maaaring gamitin ang mga kaganapan upang itakda at i-unset ang landas ng mga programa ng Python. Inilalarawan sila bilang Buksan ang dokumento at Sarado ang dokumento .



         # -*- 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):
             """ Subaybayan ang mga kaganapan sa dokumento """
             '''
             inangkop mula sa 'Python script upang subaybayan ang kaganapang OnSave' sa
             https://forum.openoffice.org/en/forum/viewtopic.php?t=68887
             '''
             def __init__(self):
                 """ Subaybayan ang mga kaganapan sa dokumento """
                 ''' ulat gamit ang Access2Base.Trace console O
                 ulat sa 1st sheet, 1st column para sa Calc docs '''
                 ctx = uno.getComponentContext()
                 smgr = ctx.getServiceManager()
                 desktop = smgr.createInstanceWithContext(
                 'com.sun.star.frame.Desktop' , ctx)
                 self.doc = desktop.CurrentComponent
                 #self.row = 0 # uncomment para sa mga dokumento ng Calc lamang
                 Console.setLevel("DEBUG")
                 self.listen() # Simulan ang pagsubaybay doc. mga pangyayari
             
             @property
             def Filename(self) -> str:
                 sys_filename = uno.fileUrlToSystemPath(self.doc.URL)
                 return os.path.basename(sys_filename)
             
             def setCell(self, calcDoc, txt: str):
                 """ I-output ang mga kaganapan sa doc. sa 1st column ng isang Calc spreadsheet """
                 sheet = calcDoc.getSheets().getByIndex(0)
                 sheet.getCellByPosition(0,self.row).setString(txt)
                 self.row = self.row + 1
             
             def listen(self, *args): # OnLoad/OnNew at the earliest
                 """ Simulan doc. pagsubaybay sa mga kaganapan """
                 self.doc.addDocumentEventListener(self)
                 Console.log("INFO", "Ini-log ang mga kaganapan sa dokumento", True)
             
             def sleep(self, *args): # OnUnload sa pinakabago (opsyonal)
                 """ Ihinto doc. pagsubaybay sa mga kaganapan """
                 self.doc.removeDocumentEventListener(self)
                 Console.log("INFO", "Naka-log na ang mga kaganapan sa dokumento", True)
             
             def documentEventOccured(self, event: DocumentEvent):
                 """ Hinahadlangan ang lahat ng doc. na kaganapan """
                 #self.setCell(event.Source, event.EventName) # para lang sa Calc docs
                 Console.log("DEBUG",
                     event.EventName+" in "+self.Filename,
                     False)
             
             def disposing(self, event: EventObject):
                 """ Ilabas ang lahat ng aktibidad """
                 self.sleep()
                 Console.show()
             
         def OnLoad(*args): # kaganapang 'Buksan ang Dokumento'
             listener = UiDocument() # Nagsisimula ng pakikinig
             
         def OnUnload(*args): # 'Nasarado na ang dokumento' na kaganapan
             pass # (opsyonal) na ginawa kapag itinapon
             
         g_exportedScripts = (OnLoad,)
             
         from com.sun.star.script.provider import XScript
         class Console():
             """
             (Back/Fore)ground console para mag-ulat/mag-log sa pagpapatupad ng program.
             """
             @staticmethod
             def trace(*args,**kwargs):
                 """ I-print ang libreng listahan ng item para i-console """
                 scr = Console._a2bScript(script='DebugPrint', module='Compatible')
                 scr.invoke((args),(),())
             @staticmethod
             def log(level: str, text: str, msgBox=False):
                 """ Idagdag ang mensahe ng log sa console, opsyonal na prompt ng user """
                 scr = Console._a2bScript(script='TraceLog')
                 scr.invoke((level,text,msgBox),(),())
             @staticmethod
             def setLevel(logLevel: str):
                 """ Itakda ang mas mababang limitasyon ng mga mensahe sa log """
                 scr = Console._a2bScript(script='TraceLevel')
                 scr.invoke((logLevel,),(),())
             @staticmethod
             def show():
                 """ Display console content/dialog """
                 scr = Console._a2bScript(script='TraceConsole')
                 scr.invoke((),(),())
             @staticmethod
             def _a2bScript(script: str, library='Access2Base',
                 module='Trace') -> XScript:
                 ''' Grab application-based Basic script '''
                 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

Isipin ang maling spelling documentEventOccured paraan na nagmana ng typo mula sa LibreOffice Application Programming Interface (API).


Icon ng Tip

Simulan ang application at Isara ang application Maaaring gamitin ang mga kaganapan ayon sa pagkakabanggit upang itakda at i-unset ang path ng Python para sa mga script ng user o mga script ng LibreOffice. Sa katulad na paraan, ang mga library o module ng Python batay sa dokumento ay maaaring i-load at ilabas gamit Buksan ang dokumento at Sarado ang dokumento mga pangyayari. Sumangguni sa Pag-import ng mga Module ng Python para sa karagdagang impormasyon.


Gamit ang LibreOffice Basic

Gamit Mga Tool - I-customize menu Mga kaganapan tab, ang Buksan ang dokumento kaganapang sunog a ConsoleLogger pagsisimula. _documentEventOccured routine - itinakda ng ConsoleLogger - nagsisilbing isang natatanging entry point upang bitag ang lahat ng mga kaganapan sa dokumento.

controller.Modyul ng mga kaganapan


        Option Explicit
        
        Global _obj Bilang Object ' controller.ConsoleLogger instance
        
        Sub OnLoad(evt As com.sun.star.document.DocumentEvent) ' >> Buksan ang Dokumento <<
            _obj = New ConsoleLogger : _obj.StartAdapter(evt)
        End Sub ' controller.OnLoad
        Sub _documentEventOccured(evt As com.sun.star.document.DocumentEvent)
            ''' natatanging entry point ng ConsoleLogger '''
             _obj.DocumentEventOccurs(evt)
        End Sub ' controller._documentEventOccured
      

controller.ConsoleLogger class module

Ang pagsubaybay sa mga kaganapan ay nagsisimula sa sandaling a ConsoleLogger object ay instantiated at sa huli ay hihinto sa pagsara ng dokumento. StartAdapter nakagawiang naglo-load ng mga kinakailangang Pangunahing aklatan, habang ang mga nahuli na kaganapan ay iniuulat na ginagamit Access2Base.Trace modyul.


          Option Explicit
          Option Compatible
          Option ClassModule
              
          ' ADAPTER design pattern object na gagawin sa kaganapang "Open Document."
          Private Const UI_PROMPT = True
          Private Const UI_NOPROMPT = False ' Itakda ito sa True upang mailarawan ang mga kaganapan sa mga dokumento
              
          'MEMBERS
          Private _evtAdapter As Object ' com.sun.star.document.XDocumentEventBroadcaster
          Pribadong _txtMsg Bilang String ' text message para mag-log in sa console
              
          ' MGA ARI-ARIAN
          Private Property Get FileName As String
              ''' System-dependent filename '''
              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
              
          ' MGA PARAAN
          Public Sub DocumentEventOccurs(evt As com.sun.star.document.DocumentEvent)
              ''' Subaybayan ang mga kaganapan sa dokumento '''
              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)
              ''' Magsimula sa pag-log ng mga kaganapan sa dokumento '''
              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 at "Nila-log ang mga kaganapan sa dokumento", 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)
              ''' Wakasan ang pag-log ng mga kaganapan sa dokumento '''
              ThisComponent.removeDocumentEventListener( _evtAdapter )
              If IsMissing(evt) Then _txtMsg = "" Else _txtMsg = evt.EventName & "-"
              Access2Base.Trace.TraceLog("INFO", _txtMsg at "Naka-log na ang mga kaganapan sa dokumento", UI_PROMPT)
              Access2Base.Trace.TraceConsole() ' Nakuhang dialog ng mga kaganapan
          End Sub ' controller.ConsoleLogger._StopAdapter
              
          ' MGA PANGYAYARI
          ' Dito napupunta ang iyong code para sa mga pinangangasiwaang kaganapan
      
warning

Isipin ang maling spelling _documentEventOccured paraan na nagmana ng typo mula sa LibreOffice Application Programming Interface (API).


Pagtuklas ng Mga Kaganapan sa Dokumento

Ang object ng broadcaster API ay nagbibigay ng listahan ng mga kaganapan na responsable para sa:

Gamit ang Python


         # -*- coding: utf-8 -*-
         from __future__ import unicode_literals
             
         import uno, apso_utils as ui
             
         def displayAvailableEvents():
             """ Ipakita ang mga kaganapan sa dokumento """
             '''
             inangkop mula sa DisplayAvailableEvents() ni A. Pitonyak
             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

Ang Alternatibong Python Script Organizer (APSO) extension ay ginagamit upang mag-render ng impormasyon ng mga kaganapan sa screen.


Gamit ang LibreOffice Basic


         Sub DisplayAvailableEvents
             ''' Ipakita ang mga kaganapan sa dokumento '''
             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
      

Mangyaring suportahan kami!