[Résolu][Python] Gestion d'événements de dialogue avec Basic

Discussions et questions sur tout ce qui concerne la programmation tous langages et tous modules confondus.

Modérateur : Vilains modOOs

Règles du forum
:alerte: Balisage obligatoire dans cette section !
Aidez-nous à vous aider au mieux en balisant correctement votre question : reportez-vous sur les règles de cette section avant de poster !
Avatar de l’utilisateur
Hubert Lambert
SuppOOrter
SuppOOrter
Messages : 1214
Inscription : 06 avr. 2016 07:26

[Résolu][Python] Gestion d'événements de dialogue avec Basic

Message par Hubert Lambert »

Bonjour,

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). Je vous propose donc d'en exposer les principes ci-dessous.

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 :
XDialogEventHandler - affectation.png
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.

Exemple en python

Code : Tout sélectionner

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 :

Code : Tout sélectionner

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.
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Dernière modification par Hubert Lambert le 30 avr. 2018 19:33, modifié 1 fois.
AOOo 4.1.7 sur Win10
AOOo 4.1.x sur Linux Mint
LibreOffice 5.x/6.x sur Linux Mint
--
| « Nos défauts devraient nous donner une qualité : l'indulgence pour les défauts des autres » (Rivarol)
Avatar de l’utilisateur
Bidouille
RespOOnsable forum
RespOOnsable forum
Messages : 12221
Inscription : 08 nov. 2005 16:23
Localisation : Caen, France

Re: [Basic][Python] Gestionnaire d'événements de dialogue

Message par Bidouille »

Afin que ce fil ne se perde pas, il serait intéressant de le publier directement sur le Wiki :
https://wiki.openoffice.org/wiki/FR/Doc ... Components

Merci
Avatar de l’utilisateur
Hubert Lambert
SuppOOrter
SuppOOrter
Messages : 1214
Inscription : 06 avr. 2016 07:26

Re: [Basic][Python] Gestionnaire d'événements de dialogue

Message par Hubert Lambert »

Je veux bien publier le texte sur le wiki, mais pas comme traduction du passage du Developper's Guide donné à titre d'information, et avec lequel il n'a rien à voir.
Je vais regarder si je trouve une section ad hoc...
 Ajout : Voici : https://wiki.openoffice.org/wiki/FR/Doc ... th_Handler 
AOOo 4.1.7 sur Win10
AOOo 4.1.x sur Linux Mint
LibreOffice 5.x/6.x sur Linux Mint
--
| « Nos défauts devraient nous donner une qualité : l'indulgence pour les défauts des autres » (Rivarol)