[Basic] Barre de menus : ajout, suppression

Vos meilleures macros et portions de code sont publiées dans cette section.
Aucun support sur une question de programmation ici !

Modérateur : Vilains modOOs

Règles du forum
Aucune question dans cette section !
Celle-ci rassemble les meilleures macros et portions de code. Vous pouvez en revanche commenter ou argumenter le code exposé. Vous pouvez même remercier l'auteur (cela fait toujours plaisir) en indiquant par exemple dans quel cadre ou contexte vous en avez eu l'utilité.
Si vous avez à poster quelque chose, faites-le depuis la section Macros et API et demandez à un modérateur de l'y déplacer.
Répondre
Avatar de l’utilisateur
Alain de La Chaume
HédOOniste
HédOOniste
Messages : 1527
Inscription : 28 sept. 2008 14:56
Localisation : ʇsǝnoo,ꞁ ɐ ʇuǝɯǝʇǝꞁdɯoↃ

[Basic] Barre de menus : ajout, suppression

Message 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.
Pièces jointes
menu_Creer_V4.odt
(19.88 Kio) Téléchargé 2006 fois
(API-culteur et pêcheur de macros en mode loisirs occasionnels, mais toujours les pieds dans l'OO)
AOO 4.1.2 sous Linux Xubuntu Voyager 14.04 (x86_64)
jjk
HédOOniste
HédOOniste
Messages : 1696
Inscription : 27 oct. 2008 15:30

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

Message par jjk »

Et comment que ça va nous intéresser !!
Merci en tout cas.
OpenOffice 3.1.1 sous XP-SP2 et LibreOffice 3.5.0 sous Win 7
Avatar de l’utilisateur
A_math
Membre OOrganisé
Membre OOrganisé
Messages : 82
Inscription : 13 janv. 2008 00:38

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

Message par A_math »

Merci,

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

3.0.1 portable sous XP SP3 (boulot) et 3.0.0 sous Mandriva 2009.0
ThierryF
Membre lOOyal
Membre lOOyal
Messages : 27
Inscription : 09 juin 2011 14:36

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

Message 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.
Thierry
Dom : OOo 3.3 & LibO 3.4.1 sous Win 7
Bur : OOo 3.3 sous Win XP
Avatar de l’utilisateur
Alain de La Chaume
HédOOniste
HédOOniste
Messages : 1527
Inscription : 28 sept. 2008 14:56
Localisation : ʇsǝnoo,ꞁ ɐ ʇuǝɯǝʇǝꞁdɯoↃ

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

Message 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
(API-culteur et pêcheur de macros en mode loisirs occasionnels, mais toujours les pieds dans l'OO)
AOO 4.1.2 sous Linux Xubuntu Voyager 14.04 (x86_64)
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 25143
Inscription : 03 mars 2006 08:45
Localisation : 127.0.0.1
Contact :

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

Message par Dude »

Autre méthode pour la création d'un menu à plusieurs niveaux :
Image
MenuDynamique.odt
(13.4 Kio) Téléchargé 1228 fois
Avatar de l’utilisateur
ThierryT
Membre enthOOusiaste
Membre enthOOusiaste
Messages : 467
Inscription : 10 nov. 2012 18:05

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

Message 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
LibreOffice 6.1.3.2 x64 / AOO 4.1.5 (x86) sous Windows 8.1 (x64)
Java 8.x (x64 et x86), Firefox, Thunderbird,....

“Celui qui aime à apprendre est bien près du savoir.” (Confusius)
Comment baliser Résolu
Avatar de l’utilisateur
ThierryT
Membre enthOOusiaste
Membre enthOOusiaste
Messages : 467
Inscription : 10 nov. 2012 18:05

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

Message 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)
LibreOffice 6.1.3.2 x64 / AOO 4.1.5 (x86) sous Windows 8.1 (x64)
Java 8.x (x64 et x86), Firefox, Thunderbird,....

“Celui qui aime à apprendre est bien près du savoir.” (Confusius)
Comment baliser Résolu
Avatar de l’utilisateur
Alain de La Chaume
HédOOniste
HédOOniste
Messages : 1527
Inscription : 28 sept. 2008 14:56
Localisation : ʇsǝnoo,ꞁ ɐ ʇuǝɯǝʇǝꞁdɯoↃ

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

Message 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.
(API-culteur et pêcheur de macros en mode loisirs occasionnels, mais toujours les pieds dans l'OO)
AOO 4.1.2 sous Linux Xubuntu Voyager 14.04 (x86_64)
Avatar de l’utilisateur
ThierryT
Membre enthOOusiaste
Membre enthOOusiaste
Messages : 467
Inscription : 10 nov. 2012 18:05

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

Message 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.
LibreOffice 6.1.3.2 x64 / AOO 4.1.5 (x86) sous Windows 8.1 (x64)
Java 8.x (x64 et x86), Firefox, Thunderbird,....

“Celui qui aime à apprendre est bien près du savoir.” (Confusius)
Comment baliser Résolu
Avatar de l’utilisateur
Hubert Lambert
SuppOOrter
SuppOOrter
Messages : 1214
Inscription : 06 avr. 2016 09:26

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

Message 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
Pièces jointes
creemenu.odt
(13.25 Kio) Téléchargé 450 fois
AOOo 4.1.7 sur Win10
AOOo 4.1.x sur Linux Mint
LibreOffice 5.x/6.x sur Linux Mint
--
| « Nos défauts devraient nous donner une qualité : l'indulgence pour les défauts des autres » (Rivarol)
Répondre