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