Contenu

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

Les événements déclenchés par des boîtes de dialogue, des documents, des formulaires ou des contrôles graphiques peuvent être liés à des macros, c'est ce que l'on appelle la programmation événementielle. La méthode la plus courante pour lier des événements à des macros est l'onglet Événements du menu Outils – Personnaliser et le panneau de propriétés des contrôles de l'élément Éditeur de boîte de dialogue du menu Outils - Macros – Gérer les boîtes de dialogue....

Les artefacts graphiques, les entrées au clavier, les mouvements de la souris et d'autres interactions homme / machine peuvent être contrôlés à l'aide d'auditeurs (listeners) UNO qui surveillent le comportement de l'utilisateur. Les auditeurs sont des alternatives dynamiques de code de programme aux affectations de macros. On peut créer autant d'auditeurs UNO que d'événements à surveiller. Un seul auditeur peut également gérer plusieurs contrôles d'interface utilisateur.

## Créer un auditeur (listener) d'événement

Les auditeurs sont attachés aux contrôles contenus dans les boîtes de dialogue, ainsi qu'aux documents ou aux événements de formulaire. Les auditeurs sont également utilisés lors de la création de boîtes de dialogue d'exécution ou lors de l'ajout de contrôles à une boîte de dialogue à la volée.

Cet exemple crée un auditeur pour le contrôle Button1 de la boîte de dialogue Dialog1 dans la bibliothèque Standard.

### En Python

             # -*- coding: utf-8 -*-
             from __future__ import unicode_literals

             import uno, unohelper
             from com.sun.star.awt import XActionListener
             from com.sun.star.awt import ActionEvent
             from com.sun.star.lang import EventObject
             from com.sun.star.ui.dialogs.ExecutableDialogResults \
                 import OK, CANCEL
             import msgbox as util

             _MY_BUTTON =  "Button1"
             _MY_LABEL = 'Python écoute..'
             _DLG_PROVIDER = "com.sun.star.awt.DialogProvider"

             def Main(*args):
                 ui = createUnoDialog("Standard.Dialog1", embedded=True)
                 ui.Title = "Python X[any]Listener"
                 ctl = ui.getControl(_MY_BUTTON)
                 ctl.Model.Label = _MY_LABEL
                 act = ActionListener()
                 ctl.addActionListener(act)
                 rc = ui.execute()
                 if rc == OK:
                     MsgBox("L'utilisateur a validé la boîte de dialogue.")
                 elif rc == CANCEL:
                     MsgBox("L'utilisateur a annulé la boîte de dialogue.")
                 ui.dispose()  # ui.endExecute
                 ctl.removeActionListener(act)

             def createUnoDialog(libr_dlg: str, embedded=False):
                 """ Crée une boîte de dialogue depuis 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.createDialog("vnd.sun.star.script:"+libr_dlg+location)
                 return dlg

             class ActionListener(unohelper.Base, XActionListener):
                 """ Écoute & compte les clics sur le bouton """
                 def __init__(self):
                     self.count = 0

                 def actionPerformed(self, evt: ActionEvent):
                     self.count = self.count + 1
                     #mri(evt)
                     if evt.Source.Model.Name == _MY_BUTTON:
                         evt.Source.Model.Label = _MY_LABEL+ str( self.count )
                 return

                 def disposing(self, evt: EventObject):  #  routine obligatoire
                     pass

             def MsgBox(txt: str):
                 mb = util.MsgBox(uno.getComponentContext())
                 mb.addButton("Ok")
                 mb.show(txt, 0, "Python")

             g_exportedScripts = (Main,)

Le dossier msgbox.py dans {installation}/program/ présente quelques exemples d'auditeurs de boutons.

### En LibreOffice Basic

             Option Explicit

             Const MY_LIBRARY = "Standard", MY_DIALOG = "Dialog1", MY_BUTTON = "Button1"
             Const MY_LABEL = "Basic écoute.."
             Dim count As Integer

             Sub Main
                 Dim libr As Object ' com.sun.star.script.XLibraryContainer
                 Dim dlg As Object
                 Dim ui As Object  ' stardiv.Toolkit.UnoDialogControl
                 Dim ctl As Object ' stardiv.Toolkit.UnoButtonControl
                 Dim act As Object ' com.sun.star.awt.XActionListener
                 Dim rc As Object : rc = com.sun.star.ui.dialogs.ExecutableDialogResults

                 BasicLibraries.LoadLibrary(MY_LIBRARY)
                 libr = DialogLibraries.GetByName(MY_LIBRARY)
                 dlg = libr.GetByName(MY_DIALOG)
                 ui = CreateUnoDialog(dlg)
                 ui.Title = "Basic X[any]Listener example"
                 count = 0
                 ctl = ui.GetControl(MY_BUTTON)
                 ctl.Model.Label = MY_LABEL
                 act = CreateUnoListener("awt_", "com.sun.star.awt.XActionListener")
                 ctl.addActionListener(act)
                 Select Case ui.Execute
                     L'utilisateur a validé la boîte de dialogue
                     Case rc.CANCEL : MsgBox "L'utilisateur a annulé la boîte de dialogue .",, "Basic"
                 End Select
                 ui.dispose ' ui.endExecute()
                 ctl.removeActionListener(act)
             End Sub

             Private Sub awt_actionPerformed(evt As com.sun.star.awt.ActionEvent)
                 ''' Auditer et compter les clics sur le bouton '''
                 With evt.Source.Model
                     If .Name = MY_BUTTON Then
                         count = count + 1
                         .Label = MY_LABEL+Cstr(count)
                     End If
                 End With
             End Sub ' awt_actionPerformed

             Private Sub awt_disposing(evt As com.sun.star.lang.EventObject) ' mandatory Sub
                 ' votre code ici
             End Sub ' awt_disposing

## Autres auditeurs d'événements

Les auditeurs sont généralement codés avec ouverture de dialogue. De nombreuses approches d'audit sont possibles, telles que les gestionnaires d'événements pour les boîtes de dialogue ou les moniteurs d'événements pour les documents ou les formulaires.

Rubriques connexes

Exemples de programmation des contrôles dans l'éditeur de boîte de dialogue

Fonction CreateUnoListener

Affectation d'événements à des objets

Voir aussi Événements de documents, Événements de formulaire.

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

Écouter les événements de document

Exemples de programmation Python