Vsebina

# 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:

- vsebuje kodo, ki obravnava z dogodki gnane makre,

- odveže dogodke in imena makrov, kar poenostavlja vzdrževanje ali posodobitve, še posebej pri premikanju makrov ali modulov.

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:

- Ime metode komponente gumba pogovornega okna Dump to file nastavite na _dump2File

- Po potrebi lahko določite imena metod za komponente dogodkov pritisnjene tipke in pritisnjene tipke miške txtTracelog kot _openHelp

- Po potrebi določite gumb V redu, ki prejme ime komponente metode dogodka prejema pozornosti kot onOkHasfocus

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.

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

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

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

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

Podobne teme

Klicanje makrov Basic s Pythonom

Odpiranje pogovornega okna z Basicom

Funkcija CreateUnoListener

Ustvarjanje poslušalcev dogodkov

Prikaz pogovornega okna s Pythonom

Poslušanje dogodkov dokumenta

Primeri programov v Pythonu

Pomoč LibreOffice za skripte v jeziku Python