[squeak-dev] [5.2a] styled text in a class comment spawns endless subscript out-of-bounds

Bob Arning arning315 at comcast.net
Thu Jul 5 12:21:14 UTC 2018


It's good to remember what startIndex/startBlock/selectionStart and 
stopIndex/stopBlock/selectionStop are used for. If you have a paragraph 
with two characters 'ab'

...and the 'a' is selected, then this is what the paragraph is thinking

selectionStart:     a CharacterBlock with index 1 and character $a and 
rectangle 3 at 0 corner: 11 at 18.0
  in a TextLine 1 to: 2
selectionStop:     a CharacterBlock with index 2 and character $b and 
rectangle 11 at 0 corner: 20 at 18.0
  in a TextLine 1 to: 2

...if the cursor is between 'a' and 'b' then this happens

selectionStart:     a CharacterBlock with index 2 and character $b and 
rectangle 11 at 0 corner: 20 at 18.0
  in a TextLine 1 to: 2
selectionStop:     a CharacterBlock with index 2 and character $b and 
rectangle 11 at 0 corner: 20 at 18.0
  in a TextLine 1 to: 2

So, in the first case, it can highlight from the topLeft of 
selectionStart to the bottomLeft of selectionStop. In the second case, 
since the two are equal, it just displays the cursor along the left edge 
of either.

In either case, the stopIndex is one more than last selected character and

selection
     "Answer the text in the paragraph that is currently selected."

     ^paragraph text copyFrom: self startIndex to: self stopIndex - 1

returns the selected characters.

On 7/5/18 7:17 AM, David T. Lewis wrote:
> On Thu, Jul 05, 2018 at 02:51:58PM +0530, K K Subbu wrote:
>> On Wednesday 04 July 2018 09:23 PM, David T. Lewis wrote:
>>> A clue that this might be accumulation of kludges: Looking at senders of
>>> selectInvisiblyFrom:to: (such as TextEditor>>addText:event:) shows a number
>>> of methods that subtract 1 from the stop index when before calling the
>>> method
>>> that adds 1 back to the stop index. This certainly does not have a good
>>> smell.
>> Looks like different intervals for dealing with selections and
>> substrings. I see that the names used are start/stop instead of
>> startIndex/stopIndex. I found this consistent pattern in all methods
>> that deal with selections.
>>
>>    stop = (stopIndex - 1)
>>    stopIndex = (stop + 1)
>>
>> Regular methods that deal with substrings like
>> AbstractFont>>#widthOString... and BitBlt>>#primDisplayString... and the
>> scanner methods iterate over aString with:
>>
>>     startIndex to: stopIndex
>>
>> while Editor>>selectionInterval extracts selections with startIndex to:
>> (stopIndex-1).
>>
>> Regards .. Subbu
>>
> Ah yes, that makes sense now. Thank you for the explanation.
>
> Dave
>   
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20180705/290d2921/attachment.html>


More information about the Squeak-dev mailing list