Automatikgetriebe
Einstieg in die Makroprogrammierung
Verzweigter Dosenöffner
Nach diesen kleinen Einstiegsübungen geht es nun endlich an die Schriftenliste. Das komplette Listing des Makros finden Sie auf der Heft-CD sowie unserer Website [1]. Dafür benötigen Sie zunächst ein neues Writer-Dokument – Sie könnten aber auch ein bestehendes öffnen. Dies erledigt der Dreizeiler aus Listing 2.
sDatei = "/home/tim/meindokument.odt" sURL = ConvertToURL(sDatei) oDokument=StarDesktop.loadComponentFromURL(sURL, "_blank", 0, Array())
Zunächst wandert der Dateiname in die Variable sDatei (Zeile 1). Beachten Sie, dass Sie den Benutzernamen (tim) durch Ihren und den Dokumentnamen durch einen anderen auf Ihrem System ersetzen müssen, damit dieser Code funktioniert. Außerdem muss der Dateiname in einem speziellen Format vorliegen, der sich mitunter vom eigentlichen Namen unterscheidet. Beispielsweise dürfen im Namen nur die Zeichen A bis Z und die Ziffern von 0 bis 9 auftauchen. Alle anderen Zeichen müssen Sie durch spezielle Kodierungen ersetzen, beispielsweise ein Leerzeichen im Namen durch %20. Dieses Verfahren ist nötig, um die Plattformunabhängigkeit von OpenOffice zu wahren – schließlich soll das Makro auch unter Windows ohne Einschränkungen laufen.
Glücklicherweise müssen Sie sich mit dieser Umwandlung nicht selbst herumschlagen; diese Arbeit übernimmt die Funktion ConvertToURL in der zweiten Zeile. In eine Funktion wirft man etwas hinein, hier beispielsweise den Dateinamen, und bekommt im Gegenzug etwas heraus, hier den korrekt codierten Dateinamen, den das Makro direkt in die Variable sURL hineinschreibt.
Im letzten der drei Befehle steht StarDesktop als interne Bezeichnung für die gesamte OpenOffice-Anwendung. Sie stellt eine Funktion namens loadComponentFromURL bereit, der man den konvertierten Dateinamen übergibt. Das _blank sorgt dafür, dass das Dokument in einem neuen Fenster erscheint. Alle anderen Standardparameter sind ohne Belang.
Möchten Sie die Schriftproben aber lieber in einem neuen, leeren Dokument ablegen, sparen Sie sich die Konvertierung und kommen direkt zur Sache:
oDokument=StarDesktop.loadComponentFromURL("private:factory/swriter", "_blank", 0, Array())
Das Erstellen eines leeren Dokuments übernimmt ebenfalls loadComponentFromURL, allerdings müssen Sie dafür einen recht kryptischen Dateinamen angeben. Das swriter steht dabei für ein Textdokument. Weitere mögliche Dokumenttypen wären scalc für ein Tabellendokument, sdraw für eine Zeichnung, simpress für eine Präsentation und smath für eine Formel.
In jedem Fall enthält die Variable oDokument den Wert für das geöffnete Dokument – hoffentlich. Denn falls OpenOffice die Datei nicht findet oder aus Speichermangel eine neue nicht anlegen kann, bleibt die Variable leer. Dies sollten Sie vor allen weiteren Schritten ausschließen. Dabei hilft die Funktion IsNull: Sie liefert True zurück, wenn die übergebene Variable leer ist, und False, sofern oDokument zumindest irgendetwas enthält. Mit diesem Wert führen Sie dann den eigentlich Test durch:
istleer = IsNull(oDokument) If istleer=True Then MsgBox "Dokument nicht geöffnet" Else MsgBox "Dokument geöffnet" End If
Was diese Befehle tun, erkennen Sie, wenn Sie die Übersetzung in verständliches Deutsch lesen: Wenn istleer den Wert True enthält, weil die Variable oDokument leer ist, erscheint ein Warnhinweis. Andernfalls (Else) erhalten Sie einen Hinweise darüber, dass das Dokument geöffnet ist. If und Else geben Bedingungen vor: Wenn-Dann-Sonst. Das aktuell geöffnete Dokument steckt immer in ThisComponent:
oDokument = ThisComponent
Aber Vorsicht: Mit diesem Wert erhalten Sie in oDokument genau das Dokument, in dem das Makro gespeichert ist, und nicht unbedingt das, mit dem Sie gerade arbeiten. An letzteres gelangen Sie sicher über:
oDokument = GlobalScope.ThisComponent
Um nun an den im Dokument gespeicherten Textinhalt zu gelangen, definieren Sie eine weitere Variable:
oText = oDokument.Text
Aber auch damit erhalten Sie nicht den Text, sondern lediglich ein Objekt, mit dem Sie den Text manipulieren können. An die Zeichen selbst gelangen Sie erst per oText.getString:
MsgBox oText.getString
Unerfreulicherweise begrenzt OOoBasic die zurückgelieferte Textmenge auf 64 kByte, was nicht immer ausreicht. Einen Ausweg bietet ein so genannter TextCursor. Den kennen Sie aus Ihrer Textverarbeitung schon als blinkende Einfügemarke. In diesem Fall bleibt er allerdings unsichtbar und fungiert als eine Art Zeigestock, der auf ein Zeichen oder Wort im Text deutet. In einem Makro dürfen Sie beliebig viele Instanzen von TextCursor anlegen und unabhängig voneinander benutzen. Wie Sie einen neuen TextCursor erstellen und an den Anfang des Textdokuments zu platzieren, sehen Sie in den beiden ersten Zeilen von Listing 3. Mit dem TextCursor wählen Sie nun beispielsweise eine andere Schriftgröße (Zeile 3) schreiben dann gezielt in das Dokument (Zeile 4). Ein neuer Absatz erfordert das Einfügen eines Sonderzeichens mit halsbrecherisch langem Namen (Zeile 5).
oTextCursor = oText.createTextCursor oTextCursor.gotoStart(False) oTextCursor.CharHeight=15 oText.insertString(oTextCursor, "Dies ist ein Testtext", False) oText.insertControlCharacter(oTextCursor, com.sun.star.text.ControlCharacter.PARAGRAPH_BREAK, False)
Damit haben Sie schon fast alles für eine Übersicht über die installierten Schriften zusammen. Nun holen Sie sich aus dem Dokument eine Liste mit allen vorhandenen Schriftarten:
oFonts = oDokument.getCurrentControler().getFrame().getContainerWindow().getFontDescriptors()
Dieser Ausdruck liefert gleich mehrere Werte zurück. Bildlich gesprochen, stecken im Eimer oFonts weitere, hier einfach durchnummerierte Eimer. Eine solche Datenstruktur nennt man ein Array. Beachten Sie, dass die Zählung der Einträge in Arrays nicht bei 1, sondern bei 0 beginnt. Zugriff auf einen Eimer im Eimer erhalten Sie, indem Sie dessen Nummer in Klammern angeben. Die dritte Schriftart aus der Liste finden Sie in dieser Logik beispielsweise in oFonts(2).
Wie viele Elemente das Array oFonts enthält, verrät die Funktion Ubound. Jetzt setzen Sie den TextCursor auf den Anfang und die Schriftgröße auf 10 Punkt. Sicherheitshalber legen Sie noch den Namen der aktuellen Schriftart in einer Variablen ab:
nAnzahlFonts = UBound(oFonts) oTextCursor.gotoStart(False) oTextCursor.CharHeight=10 sUrsprungsFont=oTextCursor.charFontName
Als nächstes lassen Sie das Makro alle Schriftarten in oFonts durchlaufen. Für solche Zwecke bietet Basic die so genannte For-Schleife an, die in ihrer einfachsten Form wie folgt aussieht:
For i=0 To 5 ' Hier folgen die Befehle Next
OpenOffice wiederholt hier einfach alle Befehle, die zwischen For und Next stehen. Die Variable i zählt, wie oft das bereits passiert ist. Nach jedem Durchlauf erhöht sich der Wert von i um 1. Erreicht die Variable i den To-Wert, beendet das Makro die Schleife. Dem Schleifenzähler i können Sie einen beliebigen Startwert mitgeben.
Bei den Schriftproben geht es darum, jede Schriftart in oFonts einmal auszudrucken. Die einzelnen Elemente sind bereits durchnummeriert, das Ausdrucken erledigen Sie also mit der Schleife:
For i=0 To UBound(oFonts) ' Drucke Schriftmuster oFonts(i) Next
Die Schleife (Listing 4) zählt die Variable i von 0 bis zur Anzahl der Elemente in oFonts hoch. In der Schleife müssen Sie dann nur noch die i-te Schriftart in der Sammlung ausdrucken – und die steckt in oFonts(i). Innerhalb der For-Next-Schleife stellen Sie nun eine Schriftprobe zusammen. Dazu besorgt sich das Makro als erstes den Namen der Schriftart (Listing 4, Zeile 2), druckt diesen Namen noch einmal in der alten Schrift (Zeile 3) und wechselt zur neuen Schriftart (Zeile 4). Nun druckt es als Beispieltext das Alphabet (Zeile 5), erzeugt einen Absatz (Zeile 6) und wechselt im Hinblick auf den nächsten Durchgang wieder zur alten, normalen Schriftart zurück.
For i=0 To UBound(oFonts) sFontName=oFonts(i).Name + ": " oText.insertString(oTextCursor, sFontName, False) oTextCursor.charFontName=sFontName oText.insertString(oTextCursor, "ABCDEFGHIJKLMNOPQRSTUVWXYZ", False) oText.insertControlCharacter(oTextCursor, com.sun.star.text.ControlCharacter.PARAGRAPH_BREAK, False) oTextCursor.charFontName=sUrsprungsFont Next
Zusammenarbeit mit Calc
Eine Schriftprobe ist zwar schon ganz schön, allerdings bietet OpenOffice noch Zusatzinformationen über jede Schriftart an, zum Beispiel die Zugehörigkeit zu einer Schriftfamilie. Diese Daten packen Sie am besten in eine Calc-Tabelle, die Sie so erzeugen, wie in Zeile 1 von Listing 5 gezeigt. Das Calc-Dokument gibt auf Anfrage auch Zugriff auf alle Tabellen (Zeile 2).
Ähnlich wie bei den Schriftarten hält man in oSheets ein Array mit allen Tabellen in der Hand. Deren Anzahl liefert ein oSheets.getCount(). Die einzelnen Tabellen in oSheets sind wieder von 0 an durchnummeriert. So lassen sich Tabellennamen auslesen (Zeile 3) und auch ändern. Sie können auch an beliebiger Position (in Listing 5, Zeile 5 an Position 1, also hinter der ersten mit der Positionsangabe 0) eigene Tabellen einfügen. Vorher sollten Sie jedoch noch prüfen, ober der vorgesehene Name nicht bereits für eine andere Tabelle vergeben ist (Zeile 4). Das (unwiederbringliche!) Löschen einer Tabelle lässt sich ebenfalls schnell erledigen (Zeile 7).
oCalcDokument=StarDesktop.loadComponentFromURL("private:factory/scalc", "_blank", 0, Array())
oSheets=oCalcDokument.Sheets
sSheetName = oSheets(1).Name
If Not oSheets.hasByName("MeineTabelle") Then
oSheets.insertNewByName("MeineTabelle", 1)
End If
oSheets.removeByName("Kopie von MeineTabelle")



