<div dir="ltr"><div><div><div><div>Yes, this is really a dictatorial abuse of committer&#39;s right.<br>We have discussed on the mailing list, got minimal agreement on the goals.<br>It&#39;s fine but then someone has to do the job.</div>
</div>IMO this kind of stuff has to go into a sprint, otherwise it is never finished.<br><br>If we put a bunch of changes in the inbox with complex load order, I can tell you that this will hardly be reviewable.<br><div>Without dictatorship, this kind of change usually does not get integrated.<br>
</div>I
 wouldn&#39;t publish on Pharo slice/bug tracker for example, because when I have a bit complex change it often does not get integrated and the bug 
report stales (too hard to understand/review/code rots).<br>For example, see what happened to <a href="http://code.google.com/p/pharo/issues/detail?id=5406">http://code.google.com/p/pharo/issues/detail?id=5406</a><br><br>
And with the impulsion/support of tim that&#39;s different, we have at least four eyes.<br><br></div><div>Now, we have to cross fingers because, yes, it&#39;s more aggressive than usual.<br></div></div></div><div class="gmail_extra">
<br><br><div class="gmail_quote">2013/9/30 Chris Muller <span dir="ltr">&lt;<a href="mailto:asqueaker@gmail.com" target="_blank">asqueaker@gmail.com</a>&gt;</span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Yea, I was getting caught up after a week absent the list, saw your<br>
other commits and figured they were related.<br>
<br>
These paragraph bits are really complicated, yet crucial.  It feels a<br>
bit aggressive to go straight into trunk, as I agree with Tim&#39;s<br>
comment about peer review and peer testing.<br>
<br>
In any case, bravo to you two for braving this code and supporting the issues.<br>
<div class="HOEnZb"><div class="h5"><br>
On Mon, Sep 30, 2013 at 2:52 PM, Nicolas Cellier<br>
&lt;<a href="mailto:nicolas.cellier.aka.nice@gmail.com">nicolas.cellier.aka.nice@gmail.com</a>&gt; wrote:<br>
&gt; Ah yes, but it&#39;s a multiple .mcz saga whose goal is to:<br>
&gt; Remove the Multilingual specific classes for composing text layout.<br>
&gt;<br>
&gt; And this episode is specifically about removal of presentation as said...<br>
&gt; What is a presentation/presentationText/presentationLines ?<br>
&gt; It is an artifact containing precomposed unicode produced by some<br>
&gt; Multi*Scanner.<br>
&gt; Why to remove it?<br>
&gt; Because we can compose/display/scan decomposed unicode and recompose on the<br>
&gt; fly without exhibiting the artifact.<br>
&gt; But it yet remains to be implemented...<br>
&gt; Anyway, the feature was broken and deconnected some years ago, so it seems<br>
&gt; that we have time to re-think how to implement it.<br>
&gt;<br>
&gt; Generally it&#39;s a good thing to have self sufficient comments, so you are<br>
&gt; absolutely right.<br>
&gt; But sometimes there are long discussions associated in the mailing list<br>
&gt; which are hard to transcribe.<br>
&gt; A reference to a bug report containing some discussion could be a good thing<br>
&gt; in this case, ...<br>
&gt; ... but we&#39;re getting lazy and have a lighter trunk process for some years.<br>
&gt; Can we have the cake and eat it too?<br>
&gt; I know this is not a good excuse, but you must also consider that after 10<br>
&gt; commits on the same subject, the saturated commiter&#39;s mind is getting<br>
&gt; facetious ;)<br>
&gt; That&#39;s my case at least.<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt; 2013/9/30 Chris Muller &lt;<a href="mailto:asqueaker@gmail.com">asqueaker@gmail.com</a>&gt;<br>
&gt;&gt;<br>
&gt;&gt; These version comments are redundant with the code-diff; we can see<br>
&gt;&gt; that &#39;presenatation&#39; vars are being removed, so could you also please<br>
&gt;&gt; explain _why_ changes are being made in version comments?<br>
&gt;&gt;<br>
&gt;&gt; Is this a cleanup?  And may we expect no impact to any paragraph /<br>
&gt;&gt; text-editor behaviors?<br>
&gt;&gt;<br>
&gt;&gt; On Tue, Sep 24, 2013 at 3:40 PM,  &lt;<a href="mailto:commits@source.squeak.org">commits@source.squeak.org</a>&gt; wrote:<br>
&gt;&gt; &gt; Nicolas Cellier uploaded a new version of Morphic to project The Trunk:<br>
&gt;&gt; &gt; <a href="http://source.squeak.org/trunk/Morphic-nice.687.mcz" target="_blank">http://source.squeak.org/trunk/Morphic-nice.687.mcz</a><br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; ==================== Summary ====================<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; Name: Morphic-nice.687<br>
&gt;&gt; &gt; Author: nice<br>
&gt;&gt; &gt; Time: 24 September 2013, 10:40:04.266 pm<br>
&gt;&gt; &gt; UUID: a0a8b7f9-f0a3-4071-b95b-06124aa146a4<br>
&gt;&gt; &gt; Ancestors: Morphic-nice.686<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; Expunge presentation* from MultiNewParagraph &amp; MultiTextComposer.<br>
&gt;&gt; &gt; Also remove those methods same as super.<br>
&gt;&gt; &gt; Note the small difference in displaying method: NewPragraph has offset<br>
&gt;&gt; &gt; truncated.<br>
&gt;&gt; &gt; Prepare MultiNewParagraph funerals by mutating its instances -&gt;<br>
&gt;&gt; &gt; NewParagraph<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; =============== Diff against Morphic-nice.686 ===============<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; Item was changed:<br>
&gt;&gt; &gt;   NewParagraph subclass: #MultiNewParagraph<br>
&gt;&gt; &gt; +       instanceVariableNames: &#39;&#39;<br>
&gt;&gt; &gt; -       instanceVariableNames: &#39;presentationText presentationLines&#39;<br>
&gt;&gt; &gt;         classVariableNames: &#39;&#39;<br>
&gt;&gt; &gt;         poolDictionaries: &#39;TextConstants&#39;<br>
&gt;&gt; &gt;         category: &#39;Morphic-Multilingual&#39;!<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; Item was added:<br>
&gt;&gt; &gt; + ----- Method: MultiNewParagraph class&gt;&gt;initialize (in category &#39;class<br>
&gt;&gt; &gt; initialization&#39;) -----<br>
&gt;&gt; &gt; + initialize<br>
&gt;&gt; &gt; +       &quot;Prepare our own funeral&quot;<br>
&gt;&gt; &gt; +<br>
&gt;&gt; &gt; +       MultiNewParagraph allInstancesDo:[:mnp| mnp becomeForward: (mnp<br>
&gt;&gt; &gt; as: NewParagraph)]!<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; Item was removed:<br>
&gt;&gt; &gt; - ----- Method:<br>
&gt;&gt; &gt; MultiNewParagraph&gt;&gt;multiComposeLinesFrom:to:delta:into:priorLines:atY: (in<br>
&gt;&gt; &gt; category &#39;composition&#39;) -----<br>
&gt;&gt; &gt; - multiComposeLinesFrom: start to: stop delta: delta into: lineColl<br>
&gt;&gt; &gt; priorLines: priorLines<br>
&gt;&gt; &gt; -       atY: startingY<br>
&gt;&gt; &gt; -       &quot;While the section from start to stop has changed, composition<br>
&gt;&gt; &gt; may ripple all the way to the end of the text.  However in a rectangular<br>
&gt;&gt; &gt; container, if we ever find a line beginning with the same character as<br>
&gt;&gt; &gt; before (ie corresponding to delta in the old lines), then we can just copy<br>
&gt;&gt; &gt; the old lines from there to the end of the container, with adjusted indices<br>
&gt;&gt; &gt; and y-values&quot;<br>
&gt;&gt; &gt; -<br>
&gt;&gt; &gt; -       | newResult composer presentationInfo |<br>
&gt;&gt; &gt; -<br>
&gt;&gt; &gt; -       composer := MultiTextComposer new.<br>
&gt;&gt; &gt; -       presentationLines := nil.<br>
&gt;&gt; &gt; -       presentationText := nil.<br>
&gt;&gt; &gt; -       newResult := composer<br>
&gt;&gt; &gt; -               multiComposeLinesFrom: start<br>
&gt;&gt; &gt; -               to: stop<br>
&gt;&gt; &gt; -               delta: delta<br>
&gt;&gt; &gt; -               into: lineColl<br>
&gt;&gt; &gt; -               priorLines: priorLines<br>
&gt;&gt; &gt; -               atY: startingY<br>
&gt;&gt; &gt; -               textStyle: textStyle<br>
&gt;&gt; &gt; -               text: text<br>
&gt;&gt; &gt; -               container: container<br>
&gt;&gt; &gt; -               wantsColumnBreaks: wantsColumnBreaks == true.<br>
&gt;&gt; &gt; -       lines := newResult first asArray.<br>
&gt;&gt; &gt; -       maxRightX := newResult second.<br>
&gt;&gt; &gt; -       presentationInfo := composer getPresentationInfo.<br>
&gt;&gt; &gt; -       presentationLines := presentationInfo first asArray.<br>
&gt;&gt; &gt; -       presentationText := presentationInfo second.<br>
&gt;&gt; &gt; -       &quot;maxRightX printString displayAt: 0@0.&quot;<br>
&gt;&gt; &gt; -       ^maxRightX<br>
&gt;&gt; &gt; - !<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; Item was removed:<br>
&gt;&gt; &gt; - ----- Method: MultiNewParagraph&gt;&gt;presentationLines (in category<br>
&gt;&gt; &gt; &#39;accessing&#39;) -----<br>
&gt;&gt; &gt; - presentationLines<br>
&gt;&gt; &gt; -<br>
&gt;&gt; &gt; -       ^ presentationLines.<br>
&gt;&gt; &gt; - !<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; Item was removed:<br>
&gt;&gt; &gt; - ----- Method: MultiNewParagraph&gt;&gt;presentationText (in category<br>
&gt;&gt; &gt; &#39;accessing&#39;) -----<br>
&gt;&gt; &gt; - presentationText<br>
&gt;&gt; &gt; -<br>
&gt;&gt; &gt; -       ^ presentationText.<br>
&gt;&gt; &gt; - !<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; Item was changed:<br>
&gt;&gt; &gt;   TextComposer subclass: #MultiTextComposer<br>
&gt;&gt; &gt; +       instanceVariableNames: &#39;&#39;<br>
&gt;&gt; &gt; -       instanceVariableNames: &#39;presentation presentationLines&#39;<br>
&gt;&gt; &gt;         classVariableNames: &#39;&#39;<br>
&gt;&gt; &gt;         poolDictionaries: &#39;TextConstants&#39;<br>
&gt;&gt; &gt;         category: &#39;Morphic-Multilingual&#39;!<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; Item was removed:<br>
&gt;&gt; &gt; - ----- Method: MultiTextComposer&gt;&gt;composeEachRectangleIn: (in category<br>
&gt;&gt; &gt; &#39;as yet unclassified&#39;) -----<br>
&gt;&gt; &gt; - composeEachRectangleIn: rectangles<br>
&gt;&gt; &gt; -<br>
&gt;&gt; &gt; -       | myLine lastChar |<br>
&gt;&gt; &gt; -<br>
&gt;&gt; &gt; -       1 to: rectangles size do: [:i |<br>
&gt;&gt; &gt; -               currCharIndex &lt;= theText size ifFalse: [^false].<br>
&gt;&gt; &gt; -               myLine := scanner<br>
&gt;&gt; &gt; -                       composeFrom: currCharIndex<br>
&gt;&gt; &gt; -                       inRectangle: (rectangles at: i)<br>
&gt;&gt; &gt; -                       firstLine: isFirstLine<br>
&gt;&gt; &gt; -                       leftSide: i=1<br>
&gt;&gt; &gt; -                       rightSide: i=rectangles size.<br>
&gt;&gt; &gt; -               lines addLast: myLine.<br>
&gt;&gt; &gt; -               presentationLines addLast: scanner getPresentationLine.<br>
&gt;&gt; &gt; -               presentation ifNil: [presentation := scanner<br>
&gt;&gt; &gt; getPresentation]<br>
&gt;&gt; &gt; -                       ifNotNil: [presentation := presentation, scanner<br>
&gt;&gt; &gt; getPresentation].<br>
&gt;&gt; &gt; -               actualHeight := actualHeight max: myLine lineHeight.<br>
&gt;&gt; &gt; &quot;includes font changes&quot;<br>
&gt;&gt; &gt; -               currCharIndex := myLine last + 1.<br>
&gt;&gt; &gt; -               lastChar := theText at: myLine last.<br>
&gt;&gt; &gt; -               (CharacterSet crlf includes: lastChar) ifTrue: [^#cr].<br>
&gt;&gt; &gt; -               wantsColumnBreaks ifTrue: [<br>
&gt;&gt; &gt; -                       lastChar = TextComposer characterForColumnBreak<br>
&gt;&gt; &gt; ifTrue: [^#columnBreak].<br>
&gt;&gt; &gt; -               ].<br>
&gt;&gt; &gt; -       ].<br>
&gt;&gt; &gt; -       ^false!<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; Item was removed:<br>
&gt;&gt; &gt; - ----- Method: MultiTextComposer&gt;&gt;getPresentationInfo (in category &#39;as<br>
&gt;&gt; &gt; yet unclassified&#39;) -----<br>
&gt;&gt; &gt; - getPresentationInfo<br>
&gt;&gt; &gt; -<br>
&gt;&gt; &gt; -       ^ Array with: presentationLines with: presentation.<br>
&gt;&gt; &gt; - !<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; Item was changed:<br>
&gt;&gt; &gt;   ----- Method:<br>
&gt;&gt; &gt; MultiTextComposer&gt;&gt;multiComposeLinesFrom:to:delta:into:priorLines:atY:textStyle:text:container:wantsColumnBreaks:<br>
&gt;&gt; &gt; (in category &#39;as yet unclassified&#39;) -----<br>
&gt;&gt; &gt;   multiComposeLinesFrom: argStart to: argStop delta: argDelta into:<br>
&gt;&gt; &gt; argLinesCollection priorLines: argPriorLines atY: argStartY textStyle:<br>
&gt;&gt; &gt; argTextStyle text: argText container: argContainer wantsColumnBreaks:<br>
&gt;&gt; &gt; argWantsColumnBreaks<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;         wantsColumnBreaks := argWantsColumnBreaks.<br>
&gt;&gt; &gt;         lines := argLinesCollection.<br>
&gt;&gt; &gt; -       presentationLines := argLinesCollection copy.<br>
&gt;&gt; &gt;         theTextStyle := argTextStyle.<br>
&gt;&gt; &gt;         theText := argText.<br>
&gt;&gt; &gt;         theContainer := argContainer.<br>
&gt;&gt; &gt;         deltaCharIndex := argDelta.<br>
&gt;&gt; &gt;         currCharIndex := startCharIndex := argStart.<br>
&gt;&gt; &gt;         stopCharIndex := argStop.<br>
&gt;&gt; &gt;         prevLines := argPriorLines.<br>
&gt;&gt; &gt;         currentY := argStartY.<br>
&gt;&gt; &gt;         defaultLineHeight := theTextStyle lineGrid.<br>
&gt;&gt; &gt;         maxRightX := theContainer left.<br>
&gt;&gt; &gt;         possibleSlide := stopCharIndex &lt; theText size and: [theContainer<br>
&gt;&gt; &gt; isMemberOf: Rectangle].<br>
&gt;&gt; &gt;         nowSliding := false.<br>
&gt;&gt; &gt;         prevIndex := 1.<br>
&gt;&gt; &gt;         scanner := MultiCompositionScanner new text: theText textStyle:<br>
&gt;&gt; &gt; theTextStyle.<br>
&gt;&gt; &gt;         scanner wantsColumnBreaks: wantsColumnBreaks.<br>
&gt;&gt; &gt;         isFirstLine := true.<br>
&gt;&gt; &gt;         self composeAllLines.<br>
&gt;&gt; &gt;         isFirstLine ifTrue: [&quot;No space in container or empty text&quot;<br>
&gt;&gt; &gt;                 self<br>
&gt;&gt; &gt;                         addNullLineWithIndex: startCharIndex<br>
&gt;&gt; &gt;                         andRectangle: (theContainer topLeft extent:<br>
&gt;&gt; &gt; 0@defaultLineHeight)<br>
&gt;&gt; &gt;         ] ifFalse: [<br>
&gt;&gt; &gt;                 self fixupLastLineIfCR<br>
&gt;&gt; &gt;         ].<br>
&gt;&gt; &gt;         ^{lines asArray. maxRightX}<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;   !<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; Item was removed:<br>
&gt;&gt; &gt; - ----- Method: NewParagraph&gt;&gt;testNewComposeAll3 (in category<br>
&gt;&gt; &gt; &#39;composition&#39;) -----<br>
&gt;&gt; &gt; - testNewComposeAll3<br>
&gt;&gt; &gt; -       | newResult |<br>
&gt;&gt; &gt; -       newResult := TextComposer new<br>
&gt;&gt; &gt; -               multiComposeLinesFrom: firstCharacterIndex<br>
&gt;&gt; &gt; -               to: text size<br>
&gt;&gt; &gt; -               delta: 0<br>
&gt;&gt; &gt; -               into: OrderedCollection new<br>
&gt;&gt; &gt; -               priorLines: Array new<br>
&gt;&gt; &gt; -               atY: container top<br>
&gt;&gt; &gt; -               textStyle: textStyle<br>
&gt;&gt; &gt; -               text: text<br>
&gt;&gt; &gt; -               container: (0@0 extent: 31@60)<br>
&gt;&gt; &gt; -               wantsColumnBreaks: false.<br>
&gt;&gt; &gt; -       ^{newResult. {lines. maxRightX}}<br>
&gt;&gt; &gt; - !<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;<br>
&gt;&gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
<br>
</div></div></blockquote></div><br></div>