diff -r 5af567f52811 -r 668eb9eae2ac UIObjectView.st --- a/UIObjectView.st Fri Feb 21 20:33:18 1997 +0100 +++ b/UIObjectView.st Fri Feb 21 20:33:57 1997 +0100 @@ -133,12 +133,6 @@ !UIObjectView methodsFor:'event handling'! -doKeyInput:key - ^ self - - -! - elementChanged:aView "some element has been changed - kludge to force a resizing operation (for child layout recomputation) in its superView" @@ -163,29 +157,23 @@ "handle an expose event from device; redraw selection " super exposeX:x y:y width:w height:h. - - selection notNil ifTrue:[ - self selectionDo:[:v | self showSelected:v] - ] + self selectionDo:[:v | self showSelected:v] ! keyPress:key x:x y:y + key == #InspectIt ifTrue:[ ^ self inspectSelection ]. - (key == #Delete or:[key == #BackSpace]) ifTrue: [ - selection notNil ifTrue:[ - self deleteSelection - ] - ] ifFalse:[ - keyPressAction notNil ifTrue:[ - keyPressAction value:key - ] - ] + (key == #Cut or:[key == #Delete or:[key == #BackSpace]]) ifTrue: [ + ^ self deleteSelection + ]. + + super keyPress:key x:x y:y ! @@ -291,7 +279,7 @@ shiftPressAction := [:pressPoint | self startSelectMoreOrMove:pressPoint]. motionAction := [:movePoint | nil]. releaseAction := [nil]. - keyPressAction := [:key | self doKeyInput:key]. + keyPressAction := nil. self cursor:Cursor normal. @@ -414,10 +402,7 @@ " |widget object start frame delta| - createClass isNil ifTrue:[ - ^ self setDefaultActions - ]. - (selection isKindOf:Collection) ifTrue:[ + (createClass isNil or:[self numberOfSelections > 1]) ifTrue:[ self unselect. ^ self setDefaultActions. ]. @@ -425,15 +410,16 @@ motionAction := [:movePoint| self doDragCreate:movePoint]. releaseAction := [ self endCreate]. - selection notNil ifTrue:[ - ( (self isPoint:aPoint containedIn:selection) - and:[self supportsSubComponents:selection] - ) ifFalse:[ - self unselect - ] + widget := self singleSelection. + + ( widget notNil + and:[(self isPoint:aPoint containedIn:widget) + and:[self supportsSubComponents:widget]] + ) ifFalse:[ + self unselect. + widget := self. ]. - widget := selection ? self. object := createClass new. widget addSubView:object. @@ -503,7 +489,7 @@ dY := delta y. undoHistory disabledTransitionDo:[ - self shifLayout:anObject top:dY bottom:dY left:dX right:dX + self shiftLayout:anObject top:dY bottom:dY left:dX right:dX ] ] @@ -513,10 +499,10 @@ self startObjectMove:selection at:aPoint. - selection size == 0 ifTrue:[ + selection isCollection ifTrue:[ + movedObject := selection + ] ifFalse:[ movedObject := Array with:selection - ] ifFalse:[ - movedObject := selection ]. super unselect. @@ -524,12 +510,10 @@ aPoint - aView computeOrigin ]. - selection := movedObject. - self transaction:#move selectionDo:[:aView| + self transaction:#move objects:movedObject do:[:aView| self invertOutlineOf:aView. self undoBlockPositionChanged:aView ]. - selection := nil ! @@ -557,13 +541,15 @@ testMode ifTrue:[^ self]. - "if there is one selection and point hits handle, start a resize + "if there is one object selected and point hits a handle, start a resize " - self singleSelection notNil ifTrue:[ - b := self whichHandleOf:selection isHitBy:aPoint. + anObject := self singleSelection. + + anObject notNil ifTrue:[ + b := self whichHandleOf:anObject isHitBy:aPoint. (b notNil and:[b ~~ #view]) ifTrue:[ - ^ self startResizeBorder:b of:selection. + ^ self startResizeBorder:b of:anObject. ] ]. @@ -580,7 +566,7 @@ self select:anObject. ]. - selection isCollection ifTrue:[ + (self numberOfSelections ~~ 1) ifTrue:[ releaseAction := [ self setDefaultActions. self select:anObject @@ -654,6 +640,11 @@ |object| object := self singleSelection. + + (object geometryLayout) isNil ifTrue:[ + ^ self setDefaultActions. + ]. + self actionResize:object selector:b. self transaction:#extent selectionDo:[:aView| @@ -785,17 +776,17 @@ resize:aView bottom:aPoint undoHistory disabledTransitionDo:[ - self shifLayout:aView top:0 bottom:((aPoint y) - (aView computeCorner y)) + self shiftLayout:aView top:0 bottom:((aPoint y) - (aView computeCorner y)) ] ! resize:aView bottomLeft:aPoint undoHistory disabledTransitionDo:[ - self shifLayout:aView top:0 - bottom:((aPoint y) - (aView computeCorner y)) - left:((aPoint x) - (aView computeOrigin x)) - right:0 + self shiftLayout:aView top:0 + bottom:((aPoint y) - (aView computeCorner y)) + left:((aPoint x) - (aView computeOrigin x)) + right:0 ] @@ -808,14 +799,14 @@ delta := aPoint - aView computeCorner. undoHistory disabledTransitionDo:[ - self shifLayout:aView top:0 bottom:(delta y) left:0 right:(delta x) + self shiftLayout:aView top:0 bottom:(delta y) left:0 right:(delta x) ] ! resize:aView left:aPoint undoHistory disabledTransitionDo:[ - self shifLayout:aView left:((aPoint x) - (aView computeOrigin x)) right:0 + self shiftLayout:aView left:((aPoint x) - (aView computeOrigin x)) right:0 ] ! @@ -826,7 +817,7 @@ delta := aPoint - aView computeOrigin. undoHistory disabledTransitionDo:[ - self shifLayout:aView top:(delta y) bottom:0 left:(delta x) right:0 + self shiftLayout:aView top:(delta y) bottom:0 left:(delta x) right:0 ] ! @@ -834,24 +825,24 @@ resize:aView right:aPoint undoHistory disabledTransitionDo:[ - self shifLayout:aView left:0 right:((aPoint x) - (aView computeCorner x)) + self shiftLayout:aView left:0 right:((aPoint x) - (aView computeCorner x)) ] ! resize:aView top:aPoint undoHistory disabledTransitionDo:[ - self shifLayout:aView top:((aPoint y) - (aView computeOrigin y)) bottom:0 + self shiftLayout:aView top:((aPoint y) - (aView computeOrigin y)) bottom:0 ] ! resize:aView topRight:aPoint undoHistory disabledTransitionDo:[ - self shifLayout:aView top:((aPoint y) - (aView computeOrigin y)) - bottom:0 - left:0 - right:((aPoint x) - (aView computeCorner x)) + self shiftLayout:aView top:((aPoint y) - (aView computeOrigin y)) + bottom:0 + left:0 + right:((aPoint x) - (aView computeCorner x)) ] @@ -859,43 +850,51 @@ !UIObjectView methodsFor:'private shift-layout'! -shifLayout:aView left:l right:r +shiftLayout:aView left:l right:r "shift layout for a view; in case of an open transaction, the undo action is registered " - self shifLayout:aView top:0 bottom:0 left:l right:r + self shiftLayout:aView top:0 bottom:0 left:l right:r ! -shifLayout:aView top:t bottom:b +shiftLayout:aView top:t bottom:b "shift layout for a view; in case of an open transaction, the undo action is registered " - self shifLayout:aView top:t bottom:b left:0 right:0 + self shiftLayout:aView top:t bottom:b left:0 right:0 ! -shifLayout:aView top:t bottom:b left:l right:r +shiftLayout:aView top:t bottom:b left:l right:r "shift layout for a view; in case of an open transaction, the undo action is registered " |layout| - self undoBlockPositionChanged:aView. - layout := aView geometryLayout. - layout leftOffset:(layout leftOffset + l) - topOffset:(layout topOffset + t). - - layout isLayoutFrame ifTrue:[ - layout bottomOffset:(layout bottomOffset + b). - layout rightOffset:(layout rightOffset + r). - ]. - - aView geometryLayout:layout. - + layout isLayout ifTrue:[ + self undoBlockPositionChanged:aView. + + layout leftOffset:(layout leftOffset + l) + topOffset:(layout topOffset + t). + + layout isLayoutFrame ifTrue:[ + layout bottomOffset:(layout bottomOffset + b). + layout rightOffset:(layout rightOffset + r). + ]. + aView geometryLayout:layout. + ] ifFalse:[ + |pixelOrigin| + + self undoBlockPositionChanged:aView. + + pixelOrigin := aView pixelOrigin. + pixelOrigin := pixelOrigin + (l@t). + aView pixelOrigin:pixelOrigin + ] ! ! @@ -930,12 +929,18 @@ isPoint:aPoint containedIn:aView "checks whether a point is covered by a view. " - |org ext| - - org := aView computeOrigin. - ext := aView computeExtent. - - ^ ((org extent:ext) containsPoint:aPoint) + |p| + + p := device translatePoint:aPoint from:inputView id to:aView id. + + (p x >= 0 and:[p y >= 0]) ifTrue:[ + p := aView extent - p. + + (p x >= 0 and:[p y >= 0]) ifTrue:[ + ^ true + ] + ]. + ^ false ! whichBorderOf:aView isHitBy:aPoint @@ -966,7 +971,7 @@ !UIObjectView methodsFor:'selections'! addToSelection:something - (testMode or:[something == selection]) ifFalse:[ + (self canSelect:something) ifTrue:[ super addToSelection:something. self changed:#selection. ] @@ -978,6 +983,17 @@ ] ! +numberOfSelections + "return the number of selected entries" + + |sz| + + selection isNil ifTrue:[^ 0]. + + selection isCollection ifTrue:[^ selection size] + ifFalse:[^ 1 ] +! + removeFromSelection:something super removeFromSelection:something. self changed:#selection @@ -985,7 +1001,7 @@ ! select:something - (testMode or:[something == selection]) ifFalse:[ + (self canSelect:something) ifTrue:[ super select:something. self changed:#selection ] @@ -998,21 +1014,6 @@ ! -selectionFindMinimum:aOneArgBlock - "returns the minimum value from the block evaluated on each view - in the selection - " - |min val| - - self selectionDo:[:aView| - val := aOneArgBlock value:aView. - - min isNil ifTrue:[min := val] - ifFalse:[min := min min:val] - ]. - ^ min -! - selectionHiddenDo:aBlock "apply block to every object in selection" @@ -1031,14 +1032,18 @@ singleSelection "returns single selection or nil " - (selection isKindOf:SimpleView) ifTrue:[^ selection] - ifFalse:[^ nil] + selection isCollection ifFalse:[ + ^ selection + ]. + selection size == 1 ifTrue:[ ^ selection at:1] + ifFalse:[ ^ nil]. ! singleSelectionDo:aBlock - - self singleSelection notNil ifTrue:[ - aBlock value:selection + |view| + + (view := self singleSelection) notNil ifTrue:[ + aBlock value:view ] ! @@ -1077,6 +1082,33 @@ ! +canPaste:something + "returns true if something could be paste + " + something notNil ifTrue:[ + something isCollection ifTrue:[ + something notEmpty ifTrue:[ + ^ (something at:1) isKindOf:UISpecification + ] + ] ifFalse:[ + ^ something isKindOf:UISpecification + ] + ]. + ^ false + +! + +canSelect:something + ^ (testMode not and:[something ~~ selection]) + +! + +hasUndos + "returns true if undoHistory not empty + " + ^ undoHistory notEmpty +! + isHorizontalResizable:aComponent ^ self subclassResponsibility @@ -1150,11 +1182,22 @@ |layout| layout := aView geometryLayout copy. - undoHistory addUndoBlock:[aView geometryLayout:layout] + layout isNil ifFalse:[ + undoHistory addUndoBlock:[aView geometryLayout:layout] + ] ifTrue:[ + layout := aView pixelOrigin. + undoHistory addUndoBlock:[aView pixelOrigin:layout] + ] ] ! +undoDeleteAll + "delete total undo history + " + undoHistory reinitialize +! + undoLast self undoLast:1 ! @@ -1171,10 +1214,15 @@ !UIObjectView methodsFor:'user actions - dimension'! copyExtent - (selection isNil or:[selection isKindOf:Collection]) ifTrue:[ - ^ self warn:'exactly one element must be selected'. - ]. - copiedExtent := selection computeExtent + |object| + + object := self singleSelection. + + object notNil ifTrue:[ + copiedExtent := object computeExtent + ] ifFalse:[ + self warn:'exactly one element must be selected'. + ] @@ -1264,51 +1312,122 @@ !UIObjectView methodsFor:'user actions - move'! -basicMoveSelectionHorizontal:n - "move left: n < 0 - move right: n > 0 - " +moveSelectionDown:aNumber + |gridY| + + gridAlign notNil ifTrue:[ + gridY := gridAlign y. + ]. + self selectionHiddenDo:[ - self transaction:#move selectionDo:[:v| self shifLayout:v left:n right:n]. + self transaction:#move selectionDo:[:aView| + |n d| + + n := aNumber. + + aligning ifTrue:[ + d := ((aView computeCorner y) \\ gridY). + n := n * gridY. + + d ~~ 0 ifTrue:[ + n := n - d + 1. + ] + ]. + self shiftLayout:aView top:n bottom:n + ]. self changed:#layout ] ! -basicMoveSelectionVertical:n - "move up: n < 0 - move down: n > 0 +moveSelectionLeft:aNumber + "move selection left " + |gridX| + + gridAlign notNil ifTrue:[ + gridX := gridAlign x. + ]. + self selectionHiddenDo:[ - self transaction:#move selectionDo:[:v| self shifLayout:v top:n bottom:n ]. + self transaction:#move selectionDo:[:aView| + |n d| + + n := aNumber. + + aligning ifTrue:[ + d := ((aView computeOrigin x) \\ gridX). + d ~~ 0 ifTrue:[ + n := n-1. + ]. + n := (n * gridX) + d. + ]. + n := n negated. + self shiftLayout:aView left:n right:n + + ]. self changed:#layout ] - - - -! - -moveSelectionDown:n - self basicMoveSelectionVertical:n - - ! -moveSelectionLeft:n - self basicMoveSelectionHorizontal:(n negated) - - +moveSelectionRight:aNumber + "move selection right + " + |gridX| + + gridAlign notNil ifTrue:[ + gridX := gridAlign x. + ]. + + self selectionHiddenDo:[ + self transaction:#move selectionDo:[:aView| + |n d| + + n := aNumber. + + aligning ifTrue:[ + d := ((aView computeCorner x) \\ gridX). + n := n * gridX. + + d ~~ 0 ifTrue:[ + n := n - d + 1. + ] + ]. + self shiftLayout:aView left:n right:n + + ]. + self changed:#layout + ] ! -moveSelectionRight:n - self basicMoveSelectionHorizontal:n - - -! - -moveSelectionUp:n - self basicMoveSelectionVertical:(n negated) +moveSelectionUp:aNumber + "move selection up + " + |gridY| + + gridAlign notNil ifTrue:[ + gridY := gridAlign y. + ]. + + self selectionHiddenDo:[ + self transaction:#move selectionDo:[:aView| + |n d| + + n := aNumber. + + aligning ifTrue:[ + d := ((aView computeOrigin x) \\ gridY). + d ~~ 0 ifTrue:[ + n := n-1. + ]. + n := (n * gridY) + d. + ]. + n := n negated. + self shiftLayout:aView top:n bottom:n + ]. + self changed:#layout + ] ! ! @@ -1316,15 +1435,32 @@ !UIObjectView methodsFor:'user actions - position'! alignSelectionBottom - |bmost delta| - - self selectionHiddenDo:[ - bmost := 0. - self selectionDo:[:v| bmost := bmost max:(v computeCorner y)]. - - self transaction:#align selectionDo:[:v| - (delta := bmost - (v computeCorner y)) ~~ 0 ifTrue:[ - self shifLayout:v top:delta bottom:delta. + |bmost delta layout| + + selection notNil ifTrue:[ + self selectionHiddenDo:[ + self numberOfSelections > 1 ifTrue:[ + bmost := (selection at:1) computeCorner y. + + self transaction:#align selectionDo:[:v| + (delta := bmost - (v computeCorner y)) ~~ 0 ifTrue:[ + self shiftLayout:v top:delta bottom:delta. + ] + ] + ] ifFalse:[ + layout := selection geometryLayout. + + (layout isLayout and:[layout isLayoutFrame]) ifFalse:[ + ^ self + ]. + + self transaction:#layout selectionDo:[:aView| + self undoBlockDimensionChanged:aView. + layout := aView geometryLayout. + layout bottomOffset:0. + layout bottomFraction:1.0. + aView geometryLayout:layout. + ] ] ]. self changed:#layout @@ -1335,28 +1471,32 @@ ! alignSelectionCenterHor - |counter centerX| - - self selectionHiddenDo:[ - counter := 0. - centerX := 0. - - self selectionDo:[:v | - centerX := centerX + (v computeCorner x + v computeOrigin x). - counter := counter + 1. - ]. - centerX := centerX // (counter * 2). - - self transaction:#align selectionDo:[:v| - |newX oldX delta| - - oldX := v computeOrigin x. - newX := centerX - ((v computeCorner x - oldX) // 2). - delta := newX - oldX. - - self shifLayout:v left:delta right:delta - ]. - self changed:#layout + |view center| + + selection notNil ifTrue:[ + self selectionHiddenDo:[ + view := self singleSelection. + + view notNil ifTrue:[ + view := view superView. + center := view computeExtent + ] ifFalse:[ + view := selection at:1. + center := view computeCorner + view computeOrigin. + ]. + center := center x // 2. + + self transaction:#align selectionDo:[:v| + |newX oldX delta| + + oldX := v computeOrigin x. + newX := center - ((v computeCorner x - oldX) // 2). + delta := newX - oldX. + + self shiftLayout:v left:delta right:delta + ]. + self changed:#layout + ] ] @@ -1364,89 +1504,157 @@ ! alignSelectionCenterVer - |counter centerY| - - self selectionHiddenDo:[ - counter := 0. - centerY := 0. - - self selectionDo:[:v | - centerY := centerY + (v computeCorner y + v computeOrigin y). - counter := counter + 1. - ]. - centerY := centerY // (counter * 2). - - self transaction:#align selectionDo:[:v| - |newY oldY delta| - - oldY := v computeOrigin y. - newY := centerY - ((v computeCorner y - oldY) // 2). - delta := newY - oldY. - - self shifLayout:v top:delta bottom:delta - ]. - self changed:#layout + |view center| + + selection notNil ifTrue:[ + self selectionHiddenDo:[ + view := self singleSelection. + + view notNil ifTrue:[ + view := view superView. + center := view computeExtent + ] ifFalse:[ + view := selection at:1. + center := view computeCorner + view computeOrigin. + ]. + center := center y // 2. + + self transaction:#align selectionDo:[:v| + |newY oldY delta| + + oldY := v computeOrigin y. + newY := center - ((v computeCorner y - oldY) // 2). + delta := newY - oldY. + + self shiftLayout:v top:delta bottom:delta + ]. + self changed:#layout + ] ] ! alignSelectionLeft - |lmost delta| - - self selectionHiddenDo:[ - lmost := self selectionFindMinimum:[:v| v computeOrigin x]. - - self transaction:#align selectionDo:[:v| - (delta := lmost - (v computeOrigin x)) ~~ 0 ifTrue:[ - self shifLayout:v left:delta right:delta + |lmost delta layout| + + selection notNil ifTrue:[ + self selectionHiddenDo:[ + self numberOfSelections > 1 ifTrue:[ + lmost := (selection at:1) computeOrigin x. + + self transaction:#align selectionDo:[:v| + (delta := lmost - (v computeOrigin x)) ~~ 0 ifTrue:[ + self shiftLayout:v left:delta right:delta + ] + ] + ] ifFalse:[ + self transaction:#layout selectionDo:[:aView| + layout := aView geometryLayout. + + layout isLayout ifTrue:[ + self undoBlockDimensionChanged:aView. + layout leftOffset:0. + layout leftFraction:0.0. + aView geometryLayout:layout. + ] + ] ] ]. self changed:#layout ] - ! alignSelectionLeftAndRight - |lmost rmost| - - self selectionHiddenDo:[ - lmost := self selectionFindMinimum:[:v| v computeOrigin x]. - rmost := 0. - self selectionDo:[:v | rmost := rmost max:(v computeCorner x)]. - - self transaction:#align selectionDo:[:v| - self shifLayout:v left:(lmost - (v computeOrigin x)) - right:(rmost - (v computeCorner x)) + |lmost rmost layout| + + selection notNil ifTrue:[ + self selectionHiddenDo:[ + self numberOfSelections > 1 ifTrue:[ + lmost := (selection at:1) computeOrigin x. + rmost := (selection at:1) computeCorner x. + + self transaction:#align selectionDo:[:v| + self shiftLayout:v left:(lmost - (v computeOrigin x)) + right:(rmost - (v computeCorner x)) + ] + ] ifFalse:[ + self transaction:#layout selectionDo:[:aView| + layout := aView geometryLayout. + + layout isLayout ifTrue:[ + self undoBlockDimensionChanged:aView. + layout leftOffset:0. + layout leftFraction:0.0. + + (layout isLayout and:[layout isLayoutFrame]) ifTrue:[ + layout rightOffset:0. + layout rightFraction:1.0. + ]. + aView geometryLayout:layout. + ] + ] + ] ]. self changed:#layout ] ! alignSelectionRight - |rmost delta| - - self selectionHiddenDo:[ - rmost := 0. - self selectionDo:[:v| rmost := rmost max:(v computeCorner x)]. - - self transaction:#align selectionDo:[:v| - (delta := rmost - (v computeCorner x)) ~~ 0 ifTrue:[ - self shifLayout:v left:delta right:delta + |rmost delta layout| + + selection notNil ifTrue:[ + self selectionHiddenDo:[ + self numberOfSelections > 1 ifTrue:[ + rmost := (selection at:1) computeCorner x. + + self transaction:#align selectionDo:[:v| + (delta := rmost - (v computeCorner x)) ~~ 0 ifTrue:[ + self shiftLayout:v left:delta right:delta + ] + ] + ] ifFalse:[ + layout := selection geometryLayout. + + (layout isLayout and:[layout isLayoutFrame]) ifFalse:[ + ^ self + ]. + + self transaction:#layout selectionDo:[:aView| + self undoBlockDimensionChanged:aView. + layout := aView geometryLayout. + layout rightOffset:0. + layout rightFraction:1.0. + aView geometryLayout:layout. + ] ] ]. self changed:#layout ] - ! alignSelectionTop - |tmost delta| - - self selectionHiddenDo:[ - tmost := self selectionFindMinimum:[:v| v computeOrigin y]. - - self transaction:#align selectionDo:[:v| - (delta := tmost - (v computeOrigin y)) ~~ 0 ifTrue:[ - self shifLayout:v top:delta bottom:delta + |tmost delta layout| + + selection notNil ifTrue:[ + self selectionHiddenDo:[ + self numberOfSelections > 1 ifTrue:[ + tmost := (selection at:1) computeOrigin y. + + self transaction:#align selectionDo:[:v| + (delta := tmost - (v computeOrigin y)) ~~ 0 ifTrue:[ + self shiftLayout:v top:delta bottom:delta + ] + ] + ] ifFalse:[ + self transaction:#layout selectionDo:[:aView| + layout := aView geometryLayout. + + layout isLayout ifTrue:[ + self undoBlockDimensionChanged:aView. + layout topOffset:0. + layout topFraction:0.0. + aView geometryLayout:layout. + ] + ] ] ]. self changed:#layout @@ -1455,16 +1663,35 @@ ! alignSelectionTopAndBottom - |tmost bmost| - - self selectionHiddenDo:[ - tmost := self selectionFindMinimum:[:v| v computeOrigin y]. - bmost := 0. - self selectionDo:[:v| bmost := bmost max:(v computeCorner y)]. - - self transaction:#align selectionDo:[:v| - self shifLayout:v top:(tmost - (v computeOrigin y)) - bottom:(bmost - (v computeCorner y)) + |tmost bmost layout| + + selection notNil ifTrue:[ + self selectionHiddenDo:[ + self numberOfSelections > 1 ifTrue:[ + tmost := (selection at:1) computeOrigin y. + bmost := (selection at:1) computeCorner y. + + self transaction:#align selectionDo:[:v| + self shiftLayout:v top:(tmost - (v computeOrigin y)) + bottom:(bmost - (v computeCorner y)) + ] + ] ifFalse:[ + self transaction:#layout selectionDo:[:aView| + layout := aView geometryLayout. + + layout isLayout ifTrue:[ + self undoBlockDimensionChanged:aView. + layout topOffset:0. + layout topFraction:0.0. + + (layout isLayout and:[layout isLayoutFrame]) ifTrue:[ + layout bottomOffset:0. + layout bottomFraction:1.0. + ]. + aView geometryLayout:layout. + ] + ] + ] ]. self changed:#layout ] @@ -1504,9 +1731,9 @@ self transaction:#center selectionDo:[:v| orientation == #y ifTrue:[ - self shifLayout:v top:delta bottom:delta + self shiftLayout:v top:delta bottom:delta ] ifFalse:[ - self shifLayout:v left:delta right:delta + self shiftLayout:v left:delta right:delta ] ]. self changed:#layout @@ -1533,7 +1760,9 @@ spreadSelectionHor |sumWidths min max viewsInOrder topsInOrder count space| - (selection isKindOf:Collection) ifFalse:[^ self]. + (self numberOfSelections > 1) ifFalse:[ + ^ self + ]. self selectionHiddenDo:[ count := 0. @@ -1559,7 +1788,7 @@ |delta| delta := min - aView computeOrigin x. - self shifLayout:aView left:delta right:delta. + self shiftLayout:aView left:delta right:delta. min := min + aView computeExtent x + space ]. self changed:#layout @@ -1570,7 +1799,9 @@ spreadSelectionVer |sumHeights min max viewsInOrder topsInOrder count space| - (selection isKindOf:Collection) ifFalse:[^ self]. + (self numberOfSelections > 1) ifFalse:[ + ^ self + ]. self selectionHiddenDo:[ count := 0. @@ -1596,7 +1827,7 @@ |delta| delta := min - aView computeOrigin y. - self shifLayout:aView top:delta bottom:delta. + self shiftLayout:aView top:delta bottom:delta. min := min + aView height + space ]. self changed:#layout