Bonjour,
Indirectement inspiré de ce
fil, je vous propose ci-dessous une autre manière d'ajouter dynamiquement un élément à la barre de menu.
Le code illustre comment :
- créer l'élément de menu, avec éventuellement une indication des raccourcis clavier;
- ajouter un listener pour être informé d'une action sur le menu;
- intercepter les raccourcis clavier.
Le menu est ajouté au document en cours et n'est pas mémorisé à la fermeture.
Cordialement.
Code : Tout sélectionner
sub main(event)
styles = com.sun.star.awt.MenuItemStyle
check = styles.CHECKABLE + styles.AUTOCHECK
radio = styles.RADIOCHECK + styles.AUTOCHECK
normal = 0
items = array("Un ~menu", array(_
array("item", "Item ~normal", normal, "clic1", array(4, 525)),_
array("item", "Item à cocher", check, "coche1"),_
array("menu", "Sous-menu un", array(_
array("item", "Item bouton radio 1", radio, "radio1"),_
array("item", "Item bouton radio 2", radio, "radio2"))),_
array("sep"),_
array("item", "I~tem normal", normal, "clic2", array(4, 531)),_
array("menu", "Sous-menu deux", array(_
array("item", "Item", normal, "clic3"),_
array("item", "Autre item", normal, "clic4"),_
array("sep"),_
array("menu", "Sous-sous-menu", array(_
array("item", "Item", normal, "clic5"),_
array("item", "Dernier item", normal, "clic6")))))
doc = thiscomponent
menuid = 999
res = creemenu(doc, items, meunid)
if res then
creeraccourcis(doc)
event.Source.setEnable(False)
event.Source.setVisible(False)
end if
end sub
function creemenu(doc, items, menuid)
titremenu = items(0)
maquetteur = doc.CurrentController.Frame.LayoutManager
barremenu = maquetteur.getElement("private:resource/menubar/menubar").XMenuBar
if barremenu.getItemPos(menuid) > -1 then
'msgbox "Le menu existe déjà !"
creemenu = 0
exit function
end if
barremenu.insertItem(menuid, titremenu, 0, barremenu.ItemCount)
menulistener = createUnoListener("xmenu_", "com.sun.star.awt.XMenuListener")
menupopup = creemenupopup(items(1), menuid+1, menulistener)
barremenu.setPopupMenu(menuid, menupopup)
creemenu = 1
end function
function creemenupopup(elements, byval id, listener)
popup = createUnoService("com.sun.star.awt.PopupMenu")
popup.addMenuListener(listener)
'popup = createUnoService("stardiv.Toolkit.VCLXPopupMenu")
for each element in elements
select case element(0)
case "item"
popup.insertItem(id, element(1), element(2), popup.ItemCount)
if ubound(element) > 2 then
popup.setCommand(id, element(3))
end if
if ubound(element) > 3 then
popup.setAcceleratorKeyEvent(id, cree_keyevent(element(4)))
end if
id = id+1
case "menu"
popup.insertItem(id, element(1), 0, popup.ItemCount)
souspopup = creemenupopup(element(2), id, listener)
popup.setPopupMenu(id, souspopup)
id = id+1
case "sep"
popup.insertSeparator(popup.ItemCount)
end select
next
creemenupopup = popup
end function
function cree_keyevent(keyinfos)
dim cle as new com.sun.star.awt.KeyEvent
cle.Modifiers = keyinfos(0)
cle.KeyCode = keyinfos(1)
cree_keyevent = cle
end function
sub creeraccourcis(doc)
keyhandler = createUnoListener("xkey_", "com.sun.star.awt.XKeyHandler")
doc.CurrentController.addKeyHandler(keyhandler)
end sub
REM XMenuListener
sub xmenu_itemSelected(menuevent)
menuid = menuevent.MenuId
source = menuevent.Source
etiquette = source.getItemText(menuid)
commande = source.getCommand(menuid)
if instr(commande, "coche") = 1 then
if source.isItemChecked(menuid) then
msgbox "L'élément <" & etiquette & "> a été coché."
else
msgbox "L'élément <" & etiquette & "> a été décoché."
end if
elseif instr(commande, "radio") = 1 then
msgbox "L'élément <" & etiquette & "> a été sélectionné."
else
msgbox "L'élément <" & etiquette & "> a été sélectionné." & string(2, chr(10)) & "Commande : """ & commande & """"
end if
end sub
sub xmenu_itemHighlighted(menuevent)
end sub
sub xmenu_itemActivated(menuevent)
end sub
sub xmenu_itemDeactivated(menuevent)
end sub
sub xmenu_disposing(source)
end sub
REM XKeyHandler
sub xkey_disposing(source)
end sub
function xkey_keyPressed(keyevent)
xkey_keyPressed = False
if keyevent.Modifiers = 4 then
select case keyevent.KeyCode
case 525, 531 'Alt+N, Alt+T
msgbox "Vous avez activé le raccourci <Alt+" & ucase(keyevent.KeyChar) & ">"
xkey_keyPressed = True
end select
end if
end function
function xkey_keyReleased(keyevent)
xkey_keyReleased = False
end function