2009 06 Macro w służbie autora [Open Office]


Open Office
Macro w służbie autora
Macro w służbie autora
Grzegorz Madajczak
Praca autora artykułów do Linux+ ma swoje blaski i cienie. W moim przekonaniu niezbyt przyjemnym
etapem pracy jest konieczność otagowania tekstu przed wysłaniem go do druku. Ja tę czynność
postanowiłem sobie uprościć, stosując zestaw makr w OpenOffice Word, które znacząco automatyzują
ten proces, zmniejszając zarówno nakład pracy, jak i uprzyjemniając tę, którą musimy wykonać.
ęzyk Makr OpenOffice.org (OOo) powstał na bazie ję- Jednak w porównaniu do VisualBASICa  działającego tylko
zyka programowania BASIC, podobnie jak język Vi- pod Windows, mogą one być wykorzystane w każdym syste-
sual BASIC stosowany jako język makropoleceń w mie operacyjnym, w którym działa OpenOffice.org  niezależ-
Jpakiecie MS Office, a także AppleScript w systemie nie od zainstalowanej wersji.
MacOS X. Pomimo iż języki te, a zwłaszcza OOo BASIC i Vi-
sual BASIC, pochodzą od tego samego przodka, to nie są one Trochę podstaw
wzajemnie kompatybilne, choć istnieją projekty pozwalające Nie każdy z korzystających z OpenOffice.org, nawet w najbar-
na pewne przenoszenie makr pomiędzy tymi językami. dziej zaawansowany i profesjonalny sposób, zna język OOo
Cechą charakterystyczną OOo BASIC jest jego niesamo- BASIC. Wynika to po prostu z jego potrzeb. Warto jednak za-
wita prostota, która czasami, moim zdaniem, jest największą znajomić się z tym językiem, gdyż w pewnym momencie sa-
wadą tego języka. Jednak narzekając na ograniczenia OOo BA- modzielnie napisane makra staną się nieodzowne w codzien-
SICa, należy wziąć pod uwagę cel, dla którego powstał  budo- nej pracy z tym pakietem biurowym. Zanim zaczniemy praco-
wanie krótkich procedur upraszczających i automatyzujących wać z makrami, należy pamiętać, iż ich stosowanie wiąże się z
pracę w OOo, nie zaś do budowania skomplikowanych wie- zagrożeniem w postaci wirusów. Z tego też powodu domyśl-
lowątkowych aplikacji. Aby sprostać temu drugiemu zadaniu, nie obsługa makr w OpenOffice jest wyłączona. Aby to zmie-
OOo udostępnia IDE, które może być wykorzystane do two- nić, należy zmodyfikować ustawienia bezpieczeństwa. Dostęp
rzenia makr, nawet najbardziej rozbudowanych, w innych języ- do tych ustawień uzyskujemy poprzez menu Narzędzia, pozy-
kach programowania: JavaScript, Python oraz JAVA. Ja w tym cję Opcje. W oknie ustawień pakietu OpenOffice wybieramy
artykule skupię się na wykorzystaniu OOo BASICa do automa- pozycję Bezpieczeństwo, a następnie klikamy przycisk Bezpie-
tyzacji pracy w pakiecie biurowym OpenOffice.org, a zwłasz- czeństwo makr. Zalecanym poziomem bezpieczeństwa jest Po-
cza w programie OOo Writer. Opisywane w tym artykule ma- ziom średni. Jednak jeśli mamy pewność, że uruchamiane ma-
kra były tworzone za pomocą OOo w wersji 3.0.0 w Gentoo. kra pochodzą od zaufanych dostawców (tj. są całkowicie bez-
66 czerwiec 2009
linux@software.com.pl
Open Office
Macro w służbie autora
pieczne), możemy ustawić Niski poziom bezpie- daj, następnie w kolejnym oknie z pola Kate- Oficjalnie nazwy zmiennych mogą mieć dłu-
czeństwa. Wtedy to wszystkie makra będą auto- gorie należy wybrać pozycję Makra OpenOffi- gość do 255 znaków, lecz nie wydają mi się być
matycznie uruchamiane bez pytania się o pozwo- ce.org, a następnie właściwą bibliotekę i moduł uzasadnione tak długie nazwy. Jak już wielokrot-
lenie. Należy pamiętać, że makra takie mają bez- zawierający makro, do którego chcemy utworzyć nie zaznaczałem, nazwy zmiennych nie różnicu-
graniczny dostęp do plików, zgodnie z uprawnie- skrót. Po wybraniu modułu w prawym polu Pole- ją małych i dużych liter, więc zmienna oznacza
niami użytkownika, który je uruchamia. Tak więc cenia pojawią się wszystkie makra w danym mo- dokładnie to samo co ZMIENNA. Nazwy zmien-
root, stosując makra OOo, może nawet modyfi- dule. Wybór właściwego makra należy potwier- nych nie powinny zawierać spacji, a jeśli już, to
kować i kasować pliki systemowe, których obec- dzić klikając przycisk Dodaj. Spowoduje to do- nazwę zmiennej należy zamknąć w nawiasach
ność i poprawność jest krytyczna dla działania danie skrótu do makra na modyfikowanym pa- kwadratowych, co jednak nie jest dobra praktyką
całego systemu. sku narzędziowym. i z pewnością nie poprawia czytelności kodu. Za-
Makra OOo mogą być przechowywane na miast spacji z powodzeniem można użyć znaku
trzech poziomach: na poziomie bieżącego doku- Jak wygląda makro w OOo BASIC dolnego podkreślenia. Nazwy zmiennych mogą
mentu, w przestrzeni użytkownika (makra użyt- Każde makro stanowi podprogram (Subrouti- zawierać cyfry, lecz nie na początku nazwy, nie
kownika) oraz jako makra pakietu OpenOffi- nes), którego klamrą są dwa polecenia: Sub na- mogą natomiast zawierać znaków specjalnych
ce.org  dostępne dla wszystkich użytkowni- zwa_makro oraz End Sub. Nazwa makro musi (np. kropka, przecinek, ukośnik, myślnik itd).
ków pakietu na danym komputerze. Makra bie- być jednym wyrazem, najlepiej bez polskich zna- Do lokalnego deklarowania zmiennych w
żącego dokumentu przechowywane są w konte- ków. W OOo Basic możliwe jest również tworze- OOo BASICc służy polecenie DIM. Domyślnie
nerze dokumentu. Przypomnę, że zarówno pliki nie funkcji (Function), czyli poleceń (podprogra- brak jest deklaracji typu zmiennej, co można zro-
OOo w wersji 1.x, jak i pliki ODF (stosowane mów), których zasadniczym celem jest zwróce- bić poprzez polecenie AS nazwa_typu, Domyśl-
od wersji 2.x) są skompresowanymi zipem fol- nie jakiejś wartości. na zmienna jest typu Variant, co oznacza dowol-
derami o ściśle określonej strukturze. Znajduje ny typ danych. W jednym poleceniu Dim moż-
się tam między innymi folder Basic ,zawierają- Podstawy OOo BASIC na zadeklarować kilka zmiennych, dla każdej z
cy makra zapisane w danym dokumencie. Makra OOo BASIC charakteryzuje się łatwą do zrozu- osobna ustanawiając ten sam lub inny typ. Jed-
użytkownika są przechowywane w jego folderze mienia składnią, dość swobodnym podejściem norazowe podanie typu zmiennej nie nadaje te-
domowym, w katalogu .ooo3 (lub .ooo-2.0 dla do sposobu pisania poleceń (np. brak zróżnico- go typu wszystkim zmiennym zadeklarowanym
starszej wersji pakietu), w folderze user/basic. wania na małe i duże litery). Dość typową ce- w danej linii. Brak deklaracji typu zmiennej trak-
Tam zlokalizowane są foldery odpowiadające bi- chą dla BASIC jest to, że ten język interpretowa- towane jest jako deklaracja typu Variant. W przy-
bliotekom (np. domyślny folder Standard od- ny (nie kompilowany, jak np. Java) wykonywa- padku zmiennych typu String, możliwe jest wsta-
powiadający bibliotece Standard. Przechowy- ny jest linia po linii  jedna linia poleceń jedno- wianie znaku $ bezpośrednio po nazwie zmien-
wane tam pliki z rozszerzeniami *.xlb, *.xba razowo. Oznacza to, że nie można dłuższych po- nej zamiast As String. Obie formy są równo-
są zwykłymi plikami XML, które można edyto- leceń przenosić do nowej linijki. Jeśli polecenie znaczne. W przypadku zmiennych typu Double,
wać w każdym edytorze tekstu. Jednak nie zaleca nie mieści się na ekranie, można na końcu dodać w podobny sposób używamy znaku #. Znaki dla
się tego robić, gdyż błędna składnia tak wprowa- znak _, który oznacza kontynuację polecenia w innych typów danych podane zostały w Tabeli 1.
dzonego kodu uniemożliwi jego otwarcie w IDE następnym wierszu.
OOo, a także korzystanie z tychże makr. Ograniczeniem powyższej zasady jest zakaz Listing 1. Wygląd makro w OOo BASIC
OpenOffice dostarcza bowiem wygodne w łamania linii wewnątrz bloku tekstu objętego cu- Sub moje_makro
użyciu środowisko programistyczne służące do dzysłowem. Znacznym udogodnieniem w pisa- print ''Witaj!''
pisania i debugowania makr napisanych w OOo niu, poprawiającym czytelność kodu OOo Basic, End Sub
BASICu. Uruchamiamy je poprzez menu Narzę- jest możliwość definiowania wielu zmiennych w Function nazwa_funkcji(dbl) As
dzia | Makra | Zarządzaj makrami | Makro. W jednej linii przez rozdzielanie ich dwukropkiem. Double
otwartym w ten sposób oknie (Rysunek 1) moż- Do wstawiania pojedynczej linii komentarza nazwa_funkcji = dbl * 2
na wybrać bibliotekę oraz moduł. Jeśli dokument służy polecenie REM, przy czym, jak wcześniej End Function
nie posiada makr, przycisk Nowy służy do utwo- zaznaczyłem, nie ma znaczenia wielkość uży-
rzenia biblioteki, jak i modułu. W głównej części tych znaków, czyli napisanie rem, REM, a nawet Listing 2. Przenoszenie polecenia do kolejne-
tak otwartego IDE wyświetlony jest kod makr w rEm, będzie tak samo interpretowane. Dla czytel- go wiersza
danym module. ności kodu i tak zwanej dobrej maniery progra- Sub Main
Najszybszym sposobem uruchomienia ma- mistycznej proponuję nie mieszać małych i du- Dim d1, d2, d3, d4, d5, d6, d7, _
kra jest skorzystanie z menadżera makr, wybie- żych znaków w ostatni sposób. d8, d9, d10, d11, d12, d13
rając pozycję Wykonaj makro z menu Narzędzia Tradycyjnie we wszystkich językach progra- End Sub
| Makra. Z otwartego w ten sposób okna nale- mowania, pierwszym programem, skryptem, jaki
ży wybrać makro, które chcemy uruchomić. Je- uczymy się pisać, jest wyświetlenie tekstu Hel- Listing 3. Deklarowanie zmiennych przy użyciu
śli jednak dane makro będziemy wykorzystywa- lo World. Nie będę odbiegał od rutyny i zapro- dwukropka
li wielokrotnie, przedzieranie się przez poszcze- ponuję to samo. Sub Main
gólne pozycje menu będzie na dłuższą metę mę- W pierwszej linii utworzyliśmy makro o na- Dim d1, d2, d3, d4, d5, d6, d7, _
czące. Można tego uniknąć tworząc na pasku na- zwie helloworld. Drugą linię zajmuje komentarz. d8, d9, d10, d11, d12, d13
rzędziowym skrót do wybranego makro. W tym Trzecia linia makra jest najważniejsza. W niej d1=1 : d2=2 : d3=3 : d4=4 : d5=5
celu z menu paska narzędziowego należy wy- znajduje się polecenie Print wyświetlające okno : d6=6
brać pozycję Dostosuj pasek narzędzi. W otwar- dialogowe z tekstem zawartym w cudzysłowie. End Sub
tym oknie Dostosuj należy kliknąć przycisk Do- Ostatni wiersz zamyka makro.
www.lpmagazine.org 67
Open Office
Macro w służbie autora
Istnieje jeszcze możliwość krótkiego deklarowa- nie zaś 20. Aby przekształcić dane tekstowe na tekst_dokumentu = ThisComponent.Cur-
nia niektórych typów zmiennych za pomocą jed- dane typu liczbowego, należy użyć jednej z funk- rentControler.Text
nego polecenia Def . cji opisanej w Tabeli 1.
W OOo Basic sterować możemy również Siła makr dla OOo tkwi w tych trzech liter- Należy dodać, iż powyższy obiekt nie ma
zasięgiem zmiennych, to znaczy, na jakim po- kach. UNO (Uniwersalne Obiekty Sieciowe) to właściwości łańcucha znaków (obiektu typu
ziomie one obowiązują. Polecenie Dim deklaru- niezależny od języka programowania interfejs, String). Obiekt ten możemy rzutować na obiekt
je zmienną, która obowiązuje w obrębie modu- pozwalający między innymi na dostęp do obiek- typu String za pomocą polecenia getString().
łu i biblioteki, w której została zadeklarowana, tów występujących w dokumentach OpenOffi- Należy jednak bardzo uważać ze stosowaniem
lecz zgodnie z jej lokalnym zasięgiem (np. dzia- ce.org. OOo BASIC oczywiście również korzy- tej metody ze względu na ograniczenie co do
ła tylko w obrębie funkcji, pętli for  zgodnie z sta z UNO, lecz ze względu na swą prostotę je- maksymalnej długości łańcucha znaków. Li-
powszechnie przyjętymi zasadami). Szerszy za- dynie w ograniczonym stopniu. Jednak dla prze- mit ten narzucony przez ograniczenia standar-
sięg ma polecenie Global, przy użyciu którego ciętnego programisty, chcącego napisać makro du UNICODE wynosi nieco ponad 65 tysięcy
utworzymy zmienną, z której będzie można ko- dla OOo  dostępne funkcje są wystarczające. znaków. Przy standardzie czterech i pół tysię-
rzystać we wszystkich modułach i bibliotekach. Dzięki UNO programista OOo BASIC ma moż- cy znaków na stronę (tekstu w postaci jedne-
Przeciwieństwem deklaracji zmiennej global- liwość korzystania ze wszelkich elementów ak- go akapitu na całą stronę, czcionki Times New
nej jest zmienna utworzona za pomocą polece- tualnie edytowanego dokumentu, np. tekstu czy Roman, 12pt, odstęp 1 wiersz) stanowi to oko-
nia Private. Jest ona widoczna tylko w obrębie komórek tabeli. ło czternaście stron tekstu, co nie jest znaczącą
modułu, w którym została utworzona. Inicjaliza- ilością. Jak więc widać, obiekt typu String nie
cja zmiennej Global następuje wraz z kompilo- Okna dialogowe w OOo jest najlepszą formą przechowywania długiego
waniem makra, natomiast zmiennej utworzonej Wraz z OOo Basic do dyspozycji dostajemy bar- tekstu. Ponadto właściwość Text ma tę prze-
przy użyciu poleceń Dim i Private  w trakcie dzo funkcjonalne narzędzie do tworzenia okien wagę nad obiektem typu String, iż przechowuje
uruchomienia makra. dialogowych, które mogą być pózniej wykorzy- więcej informacji  na przykład o stosowanym
Napisałem, że zmienna zadeklarowana bez stywane w tworzeniu własnych makr. Okna dia- formatowaniu czy też implementuje nasłuch na
typu jest domyślnie zmienną typu Variant z do- logowe w OOo można tworzyć za pomocą gra- zdarzenia oraz obsługuje obecność kursora.
wolnym typem danych. Co w sytuacji, gdy chce- ficznego edytora, dostępnego w menu Narzędzia
my przekształcać dane różnych typów? Otóż ję- | Makra | Zarządzaj oknami dialogowymi. Wy- Przybornik autora
zyk OOo BASIC jest w tym względzie bardzo wołanie tej funkcji sprawi, że otwarte zostanie Nadszedł czas, aby po pobieżnym zaznajomieniu
elastyczny, do czego trudno jest się przyzwycza- znane już nam okno zarządzania makrami, lecz się z językiem OOo BASIC zabrać się do praw-
ić programistom Java czy C++ (nawiązuje do tym razem z aktywną zakładką Okna dialogowe. dziwej pracy  pisania makr. Ja stworzyłem bi-
tych dwóch języków, ponieważ akurat te znam). Jak poprzednio, w oknie tym będziemy mieli do- bliotekę makr, które przydadzą się wszystkim
W OOo BASIC w bardzo łatwy sposób można stęp do wszystkich okien dialogowych, które zo- osobom piszącym artykuły do Linux+. Pozwala-
rzutować jedne typy danych na drugie za pomocą stały utworzone w systemie. Również tutaj są one ją one na zautomatyzowanie procesu wstawiania
odpowiednich funkcji przekształcających. Funk- podzielone na kategorie odpowiadające katego- znaczników (tagów) do tekstu. Całość składa się
cje te mają znaczenie zwłaszcza w przypadku ob- riom makr. Naciśnięcie przycisku Nowy lub Edy- z kilkunastu makr, z czego dziewięć wywoływa-
sługi formularzy. Dane pochodzące z takiego po- tuj (jeśli wybierzemy już istniejące okno dialogo- nych jest bezpośrednio. Korzystać można z nich
la są zawsze typu tekstowego. Sumowanie za- we) otworzy okno edycji okna dialogowego. W w dwojaki sposób. Przede wszystkim wszyst-
wartości tych pól będzie się odbywało w ten spo- rzeczywistości do okna edycji makr została do- kie makra zebrałem w postaci okna dialogowe-
sób, że będą połączone w jeden łańcuch teksto- dana zakładka z nazwą utworzonego lub wybra- go (Rysunek 1), z którego można wywołać każdą
wy. Np. zawartość pola 1 to 10, pola nr 2 to 10, nego do edycji okna dialogowego. Rozwiązanie z dostępnych funkcji. Wadą takiego rozwiązania
a wynik sumowania zawartości tych pól to 1010, takie pozwala nam w łatwy sposób przełączać się jest fakt, iż okna dialogowe w OOo obligatoryj-
pomiędzy edycją okien a edycją kodu makra. Do nie mają charakter modalny, co oznacza, iż akty-
Listing 4. Komentarze w OOo BASIC tworzenia okna dialogowego wykorzystywane są wacja takiego okna blokuje dostęp do głównego
Sub Main standardowe elementy formularza OOo. okna programu (jest ono nieaktywne).
REM To jest komentarze Przyznaję, że jest to mało komfortowa sytu-
rem To również jest komentarz Dokument OpenOffice.org acja. Z konsultacji na forach dyskusyjnych do-
End Sub API OOo BASIC w prosty sposób umożliwia do- wiedziałem się, że problem ten miał być rozwią-
stęp użytkownikowi do aktywnego dokumentu zany w OOo 3.0, co jednak się nie stało. Dewelo-
Listing 5. Pierwsze makro w OOo BASIC poprzez obiekt będący referencją interfejsu UNO perzy projektu tłumaczą, iż na razie nie jest moż-
Sub helloworld ::com::sun::star::lang::XComponent. Wywoła- liwe jest stworzenie okien dialogowych nie-mo-
REM To jest komentarz nie aktywnego obiektu, bez znaczenia, czy jest to dalnych, gdyż może zachwiać to stabilnością
Print "Hello World!" dokument Writera, czy arkusz Calca, odbywa się programu. W zamian, niezależni deweloperzy na
End Sub poprzez polecenie ThisComponent.Current- stronach forum OpenOffice.org proponują dość
Controler. W opisywanych poniżej makrach karkołomne rozwiązanie  stworzenie kontene-
Listing 6. Deklarowanie zmiennej obiekt ten, będący reprezentacją dokumentu, bę- ra w języku JAVA, a następnie umieszczenie w
Sub Main dzie wykorzystywany wielokrotnie. W przypad- nim widgetów (pól formularza, elementów gra-
Dim [nazwa zmiennej ze spacjami] ku dokumentu tekstowego programu OOo Wri- ficznych, itd.) komunikujących się z dokumen-
[nazwa zmiennej ze spacjami] = 1 ter obiekt ten posiada właściwość Text będącą tem OOo za pomocą wspomnianego wyżej me-
End Sub odzwierciedleniem samego tekstu w opisywa- chanizmu UNO. Powyższy dyskomfort używa-
nym dokumencie. nia okien dialogowych może być usunięty po-
68 czerwiec 2009
Open Office
Macro w służbie autora
przez zastosowanie opisanego uprzednio sposo- chanizmu obsługi kursorów w OOo jest rozróż- nych makrach GetLeftMostCursor oraz GetRi-
bu dodawania do paska narzędziowego skrótów nienie dwóch jego typów. Oprócz wspomniane- ghtMostCursor.
do makr. Ja w tym celu utworzyłem osobny pa- go w poprzednim akapicie kursora tekstowego, We wspomnianym makrze setTags do
sek narzędziowy, do którego dodałem skróty do API OOo dostarcza jeszcze kursor widoczny  in- wstawienia tekstu  tu znacznika otwierającego
odpowiednich makr, a następnie, aby było ładniej terfejs UNO com::sun::star::text::XViewCursor. lub zamykającego sekcję  wykorzystana została
i wygodniej  przypisałem do nich ikonki. Roz- Jaka jest różnica pomiędzy obydwoma interfej- metoda insertString(XTextRange, String,
wiązanie to prezentuje Rysunek 2. Tak przygoto- sami? Kursor widoczny, jak sama nazwa wska- boolean). Metoda ta wymaga trzech argumen-
wane skróty do makropoleceń działają niezawod- zuje, jest odzwierciedleniem kursora migające- tów. Pierwszy z nich to zakres tekstu (interfejs
nie i wygodnie  jest to zdecydowanie lepsze roz- go (na przykład) gdzieś w tekście, gdzie aktual- UNO ::com::sun:: star :: text::XTextRange), któ-
wiązanie, niż modalne okno dialogowe. nie wstawimy go kliknięciem myszki. Kursor ten ry w opisywanym makro został zwrócony z me-
jest więc jedynie punktem, którego współrzędne tody getStart() określającej początek kursora
Wstawianie sekcji można określić za pomocą długości łańcucha po- tekstowego. Zakres ten jest odzwierciedleniem
Pierwszymi makrami, które chciałbym opisać są przedzającego kursor czy długości łańcucha za pozycji, w której będzie wstawiony tekst. Dru-
polecenia wstawiające sekcje oraz . W zasadzie kursorem. W przeciwieństwie do niego kursor gim parametrem jest łańcuch tekstowy, który ma
oba te makra działają w bardzo podobny spo- tekstowy jest kursorem niewidocznym, będącym być wstawiony. Trzecim parametrem jest war-
sób. Przed ich wywołaniem wymagają zaznacze- niczym innym jak wspomnianym uprzednio za- tość logiczna (wartość typu boolean), która okre-
nia fragmentu tekstu, który zostanie poprzedzo- kresem tekstu. Nie należy jednak mylić kursora śla, czy wstawiany łańcuch tekstowy ma zastą-
ny znacznikiem otwierającym i zamykającym. tekstowego z omówionym uprzednio zaznacze- pić zakres tekstu (true), czy poprzedzony tymże
Makra setTitleSection oraz setLeadSection niem, gdyż ono jest właśnie zakresem, na pod- tekstem (false). Należy wspomnieć, iż wstawiany
odwołują się do innego makra setTag, którego stawie którego możemy utworzyć kursor tek- łańcuch tekstowy może zawierać oprócz znaków
zadaniem jest wstawianie na początku i na końcu stowy. Właśnie ta metoda  createTextCursor- drukowanych także znaki typu Whitespaces, np.
zaznaczenia znaczników początku i końca sekcji. ByRange() została wykorzystana w omawia- spację lub tabulator, a także znak łamania wiersza
To zaś makro wykorzystuje z kolei trzy inne ma-
Tabela. 1 Funkcje konwertujące różnego rodzaju dane
kra  isAnythingSelected, GetLeftMostCur-
Funkcja Opis
sor oraz GetRightMostCursor. Pierwsze z tych
CDbl(txt) Przekształca dane tekstowe txt na dane typu Double
makr sprawdza, czy w tekście został zaznaczony
CInt(txt) Przekształca dane tekstowe txt na dane typu Integer
fragment tesktu. Makro to wykorzystuje metodę
getCurrentSelection() interfejsu com::sun::
CLng(txt) Przekształca dane tekstowe txt na dane typu Long
star::lang::XComponent, zwracającą obiekt bę-
CSng(txt) Przekształca dane tekstowe txt na dane typu Single
dący tablicą aktualnych zaznaczeń w tekście.
Int(licz- Przekształca wartość liczbową liczba na wartość typu Integer
ba)
allSelections = ThisComponent.Current
Val(txt) Przekształca dane tekstowe txt na dane typu Double. Funkcja bardzo tolerancyjna w sto-
Controller.getCurrentSelection()
sunku do wartości nienumerycznych.
CStr(obj) Przekształca obiekt obj na dane typu String
Jeśli w danym dokumencie znajduje się tyl-
ko jedno zaznaczenie, to powyższe polecenie
Tabela 2. Znaki specjalne
zwróci jednoelementową tablicę  zawierają-
Znak specjalny Opis
cą dane zaznaczenie. Odwołanie do niego wy-
korzystuje metodę getByIndex(), której para- PARAGRAPH_BREAK Znak łamania paragrafu
metr będzie miał oczywiście wartość 0.
LINE_BREAK Znak łamania wiersza
HARD_HYPHEN Znak twardego łącznika
oSelection = allSelections.getByIndex(0)
SOFT_HYPHEN Ten znak kontrolny określa punkt dzielenia wyrazów. Stosowany,
jeśli słowa zawierające muszą być rozdzielone na końcu wiersza.
Wspomniane makro setTags wykorzystuje po-
HARD_SPACE Wstawia twardą spację (spacja ta nie zmienia rozmiaru podczas ju-
nadto dwa inne makra, które określają początek
stowania wiersza oraz łączy ze sobą dwa wyrazy przy przenosze-
zaznaczenia i jego koniec, co wcale nie jest ta-
niu do nowego wiersza)
ką prostą sprawą, jakby się wydawało. Obydwa
APPEND_PARAGRAPH Wstawia nowy akapit
te makra działają bardzo podobnie. Tworzą one
obiekt Zakres (Range) na podstawie przekaza-
Tabela 3. Znaki specjalne wyrażeń regularnych zastosowane w opisywanych makrach
nego przy wywoływaniu parametru  konkret-
Znak Opis
nego zaznaczenia. Ten z kolei służy do utwo-
* Dowolna liczba znaków, np. a*b odpowiada aab, jak i abbcccb
rzenia innego obiektu  kursora tekstowego
 odwzorowania interfejsu UNO ::com::sun: [abc123] Wyszukuje dowolny ze znaków zapisanych pomiędzy nawiasami kwadratowymi
:star::text::XTextCursor. Kursor ten zwracany
a-z Myślnik oznacza zakres, tu wszystkie litery alfabetu od a do z, lecz 0-9 oznacza wszystkie
jest w zależności od makra  jako skrajny pra-
cyfry
wy lub skrajny lewy kursor.
(abc) Wyszukuje sekwencji abc
Przy tej okazji nie sposób jest nie wspomnieć
/> Koniec wyrazu
o idei kursorów w API OpenOffice.org. Najważ-
[:space:] Wyszukuje dowolny znak typu Whitespace
niejszą kwestią konieczną do zrozumienia me-
www.lpmagazine.org 69
Open Office
Macro w służbie autora
(lf), jak i łamania paragrafu(cr). Makro to zawiera metody jest obiekt powstały na bazie interfejsu nie jedynie plików zakwalifikowanych za po-
również bardzo podobną metodę  insertCon- obsługującego konkretne zdarzenie. Konstruk- mocą rozszerzenia jako pliki graficzne. Innym
trolCharacter(XTextRange,ControlCha- tor takiego obiektu nasłuchu wymaga podania istotnym elementem omawianego makra jest
racter,boolean), która różni się od omawianej dwóch parametrów. Pierwszy z nich to przed- serwis ::com::sun::star::ucb::SimpleFileAccess
uprzednio tym, iż wstawia znak specjalny  jeden rostek metod implementujących daną obsłu- zezwalający na pewne proste operacje na pli-
z przedstawionych w Tabeli 2. gę zdarzeń, drugi zaś to klasa danego zdarze- kach. W naszym przypadku operacją tą będzie
Omawiane makra setTitleSection oraz nia. Na koniec należy dodać makra obsługujące sprawdzenie, czy dany plik jest rzeczywiście pli-
setLeadSection zawierają dodatkowo bardzo zdarzenia  z konkretnymi ustalonymi w kon- kiem, czy też katalogiem (folderem). Służy do
użyteczną funkcję liczenia tekstu, który ma być struktorze przedrostkami. Niesamowitą zaletą tego metoda isFolder(File), która jako para-
wprowadzony do danej sekcji. Jak wiadomo, re- obsługi zdarzeń w OOo BASIC jest łatwość, metr przyjmuje obiekt typu File. W przypadku,
dakcja Linux+ narzuca limit dla tytułu 45 zna- z jaką uzyskujemy dostęp do kontrolki wywo- gdy ma do czynienia z folderem (katalogiem),
ków, a dla wprowadzenia  700 znaków. Oby- łującej zdarzenie  poprzez właściwość Source zwracana jest wartość True. Przyznaję w tym
dwa wspomniane makra poinformują nas, jeśli obiektu zdarzenia (jednej z klas implementują- momencie, że obsługa okna dialogowego wy-
limity te zostaną przekroczone. W tym momen- cych interfejs ::com::sun::star::lang::XEven- boru plików początkowo nastręczyła mi pewne
cie z pomocą przyjdzie nam opracowany prze- tListener). Z podobną łatwością uzyskuje się trudności, łatwe do pokonania, jeśli ma się wie-
ze mnie bardzo prosty edytor tekstu w postaci dostęp do kontenera, na którym umieszczona dzę, którą chcę przekazać teraz. Otóż domyślnie
okienka dialogowego uruchamianego makrem jest dana kontrolka, to jest na przykład do okna okno dialogowe wyboru plików zwraca tablicę
TextEditor. dialogowego, gdzie się znajduje. Służy do tego zawierającą wybrane pliki. Nawet jeżeli pozo-
Zaletą tego prostego edytora jest stały na- właściwość Context. stawimy domyślną możliwość wyboru pojedyn-
słuch co do zmian we wprowadzanym tekście. Nieco bardziej skomplikowana sytuacja ma czego pliku  nadal zwracana będzie tablica, ty-
Za każdą zmianą w polu tekstowym pod polem miejsce w przypadku sekcji <> i le że jednoelementowa. Tablica ta zwracana jest
do edycji pojawia się informacja na temat ak- <>. W tych to sekcjach wymaga- jako efekt wywołania metody getFiles() dla
tualnej liczby znaków. Przyciskiem Wklej tekst ne jest podanie dodatkowych informacji  ta- obiektu okna dialogowego. Tutaj następuje pew-
można wkleić poprawiony tekst do dokumentu kich jak numer tabeli/listingu czy też tytuł. In- na nieścisłość. W przypadku okna z wielokrot-
 w miejscu wstawienia kursora. Warto zwrócić teraktywność makra setTags została rozwiązana nym wyborem, jak w omawianym przykładzie,
uwagę na kod tego makra, gdyż po raz pierw- poprzez zastosowanie okna dialogowego setTe- pierwszym elementem tablicy jest folder, a na-
szy w tym artykule wykorzystane zostaną in- xtDialog oraz funkcji getDialog(), zwracają- stępnie nazwy wybranych plików w obrębie da-
terfejsy: UNO XTextListener i XActionListe- cej wprowadzony łańcuch znakowy. Okno dialo- nego folderu. Jeśli chcemy mieć pełną ścieżkę
ner będące pochodnymi interfejsu ::com::sun: gowe setTextDialog jest zastąpieniem brakują- dostępu do wybranych plików, musimy ręcz-
:star::lang::XEventListener. Zasada stosowa- cego w API OOo gotowego okna dialogowego nie skleić sobie jedno z drugim  istna głupo-
nia nasłuchu zdarzeń w OOo jest bardzo pro- typu INPUT, zwracającego wprowadzony tekst. ta! Tak też robię w omawianym makrze. Posia-
sta. Do danej kontrolki okna dialogowego (czy Na całe szczęście tworzenie okien dialogowych dając już tablicę z plikami obrazków, utworzo-
też innego obiektu UNO) należy przypisać me- w IDE OOo oraz ich obsługa są tak proste, że nie na jest pętla for, która kolejno wywołuje funk-
todę typu add_Listener  różną w zależności od należy specjalnie płakać nad tą stratą. cję openPictureDialog, która jako argumen-
typu obsługiwanego zdarzenia. Parametrem tej ty wymaga podania URL rysunku, nazwy pliku
Spis ilustracji oraz kolejnego numeru rysunku (wartość indek-
Najbardziej skomplikowanym przykładem okna su pętli for). Funkcja ta uruchamia okno dialo-
dialogowego i zestawu makr je obsługujących gowe, w którym wyświetlona zostaje miniaturka
jest okno, które wprowadza spis ilustracji uży- ilustracji oraz pola tekstowe z kolejnym (propo-
tych w artykule. Podstawowym makrem wywo- nowanym) numerem ilustracji, nazwą pliku ilu-
ływanym jako pierwsze w tym celu jest makro stracji i polem do wprowadzenia podpisu do ilu-
ChoosePictureFiles. Makro to tworzy okno stracji. Po zatwierdzeniu przyciskiem Zatwierdz,
dialogowe wyboru plików będące instancją ser- uruchamiane jest kolejne makro  AddPicture-
wisu UNO ::com::sun::star::ui::dialogs::XFi- Section, które odpowiedzialne jest za wstawia-
lePicker. Instancja ta ma dwie odmiany  klasę nie sekcji opisującej rysunek z danymi podany-
OfficeFilePicker oraz SystemFilePicker. Pierw- mi uprzednio w oknie dialogowym.
sza tworzy okno wyboru plików o GUI jak w ca-
łym pakiecie OpenOffice.org, druga zaś korzysta Sekcja w sieci
z systemowego okna wyboru. Zasadniczo nie po- Wstawienie tej sekcji do edytowanego artykułu
winno być różnicy pomiędzy obydwoma klasa- potraktowałem na dwie możliwości. Pierwsza z
Rysunek 1. Okno dialogowe Przybornik autora mi, ale... Ja osobiście zauważyłem na MacOS X nich wykorzystuje mechanizm wyszukiwania
10.5.6 Leopard problemy ze stabilnością System- użytych w tekście adresów internetowych, druga
FilePicker. Nic się nie działo natomiast z Office- zaś wstawia adresy na podstawie podanych da-
FilePicker. nych w oknie dialogowym.
Tworzone przeze mnie okno wyboru plików W przypadku przeszukiwania tekstu pod
ma włączoną właściwość wielokrotnego wybo- kątem adresów internetowych należy uruchomić
ru (setMultiSelectionMode(True)). Dodat- makro SearchHTTP. Makro to jako podstawowy
Rysunek 2. Pasek narzędziowy ze skrótami do opi- kowo, aby ułatwić pracę z tym oknem, ustawi- mechanizm wykorzystuje obiekt oDescriptor
sywanych makropoleceń łem filtr plików zezwalających na wyświetla- będący implementacją interfejsu UNO ::com:
70 czerwiec 2009
Open Office
Macro w służbie autora
:sun::star::util::SearchDescriptor. Obiekt ten stępnie w pętli for, wstawiającej adres wraz z opi- jący tę samą wartość, co wyszukiwana. Jedyną
przeszukuje tekst dokumentu pod kątem wystę- sem podanym w oknie dialogowym. zmianą jaką się tutaj wprowadza jest formatowa-
powania łańcucha znakowego zdefiniowanego Zupełnie inne podejście stosuje makro In- nie  wstawienie czerwonego tła w miejscu po-
we właściwości SearchString (tu przy pomocy WebSection. Ono bowiem wyświetla na samym dwójnej spacji. Błąd ten należy usunąć już oso-
polecenia Witch). Inną właściwością tego obiek- początku małe okno dialogowe, w którym za po- biście. Do ustawienia czerwonego koloru tła zna-
tu jest SearchRegularExpression, której war- mocą suwaka ustala się liczbę adresów, które ma- ków służy właściwość CharBackColor, przypi-
tość True oznacza, że szukany łańcuch jest wy- ją się znalezć w sekcji <>. W kodzie sana do deskryptora zastępującego.
rażeniem regularnym. Jeśli ktoś do tej pory nie tego makro należy zwrócić szczególną uwagę na Ostatnim makrem wykorzystującym wyra-
spotkał się z pojęciem wyrażenia regularnego zaimplementowany nasłuch zdarzenia  zmiany żenia regularne jest makro wyszukujące cudzy-
 nadszedł najwyższy czas, aby to zrobić. Wy- wartości suwaka (XChangeEvent). Wadą kon- słowy drukarskie i adresy http:// i formatujące te
rażenie regularne jest zapisem sekwencji znako- trolki suwaka w OOo jest fakt, iż poza warto- łańcuchy na kursywę.
wej za pomocą specjalnie zdefiniowanych sym- ścią maksymalną i minimalną niewiele więcej
boli, w ten sposób, aby istniała możliwość przy- (poza wyglądem graficznym) da się z nim zro- Inspektor akapitów
najmniej jednokrotnego odnalezienia sekwencji bić. Nie ma na przykład możliwości wyświetla- Ostatnim makrem, które chciałbym przybliżyć
spełniającej założone warunki, co jednak nie jest nia aktualnej pozycji (wartości suwaka). Z tego na łamach tego artykułu jest inspektor akapitów.
konieczne (wyrażenie regularne może nie zostać też powodu zaimplementowany nasłuch wpro- Makro to przegląda akapit za akapitem, wyświe-
odnalezione w przeszukiwanym łańcuchu zna- wadza dynamicznie odczytaną aktualną wartość tla w oknie dialogowym, jaki styl został zastoso-
kowym). Zastosowane przeze mnie wyrażenie suwaka do pola tekstowego. Wciśnięcie przyci- wany dla niego oraz umożliwia zmianę tego sty-
regularne opiera się na zasadzie, iż adres inter- sku Zatwierdz uruchamia kolejne makro  Cre- lu na jeden z trzech: Domyślny, Nagłówek 1 i Na-
netowy rozpoczyna się (przynajmniej powinien) ateDialog. Makro to służy dynamicznemu zbu- główek 2. Makro akapity w swojej konstrukcji
od znaków http:// lub https://, po których nastę- dowaniu okna dialogowego  bez użycia kreatora wykorzystuje metodę createEnumeration(), któ-
puje sekwencja liter, cyfr i/lub innych znaków.  bezpośrednio z kodu OOo BASIC. Jak widać, ra zwraca kolejne tablice kolejnych akapitów.
Wyrażenie regularne odnajdujące adresy inter- nie jest to specjalnie trudne, a daje dużo większe Dostęp do poszczególnych akapitów odbywa się
netowe wygląda następująco: (http[s]*://)[a-z0- możliwości obsługi tak zbudowanego okna dia- za pomocą nextElement(), zwracającego para-
9._%+-/]*\>. Szczegółowe wyjaśnianie znacze- logowego. Okno to zawiera odpowiednią liczbę graf. Wadą metody createEnumeration() jest nie-
nia poszczególnych znaków specjalnych stoso- powtórzeń par pól tekstowych  do których na- możliwość bezpośredniego odwołania się do ko-
wanych w wyrażeniach regularnych przekroczy- leży wprowadzić adres i opis pola. Zatwierdze- lejnego akapitu poprzez index (brak takiej funk-
łoby zakres tego artykułu, skoncentruję się więc nie wpisanych wartości powoduje wstawienie do cji w API OOo).
jedynie na znakach użytych w danym wyraże- tekstu adresów wraz z opisami, z wykorzysta-
niu. Znaczenie poszczególnych znaków przed- niem tych samych metod, jak opisane uprzednio. Podsumowanie
stawia Tabela 3. Mam nadzieję, iż wszyscy piszący artykuły do
Aby przeszukać dokument pod kątem wy- Podwójne spacje, Linux+ zaczną stosować napisane przeze mnie
stępowania zadanej frazy, należy wywołać dla usuwanie cudzysłowów makra. Choć z pewnością nie są one doskonałe,
obiektu ThisComponent jedną z metod, z któ- Mechanizm wyszukiwania za pomocą wyra- to i tak stanowią wyśmienite ułatwienie pracy. In-
rych każda, jako parametr, wymaga podania zde- żenia regularnego stosuje również inne makro ne osoby, które nie skorzystają z tych makr bez-
finiowanego obiektu interfejsu SearchDescrip-  FindDoubleSpaces  wyszukujące w tekście pośrednio, z opisanych przeze mnie przykładów
tor. Metody te są następujące: findFirst()  wy- podwójnych spacji. Makro to jednak wykorzy- będą mogły czerpać wiedzę w zakresie stosowa-
szukująca pierwsze napotkane wyrażenie, find- stuje interfejs UNO ::com::sun::star::util::Re- nia makr w pracy z OpenOffice Writer. Na sam
Next() - wyszukująca sekwencyjnie kolejne od- placeDescriptor. W tym konkretnym przypad- koniec dodam, iż powyższy tekst przygotowałem
powiadające wyrażenia, oraz findAll()  zwra- ku szukamy podwójnych spacji, które przez wy- przy zastosowaniu opisywanych makr.
cająca tablicę odpowiadających wyrażeń. W opi- rażenie regularne zapisane jest w postaci [:spa-
sywanym makrze została zastosowana ostatnia z ce:][:space:]. Właściwość tego deskryptora Re-
W Sieci
metod  której iterator wykorzystywany jest na- placeString stosuje znak specjalny & oznacza-
" http://www.madajczak.eu/download/
Listing 7. Deklarowanie zmiennych różnych typów
przybornik_autora.odt  plik ODT z
Sub Main
opisywanymi makrami.
Dim zmienna
Dim zmienna1 As String, zmienna2$
Dim zmienna4 As Single, zmienna5 As Double
O autorze
DefInt zmienna6
End Sub
Grzegorz Madajczak jest z wykształcenia le-
karzem weterynarii i mikrobiologiem. Linuk-
Listing 8. Zmienne o różnym zasięgu
sem i ogólnym oprogramowaniem Open-
Global oForm
Source pasjonuje się od 2001 roku. Na co
Sub Main
dzień używa Linuksa zarówno w pracy, jak
oForm = thisComponent.getDrawPage().getForms().getByName("Standard")
i w domu. Jego ulubione dystrybucje to Gen-
Private component = oForm.getByName("poletxt")
too i Slackware.
End Sub
Kontakt z autorem: madajczak@gmail.com
www.lpmagazine.org 71


Wyszukiwarka

Podobne podstrony:
2 Omowienie pakietu MS Office i Open Office Ogolne wlasciwosci?ytora tekstu
SIMR RR EGZ 2009 06 18
Ochwat (2009 06)
2009 06 Analiza obrazu z wykorzystaniem ImageJ [Grafika]
2009 06 Bug Bumper Get Started with Strace and Debug Faster

więcej podobnych podstron