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.

Aidez-nous !