Difference between revisions of "FR/Documentation/Python/Creating Dialog with Handler"
m |
|||
(6 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
+ | {{DISPLAYTITLE:Créer un dialogue avec gestionnaire d'événements (''handler'')}} | ||
+ | |||
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 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. | + | 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 | + | Malgré sa facilité d'utilisation, la méthode semble très peu documentée (voir notamment [[Documentation/DevGuide/WritingUNO/Using_Dialogs_in_Components#Accept_events_created_by_dialog_controls|Accept events created by dialog controls]]). En voici les principes. |
== Affectation des méthodes == | == 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'' : [[File:Affecting_dialog_event_handler_method.png|thumb]] | + | 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'' : [[File:Affecting_dialog_event_handler_method.png|thumb|none|500px|Affecter une méthode à un contrôle.]] |
== Création du dialogue == | == Création du dialogue == | ||
Line 43: | Line 45: | ||
===== Exemple en Basic ===== | ===== Exemple en Basic ===== | ||
− | Il est possible également d’utiliser cette méthode en basic | + | Il est possible également d’utiliser cette méthode en basic au moyen de la méthode ''CreateUnoListener'' pour construire l’interface : |
<source lang="oobas"> | <source lang="oobas"> | ||
sub main | sub main | ||
Line 75: | Line 77: | ||
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. | 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. | + | 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 == | == Fichier exemple == | ||
+ | [[File:XDialogEventHandler_-_fichier_exemple.odt]] | ||
+ | |||
+ | [[Category:Python]] |
Latest revision as of 10:04, 1 May 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 Accept events created by dialog controls). 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 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.