[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 !
joel275
InconditiOOnnel
InconditiOOnnel
Messages : 839
Inscription : 10 janv. 2009 08:05

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

Message par joel275 »

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 modification par joel275 le 28 mars 2019 17:12, modifié 1 fois.
A jour de LibreOffice et de Ubuntu
Avatar de l’utilisateur
Hubert Lambert
SuppOOrter
SuppOOrter
Messages : 1214
Inscription : 06 avr. 2016 07:26

Re: [Python]Intercepter évènement menu

Message par Hubert Lambert »

Bonjour Joël,

Comment crées-tu ces éléments de menu : par extension ou par macro "à la volée" ?
Cordialement.
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)
joel275
InconditiOOnnel
InconditiOOnnel
Messages : 839
Inscription : 10 janv. 2009 08:05

Re: [Python]Intercepter évènement menu

Message par joel275 »

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.
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
A jour de LibreOffice et de Ubuntu
Avatar de l’utilisateur
Hubert Lambert
SuppOOrter
SuppOOrter
Messages : 1214
Inscription : 06 avr. 2016 07:26

Re: [Python]Intercepter évènement menu

Message par Hubert Lambert »

Ci-joint un exemple. J'ai ajouté l'équivalent en basic, à toute fin utile.
Le code en python :

Code : Tout sélectionner

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.
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
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)
joel275
InconditiOOnnel
InconditiOOnnel
Messages : 839
Inscription : 10 janv. 2009 08:05

Re: [Python]Intercepter évènement menu

Message par joel275 »

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.
A jour de LibreOffice et de Ubuntu
Avatar de l’utilisateur
Hubert Lambert
SuppOOrter
SuppOOrter
Messages : 1214
Inscription : 06 avr. 2016 07:26

Re: [Python]Intercepter évènement menu

Message par Hubert Lambert »

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.
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
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)
joel275
InconditiOOnnel
InconditiOOnnel
Messages : 839
Inscription : 10 janv. 2009 08:05

Re: [Python]Intercepter évènement menu

Message par joel275 »

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.
A jour de LibreOffice et de Ubuntu
Avatar de l’utilisateur
Hubert Lambert
SuppOOrter
SuppOOrter
Messages : 1214
Inscription : 06 avr. 2016 07:26

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

Message par Hubert Lambert »

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.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)