[etoys-dev] Etoys Inbox: Etoys-Richo.32.mcz

commits at source.squeak.org commits at source.squeak.org
Thu Aug 12 19:52:11 EDT 2010


A new version of Etoys was added to project Etoys Inbox:
http://source.squeak.org/etoysinbox/Etoys-Richo.32.mcz

==================== Summary ====================

Name: Etoys-Richo.32
Author: Richo
Time: 12 August 2010, 8:51:25 pm
UUID: c3e2424b-e613-3343-bb47-a3471d44a19c
Ancestors: Etoys-Richo.31

* Added SpeechBubbles to Etoys package.
* As Bert suggested I removed useless Player subclasses and put this behavior in Player.

=============== Diff against Etoys-Richo.31 ===============

Item was added:
+ ----- Method: SpeechBubbleMorph classSide>>morph:type: (in category 'instance creation') -----
+ morph: aMorph type: aSymbol 
+ ^(self basicNew setMorph: aMorph type: aSymbol) initialize!

Item was added:
+ ----- Method: SpeechBubbleMorph>>step (in category 'stepping') -----
+ step
+ (target isNil or: [lastHash = (lastHash := target boundsSignatureHash)])
+ 		ifTrue: [self incrementStepTime]
+ 		ifFalse: [stepTime := self minimumStepTime].
+ 
+ target notNil ifTrue: [
+ target isInWorld ifFalse: [^self delete].
+ self positionMyselfAccordingToTarget].
+ 
+ "This will keep the correct extent if the graphic changed"
+ self msgMorph notNil ifTrue: [
+ (self balloon fullBounds containsRect: self msgMorph fullBounds)
+ 	ifFalse: [self extent: 1 at 1]]
+ !

Item was added:
+ ----- Method: SpeechBubbleMorph>>balloon (in category 'accessing') -----
+ balloon
+ 	^balloon ifNil: [
+ 		| balloonForm |
+ 		balloonForm := Form extent: self extent - (0 @ self tailHeight) depth: 16.
+ 		self drawBalloonOn: balloonForm getCanvas in: balloonForm boundingBox.
+ 		balloonForm floodFill: self color at: balloonForm center.
+ 		balloon := (SketchMorph withForm: balloonForm).
+ 	]!

Item was added:
+ ----- Method: Morph>>sayObject: (in category '*Etoys-speech bubbles') -----
+ sayObject: aPlayer
+ self showObject: aPlayer inBubbleType: #speech!

Item was added:
+ ----- Method: SpeechBubbleMorph classSide>>topLeftCornerForm (in category 'forms') -----
+ topLeftCornerForm
+ "
+ topLeftCornerForm := nil
+ (SketchMorph withForm: topLeftCornerForm) openInHand
+ "
+ ^topLeftCornerForm ifNil: [topLeftCornerForm := (Form
+ 	extent: 25 at 25
+ 	depth: 16
+ 	fromArray: #( 0 0 0 0 0 0 0 1 65537 65537 65537 65537 65536 0 0 0 0 0 1 65537 65537 65537 65537 65537 65537 65536 0 0 0 0 1 65537 65537 65537 2147450879 2147450879 2147450879 2147450879 2147418112 0 0 0 1 65537 65537 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147418112 0 0 0 65537 65537 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147418112 0 0 1 65537 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147418112 0 0 65537 98303 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147418112 0 0 65537 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147418112 0 1 65537 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147418112 0 1 98303 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147418112 0 65537 98303 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147418112 0 65537 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147418112 1 65537 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147418112 1 98303 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147418112 1 98303 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147418112 1 98303 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147418112 65537 98303 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147418112 65537 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147418112 65537 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147418112 65537 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147418112 65537 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147418112 65537 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147418112 65537 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147418112 65537 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147418112 65537 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147418112)
+ 	offset: 0 at 0)]!

Item was added:
+ ----- Method: Morph>>thinkObject: (in category '*Etoys-speech bubbles') -----
+ thinkObject: aPlayer
+ self showObject: aPlayer inBubbleType: #thought!

Item was added:
+ ----- Method: SpeechBubbleMorph>>minimumAcceptedHeight (in category 'accessing') -----
+ minimumAcceptedHeight
+ ^100 max: self msgMorph fullBounds height + 20 + self tailHeight!

Item was added:
+ ----- Method: SpeechBubbleMorph>>minimumAcceptedWidth (in category 'accessing') -----
+ minimumAcceptedWidth
+ ^ 175 max: self msgMorph fullBounds width + 20!

