Деякі засоби роботи з текстовими документами Writer.

Текстовий документ у своїй структурі може містити фактичний текст як набір символів; стилі форматування символів, абзаців чи сторінок; вбудовані нетекстові елементи (таблиці, малюнки, тощо); загальні параметри налаштування. Основну частину тестового документа можна розглядати як послідовність абзаців, які не мають ні імен ні порядкових номерів, проте їх можна переглянути послідовно за допомогою об’єкта Enumeration.

Наприклад, наступний макрос послідовно виводить повідомлення з вмістом усіх абзаців документа, в якому міститься:

Sub TextDocSample1()
Dim Enum As Object
Dim TextElement As Object
Enum = ThisComponent.Text.createEnumeration
While Enum.hasMoreElements
TextElement = Enum.nextElement
If TextElement.supportsService(“com.sun.star.text.Paragraph”) Then
MsgBox TextElement.String
End If
Wend
End Sub

Конструкція ThisComponent.Text.createEnumeration дозволяє утворити із вмісту документа перелік абзаців, який має методи nextElement – для перебору своїх елементів та hasMoreElements – для перевірки завершення отриманого переліку.
Властивість String дає можливість отримати доступ до текстового вмісту абзаца і виконати з ним потрібні маніпуляції, скажімо, за допомогою функцій для обробки даних типу String. Отриманий із тексту документа перелік Enumeration може містити не тільки абзаци тексту, для уникнення помилок у прикладі здійснюється перевірка того, чи TextElement є абзацом тексту. Сервіс com.sun.star.text.Paragraph має також широкий набір властивостей, що відповідають за форматування абзаців та символів абзаца, за допомогою яких макрос може виконувати форматування тексту документа.

Інший спосіб опрацювання тексту документа, що дозволяє вирішувати більш складні задачі, надає сервіс com.sun.star.text.TextCursor. Об’єкт TextCursor нагадує видимий курсор текстового редактора, проте, вони не обов’язково співпадають — TextCursor може преміщуватися по тексту документа невидимо і незалежно від видимого курсора. Більше того, можна “запустити” одночасно декілька текстових курсорів в текст документа і переміщувати їх незалежно один від одного.

Текстовий курсор позначає певне міце в тексті документа і може переміщуватися завдяки своїм методам. Основні з них:

  • goLeft (Count, Expand) – перехід на Count символів вліво;
  • goRight (Count, Expand) – перехід на Count символів вправо;
  • gotoStart (Expand) – перехід на початок текстового документа;
  • gotoEnd (Expand) – перехід в кінець текстового документа;
  • gotoStartOfWord (Expand) – перехід на початок слова;
  • gotoEndOfWord (Expand) – перехід в кінець слова;
  • gotoNextWord (Expand) – перехід до початку наступного слова;
  • gotoPreviousWord (Expand) – перехід до початку попереднього слова;
  • gotoStartOfSentence (Expand) – перехід на початок речення;
  • gotoEndOfSentence (Expand) – перехід в кінець речення;
  • gotoNextSentence (Expand) – перехід до початку наступного речення;
  • gotoPreviousSentence (Expand) – перехід до початку попереднього.

Аналогічні 4 методи є також для переміщення курсора в сукупності абзаців (Paragraph).

Усі методи переміщення мають логічний (Boolean) параметр Expand, який формально називають “виділенням” і кажуть що він визначає чи виділяється пройдена область. Насправді ж він вказує чи записується пройдений фрагмент тексту в текстовий курсор чи ні, точніше, не в сам курсор а у його властивість String. Усі методи переміщення, крім здійснення переміщення, повертають результат типу Boolean, який вказує чи було переміщення успішним, його значення використовують для формування умов завершення циклів, пов’язаних з переміщенням по тексту. Так в наступному прикладі переміщення курсора по тексту продовжується доки методу gotoNextWord повертає значення True внаслідок успішного переходу до початку наступного слова.

Sub TextCursorSample()
Dim n As Integer
Dim Cursor As Object
n = 0
Cursor = ThisComponent.Text.createTextCursor
Do
n = n + 1
Loop While Cursor.gotoNextWord(False)
MsgBox “Кількість слів “ & n
End Sub

Наведений приклад можна вважати макросом для підрахунку кількості слів у документі, хоча, якщо текст міститиме “висячі рядки” (тобто порожні абзаци), вони будуть враховані в кількість n переміщень курсора до наступного слова.
За допомогою текстових курсорів можна здійснювати форматування тексту, так само, як і за допомогою переліку абзаців, оскільки сервіс com.sun.star.text.TextCursor подтримує ті ж властивості форматування абзаців та символів, що і сервіс com.sun.star.text.Paragraph.