Page 1 sur 1

[Basic] Barre de menus : ajout, suppression

MessagePublié: 08 Juin 2009 17: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

MessagePublié: 08 Juin 2009 22:00
par jjk
Et comment que ça va nous intéresser !!
Merci en tout cas.

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

MessagePublié: 09 Juin 2009 12: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

MessagePublié: 22 Juin 2011 13: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

MessagePublié: 22 Juin 2011 21: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

MessagePublié: 13 Sep 2011 20:07
par Dude
Autre méthode pour la création d'un menu à plusieurs niveaux :
Image
MenuDynamique.odt
(13.4 Kio) Téléchargé 759 fois

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

MessagePublié: 28 Déc 2015 18: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   AgrandirRéduire
'---------------------------------------------------------------------
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

MessagePublié: 18 Avr 2016 18: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   AgrandirRéduire
   oFrame.layoutManager.getElement(_
         "private:resource/menubar/menubar").setSettings(oSettings)


par
Code : Tout sélectionner   AgrandirRéduire
   ' 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

MessagePublié: 20 Avr 2016 09: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

MessagePublié: 21 Juin 2016 17: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

MessagePublié: 07 Avr 2019 18: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   AgrandirRéduire
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