[squeak-dev] The Inbox: Morphic-cmm.1616.mcz

Chris Muller asqueaker at gmail.com
Tue Jan 7 04:17:55 UTC 2020


Hi Marcel and Christoph,

After further thought the other day, I had arrived at the same concerns as
Christoph and you; and had this version sitting dirty in my image.  In
addition to yours, I myself also didn't care for passing the
non-well-formed Event object which the method might in the future couple to
beyond the type test.  Plus, the extra garbage.

All this is somewhat ameliorated in this edition, by simply allowing a
Symbolic "directive" to be passed in alternately from an Event object
(which would not be used even if it was).

This was done a few days ago.  Since then, Marcel submitted his workaround
in Tools which is fine for now, but I just wanted to capture this latest
version in the Inbox for future discussion rather than lose it.

Best,
  Chris

On Mon, Jan 6, 2020 at 10:08 PM <commits at source.squeak.org> wrote:

> Chris Muller uploaded a new version of Morphic to project The Inbox:
> http://source.squeak.org/inbox/Morphic-cmm.1616.mcz
>
> ==================== Summary ====================
>
> Name: Morphic-cmm.1616
> Author: cmm
> Time: 6 January 2020, 10:07:44.246015 pm
> UUID: d5855100-f308-4287-b83d-2e51c3b4688c
> Ancestors: Morphic-mt.1615
>
> When a text selection cannot fit into its text pane, start by scrolling to
> its upper-left, rather than its lower-right until the next edit is made, at
> which point scroll to the edit.
>
> =============== Diff against Morphic-mt.1615 ===============
>
> Item was changed:
>   ----- Method: PluggableTextMorph>>handleEdit: (in category 'editor
> access') -----
>   handleEdit: editBlock
>         | result |
>         textMorph editor selectFrom: selectionInterval first to:
> selectionInterval last;
>                                                 model: model.  "For, eg,
> evaluateSelection"
>         result := textMorph handleEdit: editBlock.   "Update selection
> after edit"
> +       self scrollSelectionIntoView: #scrollToPointBlock. "Special
> directive to scroll to text cursor"
> -       self scrollSelectionIntoView.
>         ^ result!
>
> Item was changed:
>   ----- Method: PluggableTextMorph>>scrollSelectionIntoView: (in category
> 'editor access') -----
> + scrollSelectionIntoView: eventOrDirective
> - scrollSelectionIntoView: event
>         "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."
> +       self flag: #fixIntervalCache.
> +       "mt: We should find a better design for discarding unused text
> editors in text morphs and restoring them on demand."
> -
> -       self flag: #fixIntervalCache. "mt: We should find a better design
> for discarding unused text editors in text morphs and restoring them on
> demand."
>         selectionInterval := textMorph editor markIndex to: textMorph
> editor pointIndex - 1.
> +       self scrollToShow:
> +               (textMorph editor hasSelection
> +                       ifTrue: [ textMorph editor startBlock topLeft
> corner: textMorph editor stopBlock bottomLeft ]
> +                       ifFalse: [ textMorph editor startBlock withWidth:
> 1 ]).
> +       (eventOrDirective notNil and: [ eventOrDirective =
> #scrollToPointBlock or: [ eventOrDirective isKeyboard ] ]) ifTrue:
> +               [ self scrollToShow: (textMorph editor pointBlock
> withWidth: 1) ].
> -
> -       textMorph editor hasSelection
> -               ifFalse: [self scrollToShow: (textMorph editor startBlock
> withWidth: 1)]
> -               ifTrue: [
> -                       self scrollToShow: (textMorph editor startBlock
> topLeft corner: textMorph editor stopBlock bottomLeft).
> -                       self scrollToShow: (textMorph editor pointBlock
> withWidth: 1). "Ensure text cursor visibility."].
> -
>         ^ true!
>
> Item was changed:
>   ----- Method: ScrollPane>>keyStroke: (in category 'event handling') -----
> + keyStroke: aKeyboardEvent
> +       "If pane is not empty, let the last submorph handle the event."
> +       scroller submorphs ifNotEmpty: [ : subs | subs last keyStroke:
> aKeyboardEvent ]!
> - keyStroke: evt
> -       "If pane is not empty, pass the event to the last submorph,
> -       assuming it is the most appropriate recipient (!!)"
> -
> -       scroller submorphs last keyStroke: evt!
>
> Item was changed:
>   ----- Method: ScrollPane>>offsetToShow: (in category 'scrolling') -----
>   offsetToShow: aRectangle
>         "Calculate the offset necessary to show the rectangle."
>
>         | offset scrollRange target |
>         self fullBounds. "We need updated bounds."
>         offset := scroller offset.
>         scrollRange := self hTotalScrollRange @ self vTotalScrollRange.
>
>         "Normalize the incoming rectangle."
>         target :=
> +               aRectangle left @ aRectangle top
> -                       (scroller width < aRectangle width
> -                               ifTrue: [offset x < aRectangle left
> "Coming from left?"
> -                                       ifTrue: [aRectangle right -
> scroller width]
> -                                       ifFalse: [aRectangle left]]
> -                               ifFalse: [aRectangle left])
> -               @
> -                       (scroller height < aRectangle height
> -                               ifTrue: [offset y < aRectangle top "Coming
> from top?"
> -                                       ifTrue: [aRectangle bottom -
> scroller height]
> -                                       ifFalse: [aRectangle top]]
> -                               ifFalse: [aRectangle top])
>                 corner:
>                         (scroller width < aRectangle width
>                                 ifTrue: [offset x + scroller width >
> aRectangle right "Coming from right?"
>                                         ifTrue: [aRectangle left +
> scroller width]
>                                         ifFalse: [aRectangle right]]
>                                 ifFalse: [aRectangle right])
>                 @
>                         (scroller height < aRectangle height
>                                 ifTrue: [offset y + scroller height >
> aRectangle bottom "Coming from bottom?"
>                                         ifTrue: [aRectangle top + scroller
> height]
>                                         ifFalse: [aRectangle bottom]]
>                                 ifFalse: [aRectangle bottom]).
>
>         "Vertical Scrolling"
> -       target top < offset y
> -               ifTrue: [offset := offset x @ target top].
>         target bottom > (offset y + scroller height)
>                 ifTrue: [offset := offset x @ (target bottom - scroller
> height)].
> +       target top < offset y
> +               ifTrue: [offset := offset x @ target top].
>
>         "Horizontal Scrolling"
> -       target left < offset x
> -               ifTrue: [offset := target left @ offset y].
>         target right > (offset x + scroller width)
>                 ifTrue: [offset := (target right - scroller width) @
> offset y].
> +       target left < offset x
> +               ifTrue: [offset := target left @ offset y].
>
>         ^ (offset min: scrollRange - scroller extent) max: 0 at 0!
>
> Item was changed:
>   ----- Method: TextMorphForEditView>>keyStroke: (in category 'event
> handling') -----
>   keyStroke: evt
>         | view |
>
>         editView deleteBalloon.
>         self editor model: editView model.  "For evaluateSelection"
>         view := editView.  "Copy into temp for case of a self-mutating
> doit"
>         (acceptOnCR and: [evt keyCharacter = Character cr])
>                 ifTrue: [^ self editor accept].
>
>         view hasUserEdited: false.
>         super keyStroke: evt.
> +       view scrollSelectionIntoView: evt.
> -       view scrollSelectionIntoView.
>
>         view hasUserEdited
>                 ifTrue: [       view textEdited: self contents].!
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20200106/d1861b56/attachment.html>


More information about the Squeak-dev mailing list