[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
|