Difference between revisions of "FR/Documentation/Python/Creating Dialog with Handler"
m |
|||
Line 81: | Line 81: | ||
== Fichier exemple == | == Fichier exemple == | ||
[[File:XDialogEventHandler_-_fichier_exemple.odt]] | [[File:XDialogEventHandler_-_fichier_exemple.odt]] | ||
+ | |||
+ | [[Category:Python]] |
Revision as of 20:39, 30 April 2018
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 ici). En voici les principes.
Contents
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 :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 en utilisant 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.