so far so good ...
authorca
Fri, 28 Feb 1997 10:22:30 +0100
changeset 62 0e8573b4329a
parent 61 85ef247db6b1
child 63 6714daee4b26
so far so good ...
UIPainterTreeView.st
UIPainterView.st
UIPropertyView.st
--- a/UIPainterTreeView.st	Fri Feb 28 10:20:51 1997 +0100
+++ b/UIPainterTreeView.st	Fri Feb 28 10:22:30 1997 +0100
@@ -10,8 +10,6 @@
  hereby transferred.
 "
 
-'From Smalltalk/X, Version:3.1.4 on 25-feb-1997 at 2:17:28 pm'                  !
-
 SelectionInListView subclass:#UIPainterTreeView
 	instanceVariableNames:'builderView'
 	classVariableNames:''
@@ -79,41 +77,13 @@
 
 !UIPainterTreeView methodsFor:'event handling'!
 
-selectionChanged
-    "selection has changed
+builderViewChanged:what
+    "something changed in the builder view
     "
-    |sel|
-
-    selection notNil ifTrue:[
-        selection size == 1 ifTrue:[
-            sel := (list at:(selection first)) string withoutSeparators
-        ] ifFalse:[
-            sel := OrderedCollection new.
-            selection do:[:aNumber|
-                aNumber ~~ 1 ifTrue:[
-                    sel add:((list at:aNumber) string withoutSeparators)
-                ]
-            ]
-        ]
-    ].
-    builderView selectNames:sel
-
-!
-
-selectionChangedFrom:oldSelection
-    "redraw master
-    "
-    self disableMaster:oldSelection.
-    super selectionChangedFrom:oldSelection
-
-!
-
-update:something
-
-    (something == #tree or:[something == #widgetName]) ifTrue:[
+    (what == #tree or:[what == #widgetName]) ifTrue:[
         self updateTree
     ] ifFalse:[
-        something ~~ #selection ifTrue:[
+        what ~~ #selection ifTrue:[
             ^ self
         ].
         self disableMaster:selection.
@@ -142,6 +112,35 @@
     selection isNil ifTrue:[
         self setSelection:1
     ]
+!
+
+selectionChanged
+    "selection has changed
+    "
+    |sel|
+
+    selection notNil ifTrue:[
+        selection size == 1 ifTrue:[
+            sel := (list at:(selection first)) string withoutSeparators
+        ] ifFalse:[
+            sel := OrderedCollection new.
+            selection do:[:aNumber|
+                aNumber ~~ 1 ifTrue:[
+                    sel add:((list at:aNumber) string withoutSeparators)
+                ]
+            ]
+        ]
+    ].
+    builderView selectNames:sel
+
+!
+
+selectionChangedFrom:oldSelection
+    "redraw master
+    "
+    self disableMaster:oldSelection.
+    super selectionChangedFrom:oldSelection
+
 ! !
 
 !UIPainterTreeView methodsFor:'initialization'!
@@ -172,40 +171,27 @@
 !
 
 menu
-    |menu noSel|
-
-    noSel := builderView numberOfSelections.
+    |menu|
 
-    menu := PopUpMenu labels:(
-              resources array:#(
-                                'cut'
-                                'undo'
+    (menu := builderView menu) notNil ifTrue:[
+        menu addLabels:(
+            resources array:#(
                                 '-'
-                                'misc'
-                               )
-                             )
-                  selectors:#(
-                                #cut
-                                #undo
+                                'treeMisc'
+                            )
+                        )
+             selectors:#(       
                                 nil
-                                #misc
-                             )
-                    receiver:self.
-
-    noSel == 1 ifTrue:[ menu subMenuAt:#misc put:(self menuMisc)]
-              ifFalse:[ menu disable:#misc].
+                                #treeMisc
+                        ).
 
-    noSel == 0 ifTrue:[ menu disable:#cut]
-              ifFalse:[ menu actionAt:#cut put:[builderView deleteSelection]].
-
-    builderView hasUndos ifFalse:[ menu disable:#undo]
-                          ifTrue:[ menu actionAt:#undo put:[builderView undoLast]].
-
-
-
-  ^ menu
-
-
+        (builderView numberOfSelections) == 1 ifTrue:[
+            menu subMenuAt:#treeMisc put:(self menuMisc)
+        ] ifFalse:[
+            menu disable:#treeMisc
+        ]
+    ].
+    ^ menu
 !
 
 menuMisc
@@ -270,15 +256,15 @@
         index := index - 1
     ].
     (spView changeSequenceOrderFor:view to:index) ifTrue:[
-        self update:#tree
+        self builderViewChanged:#tree
     ]
 !
 
 removeLayout
-    builderView selectionHiddenDo:[
+    builderView withSelectionHiddenDo:[
         builderView selectionDo:[:aView|
             aView geometryLayout:nil.
-            aView superView sizeChanged:nil
+            builderView elementChangedSize:aView.
         ]
     ].
 ! !
--- a/UIPainterView.st	Fri Feb 28 10:20:51 1997 +0100
+++ b/UIPainterView.st	Fri Feb 28 10:22:30 1997 +0100
@@ -10,8 +10,6 @@
  hereby transferred.
 "
 
-'From Smalltalk/X, Version:3.1.4 on 25-feb-1997 at 2:17:29 pm'                  !
-
 UIObjectView subclass:#UIPainterView
 	instanceVariableNames:'fontPanel viewProperties superclassName className methodName
 		categoryName'
@@ -212,21 +210,24 @@
 !
 
 deleteSelection
-    "delete the selection; not into the paste buffer (undo)
+    "delete the selection; copy the selection into the cut&paste-buffer
+     and open a transaction
     "
-    |text|
+    |text specs|
 
     self numberOfSelections ~~ 0 ifTrue:[
-        text := self transactionTextFor:selection.
+        specs := self generateSpecFor:selection.
+        text  := self transactionTextFor:selection.
 
         undoHistory transaction:#cut text:text do:[
             super deleteSelection
         ].
+        self setSelection:specs
     ]
 !
 
 pasteBuffer
-    "add the objects in the paste-buffer
+    "add the objects in the paste-buffer to the object view
     "
     |paste builder frame pasteOrigin pasteOffset|
 
@@ -237,7 +238,7 @@
 
     frame := self singleSelection.
 
-    (self supportsSubComponents:frame) ifFalse:[
+    (self canPasteInto:frame) ifFalse:[
         frame := self
     ].
     self unselect.
@@ -277,6 +278,7 @@
     self showSelection.
     self realizeAllSubViews.
     inputView raise.
+    self elementChangedSize:frame.
     self changed:#tree
 
 ! !
@@ -296,7 +298,7 @@
     viewProperties add:props.
     name := props name.
 
-    aView specClass basicNew supportsLabel ifTrue:[
+    aView specClass supportsLabel ifTrue:[
         aView label:name
     ].
     aView name:name.
@@ -304,6 +306,8 @@
 !
 
 propertiesForNewView:aView
+    "generate property for a view and return properties
+    "
     |cls props index|
 
     cls := aView class.
@@ -348,6 +352,8 @@
 !UIPainterView methodsFor:'event handling'!
 
 keyPress:key x:x y:y
+    "any key pressed
+    "
     <resource: #keyboard ( #Copy #Paste) >
 
     key == #Copy ifTrue:[
@@ -405,7 +411,7 @@
     code := ''.
 
     viewProperties do:[:aProp |
-        |modelSelector protoSpec thisCode|
+        |modelSelector menuSelector protoSpec thisCode|
 
         (modelSelector := aProp aspectSelector) notNil ifTrue:[
             (cls implements:modelSelector asSymbol) ifFalse:[
@@ -417,6 +423,15 @@
                     thisCode := (self generateAspectMethodFor:modelSelector spec:protoSpec inClass:cls).
                 ].
                 code := code , thisCode
+            ].
+        ].
+
+        (menuSelector := aProp menuSelector) notNil ifTrue:[
+            (cls implements:menuSelector asSymbol) ifFalse:[
+                protoSpec := aProp view specClass basicNew.
+                "/ kludge ..
+                thisCode := (self generateAspectMethodFor:menuSelector spec:protoSpec inClass:cls).
+                code := code , thisCode
             ]
         ]
     ].
@@ -833,7 +848,7 @@
     (labelSelector := props labelSelector) notNil ifTrue:[
         newSpec label:labelSelector
     ].
-    (tabable := props tabable) notNil ifTrue:[
+    (tabable := props tabable) == true ifTrue:[
         newSpec tabable:tabable
     ].
     (defaultable := props defaultable) notNil ifTrue:[
@@ -889,7 +904,7 @@
             ^ self
         ]
     ].
-    self selectionHiddenDo:[
+    self withSelectionHiddenDo:[
         group := EnterFieldGroup new.
 
         props := GroupProperties new.
@@ -922,7 +937,7 @@
             ^ self
         ]
     ].
-    self selectionHiddenDo:[
+    self withSelectionHiddenDo:[
         group := RadioButtonGroup new.
 
         props := GroupProperties new.
@@ -950,6 +965,8 @@
 !UIPainterView methodsFor:'initialization'!
 
 initialize
+    "setup attributes
+    "
     super initialize.
 
     superclassName := 'ApplicationModel'.
@@ -1113,6 +1130,8 @@
 !UIPainterView methodsFor:'menus'!
 
 menu
+    "returns middle-button menu dependent on the selection
+    "
     |menu canPaste|
 
     testMode ifTrue:[^ nil ].
@@ -1158,7 +1177,7 @@
                               )
                      receiver:self.
 
-    (canPaste and:[self supportsSubComponents:selection]) ifFalse:[
+    (canPaste and:[self canPasteInto:selection]) ifFalse:[
         menu disable:#pasteBuffer
     ].
 
@@ -1167,6 +1186,8 @@
     menu subMenuAt:#align     put:(self subMenuAlign).
   ^ menu
 
+
+
 !
 
 subMenuAlign
@@ -1186,6 +1207,7 @@
                                     '-'
                                     'spread horizontal'
                                     'spread vertical'
+                                    '-'
                                     'center horizontal in frame'
                                     'center vertical in frame'
                                   )
@@ -1202,6 +1224,7 @@
                             nil
                             spreadSelectionHor
                             spreadSelectionVer
+                            nil
                             centerSelectionHor
                             centerSelectionVer
                          )
@@ -1306,12 +1329,13 @@
                 size:size.
 
     f notNil ifTrue:[
-        self selectionHiddenDo:[
+        self withSelectionHiddenDo:[
             self selectionDo:[:aView |
                 aView font:f.
-                self elementChanged:aView.
+                self elementChangedSize:aView.
             ]
-        ]
+        ].
+        self changed:#any.
     ]
 
     "Modified: 5.9.1995 / 12:13:27 / claus"
@@ -1327,7 +1351,7 @@
     ].
 
     ((aView respondsTo:#label:) and:[aView label = prop name]) ifTrue:[
-        self selectionHiddenDo:[
+        self withSelectionHiddenDo:[
             |layout|
             layout := aView geometryLayout copy.
             aView label:newName.
@@ -1391,9 +1415,10 @@
 !
 
 removeAll
-    "remove the argument, anObject"
-
+    "remove all objects and properties
+    "
     self unselect.
+    viewProperties := OrderedCollection new.
 
     subViews notNil ifTrue:[
         subViews copy do:[:sub |
@@ -1402,7 +1427,6 @@
             ]
         ]
     ].
-    viewProperties := OrderedCollection new.
     undoHistory reinitialize.
     self changed:#tree
 !
@@ -1422,7 +1446,7 @@
 !
 
 removeTreeFrom:anObject
-    "remove the argument, anObject and all of its children
+    "remove the argument, anObject and all of its subviews
     "
     |props|
 
@@ -1461,7 +1485,7 @@
 !
 
 findViewWithId:aViewId
-    "finds view assigned to id and returns the view or nil
+    "finds view assigned to identifier and returns the view or nil
     "
     |prop|
 
@@ -1474,7 +1498,8 @@
 !UIPainterView methodsFor:'seraching property'!
 
 propertyOf:something
-
+    "returns property assigned to group or view
+    "
     ^ viewProperties detect:[:p| (p view == something or:[p group == something])]
                      ifNone:nil
 
@@ -1485,12 +1510,14 @@
 !
 
 propertyOfGroup:aGroup
-
+    "returns property assigned to group
+    "
     ^ viewProperties detect:[:p| p group == aGroup] ifNone:nil
 !
 
 propertyOfIdentifier:anId
-
+    "returns property assigned to unique identifier
+    "
     anId notNil ifTrue:[
         ^ viewProperties detect:[:p| p identifier == anId] ifNone:nil.
     ].
@@ -1498,7 +1525,8 @@
 !
 
 propertyOfName:aString
-
+    "returns property assigned to name
+    "
     aString = 'self' ifFalse:[
         ^ viewProperties detect:[:p| p name = aString] ifNone:nil
     ].
@@ -1506,7 +1534,8 @@
 !
 
 propertyOfView:aView
-
+    "returns property assigned to view
+    "
     (aView isNil or:[aView == self]) ifFalse:[
         ^ viewProperties detect:[:p| p view == aView] ifNone:nil
     ].
@@ -1516,7 +1545,8 @@
 !UIPainterView methodsFor:'testing'!
 
 isHorizontalResizable:aComponent
-
+    "returns true if instance is horizontal resizeable
+    "
     (aComponent isKindOf:ScrollBar) ifTrue:[
         ^ aComponent orientation == #horizontal
     ].
@@ -1532,7 +1562,8 @@
 !
 
 isVerticalResizable:aComponent
-
+    "returns true if instance is vertical resizeable
+    "
     (aComponent isKindOf:EditField) ifTrue:[
         ^ false
     ].
@@ -1600,6 +1631,8 @@
 !UIPainterView methodsFor:'undo actions'!
 
 undoCreate:aViewId
+    "undo method when creating or pasting an object
+    "
     |view|
 
     undoHistory addUndoBlock:[
@@ -1611,30 +1644,22 @@
 !
 
 undoLayout:aViewId
-    "undo method layout
+    "undo method when changing the layout (position or dimension)
     "
-    |view layout|
+    |view layout extent|
 
     (view := self findViewWithId:aViewId) notNil ifTrue:[
-        layout := view geometryLayout copy.
-        view   := nil.
-
-        layout notNil ifTrue:[
-            undoHistory addUndoBlock:[
-                (view := self findViewWithId:aViewId) notNil ifTrue:[
-                    view geometryLayout:layout
-                ]
-            ]
-        ] ifFalse:[
-            layout := view pixelOrigin.
-
-            undoHistory addUndoBlock:[
-                (view := self findViewWithId:aViewId) notNil ifTrue:[
-                    view pixelOrigin:layout
-                ]
+        (layout := view geometryLayout copy) isNil ifTrue:[
+            extent := view extent copy
+        ].
+        undoHistory addUndoBlock:[
+            (view := self findViewWithId:aViewId) notNil ifTrue:[
+                layout notNil ifTrue:[view geometryLayout:layout]
+                             ifFalse:[view extent:extent]
             ]
         ]
-    ]
+    ].
+    view := nil
 !
 
 undoLayoutView:aView
@@ -1651,7 +1676,7 @@
 !
 
 undoRemove:aViewId
-    "prepare undo method
+    "undo method when removing an object
     "
     |view prop spec parentId|
 
@@ -1659,10 +1684,8 @@
         spec := (self generateSpecFor:view) first.
         view := view superView.
 
-        (self supportsSubComponents:view) ifTrue:[
-            prop := self propertyOfView:view.
-
-            prop notNil ifTrue:[
+        (self canPasteInto:view) ifTrue:[
+            (prop := self propertyOfView:view) notNil ifTrue:[
                 parentId := prop identifier
             ]
         ].
@@ -1691,7 +1714,7 @@
 !
 
 undoSpecModify:aViewId
-    "undo for updateFromSpec
+    "undo method when changing the specification for an object
     "
     |builder view spec|
 
@@ -1703,7 +1726,7 @@
             (view := self findViewWithId:aViewId) notNil ifTrue:[
                 builder := UIBuilder new.
                 spec setAttributesIn:view with:builder.
-                view superView sizeChanged:nil
+                self elementChangedSize:view.
             ]
         ]
     ].
@@ -1720,7 +1743,7 @@
     |props name builder|
 
     self singleSelection notNil ifTrue:[
-        self selectionHiddenDo:[
+        self withSelectionHiddenDo:[
             self transaction:#specification selectionDo:[:aView|
                 builder := UIBuilder new.
                 props   := self propertyOfView:aView.
@@ -1742,7 +1765,7 @@
                 ].
 
                 aSpec setAttributesIn:aView with:builder.
-                aView superView sizeChanged:nil.
+                self elementChangedSize:aView.
 
                 props tabable:aSpec tabable.
                 props defaultable:aSpec defaultable.
@@ -1751,9 +1774,9 @@
                 props changeSelector:aSpec changeSelector.
                 props labelSelector:aSpec labelSelector.
                 props menuSelector:aSpec menuSelector.
-            ].
-            self changed:#tree
-        ]
+            ]
+        ].
+        self changed:#tree
     ].
 
 ! !
--- a/UIPropertyView.st	Fri Feb 28 10:20:51 1997 +0100
+++ b/UIPropertyView.st	Fri Feb 28 10:22:30 1997 +0100
@@ -1,8 +1,6 @@
-'From Smalltalk/X, Version:3.1.4 on 25-feb-1997 at 2:17:33 pm'                  !
-
 ApplicationModel subclass:#UIPropertyView
 	instanceVariableNames:'builderView modified propertyFrame propertyList propertySpecs
-		currentView currentSpec propertyAspects staticAspects
+		currentView currentSpec propertyAspects layoutAspects layoutType
 		specBeingEdited userSelectedProperty currentSpecChannel'
 	classVariableNames:''
 	poolDictionaries:''
@@ -12,11 +10,11 @@
 
 !UIPropertyView class methodsFor:'instance creation'!
 
-in:aTopView receiver:aReceiver
+in:aTopView builder:aBuilderView
     |application|
 
     application := self new.
-    application in:aTopView receiver:aReceiver.
+    application in:aTopView builder:aBuilderView.
   ^ application
 ! !
 
@@ -26,20 +24,32 @@
     ^ 'Dimension'
 ! !
 
-!UIPropertyView class methodsFor:'specifications'!
+!UIPropertyView class methodsFor:'interface specs'!
 
 specificationAlignmentOrigin
+    "this window spec was automatically generated by the ST/X UIPainter"
+
+    "do not manually edit this - the painter/builder may not be able to
+     handle the specification if its corrupted."
+
     "
-    UIPainter new openOnClass:self andSelector:#specificationAlignmentOrigin
+     UIPainter new openOnClass:UIPropertyView andSelector:#specificationAlignmentOrigin
+     UIPropertyView new openInterface:#specificationAlignmentOrigin
     "
+
     <resource: #canvas>
 
     ^
-
+     
        #(#FullSpec
+          #'name:' 'uIPainterView'
+          #'layout:' #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
+          #'isOpaque:' true
           #'window:' 
            #(#WindowSpec
+              #'name:' 'uIPainterView'
               #'layout:' #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
+              #'isOpaque:' true
               #'label:' 'unnamed'
               #'bounds:' #(#Rectangle 0 0 248 304)
           )
@@ -48,382 +58,341 @@
               #'collection:' 
                #(
                  #(#LabelSpec
-                    #'name:' 'label1'
-                    #'layout:' #(#LayoutFrame 5 0 42 0 48 0 60 0)
-                    #'label:' 'left'
+                    #'name:' 'label9'
+                    #'layout:' #(#LayoutFrame 5 0 7 0 48 0 30 0)
+                    #'isOpaque:' true
+                    #'label:' 'Layout:'
+                    #'foregroundColor:' #(#Color 0.0 0.0 0.0)
+                    #'backgroundColor:' #(#Color 66.9993 66.9993 66.9993)
+                    #'initiallyInvisible:' false
+                    #'level:' 0
+                    #'adjust:' #center
+                    #'hasCharacterOrientedLabel:' true
+                )
+                 #(#PopUpListSpec
+                    #'name:' 'popUpList1'
+                    #'layout:' #(#LayoutFrame 58 0.0 7 0 -12 1.0 30 0)
+                    #'isOpaque:' true
+                    #'label:' 'popup'
+                    #'foregroundColor:' #(#Color 0.0 0.0 0.0)
+                    #'backgroundColor:' #(#Color 66.9993 66.9993 66.9993)
+                    #'initiallyInvisible:' false
+                    #'model:' #layoutType
+                    #'menu:' #layoutTypeList
                 )
                  #(#LabelSpec
                     #'name:' 'label2'
-                    #'layout:' #(#LayoutFrame 5 0 69 0 48 0 87 0)
+                    #'layout:' #(#LayoutFrame 5 0 103 0 48 0 121 0)
+                    #'isOpaque:' true
                     #'label:' 'top'
+                    #'foregroundColor:' #(#Color 0.0 0.0 0.0)
+                    #'backgroundColor:' #(#Color 66.9993 66.9993 66.9993)
+                    #'initiallyInvisible:' false
+                    #'level:' 0
+                    #'adjust:' #center
+                    #'hasCharacterOrientedLabel:' true
                 )
                  #(#LabelSpec
                     #'name:' 'label3'
-                    #'layout:' #(#LayoutFrame 57 0 10 0 103 0 27 0)
+                    #'layout:' #(#LayoutFrame 58 0 48 0 104 0 65 0)
+                    #'isOpaque:' true
                     #'label:' 'relative'
+                    #'foregroundColor:' #(#Color 0.0 0.0 0.0)
+                    #'backgroundColor:' #(#Color 66.9993 66.9993 66.9993)
+                    #'initiallyInvisible:' false
+                    #'level:' 0
+                    #'adjust:' #center
+                    #'hasCharacterOrientedLabel:' true
                 )
                  #(#LabelSpec
                     #'name:' 'label4'
