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:

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:

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.

warning

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

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


tip

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
      
note

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


Ens cal la vostra ajuda!