[Basic] Gestion des barres d'outils personnelles (BOP)

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.
Avatar de l’utilisateur
Loopingss
InconditiOOnnel
InconditiOOnnel
Messages : 783
Inscription : 17 déc. 2008 02:50

[Basic] Gestion des barres d'outils personnelles (BOP)

Message par Loopingss »

A la suite de nombreux fils, une mise au point m'est parue nécessaire sur les barres d'outils (BO) et barres d'outils personnelles (BOP). Comment les gérer par macro ?
Ce suprême de code n'aborde pas, la création, la suppression et la modification des barres d'outils personnelles par macro.

Qu'est ce qu'une barre d'outil personnelle ?
Une barre d'outils est un objet du document ou de l'application qui dispose d'un certain nombre de boutons. Ces boutons peuvent être activés par un clic. L'activation d'un bouton déclenche une action. Cette action peut dériver d'un menu, par exemple Fichier-enregistrer, ou exécuter une macro.
Une barre d'outils de l'application (barre standard, barre de formatage etc ...) et les barres d'outils personnelles peuvent être crées/modifiées par le menu Outils - personnaliser. Elles peuvent être enregistrées dans Open Office ou dans le document courant. Dans ce dernier cas elles ne seront accessibles que pour ce document.
Gérer automatiquement ou à la demande des barres d'outils personnalisées peut être utile au cours d'un programme, par exemple à l'ouverture ou à la fermeture d'un document. Il peut être également proposé des BOPs spécifiques pour un type d'utilisateur du document.
Les possibilités d'adaptation sont nombreuses.
De nombreux exemples de macros existent pour afficher ou effacer une barre d'outil. Je n'en ai pas trouvé pour les BOPs. Une difficulté supplémentaire est liée à la création des BOPs par le menu Outils – personnaliser. En effet, OOo attribue un nom interne à la barre d'outil qui est plutôt ésotérique.
Dans le fichier exemple téléchargeable, deux barres d'outils portant respectivement le label « BarreOutil1 » et « BarreOutil2 » ont été crées. Peu importe la macro qu'elle activent. Dans le fichier final il y a 3 BOPs.
LesBOCreees.png
LesBOCreees.png (27.8 Kio) Consulté 19893 fois
Ces deux BOPs sont enregistrés dans le fichier .ods correspondant pour Calc (par exemple, ici : GestionBarreOutil_0-1.ods). Un fichier enregistré au format OpenDocument est un fichier compressé au format zip contenant des fichier .xml. Lorsque l'on ouvre le fichier .ods avec 7zip, par exemple, on voit qu'il contient, entre autres un répertoire Configuration2 qui contient lui même plusieurs sous répertoires dont un appelé Toolbar. C'est dans ce répertoire que sont enregistrés les fichiers .xml décrivant les BOPs du document.
ListeBOdansFichierOds.png
La figure ci dessus vous montre le nom interne des deux premières sur les trois BOPs que j'ai utilisées dans le fichier exemple téléchargeable à la fin de ce tuto.
La connaissance de ce nom est largement suffisant pour créer le code nécessaire aux actions à entreprendre. Par contre, dès qu'il sera nécessaire d'interagir avec l'utilisateur dans le choix des BOPs il ne sera plus question d'utiliser les noms internes.
Les macro suivantes ont été écrites pour Calc.
Dernière modification par Loopingss le 26 févr. 2011 22:20, modifié 3 fois.
Avatar de l’utilisateur
Loopingss
InconditiOOnnel
InconditiOOnnel
Messages : 783
Inscription : 17 déc. 2008 02:50

Gestion des barres d'outils

Message par Loopingss »

Afficher la liste des BO
Cette macro liste l'ensemble des barres d'outils sans distinction. Elle liste toutes les BO visibles. Cette macro utilise le LayoutManager (gestionnaire de mise en page) et sa méthode getElements() qui renvoie un tableau contenant les noms internes de toutes des BO visibles.

Code : Tout sélectionner

