<body><div id="__MailbirdStyleContent" style="font-size: 12pt;font-family: Calibri;color: #000000">
                                        Hey Chris,<div><br></div><div>I committed two changes to Connectors and FSM to address the issues for 5.2alpha:</div><div><a href="http://www.squeaksource.com/Connectors/FSM-mt.47.mcz">http://www.squeaksource.com/Connectors/FSM-mt.47.mcz</a></div><div><a href="http://www.squeaksource.com/Connectors/Connectors-mt.208.mcz">http://www.squeaksource.com/Connectors/Connectors-mt.208.mcz</a></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 31.05.2018 07:21:18 schrieb Marcel Taeumel <marcel.taeumel@hpi.de>:</p><div id="__MailbirdStyleContent" style="font-size: 12pt;font-family: Calibri;color: #000000">
                                        Hey Chris,<div><br></div><div>both #layoutChanged and #changed MUST work for all morphs even if the morph is not in a world or has no owner. Please revert this change and fix NCAAConnectorMorph instad. Otherwise, this could break test code easily.</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 30.05.2018 23:51:51 schrieb commits@source.squeak.org <commits@source.squeak.org>:</p>Chris Muller uploaded a new version of Morphic to project The Trunk:<br>http://source.squeak.org/trunk/Morphic-cmm.1443.mcz<br><br>==================== Summary ====================<br><br>Name: Morphic-cmm.1443<br>Author: cmm<br>Time: 30 May 2018, 4:50:16.716113 pm<br>UUID: 2f269941-1afa-4615-9242-9e485ecd986e<br>Ancestors: Morphic-mt.1442<br><br>- When updating a borderStyle:, only signal changes if the receiver is in the world for them to be seen.  This fixes:<br>        NCAAConnectorMorph new<br>- When halo's are on a background Morph, and a foreground morph covering it is blue-clicked, transfer the halos to the clicked morph.<br>- Disable the new #balanceOffsets when Smart Splitters is enabled, unfortunately they currently don't play nicely together.<br><br>=============== Diff against Morphic-mt.1442 ===============<br><br>Item was changed:<br>  ----- Method: Morph>>borderStyle: (in category 'accessing') -----<br>  borderStyle: aBorderStyle<br>- <br>   aBorderStyle = self borderStyle ifTrue: [^ self].<br>-    <br>      "If we cannot draw the new border, accept at least its color and width."<br>    ((self canDrawBorder: aBorderStyle) or: [aBorderStyle isNil])<br>                 ifTrue: [self setProperty: #borderStyle toValue: aBorderStyle]<br>                ifFalse: [<br>                    self borderStyle<br>                              width: aBorderStyle width;<br>                            baseColor: aBorderStyle baseColor].<br>- <br>       self borderStyle trackColorFrom: self.<br>+       self isInWorld ifTrue:<br>+               [ self<br>+                       layoutChanged;<br>+                       changed ]!<br>- <br>-       self<br>-                 layoutChanged;<br>-               changed.!<br><br>Item was changed:<br>  ----- Method: PasteUpMorph>>tryInvokeHalo: (in category 'events-processing') -----<br>+ tryInvokeHalo: aUserInputEvent<br>+         "Invoke halos around the top-most world container at aUserInputEvent's #position.  If it was already halo'd, zero-in on its next inward component morph at that position.  Holding Shift during the click reverses this traversal order."<br>+  | stack target owners |<br>+      Preferences noviceMode ifTrue: [^self ].<br>+     Morph haloForAll ifFalse: [^self].<br>+   "the stack is the top-most morph to bottom-most."<br>+  stack := (self morphsAt: aUserInputEvent position unlocked: true) select: [ : each | each wantsHaloFromClick ].<br>+      stack ifEmpty: [^self].<br>+      target :=<br>+            aUserInputEvent hand halo<br>+                    ifNil: [ stack first ] <br>+                      ifNotNil:<br>+                            [ : existingHalo |<br>+                           stack allButFirst "halo's are always topmost on the stack"<br>+                                         detect: [ : each | each owner == self ]<br>+                                      ifFound:<br>+                                             [ : topMostWhereClicked |<br>+                                            (existingHalo target withAllOwners includes: topMostWhereClicked) <br>+                                                   ifTrue: [ "No invocation needed. Halo will handle transfer itself." ^self ] <br>+                                                       ifFalse:<br>+                                                             [ "Transfer halo to new world container."<br>+                                                          aUserInputEvent hand removeHalo. <br>+                                                            aUserInputEvent shiftPressed<br>+                                                                         ifTrue: [ stack second ]<br>+                                                                     ifFalse: [ topMostWhereClicked ] ]  ] <br>+                                       ifNone: ["Okay, invoke halos on the world." self ]  ].<br>+     "With a modifier, we want the innermost, otherwise the outermost."<br>+         owners := target withAllOwners select: [ : each | each wantsHaloFromClick ].<br>+         "the last owner is expected to be self."<br>+   target := aUserInputEvent shiftPressed ifTrue: [ owners first ] ifFalse: [ owners at: owners size-1 ifAbsent: [self] ].<br>+      "Now that we have the target, show the halo. Abort event dispatching, too, to avoid confusion."<br>+    aUserInputEvent hand newMouseFocus: target event: aUserInputEvent.<br>+   target invokeHaloOrMove: aUserInputEvent.<br>+    "aUserInputEvent has been consumed, don't let it cause any further side-effects."<br>+  aUserInputEvent ignore!<br>- tryInvokeHalo: anEvent<br>- <br>-        | innerMost target |<br>-         anEvent hand halo ifNotNil: [^ self "No invocation needed. Halo will handle transfer itself."].<br>-    Preferences noviceMode ifTrue: [^ self "No halo in novice mode."].<br>-         Morph haloForAll ifFalse: [^ self].<br>-  <br>-     innerMost := (self morphsAt: anEvent position unlocked: true) first.<br>-         <br>-     "1) Try to use innermost morph but skip all the ones that do not want to show a halo along the owner chain."<br>-       target := innerMost.<br>-         [target isNil or: [target wantsHaloFromClick]]<br>-               whileFalse: [target := target owner].<br>-        target ifNil: [^ self].<br>-      <br>-     "2) Without a modifier, which is normal, find the outermost container for that inner morph."<br>-       (innerMost == self or: [anEvent shiftPressed]) ifFalse: [<br>-            | previousTargets |<br>-          previousTargets := OrderedCollection new.<br>-            [target notNil and: [target owner ~~ self]] whileTrue: [<br>-                     previousTargets add: target.<br>-                         target := target owner].<br>-             target ifNil: [^ self].<br>-              [previousTargets isEmpty or: [target wantsHaloFromClick]] whileFalse: [<br>-                      target := previousTargets removeLast].<br>-               target wantsHaloFromClick ifFalse: [^ self]].<br>-                <br>-     "3) Now that we have the target, show the halo. Abort event dispatching, too, to avoid confusion."<br>-         anEvent hand newMouseFocus: target event: anEvent.<br>-   target invokeHaloOrMove: anEvent.<br>-    anEvent ignore.!<br><br>Item was changed:<br>  ----- Method: ProportionalSplitterMorph>>mouseUp: (in category 'events') -----<br>  mouseUp: anEvent <br>+   (self bounds containsPoint: anEvent cursorPoint) ifFalse: [ anEvent hand showTemporaryCursor: nil ].<br>+         self class fastSplitterResize ifTrue: [ self updateFromEvent: anEvent ].<br>+     traceMorph ifNotNil:<br>+                 [ traceMorph delete.<br>+                 traceMorph := nil ].<br>-         (self bounds containsPoint: anEvent cursorPoint)<br>-             ifFalse: [anEvent hand showTemporaryCursor: nil].<br>-    self class fastSplitterResize<br>-                ifTrue: [self updateFromEvent: anEvent].<br>-     traceMorph ifNotNil: [traceMorph delete. traceMorph := nil].<br>          self color: self getOldColor.<br>+        "balanceOffsets currently disrupts Smart Splitter behavior."<br>+       (ProportionalSplitterMorph smartVerticalSplitters or: [ ProportionalSplitterMorph smartHorizontalSplitters ]) ifFalse: [ self balanceOffsets ]!<br>- <br>-  self balanceOffsets!<br><br>Item was changed:<br>  ----- Method: ProportionalSplitterMorph>>step (in category 'events') -----<br>  step<br>         splitsTopAndBottom<br>            ifTrue: [ self reduceTopBottomImbalance ]<br>             ifFalse:<br>                      [ self reduceLeftRightImbalance abs > 1 ifTrue:<br>                            [ self splittersLeftDo:<br>                                       [ : splitter | splitter reduceLeftRightImbalance ].<br>                           self splittersRightDo:<br>+                                       [ : splitter | splitter reduceLeftRightImbalance ] ] ]!<br>-                                      [ : splitter | splitter reduceLeftRightImbalance ] ] ].<br>-      self balanceOffsets!<br><br><br>
                        </blockquote>
                                        </div>
                        </blockquote>
                                        </div></body>