Page 1 sur 1

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

Publié : 27 mars 2019 10:55
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.

Re: [Python]Intercepter évènement menu

Publié : 27 mars 2019 15:14
par Hubert Lambert
Bonjour Joël,

Comment crées-tu ces éléments de menu : par extension ou par macro "à la volée" ?
Cordialement.

Re: [Python]Intercepter évènement menu

Publié : 27 mars 2019 15:36
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.

Re: [Python]Intercepter évènement menu

Publié : 28 mars 2019 14:27
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.

Re: [Python]Intercepter évènement menu

Publié : 28 mars 2019 15:00
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.

Re: [Python]Intercepter évènement menu

Publié : 28 mars 2019 15:06
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.

Re: [Python]Intercepter évènement menu

Publié : 28 mars 2019 17:12
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.

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

Publié : 28 mars 2019 19:03
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...