REM =============================================================================
Sub Lpg_ListToolbars()
REM =============================================================================
Dim x as Variant, s as String
REM: Acces aux éléments du layout Manager qui renvoit un taleau des noms internes
' de toutes les barres d'outils. Resource.URL est le nom de la barre.
For Each x in ThisComponent.GetCurrentController.GetFrame.LayoutManager.getElements()
   s = s & x.ResourceURL & CHR$(10)
Next
MsgBox (s, 0, "Barres d'outils de ce fichier")
End Sub
Dernière modification par Loopingss le 25 févr. 2011 23:27, modifié 2 fois.
Avatar de l’utilisateur
Loopingss
InconditiOOnnel
InconditiOOnnel
Messages : 783
Inscription : 17 déc. 2008 02:50

Gestion des barres d'outils

Message par Loopingss »

Afficher uniquement les BOPs
Cette macro n'a rien de bien sorcier elle est similaire à la précédente mais effectue un filtre sur la caractéristique commune des BOPs de commencer par le mot « Custom ».

Code : Tout sélectionner

REM =============================================================================
Sub Lpg_ListToolbarsPerso()
REM =============================================================================
Dim x as Variant, s as String, k as Integer
REM : Dans la macro Lpg_ListToolbar() toutes les macros étaient affichées dont
' une portant le nom "0". Dans cette macro, à l'aide d'un filtre on n'affiche
' que les barres personnelles (elles contiennent toutes le mot "Custom").
For Each x in ThisComponent.GetCurrentController.GetFrame.LayoutManager.getElements()
	If InStr(x.ResourceURL,"Custom") Then
		k = k+1
		s = s & x.ResourceURL & CHR$(10)
	End If
Next x
s = "Ce fichier contient " & k & " barres personnelles : " & chr(10) & chr(10) & s
MsgBox (s, 0, "Barres d'outils personnelles de ce fichier")
End Sub
Dernière modification par Loopingss le 25 févr. 2011 23:27, modifié 2 fois.
Avatar de l’utilisateur
Loopingss
InconditiOOnnel
InconditiOOnnel
Messages : 783
Inscription : 17 déc. 2008 02:50

Gestion des barres d'outils

Message par Loopingss »

Afficher une BOP
Ce code affiche une BOP connaissant son nom interne. Il est utile au programmeur qui veut sélectionner une ou des barres d'outils en fonction de critères, comme un profil d'utilisateur, par exemple. Cette macro est facilement adaptable pour que le nom de la BOP ou au moins ce qui suit « Custom_Toolbar_ » lui soit passé en argument et que la fonction puisse être réutilisable.
On accède à la BOP par le LayoutManager et l'on applique la méthode showElement() à l'objet BO fourni en argument.

Code : Tout sélectionner

REM =============================================================================
Sub Lpg_AfficheUneBarreOutils()
REM =============================================================================
REM : Rend visible une barre d'outil déclarée dans la macro par son nom interne (ResourceURL)
' A titre d'exemple on prend la "Custom_toolbar_456e" de ce fichier.
Dim oDoc as Object, oConf as Object
Dim sNomBarre as String

oDoc = ThisComponent
oConf = oDoc.CurrentController.Frame.LayoutManager
sNomBarre = "private:resource/toolbar/custom_toolbar_456e"
oConf.showElement(sNomBarre)
End Sub
Dernière modification par Loopingss le 25 févr. 2011 23:26, modifié 2 fois.
Avatar de l’utilisateur
Loopingss
InconditiOOnnel
InconditiOOnnel
Messages : 783
Inscription : 17 déc. 2008 02:50

Gestion des barres d'outils

Message par Loopingss »

Masquer une BOP
C'est la fonction inverse de la précédente. Elle masque la BO fournie en argument par la méthode hideElement() du LayoutManager.

Code : Tout sélectionner

REM =============================================================================
Sub Lpg_CacheUneBarreOutils()
REM =============================================================================
REM : Masque une barre d'outil déclarée dans la macro par son nom interne (ResourceURL)
' A titre d'exemple on prend la "Custom_toolbar_456e" de ce fichier.
Dim oDoc as Object, oConf as Object
Dim sNomBarre as String

