Der Typ GUIOBJECT ist die interne Repräsentation der
verschiedenen Oberflächen-Objekte (im wesentlichen Widgets,
Canvas-Objekte, Menüelemente, aber auch spezielleres wie z.B. Text-Tags
oder Canvas-Tags). Diese interne Repräsentation durch einen Typen
ermöglicht z.B. Listen verschiedener Objekte im internen Status zu halten
oder als Funktions-Argumente zu übergeben.
Der GUIOBJECT-Wert muß jedoch normalerweise nicht selbst
konstruiert werden, hierzu gibt es spezielle Funktionen
(z.B. createGUIObject im Modul Core,
createCanvasItem im Modul CanvasItemAux). Aussehen tut er
wie folgt:
data GUIOBJECT = GUIOBJECT ObjectID (Ref OST) | ROOT
Den ROOT-Konstruktor möchte ich hier nicht weiter erläutern. Er hat
eine spezielle Bedeutung und steht für die Wish-Instanz bzw. das
Hauptfenster, dies muß man aber jetzt nicht verstehen. Für ,,normale''
GUI-Objekte wird ein dem ersten Konstruktor entsprechender Wert erzeugt.
Dieser enthält die ObjectID, die dieses spezielle Objekt eindeutig
identifiziert und eine Referenz auf das zu diesem Objekt gehörende
Statusobjekt (die ObjectID und das Statusobjekt werden jedoch
von obiger Funktion automatisch erzeugt, daher will ich hier auch darauf
nicht weiter eingehen).
Der externe Typ muß immer eine Instanz der Klasse GUIObject sein:
class GUIObject w where toGUIObject :: w -> GUIOBJECT -- Wandeln in interne Repräsentation cname :: w -> String -- textelle Repräsentation cset :: GUIValue a => w -> ConfigID -> a -> IO w -- vordefiniert cget :: GUIValue a => w -> ConfigID -> IO a -- vordefiniert
Die Instanz für ein Objekt sieht dann z.B. für ein Label aus wie folgt:
instance GUIObject (Label a) where toGUIObject (Label w) = w cname _ = "Label"
So kann bei Bedarf durch die Klassenmethode toGUIObject der
externe Typ in die interne Repräsentation gewandelt werden. Die
cname-Methode liefert lediglich eine textuelle Repräsentation des
Objekttyps und kann z.B. für Debug-Ausgaben benutzt werden. Die Methoden
cset und cget sind wichtig bei der Implementierung von
Objekt-Konfigurationen und werden im folgenden besprochen.