[etoys-dev] Etoys: Etoys-kfr.70.mcz

karl ramberg karlramberg at gmail.com
Mon May 23 02:19:37 EDT 2011


Missing methods are in
http://source.squeak.org/<http://source.squeak.org/etoys/Morphic-kfr.63.mcz>
etoys/Morphic-kfr.63.mcz <http://source.squeak.org/etoys/Morphic-kfr.63.mcz>

I'll watch the screencast tonight  :-)

Thanks for notifying

Karl


On Mon, May 23, 2011 at 12:49 AM, Bert Freudenberg <bert at freudenbergs.de>wrote:

> Hi Karl,
>
> this breaks all viewers because the method ScriptingSystem>>commandFeedback
> is missing. PLease try updating from a clean Etoys-To-Go to witness.
>
> I just published an update, which unfortunately is broken because of this.
> Luckily, I wrote up what I did so far so you can do the next one :)
>
>        http://etoys.squeak.org/svn/trunk/Documentation/Release-HowTo.txt
>
> I also made a screen cast:
>
>        http://www.youtube.com/watch?v=rUzrfjP4Jck
>
> This takes only 10 minutes, and you can do it even quicker if you don't
> have to talk while doing it ;)
>
> - Bert -
>
> On 22.05.2011, at 18:00, commits at source.squeak.org wrote:
>
> > Karl Ramberg uploaded a new version of Etoys to project Etoys:
> > http://source.squeak.org/etoys/Etoys-kfr.70.mcz
> >
> > ==================== Summary ====================
> >
> > Name: Etoys-kfr.70
> > Author: kfr
> > Time: 22 May 2011, 8:00:42 pm
> > UUID: cdee253f-af6d-9b46-8493-464179d48432
> > Ancestors: Etoys-kfr.69
> >
> > Mouseover Feedback of a phrase tile is wrong
> > http://tracker.squeakland.org/browse/SQ-62
> >
> > =============== Diff against Etoys-kfr.69 ===============
> >
> > Item was changed:
> >  ----- Method: CategoryViewer>>addColorSeesDetailTo: (in category
> 'entries') -----
> >  addColorSeesDetailTo: aRow
> >       "Special-casee code for the boolean-valued phrase variously known
> as is-over-color or sees-color."
> > +     | hotTileForSelf colorMorph |
> > -     | hotTileForSelf m |
> >       (aRow submorphs last) delete.
> >       aRow addMorphBack: (hotTileForSelf _ ColorSeerTile new showPalette:
> false; yourself).
> > +     aRow addMorphBack: (colorMorph _ ColorTileMorph new showPalette:
> false;
> > -     aRow addMorphBack: (m _ ColorTileMorph new showPalette: false;
> >                               typeColor: (ScriptingSystem colorForType:
> #Color); yourself).
> > +     colorMorph colorSwatch color: Color blue.
> > +      hotTileForSelf on: #mouseEnter send: #addGetterFeedback to: aRow.
> > -     m colorSwatch color: Color blue.
> > -     hotTileForSelf on: #mouseEnter send: #addGetterFeedback to: aRow.
> >       hotTileForSelf on: #mouseLeave send: #removeHighlightFeedback to:
> aRow.
> >       hotTileForSelf on: #mouseLeaveDragging send:
> #removeHighlightFeedback to: aRow.
> >
> >       hotTileForSelf  on: #mouseDown send: #makeGetter:event:from:
> >               to: self
> >               withValue: (Array with: #color:sees: with: #Boolean).
> >
> > +      colorMorph on: #mouseEnter send: #addGetterFeedback to: aRow.
> > +     colorMorph on: #mouseLeave send: #removeHighlightFeedback to: aRow.
> > +     colorMorph on: #mouseLeaveDragging send: #removeHighlightFeedback
> to: aRow.
> > +
> > +     colorMorph  on: #mouseDown send: #makeGetter:event:from:
> > +             to: self
> > +             withValue: (Array with: #color:sees: with: #Boolean).
> > +
> >       aRow addMorphBack: (Morph new extent: 0@(aRow height)).
> >  !
> >
> > Item was changed:
> >  ----- Method: CategoryViewer>>addIsOverColorDetailTo: (in category
> 'entries') -----
> >  addIsOverColorDetailTo: aRow
> >       "Special-casee code for the boolean-valued phrase variously known
> as is-over-color or sees-color."
> >
> > +     | hotTileForSelf |
> > +     aRow addMorphBack: (Morph new color: self color; extent: 0 at 10).
>  "spacer"
> > +     hotTileForSelf _ ColorTileMorph new showPalette: false;
> > -     | m |
> > -     aRow addMorphBack: (Morph new color: self color; extent: 2 at 10).
>  "spacer"
> > -     m _ ColorTileMorph new showPalette: false;
> >                               typeColor: (ScriptingSystem colorForType:
> #Color); yourself.
> > +     hotTileForSelf colorSwatch color: Color blue.
> > +      hotTileForSelf on: #mouseEnter send: #addGetterFeedback to: aRow.
> > +     hotTileForSelf on: #mouseLeave send: #removeHighlightFeedback to:
> aRow.
> > +     hotTileForSelf on: #mouseLeaveDragging send:
> #removeHighlightFeedback to: aRow.
> > +     hotTileForSelf  on: #mouseDown send: #makeGetter:event:from:
> > +             to: self
> > +             withValue: (Array with: #seesColor: with: #Color).
> > +         aRow addMorphBack: hotTileForSelf.
> > -     m colorSwatch color: Color blue.
> > -     aRow addMorphBack: (m _ ColorTileMorph new showPalette: false;
> > -                             typeColor: (ScriptingSystem colorForType:
> #Color); yourself).
> >
> >
> >
> > -
> >  "The following commented-out code put a readout up; the readout was very
> nice, but was very consumptive of cpu time, which is why the is-over-color
> tile got removed from the viewer long ago.  Now is-over-color is reinstated
> to the viewer, minus the expensive readout..."
> >
> >  "    aRow addMorphBack: (AlignmentMorph new beTransparent).
> >       readout _ UpdatingStringMorphWithArgument new
> >                       target: scriptedPlayer; getSelector: #seesColor:;
> growable: false; putSelector: nil;
> >                       argumentTarget: clrTile colorSwatch
> argumentGetSelector: #color.
> >       readout useDefaultFormat.
> >       aTile _ StringReadoutTile new typeColor: Color lightGray lighter.
> >       aTile addMorphBack: readout.
> >       aRow addMorphBack: aTile.
> >       aTile setLiteralTo: (scriptedPlayer seesColor: clrTile colorSwatch
> color) printString width: 30"!
> >
> > Item was changed:
> >  ----- Method: CategoryViewer>>addPlayerArgumentTo: (in category
> 'entries') -----
> >  addPlayerArgumentTo: aRow
> >       "Add, delimited by spacer morphs, a player-valued TileMorph to the
> row provided."
> >
> > +     | aTileToRefer |
> >       aRow addMorphBack: (Morph new extent: 0 at 0).  "spacer (Is this
> spacer really needed??? - takashi)"
> > +     aTileToRefer :=  self presenter standardPlayer tileToRefer.
> > +     aTileToRefer on: #mouseEnter send: #addGetterFeedback to: aRow.
> > +             aTileToRefer on: #mouseLeave send: #removeHighlightFeedback
> to: aRow.
> > +             aTileToRefer on: #mouseLeaveDragging send:
> #removeHighlightFeedback to: aRow.
> > +     aRow addMorphBack: aTileToRefer .
> > -     aRow addMorphBack:  self presenter standardPlayer tileToRefer.
> >       aRow addMorphBack: (AlignmentMorph new beTransparent).  "flexible
> spacer"
> >
> >  !
> >
> > Item was changed:
> >  ----- Method: CategoryViewer>>phraseForVariableFrom: (in category
> 'entries') -----
> >  phraseForVariableFrom: aMethodInterface
> >       "Return a structure consisting of tiles and controls and a readout
> representing a 'variable' belonging to the player, complete with an
> appropriate readout when indicated. Slightly misnamed in that this path is
> used for any methodInterface that indicates an interesting resultType."
> >
> > +     | anArrow slotName getterButton aRow doc setter hotTileForSelf
> spacer readOut aTileToRefer |
> > -     | anArrow slotName getterButton aRow doc setter hotTileForSelf
> spacer |
> >       Preferences universalTiles ifTrue: [^ self
> universalTilesPhraseForVariableFrom: aMethodInterface].
> >
> >       aRow _ ViewerLine newRow
> >               elementSymbol: (slotName _ aMethodInterface selector);
> >               wrapCentering: #center;
> >               cellPositioning: #leftCenter.
> >
> >       (self wantsInfoButtonFor: slotName)
> >               ifFalse:
> >                       [aRow addMorphBack: ScriptingSystem buttonSpacer]
> >               ifTrue:
> >                       [aRow addMorphBack: (self infoButtonFor:
> slotName)].
> >
> >       aRow addMorphBack: self spacerAfterButton.
> >
> >       hotTileForSelf _ self tileForSelf bePossessive.
> >       hotTileForSelf  on: #mouseDown send: #makeGetter:event:from:
> >               to: self
> >               withValue: (Array with: aMethodInterface selector with:
> aMethodInterface resultType).
> >       aRow addMorphBack: hotTileForSelf.
> >
> >       aRow addMorphBack: (spacer _ Morph new color: self color; extent:
> 0 at 0).
> >       spacer on: #mouseEnter send: #addGetterFeedback to: aRow.
> >       spacer on: #mouseLeave send: #removeHighlightFeedback to: aRow.
> >       spacer on: #mouseLeaveDragging send: #removeHighlightFeedback to:
> aRow.
> >       spacer  on: #mouseDown send: #makeGetter:event:from:
> >               to: self
> >               withValue: (Array with: aMethodInterface selector with:
> aMethodInterface resultType).
> >       hotTileForSelf on: #mouseEnter send: #addGetterFeedback to: aRow.
> >       hotTileForSelf on: #mouseLeave send: #removeHighlightFeedback to:
> aRow.
> >       hotTileForSelf on: #mouseLeaveDragging send:
> #removeHighlightFeedback to: aRow.
> >
> >       getterButton _ self getterButtonFor: aMethodInterface selector
> type: aMethodInterface resultType.
> >       aRow addMorphBack: getterButton.
> >       getterButton on: #mouseEnter send: #addGetterFeedback to: aRow.
> >       getterButton on: #mouseLeave send: #removeHighlightFeedback to:
> aRow.
> >       getterButton on: #mouseLeaveDragging send: #removeHighlightFeedback
> to: aRow.
> >       (doc _ aMethodInterface documentation) ifNotNil:
> >               [getterButton setBalloonText: doc].
> >
> >       (slotName == #seesColor:) ifTrue:
> >               [self addIsOverColorDetailTo: aRow.
> >               ^ aRow].
> >
> >       (slotName == #color:sees:) ifTrue:
> >               [self addColorSeesDetailTo: aRow.
> >               ^ aRow].
> >
> >       (#(touchesA: overlaps: overlapsAny: distanceToPlayer: bearingTo:
> bearingFrom:) includes: slotName) ifTrue:
> > +             [aRow addMorphBack: (Morph new extent: 0 at 0).  "spacer (Is
> this spacer really needed??? - takashi)"
> > +     aTileToRefer :=  self presenter standardPlayer tileToRefer.
> > +     aTileToRefer on: #mouseEnter send: #addGetterFeedback to: aRow.
> > +     aTileToRefer on: #mouseLeave send: #removeHighlightFeedback to:
> aRow.
> > +     aTileToRefer on: #mouseLeaveDragging send: #removeHighlightFeedback
> to: aRow.
> > +     aTileToRefer on: #mouseDown send: #makeGetter:event:from:
> > +             to: self
> > +             withValue: (Array with: aMethodInterface selector with:
> aMethodInterface resultType).
> > +     aRow addMorphBack: aTileToRefer .
> > +     aRow addMorphBack: (AlignmentMorph new beTransparent).  "flexible
> spacer"
> > -             [self addPlayerArgumentTo: aRow.
> >               ^ aRow].
> >
> >       aRow addMorphBack: VariableSpacer new.
> >       (setter _ aMethodInterface companionSetterSelector) ifNotNil:
> >               [aRow addMorphBack: (Morph new color: self color; extent:
> 2 at 10).  " spacer"
> >               anArrow _ self arrowSetterButton: #makeSetter:from:forPart:
> >                                               args: (Array with: slotName
> with: aMethodInterface resultType).
> >               anArrow beTransparent.
> >               anArrow on: #mouseEnter send: #addSetterFeedback to: aRow.
> >               anArrow on: #mouseLeave send: #removeHighlightFeedback to:
> aRow.
> >               anArrow on: #mouseLeaveDragging send:
> #removeHighlightFeedback to: aRow.
> >               aRow addMorphBack: anArrow].
> >
> >       (#(color:sees: copy touchesA: overlaps: overlapsAny: getTurtleAt:
> getTurtleOf:) includes: slotName) ifFalse:
> >               [aMethodInterface wantsReadoutInViewer ifTrue:
> > +                             [readOut := (self readoutFor: slotName
> type: aMethodInterface resultType readOnly: setter isNil getSelector:
> aMethodInterface selector putSelector: setter).
> > +                             readOut on: #mouseEnter send:
> #addSetterFeedback to: aRow.
> > +             readOut on: #mouseLeave send: #removeHighlightFeedback to:
> aRow.
> > +             readOut on: #mouseLeaveDragging send:
> #removeHighlightFeedback to: aRow.
> > +             readOut on: #mouseDown send: #makeGetter:event:from:
> > +             to: self
> > +             withValue: (Array with: aMethodInterface selector with:
> aMethodInterface resultType).
> > +                                     aRow addMorphBack: readOut.]].
> > -                             [aRow addMorphBack: (self readoutFor:
> slotName type: aMethodInterface resultType readOnly: setter isNil
> getSelector: aMethodInterface selector putSelector: setter)]].
> >       anArrow ifNotNil: [anArrow step].
> >       ^ aRow!
> >
> > Item was changed:
> >  ----- Method: CompoundTileMorph>>addCommandFeedback: (in category
> 'miscellaneous') -----
> >  addCommandFeedback: evt
> >       "Add screen feedback showing what would be torn off in a drag"
> >
> >       | aMorph |
> > +
> >       aMorph _ RectangleMorph new bounds: (self bounds).
> > +     aMorph beTransparent; borderWidth: 2; borderColor: ScriptingSystem
> commandFeedback; lock.
> > -     aMorph beTransparent; borderWidth: 2; borderColor: (Color r: 1.0 g:
> 0.548 b: 0.452); lock.
> >       ActiveWorld addHighlightMorph: aMorph for: self
> outmostScriptEditor!
> >
> > Item was changed:
> >  ----- Method: PhraseTileForTest>>addCommandFeedback: (in category 'as
> yet unclassified') -----
> >  addCommandFeedback: evt
> >       "Add screen feedback showing what would be torn off in a drag"
> >
> > +     | aMorph |
> > -     | aMorph rect |
> >       (self owner owner isMemberOf: PhraseTileMorph) ifTrue: [self owner
> owner addCommandFeedback: evt. ^ self].
> > +     aMorph _ RectangleMorph new bounds: ((self topLeft - (2 at 1))
> corner: (self bottomRight) + (2 at 1)).
> > +     aMorph beTransparent; borderWidth: 2; borderColor: ScriptingSystem
> commandFeedback; lock.
> > -     rect _ self bounds.
> > -     aMorph _ RectangleMorph new bounds: rect.
> > -     aMorph beTransparent; borderWidth: 2; borderColor: (Color r: 1.0 g:
> 0.548 b: 0.452); lock.
> >       ActiveWorld addHighlightMorph: aMorph for: self
> outmostScriptEditor!
> >
> > Item was changed:
> >  ----- Method: PhraseTileForTimesRepeat>>addCommandFeedback: (in category
> 'hilighting') -----
> >  addCommandFeedback: evt
> >       "Add screen feedback showing what would be torn off in a drag"
> >
> > +     | aMorph |
> > +
> > -     | aMorph rect |
> >       (self owner owner isMemberOf: PhraseTileMorph) ifTrue: [self owner
> owner addCommandFeedback: evt. ^ self].
> > +     aMorph _ RectangleMorph new bounds: ((self topLeft - (2 at 1))
> corner: (self bottomRight) + (2 at 1)).
> > +     aMorph beTransparent; borderWidth: 2; borderColor: ScriptingSystem
> commandFeedback; lock.
> > -     rect _ self bounds.
> > -     aMorph _ RectangleMorph new bounds: rect.
> > -     aMorph beTransparent; borderWidth: 2; borderColor: (Color r: 1.0 g:
> 0.548 b: 0.452); lock.
> >       ActiveWorld addHighlightMorph: aMorph for: self
> outmostScriptEditor!
> >
> > Item was changed:
> >  ----- Method: PhraseTileMorph>>addCommandFeedback: (in category
> 'hilighting') -----
> >  addCommandFeedback: evt
> >       "Add screen feedback showing what would be torn off in a drag"
> >
> > +     | aMorph |
> > -     | aMorph rect inHotZone |
> >       (self owner owner isMemberOf: PhraseTileMorph)
> >               ifTrue: [self owner owner addCommandFeedback: evt. ^ self].
> > +     aMorph _ RectangleMorph new bounds: ((self topLeft - (2 at 1))
> corner: ((submorphs at: (2 max: submorphs size)) bottomRight + (2 at 1))).
> > +     "inHotZone _ evt ifNil: [true] ifNotNil: [rect containsPoint: evt
> cursorPoint]."
> > +     aMorph beTransparent; borderWidth: 2; borderColor: ScriptingSystem
> commandFeedback; lock.
> > -     rect _ self topLeft corner: (submorphs at: (2 min: submorphs size))
> bottomRight.
> > -     inHotZone _ evt ifNil: [true] ifNotNil: [rect containsPoint: evt
> cursorPoint].
> > -     aMorph _ RectangleMorph new bounds: rect; beTransparent;
> borderWidth: 2.
> > -     aMorph borderColor: (Color r: 1.0 g: 0.548 b: 0.452); lock.
> >       ActiveWorld addHighlightMorph: aMorph for: self
> outmostScriptEditor!
> >
> > Item was changed:
> >  ----- Method: TileMorph>>handlesMouseOver: (in category 'event
> handling') -----
> >  handlesMouseOver: evt
> >       ^ self isPopArrowNeeded
> > +             or: [^super handlesMouseOver: evt]!
> > -             or: [super handlesMouseOver: evt]!
> >
> > Item was changed:
> >  ----- Method: TileMorph>>mouseEnter: (in category 'event handling')
> -----
> >  mouseEnter: evt
> > +
> > +     .
> > +     super mouseEnter:evt.
> > +     ^self showPopArrows!
> > -     self showPopArrows!
> >
> > Item was changed:
> >  ----- Method: TileMorph>>mouseLeave: (in category 'event handling')
> -----
> >  mouseLeave: evt
> >       "When the mouse is leaving and next object is not a pop arrow,
> remove
> >       pop arrows."
> >       | popArrows vpanel hpanel |
> >       popArrows := evt hand
> >                               valueOfProperty: #popArrows
> > +                             ifAbsent: [^super mouseLeave: evt].
> > -                             ifAbsent: [^ self].
> >       vpanel := popArrows second.
> >       hpanel := popArrows third.
> >       (vpanel notNil
> >                       and: [vpanel containsPoint: evt position])
> > +             ifTrue: [^super mouseLeave: evt].
> > -             ifTrue: [^ self].
> >       (hpanel notNil
> >                       and: [hpanel containsPoint: evt position])
> > +             ifTrue: [^super mouseLeave: evt].
> > +     self hidePopArrows.
> > +     ^super mouseLeave: evt!
> > -             ifTrue: [^ self].
> > -     self hidePopArrows!
> >
> > Item was changed:
> >  ----- Method: TimesRepeatTile>>numberOfTimesToRepeatPart (in category
> 'access') -----
> >  numberOfTimesToRepeatPart
> >       "Answer the TilePadMorph which holds the tiles defining the number
> of times to repeat"
> >
> >       ^ timesRow timesPad !
> >
> > Item was changed:
> >  ----- Method: TimesRepeatTile>>storeCodeOn:indent: (in category 'code
> generation') -----
> >  storeCodeOn: aStream indent: tabCount
> >       "Store code representing the receiver on the stream, obeying the
> tab state."
> >
> >       aStream nextPutAll: '(('.
> >       self numberOfTimesToRepeatPart submorphs
> >               ifEmpty:
> >                       [aStream nextPutAll: '0']
> >               ifNotEmpty:
> >                       [self numberOfTimesToRepeatPart storeCodeOn:
> aStream indent: tabCount + 2].
> >       aStream nextPutAll: ' ) asInteger max: 0) timesRepeat:'.
> >       tabCount + 1 timesRepeat: [aStream tab].
> >       aStream nextPutAll: '['; cr.
> >       self storeCodeBlockFor: whatToRepeatPart on: aStream indent:
> tabCount + 2.
> >       aStream nextPut: $].
> >  !
> >
> > Item was changed:
> >  ----- Method: TimesRepeatTile>>targetPartFor: (in category
> 'initialization') -----
> >  targetPartFor: aMorph
> >       "Return the row into which the given morph should be inserted."
> >
> >       | centerY |
> >       centerY _ aMorph fullBounds center y.
> >       {self numberOfTimesToRepeatPart, whatToRepeatPart} do: [:m |
> >               (centerY <= m bounds bottom) ifTrue: [^ m]].
> >       ^ noPart
> >  !
> >
> > Item was changed:
> >  ----- Method: ViewerLine>>addCommandFeedback: (in category 'slot') -----
> >  addCommandFeedback: evt
> >       "Add screen feedback showing what would be torn off in a drag"
> >
> >       | aMorph |
> > +     aMorph _ RectangleMorph new bounds: ((submorphs third topLeft -
> (2 at 1)) corner: (submorphs last bottomRight) + (2 at 1)).
> > +     aMorph beTransparent; borderWidth: 2; borderColor: ScriptingSystem
> commandFeedback; lock.
> > -     aMorph _ RectangleMorph new bounds: ((submorphs third topLeft -
> (2 at 1)) corner: (submorphs last bottomRight) + (2 at 0)).
> > -     aMorph beTransparent; borderWidth: 2; borderColor: (Color r: 1.0 g:
> 0.548 b: 0.452); lock.
> >       ActiveWorld addHighlightMorph: aMorph for: nil!
> >
> > Item was changed:
> >  ----- Method: ViewerLine>>addGetterFeedback (in category 'slot') -----
> >  addGetterFeedback
> >       "Add feedback during mouseover of a getter"
> >
> >       | aMorph endMorph |
> > +
> >       endMorph _
> >               (#(touchesA: #seesColor: #overlaps: color:sees:
> overlapsAny: bearingTo: bearingFrom: distanceToPlayer:) includes: self
> elementSymbol)
> >                       ifTrue:
> >                               [submorphs seventh]
> >                       ifFalse:
> >                               [submorphs fifth].
> > +     aMorph _ RectangleMorph new bounds: ((submorphs third topLeft -
> (2 at 1)) corner: ((endMorph right  @ submorphs third bottom)  + (2 at 1))).
> > +     aMorph beTransparent; borderWidth: 2; borderColor: ScriptingSystem
> getterFeedback; lock.
> > -     aMorph _ RectangleMorph new bounds: ((submorphs third topLeft - (2 at -1))
> corner: (endMorph bottomRight + (2 at -1))).
> > -     aMorph height:(submorphs third height + 1).
> > -     aMorph beTransparent; borderWidth: 2; borderColor: (Color r: 1.0 g:
> 0.355 b: 0.839); lock.
> >       ActiveWorld addHighlightMorph: aMorph for: nil.
> >
> >  "
> >  Color fromUser (Color r: 1.0 g: 0.355 b: 0.839)
> >  "!
> >
> > Item was changed:
> >  ----- Method: ViewerLine>>addSetterFeedback (in category 'slot') -----
> >  addSetterFeedback
> >       "Add screen feedback showing what would be torn off to make a
> setter"
> >
> >       | aMorph |
> > +     aMorph _ RectangleMorph new bounds: ((submorphs third topLeft -
> (2 at 1)) corner: ((submorphs last right  @ submorphs third bottom)  + (2 at 1
> ))).
> > +     aMorph beTransparent; borderWidth: 2; borderColor: ScriptingSystem
> setterFeedback; lock.
> > -     aMorph _ RectangleMorph new bounds: ((submorphs third topLeft -
> (2 at 1)) corner: (submorphs last bottomRight) + (2 at 0)).
> > -     aMorph height:(submorphs third height + 1).
> > -     aMorph beTransparent; borderWidth: 2; borderColor: (Color r: 1.0 g:
> 0.548 b: 0.452); lock.
> >       ActiveWorld addHighlightMorph: aMorph for: nil!
>
> _______________________________________________
> etoys-dev mailing list
> etoys-dev at squeakland.org
> http://lists.squeakland.org/mailman/listinfo/etoys-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.squeakland.org/pipermail/etoys-dev/attachments/20110523/26029763/attachment-0001.html>


More information about the etoys-dev mailing list