oDoc = ThisComponent
oConf = oDoc.CurrentController.Frame.LayoutManager
sNomBarre = "private:resource/toolbar/custom_toolbar_456e"
oConf.hideElement(sNomBarre)
End Sub
Dernière modification par Loopingss le 25 févr. 2011 23:28, modifié 1 fois.
Avatar de l’utilisateur
Loopingss
InconditiOOnnel
InconditiOOnnel
Messages : 783
Inscription : 17 déc. 2008 02:50

Gestion des barres d'outils

Message par Loopingss »

Afficher une liste interactive de BOPs
Cette macro m'a donné bien des difficultés. Pour accéder au nom affiché dans le bandeau de la barre d'outils (le label) BarreOutil1 BarreOutil2 etc … je n'y suis pas arrivé avec le LayoutManager. J'ai essayé de nombreuses méthodes que j'ai trouvées, sans résultat. Finalement, c'est la reprise d'un code de A Pitonyak utilisé pour créer les barres d'Outils qui m'a permis de trouver une solution efficace.
Ici on n'utilise pas le LayoutManager mais le UIConfigurationManager (gestionnaire de configuration de l'interface utilisateur). La méthode getUIElementsInfo() requiert un argument qui indique quel élément de l'UI est à traiter. (3) indique les TOOLBAR. (4) indique le STATUSBAR, etc …(pour de plus ample information reportez vous au SDK à la page [… /OpenOffice.org 3/Basis/sdk/docs/common/ref/com/sun/star/ui/UIElementType.html#TOOLBAR], (installation sous Win)). L'objet retourné est un tableau à deux dimensions contenant des propriétés que l'on peut lire. Chaque ligne comprend :
- le nom de la valeur (Propriété .Name) : ressourceURL, Label
- La valeur de la propriété (Propriété .Value) : nom interne de la BO, label affiché (nom utilisateur).

Code : Tout sélectionner

REM =============================================================================
Sub Lpg_ListeBarreOutilPersoAvecNom()
REM =============================================================================
REM : Affiche la liste des barres d'outils personnelles avec une autre méthode
' que la macro Lpg_ListeToolbarsPerso(). Elle donne le nom interne de la barre
' d'outil et son titre

REM : Déclarations
Dim oConfigTBP as Object, oTBP as Object
Dim nNbTB as integer, n as Integer
Dim sMsg as String
REM : Accès au tableau des caractéristiques des TB personnelles
oConfigTBP = ThisComponent.getUIConfigurationManager.getUIElementsInfo(3)
REM : Compte le nombre de TB personnelles en récupérant l'index de oConfigTB
nNbTB = UBound(oConfigTBP)+1

REM : Accès à chaque TB personnelle, lecture de leur nom interne et de leur label
sMsg = "Il y a " & nNbTB & " barre(s) d'outil(s) personnelle(s) dans ce document"_
 & chr(10) & chr(10)
n = 0
for each oTBP in oConfigTBP
	sMsg = sMsg & "Barre " & n & " :" & chr(10)
	sMsg = sMsg & "- Nom interne : " & oTBP(0).Value & chr(10)
	sMsg = sMsg & "- Nommée : " & oTBP(1).Value & chr(10) & chr(10)
	n = n+1
Next oTBP
msgbox (sMsg,,"Liste des barres d'Outils personnelles")
End Sub
Dernière modification par Loopingss le 25 févr. 2011 23:29, modifié 1 fois.
Avatar de l’utilisateur
Loopingss
InconditiOOnnel
InconditiOOnnel
Messages : 783
Inscription : 17 déc. 2008 02:50

Gestion des barres d'outils

Message par Loopingss »

Liste interactive et interaction avec l'utilisateur
De la macro précédente j'ai tiré une fonction appelée par une procédure. La fonction retourne le tableau les noms utilisateurs des BOPs (labels) et propose à l'utilisateur de choisir celle qu'il veut afficher/effacer.
Vous pourrez voir que ce code fait la synthèse de toutes les macros précédentes :

Code : Tout sélectionner

