[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.

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

Messagepar Loopingss » 25 Fév 2011 23:06

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é 15579 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 édition par Loopingss le 26 Fév 2011 22:20, édité 3 fois.
Avatar de l’utilisateur
Loopingss
PassiOOnné
PassiOOnné
 
Message(s) : 710
Inscrit le : 17 Déc 2008 02:50

Gestion des barres d'outils

Messagepar Loopingss » 25 Fév 2011 23:09

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   AgrandirRéduire
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 édition par Loopingss le 25 Fév 2011 23:27, édité 2 fois.
Avatar de l’utilisateur
Loopingss
PassiOOnné
PassiOOnné
 
Message(s) : 710
Inscrit le : 17 Déc 2008 02:50

Gestion des barres d'outils

Messagepar Loopingss » 25 Fév 2011 23:10

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   AgrandirRéduire
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 édition par Loopingss le 25 Fév 2011 23:27, édité 2 fois.
Avatar de l’utilisateur
Loopingss
PassiOOnné
PassiOOnné
 
Message(s) : 710
Inscrit le : 17 Déc 2008 02:50

Gestion des barres d'outils

Messagepar Loopingss » 25 Fév 2011 23:13

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   AgrandirRéduire
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 édition par Loopingss le 25 Fév 2011 23:26, édité 2 fois.
Avatar de l’utilisateur
Loopingss
PassiOOnné
PassiOOnné
 
Message(s) : 710
Inscrit le : 17 Déc 2008 02:50

Gestion des barres d'outils

Messagepar Loopingss » 25 Fév 2011 23:14

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   AgrandirRéduire
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 édition par Loopingss le 25 Fév 2011 23:28, édité 1 fois.
Avatar de l’utilisateur
Loopingss
PassiOOnné
PassiOOnné
 
Message(s) : 710
Inscrit le : 17 Déc 2008 02:50

Gestion des barres d'outils

Messagepar Loopingss » 25 Fév 2011 23:17

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   AgrandirRéduire
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 édition par Loopingss le 25 Fév 2011 23:29, édité 1 fois.
Avatar de l’utilisateur
Loopingss
PassiOOnné
PassiOOnné
 
Message(s) : 710
Inscrit le : 17 Déc 2008 02:50

Gestion des barres d'outils

Messagepar Loopingss » 25 Fév 2011 23:20

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   AgrandirRéduire
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   AgrandirRéduire
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 édition par Loopingss le 25 Fév 2011 23:29, édité 1 fois.
Avatar de l’utilisateur
Loopingss
PassiOOnné
PassiOOnné
 
Message(s) : 710
Inscrit le : 17 Déc 2008 02:50

Gestion des barres d'outils

Messagepar Loopingss » 25 Fév 2011 23:22

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é 547 fois
Dernière édition par Loopingss le 24 Juin 2011 08:06, édité 1 fois.
Avatar de l’utilisateur
Loopingss
PassiOOnné
PassiOOnné
 
Message(s) : 710
Inscrit le : 17 Déc 2008 02:50

Re: [Basic] Gestion des barres d'outils

Messagepar Alain de La Chaume » 24 Juin 2011 08:31

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é 14959 fois

Je me suis servi de tes recherches pour arriver à...

Code : Tout sélectionner   AgrandirRéduire
'---------------------------------------------------------------------
' [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)
Avatar de l’utilisateur
Alain de La Chaume
HédOOniste
HédOOniste
 
Message(s) : 1527
Inscrit le : 28 Sep 2008 13:56
Localisation : ʇsǝnoo,ꞁ ɐ ʇuǝɯǝʇǝꞁdɯoↃ


Retour vers Suprême de code

Qui est en ligne ?

Utilisateur(s) parcourant ce forum : Aucun utilisateur inscrit et 2 invité(s)