Ustvarjanje krmilnikov pogovornih oken

Poleg dodeljevanja makrov dogodkom ali ustvarjanja poslušalcev dogodkov lahko uporabljamo tudi krmilnike pogovornih oken, ki določajo ključne besede UNO ali metode in jih preslikajo na dogodke, ki jih poslušajo. Krmilnik dogodka je odgovoren za izvajanje metod s protokolom vnd.sun.star.UNO:<ime_metode>. Medtem ko poslušalci dogodkov zahtevajo določitev vseh podprtih metod, tudi če niso uporabljene, zahtevajo krmilniki dogodkov le dve metodi poleg predvidenih skriptov nadzornih kljuk.

Prednosti takšnega pristopa so:

V tem primeru je mehanizem za jezika Basic in Python predstavljen z uporabo uvožene kopije pogovornega okna Access2Base dlgTrace. Obravnava izjem in lokalizacija sta zavoljo jasnosti izpuščena.

Dodeljevanje metod pogovornemu oknu

Izvozi pogovorno okno Access2Base dlgTrace in ga uvozi v knjižnico programa MyLib.

Na zavihku Dogodki v podoknu lastnosti kontrolnika v Urejevalniku pogovornega okna zamenjajte dodelitve makrov z dodelitvami komponent in vnesite imena predvidenih metod:

Dogodkom dodeljena dejanja morajo omenjati protokol vnd.sun.star.UNO:.

Ustvarjanje krmilnika

Metoda createDialogWithHandler storitve com.sun.star.awt.DialogProvider2 se uporablja za določitev pogovornega okna in njegovega krmilnika. Krmilnik je odgovoren za implementacijo vmesnika com.sun.star.awt.XDialogEventHandler.

warning

Ko uporabljate krmilnik pogovornih oken, morajo biti imena vseh metod komponent eksplicitno deklarirana.


S Pythonom

V tem primeru se pogovorno okno nahaja na računalniku.


      # -*- coding: utf-8 -*-
      from __future__ import unicode_literals
          
      import uno, unohelper
      from com.sun.star.awt import XDialogEventHandler
          
      _DLG_PROVIDER = "com.sun.star.awt.DialogProvider2"
          
      class Console(unohelper.Base, XDialogEventHandler):
          """ Krmilnik konzole Access2Base """
          ''' prirejeno po »Créer un dialogue avec gestionnaire d’événements« avtorja JM Zambona
          https://wiki.openoffice.org/wiki/FR/Documentation/Python/Creating_Dialog_with_Handler '''
          def show(self):
              dialog = self.getDialog("MyLib.dlgTrace", embedded=True)
              dialog.Title = "Konsole"
              dialog.execute()
          
          def callHandlerMethod(self, dialog, event, method):
              if method == '_dump2File':
                  event.Source.setLabel("dump requested")
                  scr = getBasicScript(script="_DumpToFile", module="Trace",
                      library='Access2Base')
                  scr.invoke((event,), (), ())
              elif method == '_openHelp':
                  _msgbox('Not yet implemented')
                  dialog.endDialog(1)
              else:
                  return False
          
          def getSupportedMethodNames(self):
              return ('_dump2File', '_openHelp')
          
          def getDialog(self, libr_dlg: str, embedded=False):
              """ Ustvari pogovorno okno iz njegovega mesta """
              smgr = XSCRIPTCONTEXT.getComponentContext().ServiceManager
              if embedded:
                  model = XSCRIPTCONTEXT.getDocument()
                  dp = smgr.createInstanceWithArguments(_DLG_PROVIDER, (model,))
                  location = "?location=document"
              else:
                  dp = smgr.createInstanceWithContext(_DLG_PROVIDER, ctx)
                  location = "?location=application"
              dlg = dp.createDialogWithHandler("vnd.sun.star.script:"+libr_dlg+location, self)
              return dlg
          
      # def getBasicScript()  # see note
           
      def _msgbox(prompt='', title=''):
          ''' Grdi MsgBox '''
          import msgbox
          mb = msgbox.MsgBox(uno.getComponentContext())
          mb.addButton('Howdy')
          mb.show(prompt,0,title)
          
      def ConsoleHandler():
          Console().show()
          
      g_exportedScripts = (ConsoleHandler,)
          
      
note

Manjkajoča metoda onOkHasFocus pričakovano vrže izjemo.


tip

Oglejte si klice Pythona v LibreOffice Basic za opis rutine Getbasicscript in podrobnosti o skriptnem izvajanju v več jezikih.


Z LibreOffice Basicom

V tem primeru je pogovorno okno vdelano v dokument in ga je mogoče enakovredno poiskati v računalniku.


      ' <MyLib>.<Handler> module
          
      Public Sub Console_Show()
          Dim dp as Object ' com.sun.star.awt.DialogProvider2
          Dim dialog As Object ' com.sun.star.awt.XDialog, com.sun.star.awt.XDialogEventHandler
          Dim eventHandler As Object ' com.sun.star.awt.XDialogEventHandler
          dp = CreateUnoService("com.sun.star.awt.DialogProvider2")
          dp.Initialize(Array(ThisComponent)) ' če je pogovorno okno vdelano v dokument
          eventHandler = CreateUnoListener("Console_", "com.sun.star.awt.XDialogEventHandler")
          dialog = dp.createDialogWithHandler("vnd.sun.star.script:MyLib.dlgTrace?location=document", eventHandler)
          dialog.Title = "Konsole"
          dialog.execute()
      End Sub ' <Handler>.Console_Show()
          
      Private Function Console_callHandlerMethod(dialog as Object, _
              event As com.sun.star.document.DocumentEvent, _
              method As String) As Boolean
          ''' Intercept dialog events using .UNO protocol '''
          Console_callHandlerMethod = True
          Select Case method
              Case "_dump2File"
                  event.Source.setLabel("dump requested")
                  With GlobalScope.BasicLibraries
                      If Not .IsLibraryLoaded("Access2Base") Then .LoadLibrary("Access2Base")
                  End With
                  Access2Base.Trace._DumpToFile
              Case "_openHelp" 
                  MsgBox "Not yet implemented",0 , "Howdy"
                  'dialog.endDialog(1) če je pogovorno okno na računalniku
              Case Else : Console_callHandlerMethod = False
          End Select
      End Function ' <Handler>.Console_callHandlerMethod
          
      Private Function Console_getSupportedMethodNames()
          Console_getSupportedMethodNames = Array("_dump2File", "_openHelp")
      End Function ' <Handler>.Console _getSupportedMethodNames
          
      ' prirejeno po »Créer un dialogue avec gestionnaire d’événements« avtorja JM Zambona
      ' https://wiki.openoffice.org/wiki/FR/Documentation/Python/Creating_Dialog_with_Handler
      
note

Manjkajoča metoda onOkHasFocus pričakovano vrže izjemo.


Podprite nas!