diff -r d3f0d5dd53b1 -r dff48b7ca574 UILayoutTool.st --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/UILayoutTool.st Fri Jun 20 19:23:43 1997 +0200 @@ -0,0 +1,1277 @@ +" + COPYRIGHT (c) 1995 by eXept Software AG + All Rights Reserved + + This software is furnished under a license and may be used + only in accordance with the terms of that license and with the + inclusion of the above copyright notice. This software may not + be provided or otherwise made available to, or used by, any + other person. No title to or ownership of the software is + hereby transferred. +" + + + + +ApplicationModel subclass:#UILayoutTool + instanceVariableNames:'modifiedHolder aspects selection layoutView' + classVariableNames:'' + poolDictionaries:'' + category:'Interface-UIPainter' +! + +ApplicationModel subclass:#LayoutOrigin + instanceVariableNames:'' + classVariableNames:'' + poolDictionaries:'' + privateIn:UILayoutTool +! + +ApplicationModel subclass:#Rectangle + instanceVariableNames:'' + classVariableNames:'' + poolDictionaries:'' + privateIn:UILayoutTool +! + +ApplicationModel subclass:#Point + instanceVariableNames:'' + classVariableNames:'' + poolDictionaries:'' + privateIn:UILayoutTool +! + +ApplicationModel subclass:#LayoutFrame + instanceVariableNames:'' + classVariableNames:'' + poolDictionaries:'' + privateIn:UILayoutTool +! + +ApplicationModel subclass:#AlignmentOrigin + instanceVariableNames:'' + classVariableNames:'' + poolDictionaries:'' + privateIn:UILayoutTool +! + +ApplicationModel subclass:#Extent + instanceVariableNames:'' + classVariableNames:'' + poolDictionaries:'' + privateIn:UILayoutTool +! + +!UILayoutTool class methodsFor:'documentation'! + +copyright +" + COPYRIGHT (c) 1995 by eXept Software AG + All Rights Reserved + + This software is furnished under a license and may be used + only in accordance with the terms of that license and with the + inclusion of the above copyright notice. This software may not + be provided or otherwise made available to, or used by, any + other person. No title to or ownership of the software is + hereby transferred. +" + + + +! + +documentation +" + used by the UIPainter to manipulate the layout of the selected component + + [author:] + Claus Atzkern + + [see also:] + UIPainter + UIHelpTool + UISpecificationTool +" + + +! ! + +!UILayoutTool class methodsFor:'constants'! + +label + ^ 'Layout' +! ! + +!UILayoutTool class methodsFor:'interface specs'! + +slices + ^ #( + ( 'Frame' LayoutFrame) + ( 'Origin' LayoutOrigin) + ( 'Alig.Origin' AlignmentOrigin) + ( 'Point' Point) + ( 'Rectangle' Rectangle) + ( 'Extent' Extent) + ) + +! + +windowSpec + "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:UILayoutTool andSelector:#windowSpec + UILayoutTool new openInterface:#windowSpec + " + "UILayoutTool open" + + + + ^ + + #(#FullSpec + #'window:' + #(#WindowSpec + #'name:' 'uIPainterView' + #'layout:' #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0) + #'label:' 'unnamed canvas' + #'bounds:' #(#Rectangle 0 0 300 300) + ) + #'component:' + #(#SpecCollection + #'collection:' + #( + #(#NoteBookViewSpec + #'name:' 'NoteBook' + #'layout:' #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0) + #'tabable:' true + #'menu:' #noteBookList + #'enableChannel:' #enableChannel + #'style:' + #(#FontDescription + #helvetica #medium + #roman #'10' + ) + #'model:' #noteBookModel + #'tabWidget:' #Window + #'direction:' #bottom +"/ #'useIndex:' true + #'canvas:' #noteBookView + ) + ) + ) + ) +! ! + +!UILayoutTool methodsFor:'accessing'! + +layout + "returns configued layout or nil + " + |appl| + + (appl := self noteBookView application) notNil ifTrue:[ + ^ appl layout + ]. + ^ nil +! + +layoutType + "returns current layout type or nil + " + |slice| + + (slice := self selectedSlice) notNil ifTrue:[ + ^ slice last + ]. + ^ nil +! + +layoutView + "returns current edited view + " + ^ layoutView +! + +layoutView:aView + "change current edited view + " + |type name list| + + layoutView := aView. + + (type := UIPainterView layoutType:layoutView) notNil ifTrue:[ + self class slices findFirst:[:e| + e last == type ifTrue:[name := e first. true] + ]. + type == #Extent ifTrue:[ + list := Array with:name + ] ifFalse:[ + list := self class slices collect:[:e| e first ]. + list removeLast. + ]. + ]. + self noteBookList value:list. + self noteBookModel value:name. + self update. +! + +modifiedHolder:aValueHolder + "set the value holder set to true in case of modifying attributes + " + modifiedHolder notNil ifTrue:[ + modifiedHolder removeDependent:self. + ]. + + (modifiedHolder := aValueHolder) notNil ifTrue:[ + modifiedHolder addDependent:self. + ]. + +! + +update + "update from view + " + |view appl| + + selection notNil ifTrue:[ + (view := self layoutView) notNil ifTrue:[ + (appl := self noteBookView application) notNil ifTrue:[ + appl fetch:view + ] + ] + ]. + +! ! + +!UILayoutTool methodsFor:'aspects'! + +aspectFor:aKey + "returns aspect for a key or nil + " + ^ aspects at:aKey ifAbsent:[ super aspectFor:aKey ] + + +! + +noteBookList + "returns list of tab labels + " + |holder| + + (holder := builder bindingAt:#noteBookList) isNil ifTrue:[ + holder := nil asValue. + builder aspectAt:#noteBookList put:holder + ]. + ^ holder +! + +noteBookModel + "automatically generated by UIPainter ..." + + |holder| + + (holder := builder bindingAt:#noteBookModel) isNil ifTrue:[ + holder := AspectAdaptor new subject:self; forAspect:#selection. + builder aspectAt:#noteBookModel put:holder. + ]. + ^ holder +! + +noteBookView + "automatically generated by UIPainter ... + " + |holder| + + (holder := builder bindingAt:#noteBookView) isNil ifTrue:[ + holder := SubCanvas new. + builder aspectAt:#noteBookView put:holder + ]. + ^ holder +! ! + +!UILayoutTool methodsFor:'change & update'! + +update:something with:aParameter from:changedObject + "one of my models changed its value + " + changedObject ~~ modifiedHolder ifTrue:[ + modifiedHolder value ~~ true ifTrue:[ + modifiedHolder isNil ifFalse:[ + modifiedHolder value:true + ] + ] + ] + +! ! + +!UILayoutTool methodsFor:'converting absolute'! + +absolute:what xOrY:xOrY + |extent fraction offset fractSymb offsetSymb| + + extent := (self layoutView superView computeExtent) perform:xOrY. + fractSymb := (what, 'Fraction') asSymbol. + offsetSymb := (what, 'Offset') asSymbol. + fraction := (self aspectFor:fractSymb) value. + offset := (self aspectFor:offsetSymb) value. + offset := offset + ((fraction * extent) asInteger). + + (self aspectFor:offsetSymb) value:offset. + (self aspectFor:fractSymb) value:0. + + + +! + +absoluteBottom + self absolute:'bottom' xOrY:#y + +! + +absoluteLeft + self absolute:'left' xOrY:#x + +! + +absoluteRight + self absolute:'right' xOrY:#x + +! + +absoluteTop + self absolute:'top' xOrY:#y + +! ! + +!UILayoutTool methodsFor:'converting relative'! + +relative:what xOrY:xOrY + |extent fraction offset fractSymb offsetSymb| + + extent := (self layoutView superView computeExtent) perform:xOrY. + fractSymb := (what, 'Fraction') asSymbol. + offsetSymb := (what, 'Offset') asSymbol. + fraction := (self aspectFor:fractSymb) value. + offset := (self aspectFor:offsetSymb) value. + fraction := (fraction + (offset / extent)) asFloat. + + (fraction > 1.0) ifTrue:[ fraction := 1.0 ]. + (fraction < 0.0) ifTrue:[ fraction := 0 ]. + + (self aspectFor:offsetSymb) value:0. + (self aspectFor:fractSymb) value:fraction. + + + +! + +relativeBottom + self relative:'bottom' xOrY:#y + + +! + +relativeLeft + self relative:'left' xOrY:#x + +! + +relativeRight + self relative:'right' xOrY:#x + +! + +relativeTop + self relative:'top' xOrY:#y + +! ! + +!UILayoutTool methodsFor:'initialization'! + +initialize + "initialize channels + " + super initialize. + + aspects := IdentityDictionary new. + + #( bottomFraction bottomOffset + leftFraction leftOffset + topFraction topOffset + rightFraction rightOffset + leftAlignmentFraction topAlignmentFraction + ) + + do:[:aKey||holder| + holder := ValueHolder new. + holder addDependent:self. + aspects at:aKey put:holder. + ]. + + + + +! ! + +!UILayoutTool methodsFor:'selection'! + +selectedSlice + "returns slice assigned to selection or nil + " + selection notNil ifTrue:[ + self class slices do:[:aSlice| + aSlice first = selection ifTrue:[ + ^ aSlice + ] + ] + ]. + ^ nil + +! + +selection + ^ selection +! + +selection:aSelection + |appl view slice| + + selection = aSelection ifFalse:[ + (selection := aSelection) notNil ifTrue:[ + slice := self selectedSlice. + appl := slice last asString. + appl := Smalltalk classNamed:(self class name asString, '::', appl). + appl := appl new. + appl masterApplication:self. + ]. + self noteBookView client:appl + ]. + self update +! ! + +!UILayoutTool::LayoutOrigin class methodsFor:'interface specs'! + +windowSpec + "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:UILayoutTool::LayoutOrigin andSelector:#windowSpec + UILayoutTool::LayoutOrigin new openInterface:#windowSpec + " + "UILayoutTool::LayoutOrigin open" + + + + ^ + + #(#FullSpec + #'window:' + #(#WindowSpec + #'name:' 'uIPainterView' + #'layout:' #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0) + #'label:' 'unnamed' + #'bounds:' #(#Rectangle 0 0 258 93) + ) + #'component:' + #(#SpecCollection + #'collection:' + #( + #(#LabelSpec + #'name:' 'labelRelative' + #'layout:' #(#Point 57 12) + #'label:' 'relative' + ) + #(#LabelSpec + #'name:' 'labelAbsolute' + #'layout:' #(#Point 154 13) + #'label:' 'absolute' + ) + #(#LabelSpec + #'name:' 'labelLeft' + #'layout:' #(#AlignmentOrigin 52 0 44 0 1 0) + #'label:' 'left' + ) + #(#InputFieldSpec + #'name:' 'fieldLeftFraction' + #'layout:' #(#LayoutFrame 57 0 44 0 114 0 62 0) + #'tabable:' true + #'model:' #leftFraction + #'type:' #numberOrNil + ) + #(#ActionButtonSpec + #'name:' 'actionRelativeLeft' + #'layout:' #(#LayoutFrame 119 0 44 0 138 0 62 0) + #'label:' '' + #'model:' #relativeLeft + ) + #(#InputFieldSpec + #'name:' 'fieldLeftOffset' + #'layout:' #(#LayoutFrame 154 0 44 0 212 0 62 0) + #'tabable:' true + #'model:' #leftOffset + #'type:' #numberOrNil + ) + #(#ActionButtonSpec + #'name:' 'actionAbsoluteLeft' + #'layout:' #(#LayoutFrame 216 0 44 0 235 0 62 0) + #'label:' '' + #'model:' #absoluteLeft + ) + #(#LabelSpec + #'name:' 'labelTop' + #'layout:' #(#AlignmentOrigin 52 0 71 0 1 0) + #'label:' 'top' + ) + #(#InputFieldSpec + #'name:' 'fieldTopFraction' + #'layout:' #(#LayoutFrame 57 0 71 0 114 0 89 0) + #'tabable:' true + #'model:' #topFraction + #'type:' #numberOrNil + ) + #(#ActionButtonSpec + #'name:' 'actionRelativeTop' + #'layout:' #(#LayoutFrame 119 0 71 0 138 0 89 0) + #'label:' '' + #'model:' #relativeTop + ) + #(#InputFieldSpec + #'name:' 'fieldTopOffset' + #'layout:' #(#LayoutFrame 154 0 71 0 212 0 89 0) + #'tabable:' true + #'model:' #topOffset + #'type:' #numberOrNil + ) + #(#ActionButtonSpec + #'name:' 'actionAbsoluteTop' + #'layout:' #(#LayoutFrame 216 0 71 0 235 0 89 0) + #'label:' '' + #'model:' #absoluteTop + ) + ) + ) + ) +! ! + +!UILayoutTool::LayoutOrigin methodsFor:'accessing'! + +fetch:aView + "fetch layoutOrigin + " + |layout| + + layout := UIPainterView asLayoutFrameFromView:aView. + + (self aspectFor:#leftOffset) value:(layout leftOffset). + (self aspectFor:#leftFraction) value:(layout leftFraction). + (self aspectFor:#topOffset) value:(layout topOffset). + (self aspectFor:#topFraction) value:(layout topFraction). + + +! + +layout + "returns current layout as layoutOrigin + " + |layout| + + layout := Smalltalk::LayoutOrigin new. + + layout leftOffset:((self aspectFor:#leftOffset) value) ? 0. + layout topOffset:((self aspectFor:#topOffset) value) ? 0. + layout leftFraction:((self aspectFor:#leftFraction) value) ? 0. + layout topFraction:((self aspectFor:#topFraction) value) ? 0. + + ^ layout + +! ! + +!UILayoutTool::Rectangle class methodsFor:'interface specs'! + +windowSpec + "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:UILayoutTool::Rectangle andSelector:#windowSpec + UILayoutTool::Rectangle new openInterface:#windowSpec + " + "UILayoutTool::Rectangle open" + + + + ^ + + #(#FullSpec + #'window:' + #(#WindowSpec + #'name:' 'uIPainterView' + #'layout:' #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0) + #'label:' 'unnamed' + #'bounds:' #(#Rectangle 0 0 224 146) + ) + #'component:' + #(#SpecCollection + #'collection:' + #( + #(#UISubSpecification + #'name:' 'subSpecification' + #'layout:' #(#LayoutOrigin 0 0 0 0) + #'majorKey:' #'UILayoutTool::Point' + #'minorKey:' #windowSpec + ) + #(#LabelSpec + #'name:' 'labelCornerX' + #'layout:' #(#AlignmentOrigin 75 0 74 0 1 0) + #'label:' 'corner x:' + #'adjust:' #left + ) + #(#InputFieldSpec + #'name:' 'fieldCornerX' + #'layout:' #(#LayoutFrame 77 0 74 0 170 0 92 0) + #'tabable:' true + #'model:' #rightOffset + #'type:' #numberOrNil + ) + #(#LabelSpec + #'name:' 'labelCornerY' + #'layout:' #(#AlignmentOrigin 75 0 101 0 1 0) + #'label:' 'corner y:' + #'adjust:' #left + ) + #(#InputFieldSpec + #'name:' 'fieldCornerY' + #'layout:' #(#LayoutFrame 77 0 101 0 170 0 119 0) + #'tabable:' true + #'model:' #bottomOffset + #'type:' #numberOrNil + ) + ) + ) + ) +! ! + +!UILayoutTool::Rectangle methodsFor:'accessing'! + +fetch:aView + "fetch rectangle + " + |origin corner| + + origin := aView computeOrigin. + corner := aView computeCorner. + + (self aspectFor:#leftOffset) value:(origin x). + (self aspectFor:#rightOffset) value:(corner x). + (self aspectFor:#topOffset) value:(origin y). + (self aspectFor:#bottomOffset) value:(corner y). + + +! + +layout + "returns current layout as rectangle + " + ^ Smalltalk::Rectangle left:(((self aspectFor:#leftOffset) value) ? 0) + top:(((self aspectFor:#topOffset) value) ? 0) + right:(((self aspectFor:#rightOffset) value) ? 0) + bottom:(((self aspectFor:#bottomOffset) value) ? 0) + + +! ! + +!UILayoutTool::Point class methodsFor:'interface specs'! + +windowSpec + "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:UILayoutTool::Point andSelector:#windowSpec + UILayoutTool::Point new openInterface:#windowSpec + " + "UILayoutTool::Point open" + + + + ^ + + #(#FullSpec + #'window:' + #(#WindowSpec + #'name:' 'uIPainterView' + #'layout:' #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0) + #'label:' 'unnamed' + #'bounds:' #(#Rectangle 0 0 194 66) + ) + #'component:' + #(#SpecCollection + #'collection:' + #( + #(#LabelSpec + #'name:' 'labelOriginX' + #'layout:' #(#AlignmentOrigin 75 0 19 0 1 0) + #'label:' 'origin x:' + ) + #(#InputFieldSpec + #'name:' 'fieldOriginX' + #'layout:' #(#LayoutFrame 77 0 19 0 170 0 37 0) + #'tabable:' true + #'model:' #leftOffset + #'type:' #numberOrNil + ) + #(#LabelSpec + #'name:' 'labelOriginY' + #'layout:' #(#AlignmentOrigin 75 0 46 0 1 0) + #'label:' 'origin y:' + ) + #(#InputFieldSpec + #'name:' 'fieldOriginY' + #'layout:' #(#LayoutFrame 77 0 46 0 170 0 64 0) + #'tabable:' true + #'model:' #topOffset + #'type:' #numberOrNil + ) + ) + ) + ) +! ! + +!UILayoutTool::Point methodsFor:'accessing'! + +fetch:aView + "fetch point + " + |origin| + + origin := aView computeOrigin. + + (self aspectFor:#leftOffset) value:(origin x). + (self aspectFor:#topOffset) value:(origin y). + + +! + +layout + "returns current layout as point + " + ^ Smalltalk::Point x:(((self aspectFor:#leftOffset) value) ? 0) + y:(((self aspectFor:#topOffset) value) ? 0) + +! ! + +!UILayoutTool::LayoutFrame class methodsFor:'interface specs'! + +windowSpec + "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:UILayoutTool::LayoutFrame andSelector:#windowSpec + UILayoutTool::LayoutFrame new openInterface:#windowSpec + " + "UILayoutTool::LayoutFrame open" + + + + ^ + + #(#FullSpec + #'window:' + #(#WindowSpec + #'name:' 'uIPainterView' + #'layout:' #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0) + #'label:' 'unnamed' + #'bounds:' #(#Rectangle 0 0 250 193) + ) + #'component:' + #(#SpecCollection + #'collection:' + #( + #(#UISubSpecification + #'name:' 'subLayoutSpec' + #'layout:' #(#LayoutOrigin 0 0 0 0) + #'majorKey:' #'UILayoutTool::LayoutOrigin' + #'minorKey:' #windowSpec + ) + #(#LabelSpec + #'name:' 'labelRight' + #'layout:' #(#AlignmentOrigin 52 0 98 0 1 0) + #'label:' 'right' + ) + #(#InputFieldSpec + #'name:' 'fieldRightFraction' + #'layout:' #(#LayoutFrame 57 0 98 0 114 0 116 0) + #'model:' #rightFraction + #'type:' #numberOrNil + ) + #(#ActionButtonSpec + #'name:' 'actionRelativeRight' + #'layout:' #(#LayoutFrame 119 0 98 0 138 0 116 0) + #'label:' '' + #'model:' #relativeRight + ) + #(#InputFieldSpec + #'name:' 'fieldRightOffset' + #'layout:' #(#LayoutFrame 154 0 98 0 212 0 116 0) + #'model:' #rightOffset + #'type:' #numberOrNil + ) + #(#ActionButtonSpec + #'name:' 'actionAbsoluteRight' + #'layout:' #(#LayoutFrame 216 0 98 0 235 0 116 0) + #'label:' '' + #'model:' #absoluteRight + ) + #(#LabelSpec + #'name:' 'labelBottom' + #'layout:' #(#AlignmentOrigin 52 0 126 0 1 0) + #'label:' 'bottom' + ) + #(#InputFieldSpec + #'name:' 'fieldBottomFraction' + #'layout:' #(#LayoutFrame 57 0 126 0 114 0 144 0) + #'model:' #bottomFraction + #'type:' #numberOrNil + ) + #(#ActionButtonSpec + #'name:' 'actionRelativeBottom' + #'layout:' #(#LayoutFrame 119 0 126 0 138 0 144 0) + #'label:' '' + #'model:' #relativeBottom + ) + #(#InputFieldSpec + #'name:' 'fieldBottomOffset' + #'layout:' #(#LayoutFrame 154 0 126 0 211 0 144 0) + #'model:' #bottomOffset + #'type:' #numberOrNil + ) + #(#ActionButtonSpec + #'name:' 'actionAbsoluteBottom' + #'layout:' #(#LayoutFrame 216 0 126 0 235 0 144 0) + #'label:' '' + #'model:' #absoluteBottom + ) + ) + ) + ) +! ! + +!UILayoutTool::LayoutFrame methodsFor:'accessing'! + +fetch:aView + |layout| + + layout := UIPainterView asLayoutFrameFromView:aView. + + (self aspectFor:#leftOffset) value:(layout leftOffset). + (self aspectFor:#leftFraction) value:(layout leftFraction). + (self aspectFor:#topOffset) value:(layout topOffset). + (self aspectFor:#topFraction) value:(layout topFraction). + (self aspectFor:#rightOffset) value:(layout rightOffset). + (self aspectFor:#bottomOffset) value:(layout bottomOffset). + (self aspectFor:#rightFraction) value:(layout rightFraction). + (self aspectFor:#bottomFraction) value:(layout bottomFraction). + +! + +layout + "returns current layout as layoutFrame + " + |layout| + + layout := Smalltalk::LayoutFrame new. + + layout leftOffset:((self aspectFor:#leftOffset) value) ? 0. + layout rightOffset:((self aspectFor:#rightOffset) value) ? 0. + layout topOffset:((self aspectFor:#topOffset) value) ? 0. + layout bottomOffset:((self aspectFor:#bottomOffset) value) ? 0. + layout leftFraction:((self aspectFor:#leftFraction) value) ? 0. + layout rightFraction:((self aspectFor:#rightFraction) value) ? 0. + layout topFraction:((self aspectFor:#topFraction) value) ? 0. + layout bottomFraction:((self aspectFor:#bottomFraction) value) ? 0. + + ^ layout + +! ! + +!UILayoutTool::AlignmentOrigin class methodsFor:'interface specs'! + +windowSpec + "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:UILayoutTool::AlignmentOrigin andSelector:#windowSpec + UILayoutTool::AlignmentOrigin new openInterface:#windowSpec + " + "UILayoutTool::AlignmentOrigin open" + + + + ^ + + #(#FullSpec + #'window:' + #(#WindowSpec + #'name:' 'uIPainterView' + #'layout:' #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0) + #'label:' 'AlignmentOrigin' + #'bounds:' #(#Rectangle 0 0 268 205) + ) + #'component:' + #(#SpecCollection + #'collection:' + #( + #(#UISubSpecification + #'name:' 'subSpecification' + #'layout:' #(#LayoutOrigin 0 0 0 0) + #'majorKey:' #'UILayoutTool::LayoutOrigin' + #'minorKey:' #windowSpec + ) + #(#LabelSpec + #'name:' 'label5' + #'layout:' #(#AlignmentOrigin 84 0 106 0 1 0) + #'label:' 'align H' + #'adjust:' #right + ) + #(#LabelSpec + #'name:' 'label6' + #'layout:' #(#AlignmentOrigin 84 0 132 0 1 0) + #'label:' 'align V' + #'adjust:' #right + ) + #(#InputFieldSpec + #'name:' 'editField5' + #'layout:' #(#LayoutFrame 89 0 106 0 146 0 124 0) + #'tabable:' true + #'model:' #leftAlignmentFraction + #'type:' #numberOrNil + ) + #(#InputFieldSpec + #'name:' 'editField6' + #'layout:' #(#LayoutFrame 89 0 132 0 146 0 150 0) + #'tabable:' true + #'model:' #topAlignmentFraction + #'type:' #numberOrNil + ) + #(#DividerSpec + #'name:' 'separator1' + #'layout:' #(#Rectangle 175 111 224 114) + #'orientation:' #horizontal + ) + #(#DividerSpec + #'name:' 'separator2' + #'layout:' #(#Rectangle 175 143 224 146) + #'orientation:' #horizontal + ) + #(#DividerSpec + #'name:' 'separator3' + #'layout:' #(#Rectangle 171 118 174 139) + #'orientation:' #vertical + ) + #(#DividerSpec + #'name:' 'separator4' + #'layout:' #(#Rectangle 226 118 229 139) + #'orientation:' #vertical + ) + #(#ActionButtonSpec + #'name:' 'alignBottomRight' + #'layout:' #(#Rectangle 222 138 234 150) + #'label:' '' + #'model:' #alignBottomRight + ) + #(#ActionButtonSpec + #'name:' 'alignTopLeft' + #'layout:' #(#Rectangle 166 107 178 119) + #'label:' '' + #'model:' #alignTopLeft + ) + #(#ActionButtonSpec + #'name:' 'alignTopRight' + #'layout:' #(#Rectangle 222 107 234 119) + #'label:' '' + #'model:' #alignTopRight + ) + #(#ActionButtonSpec + #'name:' 'alignBottomLeft' + #'layout:' #(#Rectangle 166 137 178 149) + #'label:' '' + #'model:' #alignBottomLeft + ) + #(#ActionButtonSpec + #'name:' 'alignTopCenter' + #'layout:' #(#Rectangle 194 107 206 119) + #'label:' '' + #'model:' #alignTopCenter + ) + #(#ActionButtonSpec + #'name:' 'alignBottomCenter' + #'layout:' #(#Rectangle 194 138 206 150) + #'label:' '' + #'model:' #alignBottomCenter + ) + #(#ActionButtonSpec + #'name:' 'alignLeftCenter' + #'layout:' #(#Rectangle 166 122 178 134) + #'label:' '' + #'model:' #alignLeftCenter + ) + #(#ActionButtonSpec + #'name:' 'alignRightCenter' + #'layout:' #(#Rectangle 222 122 234 134) + #'label:' '' + #'model:' #alignRightCenter + ) + #(#ActionButtonSpec + #'name:' 'alignCenter' + #'layout:' #(#Rectangle 194 122 206 134) + #'label:' '' + #'model:' #alignCenter + ) + ) + ) + ) +! ! + +!UILayoutTool::AlignmentOrigin methodsFor:'accessing'! + +fetch:aView + "fetch alignmentOrigin + " + |layout type extent| + + type := UIPainterView layoutType:aView. + layout := aView geometryLayout. + + layout isLayout ifTrue:[ + (self aspectFor:#leftOffset) value:(layout leftOffset). + (self aspectFor:#leftFraction) value:(layout leftFraction). + (self aspectFor:#topOffset) value:(layout topOffset). + (self aspectFor:#topFraction) value:(layout topFraction). + + type == #AlignmentOrigin ifTrue:[ + (self aspectFor:#leftAlignmentFraction) value:(layout leftAlignmentFraction). + (self aspectFor:#topAlignmentFraction) value:(layout topAlignmentFraction). + ^ self + ] + ] ifFalse:[ + layout := aView computeOrigin. + + (self aspectFor:#leftOffset) value:(layout x). + (self aspectFor:#leftFraction) value:0. + (self aspectFor:#topOffset) value:(layout y). + (self aspectFor:#topFraction) value:0. + ]. + (self aspectFor:#leftAlignmentFraction) value:0. + (self aspectFor:#topAlignmentFraction) value:0. + + +! + +layout + "returns current layout as alignmentOrigin + " + |layout| + + layout := Smalltalk::AlignmentOrigin new. + + layout leftOffset:((self aspectFor:#leftOffset) value) ? 0. + layout topOffset:((self aspectFor:#topOffset) value) ? 0. + layout leftFraction:((self aspectFor:#leftFraction) value) ? 0. + layout topFraction:((self aspectFor:#topFraction) value) ? 0. + + layout leftAlignmentFraction:((self aspectFor:#leftAlignmentFraction) value) ? 0. + layout topAlignmentFraction:((self aspectFor:#topAlignmentFraction) value) ? 0. + + ^ layout +! ! + +!UILayoutTool::AlignmentOrigin methodsFor:'alignment'! + +alignBottomCenter + self makeAlignLeft:0.5 top:1 + + +! + +alignBottomLeft + self makeAlignLeft:0 top:1 + + +! + +alignBottomRight + self makeAlignLeft:1 top:1 + + +! + +alignCenter + self makeAlignLeft:0.5 top:0.5 + + +! + +alignLeftCenter + self makeAlignLeft:0 top:0.5 + + +! + +alignRightCenter + self makeAlignLeft:1 top:0.5 + + +! + +alignTopCenter + self makeAlignLeft:0.5 top:0 + + +! + +alignTopLeft + self makeAlignLeft:0 top:0 + + +! + +alignTopRight + self makeAlignLeft:1 top:0 + + +! + +makeAlignLeft:leftAlignmentFraction top:topAlignmentFraction + |lAF tAF lO tO ext| + + lAF := (self aspectFor:#leftAlignmentFraction) value ? 0. + tAF := (self aspectFor:#topAlignmentFraction) value ? 0. + ext := (self aspectFor:#layoutView) computeExtent. + + (self aspectFor:#leftAlignmentFraction) value:leftAlignmentFraction. + (self aspectFor:#topAlignmentFraction) value:topAlignmentFraction. + + lO := (self aspectFor:#leftOffset) value ? 0. + tO := (self aspectFor:#topOffset) value ? 0. + + lO := lO + (ext x * (leftAlignmentFraction - lAF)). + tO := tO + (ext y * (topAlignmentFraction - tAF)). + + (self aspectFor:#leftOffset) value:(lO rounded). + (self aspectFor:#topOffset) value:(tO rounded). + +! + +makeAlignTopRight + self makeAlignLeft:1 top:0 + + +! ! + +!UILayoutTool::Extent class methodsFor:'interface specs'! + +windowSpec + "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:UILayoutTool::Extent andSelector:#windowSpec + UILayoutTool::Extent new openInterface:#windowSpec + " + "UILayoutTool::Extent open" + + + + ^ + + #(#FullSpec + #'window:' + #(#WindowSpec + #'name:' 'uIPainterView' + #'layout:' #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0) + #'label:' 'unnamed' + #'bounds:' #(#Rectangle 0 0 226 86) + ) + #'component:' + #(#SpecCollection + #'collection:' + #( + #(#LabelSpec + #'name:' 'labelHorizontal' + #'layout:' #(#AlignmentOrigin 73 0 25 0 1 0) + #'label:' 'horizontal:' + #'adjust:' #left + ) + #(#InputFieldSpec + #'name:' 'fieldLeftOffset' + #'layout:' #(#LayoutFrame 78 0 25 0 171 0 43 0) + #'tabable:' true + #'model:' #leftOffset + #'type:' #numberOrNil + ) + #(#LabelSpec + #'name:' 'labelVertical' + #'layout:' #(#AlignmentOrigin 73 0 52 0 1 0) + #'label:' 'vertical:' + #'adjust:' #left + ) + #(#InputFieldSpec + #'name:' 'fieldRightOffset' + #'layout:' #(#LayoutFrame 78 0 52 0 171 0 70 0) + #'tabable:' true + #'model:' #rightOffset + #'type:' #numberOrNil + ) + ) + ) + ) +! ! + +!UILayoutTool::Extent methodsFor:'accessing'! + +fetch:aView + "fetch extent + " + |extent| + + extent := aView computeExtent. + + (self aspectFor:#leftOffset) value:(extent x). + (self aspectFor:#rightOffset) value:(extent y). + + +! + +layout + "returns current extent + " + ^ Smalltalk::Point x:(((self aspectFor:#leftOffset) value) ? 0) + y:(((self aspectFor:#rightOffset) value) ? 0) + +! ! + +!UILayoutTool class methodsFor:'documentation'! + +version + ^ '$Header$' +! !