Item was added:
+ ----- Method: SpeechBubbleMorph>>target: (in category 'accessing') -----
+ target: aMorph
+ 	target := aMorph.
+ 	target notNil ifTrue: [self positionMyselfAccordingToTarget ]!

Item was added:
+ ----- Method: Player>>sayGraphic: (in category 'speech bubbles') -----
+ sayGraphic: aGraphic
+ self costume renderedMorph sayGraphic: aGraphic!

Item was added:
+ ----- Method: SpeechBubbleMorph>>stepTime (in category 'stepping') -----
+ stepTime
+ ^stepTime !

Item was added:
+ ----- Method: SpeechBubbleMorph>>refreshMsgMorph (in category 'refreshing') -----
+ refreshMsgMorph
+ 	self msgMorph owner = self ifFalse: [^self delete].
+ 	self positionMsgMorph.
+ 	self addMorph: self msgMorph!

Item was added:
+ ----- Method: SpeechBubbleMorph classSide>>bottomRightCornerForm (in category 'forms') -----
+ bottomRightCornerForm
+ ^(self topLeftCornerForm flipBy: #horizontal centerAt: self topLeftCornerForm boundingBox leftCenter) flipBy: #vertical centerAt: self topLeftCornerForm boundingBox topCenter!

Item was added:
+ ----- Method: SpeechBubbleMorph>>tail (in category 'accessing') -----
+ tail
+ ^tail ifNil: [
+ 	| tailForm |
+ 	tailForm := self selectedTailForm deepCopy.
+ 	
+ 	"This will paint both forms correctly"
+ 	tailForm floodFill: self color at: tailForm center + (6 at -15).
+ 
+ 	"In the #thought case, we also need to paint the little bubbles"
+ 	type = #thought ifTrue: [
+ 		tailForm floodFill: self color at: tailForm center + (-7 at 7);
+ 				floodFill: self color at: tailForm center + (-22 at 20)
+ 	].
+ 
+ 	tail := SketchMorph withForm: tailForm]!

Item was added:
+ ----- Method: SpeechBubbleMorph classSide>>string:type: (in category 'instance creation') -----
+ string: aString type: aSymbol
+ "self string: 'Hello world!!' type: #speech"
+ | text instance |
+ text := (UserText new contents: aString) centered.
+ text width > 300 ifTrue: [text contents: aString wrappedTo: 300].
+ text on: #keyStroke send: #keyStroke:morph: to: (instance := self basicNew).
+ ^(instance setMorph: text type: aSymbol) initialize!

Item was added:
+ ----- Method: SpeechBubbleMorph classSide>>string:type:for: (in category 'instance creation') -----
+ string: aString type: aSymbol for: aMorph
+ "self string: 'Hello world!!' type: #speech for: Morph new openInHand"
+ ^(self string: aString type: aSymbol) target: aMorph!

Item was added:
+ ----- Method: SpeechBubbleMorph>>defaultColor (in category 'accessing') -----
+ defaultColor
+ 	^Color white!

Item was added:
+ ----- Method: Morph>>bubble (in category '*Etoys-speech bubbles') -----
+ bubble
+ 	^self valueOfProperty: #bubble ifAbsent: [nil].!

Item was added:
+ ----- Method: Morph>>stopSayingOrThinking (in category '*Etoys-speech bubbles') -----
+ stopSayingOrThinking
+ | currentBubble |
+ currentBubble := self bubble.
+ currentBubble isNil ifTrue: [^self].
+ currentBubble delete!

Item was added:
+ ----- Method: SpeechBubbleMorph>>positionMsgMorph (in category 'initialize-release') -----
+ positionMsgMorph
+ | diff |
+ diff := self msgMorph center - self msgMorph fullBounds center.
+ self msgMorph center: self center - (0 @ self tailHeight / 2) + diff.!

Item was added:
+ ----- Method: SpeechBubbleMorph>>form (in category 'accessing') -----
+ form
+ ^(msgMorph isKindOf: SketchMorph) ifTrue: [msgMorph form]!

Item was added:
+ ----- Method: SpeechBubbleMorph classSide>>speechGraphicPrototype (in category 'parts bin') -----
+ speechGraphicPrototype
+ 	^self form: (ScriptingSystem formAtKey: 'Painting') type: #speech!

Item was added:
+ ----- Method: Morph>>think: (in category '*Etoys-speech bubbles') -----
+ think: aString
+ self showMessage: aString inBubbleType: #thought!

Item was added:
+ ----- Method: SpeechBubbleMorph classSide>>morph:type:for: (in category 'instance creation') -----
+ morph: aMorph type: aSymbol for: targetMorph
+ ^(self morph: aMorph type: aSymbol) target: targetMorph!