-                    #'layout:' #(#LayoutFrame 154 0 11 0 190 0 28 0)
+                    #'layout:' #(#LayoutFrame 154 0 49 0 190 0 66 0)
+                    #'isOpaque:' true
                     #'label:' 'offset'
+                    #'foregroundColor:' #(#Color 0.0 0.0 0.0)
+                    #'backgroundColor:' #(#Color 66.9993 66.9993 66.9993)
+                    #'initiallyInvisible:' false
+                    #'level:' 0
+                    #'adjust:' #center
+                    #'hasCharacterOrientedLabel:' true
                 )
                  #(#LabelSpec
                     #'name:' 'label5'
-                    #'layout:' #(#LayoutFrame 5 0 96 0 48 0 114 0)
+                    #'layout:' #(#LayoutFrame 5 0 167 0 48 0 185 0)
+                    #'isOpaque:' true
                     #'label:' 'align H'
+                    #'foregroundColor:' #(#Color 0.0 0.0 0.0)
+                    #'backgroundColor:' #(#Color 66.9993 66.9993 66.9993)
+                    #'initiallyInvisible:' false
+                    #'level:' 0
+                    #'adjust:' #center
+                    #'hasCharacterOrientedLabel:' true
                 )
                  #(#LabelSpec
                     #'name:' 'label6'
-                    #'layout:' #(#LayoutFrame 5 0 122 0 48 0 140 0)
+                    #'layout:' #(#LayoutFrame 5 0 193 0 48 0 211 0)
+                    #'isOpaque:' true
                     #'label:' 'align V'
+                    #'foregroundColor:' #(#Color 0.0 0.0 0.0)
+                    #'backgroundColor:' #(#Color 66.9993 66.9993 66.9993)
+                    #'initiallyInvisible:' false
+                    #'level:' 0
+                    #'adjust:' #center
+                    #'hasCharacterOrientedLabel:' true
                 )
                  #(#InputFieldSpec
                     #'name:' 'editField1'
+                    #'layout:' #(#LayoutFrame 58 0 76 0 115 0 94 0)
+                    #'isOpaque:' true
+                    #'initiallyDisabled:' false
+                    #'initiallyInvisible:' false
+                    #'model:' #leftFraction
+                    #'isReadOnly:' false
+                    #'tabable:' true
                     #'type:' #numberOrNil
-                    #'layout:' #(#LayoutFrame 57 0 42 0 114 0 60 0)
-                    #'model:' #leftFraction
                     #'immediateAccept:' false
+                    #'acceptOnLeave:' true
                     #'acceptOnReturn:' true
                     #'acceptOnTab:' true
-                    #tabable: true
+                    #'acceptOnLostFocus:' true
+                    #'hasBorder:' false
                 )
                  #(#InputFieldSpec
                     #'name:' 'editField2'
+                    #'layout:' #(#LayoutFrame 58 0 103 0 115 0 121 0)
+                    #'isOpaque:' true
+                    #'initiallyDisabled:' false
+                    #'initiallyInvisible:' false
+                    #'model:' #topFraction
+                    #'isReadOnly:' false
+                    #'tabable:' true
                     #'type:' #numberOrNil
-                    #'layout:' #(#LayoutFrame 57 0 69 0 114 0 87 0)
-                    #'model:' #topFraction
                     #'immediateAccept:' false
+                    #'acceptOnLeave:' true
                     #'acceptOnReturn:' true
                     #'acceptOnTab:' true
-                    #tabable: true
+                    #'acceptOnLostFocus:' true
+                    #'hasBorder:' false
                 )
                  #(#InputFieldSpec
                     #'name:' 'editField5'
+                    #'layout:' #(#LayoutFrame 58 0 167 0 115 0 185 0)
+                    #'isOpaque:' true
+                    #'initiallyDisabled:' false
+                    #'initiallyInvisible:' false
+                    #'model:' #leftAlignmentFraction
+                    #'isReadOnly:' false
+                    #'tabable:' true
                     #'type:' #numberOrNil
-                    #'layout:' #(#LayoutFrame 57 0 96 0 114 0 114 0)
-                    #'model:' #leftAlignmentFraction
                     #'immediateAccept:' false
+                    #'acceptOnLeave:' true
                     #'acceptOnReturn:' true
                     #'acceptOnTab:' true
-                    #tabable: true
+                    #'acceptOnLostFocus:' true
+                    #'hasBorder:' false
                 )
                  #(#InputFieldSpec
                     #'name:' 'editField6'
+                    #'layout:' #(#LayoutFrame 58 0 193 0 115 0 211 0)
+                    #'isOpaque:' true
+                    #'initiallyDisabled:' false
+                    #'initiallyInvisible:' false
+                    #'model:' #topAlignmentFraction
+                    #'isReadOnly:' false
+                    #'tabable:' true
                     #'type:' #numberOrNil
-                    #'layout:' #(#LayoutFrame 56 0 122 0 113 0 140 0)
-                    #'model:' #topAlignmentFraction
                     #'immediateAccept:' false
+                    #'acceptOnLeave:' true
                     #'acceptOnReturn:' true
                     #'acceptOnTab:' true
-                    #tabable: true
+                    #'acceptOnLostFocus:' true
+                    #'hasBorder:' false
                 )
                  #(#InputFieldSpec
                     #'name:' 'editField3'
+                    #'layout:' #(#LayoutFrame 154 0 76 0 212 0 94 0)
+                    #'isOpaque:' true
+                    #'initiallyDisabled:' false
+                    #'initiallyInvisible:' false
+                    #'model:' #leftOffset
+                    #'isReadOnly:' false
+                    #'tabable:' true
                     #'type:' #numberOrNil
-                    #'layout:' #(#LayoutFrame 154 0 42 0 212 0 60 0)
-                    #'model:' #leftOffset
                     #'immediateAccept:' false
+                    #'acceptOnLeave:' true
                     #'acceptOnReturn:' true
                     #'acceptOnTab:' true
-                    #tabable: true
+                    #'acceptOnLostFocus:' true
+                    #'hasBorder:' false
                 )
                  #(#InputFieldSpec
                     #'name:' 'editField4'
+                    #'layout:' #(#LayoutFrame 154 0 103 0 212 0 121 0)
+                    #'isOpaque:' true
+                    #'initiallyDisabled:' false
+                    #'initiallyInvisible:' false
+                    #'model:' #topOffset
+                    #'isReadOnly:' false
+                    #'tabable:' true
                     #'type:' #numberOrNil
-                    #'layout:' #(#LayoutFrame 154 0 69 0 212 0 87 0)
-                    #'model:' #topOffset
                     #'immediateAccept:' false
+                    #'acceptOnLeave:' true
                     #'acceptOnReturn:' true
                     #'acceptOnTab:' true
-                    #tabable: true
+                    #'acceptOnLostFocus:' true
+                    #'hasBorder:' false
                 )
                  #(#ActionButtonSpec
                     #'name:' 'button1'
