Macros

From The Document Foundation Wiki
< Macros‎ | Writer
Jump to: navigation, search

Comment gérer les bordures d'un tableau ?

On souhaite gérer par programme la définition des bordures d'un tableau ou d'une cellule.

Les bordures sont accessibles via la propriété TableBorder[1].

Les éléments de cette structure sont de deux types :

  • Des bordures (haut, bas, gauche, droite, horizontale, verticale) ; les bordures sont des structures BorderLine2[2] qui "ajoutent" les éléments de style[3] à la structure BorderLine[4].
  • Des booléens (IsLeftLineValid, IsRightLineValid, IsTopLineValid, etc.). En écriture, les définir à True pour modifier la ligne correspondante et à False pour l'ignorer, autrement dit pour garder sa valeur actuelle.


La définition de l'espacement avec le contenu se fait via la propriété TableBorderDistances[5] de la table. Là encore il s'agit d'une structure bâtie selon le même principe : BottomDistance, LeftDistance, etc. et des booléens pour gérer la modification ou non.

La procédure suivante s'applique au tableau courant :

  • On commence par tester que le curseur figure bien dans un tableau.
  • L'objectif est de remplacer les bordures actuelles (les paramètres Is... sont définis à True) pour obtenir un encadrement extérieur et des lignes horizontales doubles. En revanche on ne veut pas de lignes verticales. Il faut en conséquence .IsVerticalLineValid = true et VerticalLine = LibONoLine, une structure définie pour appliquer une ligne "vide". On ne peut simplement utiliser .IsVerticalLineValid = false car le tableau courant peut avoir des lignes verticales définies et on désire les supprimer. Avec le paramètre false les lignes existantes seraient laissées dans leur état actuel.
  • L'espacement avec le contenu désiré est 0,30cm.
  • Le paramètre Fusionner les styles de ligne adjacents se définit par la propriété CollapsingBorders de la table.
sub LibOEncadrerTableCourante

dim LibOCursor as object, LibOTable as object, LibOTableBorder as object
dim LibOLine as new com.sun.star.table.BorderLine2
dim LibONoLine as new com.sun.star.table.BorderLine2
dim LibOBorderDistances as new com.sun.star.table.TableBorderDistances
LibOCursor = thisComponent.currentController.viewCursor

if (isEmpty(LibOCursor.textTable)) then
        msgbox "Le curseur n'est pas dans un tableau", 64, "Mise en forme du tableau"
else
        with LibOLine
                .Color = 0
                .InnerLineWidth = 10
                .LineDistance = 60 
                .LineStyle = com.sun.star.table.BorderLineStyle.DOUBLE 
                .LineWidth = 5
                .OuterLineWidth = 10
        end with
        with LibONoLine
                .Color = 0
                .InnerLineWidth = 0
                .LineDistance = 0
                .LineStyle = 0
                .LineWidth = 0
                .OuterLineWidth = 0
        end with
        with LibOBorderDistances
                .BottomDistance = 300
                .IsBottomDistanceValid = True   
                .IsLeftDistanceValid = True   
                .IsRightDistanceValid = True   
                .IsTopDistanceValid = True   
                .LeftDistance = 300   
                .RightDistance = 300
                .TopDistance = 300
        end with
        
        LibOTable = LibOCursor.TextTable
        LibOTableBorder = LibOTable.TableBorder
        
        LibOTableBorder.IsLeftLineValid = true
        LibOTableBorder.IsRightLineValid = true
        LibOTableBorder.IsTopLineValid = true
        LibOTableBorder.IsBottomLineValid = true
        LibOTableBorder.IsHorizontalLineValid = true
        LibOTableBorder.IsVerticalLineValid = true
        LibOTableBorder.LeftLine = LibOLine
        LibOTableBorder.RightLine = LibOLine
        LibOTableBorder.TopLine = LibOLine
        LibOTableBorder.BottomLine = LibOLine 
        LibOTableBorder.HorizontalLine = LibOLine 
        LibOTableBorder.VerticalLine = LibONoLine 
        
        with LibOTable
                .TableBorder = LibOTableBorder 
                .HoriOrient = com.sun.star.text.HoriOrientation.FULL 
                .CollapsingBorders = true
                .TableBorderDistances = LibOBorderDistances
        end with  

end if

end sub

La procédure suivante illustre comment encadrer une cellule spécifique dans un tableau : traits doubles, espacement 0,10cm.

sub LibOEncadrerCell

dim LibOTable as object
dim LibOCell as object
dim LibOLine as new com.sun.star.table.BorderLine2

with LibOLine
        .Color = 0
        .InnerLineWidth = 10
        .LineDistance = 60 
        .LineStyle = com.sun.star.table.BorderLineStyle.DOUBLE
        .LineWidth = 2
        .OuterLineWidth = 10
end with

LibOTable = thiscomponent.TextTables.getByName("Tableau1")

LibOCell = LibOTable.getCellByName("B2")

with LibOCell
        .LeftBorder = LibOLine
        .LeftBorderDistance = 100
        .RightBorder = LibOLine
        .RightBorderDistance = 100
        .TopBorder = LibOLine
        .TopBorderDistance = 100
        .BottomBorder = LibOLine 
        .BottomBorderDistance = 100
end with

Notes :