<body><div id="__MailbirdStyleContent" style="font-size: 10pt;font-family: Arial;color: #000000">
                                        Hi Christoph,<div><br></div><div>I know. We should come up with a solution for that. Maybe re-print the commit messages of all ancestors as soon as the number of ancestors is > 1.</div><div><br></div><div>Best,</div><div>Marcel</div><div class="mb_sig"></div><blockquote class="history_container" type="cite" style="border-left-style:solid;border-width:1px; margin-top:20px; margin-left:0px;padding-left:10px;">
                        <p style="color: #AAAAAA; margin-top: 10px;">Am 13.11.2019 12:51:06 schrieb Thiede, Christoph <christoph.thiede@student.hpi.uni-potsdam.de>:</p><div style="font-family:Arial,Helvetica,sans-serif">


<div dir="ltr">
<div id="x_divtagdefaultwrapper" dir="ltr" style="font-size: 12pt;color: #000000;font-family: Calibri,Helvetica,sans-serif">
<p>Just for interest, is it usual & desired behavior that when installing these updates, the update log does not include any of my commit messages?</p>
<div id="x_Signature">
<div name="x_divtagdefaultwrapper" style="font-family: Calibri,Arial,Helvetica,sans-serif;font-size: ;margin: 0">
<div><span style="font-size: 10pt;color: #808080"></span></div>
</div>
</div>
</div>
<hr tabindex="-1" style="display:inline-block; width:98%">
<div id="x_divRplyFwdMsg" dir="ltr"><span style="font-family: Calibri, sans-serif;color: #000000"><b>Von:</b> Squeak-dev <squeak-dev-bounces@lists.squeakfoundation.org> im Auftrag von commits@source.squeak.org <commits@source.squeak.org><br>
<b>Gesendet:</b> Mittwoch, 13. November 2019 12:15:14<br>
<b>An:</b> squeak-dev@lists.squeakfoundation.org; packages@lists.squeakfoundation.org<br>
<b>Betreff:</b> [squeak-dev] The Trunk: EToys-mt.368.mcz</span>
<div> </div>
</div>
</div>
<span style="font-size: 10pt"><span style="font-size: 10pt">
<div class="PlainText">Marcel Taeumel uploaded a new version of EToys to project The Trunk:<br>
<a href="http://source.squeak.org/trunk/EToys-mt.368.mcz">http://source.squeak.org/trunk/EToys-mt.368.mcz</a><br>
<br>
==================== Summary ====================<br>
<br>
Name: EToys-mt.368<br>
Author: mt<br>
Time: 13 November 2019, 12:15:07.673043 pm<br>
UUID: 3f6873fa-5111-ac4a-a108-9031e19e5f40<br>
Ancestors: EToys-kfr.363, EToys-ct.354, EToys-ct.355, EToys-ct.356, EToys-ct.357, EToys-ct.358, EToys-ct.359, EToys-ct.360, EToys-ct.364, EToys-ct.365, EToys-ct.367<br>
<br>
Merge! Merge! Merge! Various fixes in Etoys-related places.<br>
<br>
=============== Diff against EToys-kfr.363 ===============<br>
<br>
Item was added:<br>
+ ----- Method: Form>>scaledToWidth: (in category '*Etoys-Squeakland-scaling, rotation') -----<br>
+ scaledToWidth: newWidth<br>
+        "Answer the receiver, scaled such that it has the desired width."<br>
+ <br>
+        newWidth = self width ifTrue: [^ self].<br>
+        ^self magnify: self boundingBox by: (newWidth / self width) smoothing: 2.<br>
+ !<br>
<br>
Item was changed:<br>
  ----- Method: FreeCell>>help (in category 'actions') -----<br>
  help<br>