-                    #'layout:' #(#LayoutFrame 119 0 42 0 138 0 60 0)
+                    #'layout:' #(#LayoutFrame 119 0 76 0 138 0 94 0)
+                    #'isOpaque:' true
                     #'label:' ''
+                    #'foregroundColor:' #(#Color 0.0 0.0 0.0)
+                    #'backgroundColor:' #(#Color 66.9993 66.9993 66.9993)
+                    #'initiallyInvisible:' false
+                    #'tabable:' false
+                    #'isDefault:' false
+                    #'defaultable:' false
                     #'model:' #makeRelativeLeft
+                    #'hasCharacterOrientedLabel:' true
+                    #'isDecorated:' false
+                    #'initiallyDisabled:' false
                 )
                  #(#ActionButtonSpec
                     #'name:' 'button2'
-                    #'layout:' #(#LayoutFrame 119 0 69 0 138 0 87 0)
+                    #'layout:' #(#LayoutFrame 119 0 103 0 138 0 121 0)
+                    #'isOpaque:' true
                     #'label:' ''
+                    #'foregroundColor:' #(#Color 0.0 0.0 0.0)
+                    #'backgroundColor:' #(#Color 66.9993 66.9993 66.9993)
+                    #'initiallyInvisible:' false
+                    #'tabable:' false
+                    #'isDefault:' false
+                    #'defaultable:' false
                     #'model:' #makeRelativeTop
+                    #'hasCharacterOrientedLabel:' true
+                    #'isDecorated:' false
+                    #'initiallyDisabled:' false
                 )
                  #(#ActionButtonSpec
                     #'name:' 'button3'
-                    #'layout:' #(#LayoutFrame 216 0 42 0 235 0 60 0)
+                    #'layout:' #(#LayoutFrame 217 0 76 0 236 0 94 0)
+                    #'isOpaque:' true
                     #'label:' ''
+                    #'foregroundColor:' #(#Color 0.0 0.0 0.0)
+                    #'backgroundColor:' #(#Color 66.9993 66.9993 66.9993)
+                    #'initiallyInvisible:' false
+                    #'tabable:' false
+                    #'isDefault:' false
+                    #'defaultable:' false
                     #'model:' #makeOffsetLeft
+                    #'hasCharacterOrientedLabel:' true
+                    #'isDecorated:' false
+                    #'initiallyDisabled:' false
                 )
                  #(#ActionButtonSpec
                     #'name:' 'button4'
-                    #'layout:' #(#LayoutFrame 216 0 69 0 235 0 87 0)
+                    #'layout:' #(#LayoutFrame 217 0 103 0 236 0 121 0)
+                    #'isOpaque:' true
                     #'label:' ''
+                    #'foregroundColor:' #(#Color 0.0 0.0 0.0)
+                    #'backgroundColor:' #(#Color 66.9993 66.9993 66.9993)
+                    #'initiallyInvisible:' false
+                    #'tabable:' false
+                    #'isDefault:' false
+                    #'defaultable:' false
                     #'model:' #makeOffsetTop
+                    #'hasCharacterOrientedLabel:' true
+                    #'isDecorated:' false
+                    #'initiallyDisabled:' false
                 )
-
-
-               #(#ActionButtonSpec
-                  #'name:' 'button'
-                  #'layout:' #(#LayoutFrame 16 0 210 0 76 0 240 0)
-                  #'label:' 'frame'
-                  #'model:' #showLayoutFrame
+                 #(#ActionButtonSpec
+                    #'name:' 'button8'
+                    #'layout:' #(#LayoutFrame 119 0 129 0 138 0 147 0)
+                    #'isOpaque:' true
+                    #'label:' ''
+                    #'foregroundColor:' #(#Color 0.0 0.0 0.0)
+                    #'backgroundColor:' #(#Color 66.9993 66.9993 66.9993)
+                    #'initiallyInvisible:' false
+                    #'tabable:' false
+                    #'isDefault:' false
+                    #'defaultable:' false
+                    #'model:' #makeRelativeLeftTop
+                    #'hasCharacterOrientedLabel:' true
+                    #'isDecorated:' false
+                    #'initiallyDisabled:' false
                 )
-               #(#ActionButtonSpec
-                  #'name:' 'button'
-                  #'layout:' #(#LayoutFrame 96 0 210 0 156 0 240 0)
-                  #'label:' 'origin'
-                  #'model:' #showLayoutOrigin
+                 #(#ActionButtonSpec
+                    #'name:' 'button9'
+                    #'layout:' #(#LayoutFrame 217 0 129 0 236 0 147 0)
+                    #'isOpaque:' true
+                    #'label:' ''
+                    #'foregroundColor:' #(#Color 0.0 0.0 0.0)
+                    #'backgroundColor:' #(#Color 66.9993 66.9993 66.9993)
+                    #'initiallyInvisible:' false
+                    #'tabable:' false
+                    #'isDefault:' false
+                    #'defaultable:' false
+                    #'model:' #makeOffsetLeftTop
+                    #'hasCharacterOrientedLabel:' true
+                    #'isDecorated:' false
+                    #'initiallyDisabled:' false
                 )
-               #(#ActionButtonSpec
-                  #'name:' 'button'
-                  #'layout:' #(#LayoutFrame 176 0 210 0 236 0 240 0)
-                  #'label:' 'align'
-                  #'model:' #showAlignmentOrigin
-                  #'initiallyDisabled:' true
+                 #(#LabelSpec
+                    #'name:' 'label7'
+                    #'layout:' #(#LayoutFrame 5 0 129 0 48 0 147 0)
+                    #'isOpaque:' true
+                    #'label:' 'all'
+                    #'foregroundColor:' #(#Color 0.0 0.0 0.0)
+                    #'backgroundColor:' #(#Color 66.9993 66.9993 66.9993)
+                    #'initiallyInvisible:' false
+                    #'level:' 0
+                    #'adjust:' #center
+                    #'hasCharacterOrientedLabel:' true
                 )
-
+                 #(#LabelSpec
+                    #'name:' 'label1'
+                    #'layout:' #(#LayoutFrame 5 0 76 0 48 0 94 0)
+                    #'isOpaque:' true
+                    #'label:' 'left'
+                    #'foregroundColor:' #(#Color 0.0 0.0 0.0)
+                    #'backgroundColor:' #(#Color 66.9993 66.9993 66.9993)
+                    #'initiallyInvisible:' false
+                    #'level:' 0
+                    #'adjust:' #center
+                    #'hasCharacterOrientedLabel:' true
+                )
               )
           )
       )
-
-
-
 !
 
-specificationLayoutFrame
+specificationExtent
+    "this window spec was automatically generated by the ST/X UIPainter"
+
+    "do not manually edit this - the painter/builder may not be able to
+     handle the specification if its corrupted."
+
     "
-    UIPainter new openOnClass:self andSelector:#specificationLayoutFrame
+     UIPainter new openOnClass:UIPropertyView andSelector:#specificationExtent
+     UIPropertyView new openInterface:#specificationExtent
     "
+
     <resource: #canvas>
 
     ^
-
+     
        #(#FullSpec
+          #'name:' 'uIPainterView'
+          #'layout:' #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
+          #'isOpaque:' true
           #'window:' 
            #(#WindowSpec
+              #'name:' 'uIPainterView'
               #'layout:' #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
+              #'isOpaque:' true
               #'label:' 'unnamed'
-              #'bounds:' #(#Rectangle 0 0 300 300)
-          )
-          #'component:' 
-           #(#SpecCollection
-              #'collection:' 
-               #(
-                 #(#LabelSpec
-                    #'name:' 'label left'
-                    #'layout:' #(#LayoutFrame 12 0 39 0 53 0 57 0)
-                    #'label:' 'left'
-                )
-                 #(#LabelSpec
-                    #'name:' 'label top'
-                    #'layout:' #(#LayoutFrame 12 0 67 0 53 0 85 0)
-                    #'label:' 'top'
-                )
-                 #(#LabelSpec
-                    #'name:' 'label right'
-                    #'layout:' #(#LayoutFrame 12 0 95 0 53 0 113 0)
-                    #'label:' 'right'
-                )
-                 #(#LabelSpec
-                    #'name:' 'label bottom'
-                    #'layout:' #(#LayoutFrame 12 0 123 0 53 0 141 0)
-                    #'label:' 'bottom'
-                )
-                 #(#LabelSpec
-                    #'name:' 'label relative'
-                    #'layout:' #(#LayoutFrame 65 0 6 0 110 0 24 0)
-                    #'label:' 'relative'
-                )
-                 #(#LabelSpec
-                    #'name:' 'label offset'
-                    #'layout:' #(#LayoutFrame 159 0 6 0 190 0 24 0)
-                    #'label:' 'offset'
-                )
-                 #(#LabelSpec
-                    #'name:' 'label all relative'
-                    #'layout:' #(#LayoutFrame 12 0 157 0 53 0 175 0)
-                    #'label:' 'all'
-                )
-                 #(#LabelSpec
-                    #'name:' 'label all absolute'
-                    #'layout:' #(#LayoutFrame 159 0 157 0 210 0 175 0)
-                    #'label:' 'all'
-                )
-                 #(#InputFieldSpec
-                    #'name:' 'relative E1'
-                    #'layout:' #(#LayoutFrame 65 0 39 0 113 0 57 0)
-                    #'model:' #leftFraction
-                    #'type:' #numberOrNil
-                    #'immediateAccept:' false
-                    #'acceptOnReturn:' true
-                    #'acceptOnTab:' true
-                )
-                 #(#InputFieldSpec
-                    #'name:' 'relative E2'
-                    #'layout:' #(#LayoutFrame 65 0 67 0 113 0 85 0)
-                    #'model:' #topFraction
-                    #'type:' #numberOrNil
-                    #'immediateAccept:' false
-                    #'acceptOnReturn:' true
-                    #'acceptOnTab:' true
-                )
-                 #(#InputFieldSpec
-                    #'name:' 'relative E3'
-                    #'layout:' #(#LayoutFrame 65 0 95 0 113 0 113 0)
-                    #'model:' #rightFraction
-                    #'type:' #numberOrNil
-                    #'immediateAccept:' false
-                    #'acceptOnReturn:' true
-                    #'acceptOnTab:' true
-                )
-                 #(#InputFieldSpec
-                    #'name:' 'relative E4'
-                    #'layout:' #(#LayoutFrame 65 0 123 0 113 0 141 0)
-                    #'model:' #bottomFraction
-                    #'type:' #numberOrNil
-                    #'immediateAccept:' false
-                    #'acceptOnReturn:' true
-                    #'acceptOnTab:' true
-                )
-                 #(#InputFieldSpec
-                    #'name:' 'offset E1'
-                    #'layout:' #(#LayoutFrame 159 0 39 0 210 0 57 0)
-                    #'model:' #leftOffset
-                    #'type:' #numberOrNil
-                    #'immediateAccept:' false
-                    #'acceptOnReturn:' true
-                    #'acceptOnTab:' true
-                )
-                 #(#InputFieldSpec
-                    #'name:' 'offset E2'
-                    #'layout:' #(#LayoutFrame 159 0 67 0 210 0 85 0)
-                    #'model:' #topOffset
-                    #'type:' #numberOrNil
-                    #'immediateAccept:' false
-                    #'acceptOnReturn:' true
-                    #'acceptOnTab:' true
-                )
-                 #(#InputFieldSpec
-                    #'name:' 'offset E3'
-                    #'layout:' #(#LayoutFrame 159 0 95 0 210 0 113 0)
-                    #'model:' #rightOffset
-                    #'type:' #numberOrNil
-                    #'immediateAccept:' false
-                    #'acceptOnReturn:' true
-                    #'acceptOnTab:' true
-                )
-                 #(#InputFieldSpec
-                    #'name:' 'offset E4'
-                    #'layout:' #(#LayoutFrame 159 0 123 0 210 0 141 0)
-                    #'model:' #bottomOffset
-                    #'type:' #numberOrNil
-                    #'immediateAccept:' false
-                    #'acceptOnReturn:' true
-                    #'acceptOnTab:' true
-                )
-                 #(#ActionButtonSpec
-                    #'name:' 'relative B1'
-                    #'layout:' #(#LayoutFrame 117 0 39 0 136 0 57 0)
-                    #'label:' ' '
-                    #'model:' #makeRelativeLeft
-                )
-                 #(#ActionButtonSpec
-                    #'name:' 'relative B2'
-                    #'layout:' #(#LayoutFrame 117 0 67 0 136 0 85 0)
-                    #'label:' ' '
-                    #'model:' #makeRelativeTop
-                )
-                 #(#ActionButtonSpec
-                    #'name:' 'relative B3'
-                    #'layout:' #(#LayoutFrame 117 0 95 0 136 0 113 0)
-                    #'label:' ' '
-                    #'model:' #makeRelativeRight
-                )
-                 #(#ActionButtonSpec
-                    #'name:' 'relative B4'
-                    #'layout:' #(#LayoutFrame 117 0 123 0 136 0 141 0)
-                    #'label:' ' '
-                    #'model:' #makeRelativeBottom
-                )
-                 #(#ActionButtonSpec
-                    #'name:' 'relative BAll'
-                    #'layout:' #(#LayoutFrame 117 0 157 0 136 0 175 0)
-                    #'label:' ' '
-                    #'model:' #makeRelativeAll
-                )
-                 #(#ActionButtonSpec
-                    #'name:' 'offset B1'
-                    #'layout:' #(#LayoutFrame 214 0 39 0 233 0 57 0)
-                    #'label:' ''
-                    #'model:' #makeOffsetLeft
-                )
-                 #(#ActionButtonSpec
-                    #'name:' 'offset B2'
-                    #'layout:' #(#LayoutFrame 214 0 67 0 233 0 85 0)
-                    #'label:' ''
-                    #'model:' #makeOffsetTop
-                )
-                 #(#ActionButtonSpec
-                    #'name:' 'offset B3'
-                    #'layout:' #(#LayoutFrame 214 0 95 0 233 0 113 0)
-                    #'label:' ''
-                    #'model:' #makeOffsetRight
-                )
-                 #(#ActionButtonSpec
-                    #'name:' 'offset B4'
-                    #'layout:' #(#LayoutFrame 214 0 123 0 233 0 141 0)
-                    #'label:' ''
-                    #'model:' #makeOffsetBottom
-                )
-                 #(#ActionButtonSpec
-                    #'name:' 'offset BAll'
-                    #'layout:' #(#LayoutFrame 214 0 157 0 233 0 175 0)
-                    #'label:' ' '
-                    #'model:' #makeOffsetAll
-                )
-                 #(#ActionButtonSpec
-                    #'name:' 'button'
-                    #'layout:' #(#LayoutFrame 16 0 210 0 76 0 240 0)
-                    #'label:' 'frame'
-                    #'model:' #showLayoutFrame
-                    #'initiallyDisabled:' true
-                )
-                 #(#ActionButtonSpec
-                    #'name:' 'button10'
-                    #'layout:' #(#LayoutFrame 96 0 210 0 156 0 240 0)
-                    #'label:' 'origin'
-                    #'model:' #showLayoutOrigin
-                )
-                 #(#ActionButtonSpec
-                    #'name:' 'button11'
-                    #'layout:' #(#LayoutFrame 176 0 210 0 236 0 240 0)
-                    #'label:' 'align'
-                    #'model:' #showAlignmentOrigin
-                )
-
-              )
-          )
-      )
-
-
-
-!
-
-specificationLayoutOrigin
-    "
-    UIPainter new openOnClass:self andSelector:#specificationLayoutOrigin
-    "
-    <resource: #canvas>
-
-    ^
-
-       #(#FullSpec
-          #'window:' 
-           #(#WindowSpec
-              #'layout:' #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
-              #'label:' 'unnamed'
-              #'bounds:' #(#Rectangle 0 0 248 304)
+              #'bounds:' #(#Rectangle 0 0 238 303)
           )
           #'component:' 
            #(#SpecCollection
