
MacOS treats windows and "controls" (i.e. widgets inside a window) as completely different things. Most other platforms treat them as essentially the same things. Which route should the CGA go? The situation seems to be something like this: + Widget everything that occupies space within some coordinate system. Has attributes like size. - Window A toplevel Window. There will be several variants of this, for document windows, dialog boxes etc. + Pane A widget "inside" a window (a window has panes - I've seen this name somewhere, feel free to suggest a more standard one) - Button - GridBox - Label - etc. "Container" could be a class outside this hierarchy, implemented by "Window", "GridBox" and a few other widgets. A Container would only contain Panes, never other widgets. The relationship between a window and a window-modal dialog window has nothing to do with the relationship between a window and a button inside that window, IMHO, so they shouldn't be expressed using the same parent/child relationship. Now perhaps we want a common datatype "Widget" with functions toWidget :: Widget w => w -> Widget and fromWidget :: Widget w => Widget -> Maybe w Perhaps we want a datatype "Pane" (or "Control" or whatever) with toPane :: Pane p => p -> Pane and so on. If I had a "Pane" datatype, I wouldn't really need the "Widget" anymore, but of course, one can never know. The "Pane" datatype would be the natural place to implement a lot of functionality at least on Mac OS, so if it's there, I'm happy, and I could then implement a Widget datatype as a simple discriminated union datatype. If there was no Pane datatype, the implementation for the widget datatype would become slightly ugly and inelegant on Mac OS... Cheers, Wolfgang