<body><div id="__MailbirdStyleContent" style="font-size: 10pt;font-family: Arial;color: #000000">
                                        <span style="font-size: 13.3333px">With Tools-mt.929, I put a simple workaround for this into Trunk.</span><div style="font-size: 13.3333px"><br></div><div style="font-size: 13.3333px">This topic needs further discussion as it adresses multiple concerns.</div><div style="font-size: 13.3333px"><br></div><div style="font-size: 13.3333px">Also see: <a href="http://forum.world.st/The-Inbox-Morphic-cmm-1615-mcz-td5109271.html"><span style="font-size: 10pt">http://forum.world.st/The-Inbox-Morphic-cmm-1615-mcz-td5109271.html</span></a> :-)</div><div style="font-size: 13.3333px"><br></div><div style="font-size: 13.3333px">Best,</div><div style="font-size: 13.3333px">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 02.01.2020 03:32:02 schrieb commits@source.squeak.org <commits@source.squeak.org>:</p><div style="font-family:Arial,Helvetica,sans-serif">Chris Muller uploaded a new version of Morphic to project The Inbox:<br>http://source.squeak.org/inbox/Morphic-cmm.1614.mcz<br><br>==================== Summary ====================<br><br>Name: Morphic-cmm.1614<br>Author: cmm<br>Time: 1 January 2020, 8:31:35.610123 pm<br>UUID: 563f11e4-b784-40b6-af72-03338e6069ad<br>Ancestors: Morphic-mt.1612<br><br>When a text selection cannot fit into its text pane, show its upper-left, rather than its lower-right, so stepping through code in a small window is possible.<br><br>=============== Diff against Morphic-mt.1612 ===============<br><br>Item was changed:<br>  ----- Method: PluggableTextMorph>>scrollSelectionIntoView: (in category 'editor access') -----<br>  scrollSelectionIntoView: event <br>        "Scroll my text into view. Due to line composition mechanism, we must never use the right of a character block because the lines last character block right value always comes from a global container and is *not* line specific."<br>+        self flag: #fixIntervalCache.<br>+        "mt: We should find a better design for discarding unused text editors in text morphs and restoring them on demand."<br>- <br>-   self flag: #fixIntervalCache. "mt: We should find a better design for discarding unused text editors in text morphs and restoring them on demand."<br>          selectionInterval := textMorph editor markIndex to: textMorph editor pointIndex - 1.<br>+         self scrollToShow:<br>+           (textMorph editor hasSelection<br>+                       ifTrue: [ textMorph editor startBlock topLeft corner: textMorph editor stopBlock bottomLeft ]<br>+                        ifFalse: [ textMorph editor startBlock withWidth: 1 ]).<br>-      <br>-     textMorph editor hasSelection<br>-                ifFalse: [self scrollToShow: (textMorph editor startBlock withWidth: 1)]<br>-             ifTrue: [<br>-                    self scrollToShow: (textMorph editor startBlock topLeft corner: textMorph editor stopBlock bottomLeft).<br>-                      self scrollToShow: (textMorph editor pointBlock withWidth: 1). "Ensure text cursor visibility."].<br>-          <br>      ^ true!<br><br>Item was changed:<br>  ----- Method: ScrollPane>>keyStroke: (in category 'event handling') -----<br>+ keyStroke: aKeyboardEvent<br>+         "If pane is not empty, let the last submorph handle the event."<br>+    scroller submorphs ifNotEmpty: [ : subs | subs last keyStroke: aKeyboardEvent ]!<br>- keyStroke: evt<br>-   "If pane is not empty, pass the event to the last submorph,<br>-   assuming it is the most appropriate recipient (!!)"<br>- <br>-         scroller submorphs last keyStroke: evt!<br><br>Item was changed:<br>  ----- Method: ScrollPane>>offsetToShow: (in category 'scrolling') -----<br>  offsetToShow: aRectangle<br>     "Calculate the offset necessary to show the rectangle."<br>     <br>      | offset scrollRange target |<br>         self fullBounds. "We need updated bounds."<br>          offset := scroller offset.<br>    scrollRange := self hTotalScrollRange @ self vTotalScrollRange.<br>       <br>      "Normalize the incoming rectangle."<br>         target := <br>+           aRectangle left @ aRectangle top<br>-                     (scroller width < arectangle=""><br>-                             ifTrue: [offset x < arectangle="" left="" "coming="" from=""><br>-                                     ifTrue: [aRectangle right - scroller width]<br>-                                  ifFalse: [aRectangle left]]<br>-                          ifFalse: [aRectangle left])<br>-          @<br>-                    (scroller height < arectangle=""><br>-                            ifTrue: [offset y < arectangle="" top="" "coming="" from=""><br>-                                      ifTrue: [aRectangle bottom - scroller height]<br>-                                        ifFalse: [aRectangle top]]<br>-                           ifFalse: [aRectangle top])<br>            corner: <br>                      (scroller width < arectangle=""><br>                              ifTrue: [offset x + scroller width > aRectangle right "Coming from right?"<br>                                       ifTrue: [aRectangle left + scroller width]<br>                                    ifFalse: [aRectangle right]]<br>                                  ifFalse: [aRectangle right])<br>                  @<br>                     (scroller height < arectangle=""><br>                             ifTrue: [offset y + scroller height > aRectangle bottom "Coming from bottom?"<br>                                    ifTrue: [aRectangle top + scroller height]<br>                                    ifFalse: [aRectangle bottom]]<br>                                 ifFalse: [aRectangle bottom]).<br>  <br>    "Vertical Scrolling"<br>-       target top < offset=""><br>-              ifTrue: [offset := offset x @ target top].      <br>      target bottom > (offset y + scroller height)<br>               ifTrue: [offset := offset x @ (target bottom - scroller height)].<br>+    target top < offset=""><br>+              ifTrue: [offset := offset x @ target top].      <br>      <br>      "Horizontal Scrolling"<br>-     target left < offset=""><br>-             ifTrue: [offset := target left @ offset y].<br>   target right > (offset x + scroller width)<br>                 ifTrue: [offset := (target right - scroller width) @ offset y].<br>+      target left < offset=""><br>+             ifTrue: [offset := target left @ offset y].<br>  <br>       ^ (offset min: scrollRange - scroller extent) max: 0@0!<br><br><br></div></blockquote>
                                        </div></body>