@@ -431,184 +400,1171 @@
                #(
                  #(#LabelSpec
                     #'name:' 'label1'
-                    #'layout:' #(#LayoutFrame 16 0 42 0 44 0 60 0)
-                    #'label:' 'left'
+                    #'layout:' #(#LayoutFrame 16 0 62 0 79 0 79 0)
+                    #'isOpaque:' true
+                    #'label:' 'horizontal:'
+                    #'foregroundColor:' #(#Color 0.0 0.0 0.0)
+                    #'backgroundColor:' #(#Color 66.9993 66.9993 66.9993)
+                    #'initiallyInvisible:' false
+                    #'level:' 0
+                    #'adjust:' #left
+                    #'hasCharacterOrientedLabel:' true
                 )
                  #(#LabelSpec
                     #'name:' 'label2'
-                    #'layout:' #(#LayoutFrame 16 0 69 0 44 0 87 0)
-                    #'label:' 'top'
-                )
-                 #(#LabelSpec
-                    #'name:' 'label3'
-                    #'layout:' #(#LayoutFrame 57 0 10 0 103 0 27 0)
-                    #'label:' 'relative'
-                )
-                 #(#LabelSpec
-                    #'name:' 'label4'
-                    #'layout:' #(#LayoutFrame 154 0 11 0 190 0 28 0)
-                    #'label:' 'offset'
+                    #'layout:' #(#LayoutFrame 16 0 89 0 79 0 107 0)
+                    #'isOpaque:' true
+                    #'label:' 'vertical:'
+                    #'foregroundColor:' #(#Color 0.0 0.0 0.0)
+                    #'backgroundColor:' #(#Color 66.9993 66.9993 66.9993)
+                    #'initiallyInvisible:' false
+                    #'level:' 0
+                    #'adjust:' #left
+                    #'hasCharacterOrientedLabel:' true
                 )
                  #(#InputFieldSpec
                     #'name:' 'editField1'
+                    #'layout:' #(#LayoutFrame 86 0 62 0 179 0 80 0)
+                    #'isOpaque:' true
+                    #'initiallyDisabled:' false
+                    #'initiallyInvisible:' false
+                    #'model:' #leftOffset
+                    #'isReadOnly:' false
+                    #'tabable:' true
                     #'type:' #numberOrNil
-                    #'layout:' #(#LayoutFrame 57 0 42 0 114 0 60 0)
-                    #'model:' #leftFraction
                     #'immediateAccept:' false
+                    #'acceptOnLeave:' true
                     #'acceptOnReturn:' true
                     #'acceptOnTab:' true
-                    #tabable: true
+                    #'acceptOnLostFocus:' true
+                    #'hasBorder:' false
                 )
                  #(#InputFieldSpec
                     #'name:' 'editField2'
+                    #'layout:' #(#LayoutFrame 86 0 89 0 179 0 107 0)
+                    #'isOpaque:' true
+                    #'initiallyDisabled:' false
+                    #'initiallyInvisible:' false
+                    #'model:' #rightOffset
+                    #'isReadOnly:' false
+                    #'tabable:' true
                     #'type:' #numberOrNil
-                    #'layout:' #(#LayoutFrame 57 0 69 0 114 0 87 0)
+                    #'immediateAccept:' false
+                    #'acceptOnLeave:' true
+                    #'acceptOnReturn:' true
+                    #'acceptOnTab:' true
+                    #'acceptOnLostFocus:' true
+                    #'hasBorder:' false
+                )
+                 #(#LabelSpec
+                    #'name:' 'label0'
+                    #'layout:' #(#LayoutFrame 16 0 15 0 79 0 32 0)
+                    #'isOpaque:' true
+                    #'label:' 'Extent:'
+                    #'foregroundColor:' #(#Color 0.0 0.0 0.0)
+                    #'backgroundColor:' #(#Color 66.9993 66.9993 66.9993)
+                    #'initiallyInvisible:' false
+                    #'level:' 0
+                    #'adjust:' #left
+                    #'hasCharacterOrientedLabel:' true
+                )
+              )
+          )
+      )
+!
+
+specificationLayoutFrame
+    "this window spec was automatically generated by the ST/X UIPainter"
+
+    "do not manually edit this - the painter/builder may not be able to
+     handle the specification if its corrupted."
+
+    "
+     UIPainter new openOnClass:UIPropertyView andSelector:#specificationLayoutFrame
+     UIPropertyView new openInterface:#specificationLayoutFrame
+    "
+
+    <resource: #canvas>
+
+    ^
+     
+       #(#FullSpec
+          #'name:' 'uIPainterView'
+          #'layout:' #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
+          #'isOpaque:' true
+          #'window:' 
+           #(#WindowSpec
+              #'name:' 'uIPainterView'
+              #'layout:' #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
+              #'isOpaque:' true
+              #'label:' 'unnamed'
+              #'bounds:' #(#Rectangle 0 0 238 291)
+          )
+          #'component:' 
+           #(#SpecCollection
+              #'collection:' 
+               #(
+                 #(#LabelSpec
+                    #'name:' 'label0'
+                    #'layout:' #(#LayoutFrame 5 0 7 0 48 0 30 0)
+                    #'isOpaque:' true
+                    #'label:' 'Layout:'
+                    #'foregroundColor:' #(#Color 0.0 0.0 0.0)
+                    #'backgroundColor:' #(#Color 66.9993 66.9993 66.9993)
+                    #'initiallyInvisible:' false
+                    #'level:' 0
+                    #'adjust:' #center
+                    #'hasCharacterOrientedLabel:' true
+                )
+                 #(#PopUpListSpec
+                    #'name:' 'popUpList1'
+                    #'layout:' #(#LayoutFrame 58 0.0 7 0 -12 1.0 30 0)
+                    #'isOpaque:' true
+                    #'label:' 'popup'
+                    #'foregroundColor:' #(#Color 0.0 0.0 0.0)
+                    #'backgroundColor:' #(#Color 66.9993 66.9993 66.9993)
+                    #'initiallyInvisible:' false
+                    #'model:' #layoutType
+                    #'menu:' #layoutTypeList
+                )
+
+                 #(#LabelSpec
+                    #'name:' 'label left'
+                    #'layout:' #(#LayoutFrame 12 0 79 0 53 0 97 0)
+                    #'isOpaque:' true
+                    #'label:' 'left'
+                    #'foregroundColor:' #(#Color 0.0 0.0 0.0)
+                    #'backgroundColor:' #(#Color 66.9993 66.9993 66.9993)
+                    #'initiallyInvisible:' false
+                    #'level:' 0
+                    #'adjust:' #center
+                    #'hasCharacterOrientedLabel:' true
+                )
+                 #(#LabelSpec
+                    #'name:' 'label top'
+                    #'layout:' #(#LayoutFrame 12 0 107 0 53 0 125 0)
+                    #'isOpaque:' true
+                    #'label:' 'top'
+                    #'foregroundColor:' #(#Color 0.0 0.0 0.0)
+                    #'backgroundColor:' #(#Color 66.9993 66.9993 66.9993)
+                    #'initiallyInvisible:' false
+                    #'level:' 0
+                    #'adjust:' #center
+                    #'hasCharacterOrientedLabel:' true
+                )
+                 #(#LabelSpec
+                    #'name:' 'label right'
+                    #'layout:' #(#LayoutFrame 12 0 135 0 53 0 153 0)
+                    #'isOpaque:' true
+                    #'label:' 'right'
+                    #'foregroundColor:' #(#Color 0.0 0.0 0.0)
+                    #'backgroundColor:' #(#Color 66.9993 66.9993 66.9993)
+                    #'initiallyInvisible:' false
+                    #'level:' 0
+                    #'adjust:' #center
+                    #'hasCharacterOrientedLabel:' true
+                )
+                 #(#LabelSpec
+                    #'name:' 'label bottom'
+                    #'layout:' #(#LayoutFrame 12 0 163 0 53 0 181 0)
+                    #'isOpaque:' true
+                    #'label:' 'bottom'
+                    #'foregroundColor:' #(#Color 0.0 0.0 0.0)
+                    #'backgroundColor:' #(#Color 66.9993 66.9993 66.9993)
+                    #'initiallyInvisible:' false
+                    #'level:' 0
+                    #'adjust:' #center
+                    #'hasCharacterOrientedLabel:' true
+                )
+                 #(#LabelSpec
+                    #'name:' 'label relative'
+                    #'layout:' #(#LayoutFrame 65 0 50 0 110 0 68 0)
+                    #'isOpaque:' true
+                    #'label:' 'relative'
+                    #'foregroundColor:' #(#Color 0.0 0.0 0.0)
+                    #'backgroundColor:' #(#Color 66.9993 66.9993 66.9993)
+                    #'initiallyInvisible:' false
+                    #'level:' 0
+                    #'adjust:' #center
+                    #'hasCharacterOrientedLabel:' true
+                )
+                 #(#LabelSpec
+                    #'name:' 'label offset'
+                    #'layout:' #(#LayoutFrame 159 0 50 0 190 0 68 0)
+                    #'isOpaque:' true
+                    #'label:' 'offset'
+                    #'foregroundColor:' #(#Color 0.0 0.0 0.0)
+                    #'backgroundColor:' #(#Color 66.9993 66.9993 66.9993)
+                    #'initiallyInvisible:' false
+                    #'level:' 0
+                    #'adjust:' #center
+                    #'hasCharacterOrientedLabel:' true
+                )
+                 #(#LabelSpec
+                    #'name:' 'label all relative'
+                    #'layout:' #(#LayoutFrame 12 0 197 0 53 0 215 0)
+                    #'isOpaque:' true
+                    #'label:' 'all'
+                    #'foregroundColor:' #(#Color 0.0 0.0 0.0)
+                    #'backgroundColor:' #(#Color 66.9993 66.9993 66.9993)
+                    #'initiallyInvisible:' false
+                    #'level:' 0
+                    #'adjust:' #center
+                    #'hasCharacterOrientedLabel:' true
+                )
+                 #(#LabelSpec
+                    #'name:' 'label all absolute'
+                    #'layout:' #(#LayoutFrame 159 0 197 0 210 0 215 0)
+                    #'isOpaque:' true
+                    #'label:' 'all'
+                    #'foregroundColor:' #(#Color 0.0 0.0 0.0)
+                    #'backgroundColor:' #(#Color 66.9993 66.9993 66.9993)
+                    #'initiallyInvisible:' false
+                    #'level:' 0
+                    #'adjust:' #center
+                    #'hasCharacterOrientedLabel:' true
+                )
+                 #(#InputFieldSpec
+                    #'name:' 'relative E1'
+                    #'layout:' #(#LayoutFrame 65 0 79 0 113 0 97 0)
+                    #'isOpaque:' true
+                    #'initiallyDisabled:' false
+                    #'initiallyInvisible:' false
+                    #'model:' #leftFraction
+                    #'isReadOnly:' false
+                    #'tabable:' false
+                    #'type:' #numberOrNil
+                    #'immediateAccept:' false
+                    #'acceptOnLeave:' true
+                    #'acceptOnReturn:' true
+                    #'acceptOnTab:' true
+                    #'acceptOnLostFocus:' true
+                    #'hasBorder:' false
+                )
+                 #(#InputFieldSpec
+                    #'name:' 'relative E2'
+                    #'layout:' #(#LayoutFrame 65 0 107 0 113 0 125 0)
+                    #'isOpaque:' true
+                    #'initiallyDisabled:' false
+                    #'initiallyInvisible:' false
                     #'model:' #topFraction
+                    #'isReadOnly:' false
+                    #'tabable:' false
+                    #'type:' #numberOrNil
                     #'immediateAccept:' false
