[squeak-dev] Bug (feature?) in SystemWindow>>addAllMorphs:aCollection

Hannes Hirzel hannes.hirzel at gmail.com
Fri Nov 5 16:22:30 UTC 2010


Yes it should have a test --- maybe you have a look at the method below   ;-)

pretty complicated, could need some comment and refactoring.

I wonder what this is all needed for....


HJH

Morph>>
privateAddAllMorphs: aCollection atIndex: index
	"Private. Add aCollection of morphs to the receiver"
	| myWorld otherSubmorphs |
	myWorld := self world.
	otherSubmorphs := submorphs copyWithoutAll: aCollection.
	(index between: 0 and: otherSubmorphs size)
		ifFalse: [^ self error: 'index out of range'].
	index = 0
		ifTrue:[	submorphs := aCollection asArray, otherSubmorphs]
		ifFalse:[	index = otherSubmorphs size
			ifTrue:[	submorphs := otherSubmorphs, aCollection]
			ifFalse:[	submorphs := otherSubmorphs copyReplaceFrom: index + 1
to: index with: aCollection ]].
	aCollection do: [:m | | itsOwner itsWorld |
		itsOwner := m owner.
		itsOwner ifNotNil: [
			itsWorld := m world.
			(itsWorld == myWorld) ifFalse: [
				itsWorld ifNotNil: [self privateInvalidateMorph: m].
				m outOfWorld: itsWorld].
			(itsOwner ~~ self) ifTrue: [
				m owner privateRemove: m.
				m owner removedMorph: m ]].
		m privateOwner: self.
		myWorld ifNotNil: [self privateInvalidateMorph: m].
		(myWorld == itsWorld) ifFalse: [m intoWorld: myWorld].
		itsOwner == self ifFalse: [
			self addedMorph: m.
			m noteNewOwner: self ].
	].
	self layoutChanged.

On 11/5/10, Lawson English <lenglish5 at cox.net> wrote:
> Thanks. I know there are many different ways of doing what I was trying
> to do. I was just pointing out  a simple mistake that was hanging the
> system. Passing a nil value in a message should never cause a complete
> lockup, IMHO.
> Lawson
>
>> Hello Lawson
>>
>> Please try this....
>>
>> | myWindow m1 |
>>
>> myWindow := SystemWindow labelled: 'test'.
>> myWindow model: Model new.
>> "A system window needs a model"
>>
>> 1 to: 10 do: [ :i | m1 := EllipseMorph new..
>> 			myWindow addMorph: m1 frame: (0 at 0 corner: (i/10) @1).
>> 			
>> 			"system windows are made for tools,
>> 			 and they try to maintain a color scheme.
>> 			 SystemWindows nowadays set the color of added morphs to white.
>>                     But when you alter the color after adding it, it
>> stays.
>> 			So we do the color now..."
>>
>> 			m1 color: Color random].
>>
>> myWindow openInWorld.
>>
>>
>> Does this help?
>>
>>
>> Hannes
>>
>>
>> On 11/5/10, Lawson English<lenglish5 at cox.net>  wrote:
>>> OK, don't do this at home, but even so, this shouldn't permanently
>>> disable the system...
>>> Using Squeak 4.1 + Seaside 3.0:
>>>
>>>
>>> myWindow := (SystemWindow labelled: 'test') openInWorld.
>>>
>>> myArray := Array new: 10.
>>>
>>> "add zero or more morphs to myArray, but less than myArray size"
>>> myWindow addAllMorphs: myArray.
>>>
>>> "squeak stops working..."
>>>
>>>
>>> Lawson
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>
>
>



More information about the Squeak-dev mailing list