## Das Schreiben und Benutzen von BeanShell Skripten

jPicEdt unterstützt nun Skripte (aka "Makros") durch einen integrierten BeanShell Interpreter. BeanShell ist eine leichtgewichtige, erweiterbare und integrierte Skripterweiterung für Java, geschrieben von Pat Niemeyer (pat@pat.net). Es folgt der Java-Grammatik (jedoch mit höherer Toleranz gegenüber Syntax-Fehlern; im besonderen ist die Typisierung nicht so streng wie bei Java), daher kann jeder mit oberflächlichen Java-Kenntnissen BeanShell-Skripte schreiben.

Eine umfassende Dokumentation der Beanshell gibt es unter: www.beanshell.org. Als guter Anfangspunkt kann ein prüfender Blick in die Skripte dienen, die mit jPicEdt ausgeliefert werden. Für weitere Arbeiten werde Sie aber auch jPicEdt's API Dokumentation brauchen (falls Sie die Dokumentation bisher nicht installiert haben, können Sie sie mit jPicEdt's Installationsprogramm nachinstallieren), das gilt im speziellen, wenn Sie Skripte mit komplexen Operationen schreiben wollen. Die jpicedt.JPicEdt Klasse bietet eine Vielzahl statischer Methoden (z.B. `JPicEdt.newBoard()`), die grundlegenden Bedürfnisse genügen könnten. Andere wichtige Klassen sind:

- jpicedt.ui.MDIManager um Zeichenbretter zu handhaben (erstellt ein neues Zeichenbrett, verschiebt es, ordnet Zeichenbretter Kaskadebförmig an,...)
- jpicedt.ui.PEDrawingBoard und jpicedt.graphic.PECanvas (PEDrawingBoard enthält ein PECanvas und ein PEScrollPane) um mit ausgewählten Objekten zu arbeiten, zoomen, E/A-Operationen auszuführen, oder auch um mit dem UndoManager ein wenig rum zu tricksen :-), ...
- jpicedt.graphic.model.Drawing um Objekte zur Zeichenbrett hinzuzufügen;
- jpicedt.graphic.model.Element und konkrete Implementierungen (Ellipsen, Rechtecke,...) um Umrisse und Attribute von Objekten zu verändern;
- jpicedt.graphic.view.View und konkrete Implementierungen (Ellipsen, Rechtecke,...) um Das AUSSEHEN eines Objektes auf dem Bildschirm zu ändern (aber nicht wie es zu einer LaTex Zeichenkette formatiert wird);
- jpicedt.graphic.toolkit.EditorKit um die Art, wie Objekte durch die Maus bearbeitet werden, zu ändern (das ist einerseits das Verändern von vorhandenem Verhalten, oder das Hinzufügen von neuem).
- Klassen im jpicedt.format.* Paket, um mit Inhaltstypen zu arbeiten, z.B. das Ändern der Art wie Objekte zu LaTeX formatiert werden und/oder wie TeX-Dateien bei gegebenem Format (LaTeX, `eepic`,...) analysiert werden.

Alle diese Klassen sind leicht erweiterbar und können mit anderen verbunden werden (Dank dem bekannten View-Model-Controller Schema...). Außerdem beinhalten jpicedt.JPicEdt und jpicedt.graphic.toolkit.EditorKit eine Auswahl von Aktionen (implementiert als statische Klassen), die Sie in Teilklassen unterteilen können, und anschließend zu Ihrer eigenen grafischen Schnittstelle hinzufügen können. Vgl. dazu die Dokumentation jpicedt.graphic.toolkit.PEAction, dort finden Sie, was eine Aktion ist und wie Sie sie vielleicht in deinem eigenen Code benutzen können.

Der Bequemlichkeit halber wurden einige nützliche Variablen und Methoden vordefiniert; beides ist in der BSH-Konsole vom Start an aufrufbar, das gilt auch für Skripte, die über das Skriptmenü gestartet werden. Im einzelnen sind dies:

- board(): gibt als return-Wert das derzeitig ausgewählte PEDrawingBoard zurück oder `null`, wenn keine offenes Zeichenbrett vorhanden ist;
- canvas(): gibt als return-Wert das aktive PECanvas zurück, das z.B. von dem derzeitig ausgewählten PEDrawingBoard beinhaltet wird;
- drawing(): gibt als return-Wert die Zeichnung (auch als MODELL bezeichnet), die auf dem aktiven PECanvas dargestellt wird, zurück;
- editorkit(): gibt als return-Wert das EditorKit (auch als CONTROLLER bezeichnet), das zum aktiven PECanvas gehört, zurück;
- mdimgr: vordefinierte Variable, referenziert den derzeitigen MDIManager.
- clipboard: vordefinierte Variable, referenziert die lokale Zwischenablage, die von allen Zeichenbrettern gemeinsam genutzt wird (im Gegensatz zur Systemzwischenablage, auf Sie mit jPicEdt über den Menüpunkt “Einfügen spezial” Zugriff erhalten; diese akzeptiert aber bisher einzig und allein Textdaten); sie wird zum Kopieren und Einfügen von Dingen aus/in ein PECanvas benötigt.
- preferences: vordefinierte Variable, referenziert ein Objekt der Eigenschaften mit den Voreinstellungen des Benutzers

## OK, wo soll ich meine Skripte ablegen?

Die Skripte des Benutzers müssen im “makros”-Unterverzeichnis des Verzeichnisses für die Benutzer-Einstellungen liegen (zum Beispiel, /home/user/.jpicedt/macros in Unix). Skripte müssen eine “.bsh”-Erweiterung haben. In Namen mit Unterstrichen werden letztere durch Leerstellen im Skriptmenü ersetzt (z.B. “Repeat_copy.bsh” wird gezeigt als “Repeat copy”). Sie könne auch andere Skripte aus einem Skript heraus aufrufen, indem sie den BSH `source(path_to_other_script)` Befehl benutzen, und ebenso können Sie Ihre eigenen Klassen mit dem `addClassPath()` Befehlhinzufügen.

Benutzen Sie die BSH Konsole, um Ihre Skripte zu testen. Anschließend legen Sie sie im Skriptverzeichnis ab und sie werden automatisch im Skripte-Menü angezeigt – evtl. ist ein “Skipte neu suchen” erforderlich!