+                    #'acceptOnLeave:' true
+                    #'acceptOnReturn:' true
+                    #'acceptOnTab:' true
+                    #'acceptOnLostFocus:' true
+                    #'hasBorder:' false
+                )
+                 #(#InputFieldSpec
+                    #'name:' 'relative E3'
+                    #'layout:' #(#LayoutFrame 65 0 135 0 113 0 153 0)
+                    #'isOpaque:' true
+                    #'initiallyDisabled:' false
+                    #'initiallyInvisible:' false
+                    #'model:' #rightFraction
+                    #'isReadOnly:' false
+                    #'tabable:' false
+                    #'type:' #numberOrNil
+                    #'immediateAccept:' false
+                    #'acceptOnLeave:' true
+                    #'acceptOnReturn:' true
+                    #'acceptOnTab:' true
+                    #'acceptOnLostFocus:' true
+                    #'hasBorder:' false
+                )
+                 #(#InputFieldSpec
+                    #'name:' 'relative E4'
+                    #'layout:' #(#LayoutFrame 65 0 163 0 113 0 181 0)
+                    #'isOpaque:' true
+                    #'initiallyDisabled:' false
+                    #'initiallyInvisible:' false
+                    #'model:' #bottomFraction
+                    #'isReadOnly:' false
+                    #'tabable:' false
+                    #'type:' #numberOrNil
+                    #'immediateAccept:' false
+                    #'acceptOnLeave:' true
+                    #'acceptOnReturn:' true
+                    #'acceptOnTab:' true
+                    #'acceptOnLostFocus:' true
+                    #'hasBorder:' false
+                )
+                 #(#InputFieldSpec
+                    #'name:' 'offset E1'
+                    #'layout:' #(#LayoutFrame 159 0 79 0 210 0 97 0)
+                    #'isOpaque:' true
+                    #'initiallyDisabled:' false
+                    #'initiallyInvisible:' false
+                    #'model:' #leftOffset
+                    #'isReadOnly:' false
+                    #'tabable:' false
+                    #'type:' #numberOrNil
+                    #'immediateAccept:' false
+                    #'acceptOnLeave:' true
+                    #'acceptOnReturn:' true
+                    #'acceptOnTab:' true
+                    #'acceptOnLostFocus:' true
+                    #'hasBorder:' false
+                )
+                 #(#InputFieldSpec
+                    #'name:' 'offset E2'
+                    #'layout:' #(#LayoutFrame 159 0 107 0 210 0 125 0)
+                    #'isOpaque:' true
+                    #'initiallyDisabled:' false
+                    #'initiallyInvisible:' false
+                    #'model:' #topOffset
+                    #'isReadOnly:' false
+                    #'tabable:' false
+                    #'type:' #numberOrNil
+                    #'immediateAccept:' false
+                    #'acceptOnLeave:' true
+                    #'acceptOnReturn:' true
+                    #'acceptOnTab:' true
+                    #'acceptOnLostFocus:' true
+                    #'hasBorder:' false
+                )
+                 #(#InputFieldSpec
+                    #'name:' 'offset E3'
+                    #'layout:' #(#LayoutFrame 159 0 135 0 210 0 153 0)
+                    #'isOpaque:' true
+                    #'initiallyDisabled:' false
+                    #'initiallyInvisible:' false
+                    #'model:' #rightOffset
+                    #'isReadOnly:' false
+                    #'tabable:' false
+                    #'type:' #numberOrNil
+                    #'immediateAccept:' false
+                    #'acceptOnLeave:' true
                     #'acceptOnReturn:' true
                     #'acceptOnTab:' true
-                    #tabable: true
+                    #'acceptOnLostFocus:' true
+                    #'hasBorder:' false
+                )
+                 #(#InputFieldSpec
+                    #'name:' 'offset E4'
+                    #'layout:' #(#LayoutFrame 159 0 163 0 210 0 181 0)
+                    #'isOpaque:' true
+                    #'initiallyDisabled:' false
+                    #'initiallyInvisible:' false
+                    #'model:' #bottomOffset
+                    #'isReadOnly:' false
+                    #'tabable:' false
+                    #'type:' #numberOrNil
+                    #'immediateAccept:' false
+                    #'acceptOnLeave:' true
+                    #'acceptOnReturn:' true
+                    #'acceptOnTab:' true
+                    #'acceptOnLostFocus:' true
+                    #'hasBorder:' false
+                )
+                 #(#ActionButtonSpec
+                    #'name:' 'relative B1'
+                    #'layout:' #(#LayoutFrame 117 0 79 0 136 0 97 0)
+                    #'isOpaque:' true
+                    #'label:' ' '
+                    #'foregroundColor:' #(#Color 0.0 0.0 0.0)
+                    #'backgroundColor:' #(#Color 66.9993 66.9993 66.9993)
+                    #'initiallyInvisible:' false
+                    #'tabable:' false
+                    #'isDefault:' false
+                    #'defaultable:' false
+                    #'model:' #makeRelativeLeft
+                    #'hasCharacterOrientedLabel:' true
+                    #'isDecorated:' false
+                    #'initiallyDisabled:' false
+                )
+                 #(#ActionButtonSpec
+                    #'name:' 'relative B2'
+                    #'layout:' #(#LayoutFrame 117 0 107 0 136 0 125 0)
+                    #'isOpaque:' true
+                    #'label:' ' '
+                    #'foregroundColor:' #(#Color 0.0 0.0 0.0)
+                    #'backgroundColor:' #(#Color 66.9993 66.9993 66.9993)
+                    #'initiallyInvisible:' false
+                    #'tabable:' false
+                    #'isDefault:' false
+                    #'defaultable:' false
+                    #'model:' #makeRelativeTop
+                    #'hasCharacterOrientedLabel:' true
+                    #'isDecorated:' false
+                    #'initiallyDisabled:' false
+                )
+                 #(#ActionButtonSpec
+                    #'name:' 'relative B3'
+                    #'layout:' #(#LayoutFrame 117 0 135 0 136 0 153 0)
+                    #'isOpaque:' true
+                    #'label:' ' '
+                    #'foregroundColor:' #(#Color 0.0 0.0 0.0)
+                    #'backgroundColor:' #(#Color 66.9993 66.9993 66.9993)
+                    #'initiallyInvisible:' false
+                    #'tabable:' false
+                    #'isDefault:' false
+                    #'defaultable:' false
+                    #'model:' #makeRelativeRight
+                    #'hasCharacterOrientedLabel:' true
+                    #'isDecorated:' false
+                    #'initiallyDisabled:' false
+                )
+                 #(#ActionButtonSpec
+                    #'name:' 'relative B4'
+                    #'layout:' #(#LayoutFrame 117 0 163 0 136 0 181 0)
+                    #'isOpaque:' true
+                    #'label:' ' '
+                    #'foregroundColor:' #(#Color 0.0 0.0 0.0)
+                    #'backgroundColor:' #(#Color 66.9993 66.9993 66.9993)
+                    #'initiallyInvisible:' false
+                    #'tabable:' false
+                    #'isDefault:' false
+                    #'defaultable:' false
+                    #'model:' #makeRelativeBottom
+                    #'hasCharacterOrientedLabel:' true
+                    #'isDecorated:' false
+                    #'initiallyDisabled:' false
+                )
+                 #(#ActionButtonSpec
+                    #'name:' 'relative BAll'
+                    #'layout:' #(#LayoutFrame 117 0 197 0 136 0 215 0)
+                    #'isOpaque:' true
+                    #'label:' ' '
+                    #'foregroundColor:' #(#Color 0.0 0.0 0.0)
+                    #'backgroundColor:' #(#Color 66.9993 66.9993 66.9993)
+                    #'initiallyInvisible:' false
+                    #'tabable:' false
+                    #'isDefault:' false
+                    #'defaultable:' false
+                    #'model:' #makeRelativeAll
+                    #'hasCharacterOrientedLabel:' true
+                    #'isDecorated:' false
+                    #'initiallyDisabled:' false
+                )
+                 #(#ActionButtonSpec
+                    #'name:' 'offset B1'
+                    #'layout:' #(#LayoutFrame 214 0 79 0 233 0 97 0)
+                    #'isOpaque:' true
+                    #'label:' ''
+                    #'foregroundColor:' #(#Color 0.0 0.0 0.0)
+                    #'backgroundColor:' #(#Color 66.9993 66.9993 66.9993)
+                    #'initiallyInvisible:' false
+                    #'tabable:' false
+                    #'isDefault:' false
+                    #'defaultable:' false
+                    #'model:' #makeOffsetLeft
+                    #'hasCharacterOrientedLabel:' true
+                    #'isDecorated:' false
+                    #'initiallyDisabled:' false
+                )
+                 #(#ActionButtonSpec
+                    #'name:' 'offset B2'
+                    #'layout:' #(#LayoutFrame 214 0 107 0 233 0 125 0)
+                    #'isOpaque:' true
+                    #'label:' ''
+                    #'foregroundColor:' #(#Color 0.0 0.0 0.0)
+                    #'backgroundColor:' #(#Color 66.9993 66.9993 66.9993)
+                    #'initiallyInvisible:' false
+                    #'tabable:' false
+                    #'isDefault:' false
+                    #'defaultable:' false
+                    #'model:' #makeOffsetTop
+                    #'hasCharacterOrientedLabel:' true
+                    #'isDecorated:' false
+                    #'initiallyDisabled:' false
+                )
+                 #(#ActionButtonSpec
+                    #'name:' 'offset B3'
+                    #'layout:' #(#LayoutFrame 214 0 135 0 233 0 153 0)
+                    #'isOpaque:' true
+                    #'label:' ''
+                    #'foregroundColor:' #(#Color 0.0 0.0 0.0)
+                    #'backgroundColor:' #(#Color 66.9993 66.9993 66.9993)
+                    #'initiallyInvisible:' false
+                    #'tabable:' false
+                    #'isDefault:' false
+                    #'defaultable:' false
+                    #'model:' #makeOffsetRight
+                    #'hasCharacterOrientedLabel:' true
+                    #'isDecorated:' false
+                    #'initiallyDisabled:' false
+                )
+                 #(#ActionButtonSpec
+                    #'name:' 'offset B4'
+                    #'layout:' #(#LayoutFrame 214 0 163 0 233 0 181 0)
+                    #'isOpaque:' true
+                    #'label:' ''
+                    #'foregroundColor:' #(#Color 0.0 0.0 0.0)
+                    #'backgroundColor:' #(#Color 66.9993 66.9993 66.9993)
+                    #'initiallyInvisible:' false
+                    #'tabable:' false
+                    #'isDefault:' false
+                    #'defaultable:' false
+                    #'model:' #makeOffsetBottom
+                    #'hasCharacterOrientedLabel:' true
+                    #'isDecorated:' false
+                    #'initiallyDisabled:' false
+                )
+                 #(#ActionButtonSpec
+                    #'name:' 'offset BAll'
+                    #'layout:' #(#LayoutFrame 214 0 197 0 233 0 215 0)
+                    #'isOpaque:' true
+                    #'label:' ' '
+                    #'foregroundColor:' #(#Color 0.0 0.0 0.0)
+                    #'backgroundColor:' #(#Color 66.9993 66.9993 66.9993)
+                    #'initiallyInvisible:' false
+                    #'tabable:' false
+                    #'isDefault:' false
+                    #'defaultable:' false
+                    #'model:' #makeOffsetAll
+                    #'hasCharacterOrientedLabel:' true
+                    #'isDecorated:' false
+                    #'initiallyDisabled:' false
+                )
+              )
+          )
+      )
+!
+
+specificationLayoutOrigin
+    "this window spec was automatically generated by the ST/X UIPainter"
+
+    "do not manually edit this - the painter/builder may not be able to
+     handle the specification if its corrupted."
+
+    "
+     UIPainter new openOnClass:UIPropertyView andSelector:#specificationLayoutOrigin
+     UIPropertyView new openInterface:#specificationLayoutOrigin
+    "
+
+    <resource: #canvas>
+
+    ^
+     
+       #(#FullSpec
+          #'name:' 'uIPainterView'
+          #'layout:' #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
+          #'isOpaque:' true
+          #'window:' 
+           #(#WindowSpec
+              #'name:' 'uIPainterView'
+              #'layout:' #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
+              #'isOpaque:' true
+              #'label:' 'unnamed'
+              #'bounds:' #(#Rectangle 0 0 238 303)
+          )
+          #'component:' 
+           #(#SpecCollection
+              #'collection:' 
+               #(
+                 #(#LabelSpec
+                    #'name:' 'label0'
+                    #'layout:' #(#LayoutFrame 5 0 7 0 48 0 30 0)
+                    #'isOpaque:' true
+                    #'label:' 'Layout:'
+                    #'foregroundColor:' #(#Color 0.0 0.0 0.0)
+                    #'backgroundColor:' #(#Color 66.9993 66.9993 66.9993)
+                    #'initiallyInvisible:' false
+                    #'level:' 0
+                    #'adjust:' #center
+                    #'hasCharacterOrientedLabel:' true
+                )
+                 #(#PopUpListSpec
+                    #'name:' 'popUpList1'
+                    #'layout:' #(#LayoutFrame 58 0.0 7 0 -12 1.0 30 0)
+                    #'isOpaque:' true
+                    #'label:' 'popup'
+                    #'foregroundColor:' #(#Color 0.0 0.0 0.0)
+                    #'backgroundColor:' #(#Color 66.9993 66.9993 66.9993)
+                    #'initiallyInvisible:' false
+                    #'model:' #layoutType
+                    #'menu:' #layoutTypeList
+                )
+
+                 #(#LabelSpec
+                    #'name:' 'label1'
+                    #'layout:' #(#LayoutFrame 16 0 82 0 44 0 100 0)
+                    #'isOpaque:' true
+                    #'label:' 'left'
+                    #'foregroundColor:' #(#Color 0.0 0.0 0.0)
+                    #'backgroundColor:' #(#Color 66.9993 66.9993 66.9993)
+                    #'initiallyInvisible:' false
+                    #'level:' 0
+                    #'adjust:' #center
+                    #'hasCharacterOrientedLabel:' true
+                )
+                 #(#LabelSpec
+                    #'name:' 'label2'
+                    #'layout:' #(#LayoutFrame 16 0 109 0 44 0 127 0)
+                    #'isOpaque:' true
+                    #'label:' 'top'
+                    #'foregroundColor:' #(#Color 0.0 0.0 0.0)
+                    #'backgroundColor:' #(#Color 66.9993 66.9993 66.9993)
+                    #'initiallyInvisible:' false
+                    #'level:' 0
+                    #'adjust:' #center
+                    #'hasCharacterOrientedLabel:' true
+                )
+                 #(#LabelSpec
+                    #'name:' 'label3'
+                    #'layout:' #(#LayoutFrame 57 0 50 0 103 0 67 0)
+                    #'isOpaque:' true
+                    #'label:' 'relative'
+                    #'foregroundColor:' #(#Color 0.0 0.0 0.0)
+                    #'backgroundColor:' #(#Color 66.9993 66.9993 66.9993)
+                    #'initiallyInvisible:' false
+                    #'level:' 0
+                    #'adjust:' #center
+                    #'hasCharacterOrientedLabel:' true
+                )
+                 #(#LabelSpec
+                    #'name:' 'label4'
+                    #'layout:' #(#LayoutFrame 154 0 51 0 190 0 68 0)
+                    #'isOpaque:' true
+                    #'label:' 'offset'
+                    #'foregroundColor:' #(#Color 0.0 0.0 0.0)
+                    #'backgroundColor:' #(#Color 66.9993 66.9993 66.9993)
+                    #'initiallyInvisible:' false
+                    #'level:' 0
+                    #'adjust:' #center
+                    #'hasCharacterOrientedLabel:' true
+                )
+                 #(#InputFieldSpec
+                    #'name:' 'editField1'
+                    #'layout:' #(#LayoutFrame 57 0 82 0 114 0 100 0)
+                    #'isOpaque:' true
+                    #'initiallyDisabled:' false
+                    #'initiallyInvisible:' false
+                    #'model:' #leftFraction
+                    #'isReadOnly:' false
+                    #'tabable:' true
+                    #'type:' #numberOrNil
+                    #'immediateAccept:' false
+                    #'acceptOnLeave:' true
+                    #'acceptOnReturn:' true
+                    #'acceptOnTab:' true
+                    #'acceptOnLostFocus:' true
+                    #'hasBorder:' false
+                )
+                 #(#InputFieldSpec
+                    #'name:' 'editField2'
+                    #'layout:' #(#LayoutFrame 57 0 109 0 114 0 127 0)
+                    #'isOpaque:' true
+                    #'initiallyDisabled:' false
+                    #'initiallyInvisible:' false
+                    #'model:' #topFraction
+                    #'isReadOnly:' false
+                    #'tabable:' true
+                    #'type:' #numberOrNil
+                    #'immediateAccept:' false
+                    #'acceptOnLeave:' true
+                    #'acceptOnReturn:' true
+                    #'acceptOnTab:' true
+                    #'acceptOnLostFocus:' true
+                    #'hasBorder:' false
                 )
                  #(#InputFieldSpec
                     #'name:' 'editField3'
