intitial checkin
authorca
Fri, 14 Feb 1997 16:28:58 +0100
changeset 42 877a25e8f5aa
parent 41 4c080ce0d465
child 43 3dd91a85c243
intitial checkin
UIPainter.st
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UIPainter.st	Fri Feb 14 16:28:58 1997 +0100
@@ -0,0 +1,2729 @@
+"
+ COPYRIGHT (c) 1995 by Claus Gittinger
+	      All Rights Reserved
+
+ This software is furnished under a license and may be used
+ only in accordance with the terms of that license and with the
+ inclusion of the above copyright notice.   This software may not
+ be provided or otherwise made available to, or used by, any
+ other person.  No title to or ownership of the software is
+ hereby transferred.
+"
+
+ApplicationModel subclass:#UIPainter
+	instanceVariableNames:'menu nameField elementMenu workView treeView outletView stringBox
+		actionBox listBox fileBox currentFileName topView propertyFrame
+		whichProperty changeSelectorHolder changeChannel
+		aspectSelectorHolder aspectChannel nameChannel fgChannel
+		bgChannel applyAction leftFractionHolder leftOffsetHolder
+		rightFractionHolder rightOffsetHolder topFractionHolder
+		topOffsetHolder bottomFractionHolder bottomOffsetHolder specClass
+		specSelector leftAlignmentFractionHolder
+		topAlignmentFractionHolder propertyShown specShown'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Interface-UIPainter'
+!
+
+!UIPainter class methodsFor:'documentation'!
+
+copyright
+"
+ COPYRIGHT (c) 1995 by Claus Gittinger
+	      All Rights Reserved
+
+ This software is furnished under a license and may be used
+ only in accordance with the terms of that license and with the
+ inclusion of the above copyright notice.   This software may not
+ be provided or otherwise made available to, or used by, any
+ other person.  No title to or ownership of the software is
+ hereby transferred.
+"
+!
+
+documentation
+"
+    not yet finished, not yet published, not yet released.
+
+    [start with:]
+        Builder open
+
+    [st80 compatibility:]
+        UIPainter := Builder. UIPainter open
+"
+! !
+
+!UIPainter class methodsFor:'interface specs'!
+
+actionButtonModelSpec
+    "UIPainter new openOnClass:self andSelector:#actionButtonModelSpec"
+
+    <resource: #canvas>
+
+    ^
+     
+       #(#FullSpec
+          #'component:' 
+           #(#SpecCollection
+              #'collection:' 
+               #(
+                 #(#FramedBoxSpec
+                    #'layout:' #(#LayoutFrame 0 0 -1 0 251 0 289 0)
+                    #'component:' 
+                     #(#SpecCollection
+                        #'collection:' 
+                         #(
+                           #(#VerticalPanelViewSpec
+                              #'layout:' #(#LayoutFrame 6 0 26 0 78 0 216 0)
+                              #'component:' 
+                               #(#SpecCollection
+                                  #'collection:' 
+                                   #(
+                                     #(#LabelSpec
+                                        #'name:' 'label'
+                                        #'layout:' #(#LayoutFrame 0 0 47 0 57 0 71 0)
+                                        #'label:' 'aspect:'
+                                    )
+                                     #(#LabelSpec
+                                        #'name:' 'label'
+                                        #'layout:' #(#LayoutFrame 0 0 119 0 62 0 143 0)
+                                        #'label:' 'change:'
+                                    )
+                                  )
+                              )
+                              #'horizontalLayout:' #left
+                              #'verticalLayout:' #spreadSpace
+                          )
+                           #(#VerticalPanelViewSpec
+                              #'layout:' #(#LayoutFrame 80 0 24 0 231 0 214 0)
+                              #'component:' 
+                               #(#SpecCollection
+                                  #'collection:' 
+                                   #(
+                                     #(#InputFieldSpec
+                                        #'name:' 'aspectInput'
+                                        #'layout:' #(#LayoutFrame 0 0 49 0 163 0 69 0)
+                                        #model: #aspectChannel
+                                        #acceptOnLostFocus: true
+                                        #tabable: true
+                                    )
+                                     #(#InputFieldSpec
+                                        #'name:' 'changeInput'
+                                        #'layout:' #(#LayoutFrame 0 0 119 0 163 0 142 0)
+                                        #model: #changeChannel
+                                        #acceptOnLostFocus: true
+                                        #tabable: true
+                                    )
+                                  )
+                              )
+                              #'horizontalLayout:' #fit
+                              #'verticalLayout:' #spreadSpace
+                          )
+                           #(#ActionButtonSpec
+                              #'name:' 'button'
+                              #'layout:' #(#LayoutFrame 102 0 246 0 153 0 272 0)
+                              #'label:' 'apply'
+                              #'model:' #setModelAspects
+                          )
+                        )
+                    )
+                    #'labelPosition:' #topLeft
+                    #'showFrame:' false
+                )
+              )
+          )
+          #'window:' 
+           #(#WindowSpec
+              #'label:' 'unnamed'
+              #'bounds:' #(#Rectangle 0 0 255 292)
+          )
+      )
+!
+
+colorSpec
+    "UIBuilder new openOnClass:self andSelector:#colorSpec"
+    "Builder new openInterface:#colorSpec"
+
+    <resource: #canvas>
+
+    ^
+     
+       #(#FullSpec
+          #'component:' 
+           #(#SpecCollection
+              #'collection:' 
+               #(
+                 #(#FramedBoxSpec
+                    #'layout:' #(#LayoutFrame 0 0 -1 0 252 0 290 0)
+                    #'component:' 
+                     #(#SpecCollection
+                        #'collection:' 
+                         #(
+                           #(#VerticalPanelViewSpec
+                              #'layout:' #(#LayoutFrame 6 0 26 0 100 0 215 0)
+                              #'component:' 
+                               #(#SpecCollection
+                                  #'collection:' 
+                                   #(
+                                     #(#LabelSpec
+                                        #'name:' 'label'
+                                        #'layout:' #(#LayoutFrame 0 0 47 0 87 0 71 0)
+                                        #'label:' 'foreground:'
+                                    )
+                                     #(#LabelSpec
+                                        #'name:' 'label'
+                                        #'layout:' #(#LayoutFrame 0 0 119 0 93 0 143 0)
+                                        #'label:' 'background:'
+                                    )
+                                  )
+                              )
+                              #'horizontalLayout:' #left
+                              #'verticalLayout:' #spreadSpace
+                          )
+                           #(#VerticalPanelViewSpec
+                              #'layout:' #(#LayoutFrame 114 0 24 0 233 0 213 0)
+                              #'component:' 
+                               #(#SpecCollection
+                                  #'collection:' 
+                                   #(
+                                     #(#InputFieldSpec
+                                        #'layout:' #(#LayoutFrame 0 0 49 0 163 0 69 0)
+                                        #model: #foregroundChannel
+                                    )
+                                     #(#InputFieldSpec
+                                        #'layout:' #(#LayoutFrame 0 0 119 0 163 0 142 0)
+                                        #model: #backgroundChannel
+                                    )
+                                  )
+                              )
+                              #'horizontalLayout:' #fit
+                              #'verticalLayout:' #spreadSpace
+                          )
+                           #(#ActionButtonSpec
+                              #'name:' 'button'
+                              #'layout:' #(#LayoutFrame 102 0 246 0 153 0 272 0)
+                              #'label:' 'apply'
+                              #'model:' #setColors
+                          )
+                        )
+                    )
+                    #'labelPosition:' #topLeft
+                    #'showFrame:' false
+                )
+              )
+          )
+          #'window:' 
+           #(#WindowSpec
+              #'label:' 'unnamed'
+              #'bounds:' #(#Rectangle 0 0 255 292)
+          )
+      )
+!
+
+geometrySpecForAlignmentOrigin
+    "UIBuilder new openOnClass:self andSelector:#geometrySpecForAlignmentOrigin"
+    "Builder new openInterface:#geometrySpecForAlignmentOrigin"
+
+    <resource: #canvas>
+
+    ^
+     
+       #(#FullSpec
+          #'component:' 
+           #(#SpecCollection
+              #'collection:' 
+               #(
+                 #(#FramedBoxSpec
+                    #'layout:' #(#LayoutFrame 0 0 -1 0 253 0 291 0)
+                    #'component:' 
+                     #(#SpecCollection
+                        #'collection:' 
+                         #(
+                           #(#VerticalPanelViewSpec
+                              #'layout:' #(#LayoutFrame 6 0 26 0 85 0 219 0)
+                              #'component:' 
+                               #(#SpecCollection
+                                  #'collection:' 
+                                   #(
+                                     #(#LabelSpec
+                                        #'layout:' #(#LayoutFrame 0 0 19 0 30 0 43 0)
+                                        #'label:' 'left'
+                                        #'adjust:' #left
+                                    )
+                                     #(#LabelSpec
+                                        #'layout:' #(#LayoutFrame 0 0 63 0 31 0 87 0)
+                                        #'label:' 'top'
+                                        #'adjust:' #left
+                                    )
+                                     #(#LabelSpec
+                                        #'layout:' #(#LayoutFrame 0 0 107 0 41 0 131 0)
+                                        #'label:' 'align H'
+                                        #'adjust:' #left
+                                    )
+                                     #(#LabelSpec
+                                        #'layout:' #(#LayoutFrame 0 0 151 0 61 0 175 0)
+                                        #'label:' 'align V'
+                                        #'adjust:' #left
+                                    )
+                                  )
+                              )
+                              #'horizontalLayout:' #left
+                              #'verticalLayout:' #spreadSpace
+                          )
+                           #(#VerticalPanelViewSpec
+                              #'layout:' #(#LayoutFrame 80 0 24 0 124 0 217 0)
+                              #'component:' 
+                               #(#SpecCollection
+                                  #'collection:' 
+                                   #(
+                                     #(#InputFieldSpec
+                                        #'layout:' #(#LayoutFrame 0 0 21 0 71 0 42 0)
+                                        #'type:' #numberOrNil
+                                        #model: #leftFractionChannel
+                                        #acceptOnLostFocus: true
+                                        #tabable: true
+                                    )
+                                     #(#InputFieldSpec
+                                        #'layout:' #(#LayoutFrame 0 0 64 0 71 0 85 0)
+                                        #'type:' #numberOrNil
+                                        #'model:' #'topFractionChannel'
+                                        #acceptOnLostFocus: true
+                                        #tabable: true
+                                    )
+                                     #(#InputFieldSpec
+                                        #'layout:' #(#LayoutFrame 0 0 107 0 71 0 128 0)
+                                        #'type:' #numberOrNil
+                                        #model:  #'leftAlignmentFractionChannel'
+                                        #acceptOnLostFocus: true
+                                        #tabable: true
+                                    )
+                                     #(#InputFieldSpec
+                                        #'layout:' #(#LayoutFrame 0 0 150 0 71 0 171 0)
+                                        #'type:' #numberOrNil
+                                        #'model:' #'topAlignmentFractionChannel'
+                                        #acceptOnLostFocus: true
+                                        #tabable: true
+                                    )
+                                  )
+                              )
+                              #'horizontalLayout:' #fit
+                              #'verticalLayout:' #spreadSpace
+                          )
+                           #(#VerticalPanelViewSpec
+                              #'layout:' #(#LayoutFrame 150 0 24 0 220 0 216 0)
+                              #'component:' 
+                               #(#SpecCollection
+                                  #'collection:' 
+                                   #(
+                                     #(#InputFieldSpec
+                                        #'layout:' #(#LayoutFrame 0 0 21 0 114 0 42 0)
+                                        #'type:' #numberOrNil
+                                        #model: #leftOffsetChannel
+                                        #acceptOnLostFocus: true
+                                        #tabable: true
+                                    )
+                                     #(#InputFieldSpec
+                                        #'layout:' #(#LayoutFrame 0 0 64 0 114 0 85 0)
+                                        #'type:' #numberOrNil
+                                        #model: #topOffsetChannel
+                                        #acceptOnLostFocus: true
+                                        #tabable: true
+                                    )
+                                  )
+                              )
+                              #'horizontalLayout:' #fit
+                              #'verticalLayout:' #spreadSpace
+                          )
+                           #(#ActionButtonSpec
+                              #'name:' 'button'
+                              #'layout:' #(#LayoutFrame 16 0 210 0 76 0 240 0)
+                              #'label:' 'frame'
+                              #'model:' #setLayoutFrame
+                          )
+                           #(#ActionButtonSpec
+                              #'name:' 'button'
+                              #'layout:' #(#LayoutFrame 96 0 210 0 156 0 240 0)
+                              #'label:' 'origin'
+                              #'model:' #setLayoutOrigin
+                          )
+                           #(#ActionButtonSpec
+                              #'name:' 'button'
+                              #'layout:' #(#LayoutFrame 176 0 210 0 236 0 240 0)
+                              #'label:' 'align'
+                              #'model:' #setAlignmentOrigin
+                              #'initiallyDisabled:' true
+                          )
+
+                           #(#ActionButtonSpec
+                              #'layout:' #(#LayoutFrame 96 0 260 0 156 0 290 0)
+                              #'label:' 'apply'
+                              #'model:' #setDimensionForAlignmentOrigin
+                              #tabable: true
+                          )
+                           #(#LabelSpec
+                              #'layout:' #(#LayoutFrame 77 0 9 0 137 0 31 0)
+                              #'label:' 'relative'
+                          )
+                           #(#LabelSpec
+                              #'layout:' #(#LayoutFrame 167 0 9 0 213 0 30 0)
+                              #'label:' 'offset'
+                          )
+                        )
+                    )
+                    #'labelPosition:' #topLeft
+                    #'showFrame:' false
+                )
+              )
+          )
+          #'window:' 
+           #(#WindowSpec
+              #'label:' 'indy: unnamed'
+              #'bounds:' #(#Rectangle 0 0 255 292)
+          )
+      )
+!
+
+geometrySpecForLayoutFrame
+    "UIBuilder new openOnClass:self andSelector:#geometrySpecForLayoutFrame"
+    "Builder new openInterface:#geometrySpecForLayoutFrame"
+
+    <resource: #canvas>
+
+    ^
+     
+       #(#FullSpec
+          #'component:' 
+           #(#SpecCollection
+              #'collection:' 
+               #(
+                 #(#FramedBoxSpec
+                    #'layout:' #(#LayoutFrame 0 0 -1 0 253 0 291 0)
+                    #'component:' 
+                     #(#SpecCollection
+                        #'collection:' 
+                         #(
+                           #(#VerticalPanelViewSpec
+                              #'layout:' #(#LayoutFrame 6 0 26 0 85 0 219 0)
+                              #'component:' 
+                               #(#SpecCollection
+                                  #'collection:' 
+                                   #(
+                                     #(#LabelSpec
+                                        #'layout:' #(#LayoutFrame 0 0 19 0 30 0 43 0)
+                                        #'label:' 'left'
+                                        #'adjust:' #left
+                                    )
+                                     #(#LabelSpec
+                                        #'layout:' #(#LayoutFrame 0 0 63 0 30 0 87 0)
+                                        #'label:' 'top'
+                                        #'adjust:' #left
+                                    )
+                                     #(#LabelSpec
+                                        #'layout:' #(#LayoutFrame 0 0 107 0 40 0 131 0)
+                                        #'label:' 'right'
+                                        #'adjust:' #left
+                                    )
+                                     #(#LabelSpec
+                                        #'layout:' #(#LayoutFrame 0 0 151 0 40 0 175 0)
+                                        #'label:' 'bottom'
+                                        #'adjust:' #left
+                                    )
+                                  )
+                              )
+                              #'horizontalLayout:' #left
+                              #'verticalLayout:' #spreadSpace
+                          )
+                           #(#VerticalPanelViewSpec
+                              #'layout:' #(#LayoutFrame 80 0 24 0 124 0 217 0)
+                              #'component:' 
+                               #(#SpecCollection
+                                  #'collection:' 
+                                   #(
+                                     #(#InputFieldSpec
+                                        #'layout:' #(#LayoutFrame 0 0 21 0 71 0 42 0)
+                                        #'type:' #numberOrNil
+                                        #model: #leftFractionChannel
+                                        #acceptOnLostFocus: true
+                                        #tabable: true
+                                    )
+                                     #(#InputFieldSpec
+                                        #'layout:' #(#LayoutFrame 0 0 64 0 71 0 85 0)
+                                        #'type:' #numberOrNil
+                                        #'model:' #'topFractionChannel'
+                                        #acceptOnLostFocus: true
+                                        #tabable: true
+                                    )
+                                     #(#InputFieldSpec
+                                        #'layout:' #(#LayoutFrame 0 0 107 0 71 0 128 0)
+                                        #'type:' #numberOrNil
+                                        #model:  #'rightFractionChannel'
+                                        #acceptOnLostFocus: true
+                                        #tabable: true
+                                    )
+                                     #(#InputFieldSpec
+                                        #'layout:' #(#LayoutFrame 0 0 150 0 71 0 171 0)
+                                        #'type:' #numberOrNil
+                                        #'model:' #'bottomFractionChannel'
+                                        #acceptOnLostFocus: true
+                                        #tabable: true
+                                    )
+                                  )
+                              )
+                              #'horizontalLayout:' #fit
+                              #'verticalLayout:' #spreadSpace
+                          )
+                           #(#VerticalPanelViewSpec
+                              #'layout:' #(#LayoutFrame 150 0 24 0 220 0 216 0)
+                              #'component:' 
+                               #(#SpecCollection
+                                  #'collection:' 
+                                   #(
+                                     #(#InputFieldSpec
+                                        #'layout:' #(#LayoutFrame 0 0 21 0 114 0 42 0)
+                                        #'type:' #numberOrNil
+                                        #model: #leftOffsetChannel
+                                        #acceptOnLostFocus: true
+                                        #tabable: true
+                                    )
+                                     #(#InputFieldSpec
+                                        #'layout:' #(#LayoutFrame 0 0 64 0 114 0 85 0)
+                                        #'type:' #numberOrNil
+                                        #model: #topOffsetChannel
+                                        #acceptOnLostFocus: true
+                                        #tabable: true
+                                    )
+                                     #(#InputFieldSpec
+                                        #'layout:' #(#LayoutFrame 0 0 107 0 114 0 128 0)
+                                        #'type:' #numberOrNil
+                                        #'model:' #rightOffsetChannel
+                                        #acceptOnLostFocus: true
+                                        #tabable: true
+                                    )
+                                     #(#InputFieldSpec
+                                        #'layout:' #(#LayoutFrame 0 0 150 0 114 0 171 0)
+                                        #'type:' #numberOrNil
+                                        #'model:' #bottomOffsetChannel
+                                        #acceptOnLostFocus: true
+                                        #tabable: true
+                                    )
+                                  )
+                              )
+                              #'horizontalLayout:' #fit
+                              #'verticalLayout:' #spreadSpace
+                          )
+
+                           #(#ActionButtonSpec
+                              #'name:' 'button'
+                              #'layout:' #(#LayoutFrame 16 0 210 0 76 0 240 0)
+                              #'label:' 'frame'
+                              #'model:' #setLayoutFrame
+                              #'initiallyDisabled:' true
+                          )
+                           #(#ActionButtonSpec
+                              #'name:' 'button'
+                              #'layout:' #(#LayoutFrame 96 0 210 0 156 0 240 0)
+                              #'label:' 'origin'
+                              #'model:' #setLayoutOrigin
+                          )
+                           #(#ActionButtonSpec
+                              #'name:' 'button'
+                              #'layout:' #(#LayoutFrame 176 0 210 0 236 0 240 0)
+                              #'label:' 'align'
+                              #'model:' #setAlignmentOrigin
+                          )
+
+                           #(#ActionButtonSpec
+                              #'layout:' #(#LayoutFrame 96 0 260 0 156 0 290 0)
+                              #'label:' 'apply'
+                              #'model:' #setDimensionForLayoutFrame
+                              #tabable: true
+                          )
+                           #(#LabelSpec
+                              #'layout:' #(#LayoutFrame 77 0 9 0 137 0 31 0)
+                              #'label:' 'relative'
+                          )
+                           #(#LabelSpec
+                              #'layout:' #(#LayoutFrame 167 0 9 0 213 0 30 0)
+                              #'label:' 'offset'
+                          )
+                        )
+                    )
+                    #'labelPosition:' #topLeft
+                    #'showFrame:' false
+                )
+              )
+          )
+          #'window:' 
+           #(#WindowSpec
+              #'label:' 'indy: unnamed'
+              #'bounds:' #(#Rectangle 0 0 255 292)
+          )
+      )
+!
+
+geometrySpecForLayoutOrigin
+    "UIPainter new openOnClass:self andSelector:#geometrySpecForLayoutOrigin"
+    "Builder new openInterface:#geometrySpecForLayoutOrigin"
+
+    <resource: #canvas>
+
+    ^
+
+       #(#FullSpec
+          #'component:' 
+           #(#SpecCollection
+              #'collection:' 
+               #(
+                 #(#FramedBoxSpec
+                    #'name:' 'framedBox'
+                    #'layout:' #(#LayoutFrame 0 0 -1 0 253 0 291 0)
+                    #'component:' 
+                     #(#SpecCollection
+                        #'collection:' 
+                         #(
+                           #(#VerticalPanelViewSpec
+                              #'name:' 'verticalPanelView'
+                              #'layout:' #(#LayoutFrame 6 0 26 0 85 0 219 0)
+                              #'component:' 
+                               #(#SpecCollection
+                                  #'collection:' 
+                                   #(
+                                     #(#LabelSpec
+                                        #'name:' 'label'
+                                        #'layout:' #(#LayoutFrame 0 0 19 0 30 0 43 0)
+                                        #'label:' 'left'
+                                        #'adjust:' #left
+                                    )
+                                     #(#LabelSpec
+                                        #'name:' 'label'
+                                        #'layout:' #(#LayoutFrame 0 0 63 0 31 0 87 0)
+                                        #'label:' 'top'
+                                        #'adjust:' #left
+                                    )
+                                  )
+                              )
+                              #'horizontalLayout:' #left
+                              #'verticalLayout:' #spreadSpace
+                          )
+                           #(#VerticalPanelViewSpec
+                              #'name:' 'verticalPanelView'
+                              #'layout:' #(#LayoutFrame 80 0 24 0 124 0 217 0)
+                              #'component:' 
+                               #(#SpecCollection
+                                  #'collection:' 
+                                   #(
+                                     #(#InputFieldSpec
+                                        #'layout:' #(#LayoutFrame 0 0 21 0 71 0 42 0)
+                                        #'type:' #numberOrNil
+                                        #model: #leftFractionChannel
+                                        #'acceptOnLostFocus:' true
+                                        #tabable: true
+                                    )
+                                     #(#InputFieldSpec
+                                        #'layout:' #(#LayoutFrame 0 0 64 0 71 0 85 0)
+                                        #'type:' #numberOrNil
+                                        #'model:' #'topFractionChannel'
+                                        #acceptOnLostFocus: true
+                                        #tabable: true
+                                    )
+                                  )
+                              )
+                              #'horizontalLayout:' #fit
+                              #'verticalLayout:' #spreadSpace
+                          )
+                           #(#VerticalPanelViewSpec
+                              #'name:' 'verticalPanelView'
+                              #'layout:' #(#LayoutFrame 150 0 24 0 220 0 216 0)
+                              #'component:' 
+                               #(#SpecCollection
+                                  #'collection:' 
+                                   #(
+                                     #(#InputFieldSpec
+                                        #'layout:' #(#LayoutFrame 0 0 21 0 114 0 42 0)
+                                        #'type:' #numberOrNil
+                                        #model: #leftOffsetChannel
+                                        #acceptOnLostFocus: true
+                                        #tabable: true
+                                    )
+                                     #(#InputFieldSpec
+                                        #'layout:' #(#LayoutFrame 0 0 64 0 114 0 85 0)
+                                        #'type:' #numberOrNil
+                                        #model: #topOffsetChannel
+                                        #acceptOnLostFocus: true
+                                        #tabable: true
+                                    )
+                                  )
+                              )
+                              #'horizontalLayout:' #fit
+                              #'verticalLayout:' #spreadSpace
+                          )
+                           #(#ActionButtonSpec
+                              #'name:' 'button'
+                              #'layout:' #(#LayoutFrame 16 0 210 0 76 0 240 0)
+                              #'label:' 'frame'
+                              #'model:' #setLayoutFrame
+                          )
+                           #(#ActionButtonSpec
+                              #'name:' 'button'
+                              #'layout:' #(#LayoutFrame 96 0 210 0 156 0 240 0)
+                              #'label:' 'origin'
+                              #'model:' #setLayoutOrigin
+                              #'initiallyDisabled:' true
+                          )
+                           #(#ActionButtonSpec
+                              #'name:' 'button'
+                              #'layout:' #(#LayoutFrame 176 0 210 0 236 0 240 0)
+                              #'label:' 'align'
+                              #'model:' #setAlignmentOrigin
+                          )
+                           #(#ActionButtonSpec
+                              #'name:' 'button'
+                              #'layout:' #(#LayoutFrame 96 0 260 0 156 0 290 0)
+                              #'label:' 'apply'
+                              #'model:' #setDimensionForLayoutOrigin
+                          )
+                           #(#LabelSpec
+                              #'name:' 'label'
+                              #'layout:' #(#LayoutFrame 77 0 9 0 137 0 31 0)
+                              #'label:' 'relative'
+                          )
+                           #(#LabelSpec
+                              #'name:' 'label'
+                              #'layout:' #(#LayoutFrame 159 0 9 0 205 0 30 0)
+                              #'label:' 'offset'
+                          )
+                        )
+                    )
+                    #'labelPosition:' #topLeft
+                    #'showFrame:' false
+                )
+              )
+          )
+          #'window:' 
+           #(#WindowSpec
+              #'label:' 'indy: unnamed'
+              #'bounds:' #(#Rectangle 0 0 255 292)
+          )
+      )
+
+!
+
+miscSpec
+    "UIBuilder new openOnClass:self andSelector:#miscSpec"
+    "Builder new openInterface:#miscSpec"
+
+    <resource: #canvas>
+
+    ^
+     
+       #(#FullSpec
+          #'component:' 
+           #(#SpecCollection
+              #'collection:' 
+               #(
+                 #(#FramedBoxSpec
+                    #'layout:' #(#LayoutFrame 0 0 -1 0 251 0 289 0)
+                    #'component:' 
+                     #(#SpecCollection
+                        #'collection:' 
+                         #(
+                           #(#VerticalPanelViewSpec
+                              #'layout:' #(#LayoutFrame 6 0 26 0 61 0 215 0)
+                              #'component:' 
+                               #(#SpecCollection
+                                  #'collection:' 
+                                   #(
+                                     #(#LabelSpec
+                                        #'layout:' #(#LayoutFrame 0 0 47 0 57 0 71 0)
+                                        #'label:' 'name:'
+                                    )
+                                  )
+                              )
+                              #'horizontalLayout:' #left
+                              #'verticalLayout:' #spreadSpace
+                          )
+                           #(#VerticalPanelViewSpec
+                              #'layout:' #(#LayoutFrame 60 0 24 0 230 0 213 0)
+                              #'component:' 
+                               #(#SpecCollection
+                                  #'collection:' 
+                                   #(
+                                     #(#InputFieldSpec
+                                        #model: #nameChannel
+                                        #'layout:' #(#LayoutFrame 0 0 49 0 163 0 69 0)
+                                        #acceptOnLostFocus: true
+                                        #tabable: true
+                                    )
+                                  )
+                              )
+                              #'horizontalLayout:' #fit
+                              #'verticalLayout:' #spreadSpace
+                          )
+                           #(#ActionButtonSpec
+                              #'layout:' #(#LayoutFrame 102 0 246 0 153 0 272 0)
+                              #'label:' 'apply'
+                              #'model:' #setMiscAspects
+                              #tabable: true
+                          )
+                        )
+                    )
+                    #'labelPosition:' #topLeft
+                    #'showFrame:' false
+                )
+              )
+          )
+          #'window:' 
+           #(#WindowSpec
+              #'label:' 'unnamed'
+              #'bounds:' #(#Rectangle 0 0 255 292)
+          )
+      )
+!
+
+modelSpec
+    "UIBuilder new openOnClass:self andSelector:#modelSpec"
+    "Builder new openInterface:#modelSpec"
+
+    <resource: #canvas>
+
+    ^
+     
+       #(#FullSpec
+          #'component:' 
+           #(#SpecCollection
+              #'collection:' 
+               #(
+                 #(#FramedBoxSpec
+                    #'layout:' #(#LayoutFrame 0 0 -1 0 251 0 289 0)
+                    #'component:' 
+                     #(#SpecCollection
+                        #'collection:' 
+                         #(
+                           #(#VerticalPanelViewSpec
+                              #'layout:' #(#LayoutFrame 6 0 26 0 78 0 216 0)
+                              #'component:' 
+                               #(#SpecCollection
+                                  #'collection:' 
+                                   #(
+                                     #(#LabelSpec
+                                        #'name:' 'label'
+                                        #'layout:' #(#LayoutFrame 0 0 47 0 57 0 71 0)
+                                        #'label:' 'aspect:'
+                                    )
+                                     #(#LabelSpec
+                                        #'name:' 'label'
+                                        #'layout:' #(#LayoutFrame 0 0 119 0 62 0 143 0)
+                                        #'label:' 'change:'
+                                    )
+                                  )
+                              )
+                              #'horizontalLayout:' #left
+                              #'verticalLayout:' #spreadSpace
+                          )
+                           #(#VerticalPanelViewSpec
+                              #'layout:' #(#LayoutFrame 80 0 24 0 231 0 214 0)
+                              #'component:' 
+                               #(#SpecCollection
+                                  #'collection:' 
+                                   #(
+                                     #(#InputFieldSpec
+                                        #'name:' 'aspectInput'
+                                        #'layout:' #(#LayoutFrame 0 0 49 0 163 0 69 0)
+                                        #model: #aspectChannel
+                                        #acceptOnLostFocus: true
+                                        #tabable: true
+                                    )
+                                     #(#InputFieldSpec
+                                        #'name:' 'changeInput'
+                                        #'layout:' #(#LayoutFrame 0 0 119 0 163 0 142 0)
+                                        #model: #changeChannel
+                                        #acceptOnLostFocus: true
+                                        #tabable: true
+                                    )
+                                  )
+                              )
+                              #'horizontalLayout:' #fit
+                              #'verticalLayout:' #spreadSpace
+                          )
+                           #(#ActionButtonSpec
+                              #'name:' 'button'
+                              #'layout:' #(#LayoutFrame 102 0 246 0 153 0 272 0)
+                              #'label:' 'apply'
+                              #'model:' #setModelAspects
+                          )
+                        )
+                    )
+                    #'labelPosition:' #topLeft
+                    #'showFrame:' false
+                )
+              )
+          )
+          #'window:' 
+           #(#WindowSpec
+              #'label:' 'unnamed'
+              #'bounds:' #(#Rectangle 0 0 255 292)
+          )
+      )
+! !
+
+!UIPainter methodsFor:'BuilderView interface'!
+
+setUndoLabel:aString
+    aString isNil ifTrue:[
+        (menu menuAt:#edit) labelAt:#undoAction put:'undo'.
+        (menu menuAt:#edit) disable:#undoAction
+    ] ifFalse:[
+        (menu menuAt:#edit) labelAt:#undoAction put:'undo: ' , aString.
+        (menu menuAt:#edit) enable:#undoAction
+    ]
+!
+
+update:something with:parameter
+    |singleSelection|
+
+    elementMenu deselect.
+
+    something == #undoHistory ifTrue:[
+        ^ self setUndoLabel:parameter
+    ].
+
+    singleSelection := workView singleSelection.
+
+    (something == #layout or:[something == #any]) ifTrue:[
+        singleSelection notNil ifTrue:[
+            self fetchLayoutFrom:singleSelection
+        ].
+        ^ self
+    ].
+
+    (something == #aspects or:[something == #any]) ifTrue:[
+        singleSelection notNil ifTrue:[
+            self fetchModelAspectsFrom:singleSelection
+        ].
+        ^ self
+    ].
+
+    (something == #selection or:[something == #any]) ifTrue:[
+        self showPropertyView.
+        self showOutletsFor:(workView selection).
+
+        singleSelection isNil ifFalse:[
+            nameChannel isNil ifTrue:[self nameChannel].
+            nameChannel value:singleSelection name.
+
+            self fetchLayoutFrom:singleSelection.
+            self fetchModelAspectsFrom:singleSelection.
+        ].
+        ^ self
+    ].
+! !
+
+!UIPainter methodsFor:'aspects'!
+
+aspectChannel
+    ^ aspectChannel
+
+    "Modified: 6.9.1995 / 01:00:30 / claus"
+!
+
+backgroundChannel
+    ^ bgChannel
+!
+
+bottomFractionChannel
+    ^ bottomFractionHolder
+!
+
+bottomOffsetChannel
+    ^ bottomOffsetHolder
+
+!
+
+changeChannel
+    ^ changeChannel
+
+    "Modified: 6.9.1995 / 01:00:33 / claus"
+!
+
+foregroundChannel
+    ^ fgChannel
+!
+
+leftAlignmentFractionChannel
+    ^ leftAlignmentFractionHolder
+
+!
+
+leftFractionChannel
+    ^ leftFractionHolder
+
+!
+
+leftOffsetChannel
+    ^ leftOffsetHolder
+
+!
+
+nameChannel
+    nameChannel isNil ifTrue:[
+	nameChannel := '' asValue.
+    ].
+    ^ nameChannel
+
+    "Modified: 6.9.1995 / 00:38:00 / claus"
+!
+
+rightFractionChannel
+    ^ rightFractionHolder
+
+!
+
+rightOffsetChannel
+    ^ rightOffsetHolder
+
+!
+
+topAlignmentFractionChannel
+    ^ topAlignmentFractionHolder
+
+!
+
+topFractionChannel
+    ^ topFractionHolder
+
+!
+
+topOffsetChannel
+    ^ topOffsetHolder
+
+! !
+
+!UIPainter methodsFor:'filein & fileout'!
+
+openFile:aFileName
+    |aStream |
+
+    aStream := FileStream readonlyFileNamed:aFileName.
+    aStream notNil ifTrue:[
+	workView fileInContentsFrom:aStream.
+	aStream close.
+	currentFileName := aFileName
+    ]
+
+!
+
+saveAs:aFileName
+    |aStream|
+
+    aStream := FileStream newFileNamed:aFileName.
+    aStream notNil ifTrue:[
+	workView storeContentsOn:aStream.
+	aStream close
+    ].
+    currentFileName := aFileName
+
+! !
+
+!UIPainter methodsFor:'help'!
+
+helpTextFor:aComponent
+    |sel|
+
+    (aComponent isKindOf:Button) ifTrue:[
+	(sel := aComponent changeMessage) notNil ifTrue:[
+	    "/ take the buttons change symbol as resource-key
+	    ^ resources string:(sel asString)
+	]
+    ].
+    ^ nil
+
+    "Modified: 31.8.1995 / 20:49:58 / claus"
+! !
+
+!UIPainter methodsFor:'initialization'!
+
+buttonPanelSpec
+    "return a spec for the buttons in the panel;
+     entries consists of selector and bitmap-filename.
+     nil selectors are taken as separators (see setupButtonPanel)"
+
+    ^ #(
+        #(alignSelectionLeft         true 'b_alignL.xbm'  nil false)
+        #(alignSelectionRight        true 'b_alignR.xbm'  nil false)
+        #(alignSelectionLeftAndRight true 'b_alignLR.xbm' nil false)
+        #(nil                        nil  nil nil)
+        #(alignSelectionTop          true 'b_alignT.xbm'  nil false)
+        #(alignSelectionBottom       true 'b_alignB.xbm'  nil false)
+        #(alignSelectionTopAndBottom true 'b_alignTB.xbm' nil false)
+        #(nil                        nil  nil nil)
+        #(alignSelectionCenterHor    true 'b_alignCH.xbm' nil false)
+        #(alignSelectionCenterVer    true 'b_alignCV.xbm' nil false)
+        #(nil                        nil  nil nil)
+        #(moveSelectionLeft          true 'b_moveLeft.xbm'  nil true)
+        #(moveSelectionRight         true 'b_moveRight.xbm' nil true)
+        #(moveSelectionUp            true 'b_moveUp.xbm'    nil true)
+        #(moveSelectionDown          true 'b_moveDown.xbm'  nil true)
+        #(moveSelectionLeft10        true 'b_moveLeft2.xbm'  nil true)
+        #(moveSelectionRight10       true 'b_moveRight2.xbm' nil true)
+        #(moveSelectionUp10          true 'b_moveUp2.xbm'    nil true)
+        #(moveSelectionDown10        true 'b_moveDown2.xbm'  nil true)
+     )
+
+    "Modified: 5.9.1995 / 22:20:36 / claus"
+!
+
+createCanvas 
+    |topView|
+
+    super initialize.
+
+    topView := StandardSystemView new.
+    topView label:'unnamed'.
+    topView extent:300@300.
+
+    workView := UIPainterView in:topView.
+    workView layout:(0.0 @ 0.0 corner:1.0 @ 1.0) asLayout.
+
+    ^ workView.
+
+    "Builder new createCanvas open"
+!
+
+createPaletteIn:aViewOrNil
+    |topView v|
+
+    aViewOrNil isNil ifTrue:[
+        topView := StandardSystemView new.
+        topView label:'element palette'.
+        topView extent:200@400.
+    ] ifFalse:[
+        topView := aViewOrNil
+    ].
+    v := HVScrollableView for:SelectionInListView miniScrollerH:true in:topView.
+    v origin:(0.0 @ 0.0) corner:(1.0 @ 1.0).
+    elementMenu := v scrolledView.
+
+    ^ elementMenu.
+
+    "(Builder new createPaletteIn:nil) topView open"
+
+    "Modified: 5.9.1995 / 23:52:57 / claus"
+!
+
+initChannels
+
+    bottomFractionHolder        := nil asValue.
+    bottomOffsetHolder          := nil asValue.
+    leftFractionHolder          := nil asValue.
+    leftOffsetHolder            := nil asValue.
+    rightFractionHolder         := nil asValue.
+    rightOffsetHolder           := nil asValue.
+    topFractionHolder           := nil asValue.
+    topOffsetHolder             := nil asValue.
+    leftAlignmentFractionHolder := nil asValue.
+    topAlignmentFractionHolder  := nil asValue.
+
+    fgChannel := nil asValue.
+    bgChannel := nil asValue.
+
+    aspectChannel := nil asValue.
+    changeChannel := nil asValue.
+
+!
+
+initPullDownMenu
+    menu labels:(resources  array:#(
+                                    'file'
+                                    'edit'
+                                    'font'
+                                    'type'
+                                    'align'
+                                    'dimension'
+                                    'form'
+                                    'special'
+                                    'code'
+                                    'debug'
+                                    'test'
+                                 )).
+
+    menu selectors:#(#file
+                     #edit
+                     #font
+                     #type
+                     #align 
+                     #dimension 
+                     #form
+                     #special
+                     #code
+                     #debugging
+                     #test
+                    ).
+
+    menu at:#file 
+            putLabels:(resources  array:
+                      #('new'
+                        'from class' 
+                        'pick a view ' 
+                        '-'
+                        'save' 
+                        'save as ...' 
+                        '-'
+                        'compile' 
+                        '-'
+                        'source' 
+                        'windowSpec' 
+                        'inspect me' 
+                        '-'
+                        'print'
+                        '-'
+                        'quit'
+                       ))
+            selectors:#(doNew 
+                        doFromClass
+                        doPickAView
+                        nil
+                        doSave 
+                        doSaveAs 
+                        nil 
+                        doCompile 
+                        nil 
+                        doSource 
+                        doWindowSpec 
+                        inspect
+                        nil 
+                        doPrint
+                        nil 
+                        doFinish
+                       )
+             receiver:self.
+
+    menu at:#edit 
+            putLabels:(resources  array:#(
+                        'undo' 
+"/                        'copy' 
+                        'cut'
+"/                        'paste'
+                       ))
+            selectors:#(
+                        undoAction
+"/                        copySelection 
+                        deleteSelection
+"/                        pasteBuffer
+                       )
+             receiver:workView.
+
+    menu at:#font 
+            putLabels:(resources  array:#(
+                        'larger' 
+                        'smaller'
+                        '-'
+                        'normal'
+                        'bold'
+                        'italic'
+                        'bold italic'
+                        '-'
+                        'font panel'
+                       ) )
+            selectors:#(largerFont 
+                        smallerFont
+                        nil
+                        normalFont
+                        boldFont
+                        italicFont
+                        boldItalicFont
+                        nil
+                        showFontPanel
+                       )
+             receiver:workView.
+
+    menu at:#type 
+            putLabels:(resources  array:#(
+                        'basic widgets' 
+                        'layout'
+                        'text'
+                        'interactors'
+                        'modal'
+                        'other'
+                        '-'
+                        'all'
+                       ) )
+            selectors:#(showBasicWidgets 
+                        showLayoutWidgets
+                        showTextWidgets
+                        showInteractorWidgets
+                        showModalWidgets
+                        showOtherWidgets
+                        nil
+                        showAllWidgets
+                       )
+             receiver:self.
+
+    menu at:#align 
+            putLabels:(resources  array:#(
+"/                        'raise' 
+"/                        'lower'
+"/                        '-'
+                        'align left' 
+                        'align right'
+                        'align left & right'
+                        'align top' 
+                        'align bottom'
+                        'align centered vertical'
+                        'align centered horizontal'
+                        '-'
+                        'spread horizontal'
+                        'spread vertical'
+                        'center horizontal in frame'
+                        'center vertical in frame'
+                       ) )
+            selectors:#(
+"/                        raiseSelection 
+"/                        lowerSelection
+"/                        nil
+                        alignSelectionLeft
+                        alignSelectionRight
+                        alignSelectionLeftAndRight
+                        alignSelectionTop
+                        alignSelectionBottom
+                        alignSelectionCenterHor
+                        alignSelectionCenterVer
+                        nil
+                        spreadSelectionHor
+                        spreadSelectionVer
+                        centerSelectionHor
+                        centerSelectionVer
+                       )
+             receiver:workView.
+
+    menu at:#dimension 
+            putLabels:(resources  array:#(
+                        'default extent' 
+                        'default width' 
+                        'default height'
+                        '-'
+                        'copy extent' 
+                        'paste extent'
+                        'paste width'
+                        'paste height'
+                        '-'
+                        'insert'
+                       ) )
+            selectors:#(
+                        setToDefaultExtent
+                        setToDefaultWidth
+                        setToDefaultHeight
+                        nil
+                        copyExtent
+                        pasteExtent
+                        pasteWidth
+                        pasteHeight
+                        nil
+                        insertSelection
+                       )
+             receiver:workView.
+
+    menu at:#form 
+            putLabels:(resources  array:#(
+                        'align to grid'
+                        'show grid' 
+                       ) )
+            selectors:#(
+                        alignOn
+                        toggleGrid
+                       )
+             receiver:self.
+
+    menu at:#special 
+            putLabels:(resources  array:#(
+                        'group radioButtons' 
+                        'group enterFields' 
+                       ) )
+            selectors:#(
+                        groupRadioButtons 
+                        groupEnterFields
+                       )
+             receiver:workView.
+
+    menu at:#code 
+            putLabels:(resources  array:#(
+                        'class' 
+                        'method' 
+"/                        'variables' 
+                       ) )
+            selectors:#(
+                        changeClass
+                        changeMethod
+"/                        changeVariables
+                       )
+             receiver:self.
+
+    menu at:#debugging 
+            putLabels:(resources array:#(
+                        'inspect'
+                        'inspect attributes'
+                       ) )
+            selectors:#(
+                        inspectSelection
+                        inspectAttributes
+                       )
+             receiver:workView.
+
+    menu at:#test 
+            putLabels:(resources array:#(
+                        'test on' 
+                       ) )
+            selectors:#(toggleTest 
+                       )
+             receiver:self.
+
+    self setUndoLabel:nil.
+!
+
+openInterface 
+    |list panel topPane botPanel v 
+     leftPanel middlePanel rightPanel buttonPanel propSelector|
+
+    super initialize.
+
+    self initChannels.
+
+    whichProperty := SelectionInList new.
+    whichProperty list:#('dimension' 'colors' 'model' 'misc' 'attribute list').
+    whichProperty onChangeSend:#propertySelectionChanged to:self.
+
+    workView :=self createCanvas.
+
+    topView := StandardSystemView new.
+    topView label:'Interface Builder'.
+    topView icon:(Image fromFile:'bitmaps/Builder.xbm' resolution:100).
+    topView extent:(600 @ 400).
+
+    menu := PullDownMenu in:topView.
+
+    buttonPanel := self setupButtonPanelIn:topView below:menu.
+
+    leftPanel := View in:topView.
+    leftPanel origin:(0.0 @ 0.0) corner:0.3@1.0.
+    leftPanel topInset:menu height + buttonPanel height + View viewSpacing.
+
+    middlePanel := View in:topView.
+    middlePanel origin:(0.3 @ 0.0) corner:0.6@1.0.
+    middlePanel topInset:menu height + buttonPanel height + View viewSpacing.
+
+    rightPanel := View in:topView.
+    rightPanel origin:(0.6 @ 0.0) corner:1.0@1.0.
+    rightPanel topInset:menu height + buttonPanel height + View viewSpacing.
+
+    v := HVScrollableView for:UIPainterView miniScrollerH:true in:middlePanel.
+    v origin:(0.0 @ 0.0) corner:(1.0 @ 1.0).
+    treeView := v scrolledView.
+
+    propSelector := PopUpList label:'properties' in:rightPanel.
+    propSelector origin:(0.0 @ 0.0) corner:1.0@(propSelector preferredExtent y).
+    propSelector horizontalInset:View viewSpacing.
+    propSelector model:whichProperty.
+
+    propertyFrame := View in:rightPanel.
+    propertyFrame origin:(0.0 @ 0.0) corner:1.0@1.0.
+    propertyFrame topInset:propSelector height + View viewSpacing.
+
+"/    panel := VariableVerticalPanel in:topView.
+"/    panel origin:(0.0 @ 0.0) corner:0.5@1.0.
+"/    panel topInset:menu height + buttonPanel height + View viewSpacing.
+
+"/    topPane := View in:panel.
+"/    topPane origin:(0.0 @ 0.0) corner:(1.0 @ 0.5).
+"/    topPane borderWidth:0.
+
+"/    botPanel := VariableHorizontalPanel in:panel.
+"/    botPanel origin:(0.0 @ 0.5) corner:(1.0 @ 1.0).
+"/    botPanel borderWidth:0.
+
+    elementMenu := self createPaletteIn:leftPanel.
+
+"/    v := ScrollableView for:UIPainterView in:botPanel.
+"/    v origin:(0.0 @ 0.0) corner:(0.5 @ 1.0).
+"/    treeView := v scrolledView.
+
+"/    v := ScrollableView for:SelectionInListView in:botPanel.
+"/    v origin:(0.5 @ 0.0) corner:(1.0 @ 1.0).
+"/    outletView := v scrolledView.
+"/    outletView action:[:lineNr | self selectOutlet:lineNr].
+
+"/    v := ScrollableView for:TextCollector in:topPane.
+"/    v origin:(0.0 @ 0.0) corner:(1.0 @ 1.0).
+"/    infoView := v scrolledView.
+
+    treeView builderView:workView.  "link workview with treeview"
+
+    workView addDependent:treeView.
+    workView addDependent:self.
+
+    self initPullDownMenu.
+
+    elementMenu action:[:selection |
+        workView testMode ifTrue:[
+            elementMenu deselect
+        ] ifFalse:[
+            selection notNil ifTrue:[
+                workView createWidgetWithClass:
+                        (Smalltalk at:(elementMenu selectionValue asSymbol))
+            ]
+        ]
+    ].
+    topView application:self.   
+    builder window:topView.
+
+    topView beMaster.
+    workView topView beSlave.
+
+    "/ can be created as embedded or side-menu
+    elementMenu topView ~~ topView ifTrue:[
+        elementMenu topView beSlave.
+    ].
+
+    topView open.
+    workView topView openInGroup:(topView windowGroup).
+    elementMenu topView ~~ topView ifTrue:[
+        elementMenu topView openInGroup:(topView windowGroup).
+    ]
+
+    "
+     Builder open
+    "
+
+    "Modified: 6.9.1995 / 00:26:59 / claus"
+!
+
+openNewWindowCanvas
+    self open.
+
+
+!
+
+openOnClass:aClass andSelector:aSelector
+    "open up an interface builder, fetching a spec from someClass
+     via some selector"
+
+    |specArray|
+
+    specClass := aClass.
+    specSelector :=  aSelector.
+    self openInterface.
+    workView className:aClass name.
+    workView methodName:aSelector.
+    workView setupFromSpec:(aClass perform:aSelector).
+!
+
+openOnSpec:aSpecOrSpecArray
+    "open up an interface builder, given some specArray"
+
+    |newBuilder|
+
+    newBuilder := self new.
+!
+
+setupButtonPanelIn:aTopView below:aMenu
+    "create the buttonPanel"
+
+    |spc mh buttonPanel|
+
+    spc := View viewSpacing // 2.
+    buttonPanel := HorizontalPanelView in:aTopView.
+    buttonPanel level:-1; borderWidth:0.
+    buttonPanel horizontalLayout:#leftSpace.
+
+    self buttonPanelSpec do:[:entry |
+	|sel toCanvas imgFile label b sep autoRepeat|
+
+	sel := entry at:1.
+	sel isNil ifTrue:[
+	    sep := View in:buttonPanel.
+	    sep extent:20@1; borderWidth:0.
+	] ifFalse:[
+	    toCanvas := entry at:2.
+	    imgFile := entry at:3.
+	    label := entry at:4.
+	    autoRepeat := entry at:5.
+	    b := Button in:buttonPanel.
+	    autoRepeat ifTrue:[
+		b autoRepeat:autoRepeat.
+		b controller beTriggerOnDown.
+	    ].
+	    imgFile notNil ifTrue:[
+		b logo:(Image fromFile:imgFile).
+	    ] ifFalse:[
+		b logo:label
+	    ].
+	    toCanvas ifTrue:[
+		b model:workView 
+	    ] ifFalse:[
+		b model:self
+	    ].
+	    b changeMessage:sel
+	]
+    ].
+
+    mh := aMenu height.
+    buttonPanel origin:0.0 @ (mh + spc)
+		corner:(1.0 @ (mh + spc + buttonPanel preferredExtent y)).
+
+    buttonPanel leftInset:spc; rightInset:spc.
+    ^ buttonPanel
+
+    "Modified: 5.9.1995 / 22:23:13 / claus"
+! !
+
+!UIPainter methodsFor:'misc'!
+
+listOfOutletsFor:aViewClass
+    "return a list of outlets for a view-class"
+
+    |l1 l2 all rej|
+
+    (aViewClass == Object) ifTrue:[^ nil].
+
+    l1 := self listOfOutletsFor:(aViewClass superclass).
+    l2 := self listOfOutletsForClass:aViewClass.
+
+    l2 isNil ifTrue:[
+	all := l1
+    ] ifFalse:[
+	l1 isNil ifTrue:[
+	    all := l2
+	] ifFalse:[
+	    all := l1 , l2
+	]
+    ].
+    rej := self rejectOutletsForClass:aViewClass.
+    rej notNil ifTrue:[
+	rej do:[:x |
+	    all := all copyWithout:x
+	]
+    ].
+    ^ all
+!
+
+listOfOutletsForClass:aViewClass
+    "return a list of outlets for a view-class"
+
+    "could this be done automatically ?"
+
+    (aViewClass == Label) ifTrue:[
+	^ #('label'
+	    'iconic-label'
+	    'label layout'
+	    'fixed size'
+	    'foreground-color'
+	    'background-color'
+	   )
+    ].
+    (aViewClass == Button) ifTrue:[
+	^ #(
+	    'active foreground-color'
+	    'active background-color'
+	    'active level'
+	    'passive level'
+	    'press action'
+	   )
+    ].
+    (aViewClass == Toggle) ifTrue:[
+	^ #(
+	    'release action'
+	   )
+    ].
+    (aViewClass == CheckBox) ifTrue:[
+	^ #(
+	    'label'
+	   )
+    ].
+    (aViewClass == FramedBox) ifTrue:[
+	^ #(
+	    'label'
+	    'label position'
+	    'frame shown'
+	   )
+    ].
+    (aViewClass == VerticalPanelView) ifTrue:[
+	^ #(
+	    'horizontal layout'
+	    'vertical layout'
+	   )
+    ].
+    (aViewClass == HorizontalPanelView) ifTrue:[
+	^ #(
+	    'horizontal layout'
+	    'vertical layout'
+	   )
+    ].
+    (aViewClass == VariableVerticalPanel) ifTrue:[
+	^ #(
+	    'handle position'
+	    'style'
+	   )
+    ].
+    (aViewClass == ListView) ifTrue:[
+	^ #(
+	    'contents'
+	   )
+    ].
+    (aViewClass == SelectionInListView) ifTrue:[
+	^ #(
+	    'press action'
+	   )
+    ].
+    (aViewClass == EditField) ifTrue:[
+	^#(
+	   'initialText'
+	   'field type'
+	   'field length'
+	  )
+    ].
+    (aViewClass == View) ifTrue:[
+	^ #(
+	    'level'
+	    'view background-color'
+	   )
+    ].
+    (aViewClass == Scroller) ifTrue:[
+	^ #(
+	    'scroll action'
+	    'asynchronous'
+	    'synchronous'
+	   )
+    ].
+    (aViewClass == ScrollBar) ifTrue:[
+	^ #(
+	    'scroll action'
+	    'scrollDown action'
+	    'scrollUp action'
+	    'asynchronous'
+	    'synchronous'
+	   )
+    ].
+    (aViewClass == HorizontalScrollBar) ifTrue:[
+	^ #(
+	    'scrollLeft action'
+	    'scrollRight action'
+	   )
+    ].
+    (aViewClass == PullDownMenu) ifTrue:[
+	^ #(
+	    'labels'
+	    'actions'
+	   )
+    ].
+    (aViewClass == Separator) ifTrue:[
+	^ #(
+	    'orientation'
+	   )
+    ].
+    ^ nil
+
+    "Modified: 6.9.1995 / 13:42:09 / claus"
+!
+
+rejectOutletsForClass:aViewClass
+    "return a list of suppressed outlets for a view-class"
+
+    "could this be done automatically ?"
+
+    (aViewClass == CheckToggle) ifTrue:[
+	^ #(
+	    'iconic-label'
+	   )
+    ].
+    (aViewClass == CheckBox) ifTrue:[
+	^ #(
+	    'horizontal layout'
+	    'vertical layout'
+	   )
+    ].
+    (aViewClass == HorizontalScrollBar) ifTrue:[
+	^ #(
+	    'scrollUp action'
+	    'scrollDown action'
+	   )
+    ].
+    ^ nil
+
+    "Modified: 4.9.1995 / 18:55:03 / claus"
+!
+
+setupPropertyFromSpec:aSpec
+    "setup menu from spec
+    "
+    outletView := nil.
+
+    specShown ~= aSpec ifTrue:[
+        propertyFrame destroySubViews.
+        builder buildFromSpec:aSpec in:propertyFrame.
+        propertyFrame realizeAllSubViews.
+    ].
+    specShown := aSpec
+!
+
+showOutletsFor:aView
+    |c outlets|
+
+    outletView isNil ifTrue:[^ self].
+
+    (aView isKindOf:SimpleView) ifFalse:[
+	outletView list:nil.
+	^ self
+    ].
+    c := aView class.
+
+    outlets := self listOfOutletsFor:c.
+    outletView list:outlets
+
+    "Modified: 5.9.1995 / 21:51:57 / claus"
+! !
+
+!UIPainter methodsFor:'private - fetch'!
+
+fetchLayoutFrom:aView
+    |layout extent|
+
+    layout := aView geometryLayout.
+    layout isNil ifTrue:[^ self].
+
+    layout isLayout ifFalse:[
+        layout isRectangle ifTrue:[
+            leftOffsetHolder   value:(layout left).
+            rightOffsetHolder  value:(layout right).
+            topOffsetHolder    value:(layout top).
+            bottomOffsetHolder value:(layout bottom).
+            ^ self
+        ].
+        layout isPoint ifTrue:[
+            leftOffsetHolder   value:(layout left).
+            rightOffsetHolder  value:(layout right).
+            ^ self
+        ].
+    ].
+
+    leftOffsetHolder   value:(layout leftOffset).
+    leftFractionHolder value:(layout leftFraction).
+    topFractionHolder  value:(layout topFraction).
+    topOffsetHolder    value:(layout topOffset).
+
+    layout isLayoutFrame ifTrue:[
+        rightOffsetHolder    value:(layout rightOffset).
+        bottomOffsetHolder   value:(layout bottomOffset).
+        rightFractionHolder  value:(layout rightFraction).
+        bottomFractionHolder value:(layout bottomFraction).
+
+        leftAlignmentFractionHolder value:0.
+        topAlignmentFractionHolder  value:0.
+
+    ] ifFalse:[
+        extent := aView extent.
+
+        rightOffsetHolder    value:(layout leftOffset + extent x).
+        bottomOffsetHolder   value:(layout topOffset  + extent y).
+
+        rightFractionHolder  value:0.
+        bottomFractionHolder value:0.
+
+        layout isAlignmentOrigin ifTrue:[
+            leftAlignmentFractionHolder value:(layout leftAlignmentFraction).
+            topAlignmentFractionHolder  value:(layout topAlignmentFraction)
+        ] ifFalse:[
+            leftAlignmentFractionHolder value:0.
+            topAlignmentFractionHolder  value:0
+        ]
+    ].
+
+
+!
+
+fetchModelAspectsFrom:aView
+    aspectChannel value:(workView aspectSelectorForView:aView).
+    changeChannel value:(workView changeSelectorForView:aView).
+
+! !
+
+!UIPainter methodsFor:'setup choices'!
+
+showAllWidgets
+    "create list of basic widgets"
+
+    self showWidgetsWhere:[:class | true]
+!
+
+showBasicWidgets
+    "create list of basic widgets"
+
+    self showWidgetsInCategory:'Views-Basic' 
+			butNot:[:class | class isKindOf:ModalBox class]
+!
+
+showInteractorWidgets
+    "create list of interactor widgets"
+
+    self showWidgetsInCategory:'Views-Interactors'
+			butNot:[:class | class isKindOf:ModalBox class]
+!
+
+showLayoutWidgets
+    "create list of basic widgets"
+
+    self showWidgetsInCategory:'Views-Layout'
+			butNot:[:class | class isKindOf:ModalBox class]
+!
+
+showModalWidgets
+    "create list of modal widgets"
+
+    self showWidgetsWhere:[:class | class isKindOf:ModalBox class]
+!
+
+showOtherWidgets
+    "create list of other widgets"
+
+    |check cat|
+
+    check := [:class |
+		(#('Views-Basic' 
+		   'Views-Interactors'
+		   'Views-Layout'
+		   'Views-Text') includes:class category) not].
+    self showWidgetsWhere:check
+		   butNot:[:class | class isKindOf:ModalBox class]
+!
+
+showTextWidgets
+    "create list of basic widgets"
+
+    self showWidgetsInCategory:'Views-Text'
+			butNot:[:class | class isKindOf:ModalBox class]
+!
+
+showWidgetsInCategory:aCategory
+    "create list of basic widgets"
+
+    self showWidgetsWhere:[:class | class category = aCategory]
+!
+
+showWidgetsInCategory:aCategory butNot:excludeBlock
+    "create list of basic widgets"
+
+    self showWidgetsWhere:[:class | class category = aCategory]
+		   butNot:excludeBlock
+!
+
+showWidgetsWhere:aBlock
+    "create list of widgets where aBlock avaluates to true"
+
+    self showWidgetsWhere:aBlock butNot:[:class | false]
+!
+
+showWidgetsWhere:aBlock butNot:excludeBlock
+    "create list of widgets where aBlock evaluates to true and excludeBlock
+     evaluates to false"
+
+    |list|
+
+    list := OrderedCollection new:0.
+    SimpleView allSubclassesDo:[:aSubclass |
+        (aBlock value:aSubclass) ifTrue:[
+            (excludeBlock value:aSubclass) ifFalse:[
+                list add:(aSubclass name)
+            ]
+        ]
+    ].
+    (aBlock value:View) ifTrue:[
+        (excludeBlock value:View) ifFalse:[
+            list add:'View'
+        ]
+    ].
+    (list size == 0) ifFalse:[
+        list sort
+    ].
+    elementMenu list:list
+! !
+
+!UIPainter methodsFor:'user actions - dimension'!
+
+setAlignmentOrigin
+    "apply is pressed in the geometry-sub view, with a alignmentOrigin selected
+    "
+    self setupPropertyFromSpec:(self class geometrySpecForAlignmentOrigin)
+!
+
+setDimensionForAlignmentOrigin
+    |view layout|
+
+    view := workView singleSelection.
+
+    view notNil ifTrue:[
+        layout := AlignmentOrigin new.
+
+        layout   leftOffset:(leftOffsetHolder   value) ? 0.
+        layout    topOffset:(topOffsetHolder    value) ? 0.
+        layout leftFraction:(leftFractionHolder value) ? 0.
+        layout  topFraction:(topFractionHolder  value) ? 0.
+
+        layout leftAlignmentFraction:(leftAlignmentFractionHolder value) ? 0.
+        layout  topAlignmentFraction:(topAlignmentFractionHolder  value) ? 0.
+
+        workView setDimension:layout.
+    ]
+!
+
+setDimensionForLayoutFrame
+    |view layout|
+
+    view := workView singleSelection.
+
+    view notNil ifTrue:[
+        layout := LayoutFrame new.
+
+        layout leftOffset:(leftOffsetHolder value) ? 0.
+        layout rightOffset:(rightOffsetHolder value) ? 0.
+        layout topOffset:(topOffsetHolder value) ? 0.
+        layout bottomOffset:(bottomOffsetHolder value) ? 0.
+        layout leftFraction:(leftFractionHolder value) ? 0.
+        layout rightFraction:(rightFractionHolder value) ? 0.
+        layout topFraction:(topFractionHolder value) ? 0.
+        layout bottomFraction:(bottomFractionHolder value) ? 0.
+
+        workView setDimension:layout.
+    ]
+!
+
+setDimensionForLayoutOrigin
+    |view layout|
+
+    view := workView singleSelection.
+
+    view notNil ifTrue:[
+        layout := LayoutOrigin new.
+
+        layout leftOffset:(leftOffsetHolder value) ? 0.
+        layout topOffset:(topOffsetHolder value) ? 0.
+
+        layout leftFraction:(leftFractionHolder value) ? 0.
+        layout topFraction:(topFractionHolder value) ? 0.
+
+        workView setDimension:layout.
+    ]
+!
+
+setLayoutFrame
+    "apply is pressed in the geometry-sub view, with a layoutFrame selected
+    "
+    self setupPropertyFromSpec:(self class geometrySpecForLayoutFrame)
+!
+
+setLayoutOrigin
+    "apply is pressed in the geometry-sub view, with a layoutOrigin selected
+    "
+    self setupPropertyFromSpec:(self class geometrySpecForLayoutOrigin)
+! !
+
+!UIPainter methodsFor:'user actions - form'!
+
+alignOff
+    |m|
+
+    m := menu menuAt:#form.
+    m labelAt:#alignOff put:(resources string:'align to grid').
+    m selectorAt:#alignOff put:#alignOn.
+    workView alignOff
+!
+
+alignOn
+    |m|
+
+    m := menu menuAt:#form.
+    m labelAt:#alignOn put:(resources string:'do not align to grid').
+    m selectorAt:#alignOn put:#alignOff.
+    workView alignOn
+!
+
+toggleGrid
+    |m|
+
+    m := menu menuAt:#form.
+
+    workView gridShown ifFalse:[
+        m labelAt:#toggleGrid put:(resources string:'hide grid').
+        workView showGrid
+    ] ifTrue:[
+        m labelAt:#toggleGrid put:(resources string:'show grid').
+        workView hideGrid
+    ]
+! !
+
+!UIPainter methodsFor:'user interaction'!
+
+closeRequest
+    workView  notNil ifTrue:[workView  release].
+    fileBox   notNil ifTrue:[fileBox   destroy].
+    stringBox notNil ifTrue:[stringBox destroy].
+    actionBox notNil ifTrue:[actionBox destroy].
+    listBox   notNil ifTrue:[listBox   destroy].
+    super closeRequest
+!
+
+doCompile
+   |code|
+
+   code := workView generateCode.
+   (ReadStream on:code) fileIn.
+
+    "Modified: 4.9.1995 / 17:06:10 / claus"
+!
+
+doFinish
+    self closeRequest
+!
+
+doFromClass
+        |className methodName cls sel accepted failed spec s|
+
+        className := '' asValue.
+        methodName := '' asValue.
+        (s := workView className) notNil ifTrue:[
+            className value:s
+        ].
+        (s := workView methodName) notNil ifTrue:[
+            methodName value:s
+        ].
+
+        failed := false.
+        [
+            accepted :=
+                (DialogBox new
+                    addTextLabel:'Classes name:';
+                    addInputFieldOn:className; 
+                    addVerticalSpace;
+                    addTextLabel:'methods name:';
+                    addInputFieldOn:methodName; 
+                    addAbortButton; 
+                    addOkButton; 
+                    open
+                ) accepted.
+
+             accepted ifTrue:[
+                cls := Smalltalk classNamed:className value.
+                cls isNil ifTrue:[
+                    failed := true.
+                    self warn:'no such class'.
+                ] ifFalse:[
+                    sel := methodName value asSymbol.
+                    (cls respondsTo:sel ) ifFalse:[
+                        failed := true.
+                        self warn:'no such method'
+                    ] ifTrue:[
+                        spec := cls perform:sel.
+                        spec isArray ifFalse:[
+                            failed := true.
+                            self warn:'not a windowSpec method'    
+                        ].
+                        "/ ok, got it
+                        workView className:className value.
+                        workView methodName:methodName value.
+                        workView setupFromSpec:spec.
+                        ^ self
+                     ]
+                ]
+             ]
+        ] doWhile:[accepted and:[failed]].
+
+    "Modified: 5.9.1995 / 18:47:57 / claus"
+!
+
+doNew
+    workView removeAll.
+    ^ self
+
+    "Modified: 5.9.1995 / 20:52:21 / claus"
+!
+
+doOpen
+    fileBox isNil ifTrue:[
+	fileBox := FileSelectionBox
+			title:''
+			"pattern:'*.sib'"
+			okText:''
+			abortText:(Resource name:'BUILDER_ABORT_LABEL'
+					fromFile:'Builder.rs')
+			action:[nil]
+    ].
+    fileBox title:(Resource name:'BUILDER_OPEN_TITLE' fromFile:'Builder.rs').
+    fileBox action:[:fileName | self openFile:fileName].
+    fileBox okText:(Resource name:'BUILDER_OPEN_OK_LABEL' fromFile:'Builder.rs').
+    fileBox showAtPointer
+!
+
+doPickAView
+    |view className methodName cls sel accepted spec s|
+
+    view := Display viewFromUser.
+    view isNil ifTrue:[^ self].
+
+    spec := UISpecification fromView:view topView.
+
+    "/ ok, got it
+    workView setupFromSpec:spec.
+    workView className:view class name.
+    workView methodName:#newSpec.
+    ^ self
+
+    "Modified: 5.9.1995 / 23:25:53 / claus"
+!
+
+doPrint
+    ^ self
+!
+
+doSave
+    currentFileName notNil ifTrue:[
+	self saveAs:currentFileName
+    ] ifFalse:[
+	self doSaveAs
+    ]
+!
+
+doSaveAs
+    fileBox isNil ifTrue:[
+	fileBox := FileSelectionBox
+			title:''
+			"pattern:'*.draw'"
+			okText:''
+			abortText:(Resource name:'BUILDER_ABORT_LABEL'
+					fromFile:'Builder.rs')
+			action:[nil]
+    ].
+    fileBox title:(Resource name:'BUILDER_SAVE_TITLE' fromFile:'Builder.rs').
+    fileBox action:[:fileName | self saveAs:fileName].
+    fileBox okText:(Resource name:'BUILDER_SAVE_OK_LABEL' fromFile:'Builder.rs').
+    fileBox showAtPointer
+!
+
+doSource
+   |code v|
+
+   code := workView generateCode.
+   v := CodeView open.
+   v contents:code.
+   v label:(workView applicationName).
+    ^ self
+
+    "Modified: 5.9.1995 / 21:02:05 / claus"
+!
+
+doWindowSpec
+   |code v|
+
+   code := workView generateWindowSpec.
+   v := CodeView open.
+   v contents:code.
+   v label:'windowSpec'.
+    ^ self
+
+    "Modified: 5.9.1995 / 21:04:14 / claus"
+!
+
+propertySelectionChanged
+    workView singleSelectionDo:[:selectedView |
+        propertyShown   := whichProperty selection.
+        self showPropertyView
+    ]
+!
+
+selectOutlet:nr
+    |outlet type sel text box action initialText initialList
+     view prop t val|
+
+    outlet := outletView selectionValue.
+    outletView deselect.
+    view := workView selection.
+    view isNil ifTrue:[
+        self notify:'select something first'.
+        ^ self
+    ].
+    action := [:s | self setOutlet:sel type:type to:s in:view].
+    (outlet = 'label') ifTrue:[
+        type := #string.
+        sel := #label:.
+        text := 'label-text:'.
+        initialText := view label
+    ].
+    (outlet = 'fixed size') ifTrue:[
+        type := #boolean.
+        sel := #sizeFixed:.
+        text := 'size is fix:'.
+    ].
+    (outlet = 'frame shown') ifTrue:[
+        type := #boolean.
+        sel := #showFrame:.
+        text := 'frame is to be drawn:'.
+    ].
+    (outlet = 'labels') ifTrue:[
+        type := #strings.
+        sel := #labels:.
+        initialText := view labels
+    ].
+    (outlet = 'contents') ifTrue:[
+        type := #text.
+        sel := #contents:.
+        initialText := view contents
+    ].
+    (outlet = 'initialText') ifTrue:[
+        type := #string.
+        sel := #initialText:.
+        initialText := view contents
+    ].
+    (outlet = 'field type') ifTrue:[
+        type := #fieldTypeSymbol.
+        sel := #type:.
+        initialList := #(number    
+                         string
+                         password
+                        ).
+        initialText := view converter isNil ifTrue:[#string] ifFalse:[view converter type].
+    ].
+    (outlet = 'field length') ifTrue:[
+        type := #numberOrNil.
+        sel := #maxChars:.
+        text := 'field length (empty -> unlimited)'.
+        initialText := view maxChars isNil ifTrue:[''] ifFalse:[view maxChars printString].
+    ].
+    (outlet = 'level') ifTrue:[
+        type := #number.
+        sel := #level:.
+        initialText := view level printString
+    ].
+    (outlet = 'active level') ifTrue:[
+        type := #number.
+        sel := #onLevel:.
+        initialText := view onLevel printString
+    ].
+    (outlet = 'passive level') ifTrue:[
+        type := #number.
+        sel := #offLevel:.
+        initialText := view offLevel printString
+    ].
+    (outlet = 'iconic-label') ifTrue:[
+        type := #form.
+        sel := #label:.
+        text := 'label-icon:'
+    ].
+    (outlet = 'view background-color') ifTrue:[
+        type := #color.
+        sel := #viewBackground:.
+        text := 'view background color'.
+        initialText := 'Black'
+    ].
+    (outlet = 'foreground-color') ifTrue:[
+        type := #color.
+        sel := #foregroundColor:.
+        text := 'foreground color'.
+        initialText := 'Black'
+    ].
+    (outlet = 'background-color') ifTrue:[
+        type := #color.
+        sel := #backgroundColor:.
+        text := 'background color'.
+        initialText := 'Grey'
+    ].
+    (outlet = 'active foreground-color') ifTrue:[
+        type := #color.
+        sel := #activeForegroundColor:.
+        text := 'active foreground color'.
+        initialText := 'Yellow'
+    ].
+    (outlet = 'active background-color') ifTrue:[
+        type := #color.
+        sel := #activeBackgroundColor:.
+        text := 'active background color'.
+        initialText := 'Grey'
+    ].
+    (outlet = 'scroll action') ifTrue:[
+        type := #block.
+        sel := #scrollAction:.
+        text := 'action block when scrolled'
+    ].
+    (outlet = 'scrollUp action') ifTrue:[
+        type := #block.
+        sel := #scrollUpAction:.
+        text := 'action block when scrolled up'
+    ].
+    (outlet = 'scrollDown action') ifTrue:[
+        type := #block.
+        sel := #scrollDownAction:.
+        text := 'action block when scrolled down'
+    ].
+    (outlet = 'scrollLeft action') ifTrue:[
+        type := #block.
+        sel := #scrollLeftAction:.
+        text := 'action block when scrolled left'
+    ].
+    (outlet = 'scrollRight action') ifTrue:[
+        type := #block.
+        sel := #scrollRightAction:.
+        text := 'action block when scrolled right'
+    ].
+    (outlet = 'press action') ifTrue:[
+        type := #block.
+        sel := #pressAction:.
+        text := 'action block when pressed'
+    ].
+    (outlet = 'release action') ifTrue:[
+        type := #block.
+        sel := #releaseAction:.
+        text := 'action block when released'
+    ].
+    (outlet = 'style') ifTrue:[
+        type := #symbol.
+        sel := #style:.
+        initialList := #(motif next)
+    ].
+    (outlet = 'handle position') ifTrue:[
+        type := #symbol.
+        sel := #handlePosition:.
+        initialList := #(left center right)
+    ].
+    (outlet = 'horizontal layout') ifTrue:[
+        type := #symbol.
+        sel := #horizontalLayout:.
+        text := 'horizontal components layout'.
+        initialList := #(left
+                         leftSpace
+                         leftMax
+                         leftSpaceMax
+                         center 
+                         centerMax 
+                         right 
+                         rightSpace 
+                         rightMax 
+                         rightSpaceMax 
+                         spread 
+                         spreadSpace 
+                         spreadMax 
+                         spreadSpaceMax 
+                         fit
+                         fitSpace).
+        initialText := view horizontalLayout printString
+    ].
+    (outlet = 'vertical layout') ifTrue:[
+        type := #symbol.
+        sel := #verticalLayout:.
+        text := 'vertical components layout'.
+        initialList := #(top    
+                         topSpace
+                         center 
+                         bottom 
+                         bottomSpace 
+                         spread 
+                         spreadSpace 
+                         fit
+                         fitSpace).
+        initialText := view verticalLayout printString
+    ].
+    (outlet = 'label position') ifTrue:[
+        type := #symbol.
+        sel := #labelPosition:.
+        initialList := #(topLeft topCenter topRight bottomLeft bottomCenter bottomRight).
+        initialText := view labelPosition printString
+    ].
+    (outlet = 'label layout') ifTrue:[
+        type := #symbol.
+        sel := #adjust:.
+        initialList := #( left right center centerLeft centerRight fit ).
+        initialText := view adjust printString
+    ].
+    (outlet = 'orientation') ifTrue:[
+        type := #symbol.
+        sel := #orientation:.
+        initialList := #( horizontal vertical ).
+        initialText := view orientation printString
+    ].
+
+    (type == #color) ifTrue:[
+        initialList := #('Black'
+                         'White'
+                         'LightGrey'
+                         'Grey'
+                         'DarkGrey'
+                         'Yellow'
+                         'Red'
+                         'Green'
+                         'Blue'
+                        )
+    ].
+
+    text isNil ifTrue:[
+        text := outlet
+    ].
+
+    "what type of box do we need"
+
+    t := type.
+    ((type == #color) or:[type == #symbol or:[type == #fieldTypeSymbol]]) ifTrue:[
+        t := #list
+    ].
+    ((type == #number) or:[type == #numberOrNil]) ifTrue:[
+        t := #string
+    ].
+    (type == #strings) ifTrue:[
+        t := #text
+    ].
+    (type == #block) ifTrue:[
+        t := #text.
+        initialText := workView outletValueOf:sel for:view.
+        initialText isNil ifTrue:[initialText := '[statements]']
+    ].
+    (type == #block1) ifTrue:[
+        t := #text.
+        type := #block.
+        initialText := workView outletValueOf:sel for:view.
+        initialText isNil ifTrue:[initialText := '[:argument | statements ]']
+    ].
+    (type == #block2) ifTrue:[
+        t := #text.
+        type := #block.
+        initialText := workView outletValueOf:sel for:view.
+        initialText isNil ifTrue:[initialText := '[:arg1 :arg2 | statements ]']
+    ].
+
+    "show a box to enter thing"
+
+    (t == #boolean) ifTrue:[
+        val := Dialog confirmWithCancel:text.
+        (val == true or:[val == false]) ifTrue:[
+            action value:val
+        ].
+        ^ self
+    ].
+    (t == #string) ifTrue:[
+"/        stringBox isNil ifTrue:[
+            stringBox := EnterBox new.
+"/        ].
+        box := stringBox
+    ].
+    (t == #list) ifTrue:[
+"/        listBox isNil ifTrue:[
+            listBox := ListSelectionBox new.
+"/        ].
+        listBox list:initialList.
+        box := listBox
+    ].
+    (t == #text) ifTrue:[
+"/        actionBox isNil ifTrue:[
+            actionBox := TextBox new.
+"/        ].
+        actionBox initialText:initialText.
+        box := actionBox
+    ].
+"
+Transcript show:'outlet: '. Transcript showCR:outlet.
+Transcript show:'type:   '. Transcript showCR:type.
+Transcript show:'sel:    '. Transcript showCR:sel.
+Transcript show:'text:   '. Transcript showCR:text.
+"
+
+    box isNil ifTrue:[
+        self notify:'not yet implemented'
+    ] ifFalse:[
+        box initialText:initialText.
+        box title:text.
+        box action:action.
+        box showAtPointer
+    ]
+
+    "Modified: 6.9.1995 / 13:46:29 / claus"
+!
+
+setColors
+    |fg bg|
+
+    fg := fgChannel value.
+    (fg notNil and:[fg notEmpty]) ifTrue:[
+        fg := Color readFrom:fg.
+        workView singleSelectionDo:[:selectedView |
+            selectedView ~~ workView ifTrue:[
+                selectedView foregroundColor:fg
+            ].
+        ].
+    ].
+    bg := bgChannel value.
+    (bg notNil and:[bg notEmpty]) ifTrue:[
+        bg := Color readFrom:bg.
+        workView singleSelectionDo:[:selectedView |
+            selectedView ~~ workView ifTrue:[
+                selectedView backgroundColor:bg
+            ].
+        ].
+    ].
+!
+
+setMiscAspects
+    "sent when apply is pressen in the misc-sub view"
+
+    workView singleSelectionDo:[:selectedView |
+        selectedView ~~ workView ifTrue:[
+            workView changeVariableNameOf:selectedView to:nameChannel value
+        ]
+    ].
+!
+
+setModelAspects
+    "sent when apply is pressen in the model-sub view"
+
+    |aspectSymbol|
+
+    aspectSymbol := aspectChannel value.
+    (aspectSymbol notNil and:[aspectSymbol notEmpty]) ifTrue:[
+        aspectSymbol := aspectSymbol asSymbol.
+        workView singleSelectionDo:[:selectedView |
+            selectedView ~~ workView ifTrue:[
+                workView setAspectSelector:aspectSymbol forView:selectedView
+            ].
+        ].
+    ].
+!
+
+setOutlet:outletSymbol type:type to:outletValue in:aView
+    |block val messageSymbol|
+
+    messageSymbol := outletSymbol.
+    val := outletValue.
+    (type == #block) ifTrue:[
+	block := Compiler evaluate:val.
+	(block == #Error) ifTrue:[
+	    self warn:'action will not work in test-mode'.
+	    workView addOutletDefinitionFor:outletSymbol
+				       type:type
+				      value:outletValue
+					for:aView.
+	    ^ self
+	].
+	val := block
+    ].
+    (type == #number) ifTrue:[
+	val := Number readFromString:outletValue onError:0 
+    ].
+    (type == #numberOrNil) ifTrue:[
+	val := Number readFromString:outletValue onError:nil
+    ].
+    (type == #text) ifTrue:[
+	val := outletValue asString
+    ].
+    (type == #strings) ifTrue:[
+	val := outletValue asText
+    ].
+    (type == #symbol) ifTrue:[
+	val := outletValue asSymbol.
+    ].
+    (type == #fieldTypeSymbol) ifTrue:[
+	val := outletValue asSymbol.
+	val == #password ifTrue:[
+	    aView passwordCharacter:$*
+	] ifFalse:[
+	    aView passwordCharacter:nil
+	].
+	val := (PrintConverter new initFor:val).
+	messageSymbol := #converter:
+    ].
+    (type == #color) ifTrue:[
+	val := Color name:outletValue.
+	val isNil ifTrue:[
+	    self warn:('no such color:' , outletValue).
+	    ^ self
+	]
+    ].
+Transcript show:(val printString).
+Transcript showCR:('(' , val class printString , ')').
+
+    workView selectionHiddenDo:[
+	aView perform:messageSymbol with:val.
+	workView elementChanged:aView.
+	aView redraw.
+    ].
+    workView addOutletDefinitionFor:outletSymbol
+			       type:type
+			      value:outletValue
+				for:aView
+
+    "Modified: 6.9.1995 / 13:44:46 / claus"
+!
+
+showPropertyView
+    |v l spec|
+
+    workView singleSelectionDo:[:selectedView |
+        propertyShown = 'dimension' ifTrue:[
+            (l := selectedView geometryLayout) notNil ifTrue:[
+                l isLayout ifTrue:[
+                    l isAlignmentOrigin ifTrue:[
+                        spec := self class geometrySpecForAlignmentOrigin
+                    ] ifFalse:[
+                        l isLayoutFrame ifFalse:[
+                            spec := self class geometrySpecForLayoutOrigin
+                        ]
+                    ]
+                ]
+            ].
+            spec isNil ifTrue:[
+                spec := self class geometrySpecForLayoutFrame
+            ].
+            ^ self setupPropertyFromSpec:spec
+        ].
+
+        propertyShown = 'colors' ifTrue:[
+            ^ self setupPropertyFromSpec:(self class colorSpec)
+        ].
+
+        propertyShown = 'model' ifTrue:[
+            ^ self setupPropertyFromSpec:(self class modelSpec)
+        ].
+
+        propertyShown = 'misc' ifTrue:[
+            ^ self setupPropertyFromSpec:(self class miscSpec)
+        ].
+
+        propertyShown = 'attribute list' ifTrue:[
+            specShown ~~ #attributeList ifTrue:[
+                propertyFrame destroySubViews.
+                v := ScrollableView for:SelectionInListView in:propertyFrame.
+                v origin:(0.0 @ 0.0) corner:(1.0 @ 1.0).
+                outletView := v scrolledView.
+                outletView action:[:lineNr | lineNr notNil ifTrue:[self selectOutlet:lineNr]].
+                propertyFrame realizeAllSubViews.
+                specShown := #attributeList.
+            ].
+            self showOutletsFor:(workView selection).
+            ^ self
+        ].
+    ].
+
+    propertyFrame destroySubViews.
+    outletView := nil.
+    specShown := nil.
+
+!
+
+toggleTest
+    |m t|
+
+    m := menu menuAt:#test.
+    t := workView testMode not.
+
+    t ifTrue:[
+        m labelAt:#toggleTest put:(resources string:'test off')
+    ] ifFalse:[
+        m labelAt:#toggleTest put:(resources string:'test on')
+    ].
+    workView testMode:t
+! !
+
+!UIPainter class methodsFor:'documentation'!
+
+version
+    ^ '$Header$'
+! !