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

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 !

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

Messagepar Hubert Lambert » 30 Avr 2018 10:03

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   AgrandirRéduire
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   AgrandirRéduire
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.
Pièces jointes
DialogEventProvider.odt
Exemples en python et en basic
(22.27 Kio) Téléchargé 14 fois
Dernière édition par Hubert Lambert le 30 Avr 2018 20:33, édité 1 fois.
AOOo 4.1.2 sur Win7
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
Hubert Lambert
InconditiOOnnel
InconditiOOnnel
 
Message(s) : 865
Inscrit le : 06 Avr 2016 08:26

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

Messagepar Bidouille » 30 Avr 2018 15:54

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
Bidouille
RespOOnsable forum
RespOOnsable forum
 
Message(s) : 9657
Inscrit le : 08 Nov 2005 17:23
Localisation : Brest, France

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

Messagepar Hubert Lambert » 30 Avr 2018 19:28

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.2 sur Win7
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
Hubert Lambert
InconditiOOnnel
InconditiOOnnel
 
Message(s) : 865
Inscrit le : 06 Avr 2016 08:26


Retour vers Macros et API

Qui est en ligne ?

Utilisateur(s) parcourant ce forum : Aucun utilisateur inscrit et 3 invité(s)