Créer un dialogue avec gestionnaire d'événements (handler)

From Apache OpenOffice Wiki
< FR‎ | Documentation
Revision as of 10:04, 1 May 2018 by Jmzambon (Talk | contribs)

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search


Il existe plusieurs façons de gérer les événements déclenchés par une boîte de dialogue et ses contrôles. La plus commune consiste à affecter, depuis l’assistant de création de dialogue, une macro à l’événement voulu. Une autre méthode consiste à créer autant de listeners que d'événements à surveiller, qui seront affectés dynamiquement à la création du dialogue.

Il existe une troisième solution, à mi-chemin entre les deux précédentes : l’utilisation d’un gestionnaire d’événement dédié aux dialogues ou "Dialog Event Handler". Le principe est relativement simple : on définit une série de mots-clés ("méthodes") qui seront affectées aux événements à surveiller. On instancie ensuite un objet XDialogEventHandler chargé de réagir à chaque appel de ces mots-clés.

Malgré sa facilité d'utilisation, la méthode semble très peu documentée (voir notamment Accept events created by dialog controls). En voici les principes.

Affectation des méthodes

De manière classique, l’affectation se fait via l’assistant de création de dialogue. À la place de "Macro..." dans la section "Assigner", choisissez "Composant…" et entrez manuellement le nom de la méthode correspondante. Le programme se charge d'affecter la méthode avec le protocole vnd.sun.star.UNO:nom_de_la_methode :
Affecter une méthode à un contrôle.

Création du dialogue

Pour pouvoir utiliser le gestionnaire d'événements, le dialogue doit être créé avec la méthode createDialogWithHandler du service DialogProvider2.

Création de l’objet XDialogEventHandler

L'interface XDialogEventHandler possède deux méthodes : callHandlerMethod et getSupportedMethodNames. La seconde doit simplement renvoyer la liste des mots-clés supportés et n'est pas vraiment requise dans le présent contexte d'utilisation. La méthode callHandlerMethod est appelée par le programme à chaque action de l'utilisateur. Elle reçoit en paramètres, dans l'ordre, l'objet "dialogue", l'objet "événement" habituel et le nom de la méthode activée. Si la méthode n'est pas reconnue, la fonction doit retourner faux, ce qui génère un message d'erreur automatique.

Exemple
import unohelper
from com.sun.star.awt import XDialogEventHandler
 
class DialogEventHandler(unohelper.Base, XDialogEventHandler):
    def callHandlerMethod(self, dialog, event, method):
        if method == 'methode1':
            event.Source.setLabel("ÇA MARCHE !")
        elif method == 'fermer':
            dialog.endDialog(1)
        else:
            return False
    def getSupportedMethodNames(self):
        return ('methode1', 'fermer')
 
def ouvredlg(event=None):
    ctx = XSCRIPTCONTEXT.getComponentContext()
    smgr = ctx.ServiceManager
    dialogprovider = smgr.createInstanceWithContext("com.sun.star.awt.DialogProvider2", ctx)
    uri = "vnd.sun.star.script:DialogEventHandler.Dialog1?location=application"
    eventhandler = DialogEventHandler()
    dialog = dialogprovider.createDialogWithHandler(uri, eventhandler)
    dialog.execute()


Exemple en Basic

Il est possible également d’utiliser cette méthode en basic au moyen de la méthode CreateUnoListener pour construire l’interface :

sub main
    dialogprovider = createUnoService("com.sun.star.awt.DialogProvider2")
    dialogprovider.initialize(array(thiscomponent))
    eventhandler = createUnoListener("handler_", "com.sun.star.awt.XDialogEventHandler")
    uri = "vnd.sun.star.script:DialogEventHandler.Dialog1?location=document"
    dialog = dialogprovider.createDialogWithHandler(uri, eventhandler)
    dialog.execute()
End sub
 
function handler_callHandlerMethod(dialog, event, method)
    handler_callHandlerMethod = True
    select case method
    case "fermer"
        dialog.endDialog(1)
    case "methode1"
        event.Source.setLabel("ÇA MARCHE !")
    case else
        handler_callHandlerMethod = False
    end select
end function
 
function handler_getSupportedMethodNames
    handler_getSupportedMethodNames = array("methode1", "fermer")
end function

Intérêt de la méthode

Cette solution peut être utile lorsqu’un projet sera utilisé aussi bien depuis un document que depuis l’application, ou lorsqu’il faut fréquemment le déplacer de l’un à l’autre (en phase de développement par exemple). Dans la méthode classique en effet, l’événement est lié à une macro spécifique et, si la bibliothèque doit être déplacée, toutes les affectations doivent être revues.

Chaque mot-clé est indépendant de toute macro. Si, pour une raison quelconque, vous souhaitez renommer une macro appelée par le dialogue, il suffira de faire le changement dans le corps de la fonction callHandlerMethod, sans devoir ici non plus revoir toutes les affectations concernées.

Fichier exemple

File:XDialogEventHandler - fichier exemple.odt

Personal tools