+ <br>
+        self helpText editWithLabel: 'FreeCell Help'.!<br>
-        | window helpMorph |<br>
-        window := SystemWindow labelled: 'FreeCell Help' translated.<br>
-        window model: self.<br>
-        helpMorph := (PluggableTextMorph new editString: self helpText) lock.<br>
-        window<br>
-                addMorph: helpMorph<br>
-                frame: (0 @ 0 extent: 1 @ 1).<br>
-        window openInWorld!<br>
<br>
Item was added:<br>
+ ----- Method: MovingEyeMorph>>color: (in category 'accessing') -----<br>
+ color: aColor<br>
+ <br>
+        super color: aColor.<br>
+        <br>
+        "Migrate old instances."<br>
+        inner color: Color transparent.<br>
+        <br>
+        "Keep iris visible."<br>
+        aColor = iris color<br>
+                ifTrue: [iris borderWidth: 1; borderColor: aColor negated]<br>
+                ifFalse: [iris borderWidth: 0].!<br>
<br>
Item was changed:<br>
  ----- Method: MovingEyeMorph>>initialize (in category 'initialization') -----<br>
  initialize<br>
         "initialize the state of the receiver"<br>
         super initialize.<br>
         ""<br>
         inner := EllipseMorph new.<br>
+        inner color: Color transparent.<br>
-        inner color: self color.<br>
         inner extent: (self extent * (1.0 @ 1.0 - IrisSize)) asIntegerPoint.<br>
-        inner borderColor: self color.<br>
         inner borderWidth: 0.<br>
  ""<br>
         iris := EllipseMorph new.<br>
         iris color: Color white.<br>
         iris extent: (self extent * IrisSize) asIntegerPoint.<br>
  ""<br>
         self addMorphCentered: inner.<br>
         inner addMorphCentered: iris.<br>
  ""<br>
         self extent: 26 @ 33!<br>
