Download: ProgramowanieOO

Transkrypt

Download: ProgramowanieOO
Programowanie w OpenOffice
PROGRAMOWANIE
Tworzenie makr OpenOffice w Basicu
MASOWA PRODUKCJA
W pakiecie biurowym OpenOffice można wykorzystywać
różnorodne skrypty i makra automatyzujące powtarzalne zadania.
Najprostszym podejściem jest wykorzystanie zintegrowanego
dialektu Basica. Ten artykuł pozwoli Ci zaznajomić się z tym dość
specyficznym językiem programowania.
OLIVER FROMMEL
J
eśli często wykonujesz w OpenOffice powtarzające się, złożone operacje, być może nadszedł czas utworzenia makra.
OpenOffice oferuje różnorodne narzędzia programistyczne. W wersji 1.1 wprowadzono koncepcję pomostów, pozwalających na dodawanie własnych programów pisanych w C, C++,
Javie lub Pythonie. W wersji 2.0, która ma niebawem być wydana, podstawowy pakiet OpenOffice będzie obsługiwać interfejs CLI
(Common Language Interface), umożliwiający dołączanie programów napisanych w językach Javascript i C#. Ze wszystkich języków
dostępnych w OpenOffice, najłatwiejszym jest
zapewne Basic. Ten artykuł omawia, jak zacząć pisanie makr OpenOffice w Basicu.
Zaczynamy
Programowanie rozpoczynamy od wybrania
menu Tools | Macros, które ma dwie pozycje:
Record macro – interaktywny rejestrator
makr, i pozycję Macro..., otwierającą nowe
okno (Rysunek 1).
W oknie możemy zarządzać makrami –
tymi dostępnymi w dystrybucji OpenOffice,
jak również własnymi. Programy Basica
mają przypisane moduł i bibliotekę, do-
myślnie Module1 i Standard. Nowy moduł
zawsze będzie zawierał metodę Main, która
jest po prostu pustym szkieletem bez żadnego kodu. Kliknięcie na Edit otwiera edytor, w którym widzimy pusty szkielet funkcji (Rysunek 2).
Teraz można korzystać ze wszystkich
możliwości Basica. Pomoc do OpenOffice
Basic możemy otworzyć, wybierając Help |
Contents. Listę funkcji znajdziemy w Macros and Programming | Commands | Alphabetical list...
Dodaj teraz poniższy kod na początku
szkieletu programu:
Sub Main
Output = „Teraz jest " & Time()
MsgBox Output, 0
End Sub
Rysunek 1: Okno do zarządzania makrami OpenOffice Basic.
WWW.LINUX-MAGAZINE.PL
Słowo kluczowe Sub oznacza funkcję, tu
zwaną Main. W rzeczywistości OpenOffice
nie interesuje się zbytnio nazwami i analizuje od pierwszej funkcji, którą znajdzie w module makra. Output jest ciągiem znaków zawierającym część stałą „Teraz jest”, i wartość
zwracaną przez funkcję Time (), czyli aktualną godzinę. Operator & łączy te części w jeden ciąg. Można pominąć nawiasy w wywołaniu funkcji Time. Nie mają one żadnego
wpływu na działanie funkcji.
NUMER 15 KWIECIEŃ 2005
77
PROGRAMOWANIE
Programowanie w OpenOffice
Rysunek 2: Jak widać we wbudowanym edytorze, w nowych makrach OpenOffice generuje
pustą funkcję Main.
Na końcu funkcja MsgBox wyświetla
okienko dialogowe. W pierwszym parametrze przekazywany jest tekst do wyświetlenia,
drugi oznacza typ okienka. Wartość 0 w tym
przykładzie oznacza, że okienko będzie zawierać tylko przycisk OK. Wartość 1 dodałaby jeszcze przycisk Anuluj. Istnieje wersja
z przyciskami Tak/ Nie i inne kombinacje.
MsgBox zwraca wartość informującą, który
przycisk naciśnięto. W naszym przykładzie
wartość ta nie jest brana pod uwagę.
Ten dokument
Proste funkcje Basica nie wystarczą, jeśli
chcemy mieć dostęp do dokumentów OpenOffice'a, gdyż w tym celu musimy odwoływać się do obiektów UNO i interfejsów (zob.
Ramka 1: Złożone UNO, prosty Basic). Naszym punktem dostępowym do hierarchii
obiektów jest słowo kluczowe ThisDocument,
odnoszące się do dokumentu, w którym uruchomiono skrypt - może to być dokument
tekstowy, arkusz kalkulacyjny albo nawet rysunek. ThisDocument jest nadrzędnym obiektem udostępniającym podstawowe metody
służące do nawigacji po drzewiastej strukturze dokumentu.
Jednak zanim do tego dojdziemy, zadeklarujmy kilka zmiennych. Nie jest to obowiązkowe, ale niezbyt trudne. Posłuży nam do tego słowo Dim. Liczba elementów listy (tablicy) musi być podana w nawiasach okrągłych
(10). Konwencja Basica różni się tu od przyjętej w większości innych języków programowania: parametr nie oznacza liczby elementów, tylko ostatni indeks. Tak więc List (10)
to lista 11-elementowa, od List (0) do list (10)
– jak widać, wielkość liter nie ma znaczenia.
Po otrzymaniu referencji do dokumentu
skrypt sprawdza, czy jest to dokument tekstowy. Do tego celu wywołujemy metodę supportsService () na rzecz referencji do dokumentu:
Usługa tekstowa zawiera też funkcję createEnumeration (), która wylicza akapity dokumentu, ale nadal nie dostajemy czystego
tekstu. Zamiast tego, akapity mają około 150
właściwości dokładnie opisujących m.in. styl
akapitu.
Wywołując createEnumeration (), możemy
uzyskać dostęp do zwykłych elementów tekstowych akapitu. Jeśli dokument zawiera tablicę, OpenOffice pokaże tu komunikat
o błędzie, gdyż createEnumeration nie rozpoznaje elementów tablicowych. Na taką
ewentualność musimy obsłużyć pewne wyjątki.
Metoda String () zwraca nam czysty tekst
elementu. Do przeglądania wyliczeń w Basicu wykorzystuje się konstrukcję pętli zaczynającą się od Do, a kończącą się na Loop. Warunek przerywający można podać przy którymkolwiek z tych słów kluczowych. Jeśli
oDoc = ThisComponent
If oDoc.supportsService("com.§§
sun.star.text.TextDocument") §§
Then
Rysunek 3: Makro Xray jest przydatne do
Oprócz tej metody, obiekt dokumentu posiada też obiecująco wyglądającą funkcję o
nazwie getText(). Funkcja ta nie zwraca jednak czystego tekstu dokumentu, ale referencję do usługi tekstowej, która z kolei ma kilka metod, w tym metody do przemieszczania
kursora po tekście (createTextCursor).
rozwiązywania problemów. Wyświetla
właściwości obiektu UNO w Basicu.
wyjście następuje na końcu pętli, skrypt
przejdzie przez polecenia wewnątrz pętli co
najmniej raz.
Ramka 1: Złożone UNO, prosty Basic
OpenOffice obsługuje Basica bezpośrednio,
dzięki czemu nie są potrzebne zewnętrzne interfejsy. Choć sam język Basic nie jest czymś
bardzo skomplikowanym, to do pracy ze złożoną architekturą OpenOffice'a potrzebne będą
pewne zaawansowane struktury tego języka.
UNO w programowaniu w OpenOffice.
OpenOffice ma niezależny od języka interfejs
programowania, zwany UNO (Universal Network Objects, uniwersalne obiekty sieciowe).
UNO stosuje się do obecnych paradygmatów
tworzenia oprogramowania (w tym obsługuje
tak zwane wzorce projektowe [2], usługi i interfejsy). Masa dokumentacji dla programistów [3] i opisów API [4] świadczy o znaczeniu
OpenOffice Basic nie obsługuje wszystkich
możliwości UNO, gdyż język Basic jest dość
prosty. Na przykład w Basicu nie ma złożonych
typów danych, takich jak skróty (hash), które
przypisują wartości słowom kluczowym. Ten
brak skrótów sprawił, że to, o czym początkowo myślałem, że będzie prostym przykładem,
okazało się być trudne do zaprogramowania:
skrypt zliczający wystąpienia danego słowa
w tekście. Skrót (tablica przyporządkowująca)
z poszukiwanym słowem jako kluczem byłby
w tym przypadku idealnym rozwiązaniem. Ale
w języku OpenOffice Basic wymagałoby to du-
NUMER 15 KWIECIEŃ 2005
WWW.LINUX-MAGAZINE.PL
78
żego nakładu programistycznego; trzeba by
było zaimplementować własną tablicę mieszającą, co daleko wykracza poza treść niniejszego artykułu.
W przeciwieństwie do języka OpenOffice Basic, główny interfejs UNO jest obiektowy. Te
przeciwstawne podejścia prowadzą do kilku
osobliwości: na przykład niektóre metody są
bezpośrednio mapowane do właściwości. Innymi słowy, programista nie musi wywoływać
funkcji takiej jak circle.radius (), ale może bezpośrednio użyć atrybutu circle.radius.
W praktyce powoduje to niejasności w aplikacjach używających obu zapisów.
Programowanie w OpenOffice
Listing 1: Prosty eksporter tekstu
Sub Main
Dim oDoc As Object
Filename = "/home/oliver/U
output.txt"
oDoc = ThisComponent
title$ = oDoc.DocumentInfo.Title
If oDoc.supportsServiceU
("com.sun.star.text.TextDocument")U
Then
FileNo = Freefile()
Open Filename For Output AsU
#FileNo
oText = oDoc.getText()
oParagraphs = oText.U
createEnumeration()
Do While oParagraphs.U
hasMoreElements()
Nasze przykładowe makro zapisuje do pliku dane tekstowe odczytane tą metodą. Nazwę pliku określa zmienna Filename. Co niezwykłe, do otwarcia pliku potrzebny jest jego
numer. Zwraca go funkcja Freefile(). Teraz
możemy przekazać numer pliku i jego nazwę
do Open(), i otworzyć plik do zapisu:
Open Filename For Output §§
As #FileNo
Polecenie Print z numerem pliku jako
pierwszym parametrem pozwala dodawać li-
oPar = oParagraphs.U
nextElement()
oTexts = oPar.U
createEnumeration()
Do While oTexts.U
hasMoreElements()
oText = oTexts.U
nextElement()
Print #FileNoU
oText.string
If oText.string = ""U
Then
Print #FileNo
Endif
Loop
Loop
Endif ' If oDoc.supportsServiceU
(..)
Close #FileNo
End Sub
nie do pliku: Print #FileNo String. Bez tego
numeru wywołanie Print powoduje, że OpenOffice pokazuje okienko dialogowe. Po dodaniu linii musimy zamknąć plik. Służy do
tego wywołanie Close z numerem pliku jako
argumentem.
Pełne makro ukazuje Listing 1.
Żeby uruchomić skrypt, kliknij na drugim
od lewej przycisku w drugim rzędzie (zob.
Rysunek 2). Ten przycisk uruchamia skrypt
w bieżącym dokumencie. Jeśli OpenOffice
napotka błąd składni, natychmiast powiadomi o błędzie podczas wykonywania, wyświe-
Ramka 2: Zaawansowane poprawianie
Wbudowany debuger jest przydatny tylko w przypadku prostych typów Basica. Ponieważ typy OpenOffice UNO nie mają bezpośrednich odpowiedników wśród typów języka Basic, debuger wyświetla jedynie znaki zapytania w przypadku obiektów UNO. Inne metody dają więcej informacji, ale
wymajagą trochę programistycznego wysiłku. Na przykład, dość przydatne jest wywoływanie
Dbg_supportedInterfaces () i Dbg_methods () jako metody obiektu.
Makro Basica może ułatwić wyszukiwanie błędów. Takie makro wyświetla okno z metodami i właściwościami badanego obiektu UNO.
Makro to trafnie nazywa się Xray [6], bo rzeczywiście pozwala zajrzeć w głąb obiektu (Rysunek 3).
Rozpakowawszy plik Zip, załaduj dokument w OpenOffice i postępuj zgodnie z instrukcjami.
Wszystko, co trzeba zrobić, to przypisać makro Xray do dokumentu, nad którym pracujesz (Macro
| Organizer, następnie Libraries). Aby prześwietlić obiekt, dodaj do swojego skryptu linię tego typu: Xray. Xray oDoc.
Na stronie XRay-a znajdziemy jeszcze jeden przydatny dokument – zbiór fragmentów skryptów [7]
z objaśnieniami autora książki o makrach, Andrew Pytonyaka.
WWW.LINUX-MAGAZINE.PL
PROGRAMOWANIE
tlając stosowne okienko dialogowe. Niestety,
komunikaty są zwykle dość ogólne i nie bardzo się nadają do wyszukiwania błędów (np.
„zmienna obiektowa nie została przypisana”). Jeśli spróbuje się uruchomić skrypt,
gdy dokumentem bieżącym jest pomoc, wystąpi „błąd ogólny”.
Przyciski z nawiasami klamrowymi pozwalają na pracę krokową. Można zaznaczyć
nazwę zmiennej i kliknąć na przycisku
z okularami, aby mieć pogląd na wartość
zmiennej w polu Watch w lewej dolnej części
okna – jak wyżej, spotykamy się tu z pewnymi ograniczeniami. Więcej o debugowaniu
znajdziesz w Ramce 2, „Zaawansowane poprawianie”.
Na zakończenie
Interfejs UNO w OpenOffice dla autorów
skryptów jest użytecznym zestawem narzędzi
do aplikacji biurowych. Jednak programowanie w OpenOffice nie jest rzeczą tak intuicyjną, jak komuś by mogło się wydawać. System
jest tak skomplikowany jak CORBA [8] albo
J2EE [9], i wymagana jest wiedza o współczesnych pojęciach programistycznych, takich
jak architektura komponentowa i wzorce
projektowe.
Umiejętności wstępne, potrzebne do programowania w OpenOffice, są poza zasięgiem wielu zwykłych użytkowników, ale
amatorscy i profesjonalni programiści z wymaganymi umiejętnościami znajdą całe
światy do podboju.
■
INFO
[1] OpenOffice: http://www.OpenOffice.org
[2] Wzorce projektowe: http://en.wikipedia.
org/wiki/Design_pattern_%28computer
_science%29
[3] Podręcznik programisty:
http://api.OpenOffice.org/docs/DevelopersGuide/
DevelopersGuide.htm
[4] Referencja do UNO:
http://api.OpenOffice. org/docs/common
/ref/com/sun/star/module-ix. html
[5] Podręcznik Starbasic firmy Sun: ftp://docs-pdf.
sun.com/817-3924/817-3924.pdf
[6] XRay: http://www.ooomacros.org/dev.
php#101416
[7] Macros explained: http://www.ooomacros.
org/dev.php#91896
[8] CORBA: http://www.corba.org
[9] J2EE: http://java.sun.com/j2ee
NUMER 15 KWIECIEŃ 2005
79

Podobne dokumenty