AWT-Forms-Package

Das AWT-Forms-Package dient der schnellen Entwicklung von AWT basierten Client-Applikationen für das Space-System (siehe Space). Die GUI wird dabei durch ein XML-PropertySet beschrieben, so dass sich der benötigte Java Code auf ein Minimum reduziert:

String host = ... // Space-Server Host
int port = ... // Space-Server Port
Reader reader = ... // Reader für das XML-PropertySet
Frame frame = ... // Fenster, in dem das GUI angezeigt wird
ConnectionFactory connectionfactory = new ConnectionFactory();
SpaceFactory spacefactory = new SpaceFactory(connectionfactory);
Space space = spacefactory.createSpace(host, port);
PropertySetParser parser = new PropertySetParser(reader);
PropertySet propertyset = parser.getPropertySet();
reader.close();
ComponentAdder adder = new ComponentAdder(space, propertyset);
frame.setLayout(new RulerLayout());
adder.addComponentsTo(frame);
frame.setResizable(false);
frame.pack();
frame.setVisible(true);


Eigenschaften

Grundlegende Eigenschaften der GUI sind:

• Die Benutzeroberfläche besteht aus mehreren einzelnen Seiten, den so genannten Cards.
• Es wird immer nur eine Seite angezeigt.
• Auf den Seiten können Komponenten, die Components, angeordnet werden.
• Eine Komponente ist entweder auf einer einzigen Seite oder auf allen Seiten sichtbar.
• Die Komponenten sind oben, unten, rechts und links an Linealen ausgerichtet.
• Ein Lineal kann für mehrere Komponenten benutzt werden, auch wenn diese nicht auf der gleichen Seite dargestellt werden.
• Buttons sind spezielle Komponenten, denen Scriptcode zugeordnet werden kann. Der Scriptcode wird beim Betätigen des Buttons ausgeführt.
• Eingabefelder sind spezielle Komponenten, mit denen Werte erfasst werden können.
• Ausgabefelder sind spezielle Komponenten, mit denen Werte angezeigt werden können.
• Dynamische DropDowns und dynamische Tabellen sind spezielle Komponenten, die Daten aus dem Space-Server anzeigen und mit denen ein Wert oder mehrere Werte aus vielen Werten ausgewählt werden kann bzw. können.
• Scriptcode kann die angezeigte Seite wechseln.
• Scriptcode kann die Werte von Eingabefeldern ermitteln und setzen.
• Scriptcode kann die Werte von Ausgabefeldern setzen.
• Scriptcode kann Eingabefelder aktivieren, deaktivieren und den Aktivierungsstatus abfragen.
• Scriptcode kann die Menge der Werte, die in einer dynamischen DropDown oder einer dynamischen Tabelle angezeigt wird, einschränken.
• Scriptcode kann Bibliotheken im Space-Server aufrufen.


Beschreibungssprache

Das XML-PropertySet für eine Applikation sieht wie folgt aus:

<application>
  <version>#</version>
  <component-type>
    <name>$</name>
    <factory-class>... Name einer Java-Klasse, die das Interface CreateComponentAdapter implementiert ...</factory-class>
  </component-type>*
  <script-extension>
    <name>$</name>
    <class>... Name einer Java-Klasse, die die Klasse Combinator erweitert ...</class>
  </script-extension>*
  <cards>
    <component>...</component>*
    <card>...</card>+
  </cards>
  <script>... Scriptcode, der beim Start der Applikation einmal ausgeführt wird ...</script>*
</application>

Mit dem Tag component-type können weitere, nicht vordefinierte, Komponententypen definiert werden. Das Tag script-extension dient der Erweiterung der Scriptsprache um zusätzliche Befehle. Innerhalb des Tags cards können Komponenten definiert werden, die auf allen Seiten angezeigt werden sollen und es werden mit dem Tag card einzelne Seiten angelegt.

Ein Seite hat einen eindeutigen Index (eine positive, ganze Zahl) und enthält Komponenten:

<card>
  <index>#</index>
  <component>...</component>*
</card>

Eine Komponente hat einen Typ, einen eindeutigen Namen und Attribute:

<component>
  <type>(image)|(image-map)|(label)|(numeric-label)|(message-label)|(multiline-label)|(textfield)|(textarea)|(password)|(dropdown)|(dynamic-dropdown)|(button)|(dynamic-table)</type>
  <name>$</name>
  <attributes>...</attributes>