Item was added:
+ ----- Method: SpeechBubbleMorph classSide>>bottomLeftCornerForm (in category 'forms') -----
+ bottomLeftCornerForm
+ ^self topLeftCornerForm flipBy: #vertical centerAt: self topLeftCornerForm boundingBox topCenter!

Item was added:
+ ----- Method: SpeechBubbleMorph>>positionTail (in category 'initialize-release') -----
+ positionTail
+ self tail position: self bottomCenter - (0 @ self tailHeight + 2)!

Item was added:
+ ----- Method: SpeechBubbleMorph>>drawOn: (in category 'drawing') -----
+ drawOn: aCanvas!

Item was added:
+ ----- Method: SpeechBubbleMorph>>maximumStepTime (in category 'stepping') -----
+ maximumStepTime
+ 	^500!

Item was added:
+ ----- Method: SpeechBubbleMorph>>positionBalloon (in category 'initialize-release') -----
+ positionBalloon
+ self balloon position: self position!

Item was added:
+ ----- Method: SpeechBubbleMorph classSide>>thoughtPrototype (in category 'parts bin') -----
+ thoughtPrototype
+ 	^self string: 'Hello world!!' type: #thought!

Item was added:
+ ----- Method: SpeechBubbleMorph classSide>>form:type:for: (in category 'instance creation') -----
+ form: aForm type: aSymbol for: aMorph
+ ^(self form: aForm type: aSymbol) target: aMorph!

Item was added:
+ ----- Method: SpeechBubbleMorph classSide>>thinkingForm (in category 'forms') -----
+ thinkingForm
+ "
+ thinkingForm := nil
+ thinkingForm
+ "
+ ^thinkingForm ifNil: [thinkingForm := (Form
+ 	extent: 56 at 49
+ 	depth: 16
+ 	fromArray: #( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 65537 65537 65537 65536 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 65537 65537 65537 65537 65537 65537 65536 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 65537 65537 65537 2147450879 2147450879 2147450879 65537 65537 65537 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 65537 98303 2147450879 2147450879 2147450879 2147450879 2147450879 65537 65537 65536 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 65537 98303 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147418113 65537 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 65537 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 65537 65536 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 65537 98303 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147418113 65537 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 65537 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 65537 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 65537 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 65537 65536 0 0 0 0 0 0 0 0 0 0 0 0 0 1 65537 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147418113 65536 0 0 0 0 0 0 0 0 0 0 0 0 0 1 98303 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147418113 65536 0 0 0 0 0 0 0 0 0 0 0 0 0 65537 98303 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147418113 65537 0 0 0 0 0 0 0 0 0 0 0 0 0 65537 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 65537 0 0 0 0 0 0 0 0 0 0 0 0 0 65537 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 65537 0 0 0 0 0 0 0 0 0 0 0 0 0 65537 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 65537 0 0 0 0 0 0 0 0 0 0 0 0 0 65537 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 65537 0 0 0 0 0 0 0 0 0 0 0 0 0 65537 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 65537 0 0 0 0 0 0 0 0 0 0 0 0 0 65537 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 65537 0 0 0 0 0 0 0 0 0 0 0 0 0 65537 98303 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147418113 65537 0 0 0 0 0 0 0 0 0 0 0 0 0 1 98303 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147418113 65536 0 0 0 0 0 0 0 0 0 0 0 0 0 1 98303 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 65537 65536 0 0 0 0 0 0 0 0 0 0 0 0 0 1 65537 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 65537 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 65537 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 65537 0 0 0 0 0 0 0 0 0 0 65537 65537 65537 0 0 65537 98303 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147418113 65537 0 0 0 0 0 0 0 0 1 65537 65537 65537 65537 65537 0 1 65537 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 65537 65536 0 0 0 0 0 0 0 0 65537 65537 98303 2147450879 2147418113 65537 65537 0 65537 98303 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147418113 65537 0 0 0 0 0 0 0 0 0 65537 2147450879 2147450879 2147450879 2147450879 2147418113 65537 65536 1 65537 65537 2147450879 2147450879 2147450879 2147450879 2147450879 2147418113 65537 65536 0 0 0 0 0 0 0 0 1 65537 2147450879 2147450879 2147450879 2147450879 2147450879 2147418113 65536 0 65537 65537 65537 2147450879 2147450879 2147450879 65537 65537 65537 0 0 0 0 0 0 0 0 0 1 98303 2147450879 2147450879 2147450879 2147450879 2147450879 2147418113 65536 0 0 1 65537 65537 65537 65537 65537 65537 0 0 0 0 0 0 0 0 0 0 65537 98303 2147450879 2147450879 2147450879 2147450879 2147450879 2147418113 65537 0 0 0 1 65537 65537 65537 65536 0 0 0 0 0 0 0 0 0 0 0 65537 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 65537 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 65537 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 65537 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 65537 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 65537 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 65537 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 65537 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 65537 98303 2147450879 2147450879 2147450879 2147450879 2147450879 2147418113 65537 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 98303 2147450879 2147450879 2147450879 2147450879 2147450879 2147418113 65536 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 98303 2147450879 2147450879 2147450879 2147450879 2147450879 65537 65536 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 65537 65537 65536 0 1 65537 98303 2147450879 2147450879 2147450879 2147450879 65537 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 65537 65537 65537 65537 65536 0 65537 65537 98303 2147450879 2147418113 65537 65537 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 65537 2147450879 2147450879 65537 65536 0 0 65537 65537 65537 65537 65537 65536 0 0 0 0 0 0 0 0 0 0 0 0 0 0 65537 98303 2147450879 2147450879 2147418113 65537 0 0 0 65537 65537 65537 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 65537 2147450879 2147450879 2147450879 2147450879 65537 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 65537 2147450879 2147450879 2147450879 2147450879 65537 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 65537 2147450879 2147450879 2147450879 2147450879 65537 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 65537 2147450879 2147450879 2147450879 2147450879 65537 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 65537 98303 2147450879 2147450879 2147418113 65537 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 65537 2147450879 2147450879 65537 65536 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 65537 65537 65537 65537 65536 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 65537 65537 65536 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0)
+ 	offset: 0 at 0)]!