+                    #'layout:' #(#LayoutFrame 154 0 82 0 212 0 100 0)
+                    #'isOpaque:' true
+                    #'initiallyDisabled:' false
+                    #'initiallyInvisible:' false
+                    #'model:' #leftOffset
+                    #'isReadOnly:' false
+                    #'tabable:' true
                     #'type:' #numberOrNil
-                    #'layout:' #(#LayoutFrame 154 0 42 0 212 0 60 0)
-                    #'model:' #leftOffset
                     #'immediateAccept:' false
+                    #'acceptOnLeave:' true
                     #'acceptOnReturn:' true
                     #'acceptOnTab:' true
-                    #tabable: true
+                    #'acceptOnLostFocus:' true
+                    #'hasBorder:' false
                 )
                  #(#InputFieldSpec
                     #'name:' 'editField4'
+                    #'layout:' #(#LayoutFrame 154 0 109 0 212 0 127 0)
+                    #'isOpaque:' true
+                    #'initiallyDisabled:' false
+                    #'initiallyInvisible:' false
+                    #'model:' #topOffset
+                    #'isReadOnly:' false
+                    #'tabable:' true
                     #'type:' #numberOrNil
-                    #'layout:' #(#LayoutFrame 154 0 69 0 212 0 87 0)
-                    #'model:' #topOffset
                     #'immediateAccept:' false
+                    #'acceptOnLeave:' true
                     #'acceptOnReturn:' true
                     #'acceptOnTab:' true
-                    #tabable: true
+                    #'acceptOnLostFocus:' true
+                    #'hasBorder:' false
                 )
                  #(#ActionButtonSpec
                     #'name:' 'button1'
-                    #'layout:' #(#LayoutFrame 119 0 42 0 138 0 60 0)
+                    #'layout:' #(#LayoutFrame 119 0 82 0 138 0 100 0)
+                    #'isOpaque:' true
                     #'label:' ''
+                    #'foregroundColor:' #(#Color 0.0 0.0 0.0)
+                    #'backgroundColor:' #(#Color 66.9993 66.9993 66.9993)
+                    #'initiallyInvisible:' false
+                    #'tabable:' false
+                    #'isDefault:' false
+                    #'defaultable:' false
                     #'model:' #makeRelativeLeft
+                    #'hasCharacterOrientedLabel:' true
+                    #'isDecorated:' false
+                    #'initiallyDisabled:' false
                 )
                  #(#ActionButtonSpec
                     #'name:' 'button2'
-                    #'layout:' #(#LayoutFrame 119 0 69 0 138 0 87 0)
+                    #'layout:' #(#LayoutFrame 119 0 109 0 138 0 127 0)
+                    #'isOpaque:' true
                     #'label:' ''
+                    #'foregroundColor:' #(#Color 0.0 0.0 0.0)
+                    #'backgroundColor:' #(#Color 66.9993 66.9993 66.9993)
+                    #'initiallyInvisible:' false
+                    #'tabable:' false
+                    #'isDefault:' false
+                    #'defaultable:' false
                     #'model:' #makeRelativeTop
+                    #'hasCharacterOrientedLabel:' true
+                    #'isDecorated:' false
+                    #'initiallyDisabled:' false
                 )
                  #(#ActionButtonSpec
                     #'name:' 'button3'
-                    #'layout:' #(#LayoutFrame 216 0 42 0 235 0 60 0)
+                    #'layout:' #(#LayoutFrame 216 0 82 0 235 0 100 0)
+                    #'isOpaque:' true
                     #'label:' ''
+                    #'foregroundColor:' #(#Color 0.0 0.0 0.0)
+                    #'backgroundColor:' #(#Color 66.9993 66.9993 66.9993)
+                    #'initiallyInvisible:' false
+                    #'tabable:' false
+                    #'isDefault:' false
+                    #'defaultable:' false
                     #'model:' #makeOffsetLeft
+                    #'hasCharacterOrientedLabel:' true
+                    #'isDecorated:' false
+                    #'initiallyDisabled:' false
                 )
                  #(#ActionButtonSpec
                     #'name:' 'button4'
-                    #'layout:' #(#LayoutFrame 216 0 69 0 235 0 87 0)
+                    #'layout:' #(#LayoutFrame 216 0 109 0 235 0 127 0)
+                    #'isOpaque:' true
                     #'label:' ''
+                    #'foregroundColor:' #(#Color 0.0 0.0 0.0)
+                    #'backgroundColor:' #(#Color 66.9993 66.9993 66.9993)
+                    #'initiallyInvisible:' false
+                    #'tabable:' false
+                    #'isDefault:' false
+                    #'defaultable:' false
                     #'model:' #makeOffsetTop
+                    #'hasCharacterOrientedLabel:' true
+                    #'isDecorated:' false
+                    #'initiallyDisabled:' false
                 )
-
-
-               #(#ActionButtonSpec
-                  #'name:' 'button'
-                  #'layout:' #(#LayoutFrame 16 0 210 0 76 0 240 0)
-                  #'label:' 'frame'
-                  #'model:' #showLayoutFrame
+                 #(#ActionButtonSpec
+                    #'name:' 'button8'
+                    #'layout:' #(#LayoutFrame 119 0 135 0 138 0 153 0)
+                    #'isOpaque:' true
+                    #'label:' ''
+                    #'foregroundColor:' #(#Color 0.0 0.0 0.0)
+                    #'backgroundColor:' #(#Color 66.9993 66.9993 66.9993)
+                    #'initiallyInvisible:' false
+                    #'tabable:' false
+                    #'isDefault:' false
+                    #'defaultable:' false
+                    #'model:' #makeRelativeLeftTop
+                    #'hasCharacterOrientedLabel:' true
+                    #'isDecorated:' false
+                    #'initiallyDisabled:' false
+                )
+                 #(#ActionButtonSpec
+                    #'name:' 'button9'
+                    #'layout:' #(#LayoutFrame 216 0 135 0 235 0 153 0)
+                    #'isOpaque:' true
+                    #'label:' ''
+                    #'foregroundColor:' #(#Color 0.0 0.0 0.0)
+                    #'backgroundColor:' #(#Color 66.9993 66.9993 66.9993)
+                    #'initiallyInvisible:' false
+                    #'tabable:' false
+                    #'isDefault:' false
+                    #'defaultable:' false
+                    #'model:' #makeOffsetLeftTop
+                    #'hasCharacterOrientedLabel:' true
+                    #'isDecorated:' false
+                    #'initiallyDisabled:' false
+                )
+                 #(#LabelSpec
+                    #'name:' 'label5'
+                    #'layout:' #(#LayoutFrame 16 0 135 0 44 0 153 0)
+                    #'isOpaque:' true
+                    #'label:' 'all'
+                    #'foregroundColor:' #(#Color 0.0 0.0 0.0)
+                    #'backgroundColor:' #(#Color 66.9993 66.9993 66.9993)
+                    #'initiallyInvisible:' false
+                    #'level:' 0
+                    #'adjust:' #center
+                    #'hasCharacterOrientedLabel:' true
                 )
-               #(#ActionButtonSpec
-                  #'name:' 'button'
-                  #'layout:' #(#LayoutFrame 96 0 210 0 156 0 240 0)
-                  #'label:' 'origin'
-                  #'model:' #showLayoutOrigin
-                  #'initiallyDisabled:' true
+              )
+          )
+      )
+!
+
+specificationPoint
+    "this window spec was automatically generated by the ST/X UIPainter"
+
+    "do not manually edit this - the painter/builder may not be able to
+     handle the specification if its corrupted."
+
+    "
+     UIPainter new openOnClass:UIPropertyView andSelector:#specificationPoint
+     UIPropertyView new openInterface:#specificationPoint
+    "
+
+    <resource: #canvas>
+
+    ^
+     
+       #(#FullSpec
+          #'name:' 'uIPainterView'
+          #'layout:' #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
+          #'isOpaque:' true
+          #'window:' 
+           #(#WindowSpec
+              #'name:' 'uIPainterView'
+              #'layout:' #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
+              #'isOpaque:' true
+              #'label:' 'unnamed'
+              #'bounds:' #(#Rectangle 0 0 238 303)
+          )
+          #'component:' 
+           #(#SpecCollection
+              #'collection:' 
+               #(
+                 #(#LabelSpec
+                    #'name:' 'label0'
+                    #'layout:' #(#LayoutFrame 16 0 7 0 67 0 30 0)
+                    #'isOpaque:' true
+                    #'label:' 'Layout:'
+                    #'foregroundColor:' #(#Color 0.0 0.0 0.0)
+                    #'backgroundColor:' #(#Color 66.9993 66.9993 66.9993)
+                    #'initiallyInvisible:' false
+                    #'level:' 0
+                    #'adjust:' #center
+                    #'hasCharacterOrientedLabel:' true
+                )
+                 #(#PopUpListSpec
+                    #'name:' 'popUpList1'
+                    #'layout:' #(#LayoutFrame 77 0.0 7 0 -68 1.0 30 0)
+                    #'isOpaque:' true
+                    #'label:' 'popup'
+                    #'foregroundColor:' #(#Color 0.0 0.0 0.0)
+                    #'backgroundColor:' #(#Color 66.9993 66.9993 66.9993)
+                    #'initiallyInvisible:' false
+                    #'model:' #layoutType
+                    #'menu:' #layoutTypeList
                 )
-               #(#ActionButtonSpec
-                  #'name:' 'button'
-                  #'layout:' #(#LayoutFrame 176 0 210 0 236 0 240 0)
-                  #'label:' 'align'
-                  #'model:' #showAlignmentOrigin
+                 #(#LabelSpec
+                    #'name:' 'label1'
+                    #'layout:' #(#LayoutFrame 16 0 62 0 67 0 79 0)
+                    #'isOpaque:' true
+                    #'label:' 'origin x:'
+                    #'foregroundColor:' #(#Color 0.0 0.0 0.0)
+                    #'backgroundColor:' #(#Color 66.9993 66.9993 66.9993)
+                    #'initiallyInvisible:' false
+                    #'level:' 0
+                    #'adjust:' #center
+                    #'hasCharacterOrientedLabel:' true
+                )
+                 #(#LabelSpec
+                    #'name:' 'label2'
+                    #'layout:' #(#LayoutFrame 16 0 89 0 67 0 107 0)
+                    #'isOpaque:' true
+                    #'label:' 'origin y:'
+                    #'foregroundColor:' #(#Color 0.0 0.0 0.0)
+                    #'backgroundColor:' #(#Color 66.9993 66.9993 66.9993)
+                    #'initiallyInvisible:' false
+                    #'level:' 0
+                    #'adjust:' #center
+                    #'hasCharacterOrientedLabel:' true
                 )
-
+                 #(#InputFieldSpec
+                    #'name:' 'editField1'
+                    #'layout:' #(#LayoutFrame 77 0 62 0 170 0 80 0)
+                    #'isOpaque:' true
+                    #'initiallyDisabled:' false
+                    #'initiallyInvisible:' false
+                    #'model:' #leftOffset
+                    #'isReadOnly:' false
+                    #'tabable:' true
+                    #'type:' #numberOrNil
+                    #'immediateAccept:' false
+                    #'acceptOnLeave:' true
+                    #'acceptOnReturn:' true
+                    #'acceptOnTab:' true
+                    #'acceptOnLostFocus:' true
+                    #'hasBorder:' false
+                )
+                 #(#InputFieldSpec
+                    #'name:' 'editField2'
+                    #'layout:' #(#LayoutFrame 77 0 89 0 170 0 107 0)
+                    #'isOpaque:' true
+                    #'initiallyDisabled:' false
+                    #'initiallyInvisible:' false
+                    #'model:' #topOffset
+                    #'isReadOnly:' false
+                    #'tabable:' true
+                    #'type:' #numberOrNil
+                    #'immediateAccept:' false
+                    #'acceptOnLeave:' true
+                    #'acceptOnReturn:' true
+                    #'acceptOnTab:' true
+                    #'acceptOnLostFocus:' true
+                    #'hasBorder:' false
+                )
               )
           )
       )
+!
 
+specificationRectangle
+    "this window spec was automatically generated by the ST/X UIPainter"
+
+    "do not manually edit this - the painter/builder may not be able to
+     handle the specification if its corrupted."
+
+    "
+     UIPainter new openOnClass:UIPropertyView andSelector:#specificationRectangle
+     UIPropertyView new openInterface:#specificationRectangle
+    "
+
+    <resource: #canvas>
 
