64 KAPITEL 5: IMPLEMENTIERUNG<strong>ODL</strong>-Abfrage. Das einfache Vorziehen der Quantoren war möglich, weil die Typen der von ihnengeb<strong>und</strong>enen Variablen von keinen anderen Variablen abhängen konnten. Mit der aktuellenErweiterung des Typsystems wurden Typen eingeführt, die von früher deklarierten Variablenabhängen können: beispielsweise hängt in der Abfrageexists c1:Component.context c2:{ comp:Component | is SubComponents(c1,comp) }der eingeschränkte Typ { comp:Component | is SubComponents(c1,comp) }von der Variablen c1 ab. In einem solchen Fall kann der betreffende context-Quantor nichtvor den Quantor vorgezogen werden, von dessen Variablen sein eigener Variablentyp abhängt.Die new-Quantoren sind von dieser Problematik nicht betroffen, da sie nur Variablen des TypsEntity binden können, <strong>und</strong> dieser Typ hängt nie von anderen Variablen ab.Das entstandene Problem bei der Verschiebung von context-Quantoren kann auf verschiedenenWegen gelöst werden. Die optimale Lösung, bei der ein context-Quantor genau soweitvorgezogen wird, bis er auf einen forall-Quantor trifft oder einen anderen Quantor, von dessenVariablen sein Variablentyp abhängt, konnte aufgr<strong>und</strong> ihrer Komplexität nicht im Rahmender vorliegenden Arbeit implementiert werden. Sie wird jedoch ausführlich im Abschnitt 6.2.1besprochen.In der aktuellen Version des <strong>ODL</strong>-Systems wird eine einfachere jedoch sichere Lösung eingesetzt.Dabei wird für einen context-Quantor zunächst ermittelt, ob sein Variablentyp voneiner anderen Variablen abhängt. Ist dies nicht der Fall, so wird der Quantor – wie schon früher– bis zum nächsten forall-Quantor bzw. an den Anfang der <strong>ODL</strong>-Abfrage vorgezogen.Hängt der Typ der vom context-Quantor geb<strong>und</strong>enen Variablen von einer anderen Variablenab, wird der Quantor als unbeweglich markiert <strong>und</strong> an seiner Stelle belassen. Dieser Algorithmusresultiert zwar häufig in suboptimaler Positionierung von context-Quantoren, er ist aberwesentlich einfacher, als die optimale Lösung, <strong>und</strong> auch mit diesem Algorithmus kann der Benutzerdurch Umformulierung der <strong>ODL</strong>-Abfrage eine optimale Positionierung von context-Quantoren erreichen.5.2 Interaktive <strong>Benutzerschnittstelle</strong>Nachdem wir die <strong>ODL</strong>-Auswertungsklassen besprochen haben, wollen wir eine Beschreibung der imRahmen dieser Arbeit entwickelten <strong>Benutzerschnittstelle</strong> für die Eingabe von Variablenwerten geben.In der früheren <strong>ODL</strong>-Version wurde der Gr<strong>und</strong>stein für das Query-Subsystem gelegt, das Benutzereingabenermöglichen soll, die bei der Auswertung von context-Quantoren notwendigsind ([Pasch], S.29-30). Die Struktur <strong>und</strong> Funktionsweise des <strong>ODL</strong>-Query-Subsystems im Packagequest.odl.evaluation.model.query wird ausführlich im Abschnitt 5.2.2 besprochen.Vorher wollen wir die GUI-Klassen beschreiben, die für den Aufbau von Benutzereingabedialogenerstellt wurden <strong>und</strong> von Query-Klassen verwendet werden.5.2.1 GUI-KlassenDie GUI-Klassen für das Query-Subsystem belegen zwei Packages:– quest.odl.evaluation.model.query.dialog:Dieses Packages enthält die GUI-Klassen, die in Eingabedialogen Verwendung finden.– quest.odl.evaluation.model.query.factory:In diesem Package befinden sich Fabrikklassen, die für die Herstellung von GUI-Klassen ausquest.odl.evaluation.model.query.dialog zuständig sind – sie implementierendie Entwurfsmuster Abstrakte Fabrik, Fabrikmethode <strong>und</strong> Erbauer ([GammaEtAl], S.107-143). Eine weitere Fabrikklasse produziert Instanzen von Klassen aus den Packages quest.
5.2 INTERAKTIVE BENUTZERSCHNITTSTELLE 65dialogs.cellRenderers.formatters <strong>und</strong> quest.odl.evaluation.model.cellRenderers.formatters.Zusätzlich zu diesen Klassen wird in Eingabedialogen die Navigationsleiste aus dem Packagequest.dialogs.navigationBar verwendet.Schließlich werden zur Anzeige von Werten verschiedener Datentypen Klassen ausden Packages quest.dialogs.cellRenderers, quest.dialogs.cellRenderers.formatters <strong>und</strong> aus quest.odl.evaluation.model.cellRenderers.formatters.Wir wollen nun alle verwendeten Klassengruppen im Einzelnen besprechen.Package quest.odl.evaluation.model.query.dialogDie meisten Klassen im dialog-Package lassen sich in drei größere Gruppen unterteilen, die untenaufgeführt werden. In jeder Gruppe werden in der ersten Zeile der Klassenaufzählung abstrakte Klassenaufgeführt, die das Interface der Hierarchie definieren. Ihnen folgen Unterklassen <strong>und</strong> eventuellweitere benutzte Klassen. Interfaces <strong>und</strong> abstrakte Klassen werden kursiv gesetzt, wobei Interfaceszusätzlich mit dem Wort «Interface» gekennzeichnet werden:• EingabedialogDialogfenster für Benutzereingaben. Klassen:QueryDialog «Interface», AbstractQueryDialog,DefaultQueryDialog, SplitPanelQueryDialogQueryDialogManager• EingabepanelEingabebereiche für verschiedene <strong>ODL</strong>-Datentypen, die in Eingabedialogen zur Eingabe desabgefragten Variablenwerts benutzt werden. Für einige Datentypen sind mehrere unterschiedlicheEingabebereiche vorhanden. Klassen:QueryInputPanel «Interface», AbstractQueryInputPanel,TextFieldQueryInputPanel, IntegerTextFieldQueryInputPanel,BooleanTextFieldQueryInputPanel,SelectionQueryInputPanel «Interface»,AbstractSelectionQueryInputPanel,ListQueryInputPanel, RadioButtonsQueryInputPanel,CompositeQueryInputPanel «Interface»,AbstractCompositeQueryInputPanel,DefaultCompositeQueryInputPanel,SetTypeQueryInputPanel «Interface», AbstractSetTypeQueryInputPanel,DefaultSetTypeQueryInputPanelQueryInputListener «Interface», QueryInputEventDie Eingabepanels für Mengenwerte benötigen eine weitere Gruppe von Klassen, die in diesenEingabepanels zur Anzeige bereits in die Menge eingefügter Werte dienen:SetValueDisplay «Interface», AbstractSetValueDisplay,ListSetValueDisplay, TableSetValueDisplay• WerteanzeigeKomponenten, die in Eingabedialogen zur Anzeige der Werte bereits bekannter Variablen verwendetwerden. Klassen:AbstractValuesDisplay, DefaultValuesDisplay,