Item was added:
+ ----- Method: SpeechBubbleMorph>>string (in category 'accessing') -----
+ string
+ ^(msgMorph isKindOf: UserText) ifTrue: [msgMorph contents]!

Item was added:
+ ----- Method: Player>>getBubble (in category 'speech bubbles') -----
+ getBubble
+ ^[self costume renderedMorph bubble assuredPlayer] on: Error do: [self presenter standardPlayer]!

Item was added:
+ ----- Method: Morph>>showMessage:inBubbleType: (in category '*Etoys-speech bubbles') -----
+ showMessage: aString inBubbleType: typeSymbol
+ | currentBubble |
+ currentBubble := self bubble.
+ currentBubble notNil ifTrue: [
+ 	(currentBubble string = aString and: [currentBubble type = typeSymbol and: [currentBubble isInWorld]]) ifTrue: [^self].
+ 	currentBubble delete].
+ aString isEmpty ifTrue: [^self removeProperty: #bubble].
+ self setProperty: #bubble toValue: (SpeechBubbleMorph string: aString type: typeSymbol for: self)!

Item was added:
+ ----- Method: SpeechBubbleMorph classSide>>new (in category 'instance creation') -----
+ new
+ 	^self string: 'Hello world!!'!

Item was added:
+ ----- Method: SpeechBubbleMorph>>positionMyselfAccordingToTarget (in category 'stepping') -----
+ positionMyselfAccordingToTarget
+ 	| newCenter newOwner |
+ 	"Modify mi position"
+ 	newCenter := target topRendererOrSelf center - (0 @ ((target topRendererOrSelf height + self height) / 2)).
+ 	self privatePosition: newCenter - (self extent // 2).
+ 	"Don't forget to check if my owner is still the right one. Maybe the morph was inside a Playfield and the user grabed it and put it in the World"
+ 	newOwner := target ownerThatIsA: PasteUpMorph.
+ 	self owner ~= newOwner ifTrue: [newOwner addMorph: self]!

Item was added:
+ ----- Method: SpeechBubbleMorph>>containsPoint: (in category 'testing') -----
+ containsPoint: aPoint
+ ^ (self bounds containsPoint: aPoint) and:
+ 	  [(self imageForm isTransparentAt: aPoint - bounds origin) not]
+ !

Item was added:
+ ----- Method: Player>>thinkGraphic: (in category 'speech bubbles') -----
+ thinkGraphic: aGraphic
+ self costume renderedMorph thinkGraphic: aGraphic!

Item was added:
+ ----- Method: Player>>sayNumber: (in category 'speech bubbles') -----
+ sayNumber: aNumber
+ self costume renderedMorph say: aNumber asString!

Item was added:
+ ----- Method: Player>>sayText: (in category 'speech bubbles') -----
+ sayText: aString
+ self costume renderedMorph say: aString!

Item was added:
+ ----- Method: Morph>>sayGraphic: (in category '*Etoys-speech bubbles') -----
+ sayGraphic: aForm
+ self showGraphic: aForm inBubbleType: #speech!

Item was added:
+ ----- Method: Player>>thinkNumber: (in category 'speech bubbles') -----
+ thinkNumber: aNumber
+ self costume renderedMorph think: aNumber asString!

Item was added:
+ ----- Method: SpeechBubbleMorph classSide>>thoughtGraphicPrototype (in category 'parts bin') -----
+ thoughtGraphicPrototype
+ 	^self form: (ScriptingSystem formAtKey: 'Painting') type: #thought!

Item was added:
+ ----- Method: Player>>thinkText: (in category 'speech bubbles') -----
+ thinkText: aString
+ self costume renderedMorph think: aString!

Item was added:
+ ----- Method: SpeechBubbleMorph>>setMorph:type: (in category 'private') -----
+ setMorph: aMorph type: aSymbol
+ 	msgMorph := aMorph.
+ 	type := aSymbol!

Item was added:
+ ----- Method: Player>>getAttachment (in category 'speech bubbles') -----
+ getAttachment
+ 	^ [(self sendMessageToCostume: #target) assuredPlayer]
+ 		on: Error
+ 		do: [self presenter standardPlayer] !

Item was added:
+ ----- Method: SpeechBubbleMorph>>incrementStepTime (in category 'stepping') -----
+ incrementStepTime
+ 	stepTime := (stepTime + 1) min: self maximumStepTime!

Item was added:
+ ----- Method: SpeechBubbleMorph classSide>>topRightCornerForm (in category 'forms') -----
+ topRightCornerForm
+ ^self topLeftCornerForm flipBy: #horizontal centerAt:  self topLeftCornerForm boundingBox leftCenter!

Item was added:
+ ----- Method: SpeechBubbleMorph classSide>>supplementaryPartsDescriptions (in category 'parts bin') -----
+ supplementaryPartsDescriptions
+ 	"Answer a list of DescriptionForPartsBin objects that characterize objects that this class wishes to contribute to Stationery bins *other* than by the standard default #newStandAlone protocol"
+ 
+ 	^ {
+ 	DescriptionForPartsBin
+ 		formalName: 'Speech bubble' translatedNoop
+ 		categoryList: #(#GSoC)
+ 		documentation: '' translatedNoop
+ 		globalReceiverSymbol: #SpeechBubbleMorph
+ 		nativitySelector: #speechPrototype.
+ 
+ 	DescriptionForPartsBin
+ 		formalName: 'Thought bubble' translatedNoop
+ 		categoryList: #(#GSoC)
+ 		documentation: '' translatedNoop
+ 		globalReceiverSymbol: #SpeechBubbleMorph
+ 		nativitySelector: #thoughtPrototype.
+ 
+ 	DescriptionForPartsBin
+ 		formalName: 'Speech bubble (graphic)' translatedNoop
+ 		categoryList: #(#GSoC)
+ 		documentation: '' translatedNoop
+ 		globalReceiverSymbol: #SpeechBubbleMorph
+ 		nativitySelector: #speechGraphicPrototype.
+ 
+ 	DescriptionForPartsBin
+ 		formalName: 'Thought bubble (graphic)' translatedNoop
+ 		categoryList: #(#GSoC)
+ 		documentation: '' translatedNoop
+ 		globalReceiverSymbol: #SpeechBubbleMorph
+ 		nativitySelector: #thoughtGraphicPrototype.
+ }
+ !

Item was added:
+ ----- Method: SpeechBubbleMorph classSide>>speakingForm (in category 'forms') -----
+ speakingForm
+ "
+ speakingForm := nil
+ "
+ ^speakingForm ifNil: [speakingForm := (Form
+ 	extent: 56 at 51
+ 	depth: 16
+ 	fromArray: #( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 65537 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147418113 65537 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 65537 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 65537 65536 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 98303 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147418113 65537 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 65537 98303 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 65537 65536 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 65537 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147418113 65537 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 65537 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 65537 65536 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 65537 98303 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 65537 65537 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 65537 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147418113 65537 65536 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 65537 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 65537 65536 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 65537 98303 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147418113 65537 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 65537 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 65537 65536 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 65537 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147418113 65537 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 98303 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 65537 65536 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 65537 98303 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147418113 65537 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 65537 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 65537 65536 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 98303 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147418113 65537 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 65537 98303 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 65537 65536 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 65537 2147450879 2147450879 2147450879 2147450879 2147450879 2147450879 2147418113 65537 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 65537 2147450879 2147450879 2147450879 2147450879 2147450879 2147418113 65537 65536 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 65537 98303 2147450879 2147450879 2147450879 2147450879 2147450879 65537 65537 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 65537 2147450879 2147450879 2147450879 2147450879 2147450879 2147418113 65537 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 65537 2147450879 2147450879 2147450879 2147450879 2147450879 65537 65536 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 65537 98303 2147450879 2147450879 2147450879 2147450879 2147418113 65537 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 65537 2147450879 2147450879 2147450879 2147450879 2147450879 65537 65536 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 65537 2147450879 2147450879 2147450879 2147450879 2147418113 65537 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 98303 2147450879 2147450879 2147450879 2147450879 65537 65536 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 65537 98303 2147450879 2147450879 2147450879 2147418113 65537 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 65537 2147450879 2147450879 2147450879 2147450879 65537 65536 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 98303 2147450879 2147450879 2147450879 2147418113 65537 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 65537 98303 2147450879 2147450879 2147450879 65537 65536 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 65537 2147450879 2147450879 2147450879 2147418113 65537 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 98303 2147450879 2147450879 2147418113 65537 65536 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 65537 98303 2147450879 2147450879 65537 65537 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 65537 2147450879 2147450879 2147418113 65537 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 65537 2147450879 2147450879 65537 65536 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 65537 98303 2147450879 2147418113 65537 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 65537 2147450879 2147450879 65537 65536 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 65537 2147450879 2147418113 65537 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 98303 2147450879 65537 65536 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 65537 98303 2147418113 65537 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 65537 2147450879 65537 65536 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 98303 2147418113 65537 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 65537 98303 65537 65536 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 65537 65537 65537 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 65537 65537 65536 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 65537 65537 65536 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 65537 65537 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 65537 65536 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 65537 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 65537 65536 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 65537 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0)
+ 	offset: 0 at 0)]!

Item was added:
+ ----- Method: SpeechBubbleMorph>>position: (in category 'accessing') -----
+ position: aPoint
+ target notNil ifTrue: [^self positionMyselfAccordingToTarget ].
+ super position: aPoint.!

Item was added:
+ ----- Method: SpeechBubbleMorph>>target (in category 'accessing') -----
+ target
+ 	^target!

Item was added:
+ ----- Method: Morph>>say: (in category '*Etoys-speech bubbles') -----
+ say: aString
+ self showMessage: aString inBubbleType: #speech!

Item was added:
+ ----- Method: SpeechBubbleMorph>>color: (in category 'accessing') -----
+ color: aColor
+ 	super color: aColor.
+ 	self refresh!

Item was added:
+ ----- Method: SpeechBubbleMorph classSide>>string: (in category 'instance creation') -----
+ string: aString 
+ ^self string: aString type: #speech!

Item was changed:
  SystemOrganization addCategory: #'EToys-Kedama'!
  SystemOrganization addCategory: #'Etoys-Buttons'!
  SystemOrganization addCategory: #'Etoys-CustomEvents'!
  SystemOrganization addCategory: #'Etoys-Experimental'!
  SystemOrganization addCategory: #'Etoys-Help'!
  SystemOrganization addCategory: #'Etoys-Outliner'!
  SystemOrganization addCategory: #'Etoys-Protocols'!
  SystemOrganization addCategory: #'Etoys-Protocols-Type Vocabularies'!
  SystemOrganization addCategory: #'Etoys-Scratch'!
  SystemOrganization addCategory: #'Etoys-Scripting'!
  SystemOrganization addCategory: #'Etoys-Scripting Support'!
  SystemOrganization addCategory: #'Etoys-Scripting Tiles'!
  SystemOrganization addCategory: #'Etoys-Stacks'!
  SystemOrganization addCategory: #'Etoys-StarSqueak'!
  SystemOrganization addCategory: #'Etoys-Tile Scriptors'!
  SystemOrganization addCategory: #'Etoys-Widgets'!
+ SystemOrganization addCategory: #'Etoys-SpeechBubbles'!

Item was added:
+ ----- Method: SpeechBubbleMorph>>drawBalloonOn:in: (in category 'drawing') -----
+ drawBalloonOn: aCanvas in: sourceRect
+ | cornerBounds rect1 rect2 |
+ cornerBounds := self class topLeftCornerForm boundingBox.
+ aCanvas translucentImage: self class topLeftCornerForm at: sourceRect topLeft;
+ 		translucentImage: self class topRightCornerForm at: sourceRect topRight - (cornerBounds width @ 0);
+ 		translucentImage: self class bottomLeftCornerForm at: sourceRect bottomLeft - (0 @ (cornerBounds height));
+ 		translucentImage: self class bottomRightCornerForm at: sourceRect bottomRight - cornerBounds extent.
+ 
+ rect1 := sourceRect topLeft + (cornerBounds width @ 1) corner: sourceRect bottomRight - (cornerBounds width @ 1).
+ rect2 := sourceRect topLeft + (1 @ cornerBounds height) corner: sourceRect bottomRight - (1 @ cornerBounds height).
+ aCanvas fillRectangle: rect1 color: Color white; fillRectangle: rect2 color: Color white.
+ aCanvas line: rect1 topLeft to: rect1 topRight width: 2 color: Color black;
+ 		line: rect1 bottomLeft to: rect1 bottomRight width: 2 color: Color black;
+ 		line: rect2 topLeft to: rect2 bottomLeft width: 2 color: Color black;
+ 		line: rect2 topRight to: rect2 bottomRight width: 2 color: Color black.
+ !

Item was added:
+ ----- Method: Player>>sayObject: (in category 'speech bubbles') -----
+ sayObject: aPlayer
+ self costume renderedMorph sayObject: aPlayer!

Item was added:
+ ----- Method: SpeechBubbleMorph>>delete (in category 'initialize-release') -----
+ delete
+ 	super delete.
+ 	target := msgMorph := type := nil.
+ !

Item was added:
+ ----- Method: SpeechBubbleMorph>>minimumStepTime (in category 'stepping') -----
+ minimumStepTime
+ 	^20!

Item was added:
+ ----- Method: Player>>thinkObject: (in category 'speech bubbles') -----
+ thinkObject: aPlayer
+ self costume renderedMorph thinkObject: aPlayer!

Item was added:
+ ----- Method: SpeechBubbleMorph>>refresh (in category 'refreshing') -----
+ refresh
+ self refreshBalloon; refreshTail; refreshMsgMorph!

Item was added:
+ ----- Method: Player>>stopAttaching (in category 'speech bubbles') -----
+ stopAttaching
+ 	self sendMessageToCostume: #target: with: nil!

Item was added:
+ ----- Method: SpeechBubbleMorph>>msgMorph (in category 'accessing') -----
+ msgMorph
+ ^msgMorph isNil ifTrue: [nil] ifFalse: [msgMorph topRendererOrSelf]!

Item was added:
+ ----- Method: SpeechBubbleMorph>>refreshTail (in category 'refreshing') -----
+ refreshTail
+ 	tail ifNotNil: [tail delete].
+ 	tail := nil.
+ 	self positionTail.
+ 	self addMorph: tail!

Item was added:
+ ----- Method: Morph>>showObject:inBubbleType: (in category '*Etoys-speech bubbles') -----
+ showObject: aPlayer inBubbleType: typeSymbol
+ | currentBubble morph |
+ morph := aPlayer costume renderedMorph.
+ currentBubble := self bubble.
+ currentBubble notNil ifTrue: [
+ 	(currentBubble msgMorph = morph and: [currentBubble type = typeSymbol and: [currentBubble isInWorld]]) ifTrue: [^self].
+ 	currentBubble delete].
+ self setProperty: #bubble toValue: (SpeechBubbleMorph morph: morph  type: typeSymbol for: self).!

Item was added:
+ ----- Method: SpeechBubbleMorph>>privatePosition: (in category 'private') -----
+ privatePosition: aPoint
+ "Always changes the position, regardless of the target"
+ super position: aPoint!

Item was added:
+ ----- Method: Player>>stopSayingOrThinking (in category 'speech bubbles') -----
+ stopSayingOrThinking
+ self costume renderedMorph stopSayingOrThinking!

Item was added:
+ ----- Method: SpeechBubbleMorph>>tailHeight (in category 'accessing') -----
+ tailHeight
+ ^self tail height!

Item was added:
+ ----- Method: SpeechBubbleMorph classSide>>additionsToViewerCategoryBubble (in category 'viewer categories') -----
+ additionsToViewerCategoryBubble
+ 	"Answer viewer additions for the 'bubble' category"
+ 
+ 	^#(
+ 		bubble 
+ 		(
+ 			(command attachTo: '' Player)
+ 			(command stopAttaching '')
+ 			(slot attachment '' Player readOnly Player getAttachment Player unused)		
+ 		)
+ 	)
+ !

Item was added:
+ ----- Method: SpeechBubbleMorph>>selectedTailForm (in category 'accessing') -----
+ selectedTailForm
+ 	^type caseOf: {
+ 		[#speech] -> [self class speakingForm].
+ 		[#thought] -> [self class thinkingForm].
+ 		} otherwise: [self error: 'Wrong type']!

Item was added:
+ ----- Method: SpeechBubbleMorph>>initialize (in category 'initialize-release') -----
+ initialize
+ super initialize.
+ stepTime := self minimumStepTime.
+ self positionBalloon; positionTail; positionMsgMorph.
+ self addMorph: self balloon; addMorph: self tail; addMorph: self msgMorph.
+ self extent: self msgMorphExtent + (20 @ self tailHeight + 20); color: Color white.!

Item was added:
+ ----- Method: SpeechBubbleMorph classSide>>speechPrototype (in category 'parts bin') -----
+ speechPrototype
+ 	^self string: 'Hello world!!' type: #speech!

Item was added:
+ ----- Method: SpeechBubbleMorph>>refreshBalloon (in category 'refreshing') -----
+ refreshBalloon
+ 	balloon ifNotNil: [balloon delete].
+ 	balloon := nil.
+ 	self positionBalloon.
+ 	self addMorph: balloon!

Item was added:
+ ----- Method: SpeechBubbleMorph>>msgMorphExtent (in category 'accessing') -----
+ msgMorphExtent
+ ^self msgMorph fullBounds extent!

Item was added:
+ ----- Method: SpeechBubbleMorph>>extent: (in category 'accessing') -----
+ extent: aPoint
+ | width height |
+ width := aPoint x max: self minimumAcceptedWidth.
+ height := aPoint y max: self minimumAcceptedHeight.
+ super extent: width @ height.
+ self refresh.
+ target notNil ifTrue: [self positionMyselfAccordingToTarget]!

Item was added:
+ ----- Method: Morph>>thinkGraphic: (in category '*Etoys-speech bubbles') -----
+ thinkGraphic: aForm
+ self showGraphic: aForm inBubbleType: #thought!

Item was added:
+ ----- Method: SpeechBubbleMorph>>keyStroke:morph: (in category 'event handling') -----
+ keyStroke: anEvent morph: aMorph 
+ 	| string |
+ 	(self msgMorph isKindOf: UserText) ifFalse: [^self].
+ 
+ 	string := self msgMorph contents.
+ 
+ 	"Update text width if necessary. Make sure we keep the selection at the end of the text so that the user can keep modifying"
+ 	self msgMorph width > 300
+ 		ifTrue: [self msgMorph contents: string wrappedTo: 300.
+ 			self msgMorph editor selectFrom: string size + 1 to: string size].
+ 
+ 	"Update my extent"
+ 	self extent: self msgMorphExtent + (20 @ self tailHeight + 20).
+ !

Item was added:
+ ----- Method: Morph>>showGraphic:inBubbleType: (in category '*Etoys-speech bubbles') -----
+ showGraphic: aForm inBubbleType: typeSymbol
+ | currentBubble |
+ currentBubble := self bubble.
+ currentBubble notNil ifTrue: [
+ 	(currentBubble form = aForm and: [currentBubble type = typeSymbol and: [currentBubble isInWorld]]) ifTrue: [^self].
+ 	currentBubble delete].
+ self setProperty: #bubble toValue: (SpeechBubbleMorph form: aForm type: typeSymbol for: self).!

Item was added:
+ ----- Method: SpeechBubbleMorph classSide>>form:type: (in category 'instance creation') -----
+ form: aForm type: aSymbol
+ ^(self basicNew setMorph: (SketchMorph withForm: aForm) type: aSymbol) initialize!

Item was added:
+ ----- Method: Player>>attachTo: (in category 'speech bubbles') -----
+ attachTo: aPlayer
+ self sendMessageToCostume: #target: with: aPlayer costume renderedMorph
+ !

Item was added:
+ ----- Method: SpeechBubbleMorph>>fillStyle: (in category 'accessing') -----
+ fillStyle: aFillStyle
+ 	super fillStyle: aFillStyle.
+ 	self refresh!

Item was added:
+ Morph subclass: #SpeechBubbleMorph
+ 	instanceVariableNames: 'type balloon tail target lastHash stepTime msgMorph'
+ 	classVariableNames: ''
+ 	poolDictionaries: ''
+ 	category: 'Etoys-SpeechBubbles'!
+ SpeechBubbleMorph class
+ 	instanceVariableNames: 'speakingForm topLeftCornerForm thinkingForm'!
+ SpeechBubbleMorph class
+ 	instanceVariableNames: 'speakingForm topLeftCornerForm thinkingForm'!

Item was added:
+ ----- Method: SpeechBubbleMorph>>type (in category 'accessing') -----
+ type
+ ^type!



More information about the etoys-dev mailing list