Contenu

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

- Il contient le code qui gère les macros événementielles,

- il décorrèle les événements des noms de macros ce qui facilite la maintenance ou les mises à jour, notamment lors du déplacement de macros ou de modules.

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 :

- Affecter à l'événement "Exécuter l'action" du bouton Dump to file la méthode du composant _dump2File.

- Définissez éventuellement, pour les événements "Touche enfoncée" et "Bouton de la souris enfoncé" du contrôle texte txtTracelog la méthode _openHelp du composant.

- Éventuellement affecter à l'événement "A la réception du focus" du bouton Ok l'événement onOkHasfocus du composant.

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.

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

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

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

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

Rubriques connexes

Appel de Basic depuis Python

Ouvrir une boîte de dialogue avec Basic

Fonction CreateUnoListener

Créer des auditeurs (Listeners) d'événements

Ouvrir une boîte de dialogue avec Python

Écouter les événements de document

Exemples de programmation Python

Aide des scripts LibreOffice Python