Contingut
d

# Crea un controlador de diàleg

Al costat d'assignar macros a esdeveniments o crear oients d'esdeveniments, es poden utilitzar gestors de diàlegs, el principi dels quals és definir paraules clau UNO, o mètodes, que s'assignen als esdeveniments a seguir. El gestor d'esdeveniments és responsable d'executar els mètodes mitjançant el protocol vnd.sun.star.UNO:<method_name>. A diferència dels oients que necessiten definir tots els mètodes que suporta, fins i tot si no s’utilitzen, els gestors de diàlegs només requereixen dos mètodes a més dels scripts dels punts d'inserció esperats.

Els avantatges d'aquest enfocament són:

- Empaqueta el codi que gestiona les macros orientades a esdeveniments,

- aquest desvincula els esdeveniments dels noms de les macros, que facilita el manteniment o les actualitzacions, en particular quan es mouen macros o mòduls.

Aquest mecanisme s'il·lustra amb els llenguatges Basic i Python mitjançant una còpia importada del diàleg Access2Base dlgTrace. La gestió i la localització d’excepcions s’ometen per més claredat.

## Assignació de mètodes al diàleg

Exporta el diàleg dlgTrace de l'Access2Base i l'importa en la llibreria MyLib de l'aplicació.

Dins de la subfinestra de propietats de control de l'editor de diàlegs, utilitzeu la pestanya Esdeveniments per a substituir les assignacions de les macros per assignacions per components i, tot seguit, escriviu els noms dels mètodes previstos:

- Establiu el nom del mètode del component de botó del quadre de diàleg Buidar al fitxer_dump2File

- Opcionalment, definiu txtTracelog els noms dels mètodes de l'esdeveniment del component de la la tecla premuda i del botó del ratolí com _openHelp

- Opcionalment, podeu definir el nom del mètode de l'esdeveniment focus del component botó D'acord com a onOkHasfocus

Les accions assignades als esdeveniments han de referir-se al protocol vnd.sun.star.UNO:

## Creació del gestor

createDialogWithHandler mètode del servei com.sun.star.awt.DialogProvider2 s'utilitza per configurar el diàleg i el seu controlador. El controlador és responsable de la implementació de la interfície com.sun.star.awt.XDialogEventHandler.

Tots els noms de mètodes del components s’han de declarar explícitament quan s’utilitza un controlador de diàleg.

### Amb Python

En aquest exemple, el quadre de diàleg es troba a l'ordinador.

          # -*- 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):
              """ Gestor de consola de l'Access2Base """
              ''' adaptació de «Créer un dialogue avec gestionnaire d'événements» de J.-M. 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):
                  """ Creeu un diàleg des de la seva ubicació """
                  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=''):
              ''' MsgBox Lleig '''
              import msgbox
              mb = msgbox.MsgBox(uno.getComponentContext())
              mb.addButton('Howdy')
              mb.show(prompt,0,title)

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

          g_exportedScripts = (ConsoleHandler,)

Com s'esperava, la falta del mètode onOkHasFocus genera una excepció.

Consulteu la pàgina Crides de Python a Basic en LibreOffice per a la descripció de la rutina getBasicScript i més detalls sobre l'execució de scripts en llenguatge creuat.

### Amb el LibreOffice Basic

En aquest exemple el diàleg s'incrusta a un document, i es pot localitzar a l'ordinador.

          ' <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)) 'Si es tracta d'un diàleg incrustat al document
              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, _
                  metode 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) si el diàleg està basat en el computador
                  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

          ' adaptat des de « Crea un diàleg amb el gestor d'esdeveniments » per JM Zambon
          ' https://wiki.openoffice.org/wiki/FR/Documentation/Python/Creating_Dialog_with_Handler

Com s'esperava, la falta del mètode onOkHasFocus llença una excepció.

Temes relacionats

Crida a macros Basic des de Python

Obertura d'un diàleg amb el Basic

Funció CreateUnoListener

Crea oients d'esdeveniments

Obre un quadre de diàleg amb Python

Escolta els esdeveniments del document

Exemples de programació en Python

Ajuda dels scripts de Python a LibreOffice

Ens cal la vostra ajuda!