Indhold
Indholdsfortegnelse 🔎︎

# Creating a Dialog Handler

Udover at tildele begivenheder makroer eller oprette event listeners, kan du bruge dialoghåndteringer, hvis princip er at definere UNO-nøgleord eller metoder, som mappes til begivenheder, der overvåges. Begivenhedshåndteringen er ansvarlig for at eksekvere metoder med protokollen vnd.sun.star.UNO:<method_name>. I modsætning til listeners, som kræver at alle understøttede metoder defineres, endda de ubenyttede, kræver dialoghåndteringer kun to metoder oven i de tilsigtede control hook scripts.

Fordelene ved denne tilgang er:

- De pakker den kode, der håndterer begivenhedsdrevne makroer,

- den løser begivenheder fra makronavne, hvilket letter vedligeholdelse eller opdatering, specielt når makroer eller moduler flyttes.

Denne mekanisme illustreres hermed for sprogene Basic og Python med en importeret kopi af dialogen Access2Base dlgTrace. Håndtering af undtagelser og lokalisering udelades for klarhedens skyld.

## Anvisning af dialogmetoder

Eksporter dialogen Access2Base dlgTrace og importer den i programbiblioteket MyLib.

I panelet Kontrolegenskaber i Dialog Editor bruger du fanebladet Hændelser til at erstatte makro-anvisninger med komponent-anvisninger og indtaster de tilsigtede metodenavne:

- Set Dump to file dialog button component method name to _dump2File

- Definer eventuelt hændelserne "tast trykket" txtTracelog og "museknap trykket"s komponent-metodenavne som _openHelp

- Definer eventuelt hændelsen, at Ok-knappen får fokus, med komponent-metodenavnet onOkHasfocus

Begivenheder, der er tildelt handlinger, bør nævne protokollen vnd.sun.star.UNO:.

## Oprettelse af håndteringen

Metoden createDialogWithHandler com.sun.star.awt.DialogProvider2s tjeneste bruges til at indstille dialogen og den håndtering. Håndteringen er ansvarlig for at implementere grænsefladen com.sun.star.awt.XDialogEventHandler.

Alle komponent-metodenavne skal erklæres udtrykkeligt, når dialoghåndteringen bruges.

### Med Python

I dette eksempel er dialogen placeret på computeren.

          # -*- 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):
              """ Access2Base Konsolhåndtering """
              ''' tilpasset fra « Créer un dialogue avec gestionnaire d'événements » by JM Zambon
              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):
                  """ Oprettelse af en dialog fra dens placering """
                  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=''):
              ''' Grim MsgBox '''
              import msgbox
              mb = msgbox.MsgBox(uno.getComponentContext())
              mb.addButton('Howdy')
              mb.show(prompt,0,title)

          def ConsoleHandler():
              Console().show()

          g_exportedScripts = (ConsoleHandler,)

Som ventet giver den manglende metode onOkHasFocus en undtagelse.

Se siden Python-kald til LibreOffice Basic for beskrivelse af rutiner i getBasicScript og detaljer om udførelse af sccrpting på tværs af sprog.

### Med LibreOffice Basic

I dette eksempel er dialogen indlejret i et dokument og kan lige så godt være placeret på computeren.

          ' <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)) ' hvis dialogen er dokument-indlejret
              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) , hvis dialogen er computer-baseret
                  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

          ' tilpasset fra « Créer un dialogue avec gestionnaire d'événements » af JM Zambon
          ' https://wiki.openoffice.org/wiki/FR/Documentation/Python/Creating_Dialog_with_Handler

Som ventet giver den manglende metode getBasicScript en undtagelse.

Relaterede emner

Kalde Basic-makroers fra Python

Åbne en dialog med Basic

funktionen CreateUnoListener

Oprettelse af Hændelses-Aflyttere

Åbning af en dialog med Python

Overvåger Dokumenthændelser

Python programmeringseksempler

Hjælp til LibreOffice Pythonscripts