Création d'un gestionnaire de boîtes de dialogue

Outre l'attribution de macros aux événements ou la création d'auditeurs d'événements, on peut utiliser des gestionnaires de boîte de dialogue, dont le principe est de définir des mots-clés UNO, ou des méthodes, qui sont affectés à des événements à surveiller. Le gestionnaire d'événements est responsable de l'exécution des méthodes à l'aide du protocole vnd.sun.star.UNO:<nom_de_methode> . Contrairement aux auditeurs qui nécessitent de définir toutes les méthodes prises en charge, même s'ils ne sont pas utilisés, les gestionnaires de boîtes de dialogue ne nécessitent que deux méthodes en plus des scripts de branchement de contrôle prévus.

Les avantages de cette approche sont :

Ce mécanisme est illustré ci-dessous pour les langages BASIC et Python, en utilisant une copie importée de la boîte de dialogue Access2Base dlgTrace.La gestion des exceptions et la localisation sont omises pour plus de clarté.

Affectation de méthodes de dialogue

Exporter la boîte de dialogue Access2Base dlgTrace et l'importer dans la bibliothèque MyLib .

Dans le panneau d'édition des propriétés des contrôles de l'Éditeur de boîtes de dialogue, utilisez l'onglet Événements pour remplacer l'affectation de macro par l'affectation de composant, et saisissez les noms de méthode prévus :

Les actions assignées aux événements doivent mentionner le protocole vnd.sun.star.UNO:.

Création du gestionnaire

La méthode createDialogWithHandler du service com.sun.star.awt.DialogProvider2 est utilisée pour créer la boîte de dialogue et son gestionnaire. Le gestionnaire est responsable de la mise en œuvre de l'interface com.sun.star.awt.XDialogEventHandler.

warning

Tous les noms de méthode de composant doivent être déclarés explicitement lors de l'utilisation d'un gestionnaire de boîte de dialogue.


En Python

Dans cet exemple, la boîte de dialogue se trouve sur l'ordinateur.


      # -*- 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):
          """Gestionnaire de console Access2Base """
          ''' adapté de « Créer un dialogue avec gestionnaire d'événements » par 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):
              """ Créer une boîte de dialogue à partir de son emplacement """
              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 laide'''
          import msgbox
          mb = msgbox.MsgBox(uno.getComponentContext())
          mb.addButton('Howdy')
          mb.show(prompt,0,title)
          
      def ConsoleHandler():
          Console().show()
          
      g_exportedScripts = (ConsoleHandler,)
          
      
note

Comme prévu, la méthode manquante onOkHasFocus lève une exception.


tip

Reportez-vous à la page Appels Python vers LibreOffice Basic pour la description de la routine getBasicScript et pour plus de détails sur l'exécution des scripts entre langages.


En LibreOffice Basic

Dans cet exemple, la boîte de dialogue est intégrée dans un document et peut également se trouver sur l'ordinateur.


      ' <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 intégrée au 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, _
              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) if computer-based dialog
              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
          
      ' adapté de« Créer un dialogue avec gestionnaire d'événements » parJM Zambon
      ' https://wiki.openoffice.org/wiki/FR/Documentation/Python/Creating_Dialog_with_Handler
      
note

Comme prévu, la méthode manquante onOkHasFocus lève une exception.


Aidez-nous !