-
+    ^
+     
+       #(#FullSpec
+          #'name:' 'uIPainterView'
+          #'layout:' #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
+          #'isOpaque:' true
+          #'window:' 
+           #(#WindowSpec
+              #'name:' 'uIPainterView'
+              #'layout:' #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
+              #'isOpaque:' true
+              #'label:' 'unnamed'
+              #'bounds:' #(#Rectangle 0 0 238 303)
+          )
+          #'component:' 
+           #(#SpecCollection
+              #'collection:' 
+               #(
+                 #(#LabelSpec
+                    #'name:' 'label0'
+                    #'layout:' #(#LayoutFrame 16 0 7 0 67 0 30 0)
+                    #'isOpaque:' true
+                    #'label:' 'Layout:'
+                    #'foregroundColor:' #(#Color 0.0 0.0 0.0)
+                    #'backgroundColor:' #(#Color 66.9993 66.9993 66.9993)
+                    #'initiallyInvisible:' false
+                    #'level:' 0
+                    #'adjust:' #center
+                    #'hasCharacterOrientedLabel:' true
+                )
+                 #(#PopUpListSpec
+                    #'name:' 'popUpList1'
+                    #'layout:' #(#LayoutFrame 77 0.0 7 0 -83 1.0 30 0)
+                    #'isOpaque:' true
+                    #'label:' 'popup'
+                    #'foregroundColor:' #(#Color 0.0 0.0 0.0)
+                    #'backgroundColor:' #(#Color 66.9993 66.9993 66.9993)
+                    #'initiallyInvisible:' false
+                    #'model:' #layoutType
+                    #'menu:' #layoutTypeList
+                )
+                 #(#LabelSpec
+                    #'name:' 'label1'
+                    #'layout:' #(#LayoutFrame 16 0 62 0 74 0 80 0)
+                    #'isOpaque:' true
+                    #'label:' 'origin x:'
+                    #'foregroundColor:' #(#Color 0.0 0.0 0.0)
+                    #'backgroundColor:' #(#Color 66.9993 66.9993 66.9993)
+                    #'initiallyInvisible:' false
+                    #'level:' 0
+                    #'adjust:' #left
+                    #'hasCharacterOrientedLabel:' true
+                )
+                 #(#LabelSpec
+                    #'name:' 'label2'
+                    #'layout:' #(#LayoutFrame 16 0 89 0 74 0 107 0)
+                    #'isOpaque:' true
+                    #'label:' 'origin y:'
+                    #'foregroundColor:' #(#Color 0.0 0.0 0.0)
+                    #'backgroundColor:' #(#Color 66.9993 66.9993 66.9993)
+                    #'initiallyInvisible:' false
+                    #'level:' 0
+                    #'adjust:' #left
+                    #'hasCharacterOrientedLabel:' true
+                )
+                 #(#InputFieldSpec
+                    #'name:' 'editField1'
+                    #'layout:' #(#LayoutFrame 81 0 62 0 174 0 80 0)
+                    #'isOpaque:' true
+                    #'initiallyDisabled:' false
+                    #'initiallyInvisible:' false
+                    #'model:' #leftOffset
+                    #'isReadOnly:' false
+                    #'tabable:' true
+                    #'type:' #numberOrNil
+                    #'immediateAccept:' false
+                    #'acceptOnLeave:' true
+                    #'acceptOnReturn:' true
+                    #'acceptOnTab:' true
+                    #'acceptOnLostFocus:' true
+                    #'hasBorder:' false
+                )
+                 #(#InputFieldSpec
+                    #'name:' 'editField2'
+                    #'layout:' #(#LayoutFrame 81 0 89 0 174 0 107 0)
+                    #'isOpaque:' true
+                    #'initiallyDisabled:' false
+                    #'initiallyInvisible:' false
+                    #'model:' #topOffset
+                    #'isReadOnly:' false
+                    #'tabable:' true
+                    #'type:' #numberOrNil
+                    #'immediateAccept:' false
+                    #'acceptOnLeave:' true
+                    #'acceptOnReturn:' true
+                    #'acceptOnTab:' true
+                    #'acceptOnLostFocus:' true
+                    #'hasBorder:' false
+                )
+                 #(#LabelSpec
+                    #'name:' 'label4'
+                    #'layout:' #(#LayoutFrame 16 0 117 0 74 0 135 0)
+                    #'isOpaque:' true
+                    #'label:' 'corner x:'
+                    #'foregroundColor:' #(#Color 0.0 0.0 0.0)
+                    #'backgroundColor:' #(#Color 66.9993 66.9993 66.9993)
+                    #'initiallyInvisible:' false
+                    #'level:' 0
+                    #'adjust:' #left
+                    #'hasCharacterOrientedLabel:' true
+                )
+                 #(#LabelSpec
+                    #'name:' 'label5'
+                    #'layout:' #(#LayoutFrame 16 0 144 0 74 0 162 0)
+                    #'isOpaque:' true
+                    #'label:' 'corner y:'
+                    #'foregroundColor:' #(#Color 0.0 0.0 0.0)
+                    #'backgroundColor:' #(#Color 66.9993 66.9993 66.9993)
+                    #'initiallyInvisible:' false
+                    #'level:' 0
+                    #'adjust:' #left
+                    #'hasCharacterOrientedLabel:' true
+                )
+                 #(#InputFieldSpec
+                    #'name:' 'editField3'
+                    #'layout:' #(#LayoutFrame 81 0 117 0 174 0 135 0)
+                    #'isOpaque:' true
+                    #'initiallyDisabled:' false
+                    #'initiallyInvisible:' false
+                    #'model:' #rightOffset
+                    #'isReadOnly:' false
+                    #'tabable:' true
+                    #'type:' #numberOrNil
+                    #'immediateAccept:' false
+                    #'acceptOnLeave:' true
+                    #'acceptOnReturn:' true
+                    #'acceptOnTab:' true
+                    #'acceptOnLostFocus:' true
+                    #'hasBorder:' false
+                )
+                 #(#InputFieldSpec
+                    #'name:' 'editField4'
+                    #'layout:' #(#LayoutFrame 81 0 144 0 174 0 162 0)
+                    #'isOpaque:' true
+                    #'initiallyDisabled:' false
+                    #'initiallyInvisible:' false
+                    #'model:' #bottomOffset
+                    #'isReadOnly:' false
+                    #'tabable:' true
+                    #'type:' #numberOrNil
+                    #'immediateAccept:' false
+                    #'acceptOnLeave:' true
+                    #'acceptOnReturn:' true
+                    #'acceptOnTab:' true
+                    #'acceptOnLostFocus:' true
+                    #'hasBorder:' false
+                )
+              )
+          )
+      )
 ! !
 
-!UIPropertyView methodsFor:'accessing'!
+!UIPropertyView methodsFor:'event handling'!
 
-update:something
-    |slices list view prevSpecClass|
+builderViewChanged:what
+    "something changed in the builder view
+    "
+    |slices list prevSpecClass|
 
-    (something == #selection or:[something == #tree]) ifFalse:[
-        (something == #layout and:[modified not and:[self isLayoutSpec]]) ifTrue:[
-            self layoutRead.
+    (what == #selection or:[what == #tree]) ifFalse:[
+        (what == #layout and:[modified not and:[self isLayoutSpec]]) ifTrue:[
+            modified := true.
+            self perform:(('fetch', layoutType asString) asSymbol).
+            modified := false.
         ].
         ^ self
     ].
-
-    view := builderView singleSelection.
-
+    currentView     := builderView singleSelection.
     propertyAspects := nil.
-    currentView     := view.
-    self modified:false.
-
 
     currentView isNil ifTrue:[
-        "/ the workView itself.
-
         propertyList selectionIndex:nil.
         currentSpecChannel := nil.
-
         propertyList list:#().
         propertySpecs := nil.
 
         "/ must setup for a WindowSpec (to allow entry of min- maxSize etc).
-"/        propertyList list:#('Basics' 'Detail').
-        ^ self
+"/      propertyList list:#('Basics' 'Detail').
+      ^ self modified:false.
     ].
 
-    prevSpecClass := specBeingEdited class.
-
+    prevSpecClass   := specBeingEdited class.
     specBeingEdited := (builderView generateSpecFor:currentView) first.
 
-    (specBeingEdited class ~~ prevSpecClass 
-    or:[currentSpecChannel isNil]) ifTrue:[
-        propertyList selectionIndex:nil.
-        propertyAspects := IdentityDictionary new.
-        propertySpecs := OrderedCollection new.
-        slices        := currentView specClass slices.
+    (    (specBeingEdited class == prevSpecClass)
+     and:[currentSpecChannel notNil]
+    ) ifTrue:[
+        "can keep current specifications plus current property selection
+        "
+        self reload.
+      ^ self.
+    ].
 
-        list := slices collect:[:slice|
-            propertySpecs add:(slice last).
-            slice first asString
-        ].
+    propertyList selectionIndex:nil.
+    propertyAspects := IdentityDictionary new.
+    propertySpecs   := OrderedCollection new.
+    slices          := currentView specClass slices.
 
-        list := list, (Array with:(self class titleOfLayoutMenu)).
+    list := slices collect:[:slice|
+        propertySpecs add:(slice last).
+        slice first asString
+    ].
+    list := list, (Array with:(self class titleOfLayoutMenu)).
 
-        currentSpecChannel := specBeingEdited asValue.
-        specBeingEdited class addBindingsTo:propertyAspects
-                                 for:specBeingEdited
-                             channel:currentSpecChannel.
-        propertyAspects do:[:anAspect | anAspect addDependent:self ].
-        propertyList list:list.
-        propertyList selection:userSelectedProperty.
-    ] ifFalse:[
-        currentSpecChannel value:specBeingEdited
-    ]
+    currentSpecChannel := specBeingEdited asValue.
+    specBeingEdited class addBindingsTo:propertyAspects
+                                    for:specBeingEdited
+                                channel:currentSpecChannel.
+    propertyAspects do:[:anAspect | anAspect addDependent:self ].
+    propertyList list:list.
+    propertyList selection:userSelectedProperty.
+    self modified:false.
 
 
-! !
 
-!UIPropertyView methodsFor:'change & update'!
+!
 
 modified:aState
      "change state of modification flag
@@ -625,11 +1581,12 @@
 !
 
 propertySelectionChanged
-    "called when the property selection changed
+    "property selection changed; switch to new property selection
     "
     |spec index sel|
 
     sel := propertyList selection.
+    self modified:false.
 
     (currentView isNil or:[sel isNil]) ifTrue:[
         "/ must setup for a WindowSpec for workView (to allow entry of min- maxSize etc).
@@ -643,7 +1600,7 @@
 
     index > propertySpecs size ifTrue:[                 "/ one of my specifications
         (sel == self class titleOfLayoutMenu) ifTrue:[
-            spec := self specificationLayout
+            ^ self showAndFetchLayout
         ]
     ] ifFalse:[
         spec := currentView specClass perform:(propertySpecs at:index).
@@ -652,16 +1609,20 @@
 !
 
 update:something with:aParameter from:changedObject
+    "any attribute changed its state in the current specification
+    "
     self modified:true
 ! !
 
 !UIPropertyView methodsFor:'initialization'!
 
-in:aTopView receiver:aBuilderView
+in:aTopView builder:aBuilderView
+    "setup property view in topview and that the builder view
+    "
     |menu y cancelButton applyButton panel|
 
     super initialize.
-    self initializeStaticAspects.
+    self initializeLayoutAspects.
 
     builderView := aBuilderView.
 
@@ -698,9 +1659,10 @@
     self modified:false.
 !
 
-initializeStaticAspects
-
-    staticAspects := IdentityDictionary new.
+initializeLayoutAspects
+    "initialize all layout aspects
+    "
+    layoutAspects := IdentityDictionary new.
 
     #(  bottomFraction          bottomOffset
         leftFraction            leftOffset
@@ -709,16 +1671,24 @@
         leftAlignmentFraction   topAlignmentFraction
     )
     do:[:aChannel|
-        staticAspects at:aChannel put:(ValueHolder new).
+        layoutAspects at:aChannel put:(ValueHolder new).
     ].
 
-    staticAspects do:[:anAspect | anAspect addDependent:self ].
+    layoutAspects do:[:anAspect | anAspect addDependent:self ].
 
+    layoutAspects at:#layoutType put:(
+        AspectAdaptor new
+                subject:self;
+                accessWith:#layoutType
+                assignWith:#layoutType:
+    ).
 ! !
 
 !UIPropertyView methodsFor:'private'!
 
 aspectFor:aKey
+    "returns aspect for a key
+    "
     |aspect|
 
     propertyAspects notNil ifTrue:[
@@ -728,11 +1698,11 @@
         ]
     ].
 
-    ^ staticAspects at:aKey ifAbsent:[super aspectFor:aKey]
+    ^ layoutAspects at:aKey ifAbsent:[super aspectFor:aKey]
 !
 
 showSpec:aSpec
-    "switch specification
+    "switch to specification
     "
     currentSpec ~= aSpec ifTrue:[
         propertyFrame destroySubViews.
@@ -743,196 +1713,278 @@
         ]
     ].
     currentSpec := aSpec.
-    self modified:false.
 ! !
 
 !UIPropertyView methodsFor:'private actions'!
 
 apply
+    "apply current changes and write back to current view
+    "
     modified ifTrue:[
         self modified:false.
 
         self isLayoutSpec ifFalse:[
             builderView updateFromSpec:specBeingEdited
         ] ifTrue:[
-            self layoutWrite
+            layoutType notNil ifTrue:[
+                self perform:(('write', layoutType asString) asSymbol)
+            ]
         ]
     ]
 
 !
 
 cancel
-    |view|
-
+    "cancel all changes and read back attributes from current view
+    "
     modified ifTrue:[
-        self modified:false.
+        specBeingEdited := (builderView generateSpecFor:currentView) first.
+        self reload
+    ].
+!
 
-        self isLayoutSpec ifFalse:[
-            currentView := nil.
-            self update:#selection
-        ] ifTrue:[
-            self layoutRead
+reload
+    "relaod all attributes from current specification and update values
+    "
+    |spec oldMod|
+
+    self modified:false.
+    modified := true.           "supress notifications"
+
+    currentSpecChannel notNil ifTrue:[
+        currentSpecChannel value:specBeingEdited.
+
+        self isLayoutSpec ifTrue:[
+            self showAndFetchLayout.
         ]
-    ]
-
+    ].
+    modified := false.
 
 ! !
 
 !UIPropertyView methodsFor:'private layout'!
 
