包含在查找更多文档专项支持资源 | 以 PDF 格式下载本书 (1328 KB)
Chapitre 6 Documents texteOutre les chaînes pures, les documents texte peuvent également contenir des informations de formatage. Ces informations peuvent apparaître à un emplacement quelconque du texte. La structure est rendue encore plus complexe par les tableaux. En effet, ces derniers comportent non seulement des chaînes unidimensionnelles, mais également des champs à deux dimensions. La plupart des programmes de traitement de texte offrent maintenant la possibilité d'insérer des objets de dessin, des cadres texte et d'autres objets à l'intérieur d'un texte. Ceux-ci peuvent se trouver en dehors des enchaînements et se situer à un emplacement quelconque sur la page. Ce chapitre présente les interfaces et services centraux des documents texte. La première section, qui traite de la structure des documents texte, décrit la manière dont un programme StarOffice Basic peut être utilisé pour procéder à des itérations dans un document StarOffice Basic. Elle est axée sur les paragraphes, les portions de paragraphe et leur formatage. La deuxième section traite de la manière de travailler efficacement avec des documents texte. Pour cela, StarOffice fournit plusieurs objets d'aide, tels que l'objet TextCursor, dont le champ d'application dépasse ceux spécifiés dans la première section. La troisième section va au-delà du travail sur le texte. Elle traite, entre autres, des tableaux, des cadres texte, des champs et repères de texte et des répertoires de contenu. La création, l'ouverture, l'enregistrement et l'impression des documents sont décrits au Chapitre 5, Utilisation de documents StarOffice, car ils s'appliquent à tout type de document et pas seulement aux documents texte. Structure des documents texteUn document texte peut contenir quatre types d'informations :
Cette section se concentre particulièrement sur le texte et les options de formatage associées. Remarque – La conception de l'API de 8 StarOffice pour Writer diffère de celle de la version précédente. L'ancienne version de l'API était axée sur l'utilisation de l'objet Selection, orientée principalement en fonction de l'interface dédiée à l'utilisateur final, elle-même axée sur la mise en évidence à l'aide de la souris. L'API de StarOffice 8 a remplacé ces connexions entre interface utilisateur et interface programmeur. Le programmeur peut ainsi accéder parallèlement à toutes les parties d'une application et travailler avec des objets simultanément à partir de différentes subdivisions d'un document. L'objet Selection n'est plus disponible. Paragraphes et portions de paragrapheLa partie essentielle d'un document texte est constituée d'une suite de paragraphes. Ceux-ci n'étant ni nommés ni indexés, il est impossible d'accéder directement à l'un d'eux. Ils peuvent néanmoins être parcourus de manière séquentielle à l'aide de l'objet Enumeration décrit au Chapitre 4, Introduction à l'API StarOffice. C'est ainsi que les paragraphes peuvent être édités. Lorsque vous utilisez l'objet Enumeration, il faut néanmoins prendre en compte une particularité : il ne renvoie pas uniquement les paragraphes, mais également les tableaux (à strictement parler, dans StarOffice Writer, un tableau est un type de paragraphe particulier). C'est pourquoi, avant d'accéder à un objet renvoyé, vous devez vérifier qu'il prend en charge le service com.sun.star.text.Paragraph (s'il s'agit d'un paragraphe) ou le service com.sun.star.text.TextTable (s'il s'agit d'un tableau). L'exemple qui suit parcourt le contenu d'un document texte dans une boucle et utilise un message dans chaque cas pour indiquer à l'utilisateur si l'objet en question est un paragraphe ou un tableau. Dim Doc As Object
Dim Enum As Object
Dim TextElement As Object
' Crée un objet
Doc = StarDesktop.CurrentComponent
' Crée un objet Enumeration
Enum = Doc.Text.createEnumeration
' boucle parcourant tous les éléments du texte
While Enum.hasMoreElements
TextElement = Enum.nextElement
If TextElement.supportsService("com.sun.star.text.TextTable") Then
MsgBox "The current block contains a table."
End If
If TextElement.supportsService("com.sun.star.text.Paragraph") Then
MsgBox "The current block contains a paragraph."
End If
Wend
Cet exemple crée un objet Doc qui référence le document StarOffice actif. L'objet Doc est ensuite utilisé pour créer un objet Enumeration qui parcourt chaque partie du texte (paragraphes et tableaux) et assigne l'élément actif à l'objet TextElement. La méthode supportsService vérifie si TextElement est un paragraphe ou un tableau. ParagraphesLe service com.sun.star.text.Paragraph donne accès au contenu d'un paragraphe. Le texte du paragraphe peut être extrait et modifié à l'aide de la propriété String : Dim Doc As Object
Dim Enum As Object
Dim TextElement As Object
Doc = StarDesktop.CurrentComponent
Enum = Doc.Text.createEnumeration
While Enum.hasMoreElements
TextElement = Enum.nextElement
If TextElement.supportsService("com.sun.star.text.Paragraph") Then
TextElement.String = Replace(TextElement.String, "you", "U")
TextElement.String = Replace(TextElement.String, "too", "2")
TextElement.String = Replace(TextElement.String, "for", "4")
End If
Wend
Cet exemple ouvre le document texte actif et le parcourt à l'aide de l'objet Enumeration. Il utilise la propriété TextElement.String dans tous les paragraphes pour accéder aux paragraphes concernés et remplace les chaînes you, too et for par les caractères U, 2 et 4. La fonction Replace utilisée pour la substitution n'entre pas dans le domaine linguistique standard de StarOffice Basic. Il s'agit d'une nouvelle utilisation de la fonction d'exemple décrite au Chapitre 3, Bibliothèque d'exécution de StarOffice Basic, dans la section Recherche et remplacement. Remarque – La procédure d'accès aux paragraphes d'un texte qui est décrite ici est comparable à la liste Paragraphs disponible dans les objets Range et Document de VBA. Cependant, contrairement à VBA où les paragraphes sont accessibles par leur indice (via l'appel Paragraph(1), par exemple), dans StarOffice Basic il est nécessaire d'utiliser l'objet Enumeration décrit ci-dessus. StarOffice Basic ne comporte aucun équivalent des listes Characters, Sentences et Words fournies dans VBA. En revanche, vous pouvez utiliser un objet TextCursor permettant la navigation à l'échelle des caractères, des phrases et des mots (voir TextCursor). Portions de paragrapheL'exemple précédent peut effectuer les substitutions souhaitées dans le texte, mais il peut également détruire le formatage. En effet, un paragraphe est constitué de sous-objets individuels. Chacun de ces sous-objets contient ses propres informations de formatage. Par exemple, si un paragraphe contient en son milieu un mot en gras, il est représenté dans StarOffice par trois portions de paragraphe : la portion précédant le mot en gras, le mot en gras lui-même et la portion située après, définie de nouveau comme normale. Si le texte du paragraphe est modifié à l'aide de la propriété String du paragraphe, StarOffice commence par supprimer les anciennes portions du paragraphe et en insère une nouvelle. Le formatage des sections précédentes est alors perdu. Pour éviter cela, l'utilisateur peut accéder aux portions concernées du paragraphe au lieu du paragraphe entier. C'est pourquoi les paragraphes comportent leur propre objet Enumeration. L'exemple suivant montre une double boucle qui parcourt tous les paragraphes d'un document texte et les portions de paragraphes qu'ils contiennent, puis applique les remplacements de l'exemple précédent : Dim Doc As Object
Dim Enum1 As Object
Dim Enum2 As Object
Dim TextElement As Object
Dim TextPortion As Object
Doc = StarDesktop.CurrentComponent
Enum1 = Doc.Text.createEnumeration
' boucle parcourant tous les éléments du texte
While Enum1.hasMoreElements
TextElement = Enum1.nextElement
If TextElement.supportsService("com.sun.star.text.Paragraph") Then
Enum2 = TextElement.createEnumeration
' boucle parcourant tous les sous-paragaphes
While Enum2.hasMoreElements
TextPortion = Enum2.nextElement
MsgBox "'" & TextPortion.String & "'"
TextPortion.String = Replace(TextPortion.String, "you", "U")
TextPortion.String = Replace(TextPortion.String, "too", "2")
TextPortion.String = Replace(TextPortion.String, "for", "4")
Wend
End If
Wend
L'exemple parcourt un document texte par une double boucle. La boucle externe se rapporte aux paragraphes du texte. La boucle interne traite les portions de paragraphe à l'intérieur de ces paragraphes. Le contenu de chacune de ces portions de paragraphe est modifié à l'aide de la propriété String de la chaîne, comme l'exemple précédent le faisait pour les paragraphes. Mais les portions de paragraphe étant modifiées directement, leur formatage est conservé lors du remplacement de la chaîne. FormatageLe texte peut être formaté de différentes façons. La manière la plus simple consiste à assigner les propriétés de format directement à la séquence de texte. On parle dans ce cas de formatage direct. Le formatage direct est particulièrement utilisé dans les documents courts, car les formats peuvent être assignés par l'utilisateur à l'aide de la souris. Vous pouvez, par exemple, mettre en valeur un mot à l'intérieur du texte en le mettant en gras ou centrer une ligne. En plus du formatage direct, vous pouvez également formater le texte à l'aide de modèles. On parle alors de formatage indirect. Avec le formatage indirect, l'utilisateur assigne un modèle prédéfini à la portion de texte concernée. Si la présentation du texte est modifiée par la suite, il suffit à l'utilisateur de modifier le modèle. StarOffice modifie alors la manière dont toutes les portions de texte utilisant ce modèle sont représentées. Remarque – Dans VBA, les propriétés de formatage d'un objet se répartissent généralement sur toute une gamme de sous-objets (par exemple Range.Font, Range.Borders, Range.Shading, Range.ParagraphFormat). On accède à ces propriétés par des expressions en cascade (par exemple Range.Font.AllCaps). Dans StarOffice Basic, en revanche, les propriétés de formatage sont accessibles directement, à l'aide des objets concernés (TextCursor, Paragraph, etc.). Les propriétés de caractère et de paragraphe disponibles dans StarOffice sont présentées dans les deux sections suivantes. Remarque – Dans l'ancienne API StarOffice, un texte était essentiellement formaté à l'aide de l'objet Selection et des objets subordonnés (Selection.Font, Selection.Paragraph et Selection.Border, par exemple). Dans la nouvelle API, les propriétés de formatage figurent dans chaque objet (Paragraph, TextCursor, etc.) et peuvent être appliquées directement. Les propriétés de caractère et de paragraphe disponibles sont décrites ci-dessous. Propriétés de caractèreLes propriétés de format relatives à un caractère sont décrites comme propriétés de caractère. Elles comprennent notamment le type de gras et le type de police. Les objets permettant de définir des propriétés de caractère doivent prendre en charge le service com.sun.star.style.CharacterProperties. StarOffice reconnaît une gamme étendue de services prenant en charge ce service. C'est le cas des services com.sun.star.text.Paragraph pour les paragraphes et de com.sun.star.text.TextPortion pour les portions de paragraphes. Le service com.sun.star.style.CharacterProperties ne fournit aucune interface, mais une gamme de propriétés permettant de définir et d'appeler des propriétés de caractère. Une liste complète des propriétés de caractère se trouve dans la référence de l'API StarOffice. Les plus importantes sont répertoriées ci-dessous :
Propriétés de paragrapheLes informations de formatage qui ne se rapportent pas à des caractères individuels, mais à un paragraphe entier, sont considérées comme des propriétés de paragraphe. Cela inclut les interlignes et la distance entre le paragraphe et le bord de la page. Les propriétés de paragraphe sont accessibles via le service com.sun.star.style.ParagraphProperties. Même les propriétés de paragraphe sont disponibles dans divers objets. Tous les objets supportant le service com.sun.star.text.Paragraph prennent également en charge les propriétés de paragraphe dans com.sun.star.style.ParagraphProperties. Une liste complète des propriétés de paragraphe se trouve dans la référence de l'API StarOffice. Les plus courantes sont les suivantes :
Exemple : export HTML simpleL'exemple suivant montre comment manipuler des informations de formatage. Il procède par itérations à l'intérieur d'un document texte et crée un fichier HTML simple. Dans ce but, chaque paragraphe est enregistré dans son propre élément HTML <P>. Les portions de paragraphe affichées en gras sont marquées d'un élément HTML <B> lors de leur export. Dim FileNo As Integer, Filename As String, CurLine As String
Dim Doc As Object
Dim Enum1 As Object, Enum2 As Object
Dim TextElement As Object, TextPortion As Object
Filename = "c:\text.html"
FileNo = Freefile
Open Filename For Output As #FileNo
Print #FileNo, "<HTML><BODY>"
Doc = StarDesktop.CurrentComponent
Enum1 = Doc.Text.createEnumeration
' boucle parcourant tous les paragraphes
While Enum1.hasMoreElements
TextElement = Enum1.nextElement
If TextElement.supportsService("com.sun.star.text.Paragraph") Then
Enum2 = TextElement.createEnumeration
CurLine = "<P>"
' boucle parcourant toutes les portions de paragraphe
While Enum2.hasMoreElements
TextPortion = Enum2.nextElement
If TextPortion.CharWeight = com.sun.star.awt.FontWeight.BOLD THEN
CurLine = CurLine & "<B>" & TextPortion.String & "</B>"
Else
CurLine = CurLine & TextPortion.String
End If
Wend
' exporte la ligne
CurLine = CurLine & "</P>"
Print #FileNo, CurLine
End If
Wend
' écrit le pied de page HTML
Print #FileNo, "</BODY></HTML>"
Close #FileNo
La structure de base de cet exemple reprend celle des exemples parcourant les portions de paragraphe d'un texte, présentés plus haut. Les fonctions d'écriture du fichier HTML, ainsi qu'un bloc test vérifiant la graisse des portions de texte correspondantes et mettant en gras des portions de paragraphe par une balise HTML correspondante, ont été ajoutées. Valeurs par défaut des propriétés de caractère et de paragrapheLe formatage direct est toujours prioritaire sur le formatage indirect. Autrement dit, une priorité inférieure est attribuée au formatage à l'aide de modèles par rapport au formatage direct dans un texte. Il n'est pas facile d'établir si une section d'un document a été formatée directement ou indirectement. Les barres de symboles fournies par StarOffice affichent les propriétés de texte courantes telles que le type de police, la graisse et la taille. Mais elles n'indiquent pas si ces propriétés ont été définies par un modèle ou directement dans le texte. StarOffice Basic comporte la méthode getPropertyState, permettant aux programmeurs de vérifier comment une propriété a été formatée. Elle prend le nom de la propriété en argument et renvoie une constante indiquant l'origine du formatage. Les réponses possibles, définies dans l'énumération com.sun.star.beans.PropertyState, sont les suivantes :
L'exemple suivant montre comment les propriétés de format peuvent être éditées dans StarOffice. Il recherche dans un texte les portions de paragraphe qui ont été définies en gras par formatage direct. S'il en trouve une, il supprime le formatage direct à l'aide de la méthode setPropertyToDefault et assigne à la portion de paragraphe un modèle de caractère MyBold. Dim Doc As Object
Dim Enum1 As Object
Dim Enum2 As Object
Dim TextElement As Object
Dim TextPortion As Object
Doc = StarDesktop.CurrentComponent
Enum1 = Doc.Text.createEnumeration
' Boucle parcourant toutes les portions de paragraphes
While Enum1.hasMoreElements
TextElement = Enum1.nextElement
If TextElement.supportsService("com.sun.star.text.Paragraph") Then
Enum2 = TextElement.createEnumeration
' Boucle parcourant toutes les portions de paragraphes
While Enum2.hasMoreElements
TextPortion = Enum2.nextElement
If TextPortion.CharWeight = _
com.sun.star.awt.FontWeight.BOLD AND _
TextPortion.getPropertyState("CharWeight") = _
com.sun.star.beans.PropertyState.DIRECT_VALUE Then
TextPortion.setPropertyToDefault("CharWeight")
TextPortion.CharStyleName = "MyBold"
End If
Wend
End If
Wend
Édition de documents texteLa section précédente traitait d'un vaste ensemble d'options dédiées à l'édition de documents texte axées sur les services com.sun.star.text.TextPortion et com.sun.star.text.Paragraph, permettant d'accéder aux portions de paragraphe et aux paragraphes. Ces services sont adaptés aux applications dans lesquelles le contenu du texte doit être édité par un passage dans une boucle. Pour les tâches plus complexes, StarOffice comporte le service com.sun.star.text.TextCursor, notamment pour le parcours d'un document en sens inverse, phrase par phrase ou mot par mot, plutôt que par objets TextPortions. Objet TextCursorUn objet TextCursor dans l'API StarOffice est comparable au curseur visible utilisé dans un document StarOffice. Il marque un certain point à l'intérieur d'un document texte et peut être déplacé dans diverses directions au moyen de commandes. Toutefois, les objets TextCursor disponibles dans StarOffice Basic ne doivent pas être confondus avec le curseur visible. Ils correspondent à deux choses différentes. Remarque – La terminologie diffère de celle de VBA : en ce qui concerne la portée de la fonction, l'objet Range de VBA peut être comparé à l'objet TextCursor de StarOffice et non — comme son nom porterait à le croire — à l'objet Range de StarOffice. L'objet TextCursor de StarOffice, par exemple, fournit des méthodes de navigation et de modification du texte qui sont incluses dans l'objet Range de VBA (par exemple, MoveStart, MoveEnd, InsertBefore et InsertAfter). Les équivalents correspondants de l'objet TextCursor de StarOffice sont décrits dans les sections suivantes. Navigation à l'intérieur d'un texteL'objet TextCursor de StarOffice Basic agit indépendamment du curseur visible dans un document texte. Un déplacement d'objet TextCursor commandé par le programme n'a aucune incidence sur le curseur visible. Plusieurs objets TextCursor peuvent même être ouverts pour le même document et utilisés à divers emplacements indépendamment les uns des autres. Un objet TextCursor est créé par l'appel createTextCursor : Dim Doc As Object Dim Cursor As Object Doc = StarDesktop.CurrentComponent Cursor = TextDocument.Text.createTextCursor() L'objet Cursor créé de cette manière prend en charge le service com.sun.star.text.TextCursor, qui comporte toute une gamme de méthodes de navigation dans les documents texte. L'exemple qui suit commence par déplacer l'objet TextCursor de dix caractères vers la gauche, et le déplace ensuite de trois caractères vers la droite : Cursor.goLeft(10, False) Cursor.goRight(3, False) Un objet TextCursor peut mettre en évidence toute une zone. On peut comparer cela à la mise en évidence d'un emplacement du texte à l'aide de la souris. Le paramètre False dans la fonction ci-dessus spécifie si la zone traversée par le curseur doit ou non être mise en évidence. Ainsi, dans l'exemple suivant : Cursor.goLeft(10, False) Cursor.goRight(3, True) l'objet TextCursor commence par se déplacer de dix caractères vers la droite sans mise en évidence, puis revient trois caractères en arrière et met ces caractères en évidence. La zone mise en évidence commence donc après le septième caractère du texte et se termine après le dixième. Les principales méthodes offertes par le service com.sun.star.text.TextCursor pour la navigation sont les suivantes :
Le texte est découpé en phrases en fonction des symboles de phrase. Par exemple, les points sont interprétés comme des symboles indiquant la fin des phrases. Le paramètre Expand est une valeur de type Boolean indiquant si la zone traversée lors du déplacement doit être ou non mise en évidence. Toutes les méthodes de navigation renvoient un paramètre indiquant si la navigation a réussi ou si l'action s'est terminée faute de texte. Voici une liste de plusieurs méthodes d'édition de zones en évidence à l'aide d'un objet TextCursor et prenant également en charge le service com.sun.star.text.TextCursor :
Formatage du texte avec TextCursorLe service com.sun.star.text.TextCursor prend en charge toutes les propriétés de caractère et de paragraphe présentées au début de ce chapitre. L'exemple suivant montre comment ces propriétés peuvent être associées à un objet TextCursor. Il parcourt un document complet et met en gras le premier mot de chaque phrase. Dim Doc As Object Dim Cursor As Object Dim Proceed As Boolean Doc = StarDesktop.CurrentComponent Cursor = Doc.Text.createTextCursor Do Cursor.gotoEndOfWord(True) Cursor.CharWeight = com.sun.star.awt.FontWeight.BOLD Proceed = Cursor.gotoNextSentence(False) Cursor.gotoNextWord(False) Loop While Proceed L'exemple commence par créer un objet Document pour le texte qui vient d'être ouvert. Il parcourt ensuite par itérations le texte entier, phrase par phrase, met en évidence le premier mot et le formate en gras. Extraction et modification du contenu d'un texteSi un objet TextCursor contient une zone mise en évidence, ce texte est accessible par la propriété String de l'objet TextCursor. L'exemple suivant utilise la propriété String pour afficher les premiers mots d'une phrase dans une boîte de message : Dim Doc As Object Dim Cursor As Object Dim Proceed As Boolean Doc = StarDesktop.CurrentComponent Cursor = Doc.Text.createTextCursor Do Cursor.gotoEndOfWord(True) MsgBox Cursor.String Proceed = Cursor.gotoNextSentence(False) Cursor.gotoNextWord(False) Loop While Proceed Le premier mot de chaque phrase peut être modifié de la même manière à l'aide de la propriété String : Dim Doc As Object Dim Cursor As Object Dim Proceed As Boolean Doc = StarDesktop.CurrentComponent Cursor = Doc.Text.createTextCursor Do Cursor.gotoEndOfWord(True) Cursor.String = "Ups" Proceed = Cursor.gotoNextSentence(False) Cursor.gotoNextWord(False) Loop While Proceed Si l'objet TextCursor contient une zone en surbrillance, une assignation de la propriété String la remplace par le nouveau texte. Si aucune zone n'est mise en évidence, le texte est inséré à la position de l'objet TextCursor. Insertion de codes de contrôleDans certaines situations, la partie à modifier n'est pas le texte du document mais sa structure. StarOffice fournit des codes de contrôle à cet usage. Ces codes s'insèrent dans le texte et influent sur sa structure. Les codes de contrôle sont définis dans le groupe de constantes com.sun.star.text.ControlCharacter Les codes de contrôle disponibles dans StarOffice sont les suivants :
Pour insérer des codes de contrôle, non seulement le curseur, mais également les objets de document texte associés sont nécessaires. L'exemple suivant insère un saut de paragraphe après le 20e caractère d'un texte : Dim Doc As Object Dim Cursor As Object Dim Proceed As Boolean Doc = StarDesktop.CurrentComponent Cursor = Doc.Text.createTextCursor Cursor.goRight(20, False) Doc.Text.insertControlCharacter(Cursor, _ com.sun.star.text.ControlCharacter.PARAGRAPH_BREAK, False) Le paramètre False passé dans l'appel de la méthode insertControlCharacter assure que la zone mise en évidence par l'objet TextCursor est conservée après l'insertion. Si le paramètre True est passé ici, insertControlCharacter remplace le texte actif. Recherche de portions de texteIl est souvent nécessaire de rechercher un terme particulier dans un texte et de l'éditer. Tous les documents StarOffice fournissent pour cela une interface spéciale qui fonctionne toujours selon le même principe : avant chaque recherche, il faut créer ce que l'on appelle communément un objet SearchDescriptor. Il définit ce que StarOffice recherche dans un document. SearchDescriptor est un objet prenant en charge le service com.sun.star.util. SearchDescriptor. Il peut être créé à l'aide de la méthode createSearchDescriptor d'un document : Dim SearchDesc As Object SearchDesc = Doc.createSearchDescriptor Lorsque l'objet SearchDescriptor a été créé, il reçoit le texte à rechercher : SearchDesc.searchString="any text" Du point de vue de son fonctionnement, l'objet SearchDescriptor est comparable à la boîte de dialogue de recherche de StarOffice. Comme dans cette boîte de dialogue, les paramètres nécessaires à une recherche peuvent être définis dans l'objet SearchDescriptor. Les propriétés sont fournies par le service com.sun.star.util.SearchDescriptor :
La fonction SearchSimilarity de StarOffice (ou "correspondance floue") est également disponible dans StarOffice Basic. Avec cette fonction, StarOffice recherche une expression similaire, mais pas nécessairement exactement semblable à l'expression spécifiée. Le nombre de caractères supplémentaires, supprimés ou modifiés de ces expressions peut être défini individuellement. Les propriétés associées au service com.sun.star.util.SearchDescriptor sont les suivantes :
Une fois que l'objet SearchDescriptor a été paramétré de façon appropriée, il peut être appliqué au document texte. Pour cela, les documents StarOffice disposent des méthodes findFirst et findNext : Found = Doc.findFirst (SearchDesc) Do While Found ' Suchergebnis bearbeiten Found = Doc.findNext( Found.End, Search) Loop Cet exemple recherche toutes les correspondances à l'intérieur d'une boucle et renvoie un objet TextRange, qui se rapporte au passage de texte trouvé. Exemple : recherche de similaritéCet exemple montre comment rechercher le terme "turnover" dans un texte et mettre le résultat en gras. Une recherche de similarité permet de trouver non seulement le terme "turnover", mais également sa forme plurielle "turnovers", ainsi que ses variantes, telles que "turnover's". Les expressions trouvées diffèrent au maximum de deux lettres de l'expression recherchée : Found = Doc.findFirst (SearchDesc) Do While Found ' Suchergebnis bearbeiten Found = Doc.findNext( Found.End, Search) Loop Remarque – Le concept de base de la recherche et remplacement dans StarOffice est comparable à celui utilisé dans VBA. Les deux interfaces fournissent un objet, permettant de définir les propriétés de recherche et de remplacement. Cet objet est ensuite appliqué à la zone de texte appropriée pour effectuer l'action. Dans VBA, l'objet auxiliaire chargé de cela est accessible par la propriété Find de l'objet Range ; dans StarOffice Basic, il faut appeler la méthode createSearchDescriptor ou createReplaceDescriptor du document. Même les propriétés et méthodes de recherche disponibles sont différentes. Comme dans l'ancienne API StarOffice, la recherche et le remplacement de texte sont effectués via l'objet Document. Cependant, il existait auparavant un objet SearchSettings dédié à la définition des options de recherche, tandis que, dans la nouvelle API, les recherches sont désormais effectuées à l'aide d'un objet SearchDescriptor ou ReplaceDescriptor pour le remplacement automatique de texte. Ces objets ne couvrent pas uniquement les options, mais également le texte recherché et, le cas échéant, le texte de remplacement associé. Les objets Descriptor sont créés à l'aide de l'objet Document, complétés selon les requêtes concernées, puis transférés de nouveau à l'objet Document sous forme de paramètres passés dans les méthodes de recherche. Remplacement de portions de texteTout comme la fonction de recherche, la fonction de remplacement de StarOffice est disponible dans StarOffice Basic. Les deux fonctions sont traitées de manière identique. Un objet spécial stockant les paramètres du processus est tout d'abord nécessaire au processus de remplacement. Il s'appelle ReplaceDescriptor et prend en charge le service com.sun.star.util.ReplaceDescriptor. Toutes les propriétés de l'objet SearchDescriptor décrites dans le paragraphe précédent sont également prises en charge par ReplaceDescriptor. Par exemple, la distinction entre majuscules et minuscules peut également être activée et désactivée dans un processus de remplacement, et les recherches de similarité sont également possibles. L'exemple suivant montre l'utilisation d'objets ReplaceDescriptor dans une recherche sur un document StarOffice. Dim I As Long
Dim Doc As Object
Dim Replace As Object
Dim BritishWords(5) As String
Dim USWords(5) As String
BritishWords() = Array("colour", "neighbour", "centre", "behaviour", _
"metre", "through")
USWords() = Array("color", "neighbor", "center", "behavior", _
"meter", "thru")
Doc = StarDesktop.CurrentComponent
Replace = Doc.createReplaceDescriptor
For O = 0 To 5
Replace.SearchString = BritishWords(I)
Replace.ReplaceString = USWords(I)
Doc.replaceAll(Replace)
Next n
Les expressions de recherche et de remplacement sont définies à l'aide des propriétés SearchString et ReplaceString des objets ReplaceDescriptor. Le processus réel de remplacement est finalement implémenté à l'aide de la méthode replaceAll de l'objet Document, qui remplace toutes les occurrences de l'expression recherchée. Exemple : recherche et remplacement de texte avec des expressions régulièresLa fonction de remplacement de StarOffice est particulièrement efficace lorsqu'elle est associée à des expressions régulières. Ces derniers permettent de définir une expression de recherche variable avec des substituants et des caractères spéciaux au lieu d'une valeur fixe. Les expressions régulières prises en charge par StarOffice sont décrites dans l'aide en ligne de StarOffice. Voici quelques exemples :
L'exemple suivant montre comment toutes les lignes vides d'un document texte peuvent être supprimées à l'aide d'expressions régulières ^$ : Dim Doc As Object Dim Replace As Object Dim I As Long Doc = StarDesktop.CurrentComponent Replace = Doc.createReplaceDescriptor Replace.SearchRegularExpression = True Replace.SearchString = "^$" Replace.ReplaceString = "" Doc.replaceAll(Replace) Documents texte : plus qu'un simple motJusqu'à présent, ce chapitre ne traitait que des paragraphes de texte et de portions de paragraphe. Mais les documents texte peuvent également contenir d'autres objets. Il peut s'agir de tableaux, de dessins, de champs de texte et de répertoires. Tous ces objets peuvent être ancrés à un point quelconque du texte. Grâce à ces fonctions communes, tous ces objets de StarOffice prennent en charge un service de base commun appelé com.sun.star.text.TextContent. Ce dernier fournit les propriétés suivantes :
Les objets TextContent partagent également certaines méthodes, notamment celles permettant de créer, d'insérer et de supprimer des objets.
Ces méthodes sont utilisées dans les exemples des sections suivantes. TableauxL'exemple suivant crée un tableau à l'aide de la méthode createInstance décrite plus haut. Dim Doc As Object
Dim Table As Object
Dim Cursor As Object
Doc = StarDesktop.CurrentComponent
Cursor = Doc.Text.createTextCursor()
Table = Doc.createInstance("com.sun.star.text.TextTable")
Table.initialize(5, 4)
Doc.Text.insertTextContent(Cursor, Table, False)
Lorsqu'il est créé, son nombre de lignes et de colonnes est défini à l'aide d'un appel initialize, puis inséré dans le document texte à l'aide de insertTextContent. Comme le montre cet exemple, la méthode insertTextContent attend non seulement l'insertion de l'objet Content, mais également celle de deux autres paramètres :
Remarque – Lors de la création et de l'insertion de tableaux dans un document texte, les objets utilisés dans StarOffice Basic sont similaires à ceux disponibles dans VBA : l'objet Document et un objet TextCursor dans StarOffice Basic ou son équivalent Range dans VBA. Dans VBA, la méthode Document.Tables.Add gère la création et le paramétrage du tableau ; dans StarOffice Basic, celui-ci est créé à l'aide de la méthode createInstance puis initialisé et inséré dans le document via insertTextContent, comme dans l'exemple ci-dessus. Il est possible de déterminer les tableaux insérés dans un document texte à l'aide d'une simple boucle. On utilise pour cela la méthode getTextTables() de l'objet Text document : Dim Doc As Object Dim TextTables As Object Dim Table As Object Dim I As Integer Doc = StarDesktop.CurrentComponent TextTables = Doc.getTextTables() For I = 0 to TextTables.count - 1 Table = TextTables(I) ' Editing table Next I Remarque – Les tableaux de texte sont disponibles dans StarOffice 8 via la liste TextTables de l'objet Document. Celle-ci remplace la liste de tableaux fournie précédemment dans l'objet Selection. L'exemple précédent montre comment créer un tableau de texte. Les options permettant d'accéder aux tableaux de texte sont décrites dans la section suivante. Édition des tableauxUn tableau est constitué de cellules individuelles. Ces cellules peuvent à leur tour contenir diverses autres cellules. À strictement parler, les colonnes de tableau n'existent pas dans StarOffice. Elles sont produites implicitement par la juxtaposition des cellules l'une en dessous de l'autre. Pour simplifier l'accès aux tableaux, StarOffice fournit néanmoins certaines méthodes fonctionnant avec des colonnes. Elles peuvent être utiles si aucune cellule du tableau n'a été fusionnée. Commençons par examiner les propriétés du tableau lui-même. Elles sont définies dans le service com.sun.star.text.TextTable. Les propriétés les plus importantes de l'objet Table sont les suivantes :
LignesUn tableau est constitué d'une liste de lignes. L'exemple suivant montre comment accéder aux lignes d'un tableau et le formater. Dim Doc As Object
Dim Table As Object
Dim Cursor As Object
Dim Rows As Object
Dim Row As Object
Dim I As Integer
Doc = StarDesktop.CurrentComponent
Cursor = Doc.Text.createTextCursor()
Table = Doc.createInstance("com.sun.star.text.TextTable")
Table.initialize(5, 4)
Doc.Text.insertTextContent(Cursor, Table, False)
Rows = Table.getRows
For I = 0 To Rows.getCount() - 1
Row = Rows.getByIndex(I)
Row.BackColor = &HFF00FF
Next
Cet exemple commence par créer une liste contenant toutes les lignes utilisant un appel Table.getRows. Les méthodes getCount et getByIndex permettent de poursuivre le traitement de la liste et appartiennent à l'interface com.sun.star.table.XtableRows. La méthode getByIndex renvoie un objet Row, prenant en charge le service com.sun.star.text.TextTableRow. Les méthodes centrales de l'interface com.sun.star.table.XtableRows sont les suivantes :
Alors que les méthodes getByIndex et getCount sont disponibles dans tous les tableaux, les méthodes insertByIndex et removeByIndex ne peuvent être utilisées que dans les tableaux qui ne contiennent pas de cellules fusionnées. Le service com.sun.star.text.TextTableRow fournit les propriétés suivantes :
ColonnesLes colonnes sont accessibles de la même manière que les lignes, à l'aide des méthodes getByIndex, getCount, insertByIndex et removeByIndex sur l'objet Column, qui est atteint via getColumns. Ces méthodes ne peuvent néanmoins être utilisées que dans des tableaux ne contenant pas de cellules fusionnées. Les cellules ne peuvent pas être formatées par colonne dans StarOffice Basic. Pour arriver à ce résultat, il faut appliquer les méthodes de formatage des cellules individuelles. CellulesChaque cellule d'un document StarOffice porte un nom unique. Si le curseur de StarOffice se trouve dans une cellule, le nom de cette cellule apparaît dans la barre d'état. La cellule supérieure gauche est habituellement appelée A1 et la cellule inférieure droite Xn, où X représente la lettre de la dernière colonne et n le numéro de la dernière ligne. Les objets Cell sont accessibles par la méthode getCellByName() de l'objet Table. L'exemple suivant montre une boucle qui parcourt toutes les cellules d'un tableau et y insère les numéros de ligne et lettres de colonne correspondants. Dim Doc As Object
Dim Table As Object
Dim Cursor As Object
Dim Rows As Object
Dim RowIndex As Integer
Dim Cols As Object
Dim ColIndex As Integer
Dim CellName As String
Dim Cell As Object
Doc = StarDesktop.CurrentComponent
Cursor = Doc.Text.createTextCursor()
Table = Doc.createInstance("com.sun.star.text.TextTable")
Table.initialize(5, 4)
Doc.Text.insertTextContent(Cursor, Table, False)
Rows = Table.getRows
Cols = Table.getColumns
For RowIndex = 1 To Rows.getCount()
For ColIndex = 1 To Cols.getCount()
CellName = Chr(64 + ColIndex) & RowIndex
Cell = Table.getCellByName(CellName)
Cell.String = "row: " & CStr(RowIndex) + ", column: " & CStr(ColIndex)
Next
Next
Une cellule de tableau est comparable à du texte standard. Elle prend en charge l'interface createTextCursor permettant la création d'un objet TextCursor associé. CellCursor = Cell.createTextCursor() Toutes les options de formatage pour les caractères individuels et les paragraphes sont donc automatiquement disponibles. L'exemple qui suit effectue une recherche dans tous les tableaux d'un document texte et aligne à droite toutes les cellules comportant des valeurs numériques à l'aide de la propriété de paragraphe correspondante. Dim Doc As Object
Dim TextTables As Object
Dim Table As Object
Dim CellNames
Dim Cell As Object
Dim CellCursor As Object
Dim I As Integer
Dim J As Integer
Doc = StarDesktop.CurrentComponent
TextTables = Doc.getTextTables()
For I = 0 to TextTables.count - 1
Table = TextTables(I)
CellNames = Table.getCellNames()
For J = 0 to UBound(CellNames)
Cell = Table.getCellByName(CellNames(J))
If IsNumeric(Cell.String) Then
CellCursor = Cell.createTextCursor()
CellCursor.paraAdjust = com.sun.star.style.ParagraphAdjust.RIGHT
End If
Next
Next
Cet exemple crée une liste TextTables contenant tous les tableaux d'un texte, qui sont parcourus dans une boucle. StarOffice crée ensuite une liste des noms des cellules associés pour chacun de ces tableaux. Ces cellules sont ensuite parcourues à leur tour dans une boucle. Si une cellule contient une valeur numérique, l'exemple modifie le formatage en conséquence. Pour ce faire, il commence par créer un objet TextCursor renvoyant au contenu de la cellule, puis modifie les propriétés de paragraphe de cette dernière. Cadres texteLes cadres texte sont considérés comme des objets TextContent, tout comme les tableaux et les images. Ils consistent généralement en texte standard, mais ils peuvent être placés à tout emplacement sur la page et ne sont pas inclus dans l'enchaînement. Comme pour tous les objets TextContent, la création d'un cadre texte et son insertion dans le document se font à deux étapes différentes. Dim Doc As Object
Dim TextTables As Object
Dim Cursor As Object
Dim Frame As Object
Doc = StarDesktop.CurrentComponent
Cursor = Doc.Text.createTextCursor()
Frame = Doc.createInstance("com.sun.star.text.TextFrame")
Doc.Text.insertTextContent(Cursor, Frame, False)
Le cadre texte est créé à l'aide de la méthode createInstance de l'objet Document. Le cadre texte créé de cette manière peut ensuite être inséré dans le document à l'aide de la méthode insertTextContent de l'objet Text. Pour cela, le nom du service approprié com.sun.star.text.TextFrame doit être spécifié. L'emplacement d'insertion du cadre texte est déterminé par un objet Cursor, également exécuté lors de son insertion. Remarque – Les cadres texte sont l'équivalent dans StarOffice des cadres de position utilisés dans Word. VBA utilise la méthode Document.Frames.Add à cet effet, tandis que dans StarOffice Basic, la création est effectuée via la procédure ci-dessus, à l'aide d'un objet TextCursor et de la méthode createInstance de l'objet Document. Les objets TextFrame fournissent toute une gamme de propriétés permettant d'influer sur l'emplacement et le comportement du cadre. La plupart de ces propriétés sont définies dans le service com.sun.star.text.BaseFrameProperties, également pris en charge par chaque service TextFrame. Les propriétés centrales sont les suivantes :
L'exemple suivant crée un cadre texte à l'aide des propriétés ci-dessus : Dim Doc As Object
Dim TextTables As Object
Dim Cursor As Object
Dim Frame As Object
Doc = StarDesktop.CurrentComponent
Cursor = Doc.Text.createTextCursor()
Cursor.gotoNextWord(False)
Frame = Doc.createInstance("com.sun.star.text.TextFrame")
Frame.Width = 3000
Frame.Height = 1000
Frame.AnchorType = com.sun.star.text.TextContentAnchorType.AS_CHARACTER
Frame.TopMargin = 0
Frame.BottomMargin = 0
Frame.LeftMargin = 0
Frame.RightMargin = 0
Frame.BorderDistance = 0
Frame.HoriOrient = com.sun.star.text.HoriOrientation.NONE
Frame.VertOrient = com.sun.star.text.VertOrientation.LINE_TOP
Doc.Text.insertTextContent(Cursor, Frame, False)
Cet exemple crée un objet TextCursor servant de marque d'insertion pour le cadre texte. Ce dernier est positionné entre le premier et le deuxième mot du texte. Le cadre texte est créé à l'aide de Doc.createInstance. Les propriétés des objets Text frame sont définies aux valeurs initiales nécessaires. Il convient de noter ici l'interaction entre les propriétés AnchorType (du service TextContent) et VertOrient (du service BaseFrameProperties). AnchorType reçoit la valeur AS_CHARACTER. Le cadre texte est donc inséré directement dans l'enchaînement et se comporte comme un caractère. Il peut ainsi être déplacé à la ligne suivante en cas de retour à la ligne, par exemple. La valeur LINE_TOP de la propriété VertOrient garantit que le bord supérieur du cadre texte se trouve à la même hauteur que le bord supérieur du caractère. Lorsque l'initialisation est terminée, le cadre texte est finalement inséré dans le document texte à l'aide d'un appel de la méthode insertTextContent. Pour éditer le contenu d'un cadre texte, l'utilisateur fait appel à l'objet TextCursor, déjà mentionné à de nombreuses reprises et également disponible pour les cadres texte. Dim Doc As Object
Dim TextTables As Object
Dim Cursor As Object
Dim Frame As Object
Dim FrameCursor As Object
Doc = StarDesktop.CurrentComponent
Cursor = Doc.Text.createTextCursor()
Frame = Doc.createInstance("com.sun.star.text.TextFrame")
Frame.Width = 3000
Frame.Height = 1000
Doc.Text.insertTextContent(Cursor, Frame, False)
FrameCursor = Frame.createTextCursor()
FrameCursor.charWeight = com.sun.star.awt.FontWeight.BOLD
FrameCursor.paraAdjust = com.sun.star.style.ParagraphAdjust.CENTER
FrameCursor.String = "This is a small Test!"
Cet exemple crée un cadre texte, l'insère dans le document actif et ouvre un objet TextCursor pour le cadre. Ce curseur est utilisé pour définir en gras la police du cadre et centrer le paragraphe. Enfin, la chaîne "This is a small Test!" est assignée au cadre texte. Champs de texteLes champs de texte sont des objets TextContent, car ils ajoutent une extension logique au-delà du texte pur. Des champs de texte peuvent être insérés dans un document texte en utilisant les mêmes méthodes que pour les autres objets TextContent : Dim Doc As Object
Dim DateTimeField As Object
Dim Cursor As Object
Doc = StarDesktop.CurrentComponent
Cursor = Doc.Text.createTextCursor()
DateTimeField = Doc.createInstance("com.sun.star.text.TextField.DateTime")
DateTimeField.IsFixed = False
DateTimeField.IsDate = True
Doc.Text.insertTextContent(Cursor, DateTimeField, False)
Cet exemple insère un champ de texte correspondant à la date du jour au début du document texte actif. Si la propriété IsDate a la valeur True, seule la date s'affiche, sans l'heure. Si IsFixed a la valeur False, la date est actualisée automatiquement à l'ouverture du document. Remarque – Dans VBA, le type d'un champ est spécifié par un paramètre de la méthode Document.Fields.Add ; dans StarOffice Basic, il est défini par le nom du service prenant en charge ce type de champ. Dans les anciennes versions de StarOffice, on accédait aux champs de texte par tout un ensemble de méthodes disponibles dans l'objet Selection (InsertField, DeleteUserField, SetCurField, par exemple). Dans StarOffice 8, les champs sont administrés à l'aide d'un concept orienté objet. Pour créer un champ de texte particulier, il faut d'abord créer un champ de texte du type requis et l'initialiser avec les propriétés adéquates. Ce champ de texte est ensuite inséré dans le document à l'aide de la méthode insertTextContent. Un texte source correspondant est illustré dans l'exemple précédent. Les principaux types de champ et leurs propriétés sont décrits dans les sections suivantes. Outre l'insertion de champs de texte, la recherche des champs dans un document peut également être une tâche fastidieuse. L'exemple suivant montre comment parcourir tous les champs de texte d'un document texte dans une boucle et contrôler leur type. Dim Doc As Object
Dim TextFieldEnum As Object
Dim TextField As Object
Dim I As Integer
Doc = StarDesktop.CurrentComponent
TextFieldEnum = Doc.getTextFields.createEnumeration
While TextFieldEnum.hasMoreElements()
TextField = TextFieldEnum.nextElement()
If TextField.supportsService("com.sun.star.text.TextField.DateTime") Then
MsgBox "Date/time"
ElseIf
TextField.supportsService("com.sun.star.text.TextField.Annotation")
Then
MsgBox "Annotation"
Else
MsgBox "unknown"
End If
Wend
La détermination des champs de texte présents se base sur la liste TextFields de l'objet Document. Dans l'exemple, un objet Enumeration est créé en fonction de cette liste. Il permet d'interroger successivement tous les champs de texte dans une boucle. À l'aide de la méthode supportsService, l'exemple vérifie ensuite le service pris en charge par chaque champ de texte trouvé. Si le champ s'avère être un champ de date/heure ou une annotation, le type de champ correspondant s'affiche dans une boîte d'information. S'il s'agit d'un autre champ, l'exemple affiche l'information "unknown". La liste ci-dessous répertorie les champs de texte les plus importants et leurs propriétés associées. Une liste complète de tous les champs de texte est fournie dans le module com.sun.star.text.TextField de la référence de l'API. (Lorsque vous répertoriez le nom du service d'un champ de texte, des majuscules et des minuscules doivent être utilisées dans StarOffice Basic, comme dans l'exemple précédent.) Nombre de pages, de mots et de caractèresLes champs de texte :
renvoient respectivement le nombre de pages, de mots ou de caractères d'un texte. Ils prennent en charge la propriété suivante : Page activeLe numéro de la page active peut être inséré dans un document à l'aide du champ de texte com.sun.star.text.TextField.PageNumber. Vous pouvez spécifier les propriétés suivantes :
L'exemple qui suit montre comment insérer le nombre de pages dans le pied de page d'un document. Dim Doc As Object
Dim DateTimeField As Object
Dim PageStyles As Object
Dim StdPage As Object
Dim FooterCursor As Object
Dim PageNumber As Object
Doc = StarDesktop.CurrentComponent
PageNumber = Doc.createInstance("com.sun.star.text.TextField.PageNumber")
PageNumber.NumberingType = com.sun.star.style.NumberingType.ARABIC
PageStyles = Doc.StyleFamilies.getByName("PageStyles")
StdPage = PageStyles("Default")
StdPage.FooterIsOn = True
FooterCursor = StdPage.FooterTextLeft.Text.createTextCursor()
StdPage.FooterTextLeft.Text.insertTextContent(FooterCursor, PageNumber, False)
L'exemple commence par créer un champ de texte prenant en charge le service com.sun.star.text.TextField.PageNumber. L'en-tête et le pied de page étant définies à l'intérieur des modèles de page de StarOffice, elles sont initialement établies à l'aide de la liste de tous les objets PageStyles. Pour garantir que la ligne du pied de page est visible, la propriété FooterIsOn a la valeur True. Le champ de texte est alors inséré dans le document à l'aide de l'objet Text associé de la ligne de pied de page gauche. AnnotationsDans le texte, les champs d'annotation (com.sun.star.text.TextField.Annotation) sont repérables à un petit symbole jaune. Si vous cliquez sur ce symbole, un champ de texte s'ouvre pour vous permettre d'enregistrer un commentaire à cet emplacement du texte. Un champ d'annotation comporte les propriétés suivantes. Date / heureUn champ de date/heure (com.sun.star.text.TextField.DateTime) représente la date du jour ou l'heure qu'il est. Il prend en charge les propriétés suivantes :
Nom / Numéro de chapitreLe nom du chapitre actif est accessible par un champ de texte du type com.sun.star.text.TextField.Chapter. Sa forme peut être définie à l'aide de deux propriétés.
Repères de texteLes repères de texte (Service com.sun.star.text.Bookmark) sont des objets TextContent. Leur création et leur insertion fait appel à un concept déjà décrit plus haut : Dim Doc As Object
Dim Bookmark As Object
Dim Cursor As Object
Doc = StarDesktop.CurrentComponent
Cursor = Doc.Text.createTextCursor()
Bookmark = Doc.createInstance("com.sun.star.text.Bookmark")
Bookmark.Name = "My bookmarks"
Doc.Text.insertTextContent(Cursor, Bookmark, True)
L'exemple crée un objet Cursor, qui marque la position d'insertion du repère de texte, puis crée l'objet repère de texte proprement dit (Bookmark). Un nom est ensuite assigné au repère de texte et ce dernier est inséré à l'emplacement du curseur dans le document, par la méthode insertTextContent. Les repères de texte d'un texte sont accessibles par une liste appelée Bookmarks. Il est possible d'accéder aux repères de texte par leur numéro ou par leur nom. L'exemple qui suit montre comment trouver un repère de texte à l'intérieur d'un texte et insérer du texte à son emplacement. Dim Doc As Object
Dim Bookmark As Object
Dim Cursor As Object
Doc = StarDesktop.CurrentComponent
Bookmark = Doc.Bookmarks.getByName("My bookmarks")
Cursor = Doc.Text.createTextCursorByRange(Bookmark.Anchor)
Cursor.String = "Here is the bookmark"
Dans cet exemple, la méthode getByName est utilisée pour trouver le repère de texte requis au moyen de son nom. L'appel createTextCursorByRange crée ensuite un objet Cursor, qui est placé à la position d'ancrage du repère de texte. Le curseur insère ensuite le texte requis à cet endroit. |