<br>
Item was added:<br>
+ ----- Method: MovingEyeMorph>>irisColor (in category 'accessing') -----<br>
+ irisColor<br>
+ <br>
+        ^ iris color!<br>
<br>
Item was added:<br>
+ ----- Method: MovingEyeMorph>>irisColor: (in category 'accessing') -----<br>
+ irisColor: aColor<br>
+ <br>
+        iris color: aColor.<br>
+        <br>
+        "Keep iris visible."<br>
+        aColor = self color<br>
+                ifTrue: [iris borderWidth: 1; borderColor: aColor negated]<br>
+                ifFalse: [iris borderWidth: 0].!<br>
<br>
Item was added:<br>
+ ----- Method: MovingEyeMorph>>irisPos (in category 'accessing') -----<br>
+ irisPos<br>
+ <br>
+        ^ iris position!<br>
<br>
Item was changed:<br>
+ ----- Method: MovingEyeMorph>>irisPos: (in category 'accessing') -----<br>
- ----- Method: MovingEyeMorph>>irisPos: (in category 'as yet unclassified') -----<br>
  irisPos: cp<br>
  <br>
         | a b theta x y |<br>
         theta := (cp - self center) theta.<br>
         a := inner width // 2.<br>
         b := inner height // 2.<br>
         x := a * (theta cos).<br>
         y := b * (theta sin).<br>
         iris position: ((x@y) asIntegerPoint) + self center - (iris extent // 2).!<br>
<br>
Item was changed:<br>
  ----- Method: MovingEyeMorph>>step (in category 'stepping and presenter') -----<br>
  step<br>
         | cp |<br>
         cp := self globalPointToLocal: self world primaryHand position.<br>
         (inner containsPoint: cp)<br>
                 ifTrue: [iris position: (cp - (iris extent // 2))]<br>
+                ifFalse: [self irisPos: cp].!<br>
-                ifFalse: [self irisPos: cp].<br>
-        self changed "cover up gribblies if embedded in Flash"!<br>
<br>
Item was changed:<br>
  ----- Method: NewVariableDialogMorph>>decimalPlaces (in category 'accessing') -----<br>
  decimalPlaces<br>
         ^ decimalPlacesButton<br>
                 ifNil: [Utilities <br>
                                 decimalPlacesForFloatPrecision: (self targetPlayer<br>
+                                        defaultFloatPrecisionFor: self varAcceptableName asSetterSelector)]<br>
-                                        defaultFloatPrecisionFor: (Utilities getterSelectorFor: self varAcceptableName))]<br>
                 ifNotNil: [:button| button label asNumber]!<br>
<br>
Item was changed:<br>
  ----- Method: Player>>newScriptorAround: (in category 'viewer') -----<br>
  newScriptorAround: aPhrase<br>
         "Sprout a scriptor around aPhrase, thus making a new script.  aPhrase may either be a PhraseTileMorph (classic tiles 1997-2001) or a SyntaxMorph (2001 onward)"<br>
  <br>
         | aScriptEditor aUniclassScript tw blk |<br>
  Cursor wait showWhile: [<br>
         aUniclassScript := self class permanentUserScriptFor: self unusedScriptName player: self.<br>
         aScriptEditor := aUniclassScript instantiatedScriptEditorForPlayer: self.<br>
  <br>
         Preferences universalTiles ifTrue: [<br>
                 aScriptEditor install.<br>
                 "aScriptEditor hResizing: #shrinkWrap;<br>
                         vResizing: #shrinkWrap;<br>
                         cellPositioning: #topLeft;<br>
                         setProperty: #autoFitContents toValue: true."<br>
                 aScriptEditor insertUniversalTiles.  "Gets an empty SyntaxMorph for a MethodNode"<br>
+                tw := aScriptEditor findA: ScrollPane.<br>
-                tw := aScriptEditor findA: TwoWayScrollPane.<br>
                 aPhrase ifNotNil:<br>
                         [blk := (tw scroller findA: SyntaxMorph "MethodNode") findA: BlockNode.<br>
                         blk addMorphFront: aPhrase.<br>
                         aPhrase accept.<br>
                 ].<br>
                 SyntaxMorph setSize: nil andMakeResizable: aScriptEditor.<br>
         ] ifFalse: [<br>
                 aPhrase <br>
                                 ifNotNil: [aScriptEditor phrase: aPhrase]       "does an install"<br>
                                 ifNil: [aScriptEditor install]<br>
         ].<br>
         self class allSubInstancesDo: [:anInst | anInst scriptInstantiationForSelector: aUniclassScript selector].<br>
                 "The above assures the presence of a ScriptInstantiation for the new selector in all siblings"<br>
         self updateScriptsCategoryOfViewers.<br>
  ].<br>
         ^ aScriptEditor!<br>
<br>
Item was changed:<br>
  ----- Method: Preferences class>>initializePreferencePanel:in: (in category '*Etoys-Squeakland-preferences panel') -----<br>
  initializePreferencePanel: aPanel in: aPasteUpMorph<br>
         "Initialize the given Preferences panel. in the given pasteup, which is the top-level panel installed in the container window.  Also used to reset it after some change requires reformulation"<br>
  <br>
         | tabbedPalette controlPage aColor aFont maxEntriesPerCategory tabsMorph anExtent  prefObjects |<br>
         aPasteUpMorph removeAllMorphs.<br>
  <br>
         aFont := Preferences standardListFont.<br>
+        aColor := aPanel windowColorToUse.<br>
-        aColor := aPanel defaultBackgroundColor.<br>
         tabbedPalette := TabbedPalette newSticky.<br>
         tabbedPalette dropEnabled: false.<br>
         (tabsMorph := tabbedPalette tabsMorph) color: aColor darker;<br>
                  highlightColor: Color red regularColor: Color brown darker darker.<br>
         tabbedPalette on: #mouseDown send: #yourself to: #().<br>
         maxEntriesPerCategory := 0.<br>
         self listOfCategories do: <br>
                 [:aCat | <br>
                         controlPage := AlignmentMorph newColumn beSticky color: aColor.<br>
                         controlPage on: #mouseDown send: #yourself to: #().<br>
                         controlPage dropEnabled: false.<br>
                         controlPage borderColor: aColor;<br>
                                  layoutInset: 4.<br>
                         (prefObjects := self preferenceObjectsInCategory: aCat) do:<br>
                                 [:aPreference | | button |<br>
                                         button := aPreference representativeButtonWithColor: Color white inPanel: aPanel.<br>
                                         button ifNotNil: [controlPage addMorphBack: button]].<br>
                         controlPage setNameTo: aCat asString.<br>
                         aCat = #?<br>
                                 ifTrue: [aPanel addHelpItemsTo: controlPage].<br>
                         tabbedPalette addTabFor: controlPage font: aFont.<br>
                         aCat = 'search results' ifTrue:<br>
                                 [(tabbedPalette tabNamed: aCat) setBalloonText:<br>
                                         'Use the ? category to find preferences by keyword; the results of your search will show up here' translated].<br>
                 maxEntriesPerCategory := maxEntriesPerCategory max: prefObjects size].<br>
         tabbedPalette selectTabNamed: '?'.<br>
         tabsMorph rowsNoWiderThan: aPasteUpMorph width.<br>
         aPasteUpMorph on: #mouseDown send: #yourself to: #().<br>
         anExtent := aPasteUpMorph width @ (490 max: (25 + tabsMorph height + (24 * maxEntriesPerCategory))).<br>
         aPasteUpMorph extent: anExtent.<br>
         aPasteUpMorph color: aColor.<br>
         aPasteUpMorph     addMorphBack: tabbedPalette.!<br>
<br>
Item was changed:<br>
  ----- Method: ScriptEditorMorph>>autoFitOnOff (in category 'menu') -----<br>
  autoFitOnOff<br>
         "Toggle between auto fit to size of code and manual resize with scrolling"<br>
         | tw |<br>
+        (tw := self findA: ScrollPane) ifNil: [^ self].<br>
-        (tw := self findA: TwoWayScrollPane) ifNil: [^ self].<br>
         (self hasProperty: #autoFitContents)<br>
                 ifTrue: [self removeProperty: #autoFitContents.<br>
                         self hResizing: #rigid; vResizing: #rigid]<br>
                 ifFalse: [self setProperty: #autoFitContents toValue: true.<br>
                         self hResizing: #shrinkWrap; vResizing: #shrinkWrap].<br>
         tw layoutChanged!<br>
<br>
Item was changed:<br>
  ----- Method: ScriptEditorMorph>>extent: (in category 'other') -----<br>
  extent: x<br>
  <br>
         | newExtent tw menu |<br>
         newExtent := x max: self minWidth @ self minHeight.<br>
+        (tw := self findA: ScrollPane) ifNil:<br>
-        (tw := self findA: TwoWayScrollPane) ifNil:<br>
                 ["This was the old behavior"<br>
                 ^ super extent: newExtent].<br>
  <br>
         (self hasProperty: #autoFitContents) ifTrue: [<br>
                 menu := MenuMorph new defaultTarget: self.<br>
                 menu addUpdating: #autoFitString target: self action: #autoFitOnOff.<br>
                 menu addTitle: 'To resize the script, uncheck the box below' translated.<br>
                 menu popUpEvent: nil in: self world     .<br>
                 ^ self].<br>
  <br>
         "Allow the user to resize to any size"<br>
         tw extent: ((newExtent x max: self firstSubmorph width)<br>
                                 @ (newExtent y - self firstSubmorph height)) - (self borderWidth * 2) + (-4 @ -4).  "inset?"<br>
         ^ super extent: newExtent!<br>
<br>
Item was changed:<br>
  ----- Method: ScriptEditorMorph>>hibernate (in category 'other') -----<br>
  hibernate<br>
         "Possibly delete the tiles, but only if using universal tiles."<br>
  <br>
         | tw |<br>
         Preferences universalTiles ifFalse: [^self].<br>
+        (tw := self findA: ScrollPane) isNil <br>
-        (tw := self findA: TwoWayScrollPane) isNil <br>
                 ifFalse: <br>
                         [self setProperty: #sizeAtHibernate toValue: self extent.       "+ tw xScrollerHeight"<br>
                         submorphs size > 1 ifTrue: [tw delete]]!<br>
<br>
Item was added:<br>
+ ----- Method: SpectrumAnalyzerMorph>>fftSize: (in category 'accessing') -----<br>
+ fftSize: aSize<br>
+ <br>
+        | on |<br>
+        on := soundInput isRecording.<br>
+        self stop.<br>
+        fft := FFT new: aSize.<br>
+        self resetDisplay.<br>
+        on ifTrue: [self start].!<br>
<br>
Item was changed:<br>
  ----- Method: SpectrumAnalyzerMorph>>setFFTSize (in category 'menu and buttons') -----<br>
  setFFTSize<br>
         "Set the size of the FFT used for frequency analysis."<br>
  <br>
+        | aMenu sz |<br>
-        | aMenu sz on |<br>
         aMenu := CustomMenu new title: ('FFT size (currently {1})' translated format:{fft n}).<br>
         ((7 to: 10) collect: [:n | 2 raisedTo: n]) do:[:r | aMenu add: r printString action: r].<br>
         sz := aMenu startUp.<br>
         sz ifNil: [^ self].<br>
+        self fftSize: sz.!<br>
-        on := soundInput isRecording.<br>
-        self stop.<br>
-        fft := FFT new: sz.<br>
-        self resetDisplay.<br>
-        on ifTrue: [self start].<br>
- !<br>
<br>
Item was changed:<br>
  ----- Method: SyntaxMorph class>>setSize:andMakeResizable: (in category 'as yet unclassified') -----<br>
  setSize: oldExtent andMakeResizable: outerMorph<br>
         | tw |<br>
+        (tw := outerMorph findA: ScrollPane) ifNil: [^self].<br>
-        (tw := outerMorph findA: TwoWayScrollPane) ifNil: [^self].<br>
         tw hResizing: #spaceFill;<br>
                 vResizing: #spaceFill;<br>
                 color: Color transparent;<br>
                 setProperty: #hideUnneededScrollbars toValue: true.<br>
         outerMorph <br>
                 hResizing: #shrinkWrap;<br>
                 vResizing: #shrinkWrap;<br>
                 cellPositioning: #topLeft.<br>
         outerMorph fullBounds.<br>
  !<br>
<br>
Item was changed:<br>
  ----- Method: SyntaxMorph>>enclosingPane (in category 'accessing') -----<br>
  enclosingPane<br>
         "The object that owns this script layout"<br>
  <br>
         | oo higher |<br>
         oo := self owner.<br>
         [higher := oo isSyntaxMorph.<br>
         higher := higher or: [oo class == TransformMorph].<br>
+        higher := higher or: [oo class == ScrollPane].<br>
-        higher := higher or: [oo class == TwoWayScrollPane].<br>
         higher ifFalse: [^ oo].<br>
         higher] whileTrue: [oo := oo owner].<br>
  !<br>
<br>
Item was removed:<br>
- ----- Method: SyntaxMorph>>inAScrollPane (in category 'initialization') -----<br>
- inAScrollPane<br>
-        "Answer a scroll pane in which the receiver is scrollable"<br>
- <br>
-        ^ self inATwoWayScrollPane!<br>
<br>
Item was changed:<br>
  ----- Method: SyntaxMorph>>openInWindow (in category 'initialization') -----<br>
  openInWindow<br>
  <br>
+        | sel |<br>
-        | window widget sel |<br>
         sel := ''.<br>
         self firstSubmorph allMorphs do: [:rr | <br>
+                (rr isKindOf: StringMorph) ifTrue: [sel := sel, rr contents]].<br>
-                        (rr isKindOf: StringMorph) ifTrue: [sel := sel, rr contents]].<br>
-        window := (SystemWindow labelled: 'Tiles for ', self parsedInClass printString, '>>',sel).<br>
-        widget := self inAScrollPane.<br>
-        widget color: Color paleOrange.<br>
-        window<br>
-                addMorph: widget<br>
-                frame: (0@0 extent: 1.0@1.0).<br>
-        window openInWorldExtent: (<br>
-                self extent + (20@40) min: (Display boundingBox extent * 0.8) rounded<br>
-        )<br>
  <br>
+        ^ self inAScrollPane<br>
+                color: Color paleOrange;<br>
+                openInWindowLabeled: 'Tiles for ', self parsedInClass printString, '>>', sel!<br>
- !<br>
<br>
Item was added:<br>
+ ----- Method: SyntaxMorph>>parseNodeWith:asStatement: (in category '*Etoys-Squeakland-code generation') -----<br>
+ parseNodeWith: encoder asStatement: aBoolean<br>
+ <br>
+        ^ self parseNode!<br>
<br>
Item was changed:<br>
  ----- Method: SyntaxMorph>>unhighlightBorder (in category 'highlighting') -----<br>
  unhighlightBorder<br>
  <br>
         self currentSelectionDo: [:innerMorph :mouseDownLoc :outerMorph |<br>
+                (self == outerMorph or: [owner notNil and: [owner isSyntaxMorph not]])<br>
+                        ifFalse: [self borderColor: self stdBorderColor]<br>
+                        ifTrue: [<br>
+                                (self hasProperty: #deselectedBorderColor)<br>
+                                        ifTrue: [self borderColor: (self valueOfProperty: #deselectedBorderColor)]<br>
+                                        ifFalse: [self borderStyle: (BorderStyle raised width: self borderWidth)]] ].!<br>
-                self borderColor: (<br>
-                        (self == outerMorph or: [owner notNil and: [owner isSyntaxMorph not]])<br>
-                                ifFalse: [self borderColor: self stdBorderColor]<br>
-                                ifTrue: [<br>
-                                        (self hasProperty: #deselectedBorderColor)<br>
-                                                ifTrue: [self borderColor: (self valueOfProperty: #deselectedBorderColor)]<br>
-                                                ifFalse: [self borderStyle: (BorderStyle raised width: self borderWidth)]] )].!<br>
<br>
Item was changed:<br>
  ----- Method: TileMorph>>wrapPhraseInFunction (in category '*Etoys-Squeakland-arrows') -----<br>
  wrapPhraseInFunction<br>
         "The user made a gesture requesting that the phrase for which the receiver bears the widget hit be wrapped in a function.  This applies for the moment only to numeric functions"<br>
  <br>
         | pad newPad functionPhrase |<br>
         pad := self ownerThatIsA: TilePadMorph.  "Or something higher than that???"<br>
         (pad isNil or: [pad type ~= #Number]) ifTrue: [^ Beeper beep].<br>
         newPad := TilePadMorph new setType: #Number.<br>
+        newPad hResizing: #shrinkWrap; vResizing: #spaceFill.<br>
-        newPad hResizing: #shrinkWrap; vResizing: #spacefill.<br>
         functionPhrase := FunctionTile new.<br>
         newPad addMorphBack: functionPhrase.<br>
         pad owner replaceSubmorph: pad by: newPad.<br>
         functionPhrase operator: #abs pad: pad.<br>
         functionPhrase addSuffixArrow.<br>
         self scriptEdited<br>
  !<br>
<br>
Item was changed:<br>
  ----- Method: TilePadMorph>>wrapInFunction (in category '*Etoys-Squeakland-miscellaneous') -----<br>
  wrapInFunction<br>
         "The user made a gesture requesting that the receiver be wrapped in a (numeric) function."<br>
  <br>
         | newPad functionPhrase |<br>
         newPad := TilePadMorph new setType: #Number.<br>
+        newPad hResizing: #shrinkWrap; vResizing: #spaceFill.<br>
-        newPad hResizing: #shrinkWrap; vResizing: #spacefill.<br>
         functionPhrase := FunctionTile new.<br>
         newPad addMorphBack: functionPhrase.<br>
         owner replaceSubmorph: self by: newPad.<br>
         functionPhrase operator: #abs pad: self.<br>
         self scriptEdited!<br>
<br>
Item was changed:<br>
  ----- Method: VariableNode>>asMorphicSyntaxIn: (in category '*Etoys-tiles') -----<br>
  asMorphicSyntaxIn: parent<br>
  <br>
         ^ parent addToken: self name<br>
                         type: #variable <br>
+                        on: self shallowCopy    "don't hand out the prototype!! See VariableNode>>initialize"<br>
-                        on: self clone  "don't hand out the prototype!! See VariableNode>>initialize"<br>
  !<br>
<br>
Item was changed:<br>
+ ----- Method: WatchMorph class>>fontName:bgColor:centerColor: (in category 'instance creation') -----<br>
- ----- Method: WatchMorph class>>fontName:bgColor:centerColor: (in category 'as yet unclassified') -----<br>
  fontName: aString bgColor: aColor centerColor: otherColor<br>
         ^ self new<br>
                 fontName: aString;<br>
                 color: aColor;<br>
                 centerColor: otherColor!<br>
<br>
Item was changed:<br>
  ----- Method: WorldWindow class>>test2 (in category 'as yet unclassified') -----<br>
  test2<br>
         "WorldWindow test2."<br>
  <br>
         | window world scrollPane |<br>
         world := WiWPasteUpMorph newWorldForProject: nil.<br>
         window := (WorldWindow labelled: 'Scrollable World') model: world.<br>
+        window addMorph: (scrollPane := ScrollPane new model: world)<br>
-        window addMorph: (scrollPane := TwoWayScrollPane new model: world)<br>
                 frame: (0@0 extent: 1.0@1.0).<br>
         scrollPane scroller addMorph: world.<br>
         world hostWindow: window.<br>
         window openInWorld<br>
  !<br>
<br>
<br>
</div>
</span></span>
</div></blockquote>
                                        </div></body>