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