Page 1 sur 1

[Basic] Barre de menus : ajout, suppression

Publié : 08 juin 2009 16:23
par Alain de La Chaume
Bonjour à tous.
Comme j'ai un peu galéré pour trouver comment ajouter/supprimer un menu de la barre du même nom, je mets à dispo ce que j'ai enfin pu faire, me disant que ça pourrait peut-être intéresser quelqu'un.

Re: [Basic] Barre de menus : ajout, suppression

Publié : 08 juin 2009 21:00
par jjk
Et comment que ça va nous intéresser !!
Merci en tout cas.

Re: [Basic] Barre de menus : ajout, suppression

Publié : 09 juin 2009 11:19
par A_math
Merci,

Je ne sais pas quand ni pourquoi faire exactement mais je me doute que cela me servira un jour. :super:

Re: [Basic] Barre de menus : ajout, suppression

Publié : 22 juin 2011 12:24
par ThierryF
Bonjour,

J'ai lancé ton fichier --> menu_Creer_V4.odt
et mes menus on disparus.

Il semblerait donc que la barre initiale soit affectée.
Après une vérif supplémentaire, il faut que toutes les fenêtres OOo soit fermées.
Dans mon cas, j'avais laissé Calc ouvert et en rouvrant Writer la barre de menu n'était pas réinitialisée.

Tout cela pour te remercier pour ce code.
:super: grand merci Alain
et de plus tu habites dans un lieu que j'affectionne énormément.

Re: [Basic] Barre de menus : ajout, suppression

Publié : 22 juin 2011 20:50
par Alain de La Chaume
Bonjour.. soir,

Ouf ! J'ai cru qu'il s'agissait d'une réclamation... :P
Merci donc à vous aussi (coucou Léa) d'encourager les petits participants libres
à un projet libre... ... et gratuit en plus. :wink:

Bien cordialement, Alain

Re: [Basic] Barre de menus : ajout, suppression

Publié : 13 sept. 2011 19:07
par Dude
Autre méthode pour la création d'un menu à plusieurs niveaux :
Image
MenuDynamique.odt

Re: [Basic] Barre de menus : ajout, suppression

Publié : 28 déc. 2015 17:48
par ThierryT
Bonsoir,

Pour répondre au besoin de remettre tous les menus dans les fichiers ouverts, je vous joins le code suivant où il faut appeler la fonction DocumentsOuverts qui scrute l'ensemble des documents ouverts dans l'application LO ou AOO:

Code : Tout sélectionner

'---------------------------------------------------------------------
sub menusRestaurer(nomModule as string)
    dim sMenuBar as string
    dim oConfMgr, oConfModule, oDefSet

	sMenuBar = "private:resource/menubar/menubar"
       
	oConfMgr = createUnoService(_
             "com.sun.star.ui.ModuleUIConfigurationManagerSupplier")
	oConfModule = oConfMgr.getUIConfigurationManager(nomModule)
	oDefSet = oConfModule.getDefaultSettings(sMenuBar)
	oConfModule.replaceSettings(sMenuBar, oDefSet)
	end sub
'---------------------------------------------------------------------

Sub DocumentsOuverts()
	'pensez à sauvegarder vos documents
	dim lesDocs, laCollection, leDoc

	on error resume next
	lesDocs = StarDesktop.Components
	laCollection = lesDocs.createEnumeration
	while laCollection.hasMoreElements
		leDoc = laCollection.nextElement
		' Reconnaître les types de documents ouverts
		' -> restaurer les menus dans les applications de LO ou AOO
		menusRestaurer (leDoc.Identifier)
	wend
End Sub

Re: [Basic] Barre de menus : ajout, suppression

Publié : 18 avr. 2016 17:10
par ThierryT
La version que propose Alain de Chaume (Menu_Créer_V4) crée bien les menus souhaités MAIS pour l'ensemble des fichiers ouverts dans LO pour le module concerné (ici Writer).

:alerte: Une fois le fichier Menu_Créer_V4 fermé, les menus créées dans les autres fichiers ouverts RESTENT affichées et leurs utilisations génèrent une erreur d'exception. Normal, les fichiers ouverts ne possèdent pas les macros appelées par les menus car elles sont seulement dans le fichier Menu_Créer_V4. :alerte:

Pour affecter seulement l'ajout au fichier en cours, il suffit de remplacer dans la routine acMenuCreer, le code

Code : Tout sélectionner

	oFrame.layoutManager.getElement(_
			"private:resource/menubar/menubar").setSettings(oSettings)
par

Code : Tout sélectionner

	' Création et implantation réel dans la barre de menu du fichier SEUL!!!
	oModelUIManager = oFrame.getController().getModel().getUIConfigurationManager()
	oModelUIManager.insertSettings("private:resource/menubar/menubar", oSettings)

Re: [Basic] Barre de menus : ajout, suppression

Publié : 20 avr. 2016 08:20
par Alain de La Chaume
Bonjour à tous...

... et merci à ThierryT pour son ajout afin que seul le fichier en cours soit impacté.
Pour ce qui est de son :alerte: commentaire en alerte rouge :alerte: :D
je tiens tout de même à préciser que les macros fournies le sont le plus souvent
dans des fichiers, par commodité, et que c'est aux éventuels utilisateurs de les placer
là où il convient de le faire. Dans ce cas : Mes macros et boîtes de dialogue ...
Voir la note de Papayes à ce propos : Importer une macro d'un fichier exemple ; lanceurs

Bien coOordialement, Alain.

Re: [Basic] Barre de menus : ajout, suppression

Publié : 21 juin 2016 16:01
par ThierryT
Bonjour,

Une suite sur les ajouts de menu et plus précisément maintenant la gestion de ceux-ci : menu disponible (non grisé) ou non disponible (grisé).

ATTENTION : cette gestion ne fonctionne que sous LibreOffice pas sous OpenOffice car la gestion des menus sous cette dernière est différente.

Fonctionnement :
Dans le fichier joint, nous avons un menu "Test" ajouté juste avant le menu "Aide".
Ce menu contient un "sous-Menu" de 4 "Items" dont le troisième contient aussi un "sous-Menu" de trois "Items". C'est ce troisième "Item" du sous-Menu (Test33) que nous souhaitons gérer ici.
L'appui sur le bouton "Activer l'intercepteur" permet de visualiser l'ensemble des événements de Menus appelées via le DispatchHelper.
Faire afficher le sous-Menus de l'Item "test3" et voyer la modification de l'Item Test33.
Si vous désactiver l'intercepteur, l'Item "Test33" gardera l'état précédent.

Re: [Basic] Barre de menus : ajout, suppression

Publié : 07 avr. 2019 17:21
par Hubert Lambert
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