</component>

Welche Attribute angegeben werden müssen, hängt vom Typ der Komponente ab. Allen Komponententypen gemeinsam sind die folgenden Attribute:

<rulers>
  [<top>$</top>]
  [<left>$</left>]
  [<bottom>$</bottom>]
  [<right>$</right>]
</rulers>
[<insets>
  [<top>#</top>]
  [<left>#</left>]
  [<bottom>#</bottom>]
  [<right>#</right>]
</insets>]
[<vertical-alignment>(top)|(bottom)|(center)|(fill)</vertical-alignment>]
[<horizontal-alignment>(left)|(right)|(center)|(fill)</horizontal-alignment>]
[<reverse-vertical />]
[<reverse-horizontal />]

Mit dem Tag rulers werden die Namen der Lineale angegeben, an denen die Komponente ausgerichtet werden soll. Wenn eines der vier Lineale nicht angegeben ist, bedeutet das, dass sich die Komponente am Rand des Darstellungsbereichs ausrichten soll. Mit dem Tag insets lassen sich die Insets der Komponente, d.h. zusätzlicher, leerer Raum zwischen der Komponente und einem Lineal, einstellen. Mit den Tags vertical-alignment und horizontal-alignment kann die Art der Ausrichtung an den Linealen (z.B. linksbündig, rechtsbündig, zentriert) bestimmt werden. Die Tags reverse-vertical und reverse-horizontal dienen als Hinweise für den Layouting-Mechanismus für die Fälle, dass eine Komponente vom rechten Rand nach links oder vom unteren Rand nach oben ausgerichtet werden soll.

Komponenten vom Typ image haben ein Attribut url, das auf eine Bilddatei verweist, die als Ressource in der Jar-Datei der Applikation enthalten sein muss.

Komponenten vom Type image-map haben wie die Image-Komponenten ein Attribut url, das auf das anzuzeigende Bild verweist. Außerdem werden mit dem Attribut areas die aktiven Bereiche der Imagemap definiert:

<areas>
  <rectangle>
    <top>#</top>
    <left>#</left>
    <bottom>#</bottom>
    <right>#</right>
    <action>... Scriptcode, der bei der Betätigung des aktiven Bereichs ausgeführt werden soll ...</action>
  </rectangle>*
  <polygon>
    <point>
      <x>#</x>
      <y>#</y>
    </point>3+
    <action>... Scriptcode, der bei der Betätigung des aktiven Bereichs ausgeführt werden soll ...</action>
  </polygon>*
  <circle>
    <top>#</top>
    <left>#</left>
    <radius>#</radius>
    <action>... Scriptcode, der bei der Betätigung des aktiven Bereichs ausgeführt werden soll ...</action>
  </circle>*
</areas>

Erlaubt sind rechteckige Bereiche, die durch Angabe der oberen, der linken, der unteren und der rechten Begrenzung festgelegt werden; polygonale Bereiche, die durch die Angabe von mindestens drei Eckpunkten festgelegt werden und kreisförmige Bereiche, die durch den Radius des Kreises und die Koordinaten der linken, oberen Ecke eines umbeschriebenen Quadrats festgelegt werden.

Komponenten vom Typ label haben die optionalen Attribute font und text. Das Attribut font legt die Schrift fest (siehe Font.decode(java.lang.String)). Mit dem Attribut text lässt sich der voreingestellte Text bestimmen.

Komponenten vom Typ numeric-label haben das Attribut format, mit dem sich das Ausgabeformat für die Zahl einstellen lässt (siehe DecimalFormat). Mit dem optionalen Attribut scale lässt sich die Anzahl der Nachkommastellen bestimmen.

Komponenten vom Typ multiline-label, textfield und password haben das Attribut columns, mit dem die Breite (Zahl der Spalten) festgelegt werden kann.

Komponenten vom Typ textarea haben die Attribute rows und columns, mit denen die Größe der Textarea festgelegt werden kann.

Komponenten vom Typ checkbox haben die Attribute text und listener-function. Mit dem Attribut text bestimmt man die Beschriftung der Checkbox. Das Attribut listener-function legt Scriptcode fest, der beim Ändern des Status durch den Benutzer aufgerufen wird.

Komponenten vom Typ dropdown haben die Attribute value, listener-function und items. Mit dem Attribut value kann der vorausgewählte Wert des Dropdown festgelegt werden. Das Attribut listener-function legt Scriptcode fest, der beim Ändern der Auswahl durch den Benutzer aufgerufen wird. Das Tag items bestimmt den Inhalt des Dropdowns:

<items>
  <item>
    <label>... Beschriftung ...</label>
    <value>... Wert ...</value>
  <item>*
</items>

Komponenten vom Typ dynamic-dropdown haben die Attribute entry, label-name, value-function und listener-function. Mit entry wird ein Template festgelegt, anhand dessen alle passenden Entries mit readAllIfExist aus dem Space gelesen werden. Das Attribut entry hat die folgende Struktur:

<entry>
  <instance-of>$</instance-of>+
  [<fields>
    <... Feldname ...>... Wert des Feldes ...</... Feldname ...>*
  </fields>]
</entry>
  
Das Feld der Entries, dessen Name durch das Attribut label-name angegeben ist, wird als Beschriftung der Dropdown-Einträge verwendet. Die value-function berechnet aus der Listendarstellung eines Entries den mit der Beschriftung verknüpften Wert.

Komponenten vom Typ button haben die Attribute text und action. Mit dem Attribut text wird die Beschriftung der Buttons festgelegt und das Attribut action gibt den Scriptcode an, der beim Betätigen des Buttons ausgeführt wird.

Komponenten vom Typ dynamic-table haben die Attribute width, height, caption-height, row-height, value-function, multiple-select und columns. Dabei kann mit width die Breite der Tabelle, mit height die Höhe der Tabelle, mit caption-height die Höhe der Spaltenüberschriften und mit row-height die Höhe der Tabellenzeilen festgelegt werden. Wie bei den dynamischen Dropdowns dient die value-function zur Berechnung des mit einer Tabellenzeile verknüpften Werts. Wenn das Attribut multiple-select vorhanden ist, erlaubt die Tabelle die Auswahl mehrerer Zeilen. Mit dem Attribut columns werden die Spalten der Tabelle festgelegt:

<columns>
  <column>
    <caption>... Spaltenüberschrift ...</caption>
    <label-name>... Names des Felds, dessen Wert in der Spalte angezeigt werden soll ...</label-name>
    <width>#</width>
  </column>+
</columns>

Für jede Spalte wird die Spaltenüberschrift, der Feldname und die Breite bestimmt.


Scriptsprache

Bei der Scriptsprache handelt es sich um einen Dialekt von Lisp, mit den folgenden, zusätzlichen Funktionen:

• (show-card card) - es wird die Seite sichtbar, deren Index als Argument angegeben wird,
• (get-card) - ermittelt den Index der aktiven Seite,
• (get-component-value name) - ermittelt den Wert der Komponente, deren Name angegeben ist,
• (set-component-value name value) - setzt den Wert einer Komponente,
• (set-component-query name query) - setzt einen Filter für die Werte, die in Komponenten der Typen dynamic-dropdown und dynamic-table angezeigt werden,
• (request-focus name) - wechselt den Eingabefokus zur der Komponente, deren Name angegeben ist,
• (is-enabled name) - überprüft, ob die Komponente, deren Name angegeben ist, aktiviert ist,
• (enable name) - aktiviert die Komponente, deren Name angegeben ist,
• (disable name) - deaktiviert die Komponente, deren Name angegeben ist,
• (create-transaction timeout) - erzeugt eine Transaktion, die für den angegebenen Zeitraum geleast ist (siehe Lease),
• (renew txn timeout) - verlängert das Lease für eine Transaktion,
• (call library function arguments txn timeout) - ruft eine Funktion einer Bibliothek mit den Argumenten innerhalb einer Transaktion mit einem Timeout auf,
• (commit txn) - schreibt die Transaktion fest und
• (abort txn) - rollt die Transaktion zurück.


Download

Die Quelltexte unterliegen der Modified Artistic License v1 und finden sich in der Version v9 in der unten verlinkten Jar-Datei mit dem Namen awtformssrc.jar.

Zusätzlich werden noch das AWT-Utils-Package, das Collections-Package, das Lisp-Package, das Property-Set-Package, das Space-Client-Package, das Threads-Package und das XML-Utils-Package benötigt.

Es muss außerdem ein Space-Server installiert werden (siehe Space-Server-Package).


awtformssrc.jar