StarDesktop та керування документами.

З точки зору написання макросів в об’єктній моделі офісних додатків цікавими, в першу чергу, є об’єкти, які дають доступ до документів та їх складових. Головним в цьому наборі завжди є об’єкт який визначає саму програму-додаток, наприклад, Application є головним об’єктом в об’єктній ієрархії додатків Microsoft Office. В Open Оffice для цього використовується сервіс com.sun.star.frame.Desktop і, насамперед, глобальна змінна StarDesktop, яка зберігає посилання на основний об’єкт програми, що підтримує цей сервіс. Цей об’єкт підтримує ще декілька сервісів та багато інтерфейсів, але для початківця достатньо знати, що будь-яке повне звертання до властивостей чи методів об’єктів, з яких складаються додатки Open Office, зазвичай, починається з імені StarDesktop.

Наприклад, конструкція StarDesktop.CurrentComponent дозволяє отримати доступ до активного контейнера (документа чи вікна на екрані), зокрема, макрос:

Sub Main
MsgBox StarDesktop.CurrentComponent.Title

End Sub

якщо його виконати через меню програми із вікна відкритого документа, буде виводити повідомлення з назвою цього документа. Якщо ж спробувати виконати його безпосередньо з вікна редактора OOo Basic, то отримаємо повідомлення “Untitled 1”, оскільки він звертатиметься безпосередньо до вікна редактора, а не до документа.

Схожий функціонал і розбіжності у поведінці дає ще один спосіб звертання до основного контейнера — ThisComponent. Щоправда, в цьому випадку звертання йде до контейнера, в якому міститься макрос і, наприклад, процедура

Sub Main
MsgBox ThisComponent.Title

End Sub

збережена в документі Розділ5.odt буде завжди виводити повідомлення з текстом “Розділ5.odt”. А якщо її скопіювати у загальний шаблон макросів то виконання інструкції ThisComponent.Title спричинятиме помилку оскільки загальний шаблон не має визначеної властивості Title.

Наведені приклади демонструють найпростіші способи звертання макросів до документа: StarDesktop.CurrentComponent та ThisComponent. При використанні StarDesktop.CurrentComponent слід враховувати спосіб запуску макроса, оскільки CurrentComponent задає контейнер, вікно якого відрите на екрані поверх інших вікон і є шанс, що макрос може звернутися не до того об’єкта. Використання ж звертання ThisComponent жорстко прив’язує виконання макроса до документа, в якому його збережено і, насамперед, робить його менш універсальним, в цьому випаду немає сенсу зберігати макрос в загальному шаблоні.