-layoutRead
-    |layout extent|
-
-    layout := currentView geometryLayout.
-    layout isNil ifTrue:[^ self].
-    modified := true.                   "supress event notifications"
-
-    layout isLayout ifFalse:[
-        (layout isRectangle or:[layout isPoint]) ifTrue:[
-            (staticAspects at:#leftOffset)   value:(layout left).
-            (staticAspects at:#rightOffset)  value:(layout right).
+layoutType
+    ^ layoutType
+!
 
-            layout isRectangle ifTrue:[
-                (staticAspects at:#topOffset)    value:(layout top).
-                (staticAspects at:#bottomOffset) value:(layout bottom).
-            ].
-            modified := false.
-          ^ self
-        ]
-    ].
+layoutType:something
+    |spec|
 
-    (staticAspects at:#leftOffset)   value:(layout leftOffset).
-    (staticAspects at:#leftFraction) value:(layout leftFraction).
-    (staticAspects at:#topOffset)    value:(layout topOffset).
-    (staticAspects at:#topFraction)  value:(layout topFraction).
+    layoutType ~~ something ifTrue:[
+        layoutType := something.
 
-    layout isLayoutFrame ifTrue:[
-        (staticAspects at:#rightOffset)    value:(layout rightOffset).
-        (staticAspects at:#bottomOffset)   value:(layout bottomOffset).
-
-        (staticAspects at:#rightFraction)  value:(layout rightFraction).
-        (staticAspects at:#bottomFraction) value:(layout bottomFraction).
-
-        (staticAspects at:#leftAlignmentFraction) value:0.
-        (staticAspects at:#topAlignmentFraction)  value:0.
-    ] ifFalse:[
-        extent := currentView extent.
+        layoutType notNil ifTrue:[
+            self modified:true.
+            spec := ('specification', layoutType asString) asSymbol.
+            spec := self class perform:spec.
+        ].
+        self showSpec:spec
+    ].
+!
 
-        (staticAspects at:#rightOffset)    value:(layout leftOffset + extent x).
-        (staticAspects at:#bottomOffset)   value:(layout topOffset  + extent y).
-
-        (staticAspects at:#rightFraction)  value:0.
-        (staticAspects at:#bottomFraction) value:0.
-
-        layout isAlignmentOrigin ifTrue:[
-            (staticAspects at:#leftAlignmentFraction) value:(layout leftAlignmentFraction).
-            (staticAspects at:#topAlignmentFraction)  value:(layout topAlignmentFraction).
-        ] ifFalse:[
-            (staticAspects at:#leftAlignmentFraction) value:0.
-            (staticAspects at:#topAlignmentFraction)  value:0.
-        ]
-    ].
-    modified := false.
+layoutTypeList
+    ^ #( #LayoutFrame #AlignmentOrigin #LayoutOrigin #Point #Rectangle )
 
 !
 
-layoutWrite
-    |layout|
+selectedLayoutType
+    ^ layoutType
+!
+
+showAndFetchLayout
+    "fetch and show layout specification assigned to current view
+    "
+    |type|
 
-    currentView isNil ifTrue:[
-        ^ self
+    self modified:false.
+    modified := true.
+
+    currentView notNil ifTrue:[
+        type := builderView class layoutType:currentView.
+
+        type notNil ifTrue:[
+            layoutAspects do:[:aValue| aValue value:nil ].
+            self perform:(('fetch', type asString) asSymbol)
+        ]
     ].
-
-    (currentSpec == self class specificationLayoutFrame) ifTrue:[
-        layout := LayoutFrame new.
+    self layoutType:type.
+    modified := false.
 
-        layout     leftOffset:((staticAspects at:#leftOffset)     value) ? 0.
-        layout    rightOffset:((staticAspects at:#rightOffset)    value) ? 0.
-        layout      topOffset:((staticAspects at:#topOffset)      value) ? 0.
-        layout   bottomOffset:((staticAspects at:#bottomOffset)   value) ? 0.
-        layout   leftFraction:((staticAspects at:#leftFraction)   value) ? 0.
-        layout  rightFraction:((staticAspects at:#rightFraction)  value) ? 0.
-        layout    topFraction:((staticAspects at:#topFraction)    value) ? 0.
-        layout bottomFraction:((staticAspects at:#bottomFraction) value) ? 0.
+! !
+
+!UIPropertyView methodsFor:'private layout fetch'!
+
+fetchAlignmentOrigin
+    "fetch alignmentOrigin
+    "
+    |aLayout|
+
+    aLayout := currentView geometryLayout.
 
-        builderView setDimension:layout
-    ].
+    (layoutAspects at:#leftOffset)   value:(aLayout leftOffset).
+    (layoutAspects at:#leftFraction) value:(aLayout leftFraction).
+    (layoutAspects at:#topOffset)    value:(aLayout topOffset).
+    (layoutAspects at:#topFraction)  value:(aLayout topFraction).
+
+    (layoutAspects at:#leftAlignmentFraction) value:(aLayout leftAlignmentFraction).
+    (layoutAspects at:#topAlignmentFraction)  value:(aLayout topAlignmentFraction).
+!
+
+fetchExtent
+    |extent|
 
-    (currentSpec == self class specificationAlignmentOrigin) ifTrue:[
-        layout := AlignmentOrigin new.
+    extent := currentView extent.
+    (layoutAspects at:#leftOffset)  value:(extent x).
+    (layoutAspects at:#rightOffset) value:(extent y).
+!
+
+fetchLayoutFrame
+    "fetch layoutFrame
+    "
+    |aLayout|
 
-        layout   leftOffset:((staticAspects at:#leftOffset)   value) ? 0.
-        layout    topOffset:((staticAspects at:#topOffset)    value) ? 0.
-        layout leftFraction:((staticAspects at:#leftFraction) value) ? 0.
-        layout  topFraction:((staticAspects at:#topFraction)  value) ? 0.
+    aLayout := currentView geometryLayout.
 
-        layout leftAlignmentFraction:((staticAspects at:#leftAlignmentFraction) value) ? 0.
-        layout  topAlignmentFraction:((staticAspects at:#topAlignmentFraction)  value) ? 0.
+    (layoutAspects at:#leftOffset)     value:(aLayout leftOffset).
+    (layoutAspects at:#leftFraction)   value:(aLayout leftFraction).
+    (layoutAspects at:#topOffset)      value:(aLayout topOffset).
+    (layoutAspects at:#topFraction)    value:(aLayout topFraction).
+    (layoutAspects at:#rightOffset)    value:(aLayout rightOffset).
+    (layoutAspects at:#bottomOffset)   value:(aLayout bottomOffset).
+    (layoutAspects at:#rightFraction)  value:(aLayout rightFraction).
+    (layoutAspects at:#bottomFraction) value:(aLayout bottomFraction).
+!
 
-        ^ builderView setDimension:layout.
-    ].
+fetchLayoutOrigin
+    "fetch layoutOrigin
+    "
+    |aLayout|
 
-    (currentSpec == self class specificationLayoutOrigin) ifTrue:[
-        layout := LayoutOrigin new.
+    aLayout := currentView geometryLayout.
+
+    (layoutAspects at:#leftOffset)   value:(aLayout leftOffset).
+    (layoutAspects at:#leftFraction) value:(aLayout leftFraction).
+    (layoutAspects at:#topOffset)    value:(aLayout topOffset).
+    (layoutAspects at:#topFraction)  value:(aLayout topFraction).
+!
 
-        layout   leftOffset:((staticAspects at:#leftOffset)   value) ? 0.
-        layout    topOffset:((staticAspects at:#topOffset)    value) ? 0.
-        layout leftFraction:((staticAspects at:#leftFraction) value) ? 0.
-        layout  topFraction:((staticAspects at:#topFraction)  value) ? 0.
+fetchPoint
+    "fetch point
+    "
+    |e x y p|
 
-        builderView setDimension:layout.
-    ].
+    p := currentView geometryLayout.
+    x := p x.
+    y := p y.
+    e := currentView extent.
+
+    (layoutAspects at:#leftOffset)   value:x.
+    (layoutAspects at:#topOffset)    value:y.
+    (layoutAspects at:#rightOffset)  value:(x + e x).
+    (layoutAspects at:#bottomOffset) value:(y + e y).
 
 !
 
-showAlignmentOrigin
-    self switchLayoutSpec:(self class specificationAlignmentOrigin)
+fetchRectangle
+    "fetch rectangle
+    "
+    |aRectangle|
+
+    aRectangle := currentView geometryLayout.
+
+    (layoutAspects at:#leftOffset)   value:(aRectangle left).
+    (layoutAspects at:#rightOffset)  value:(aRectangle right).
+    (layoutAspects at:#topOffset)    value:(aRectangle top).
+    (layoutAspects at:#bottomOffset) value:(aRectangle bottom).
+! !
+
+!UIPropertyView methodsFor:'private layout write'!
+
+writeAlignmentOrigin
+    "write back as alignmentOrigin
+    "
+    |layout|
+
+    layout := AlignmentOrigin new.
+
+    layout   leftOffset:((layoutAspects at:#leftOffset)   value) ? 0.
+    layout    topOffset:((layoutAspects at:#topOffset)    value) ? 0.
+    layout leftFraction:((layoutAspects at:#leftFraction) value) ? 0.
+    layout  topFraction:((layoutAspects at:#topFraction)  value) ? 0.
+
+    layout leftAlignmentFraction:((layoutAspects at:#leftAlignmentFraction) value) ? 0.
+    layout  topAlignmentFraction:((layoutAspects at:#topAlignmentFraction)  value) ? 0.
+
+    builderView setDimension:layout.
 !
 
-showLayoutFrame
-    self switchLayoutSpec:(self class specificationLayoutFrame)
-!
+writeExtent
+    |extent|
 
-showLayoutOrigin
-    self switchLayoutSpec:(self class specificationLayoutOrigin)
+    extent := Point x:(((layoutAspects at:#leftOffset)   value) ? 0)
+                    y:(((layoutAspects at:#rightOffset)  value) ? 0).
+
+    builderView setExtent:extent
 !
 
-specificationLayout
-    "called from propertyChanged; returns specification assigned to
-     current view
+writeLayoutFrame
+    "write back as layoutFrame
     "
-    |layout spec|
+    |layout|
 
-    (currentView superView specClass basicNew isLayoutContainer) ifTrue:[
-        ^ nil
-    ].
-    layout := currentView geometryLayout.
+    layout := LayoutFrame new.
 
-    layout isLayout ifTrue:[
-        layout isLayoutFrame ifTrue:[
-            spec := self class specificationLayoutFrame
-        ] ifFalse:[
-            layout isAlignmentOrigin ifTrue:[
-                spec := self class specificationAlignmentOrigin
-            ] ifFalse:[
-                layout isLayoutOrigin ifTrue:[
-                    spec := self class specificationLayoutOrigin
-                ]
-            ]
-        ]
-    ].
+    layout     leftOffset:((layoutAspects at:#leftOffset)     value) ? 0.
+    layout    rightOffset:((layoutAspects at:#rightOffset)    value) ? 0.
+    layout      topOffset:((layoutAspects at:#topOffset)      value) ? 0.
+    layout   bottomOffset:((layoutAspects at:#bottomOffset)   value) ? 0.
+    layout   leftFraction:((layoutAspects at:#leftFraction)   value) ? 0.
+    layout  rightFraction:((layoutAspects at:#rightFraction)  value) ? 0.
+    layout    topFraction:((layoutAspects at:#topFraction)    value) ? 0.
+    layout bottomFraction:((layoutAspects at:#bottomFraction) value) ? 0.
 
-    spec notNil ifTrue:[
-        self layoutRead
-    ].
-  ^ spec
+    builderView setDimension:layout
 !
 
-switchLayoutSpec:aSpecification
-    self layoutRead.
-    self showSpec:aSpecification.
-    self modified:true.
+writeLayoutOrigin
+    "write back as layoutOrigin
+    "
+    |layout|
+
+    layout := LayoutOrigin new.
+
+    layout   leftOffset:((layoutAspects at:#leftOffset)   value) ? 0.
+    layout    topOffset:((layoutAspects at:#topOffset)    value) ? 0.
+    layout leftFraction:((layoutAspects at:#leftFraction) value) ? 0.
+    layout  topFraction:((layoutAspects at:#topFraction)  value) ? 0.
+
+    builderView setDimension:layout.
+
+!
 
+writePoint
+    "write back as point
+    "
+    |point|
+
+    point := Point x:(((layoutAspects at:#leftOffset) value) ? 0)
+                   y:(((layoutAspects at:#topOffset)  value) ? 0).
+
+    builderView setDimension:point
+!
+
+writeRectangle
+    "write back as rectangle
+    "
+    |rectangle|
+
+    rectangle := Rectangle left:(((layoutAspects at:#leftOffset)   value) ? 0)
+                            top:(((layoutAspects at:#topOffset)    value) ? 0)
+                          right:(((layoutAspects at:#rightOffset)  value) ? 0)
+                         bottom:(((layoutAspects at:#bottomOffset) value) ? 0).
+
+    builderView setDimension:rectangle
 ! !
 
 !UIPropertyView methodsFor:'private make layout'!
@@ -961,16 +2013,16 @@
 
         aBool ifTrue:[
             offset := offset + ((fraction * extent) asInteger).
-            (staticAspects at:offsetSymb) value:offset.
-            (staticAspects at:fractSymb)  value:0.
+            (layoutAspects at:offsetSymb) value:offset.
+            (layoutAspects at:fractSymb)  value:0.
         ] ifFalse:[
             fraction   := (fraction + (offset / extent)) asFloat.
 
             (fraction > 1.0) ifTrue:[ fraction := 1.0 ].
             (fraction < 0.0) ifTrue:[ fraction := 0.0 ].
 
-            (staticAspects at:offsetSymb) value:0.
-            (staticAspects at:fractSymb)  value:fraction.
+            (layoutAspects at:offsetSymb) value:0.
+            (layoutAspects at:fractSymb)  value:fraction.
         ]
     ]
 
@@ -995,6 +2047,11 @@
 
 !
 
+makeOffsetLeftTop
+    self makeOffsetLeft.
+    self makeOffsetTop.
+!
+
 makeOffsetRight
     self makeLayout:'right' xOrY:#x offset:true.
 
@@ -1023,6 +2080,11 @@
 
 !
 
+makeRelativeLeftTop
+    self makeRelativeLeft.
+    self makeRelativeTop.
+!
+
 makeRelativeRight
     self makeLayout:'right' xOrY:#x offset:false.
 
@@ -1036,7 +2098,7 @@
 !UIPropertyView methodsFor:'queries'!
 
 isLayoutSpec
-    "returns true if current menu is layout
+    "returns true if current menu is a layout specification
     "
     ^ propertyList selection == self class titleOfLayoutMenu
 ! !