[Résolu][Python]Intercepter évènement menu

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][Python]Intercepter évènement menu

Messagepar joel275 » 27 Mars 2019 11:55

Bonjour,
tout est dans le titre...si ce n'est que la réponse est sans doute la même qu'avec Basic.
J'ai essayé de connecter un XMenuListener à un objet XMenuBar, mais ce listener ne récupère aucun clic de souris sur un menu.
J'ai également vu les XItemListener et XActionListener qui semblent prometteurs, mais je ne sais pas sur quel objet les brancher.
Toute piste serait la bienvenue, ayant quand même une légère préférence pour XActionListener que j'ai déjà utilisé.
En attendant j'ai associé les menus aux macros par l'intermédiaire de la personnalisation de AOo-LOo, mais on ne sait pas quel menu a déclenché l'évènement ...
D'avance merci à ceux qui voudront bien se penché sur mon problème.

A plus.
Dernière édition par joel275 le 28 Mars 2019 18:12, édité 1 fois.
OpenOffice 4.1.2 LibreOffice 6-2-8-2 Windows 8.1
joel275
PassiOOnné
PassiOOnné
 
Message(s) : 742
Inscrit le : 10 Jan 2009 09:05

Re: [Python]Intercepter évènement menu

Messagepar Hubert Lambert » 27 Mars 2019 16:14

Bonjour Joël,

Comment crées-tu ces éléments de menu : par extension ou par macro "à la volée" ?
Cordialement.
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
SuppOOrter
SuppOOrter
 
Message(s) : 1139
Inscrit le : 06 Avr 2016 08:26

Re: [Python]Intercepter évènement menu

Messagepar joel275 » 27 Mars 2019 16:36

Merci de t'intéresser à mon cas.

J'ai construis 'à la main' le menu (avec ses sous- menus) dans un document Writer que j'ai enregistré comme modèle. Dans les documents créés à partir de ce modèle, j'aimerais savoir quel menu a été cliqué pour regrouper dans une même macro tout un tas d'actions qui se ressemblent.
Je joins à tout hasard, le document en question; le menu qui m'intéresse est celui nommé JDMath (les macros associées ne sont pas dans le document)

A plus.
Pièces jointes
interception menu.odt
(19.66 Kio) Téléchargé 19 fois
OpenOffice 4.1.2 LibreOffice 6-2-8-2 Windows 8.1
joel275
PassiOOnné
PassiOOnné
 
Message(s) : 742
Inscrit le : 10 Jan 2009 09:05

Re: [Python]Intercepter évènement menu

Messagepar Hubert Lambert » 28 Mars 2019 15:27

Ci-joint un exemple. J'ai ajouté l'équivalent en basic, à toute fin utile.
Le code en python :
Code : Tout sélectionner   AgrandirRéduire
import unohelper
from com
.sun.star.awt import XMenuListener

class MenuListener
(unohelper.Base, XMenuListener):
    def __init__(self, ctx, topwindow):
        # nécessaire uniquement pour le msgbox
        self.ctx = ctx
        self
.topwindow = topwindow
    
# XMenuListener
    def itemHighlighted(self, menuevent):
        pass
    def itemSelected
(self, menuevent):
        menuid = menuevent.MenuId
        source 
= menuevent.Source
        label 
= source.getItemText(menuid)
        msgbox(self.ctx, self.topwindow, "L'élément <{}> a été sélectionné.".format(label))
    def itemActivated(self, menuevent):
        pass
    def itemDeactivated
(self, menuevent):
        pass
    def disposing
(self, source):
        pass

def addmenulistener
(event=None):
    ctx = XSCRIPTCONTEXT.getComponentContext()
    doc = XSCRIPTCONTEXT.getDocument()
    frame = doc.CurrentController.Frame
    window 
= frame.ContainerWindow
    menulistener 
= MenuListener(ctx, window)
    layoutmanager = frame.LayoutManager
    menu_url 
= 'private:resource/menubar/menubar'
    menubar = layoutmanager.getElement(menu_url).XMenuBar
    id_jdmath 
= menubar.getItemId(menubar.ItemCount -1)
    popumenu = menubar.getPopupMenu(id_jdmath)
    popumenu.addMenuListener(menulistener)
    menubar.setPopupMenu(id_jdmath, popumenu)
    msgbox(ctx, window, "XMenuListener ajouté à JDMath (Python)")

def msgbox(ctx, topwindow, message):
    smgr = ctx.ServiceManager
    tk 
= smgr.createInstanceWithContext("com.sun.star.awt.Toolkit", ctx)
    box = tk.createMessageBox(topwindow, 0, 1, "Message", message)
    return box.execute() 

Ce code doit être amélioré, il n'enregistre pas le listener pour les sous-menus.
Cordialement.
Pièces jointes
interception menu.odt
(23.82 Kio) Téléchargé 19 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
SuppOOrter
SuppOOrter
 
Message(s) : 1139
Inscrit le : 06 Avr 2016 08:26

Re: [Python]Intercepter évènement menu

Messagepar joel275 » 28 Mars 2019 16:00

Bonjour,
un grand merci pour ta réponse rapide et efficace.
J'essaie de comprendre, d'adapter pour tous les sous-menus et si je n'ai pas d'autres questions, je passe le sujet en résolu, ce qui peut sans doute me prendre plusieurs jours.
A plus.
OpenOffice 4.1.2 LibreOffice 6-2-8-2 Windows 8.1
joel275
PassiOOnné
PassiOOnné
 
Message(s) : 742
Inscrit le : 10 Jan 2009 09:05

Re: [Python]Intercepter évènement menu

Messagepar Hubert Lambert » 28 Mars 2019 16:06

Vite fait pour les sous-menus, et à condition qu'il n'y ait pas de sous-niveaux supplémentaires :wink:

PS. Testé sur LibreOffice uniquement.
Pièces jointes
interception menu.odt
(24.05 Kio) Téléchargé 27 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
SuppOOrter
SuppOOrter
 
Message(s) : 1139
Inscrit le : 06 Avr 2016 08:26

Re: [Python]Intercepter évènement menu

Messagepar joel275 » 28 Mars 2019 18:12

Re,
à grands coups de xRay j'avançais tranquillement vers la solution.....
J'espère ne pas avoir abusé de ton temps. encore merci.
Peut-être faudrait-il mettre ce code dans les suprêmes de code pour le retrouver plus facilement?

A plus.
OpenOffice 4.1.2 LibreOffice 6-2-8-2 Windows 8.1
joel275
PassiOOnné
PassiOOnné
 
Message(s) : 742
Inscrit le : 10 Jan 2009 09:05

Re: [Résolu][Python]Intercepter évènement menu

Messagepar Hubert Lambert » 28 Mars 2019 20:03

Je n'interviens que quand j'ai un peu de temps, donc pas de souci :wink:.
En revanche j'ai vu que le code proposé semblait ne pas fonctionner avec OpenOffice, et là je n'ai plus d'ordinateur sous la main avant le week-end...
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
SuppOOrter
SuppOOrter
 
Message(s) : 1139
Inscrit le : 06 Avr 2016 08:26


Retour vers Macros et API

Qui est en ligne ?

Utilisateur(s) parcourant ce forum : MSN [Bot] et 2 invité(s)