Sub MacroAppel()
REM : Déclarations
Dim oDoc as Object, oLayout as Object
Dim tResult() as Variant
Dim i as Integer, nNbTB as Integer, nReponse as integer
Dim sMsg as String, sNomIntTB as String
Dim bTbVisible as Boolean
oDoc = ThisComponent
tResult()= Lpg_ListeBarreOutilPersoAvecNom1(oDoc)
nNbTB = Ubound(tResult(),1)+1
sMsg = "Quelle barre voulez vous Masquer/Afficher (indiquez son n°) ?" & chr(10)
For i=0 to nNbTB-1
	sMsg = sMsg & tResult(i,0) & " : " & tResult(i,2) & " // "
Next i
nReponse = Inputbox (sMsg,"Liste des barres d'Outils personnelles",0)
Select Case nReponse
	Case 0 To nNbTb-1
		sNomIntTB = tResult(nReponse,1)
	Case Else
		Print "La référence saisie est erronée !"
		Call MacroAppel()
End Select
Print "Nom interne : ", sNomIntTB
oLayout = oDoc.getCurrentController.Frame.LayoutManager
'  oLayout = oFrame.LayoutManager
bTbVisible = oLayout.isElementVisible(sNomIntTB)
Print "Visible ?", bTbVisible
If bTbVisible Then
	oLayout.hideElement(sNomIntTB)
	Else
	oLayout.ShowElement(sNomIntTB)	
End if	
End Sub

Code : Tout sélectionner

Function Lpg_ListeBarreOutilPersoAvecNom1(oDoc as Object)
REM : Déclatations
Dim oConfigTBP as Object, oTBP as Object
Dim nNbTB as integer, n as Integer
Dim sMsg as String
'Dim tResult() as Variant
REM : Accès au tableau des caractéristiques des TB personnelles
oConfigTBP = oDoc.getUIConfigurationManager.getUIElementsInfo(3)
REM : Compte le nombre de TB personnelles en récupérant l'index de oConfigTB
nNbTB = UBound(oConfigTBP)+1
Dim tResult(nNbTB-1,3) as Variant

REM : Accès à chaque TB personnelle, lecture de leur nom interne et de leur label
sMsg = "Il y a " & nNbTB & " barre(s) d'outil(s) personnelle(s) dans ce document"_
 & chr(10) & chr(10)
n = 0
for each oTBP in oConfigTBP
	tResult(n,0)=n
	tResult(n,1)=oTBP(0).Value
	tResult(n,2)=oTBP(1).Value
	n = n+1
Next oTBP
Lpg_ListeBarreOutilPersoAvecNom1 = tResult()

End Function
Dernière modification par Loopingss le 25 févr. 2011 23:29, modifié 1 fois.
Avatar de l’utilisateur
Loopingss
InconditiOOnnel
InconditiOOnnel
Messages : 783
Inscription : 17 déc. 2008 02:50

Gestion des barres d'outils

Message par Loopingss »

Et pour finir
J'espère que ceci aurai été utile.
Ci joint le fichier calc avec lequel j'ai travaillé.
Pièces jointes
GestionBarreOutil_0-2.ods
(11.89 Kio) Téléchargé 853 fois
Dernière modification par Loopingss le 24 juin 2011 09:06, modifié 1 fois.
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] Gestion des barres d'outils

Message par Alain de La Chaume »

Bonjour,

et merci Loopingss pour ce suprême :super:
que j'ai utilisé notamment dans le cas suivant :

Après avoir mis la fenêtre du document en plein écran
par la commande ".uno:FullScreen" passée au com.sun.star.frame.DispatchHelper
il m'a fallu cacher la barre d'outils associée
pleinEcran.png
pleinEcran.png (2.86 Kio) Consulté 19273 fois
Je me suis servi de tes recherches pour arriver à...

Code : Tout sélectionner

'---------------------------------------------------------------------
' [Basic]Gestion des barres d'outils, par Loopingss - Février 2011 
' http://user.services.openoffice.org/fr/forum/viewtopic.php?f=15&t=27370&start=0
'---------------------------------------------------------------------
sub cacherFullScreenBarre()
dim oConf as object, sNomBarre as string

	oConf = thisComponent.CurrentController.Frame.LayoutManager
	sNomBarre = "private:resource/toolbar/fullscreenbar"
	oConf.hideElement(sNomBarre)
end sub
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)
Verrouillé