Layout
Last updated at 12:51 pm UTC on 17 January 2006
Layouting usually occurs when the size or position of a Morph is changed, althought there are other possible reasons. As this happens in the event processing stage of a UI cycle, the Morphs are only marked to be relayouted in the layout stage. This is done via Morph@layoutChanged.
Morph@layoutChanged
- fullBounds is set to nil to mark Morph for layouting
- is sent to mark the owner, too.
Then, in the drawing stage, WorldState@displayWorld:submorphs: calls fullBounds to each submorph.
fullBounds "CODE STRIPPED!!!"
"Return the bounding box of the receiver and all its children. Recompute the layout if necessary."
fullBounds ifNotNil:[^fullBounds].
self doLayoutIn: self layoutBounds
^fullBounds
As you can see, if the layout wasn't changed, fullBounds is not nil, so nothing happens. If it was nil,
doLayoutIn: is sent to self.
doLayoutIn: layoutBounds "CODE STRIPPED!!!"
"Compute a new layout based on the given layout bounds."
| layout box priorBounds |
submorphs do: [:m | m ownerChanged].
layout := self layoutPolicy.
layout layout: self in: layoutBound].
fullBounds := self privateFullBounds.