[squeak-dev] The Trunk: EToys-nice.292.mcz
Tobias Pape
Das.Linux at gmx.de
Sun Oct 8 21:33:44 UTC 2017
> On 08.10.2017, at 22:02, H. Hirzel <hannes.hirzel at gmail.com> wrote:
>
> Found out that probably the following fix has to be made in addition
>
> (see thread MorphicProject subclass: EtoysProject )
Or this:
SmartRefStream>>multiNewParagraphttfclpomsswfpp0
^ NewParagraph
But note that In Etoys MultiNewParagraph looks like this:
ProtoObject #()
Object #()
NewParagraph #('text' 'textStyle' 'firstCharacterIndex' 'container' 'lines' 'positionWhenComposed' 'offsetToEnd' 'maxRightX' 'selectionStart' 'selectionStop' 'wantsColumnBreaks' 'focused')
MultiNewParagraph #('presentationText' 'presentationLines')
While in Squeak5/trunk it looks like that:
ProtoObject #()
Object #()
NewParagraph #('text' 'textStyle' 'firstCharacterIndex' 'container' 'lines' 'positionWhenComposed' 'offsetToEnd' 'maxRightX' 'selectionStart' 'selectionStop' 'wantsColumnBreaks' 'focused' 'caretRect' 'showCaret' 'caretColor' 'selectionColor' 'unfocusedSelectionColor')
So 'presentationText' and 'presentationLines' will shadow 'caretRect' and 'showCaret'...
Best regards
-Tobias
>
>
> SmartRefStream>>initKnownRenames.
>
>
> OLD
> initKnownRenames
> renamed
> at: #FlasherMorph put: #Flasher;
> at: #AlansTextPlusMorph put: #TextPlusMorph;
> at: #Project put: #MorphicProject;
> at: #Presenter put: #EtoysPresenter;
> yourself
>
> Should probably be NEW
>
> initKnownRenames
> renamed
> at: #FlasherMorph put: #Flasher;
> at: #AlansTextPlusMorph put: #TextPlusMorph;
> at: #Project put: #MorphicProject;
> at: #Presenter put: #EtoysPresenter;
> at: #MultiNewParagraph put: #NewParagraph; "NEW NEW NEW"
> yourself
>
>
> On 10/5/17, Nicolas Cellier <nicolas.cellier.aka.nice at gmail.com> wrote:
>> Exactly!
>> Multilingual features have been merged back into regular classes, so we
>> don't need a fork anymore.
>>
>> 2017-10-05 21:03 GMT+02:00 H. Hirzel <hannes.hirzel at gmail.com>:
>>
>>> Note regarding the thread 'MorphicProject subclass: #EtoysProject'
>>>
>>> Answer 'NewParagraph' when asked for a replacement class for
>>> 'MultiNewParagraph'
>>>
>>> On Sat, 15 Apr 2017 13:45:33 0000, commits at source.squeak.org
>>> <commits at source.squeak.org> wrote:
>>>> Nicolas Cellier uploaded a new version of EToys to project The Trunk:
>>>> http://source.squeak.org/trunk/EToys-nice.292.mcz
>>>>
>>>> ==================== Summary ====================
>>>>
>>>> Name: EToys-nice.292
>>>> Author: nice
>>>> Time: 15 April 2017, 3:44:39.800437 pm
>>>> UUID: 39acfe15-791f-41c6-8aad-d679664643e7
>>>> Ancestors: EToys-eem.291
>>>>
>>>> Remove the Multi*Scanner, MultiNewParagraph, MultiComposer because they
>>> have
>>>> no additional value.
>>>>
>>>> =============== Diff against EToys-eem.291 ===============
>>>>
>>>> Item was changed:
>>>> SystemOrganization addCategory: #'Etoys-Buttons'!
>>>> SystemOrganization addCategory: #'Etoys-CustomEvents'!
>>>> SystemOrganization addCategory: #'Etoys-Experimental'!
>>>> SystemOrganization addCategory: #'Etoys-Outliner'!
>>>> SystemOrganization addCategory: #'Etoys-Protocols'!
>>>> SystemOrganization addCategory: #'Etoys-Protocols-Type Vocabularies'!
>>>> SystemOrganization addCategory: #'Etoys-Scripting'!
>>>> SystemOrganization addCategory: #'Etoys-Scripting Support'!
>>>> SystemOrganization addCategory: #'Etoys-Scripting Tiles'!
>>>> SystemOrganization addCategory: #'Etoys-Squeakland-BroomMorphs-Base'!
>>>> SystemOrganization addCategory:
>>>> #'Etoys-Squeakland-BroomMorphs-Connectors'!
>>>> SystemOrganization addCategory: #'Etoys-Squeakland-EToys-Kedama'!
>>>> SystemOrganization addCategory: #'Etoys-Squeakland-Etoys-Buttons'!
>>>> SystemOrganization addCategory: #'Etoys-Squeakland-Etoys-Calendar'!
>>>> SystemOrganization addCategory: #'Etoys-Squeakland-Etoys-Debugger'!
>>>> SystemOrganization addCategory: #'Etoys-Squeakland-Etoys-Help'!
>>>> SystemOrganization addCategory: #'Etoys-Squeakland-Etoys-Input'!
>>>> SystemOrganization addCategory: #'Etoys-Squeakland-Etoys-Scripting'!
>>>> SystemOrganization addCategory: #'Etoys-Squeakland-Etoys-Scripting
>>>> Support'!
>>>> SystemOrganization addCategory: #'Etoys-Squeakland-Etoys-Scripting
>>> Tiles'!
>>>> SystemOrganization addCategory: #'Etoys-Squeakland-Etoys-
>>> SpeechBubbles'!
>>>> SystemOrganization addCategory: #'Etoys-Squeakland-Etoys-Tile
>>> Scriptors'!
>>>> SystemOrganization addCategory:
>>>> #'Etoys-Squeakland-Graphics-External'!
>>>> SystemOrganization addCategory: #'Etoys-Squeakland-Graphics-Text'!
>>>> SystemOrganization addCategory:
>>>> #'Etoys-Squeakland-Graphics-Tools-Intersection'!
>>>> SystemOrganization addCategory:
>>>> #'Etoys-Squeakland-Graphics-Tools-Simplification'!
>>>> SystemOrganization addCategory:
>>>> #'Etoys-Squeakland-Graphics-Tools-Triangulation'!
>>>> SystemOrganization addCategory:
>>>> #'Etoys-Squeakland-MorphicExtras-AdditionalMorphs'!
>>>> SystemOrganization addCategory: #'Etoys-Squeakland-
>>> MorphicExtras-Charts'!
>>>> SystemOrganization addCategory:
>>>> #'Etoys-Squeakland-MorphicExtras-Postscript Filters'!
>>>> SystemOrganization addCategory: #'Etoys-Squeakland-
>>> MorphicExtras-WebCam'!
>>>> SystemOrganization addCategory: #'Etoys-Squeakland-
>>> MorphicExtras-Widgets'!
>>>> SystemOrganization addCategory: #'Etoys-Squeakland-Morphic-Basic'!
>>>> SystemOrganization addCategory: #'Etoys-Squeakland-Morphic-Books'!
>>>> SystemOrganization addCategory: #'Etoys-Squeakland-Morphic-
>>> Components'!
>>>> SystemOrganization addCategory: #'Etoys-Squeakland-Morphic-Demo'!
>>>> SystemOrganization addCategory: #'Etoys-Squeakland-Morphic-
>>> Experimental'!
>>>> SystemOrganization addCategory: #'Etoys-Squeakland-Morphic-Games'!
>>>> SystemOrganization addCategory: #'Etoys-Squeakland-Morphic-
>>> Games-Chess'!
>>>> SystemOrganization addCategory: #'Etoys-Squeakland-Morphic-GeeMail'!
>>>> SystemOrganization addCategory: #'Etoys-Squeakland-Morphic-Kernel'!
>>>> SystemOrganization addCategory:
>>>> #'Etoys-Squeakland-Morphic-Mentoring'!
>>>> SystemOrganization addCategory: #'Etoys-Squeakland-Morphic-
>>> Navigators'!
>>>> SystemOrganization addCategory: #'Etoys-Squeakland-Morphic-PartsBin'!
>>>> SystemOrganization addCategory: #'Etoys-Squeakland-Morphic-PDA'!
>>>> SystemOrganization addCategory: #'Etoys-Squeakland-Morphic-Support'!
>>>> SystemOrganization addCategory: #'Etoys-Squeakland-Morphic-Widgets'!
>>>> SystemOrganization addCategory: #'Etoys-Squeakland-Morphic-Windows'!
>>>> SystemOrganization addCategory: #'Etoys-Squeakland-Morphic-Worlds'!
>>>> SystemOrganization addCategory:
>>>> #'Etoys-Squeakland-Multilingual-Languages'!
>>>> - SystemOrganization addCategory: #'Etoys-Squeakland-
>>> Multilingual-Scanning'!
>>>> SystemOrganization addCategory:
>>>> #'Etoys-Squeakland-Multilingual-TextConversion'!
>>>> SystemOrganization addCategory:
>>>> #'Etoys-Squeakland-Network-HTML-Formatter'!
>>>> SystemOrganization addCategory: #'Etoys-Squeakland-Network-
>>> HTML-Forms'!
>>>> SystemOrganization addCategory: #'Etoys-Squeakland-Network-
>>> HTML-Parser'!
>>>> SystemOrganization addCategory:
>>>> #'Etoys-Squeakland-Network-HTML-Parser
>>>> Entities'!
>>>> SystemOrganization addCategory:
>>>> #'Etoys-Squeakland-Network-HTML-Tokenizer'!
>>>> SystemOrganization addCategory: #'Etoys-Squeakland-Network-MIME'!
>>>> SystemOrganization addCategory: #'Etoys-Squeakland-Network-TelNet
>>>> WordNet'!
>>>> SystemOrganization addCategory: #'Etoys-Squeakland-Network-UI'!
>>>> SystemOrganization addCategory: #'Etoys-Squeakland-Network-Url'!
>>>> SystemOrganization addCategory: #'Etoys-Squeakland-Protocols-Type
>>>> Vocabularies'!
>>>> SystemOrganization addCategory: #'Etoys-Squeakland-Sound-Interface'!
>>>> SystemOrganization addCategory: #'Etoys-Squeakland-Sound-Ogg'!
>>>> SystemOrganization addCategory: #'Etoys-Squeakland-Sound-Scores'!
>>>> SystemOrganization addCategory: #'Etoys-Squeakland-ST80-Morphic'!
>>>> SystemOrganization addCategory: #'Etoys-Squeakland-SUnit'!
>>>> SystemOrganization addCategory: #'Etoys-Squeakland-Sugar'!
>>>> SystemOrganization addCategory:
>>>> #'Etoys-Squeakland-System-Clipboard-Extended'!
>>>> SystemOrganization addCategory: #'Etoys-Squeakland-System-Compiler'!
>>>> SystemOrganization addCategory: #'Etoys-Squeakland-System-Exceptions
>>>> Kernel'!
>>>> SystemOrganization addCategory: #'Etoys-Squeakland-System-Support'!
>>>> SystemOrganization addCategory: #'Etoys-Squeakland-Tools-Changes'!
>>>> SystemOrganization addCategory: #'Etoys-Squeakland-Tools-Explorer'!
>>>> SystemOrganization addCategory: #'Etoys-Squeakland-Tools-File
>>>> Contents
>>>> Browser'!
>>>> SystemOrganization addCategory: #'Etoys-Squeakland-Tools-Process
>>> Browser'!
>>>> SystemOrganization addCategory:
>>>> #'Etoys-Squeakland-Tweak-Kedama-ObjectVectors'!
>>>> SystemOrganization addCategory:
>>>> #'Etoys-Squeakland-Tweak-Kedama-ParseTreeTransformer'!
>>>> SystemOrganization addCategory:
>>>> #'Etoys-Squeakland-Tweak-Kedama-ParseTree-AttributeDefinition'!
>>>> SystemOrganization addCategory: #'Etoys-Stacks'!
>>>> SystemOrganization addCategory: #'Etoys-StarSqueak'!
>>>> SystemOrganization addCategory: #'Etoys-Support'!
>>>> SystemOrganization addCategory: #'Etoys-Tests'!
>>>> SystemOrganization addCategory: #'Etoys-Tile Scriptors'!
>>>> SystemOrganization addCategory: #'Etoys-Widgets'!
>>>> SystemOrganization addCategory: #'Etoys-Squeakland-Support'!
>>>> SystemOrganization addCategory: #'Etoys-Squeakland-SISS-
>>> Serialization'!
>>>> SystemOrganization addCategory: #'Etoys-OLPC-Display'!
>>>> SystemOrganization addCategory: #'Etoys-ReleaseBuilder'!
>>>> SystemOrganization addCategory: #'Etoys-UserInterfaceTheme'!
>>>>
>>>> Item was removed:
>>>> - ----- Method:
>>>> GrafPort>>displayScannerForMulti:foreground:background:
>>> ignoreColorChanges:
>>>> (in category '*Etoys-Squeakland-accessing') -----
>>>> - displayScannerForMulti: para foreground: foreColor background:
>>> backColor
>>>> ignoreColorChanges: shadowMode
>>>> -
>>>> - ((para isMemberOf: MultiNewParagraph) or: [para text string
>>>> isByteString]) ifTrue: [
>>>> - ^ (MultiDisplayScanner new text: para presentationText
>>> textStyle: para
>>>> textStyle
>>>> - foreground: foreColor background:
>>> backColor fillBlt: self
>>>> - ignoreColorChanges: shadowMode)
>>>> - setPort: self clone
>>>> - ].
>>>> - ^ (DisplayScanner new text: para text textStyle: para textStyle
>>>> - foreground: foreColor background: backColor
>>> fillBlt: self
>>>> - ignoreColorChanges: shadowMode)
>>>> - setPort: self clone
>>>> - !
>>>>
>>>> Item was removed:
>>>> - MultiCharacterScanner subclass: #MultiCanvasCharacterScanner
>>>> - instanceVariableNames: 'canvas fillBlt foregroundColor runX
>>>> lineY'
>>>> - classVariableNames: ''
>>>> - poolDictionaries: ''
>>>> - category: 'Etoys-Squeakland-Multilingual-Scanning'!
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiCanvasCharacterScanner>>canvas: (in category
>>>> 'accessing') -----
>>>> - canvas: aCanvas
>>>> - "set the canvas to draw on"
>>>> - canvas ifNotNil: [ self inform: 'initializing twice!!' ].
>>>> - canvas := aCanvas!
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiCanvasCharacterScanner>>cr (in category 'stop
>>>> conditions') -----
>>>> - cr
>>>> - "When a carriage return is encountered, simply increment the
>>> pointer
>>>> - into the paragraph."
>>>> -
>>>> - lastIndex := lastIndex + 1.
>>>> - ^false!
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiCanvasCharacterScanner>>crossedX (in category
>>>> 'stop
>>>> conditions') -----
>>>> - crossedX
>>>> - "This condition will sometimes be reached 'legally' during
>>> display, when,
>>>> - for instance the space that caused the line to wrap actually
>>> extends over
>>>> - the right boundary. This character is allowed to display, even
>>> though it
>>>> - is technically outside or straddling the clipping ectangle since
>>> it is in
>>>> - the normal case not visible and is in any case appropriately
>>> clipped by
>>>> - the scanner."
>>>> -
>>>> - "self fillLeading."
>>>> - ^ true !
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiCanvasCharacterScanner>>
>>> displayLine:offset:leftInRun:
>>>> (in category 'scanning') -----
>>>> - displayLine: textLine offset: offset leftInRun: leftInRun
>>>> - | nowLeftInRun done startLoc startIndex stopCondition |
>>>> - "largely copied from DisplayScanner's routine"
>>>> -
>>>> - line := textLine.
>>>> - foregroundColor ifNil: [ foregroundColor := Color black ].
>>>> - leftMargin := (line leftMarginForAlignment: alignment) + offset
>>>> x.
>>>> -
>>>> - rightMargin := line rightMargin + offset x.
>>>> - lineY := line top + offset y.
>>>> - lastIndex := textLine first.
>>>> - leftInRun <= 0
>>>> - ifTrue: [self setStopConditions. "also sets the font"
>>>> - nowLeftInRun := text runLengthFor:
>>> lastIndex]
>>>> - ifFalse: [nowLeftInRun := leftInRun].
>>>> - runX := destX := leftMargin.
>>>> -
>>>> - runStopIndex := lastIndex + (nowLeftInRun - 1) min: line last.
>>>> - spaceCount := 0.
>>>> - done := false.
>>>> -
>>>> - [done] whileFalse: [
>>>> - "remember where this portion of the line starts"
>>>> - startLoc := destX at destY.
>>>> - startIndex := lastIndex.
>>>> -
>>>> - "find the end of this portion of the line"
>>>> - stopCondition := self scanCharactersFrom: lastIndex to:
>>> runStopIndex
>>>> - in: text string rightX:
>>> rightMargin stopConditions: stopConditions
>>>> - kern: kern "displaying:
>>> false".
>>>> -
>>>> - "display that portion of the line"
>>>> - canvas drawString: text string
>>>> - from: startIndex to: lastIndex
>>>> - at: startLoc
>>>> - font: font
>>>> - color: foregroundColor.
>>>> -
>>>> - "handle the stop condition"
>>>> - done := self perform: stopCondition
>>>> - ].
>>>> -
>>>> - ^runStopIndex - lastIndex!
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiCanvasCharacterScanner>>doesDisplaying (in
>>>> category
>>>> 'private') -----
>>>> - doesDisplaying
>>>> - ^false "it doesn't do displaying using copyBits"!
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiCanvasCharacterScanner>>endOfRun (in category
>>>> 'stop
>>>> conditions') -----
>>>> - endOfRun
>>>> - "The end of a run in the display case either means that there is
>>> actually
>>>> - a change in the style (run code) to be associated with the string
>>> or the
>>>> - end of this line has been reached."
>>>> - | runLength |
>>>> -
>>>> - lastIndex = line last ifTrue: [^true].
>>>> - runX := destX.
>>>> - runLength := text runLengthFor: (lastIndex := lastIndex + 1).
>>>> - runStopIndex := lastIndex + (runLength - 1) min: line last.
>>>> - self setStopConditions.
>>>> - ^ false!
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiCanvasCharacterScanner>>paddedSpace (in category
>>> 'stop
>>>> conditions') -----
>>>> - paddedSpace
>>>> - "Each space is a stop condition when the alignment is right
>>> justified.
>>>> - Padding must be added to the base width of the space according to
>>>> - which space in the line this space is and according to the amount
>>> of
>>>> - space that remained at the end of the line when it was composed."
>>>> -
>>>> - destX := destX + spaceWidth + (line justifiedPadFor: spaceCount).
>>>> -
>>>> - lastIndex := lastIndex + 1.
>>>> - ^ false!
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiCanvasCharacterScanner>>setFont (in category
>>> 'private')
>>>> -----
>>>> - setFont
>>>> - foregroundColor ifNil: [foregroundColor := Color black].
>>>> - super setFont.
>>>> - baselineY := lineY + line baseline.
>>>> - destY := baselineY - font ascent.!
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiCanvasCharacterScanner>>setStopConditions (in
>>> category
>>>> 'stop conditions') -----
>>>> - setStopConditions
>>>> - "Set the font and the stop conditions for the current run."
>>>> -
>>>> - self setFont.
>>>> - self setConditionArray: (textStyle alignment = Justified ifTrue:
>>>> [#paddedSpace]).
>>>> - !
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiCanvasCharacterScanner>>tab (in category 'stop
>>>> conditions') -----
>>>> - tab
>>>> -
>>>> - destX := (alignment == Justified and: [self leadingTab not])
>>>> - ifTrue: "imbedded tabs in justified text are
>>>> weird"
>>>> - [destX + (textStyle tabWidth - (line
>>> justifiedTabDeltaFor: spaceCount))
>>>> max: destX]
>>>> - ifFalse:
>>>> - [textStyle nextTabXFrom: destX
>>>> - leftMargin: leftMargin
>>>> - rightMargin: rightMargin].
>>>> -
>>>> - lastIndex := lastIndex + 1.
>>>> - ^ false!
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiCanvasCharacterScanner>>textColor: (in category
>>>> 'private') -----
>>>> - textColor: color
>>>> - foregroundColor := color!
>>>>
>>>> Item was removed:
>>>> - MultiCharacterScanner subclass: #MultiCharacterBlockScanner
>>>> - instanceVariableNames: 'characterPoint characterIndex
>>>> lastCharacter
>>>> lastCharacterExtent lastSpaceOrTabExtent nextLeftMargin specialWidth'
>>>> - classVariableNames: ''
>>>> - poolDictionaries: ''
>>>> - category: 'Etoys-Squeakland-Multilingual-Scanning'!
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiCharacterBlockScanner>>buildCharacterBlockIn: (in
>>>> category 'private') -----
>>>> - buildCharacterBlockIn: para
>>>> - | lineIndex runLength lineStop done stopCondition |
>>>> - "handle nullText"
>>>> - (para numberOfLines = 0 or: [text size = 0])
>>>> - ifTrue: [^ CharacterBlock new stringIndex: 1 "like being
>>> off end of
>>>> string"
>>>> - text: para text
>>>> - topLeft: (para
>>> leftMarginForDisplayForLine: 1 alignment: (alignment
>>>> ifNil:[textStyle alignment]))
>>>> - @ para
>>> compositionRectangle top
>>>> - extent: 0 @ textStyle lineGrid].
>>>> - "find the line"
>>>> - lineIndex := para lineIndexOfTop: characterPoint y.
>>>> - destY := para topAtLineIndex: lineIndex.
>>>> - line := para lines at: lineIndex.
>>>> - rightMargin := para rightMarginForDisplay.
>>>> -
>>>> - (lineIndex = para numberOfLines and:
>>>> - [(destY + line lineHeight) < characterPoint y])
>>>> - ifTrue: ["if beyond lastLine, force search to
>>>> last
>>> character"
>>>> - self characterPointSetX:
>>> rightMargin]
>>>> - ifFalse: [characterPoint y < (para
>>> compositionRectangle) top
>>>> - ifTrue: ["force search to
>>> first line"
>>>> -
>>> characterPoint := (para compositionRectangle) topLeft].
>>>> - characterPoint x > rightMargin
>>>> - ifTrue: [self
>>> characterPointSetX: rightMargin]].
>>>> - destX := (leftMargin := para leftMarginForDisplayForLine:
>>>> lineIndex
>>>> alignment: (alignment ifNil:[textStyle alignment])).
>>>> - nextLeftMargin := para leftMarginForDisplayForLine: lineIndex+1
>>>> alignment: (alignment ifNil:[textStyle alignment]).
>>>> - lastIndex := line first.
>>>> -
>>>> - self setStopConditions. "also sets font"
>>>> - runLength := (text runLengthFor: line first).
>>>> - characterIndex == nil
>>>> - ifTrue: [lineStop := line last "characterBlockAtPoint"]
>>>> - ifFalse: [lineStop := characterIndex
>>> "characterBlockForIndex"].
>>>> - (runStopIndex := lastIndex + (runLength - 1)) > lineStop
>>>> - ifTrue: [runStopIndex := lineStop].
>>>> - lastCharacterExtent := 0 @ line lineHeight.
>>>> - spaceCount := 0. done := false.
>>>> - self handleIndentation.
>>>> -
>>>> - [done]
>>>> - whileFalse:
>>>> - [stopCondition := self scanCharactersFrom: lastIndex to:
>>> runStopIndex
>>>> - in: text string rightX: characterPoint x
>>>> - stopConditions: stopConditions kern: kern.
>>>> -
>>>> - "see setStopConditions for stopping conditions for character
>>>> block
>>>> operations."
>>>> - self lastCharacterExtentSetX: (font widthOf: (text at:
>>>> lastIndex)).
>>>> - (self perform: stopCondition) ifTrue:
>>>> - [characterIndex == nil
>>>> - ifTrue: ["characterBlockAtPoint"
>>>> - ^ CharacterBlock new stringIndex:
>>> lastIndex text: text
>>>> - topLeft: characterPoint +
>>> (font descentKern @ 0)
>>>> - extent:
>>> lastCharacterExtent]
>>>> - ifFalse: ["characterBlockForIndex"
>>>> - ^ CharacterBlock new stringIndex:
>>> lastIndex text: text
>>>> - topLeft: characterPoint +
>>> ((font descentKern) - kern @ 0)
>>>> - extent:
>>> lastCharacterExtent]]]!
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiCharacterBlockScanner>>characterBlockAtPoint:in:
>>> (in
>>>> category 'scanning') -----
>>>> - characterBlockAtPoint: aPoint in: aParagraph
>>>> - "Answer a CharacterBlock for character in aParagraph at point
>>> aPoint. It
>>>> - is assumed that aPoint has been transformed into coordinates
>>> appropriate
>>>> - to the text's destination form rectangle and the composition
>>> rectangle."
>>>> -
>>>> - self initializeFromParagraph: aParagraph clippedBy: aParagraph
>>>> clippingRectangle.
>>>> - characterPoint := aPoint.
>>>> - ^self buildCharacterBlockIn: aParagraph!
>>>>
>>>> Item was removed:
>>>> - ----- Method:
>>>> MultiCharacterBlockScanner>>characterBlockAtPoint:index:
>>> in:
>>>> (in category 'scanning') -----
>>>> - characterBlockAtPoint: aPoint index: index in: textLine
>>>> - "This method is the Morphic characterBlock finder. It combines
>>>> - MVC's characterBlockAtPoint:, -ForIndex:, and
>>> buildCharcterBlock:in:"
>>>> - | runLength lineStop done stopCondition |
>>>> - line := textLine.
>>>> - rightMargin := line rightMargin.
>>>> - lastIndex := line first.
>>>> - self setStopConditions. "also sets font"
>>>> - characterIndex := index. " == nil means scanning for point"
>>>> - characterPoint := aPoint.
>>>> - (characterPoint isNil or: [characterPoint y > line bottom])
>>>> - ifTrue: [characterPoint := line bottomRight].
>>>> - (text isEmpty or: [(characterPoint y < line top or:
>>> [characterPoint x <
>>>> line left])
>>>> - or: [characterIndex notNil and:
>>> [characterIndex < line first]]])
>>>> - ifTrue: [^ (CharacterBlock new stringIndex: line first
>>> text: text
>>>> - topLeft: line leftMargin at line top
>>> extent: 0 @ textStyle lineGrid)
>>>> - textLine: line].
>>>> - destX := leftMargin := line leftMarginForAlignment: alignment.
>>>> - destY := line top.
>>>> - runLength := text runLengthFor: line first.
>>>> - characterIndex
>>>> - ifNotNil: [lineStop := characterIndex "scanning
>>>> for
>>> index"]
>>>> - ifNil: [lineStop := line last "scanning for point"].
>>>> - runStopIndex := lastIndex + (runLength - 1) min: lineStop.
>>>> - lastCharacterExtent := 0 @ line lineHeight.
>>>> - spaceCount := 0.
>>>> -
>>>> - done := false.
>>>> - [done] whileFalse:
>>>> - [stopCondition := self scanCharactersFrom: lastIndex to:
>>> runStopIndex
>>>> - in: text string rightX: characterPoint x
>>>> - stopConditions: stopConditions kern: kern.
>>>> - "see setStopConditions for stopping conditions for
>>> character block
>>>> operations."
>>>> - self lastCharacterExtentSetX: (specialWidth
>>>> - ifNil: [font widthOf: (text at: lastIndex)]
>>>> - ifNotNil: [specialWidth]).
>>>> - (self perform: stopCondition) ifTrue:
>>>> - [characterIndex
>>>> - ifNil: [
>>>> - "Result for
>>>> characterBlockAtPoint:
>>> "
>>>> - (stopCondition ~~ #cr and: [
>>> lastIndex == line last
>>>> - and: [ aPoint x >
>>> ((characterPoint x) + (lastCharacterExtent x / 2))
>>>> ]])
>>>> - ifTrue: [
>>>> "Correct
>>> for right half of last character in line"
>>>> - ^
>>> (CharacterBlock new stringIndex: lastIndex + 1
>>>> -
>>> text: text
>>>> -
>>> topLeft: characterPoint + (lastCharacterExtent x @ 0) + (font
>>>> descentKern @ 0)
>>>> -
>>> extent: 0 @ lastCharacterExtent y)
>>>> -
>>> textLine: line ].
>>>> - ^ (CharacterBlock new
>>> stringIndex: lastIndex
>>>> - text: text
>>> topLeft: characterPoint + (font descentKern @ 0)
>>>> - extent:
>>> lastCharacterExtent - (font baseKern @ 0))
>>>> -
>>> textLine: line]
>>>> - ifNotNil: ["Result for
>>> characterBlockForIndex: "
>>>> - ^ (CharacterBlock new
>>> stringIndex: characterIndex
>>>> - text: text
>>> topLeft: characterPoint + ((font descentKern) - kern @
>>>> 0)
>>>> - extent:
>>> lastCharacterExtent)
>>>> -
>>> textLine: line]]]!
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiCharacterBlockScanner>>characterBlockForIndex:in:
>>> (in
>>>> category 'scanning') -----
>>>> - characterBlockForIndex: targetIndex in: aParagraph
>>>> - "Answer a CharacterBlock for character in aParagraph at
>>> targetIndex. The
>>>> - coordinates in the CharacterBlock will be appropriate to the
>>> intersection
>>>> - of the destination form rectangle and the composition rectangle."
>>>> -
>>>> - self
>>>> - initializeFromParagraph: aParagraph
>>>> - clippedBy: aParagraph clippingRectangle.
>>>> - characterIndex := targetIndex.
>>>> - characterPoint :=
>>>> - aParagraph rightMarginForDisplay @
>>>> - (aParagraph topAtLineIndex:
>>>> - (aParagraph lineIndexOfCharacterIndex:
>>> characterIndex)).
>>>> - ^self buildCharacterBlockIn: aParagraph!
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiCharacterBlockScanner>>characterPointSetX: (in
>>> category
>>>> 'private') -----
>>>> - characterPointSetX: xVal
>>>> - characterPoint := xVal @ characterPoint y!
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiCharacterBlockScanner>>cr (in category 'stop
>>>> conditions') -----
>>>> - cr
>>>> - "Answer a CharacterBlock that specifies the current location of
>>> the mouse
>>>> - relative to a carriage return stop condition that has just been
>>>> - encountered. The ParagraphEditor convention is to denote
>>> selections by
>>>> - CharacterBlocks, sometimes including the carriage return (cursor
>>> is at
>>>> - the end) and sometimes not (cursor is in the middle of the
>>>> text)."
>>>> -
>>>> - ((characterIndex ~= nil
>>>> - and: [characterIndex > text size])
>>>> - or: [(line last = text size)
>>>> - and: [(destY + line lineHeight) <
>>> characterPoint y]])
>>>> - ifTrue: ["When off end of string, give data for next
>>> character"
>>>> - destY := destY + line lineHeight.
>>>> - baselineY := line lineHeight.
>>>> - lastCharacter := nil.
>>>> - characterPoint := (nextLeftMargin ifNil:
>>> [leftMargin]) @ destY.
>>>> - lastIndex := lastIndex + 1.
>>>> - self lastCharacterExtentSetX: 0.
>>>> - ^ true].
>>>> - lastCharacter := CR.
>>>> - characterPoint := destX @ destY.
>>>> - self lastCharacterExtentSetX: rightMargin - destX.
>>>> - ^true!
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiCharacterBlockScanner>>crossedX (in category 'stop
>>>> conditions') -----
>>>> - crossedX
>>>> - "Text display has wrapping. The scanner just found a character
>>> past the x
>>>> - location of the cursor. We know that the cursor is pointing at a
>>>> character
>>>> - or before one."
>>>> -
>>>> - | leadingTab currentX |
>>>> - characterIndex == nil ifFalse: [
>>>> - "If the last character of the last line is a space,
>>>> - and it crosses the right margin, then locating
>>>> - the character block after it is impossible without this
>>> hack."
>>>> - characterIndex > text size ifTrue: [
>>>> - lastIndex := characterIndex.
>>>> - characterPoint := (nextLeftMargin ifNil:
>>> [leftMargin]) @ (destY + line
>>>> lineHeight).
>>>> - ^true]].
>>>> - characterPoint x <= (destX + (lastCharacterExtent x // 2))
>>>> - ifTrue: [lastCharacter := (text at: lastIndex).
>>>> - characterPoint := destX @ destY.
>>>> - ^true].
>>>> - lastIndex >= line last
>>>> - ifTrue: [lastCharacter := (text at: line last).
>>>> - characterPoint := destX @ destY.
>>>> - ^true].
>>>> -
>>>> - "Pointing past middle of a character, return the next character."
>>>> - lastIndex := lastIndex + 1.
>>>> - lastCharacter := text at: lastIndex.
>>>> - currentX := destX + lastCharacterExtent x + kern.
>>>> - self lastCharacterExtentSetX: (font widthOf: lastCharacter).
>>>> - characterPoint := currentX @ destY.
>>>> - lastCharacter = Space ifFalse: [^ true].
>>>> -
>>>> - "Yukky if next character is space or tab."
>>>> - alignment = Justified ifTrue:
>>>> - [self lastCharacterExtentSetX:
>>>> - (lastCharacterExtent x + (line
>>> justifiedPadFor: (spaceCount + 1))).
>>>> - ^ true].
>>>> -
>>>> - true ifTrue: [^ true].
>>>> - "NOTE: I find no value to the following code, and so have
>>> defeated it -
>>>> DI"
>>>> -
>>>> - "See tabForDisplay for illumination on the following awfulness."
>>>> - leadingTab := true.
>>>> - line first to: lastIndex - 1 do:
>>>> - [:index | (text at: index) ~= Tab ifTrue: [leadingTab :=
>>> false]].
>>>> - (alignment ~= Justified or: [leadingTab])
>>>> - ifTrue: [self lastCharacterExtentSetX: (textStyle
>>> nextTabXFrom: currentX
>>>> - leftMargin: leftMargin
>>> rightMargin: rightMargin) -
>>>> - currentX]
>>>> - ifFalse: [self lastCharacterExtentSetX:
>>> (((currentX + (textStyle
>>>> tabWidth -
>>>> - (line
>>> justifiedTabDeltaFor: spaceCount))) -
>>>> - currentX) max:
>>>> 0)].
>>>> - ^ true!
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiCharacterBlockScanner>>endOfRun (in category 'stop
>>>> conditions') -----
>>>> - endOfRun
>>>> - "Before arriving at the cursor location, the selection has
>>> encountered an
>>>> - end of run. Answer false if the selection continues, true
>>> otherwise. Set
>>>> - up indexes for building the appropriate CharacterBlock."
>>>> -
>>>> - | runLength lineStop |
>>>> - (((characterIndex ~~ nil and:
>>>> - [runStopIndex < characterIndex and: [runStopIndex < text
>>> size]])
>>>> - or: [characterIndex == nil and: [lastIndex <
>>> line last]]) or: [
>>>> - ((lastIndex < line last)
>>>> - and: [((text at: lastIndex) leadingChar
>>>> ~=
>>> (text at: lastIndex+1)
>>>> leadingChar)
>>>> - and: [lastIndex ~=
>>> characterIndex]])])
>>>> - ifTrue: ["We're really at the end of a real run."
>>>> - runLength := (text runLengthFor:
>>> (lastIndex := lastIndex + 1)).
>>>> - characterIndex ~~ nil
>>>> - ifTrue: [lineStop :=
>>> characterIndex "scanning for index"]
>>>> - ifFalse: [lineStop := line
>>> last "scanning for point"].
>>>> - (runStopIndex := lastIndex + (runLength -
>>> 1)) > lineStop
>>>> - ifTrue: [runStopIndex :=
>>> lineStop].
>>>> - self setStopConditions.
>>>> - ^false].
>>>> -
>>>> - lastCharacter := text at: lastIndex.
>>>> - characterPoint := destX @ destY.
>>>> - ((lastCharacter = Space and: [alignment = Justified])
>>>> - or: [lastCharacter = Tab and: [lastSpaceOrTabExtent
>>> notNil]])
>>>> - ifTrue: [lastCharacterExtent := lastSpaceOrTabExtent].
>>>> - characterIndex ~~ nil
>>>> - ifTrue: ["If scanning for an index and we've stopped on
>>> that index,
>>>> - then we back destX off by the width of
>>>> the
>>> character stopped on
>>>> - (it will be pointing at the right side of
>>> the character) and return"
>>>> - runStopIndex = characterIndex
>>>> - ifTrue: [self characterPointSetX:
>>> destX - lastCharacterExtent x.
>>>> - ^true].
>>>> - "Otherwise the requested index was
>>>> greater
>>> than the length of the
>>>> - string. Return string size + 1 as index,
>>> indicate further that off
>>>> the
>>>> - string by setting character to nil and
>>>> the
>>> extent to 0."
>>>> - lastIndex := lastIndex + 1.
>>>> - lastCharacter := nil.
>>>> - self lastCharacterExtentSetX: 0.
>>>> - ^true].
>>>> -
>>>> - "Scanning for a point and either off the end of the line or off
>>> the end
>>>> of the string."
>>>> - runStopIndex = text size
>>>> - ifTrue: ["off end of string"
>>>> - lastIndex := lastIndex + 1.
>>>> - lastCharacter := nil.
>>>> - self lastCharacterExtentSetX: 0.
>>>> - ^true].
>>>> - "just off end of line without crossing x"
>>>> - lastIndex := lastIndex + 1.
>>>> - ^true!
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiCharacterBlockScanner>>indentationLevel: (in
>>> category
>>>> 'scanning') -----
>>>> - indentationLevel: anInteger
>>>> - super indentationLevel: anInteger.
>>>> - nextLeftMargin := leftMargin.
>>>> - indentationLevel timesRepeat: [
>>>> - nextLeftMargin := textStyle nextTabXFrom: nextLeftMargin
>>>> - leftMargin: leftMargin
>>>> - rightMargin: rightMargin]!
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiCharacterBlockScanner>>lastCharacterExtentSetX:
>>>> (in
>>>> category 'private') -----
>>>> - lastCharacterExtentSetX: xVal
>>>> - lastCharacterExtent := xVal @ lastCharacterExtent y!
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiCharacterBlockScanner>>lastSpaceOrTabExtentSetX:
>>> (in
>>>> category 'private') -----
>>>> - lastSpaceOrTabExtentSetX: xVal
>>>> - lastSpaceOrTabExtent := xVal @ lastSpaceOrTabExtent y!
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiCharacterBlockScanner>>paddedSpace (in category
>>> 'stop
>>>> conditions') -----
>>>> - paddedSpace
>>>> - "When the line is justified, the spaces will not be the same as
>>>> the
>>>> font's
>>>> - space character. A padding of extra space must be considered in
>>> trying
>>>> - to find which character the cursor is pointing at. Answer whether
>>> the
>>>> - scanning has crossed the cursor."
>>>> -
>>>> - | pad |
>>>> - pad := 0.
>>>> - spaceCount := spaceCount + 1.
>>>> - pad := line justifiedPadFor: spaceCount.
>>>> - lastSpaceOrTabExtent := lastCharacterExtent copy.
>>>> - self lastSpaceOrTabExtentSetX: spaceWidth + pad.
>>>> - (destX + lastSpaceOrTabExtent x) >= characterPoint x
>>>> - ifTrue: [lastCharacterExtent := lastSpaceOrTabExtent
>>>> copy.
>>>> - ^self crossedX].
>>>> - lastIndex := lastIndex + 1.
>>>> - destX := destX + lastSpaceOrTabExtent x.
>>>> - ^ false
>>>> - !
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiCharacterBlockScanner>>placeEmbeddedObject: (in
>>>> category 'scanning') -----
>>>> - placeEmbeddedObject: anchoredMorph
>>>> - "Workaround: The following should really use #textAnchorType"
>>>> - anchoredMorph relativeTextAnchorPosition ifNotNil:[^true].
>>>> - (super placeEmbeddedObject: anchoredMorph) ifFalse: [^ false].
>>>> - specialWidth := anchoredMorph width.
>>>> - ^ true!
>>>>
>>>> Item was removed:
>>>> - ----- Method:
>>>> MultiCharacterBlockScanner>>scanMultiCharactersCombiningFr
>>> om:to:in:rightX:stopConditions:kern:
>>>> (in category 'scanning') -----
>>>> - scanMultiCharactersCombiningFrom: startIndex to: stopIndex in:
>>>> sourceString rightX: rightX stopConditions: stops kern: kernDelta
>>>> -
>>>> - | encoding f nextDestX maxAscii startEncoding char charValue |
>>>> - lastIndex := startIndex.
>>>> - lastIndex > stopIndex ifTrue: [lastIndex := stopIndex. ^ stops
>>>> at:
>>>> EndOfRun].
>>>> - startEncoding := (sourceString at: startIndex) leadingChar.
>>>> - font ifNil: [font := (TextConstants at: #DefaultMultiStyle)
>>> fontArray at:
>>>> 1].
>>>> - ((font isMemberOf: StrikeFontSet) or: [font isKindOf:
>>>> TTCFontSet])
>>>> ifTrue: [
>>>> - [f := font fontArray at: startEncoding + 1]
>>>> - on: Exception do: [:ex | f := font fontArray at:
>>> 1].
>>>> - f ifNil: [ f := font fontArray at: 1].
>>>> - maxAscii := f maxAscii.
>>>> - spaceWidth := f widthOf: Space.
>>>> - ] ifFalse: [
>>>> - maxAscii := font maxAscii.
>>>> - ].
>>>> -
>>>> - [lastIndex <= stopIndex] whileTrue: [
>>>> - encoding := (sourceString at: lastIndex) leadingChar.
>>>> - encoding ~= startEncoding ifTrue: [lastIndex := lastIndex
>>> - 1. ^ stops
>>>> at: EndOfRun].
>>>> - char := (sourceString at: lastIndex).
>>>> - charValue := char charCode.
>>>> - charValue > maxAscii ifTrue: [charValue := maxAscii].
>>>> - (encoding = 0 and: [(stopConditions at: charValue + 1) ~~
>>> nil]) ifTrue:
>>>> [
>>>> - ^ stops at: charValue + 1
>>>> - ].
>>>> - nextDestX := destX + (self widthOf: char inFont: font).
>>>> - nextDestX > rightX ifTrue: [^ stops at: CrossedX].
>>>> - destX := nextDestX + kernDelta.
>>>> - lastIndex := lastIndex + 1.
>>>> - ].
>>>> - lastIndex := stopIndex.
>>>> - ^ stops at: EndOfRun!
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiCharacterBlockScanner>>setFont (in category 'stop
>>>> conditions') -----
>>>> - setFont
>>>> - specialWidth := nil.
>>>> - super setFont!
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiCharacterBlockScanner>>setStopConditions (in
>>> category
>>>> 'stop conditions') -----
>>>> - setStopConditions
>>>> - "Set the font and the stop conditions for the current run."
>>>> -
>>>> - self setFont.
>>>> - self setConditionArray: (alignment = Justified ifTrue:
>>> [#paddedSpace]).
>>>> - !
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiCharacterBlockScanner>>tab (in category 'stop
>>>> conditions') -----
>>>> - tab
>>>> - | currentX |
>>>> - currentX := (alignment == Justified and: [self leadingTab not])
>>>> - ifTrue: "imbedded tabs in justified text are
>>>> weird"
>>>> - [destX + (textStyle tabWidth - (line
>>> justifiedTabDeltaFor: spaceCount))
>>>> max: destX]
>>>> - ifFalse:
>>>> - [textStyle
>>>> - nextTabXFrom: destX
>>>> - leftMargin: leftMargin
>>>> - rightMargin: rightMargin].
>>>> - lastSpaceOrTabExtent := lastCharacterExtent copy.
>>>> - self lastSpaceOrTabExtentSetX: (currentX - destX max: 0).
>>>> - currentX >= characterPoint x
>>>> - ifTrue:
>>>> - [lastCharacterExtent := lastSpaceOrTabExtent
>>>> copy.
>>>> - ^ self crossedX].
>>>> - destX := currentX.
>>>> - lastIndex := lastIndex + 1.
>>>> - ^false!
>>>>
>>>> Item was removed:
>>>> - Object subclass: #MultiCharacterScanner
>>>> - instanceVariableNames: 'destX lastIndex xTable destY
>>> stopConditions text
>>>> textStyle alignment leftMargin rightMargin font line runStopIndex
>>> spaceCount
>>>> spaceWidth emphasisCode kern indentationLevel wantsColumnBreaks
>>> presentation
>>>> presentationLine numOfComposition baselineY firstDestX'
>>>> - classVariableNames: 'DefaultStopConditions NilCondition
>>>> PaddedSpaceCondition SpaceCondition'
>>>> - poolDictionaries: 'TextConstants'
>>>> - category: 'Etoys-Squeakland-Multilingual-Scanning'!
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiCharacterScanner class>>initialize (in category
>>> 'class
>>>> initialization') -----
>>>> - initialize
>>>> - "
>>>> - MultiCharacterScanner initialize
>>>> - "
>>>> - | a |
>>>> - a := Array new: 258.
>>>> - a at: 1 + 1 put: #embeddedObject.
>>>> - a at: Tab asciiValue + 1 put: #tab.
>>>> - a at: CR asciiValue + 1 put: #cr.
>>>> - a at: EndOfRun put: #endOfRun.
>>>> - a at: CrossedX put: #crossedX.
>>>> - NilCondition := a copy.
>>>> - DefaultStopConditions := a copy.
>>>> -
>>>> - PaddedSpaceCondition := a copy.
>>>> - PaddedSpaceCondition at: Space asciiValue + 1 put: #paddedSpace.
>>>> -
>>>> - SpaceCondition := a copy.
>>>> - SpaceCondition at: Space asciiValue + 1 put: #space.
>>>> - !
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiCharacterScanner>>addCharToPresentation: (in
>>> category
>>>> 'multilingual scanning') -----
>>>> - addCharToPresentation: char
>>>> -
>>>> - !
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiCharacterScanner>>addEmphasis: (in category
>>> 'private')
>>>> -----
>>>> - addEmphasis: code
>>>> - "Set the bold-ital-under-strike emphasis."
>>>> - emphasisCode := emphasisCode bitOr: code!
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiCharacterScanner>>addKern: (in category 'private')
>>>> -----
>>>> - addKern: kernDelta
>>>> - "Set the current kern amount."
>>>> - kern := kern + kernDelta!
>>>>
>>>> Item was removed:
>>>> - ----- Method:
>>>> MultiCharacterScanner>>basicScanCharactersFrom:to:in:
>>> rightX:stopConditions:kern:
>>>> (in category 'scanning') -----
>>>> - basicScanCharactersFrom: startIndex to: stopIndex in: sourceString
>>> rightX:
>>>> rightX stopConditions: stops kern: kernDelta
>>>> - "Primitive. This is the inner loop of text display--but see
>>>> - scanCharactersFrom: to:rightX: which would get the string,
>>>> - stopConditions and displaying from the instance. March through
>>> source
>>>> - String from startIndex to stopIndex. If any character is flagged
>>> with a
>>>> - non-nil entry in stops, then return the corresponding value.
>>> Determine
>>>> - width of each character from xTable, indexed by map.
>>>> - If dextX would exceed rightX, then return stops at: 258.
>>>> - Advance destX by the width of the character. If stopIndex has
>>>> been
>>>> - reached, then return stops at: 257. Optional.
>>>> - See Object documentation whatIsAPrimitive."
>>>> - | ascii nextDestX char |
>>>> - <primitive: 103>
>>>> - lastIndex := startIndex.
>>>> - [lastIndex <= stopIndex]
>>>> - whileTrue:
>>>> - [char := (sourceString at: lastIndex).
>>>> - ascii := char asciiValue + 1.
>>>> - (stops at: ascii) == nil ifFalse: [^stops at:
>>> ascii].
>>>> - "Note: The following is querying the font about
>>> the width
>>>> - since the primitive may have failed due to a
>>> non-trivial
>>>> - mapping of characters to glyphs or a non-existing
>>> xTable."
>>>> - nextDestX := destX + (font widthOf: char).
>>>> - nextDestX > rightX ifTrue: [^stops at: CrossedX].
>>>> - destX := nextDestX + kernDelta.
>>>> - lastIndex := lastIndex + 1].
>>>> - lastIndex := stopIndex.
>>>> - ^stops at: EndOfRun!
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiCharacterScanner>>columnBreak (in category
>>> 'scanning')
>>>> -----
>>>> - columnBreak
>>>> -
>>>> - ^true!
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiCharacterScanner>>combinableChar:for: (in category
>>>> 'scanner methods') -----
>>>> - combinableChar: char for: prevEntity
>>>> -
>>>> - !
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiCharacterScanner>>embeddedObject (in category
>>>> 'scanning') -----
>>>> - embeddedObject
>>>> - | savedIndex |
>>>> - savedIndex := lastIndex.
>>>> - text attributesAt: lastIndex do:[:attr|
>>>> - attr anchoredMorph ifNotNil:[
>>>> - "Following may look strange but logic gets
>>> reversed.
>>>> - If the morph fits on this line we're not done
>>> (return false for true)
>>>> - and if the morph won't fit we're done (return
>>>> true
>>> for false)"
>>>> - (self placeEmbeddedObject: attr anchoredMorph)
>>> ifFalse:[^true]]].
>>>> - lastIndex := savedIndex + 1. "for multiple(!!) embedded morphs"
>>>> - ^false!
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiCharacterScanner>>handleIndentation (in category
>>>> 'scanning') -----
>>>> - handleIndentation
>>>> - self indentationLevel timesRepeat: [
>>>> - self plainTab]!
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiCharacterScanner>>indentationLevel (in category
>>>> 'scanning') -----
>>>> - indentationLevel
>>>> - "return the number of tabs that are currently being placed at the
>>>> beginning of each line"
>>>> - ^indentationLevel ifNil:[0]!
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiCharacterScanner>>indentationLevel: (in category
>>>> 'scanning') -----
>>>> - indentationLevel: anInteger
>>>> - "set the number of tabs to put at the beginning of each line"
>>>> - indentationLevel := anInteger!
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiCharacterScanner>>initialize (in category
>>> 'initialize')
>>>> -----
>>>> - initialize
>>>> - destX := destY := leftMargin := 0.!
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiCharacterScanner>>initializeFromParagraph:
>>> clippedBy:
>>>> (in category 'private') -----
>>>> - initializeFromParagraph: aParagraph clippedBy: clippingRectangle
>>>> -
>>>> - text := aParagraph text.
>>>> - textStyle := aParagraph textStyle.
>>>> - !
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiCharacterScanner>>initializeStringMeasurer (in
>>> category
>>>> 'initialize') -----
>>>> - initializeStringMeasurer
>>>> - stopConditions := Array new: 258.
>>>> - stopConditions at: CrossedX put: #crossedX.
>>>> - stopConditions at: EndOfRun put: #endOfRun.
>>>> - !
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiCharacterScanner>>isBreakableAt:in:in: (in
>>>> category
>>>> 'scanner methods') -----
>>>> - isBreakableAt: index in: sourceString in: encodingClass
>>>> -
>>>> - ^ encodingClass isBreakableAt: index in: sourceString.
>>>> - !
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiCharacterScanner>>leadingTab (in category
>>> 'scanning')
>>>> -----
>>>> - leadingTab
>>>> - "return true if only tabs lie to the left"
>>>> - line first to: lastIndex do:
>>>> - [:i | (text at: i) == Tab ifFalse: [^ false]].
>>>> - ^ true!
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiCharacterScanner>>measureString:inFont:from:to:
>>>> (in
>>>> category 'scanning') -----
>>>> - measureString: aString inFont: aFont from: startIndex to: stopIndex
>>>> - "WARNING: In order to use this method the receiver has to be set
>>> up using
>>>> #initializeStringMeasurer"
>>>> - destX := destY := lastIndex := 0.
>>>> - baselineY := aFont ascent.
>>>> - xTable := aFont xTable.
>>>> - font := aFont. " added Dec 03, 2004 "
>>>> - " map := aFont characterToGlyphMap."
>>>> - self scanCharactersFrom: startIndex to: stopIndex in: aString
>>> rightX:
>>>> 999999 stopConditions: stopConditions kern: 0.
>>>> - ^destX!
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiCharacterScanner>>placeEmbeddedObject: (in
>>>> category
>>>> 'scanning') -----
>>>> - placeEmbeddedObject: anchoredMorph
>>>> - "Place the anchoredMorph or return false if it cannot be placed.
>>>> - In any event, advance destX by its width."
>>>> - | w |
>>>> - "Workaround: The following should really use #textAnchorType"
>>>> - anchoredMorph relativeTextAnchorPosition ifNotNil:[^true].
>>>> - destX := destX + (w := anchoredMorph width).
>>>> - (destX > rightMargin and: [(leftMargin + w) <= rightMargin])
>>>> - ifTrue: ["Won't fit, but would on next line"
>>>> - ^ false].
>>>> - lastIndex := lastIndex + 1.
>>>> - self setFont. "Force recalculation of emphasis for next run"
>>>> - ^ true!
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiCharacterScanner>>plainTab (in category
>>>> 'scanning')
>>>> -----
>>>> - plainTab
>>>> - "This is the basic method of adjusting destX for a tab."
>>>> - destX := (alignment == Justified and: [self leadingTab not])
>>>> - ifTrue: "embedded tabs in justified text are
>>>> weird"
>>>> - [destX + (textStyle tabWidth - (line
>>> justifiedTabDeltaFor: spaceCount))
>>>> max: destX]
>>>> - ifFalse:
>>>> - [textStyle nextTabXFrom: destX
>>>> - leftMargin: leftMargin
>>>> - rightMargin: rightMargin]!
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiCharacterScanner>>registerBreakableIndex (in
>>> category
>>>> 'multilingual scanning') -----
>>>> - registerBreakableIndex
>>>> -
>>>> - "Record left x and character index of the line-wrappable point.
>>>> - The default implementation here does nothing."
>>>> -
>>>> - ^ false.
>>>> - !
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiCharacterScanner>>removeLastCharFromPresentation
>>> (in
>>>> category 'multilingual scanning') -----
>>>> - removeLastCharFromPresentation
>>>> - !
>>>>
>>>> Item was removed:
>>>> - ----- Method:
>>>> MultiCharacterScanner>>scanCharactersFrom:to:in:
>>> rightX:stopConditions:kern:
>>>> (in category 'scanning') -----
>>>> - scanCharactersFrom: startIndex to: stopIndex in: sourceString rightX:
>>>> rightX stopConditions: stops kern: kernDelta
>>>> -
>>>> - | startEncoding selector |
>>>> - (sourceString isByteString) ifTrue: [^ self
>>> basicScanCharactersFrom:
>>>> startIndex to: stopIndex in: sourceString rightX: rightX
>>>> stopConditions:
>>>> stops kern: kernDelta.].
>>>> -
>>>> - (sourceString isWideString) ifTrue: [
>>>> - startIndex > stopIndex ifTrue: [lastIndex := stopIndex. ^
>>> stops at:
>>>> EndOfRun].
>>>> - startEncoding := (sourceString at: startIndex)
>>> leadingChar.
>>>> - selector := EncodedCharSet scanSelectorAt: startEncoding.
>>>> - ^ self perform: selector withArguments: (Array with:
>>> startIndex with:
>>>> stopIndex with: sourceString with: rightX with: stopConditions with:
>>>> kernDelta).
>>>> - ].
>>>> -
>>>> - ^ stops at: EndOfRun
>>>> - !
>>>>
>>>> Item was removed:
>>>> - ----- Method:
>>>> MultiCharacterScanner>>scanJapaneseCharactersFrom:to:
>>> in:rightX:stopConditions:kern:
>>>> (in category 'scanner methods') -----
>>>> - scanJapaneseCharactersFrom: startIndex to: stopIndex in: sourceString
>>>> rightX: rightX stopConditions: stops kern: kernDelta
>>>> -
>>>> - | ascii encoding f nextDestX maxAscii startEncoding |
>>>> - lastIndex := startIndex.
>>>> - lastIndex > stopIndex ifTrue: [lastIndex := stopIndex. ^ stops
>>>> at:
>>>> EndOfRun].
>>>> - startEncoding := (sourceString at: startIndex) leadingChar.
>>>> - font ifNil: [font := (TextConstants at: #DefaultMultiStyle)
>>> fontArray at:
>>>> 1].
>>>> - ((font isMemberOf: StrikeFontSet) or: [font isKindOf:
>>>> TTCFontSet])
>>>> ifTrue: [
>>>> - [f := font fontArray at: startEncoding + 1]
>>>> - on: Exception do: [:ex | f := font fontArray at:
>>> 1].
>>>> - f ifNil: [ f := font fontArray at: 1].
>>>> - maxAscii := f maxAscii.
>>>> - "xTable := f xTable.
>>>> - maxAscii := xTable size - 2."
>>>> - spaceWidth := f widthOf: Space.
>>>> - ] ifFalse: [
>>>> - (font isMemberOf: HostFont) ifTrue: [
>>>> - f := font.
>>>> - maxAscii := f maxAscii.
>>>> - spaceWidth := f widthOf: Space.
>>>> - ] ifFalse: [
>>>> - maxAscii := font maxAscii.
>>>> - ].
>>>> - ].
>>>> - [lastIndex <= stopIndex] whileTrue: [
>>>> - "self halt."
>>>> - encoding := (sourceString at: lastIndex) leadingChar.
>>>> - encoding ~= startEncoding ifTrue: [lastIndex := lastIndex
>>> - 1. ^ stops
>>>> at: EndOfRun].
>>>> - ascii := (sourceString at: lastIndex) charCode.
>>>> - ascii > maxAscii ifTrue: [ascii := maxAscii].
>>>> - (encoding = 0 and: [(stopConditions at: ascii + 1) ~~
>>> nil]) ifTrue: [^
>>>> stops at: ascii + 1].
>>>> - (self isBreakableAt: lastIndex in: sourceString in:
>>> (EncodedCharSet
>>>> charsetAt: encoding)) ifTrue: [
>>>> - self registerBreakableIndex.
>>>> - ].
>>>> - nextDestX := destX + (font widthOf: (sourceString at:
>>> lastIndex)).
>>>> - nextDestX > rightX ifTrue: [firstDestX ~= destX ifTrue:
>>>> [^
>>> stops at:
>>>> CrossedX]].
>>>> - destX := nextDestX + kernDelta.
>>>> - lastIndex := lastIndex + 1.
>>>> - ].
>>>> - lastIndex := stopIndex.
>>>> - ^ stops at: EndOfRun!
>>>>
>>>> Item was removed:
>>>> - ----- Method:
>>>> MultiCharacterScanner>>scanMultiCharactersCombiningFrom:to:in:rightX:
>>> stopConditions:kern:
>>>> (in category 'scanner methods') -----
>>>> - scanMultiCharactersCombiningFrom: startIndex to: stopIndex in:
>>>> sourceString rightX: rightX stopConditions: stops kern: kernDelta
>>>> -
>>>> - | charCode encoding f maxAscii startEncoding combining combined
>>>> combiningIndex c |
>>>> - lastIndex := startIndex.
>>>> - lastIndex > stopIndex ifTrue: [lastIndex := stopIndex. ^ stops
>>>> at:
>>>> EndOfRun].
>>>> - startEncoding := (sourceString at: startIndex) leadingChar.
>>>> - font ifNil: [font := (TextConstants at: #DefaultMultiStyle)
>>> fontArray at:
>>>> 1].
>>>> - ((font isMemberOf: StrikeFontSet) or: [font isKindOf:
>>>> TTCFontSet])
>>>> ifTrue: [
>>>> - [f := font fontArray at: startEncoding + 1]
>>>> - on: Exception do: [:ex | f := font fontArray at:
>>> 1].
>>>> - f ifNil: [ f := font fontArray at: 1].
>>>> - maxAscii := f maxAscii.
>>>> - spaceWidth := font widthOf: Space.
>>>> - ] ifFalse: [
>>>> - maxAscii := font maxAscii.
>>>> - spaceWidth := font widthOf: Space.
>>>> - ].
>>>> -
>>>> - combining := nil.
>>>> - [lastIndex <= stopIndex] whileTrue: [
>>>> - charCode := (sourceString at: lastIndex) charCode.
>>>> - c := (sourceString at: lastIndex).
>>>> - combining ifNil: [
>>>> - combining := CombinedChar new.
>>>> - combining add: c.
>>>> - combiningIndex := lastIndex.
>>>> - lastIndex := lastIndex + 1.
>>>> - ] ifNotNil: [
>>>> - (combining add: c) ifFalse: [
>>>> - self addCharToPresentation: (combined :=
>>> combining combined).
>>>> - combining := CombinedChar new.
>>>> - combining add: c.
>>>> - charCode := combined charCode.
>>>> - encoding := combined leadingChar.
>>>> - encoding ~= startEncoding ifTrue:
>>> [lastIndex := lastIndex - 1.
>>>> - (encoding = 0 and:
>>> [(stopConditions at: charCode + 1) ~~ nil])
>>>> ifTrue: [
>>>> - ^ stops at: charCode + 1
>>>> - ] ifFalse: [
>>>> - ^ stops at: EndOfRun
>>>> - ].
>>>> - ].
>>>> - charCode > maxAscii ifTrue: [charCode :=
>>> maxAscii].
>>>> - ""
>>>> - (encoding = 0 and: [(stopConditions at:
>>> charCode + 1) ~~ nil]) ifTrue:
>>>> [
>>>> - combining ifNotNil: [
>>>> - self
>>> addCharToPresentation: (combining combined).
>>>> - ].
>>>> - ^ stops at: charCode + 1
>>>> - ].
>>>> - (self isBreakableAt: lastIndex in:
>>> sourceString in: Latin1Environment)
>>>> ifTrue: [
>>>> - self registerBreakableIndex.
>>>> - ].
>>>> - destX > rightX ifTrue: [
>>>> - destX ~= firstDestX ifTrue: [
>>>> - lastIndex :=
>>> combiningIndex.
>>>> - self
>>> removeLastCharFromPresentation.
>>>> - ^ stops at: CrossedX]].
>>>> - combiningIndex := lastIndex.
>>>> - lastIndex := lastIndex + 1.
>>>> - ] ifTrue: [
>>>> - lastIndex := lastIndex + 1.
>>>> - numOfComposition := numOfComposition + 1.
>>>> - ].
>>>> - ].
>>>> - ].
>>>> - lastIndex := stopIndex.
>>>> - combining ifNotNil: [
>>>> - combined := combining combined.
>>>> - self addCharToPresentation: combined.
>>>> - "assuming that there is always enough space for at least
>>> one character".
>>>> - destX := destX + (self widthOf: combined inFont: font).
>>>> - ].
>>>> - ^ stops at: EndOfRun!
>>>>
>>>> Item was removed:
>>>> - ----- Method:
>>>> MultiCharacterScanner>>scanMultiCharactersFrom:to:in:
>>> rightX:stopConditions:kern:
>>>> (in category 'scanning') -----
>>>> - scanMultiCharactersFrom: startIndex to: stopIndex in: sourceString
>>> rightX:
>>>> rightX stopConditions: stops kern: kernDelta
>>>> -
>>>> - | ascii encoding f nextDestX maxAscii startEncoding |
>>>> - lastIndex := startIndex.
>>>> - lastIndex > stopIndex ifTrue: [lastIndex := stopIndex. ^ stops
>>>> at:
>>>> EndOfRun].
>>>> - startEncoding := (sourceString at: startIndex) leadingChar.
>>>> - font ifNil: [font := (TextConstants at: #DefaultMultiStyle)
>>> fontArray at:
>>>> 1].
>>>> - ((font isMemberOf: StrikeFontSet) or: [font isKindOf:
>>>> TTCFontSet])
>>>> ifTrue: [
>>>> - [f := font fontArray at: startEncoding + 1]
>>>> - on: Exception do: [:ex | f := font fontArray at:
>>> 1].
>>>> - f ifNil: [ f := font fontArray at: 1].
>>>> - maxAscii := f maxAscii.
>>>> - spaceWidth := f widthOf: Space.
>>>> - ] ifFalse: [
>>>> - maxAscii := font maxAscii.
>>>> - ].
>>>> -
>>>> - [lastIndex <= stopIndex] whileTrue: [
>>>> - encoding := (sourceString at: lastIndex) leadingChar.
>>>> - encoding ~= startEncoding ifTrue: [lastIndex := lastIndex
>>> - 1. ^ stops
>>>> at: EndOfRun].
>>>> - ascii := (sourceString at: lastIndex) charCode.
>>>> - ascii > maxAscii ifTrue: [ascii := maxAscii].
>>>> - (encoding = 0 and: [ascii < stopConditions size and:
>>> [(stopConditions
>>>> at: ascii + 1) ~~ nil]]) ifTrue: [^ stops at: ascii + 1].
>>>> - (self isBreakableAt: lastIndex in: sourceString in:
>>> Latin1Environment)
>>>> ifTrue: [
>>>> - self registerBreakableIndex.
>>>> - ].
>>>> - nextDestX := destX + (font widthOf: (sourceString at:
>>> lastIndex)).
>>>> - nextDestX > rightX ifTrue: [destX ~= firstDestX ifTrue:
>>>> [^
>>> stops at:
>>>> CrossedX]].
>>>> - destX := nextDestX + kernDelta.
>>>> - lastIndex := lastIndex + 1.
>>>> - ].
>>>> - lastIndex := stopIndex.
>>>> - ^ stops at: EndOfRun!
>>>>
>>>> Item was removed:
>>>> - ----- Method:
>>>> MultiCharacterScanner>>scanMultiCharactersR2LFrom:to:
>>> in:rightX:stopConditions:kern:
>>>> (in category 'scanner methods') -----
>>>> - scanMultiCharactersR2LFrom: startIndex to: stopIndex in: sourceString
>>>> rightX: rightX stopConditions: stops kern: kernDelta
>>>> -
>>>> - "Note that 'rightX' really means 'endX' in R2L context. Ie.
>>> rightX is
>>>> usually smaller than destX."
>>>> - | ascii encoding f nextDestX maxAscii startEncoding |
>>>> - lastIndex := startIndex.
>>>> - lastIndex > stopIndex ifTrue: [lastIndex := stopIndex. ^ stops
>>>> at:
>>>> EndOfRun].
>>>> - startEncoding := (sourceString at: startIndex) leadingChar.
>>>> - font ifNil: [font := (TextConstants at: #DefaultMultiStyle)
>>> fontArray at:
>>>> 1].
>>>> - ((font isMemberOf: StrikeFontSet) or: [font isKindOf:
>>>> TTCFontSet])
>>>> ifTrue: [
>>>> - [f := font fontArray at: startEncoding + 1]
>>>> - on: Exception do: [:ex | f := font fontArray at:
>>> 1].
>>>> - f ifNil: [ f := font fontArray at: 1].
>>>> - maxAscii := f maxAscii.
>>>> - spaceWidth := f widthOf: Space.
>>>> - ] ifFalse: [
>>>> - maxAscii := font maxAscii.
>>>> - ].
>>>> -
>>>> - [lastIndex <= stopIndex] whileTrue: [
>>>> - encoding := (sourceString at: lastIndex) leadingChar.
>>>> - encoding ~= startEncoding ifTrue: [lastIndex := lastIndex
>>> - 1. ^ stops
>>>> at: EndOfRun].
>>>> - ascii := (sourceString at: lastIndex) charCode.
>>>> - ascii > maxAscii ifTrue: [ascii := maxAscii].
>>>> - (encoding = 0 and: [(stopConditions at: ascii + 1) ~~
>>> nil]) ifTrue: [^
>>>> stops at: ascii + 1].
>>>> - (self isBreakableAt: lastIndex in: sourceString in:
>>> Latin1Environment)
>>>> ifTrue: [
>>>> - self registerBreakableIndex.
>>>> - ].
>>>> - nextDestX := destX - (font widthOf: (sourceString at:
>>> lastIndex)).
>>>> - nextDestX < rightX ifTrue: [^ stops at: CrossedX].
>>>> - destX := nextDestX - kernDelta.
>>>> - lastIndex := lastIndex + 1.
>>>> - ].
>>>> - lastIndex := stopIndex.
>>>> - ^ stops at: EndOfRun!
>>>>
>>>> Item was removed:
>>>> - ----- Method:
>>>> MultiCharacterScanner>>scanSimChineseCharactersFrom:
>>> to:in:rightX:stopConditions:kern:
>>>> (in category 'scanner methods') -----
>>>> - scanSimChineseCharactersFrom: startIndex to: stopIndex in:
>>>> sourceString
>>>> rightX: rightX stopConditions: stops kern: kernDelta
>>>> -
>>>> - | ascii encoding f nextDestX maxAscii startEncoding |
>>>> - lastIndex := startIndex.
>>>> - lastIndex > stopIndex ifTrue: [lastIndex := stopIndex. ^ stops
>>>> at:
>>>> EndOfRun].
>>>> - startEncoding := (sourceString at: startIndex) leadingChar.
>>>> - font ifNil: [font := (TextConstants at: #DefaultMultiStyle)
>>> fontArray at:
>>>> 1].
>>>> - ((font isMemberOf: StrikeFontSet) or: [font isKindOf:
>>>> TTCFontSet])
>>>> ifTrue: [
>>>> - [f := font fontArray at: startEncoding + 1]
>>>> - on: Exception do: [:ex | f := font fontArray at:
>>> 1].
>>>> - f ifNil: [ f := font fontArray at: 1].
>>>> - maxAscii := f maxAscii.
>>>> - "xTable := f xTable.
>>>> - maxAscii := xTable size - 2."
>>>> - spaceWidth := f widthOf: Space.
>>>> - ] ifFalse: [
>>>> - (font isMemberOf: HostFont) ifTrue: [
>>>> - f := font.
>>>> - maxAscii := f maxAscii.
>>>> - spaceWidth := f widthOf: Space.
>>>> - ] ifFalse: [
>>>> - maxAscii := font maxAscii.
>>>> - ].
>>>> - ].
>>>> - [lastIndex <= stopIndex] whileTrue: [
>>>> - "self halt."
>>>> - encoding := (sourceString at: lastIndex) leadingChar.
>>>> - encoding ~= startEncoding ifTrue: [lastIndex := lastIndex
>>> - 1. ^ stops
>>>> at: EndOfRun].
>>>> - ascii := (sourceString at: lastIndex) charCode.
>>>> - ascii > maxAscii ifTrue: [ascii := maxAscii].
>>>> - (encoding = 0 and: [(stopConditions at: ascii + 1) ~~
>>> nil]) ifTrue: [^
>>>> stops at: ascii + 1].
>>>> - (self isBreakableAt: lastIndex in: sourceString in:
>>> (EncodedCharSet
>>>> charsetAt: encoding)) ifTrue: [
>>>> - self registerBreakableIndex.
>>>> - ].
>>>> - nextDestX := destX + (font widthOf: (sourceString at:
>>> lastIndex)).
>>>> - nextDestX > rightX ifTrue: [firstDestX ~= destX ifTrue:
>>>> [^
>>> stops at:
>>>> CrossedX]].
>>>> - destX := nextDestX + kernDelta.
>>>> - lastIndex := lastIndex + 1.
>>>> - ].
>>>> - lastIndex := stopIndex.
>>>> - ^ stops at: EndOfRun!
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiCharacterScanner>>setActualFont: (in category
>>>> 'private') -----
>>>> - setActualFont: aFont
>>>> - "Set the basal font to an isolated font reference."
>>>> -
>>>> - font := aFont!
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiCharacterScanner>>setAlignment: (in category
>>> 'private')
>>>> -----
>>>> - setAlignment: style
>>>> - alignment := style.
>>>> - !
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiCharacterScanner>>setConditionArray: (in category
>>>> 'private') -----
>>>> - setConditionArray: aSymbol
>>>> -
>>>> - aSymbol == #paddedSpace ifTrue: [^stopConditions :=
>>> PaddedSpaceCondition
>>>> "copy"].
>>>> - "aSymbol == #space ifTrue: [^stopConditions := SpaceCondition
>>> copy]."
>>>> - aSymbol == nil ifTrue: [^stopConditions := NilCondition "copy"].
>>>> - self error: 'undefined stopcondition for space character'.
>>>> - !
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiCharacterScanner>>setFont (in category 'private')
>>> -----
>>>> - setFont
>>>> - | priorFont |
>>>> - "Set the font and other emphasis."
>>>> - priorFont := font.
>>>> - text == nil ifFalse:[
>>>> - emphasisCode := 0.
>>>> - kern := 0.
>>>> - indentationLevel := 0.
>>>> - alignment := textStyle alignment.
>>>> - font := nil.
>>>> - (text attributesAt: lastIndex forStyle: textStyle)
>>>> - do: [:att | att emphasizeScanner: self]].
>>>> - font == nil ifTrue:
>>>> - [self setFont: textStyle defaultFontIndex].
>>>> - font := font emphasized: emphasisCode.
>>>> - priorFont ifNotNil: [destX := destX + priorFont descentKern].
>>>> - destX := destX - font descentKern.
>>>> - "NOTE: next statement should be removed when clipping works"
>>>> - leftMargin ifNotNil: [destX := destX max: leftMargin].
>>>> - kern := kern - font baseKern.
>>>> -
>>>> - "Install various parameters from the font."
>>>> - spaceWidth := font widthOf: Space.
>>>> - xTable := font xTable.
>>>> - " map := font characterToGlyphMap."
>>>> - stopConditions := DefaultStopConditions.!
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiCharacterScanner>>setFont: (in category 'private')
>>>> -----
>>>> - setFont: fontNumber
>>>> - "Set the font by number from the textStyle."
>>>> -
>>>> - self setActualFont: (textStyle fontAt: fontNumber)!
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiCharacterScanner>>text:textStyle: (in category
>>>> 'private') -----
>>>> - text: t textStyle: ts
>>>> - text := t.
>>>> - textStyle := ts!
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiCharacterScanner>>textColor: (in category
>>> 'private')
>>>> -----
>>>> - textColor: ignored
>>>> - "Overridden in DisplayScanner"!
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiCharacterScanner>>wantsColumnBreaks: (in category
>>>> 'initialize') -----
>>>> - wantsColumnBreaks: aBoolean
>>>> -
>>>> - wantsColumnBreaks := aBoolean!
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiCharacterScanner>>widthOf:inFont: (in category
>>>> 'multilingual scanning') -----
>>>> - widthOf: char inFont: aFont
>>>> -
>>>> - (char isMemberOf: CombinedChar) ifTrue: [
>>>> - ^ aFont widthOf: char base.
>>>> - ] ifFalse: [
>>>> - ^ aFont widthOf: char.
>>>> - ].
>>>> -
>>>> -
>>>> - !
>>>>
>>>> Item was removed:
>>>> - MultiCharacterScanner subclass: #MultiCompositionScanner
>>>> - instanceVariableNames: 'spaceX lineHeight baseline breakableIndex
>>>> lineHeightAtBreak baselineAtBreak breakAtSpace lastWidth'
>>>> - classVariableNames: ''
>>>> - poolDictionaries: ''
>>>> - category: 'Etoys-Squeakland-Multilingual-Scanning'!
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiCompositionScanner>>addCharToPresentation: (in
>>> category
>>>> 'multilingual scanning') -----
>>>> - addCharToPresentation: char
>>>> -
>>>> - presentation nextPut: char.
>>>> - lastWidth := self widthOf: char inFont: font.
>>>> - destX := destX + lastWidth.
>>>> - !
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiCompositionScanner>>columnBreak (in category 'stop
>>>> conditions') -----
>>>> - columnBreak
>>>> -
>>>> - "Answer true. Set up values for the text line interval currently
>>> being
>>>> - composed."
>>>> -
>>>> - line stop: lastIndex.
>>>> - presentationLine stop: lastIndex - numOfComposition.
>>>> - spaceX := destX.
>>>> - line paddingWidth: rightMargin - spaceX.
>>>> - presentationLine paddingWidth: rightMargin - spaceX.
>>>> - ^true!
>>>>
>>>> Item was removed:
>>>> - ----- Method:
>>>> MultiCompositionScanner>>composeFrom:inRectangle:
>>> firstLine:leftSide:rightSide:
>>>> (in category 'scanning') -----
>>>> - composeFrom: startIndex inRectangle: lineRectangle
>>>> - firstLine: firstLine leftSide: leftSide rightSide: rightSide
>>>> - "Answer an instance of TextLineInterval that represents the next
>>> line in
>>>> the paragraph."
>>>> - | runLength done stopCondition |
>>>> - "Set up margins"
>>>> - leftMargin := lineRectangle left.
>>>> - leftSide ifTrue: [leftMargin := leftMargin +
>>>> - (firstLine ifTrue:
>>> [textStyle firstIndent]
>>>> - ifFalse:
>>> [textStyle restIndent])].
>>>> - destX := spaceX := leftMargin.
>>>> - firstDestX := destX.
>>>> - rightMargin := lineRectangle right.
>>>> - rightSide ifTrue: [rightMargin := rightMargin - textStyle
>>> rightIndent].
>>>> - lastIndex := startIndex. "scanning sets last index"
>>>> - destY := lineRectangle top.
>>>> - lineHeight := baseline := 0. "Will be increased by setFont"
>>>> - self setStopConditions. "also sets font"
>>>> - runLength := text runLengthFor: startIndex.
>>>> - runStopIndex := (lastIndex := startIndex) + (runLength - 1).
>>>> - line := (TextLine start: lastIndex stop: 0 internalSpaces: 0
>>>> paddingWidth: 0)
>>>> - rectangle: lineRectangle.
>>>> - presentationLine := (TextLine start: lastIndex stop: 0
>>> internalSpaces: 0
>>>> paddingWidth: 0)
>>>> - rectangle: lineRectangle.
>>>> - numOfComposition := 0.
>>>> - spaceCount := 0.
>>>> - self handleIndentation.
>>>> - leftMargin := destX.
>>>> - line leftMargin: leftMargin.
>>>> - presentationLine leftMargin: leftMargin.
>>>> -
>>>> - presentation := TextStream on: (Text fromString: (WideString new:
>>> text
>>>> size)).
>>>> -
>>>> - done := false.
>>>> - [done]
>>>> - whileFalse:
>>>> - [stopCondition := self scanCharactersFrom:
>>> lastIndex to: runStopIndex
>>>> - in: text string rightX: rightMargin
>>> stopConditions: stopConditions
>>>> - kern: kern.
>>>> - "See setStopConditions for stopping conditions
>>>> for
>>> composing."
>>>> - (self perform: stopCondition)
>>>> - ifTrue: [presentationLine lineHeight:
>>> lineHeight + textStyle leading
>>>> - baseline:
>>>> baseline
>>> + textStyle leading.
>>>> - ^ line lineHeight:
>>> lineHeight + textStyle leading
>>>> - baseline:
>>>> baseline
>>> + textStyle leading]]!
>>>>
>>>> Item was removed:
>>>> - ----- Method:
>>>> MultiCompositionScanner>>composeLine:fromCharacterIndex:inParagraph:
>>>> (in
>>>> category 'scanning') -----
>>>> - composeLine: lineIndex fromCharacterIndex: startIndex inParagraph:
>>>> aParagraph
>>>> - "Answer an instance of TextLineInterval that represents the next
>>> line in
>>>> the paragraph."
>>>> - | runLength done stopCondition |
>>>> - destX := spaceX := leftMargin := aParagraph
>>>> leftMarginForCompositionForLine: lineIndex.
>>>> - destY := 0.
>>>> - rightMargin := aParagraph rightMarginForComposition.
>>>> - leftMargin >= rightMargin ifTrue: [self error: 'No room between
>>> margins
>>>> to compose'].
>>>> - lastIndex := startIndex. "scanning sets last index"
>>>> - lineHeight := textStyle lineGrid. "may be increased by
>>> setFont:..."
>>>> - baseline := textStyle baseline.
>>>> - baselineY := destY + baseline.
>>>> - self setStopConditions. "also sets font"
>>>> - self handleIndentation.
>>>> - runLength := text runLengthFor: startIndex.
>>>> - runStopIndex := (lastIndex := startIndex) + (runLength - 1).
>>>> - line := TextLineInterval
>>>> - start: lastIndex
>>>> - stop: 0
>>>> - internalSpaces: 0
>>>> - paddingWidth: 0.
>>>> - presentationLine := TextLineInterval
>>>> - start: lastIndex
>>>> - stop: 0
>>>> - internalSpaces: 0
>>>> - paddingWidth: 0.
>>>> - numOfComposition := 0.
>>>> - presentation := TextStream on: (Text fromString: (WideString new:
>>> text
>>>> size)).
>>>> - spaceCount := 0.
>>>> - done := false.
>>>> - [done]
>>>> - whileFalse:
>>>> - [stopCondition := self scanCharactersFrom:
>>> lastIndex to: runStopIndex
>>>> - in: text string rightX: rightMargin
>>> stopConditions: stopConditions
>>>> - kern: kern.
>>>> - "See setStopConditions for stopping conditions
>>>> for
>>> composing."
>>>> - (self perform: stopCondition)
>>>> - ifTrue: [presentationLine lineHeight:
>>> lineHeight + textStyle leading
>>>> - baseline:
>>>> baseline
>>> + textStyle leading.
>>>> - ^line lineHeight:
>>> lineHeight + textStyle leading
>>>> - baseline:
>>>> baseline
>>> + textStyle leading]]!
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiCompositionScanner>>cr (in category 'stop
>>> conditions')
>>>> -----
>>>> - cr
>>>> - "Answer true. Set up values for the text line interval currently
>>> being
>>>> - composed."
>>>> -
>>>> - line stop: lastIndex.
>>>> - presentationLine stop: lastIndex - numOfComposition.
>>>> - spaceX := destX.
>>>> - line paddingWidth: rightMargin - spaceX.
>>>> - presentationLine paddingWidth: rightMargin - spaceX.
>>>> - ^true!
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiCompositionScanner>>crossedX (in category 'stop
>>>> conditions') -----
>>>> - crossedX
>>>> - "There is a word that has fallen across the right edge of the
>>> composition
>>>> - rectangle. This signals the need for wrapping which is done to
>>>> the
>>> last
>>>> - space that was encountered, as recorded by the space stop
>>> condition."
>>>> -
>>>> - (breakAtSpace) ifTrue: [
>>>> - spaceCount >= 1 ifTrue:
>>>> - ["The common case. First back off to the space at
>>> which we wrap."
>>>> - line stop: breakableIndex.
>>>> - presentationLine stop: breakableIndex -
>>> numOfComposition.
>>>> - lineHeight := lineHeightAtBreak.
>>>> - baseline := baselineAtBreak.
>>>> - spaceCount := spaceCount - 1.
>>>> - breakableIndex := breakableIndex - 1.
>>>> -
>>>> - "Check to see if any spaces preceding the one at
>>> which we wrap.
>>>> - Double space after punctuation, most
>>> likely."
>>>> - [(spaceCount > 1 and: [(text at: breakableIndex)
>>>> =
>>> Space])]
>>>> - whileTrue:
>>>> - [spaceCount := spaceCount - 1.
>>>> - "Account for backing over a run
>>> which might
>>>> - change width of space."
>>>> - font := text fontAt:
>>> breakableIndex withStyle: textStyle.
>>>> - breakableIndex := breakableIndex
>>>> -
>>> 1.
>>>> - spaceX := spaceX - (font widthOf:
>>> Space)].
>>>> - line paddingWidth: rightMargin - spaceX.
>>>> - presentationLine paddingWidth: rightMargin -
>>> spaceX.
>>>> - presentationLine internalSpaces: spaceCount.
>>>> - line internalSpaces: spaceCount]
>>>> - ifFalse:
>>>> - ["Neither internal nor trailing spaces -- almost
>>> never happens."
>>>> - lastIndex := lastIndex - 1.
>>>> - [destX <= rightMargin]
>>>> - whileFalse:
>>>> - [destX := destX - (font widthOf:
>>> (text at: lastIndex)).
>>>> - lastIndex := lastIndex - 1].
>>>> - spaceX := destX.
>>>> - line paddingWidth: rightMargin - destX.
>>>> - presentationLine paddingWidth: rightMargin -
>>>> destX.
>>>> - presentationLine stop: (lastIndex max: line
>>>> first).
>>>> - line stop: (lastIndex max: line first)].
>>>> - ^true
>>>> - ].
>>>> -
>>>> - (breakableIndex isNil or: [breakableIndex < line first]) ifTrue:
>>>> [
>>>> - "Any breakable point in this line. Just wrap last
>>> character."
>>>> - breakableIndex := lastIndex - 1.
>>>> - lineHeightAtBreak := lineHeight.
>>>> - baselineAtBreak := baseline.
>>>> - ].
>>>> -
>>>> - "It wasn't a space, but anyway this is where we break the line."
>>>> - line stop: breakableIndex.
>>>> - presentationLine stop: breakableIndex.
>>>> - lineHeight := lineHeightAtBreak.
>>>> - baseline := baselineAtBreak.
>>>> - ^ true.
>>>> - !
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiCompositionScanner>>endOfRun (in category 'stop
>>>> conditions') -----
>>>> - endOfRun
>>>> - "Answer true if scanning has reached the end of the paragraph.
>>>> - Otherwise step conditions (mostly install potential new font) and
>>> answer
>>>> - false."
>>>> -
>>>> - | runLength |
>>>> - lastIndex = text size
>>>> - ifTrue: [line stop: lastIndex.
>>>> - presentationLine stop: lastIndex -
>>> numOfComposition.
>>>> - spaceX := destX.
>>>> - line paddingWidth: rightMargin - destX.
>>>> - presentationLine paddingWidth: rightMargin -
>>>> destX.
>>>> - ^true]
>>>> - ifFalse: [
>>>> - "(text at: lastIndex) charCode = 32 ifTrue:
>>>> [destX
>>> := destX +
>>>> spaceWidth]."
>>>> - runLength := (text runLengthFor: (lastIndex :=
>>> lastIndex + 1)).
>>>> - runStopIndex := lastIndex + (runLength - 1).
>>>> - self setStopConditions.
>>>> - ^false]
>>>> - !
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiCompositionScanner>>forParagraph: (in category
>>>> 'intialize-release') -----
>>>> - forParagraph: aParagraph
>>>> - "Initialize the receiver for scanning the given paragraph."
>>>> -
>>>> - self
>>>> - initializeFromParagraph: aParagraph
>>>> - clippedBy: aParagraph clippingRectangle.
>>>> - !
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiCompositionScanner>>getPresentation (in category
>>>> 'multilingual scanning') -----
>>>> - getPresentation
>>>> -
>>>> - ^ presentation contents.
>>>> -
>>>> - !
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiCompositionScanner>>getPresentationLine (in
>>> category
>>>> 'multilingual scanning') -----
>>>> - getPresentationLine
>>>> -
>>>> - ^ presentationLine.
>>>> - !
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiCompositionScanner>>isBreakableAt:in:in: (in
>>> category
>>>> 'multilingual scanning') -----
>>>> - isBreakableAt: index in: sourceString in: encodingClass
>>>> -
>>>> - ^ encodingClass isBreakableAt: index in: sourceString.
>>>> - !
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiCompositionScanner>>placeEmbeddedObject: (in
>>> category
>>>> 'stop conditions') -----
>>>> - placeEmbeddedObject: anchoredMorph
>>>> - | descent |
>>>> - "Workaround: The following should really use #textAnchorType"
>>>> - anchoredMorph relativeTextAnchorPosition ifNotNil:[^true].
>>>> - (super placeEmbeddedObject: anchoredMorph) ifFalse: ["It doesn't
>>> fit"
>>>> - "But if it's the first character then leave it here"
>>>> - lastIndex < line first ifFalse:[
>>>> - line stop: lastIndex-1.
>>>> - ^ false]].
>>>> - descent := lineHeight - baseline.
>>>> - lineHeight := lineHeight max: anchoredMorph height.
>>>> - baseline := lineHeight - descent.
>>>> - line stop: lastIndex.
>>>> - presentationLine stop: lastIndex - numOfComposition.
>>>> - ^ true!
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiCompositionScanner>>presentation (in category
>>>> 'accessing') -----
>>>> - presentation
>>>> -
>>>> - ^ presentation.
>>>> - !
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiCompositionScanner>>presentationLine (in category
>>>> 'accessing') -----
>>>> - presentationLine
>>>> -
>>>> - ^ presentationLine.
>>>> - !
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiCompositionScanner>>registerBreakableIndex (in
>>> category
>>>> 'multilingual scanning') -----
>>>> - registerBreakableIndex
>>>> -
>>>> - "Record left x and character index of the line-wrappable point.
>>>> - Used for wrap-around. Answer whether the character has crossed
>>>> the
>>>> - right edge of the composition rectangle of the paragraph."
>>>> -
>>>> - (text at: lastIndex) = Character space ifTrue: [
>>>> - breakAtSpace := true.
>>>> - spaceX := destX.
>>>> - spaceCount := spaceCount + 1.
>>>> - lineHeightAtBreak := lineHeight.
>>>> - baselineAtBreak := baseline.
>>>> - breakableIndex := lastIndex.
>>>> - destX > rightMargin ifTrue: [^self crossedX].
>>>> - ] ifFalse: [
>>>> - breakAtSpace := false.
>>>> - lineHeightAtBreak := lineHeight.
>>>> - baselineAtBreak := baseline.
>>>> - breakableIndex := lastIndex - 1.
>>>> - ].
>>>> - ^ false.
>>>> - !
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiCompositionScanner>>removeLastCharFromPresentation
>>> (in
>>>> category 'multilingual scanning') -----
>>>> - removeLastCharFromPresentation
>>>> -
>>>> - presentation ifNotNil: [
>>>> - presentation position: presentation position - 1.
>>>> - ].
>>>> - destX := destX - lastWidth.
>>>> - !
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiCompositionScanner>>rightX (in category
>>> 'accessing')
>>>> -----
>>>> - rightX
>>>> - "Meaningful only when a line has just been composed -- refers to
>>> the
>>>> - line most recently composed. This is a subtrefuge to allow for
>>>> easy
>>>> - resizing of a composition rectangle to the width of the maximum
>>> line.
>>>> - Useful only when there is only one line in the form or when each
>>> line
>>>> - is terminated by a carriage return. Handy for sizing menus and
>>> lists."
>>>> -
>>>> - breakAtSpace ifTrue: [^ spaceX].
>>>> -
>>>> - ^ destX.
>>>> - !
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiCompositionScanner>>setActualFont: (in category
>>>> 'scanning') -----
>>>> - setActualFont: aFont
>>>> - "Keep track of max height and ascent for auto lineheight"
>>>> - | descent |
>>>> - super setActualFont: aFont.
>>>> - "' ', lastIndex printString, ' ' displayAt: (lastIndex *
>>> 15)@0."
>>>> - lineHeight == nil
>>>> - ifTrue: [descent := font descent.
>>>> - baseline := font ascent.
>>>> - lineHeight := baseline + descent]
>>>> - ifFalse: [descent := lineHeight - baseline max: font
>>> descent.
>>>> - baseline := baseline max: font ascent.
>>>> - lineHeight := lineHeight max: baseline +
>>> descent]!
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiCompositionScanner>>setFont (in category 'stop
>>>> conditions') -----
>>>> - setFont
>>>> - super setFont.
>>>> - breakAtSpace := false.
>>>> - wantsColumnBreaks == true ifTrue: [
>>>> - stopConditions := stopConditions copy.
>>>> - stopConditions at: TextComposer characterForColumnBreak
>>> asciiValue + 1
>>>> put: #columnBreak.
>>>> - ].
>>>> - !
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiCompositionScanner>>setStopConditions (in category
>>>> 'stop conditions') -----
>>>> - setStopConditions
>>>> - "Set the font and the stop conditions for the current run."
>>>> -
>>>> - self setFont!
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiCompositionScanner>>tab (in category 'stop
>>> conditions')
>>>> -----
>>>> - tab
>>>> - "Advance destination x according to tab settings in the
>>>> paragraph's
>>>> - textStyle. Answer whether the character has crossed the right
>>>> edge
>>> of
>>>> - the composition rectangle of the paragraph."
>>>> -
>>>> - destX := textStyle
>>>> - nextTabXFrom: destX leftMargin:
>>>> leftMargin
>>> rightMargin: rightMargin.
>>>> - destX > rightMargin ifTrue: [^self crossedX].
>>>> - lastIndex := lastIndex + 1.
>>>> - ^false
>>>> - !
>>>>
>>>> Item was removed:
>>>> - MultiCharacterScanner subclass: #MultiDisplayScanner
>>>> - instanceVariableNames: 'bitBlt lineY runX foregroundColor
>>> backgroundColor
>>>> fillBlt lineHeight paragraph paragraphColor morphicOffset
>>>> ignoreColorChanges'
>>>> - classVariableNames: ''
>>>> - poolDictionaries: ''
>>>> - category: 'Etoys-Squeakland-Multilingual-Scanning'!
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiDisplayScanner class>>defaultFont (in category
>>>> 'queries') -----
>>>> - defaultFont
>>>> - ^ TextStyle defaultFont!
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiDisplayScanner>>cr (in category 'stop conditions')
>>>> -----
>>>> - cr
>>>> - "When a carriage return is encountered, simply increment the
>>> pointer
>>>> - into the paragraph."
>>>> -
>>>> - lastIndex := lastIndex + 1.
>>>> - ^false!
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiDisplayScanner>>crossedX (in category 'stop
>>>> conditions') -----
>>>> - crossedX
>>>> - "This condition will sometimes be reached 'legally' during
>>> display, when,
>>>> - for instance the space that caused the line to wrap actually
>>> extends over
>>>> - the right boundary. This character is allowed to display, even
>>> though it
>>>> - is technically outside or straddling the clipping ectangle since
>>> it is in
>>>> - the normal case not visible and is in any case appropriately
>>> clipped by
>>>> - the scanner."
>>>> -
>>>> - ^ true !
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiDisplayScanner>>displayLine:offset:leftInRun: (in
>>>> category 'scanning') -----
>>>> - displayLine: textLine offset: offset leftInRun: leftInRun
>>>> - "The call on the primitive (scanCharactersFrom:to:in:rightX:)
>>> will be
>>>> interrupted according to an array of stop conditions passed to the
>>> scanner
>>>> at which time the code to handle the stop condition is run and the call
>>> on
>>>> the primitive continued until a stop condition returns true (which
>>>> means
>>> the
>>>> line has terminated). leftInRun is the # of characters left to scan in
>>> the
>>>> current run; when 0, it is time to call setStopConditions."
>>>> - | done stopCondition nowLeftInRun startIndex string lastPos |
>>>> - line := textLine.
>>>> - morphicOffset := offset.
>>>> - lineY := line top + offset y.
>>>> - lineHeight := line lineHeight.
>>>> - rightMargin := line rightMargin + offset x.
>>>> - lastIndex := line first.
>>>> - leftInRun <= 0 ifTrue: [self setStopConditions].
>>>> - leftMargin := (line leftMarginForAlignment: alignment) + offset
>>>> x.
>>>> - destX := runX := leftMargin.
>>>> - fillBlt == nil ifFalse:
>>>> - ["Not right"
>>>> - fillBlt destX: line left destY: lineY
>>>> - width: line width left height: lineHeight;
>>> copyBits].
>>>> - lastIndex := line first.
>>>> - leftInRun <= 0
>>>> - ifTrue: [nowLeftInRun := text runLengthFor: lastIndex]
>>>> - ifFalse: [nowLeftInRun := leftInRun].
>>>> - baselineY := lineY + line baseline.
>>>> - destY := baselineY - font ascent.
>>>> - runStopIndex := lastIndex + (nowLeftInRun - 1) min: line last.
>>>> - spaceCount := 0.
>>>> - done := false.
>>>> - string := text string.
>>>> - [done] whileFalse:[
>>>> - startIndex := lastIndex.
>>>> - lastPos := destX at destY.
>>>> - stopCondition := self scanCharactersFrom: lastIndex to:
>>> runStopIndex
>>>> - in: string rightX:
>>> rightMargin stopConditions: stopConditions
>>>> - kern: kern.
>>>> - lastIndex >= startIndex ifTrue:[
>>>> - font displayString: string on: bitBlt
>>>> - from: startIndex
>>>> - "XXXX: The following is an interesting bug. All stopConditions
>>> exept
>>>> #endOfRun
>>>> - have lastIndex past the last character displayed.
>>> #endOfRun sets it *on*
>>>> the character.
>>>> - If we display up until lastIndex then we will also
>>>> display
>>> invisible
>>>> characters like
>>>> - CR and tab. This problem should be fixed in the scanner
>>> (i.e., position
>>>> lastIndex
>>>> - consistently) but I don't want to deal with the fallout
>>> right now so we
>>>> keep the
>>>> - fix minimally invasive."
>>>> - to: (stopCondition == #endOfRun
>>> ifTrue:[lastIndex]
>>>> ifFalse:[lastIndex-1])
>>>> - at: lastPos kern: kern baselineY:
>>> baselineY].
>>>> - "see setStopConditions for stopping conditions for
>>> displaying."
>>>> - done := self perform: stopCondition.
>>>> - "lastIndex > runStopIndex ifTrue: [done := true]."
>>>> - ].
>>>> - ^ runStopIndex - lastIndex "Number of characters remaining in
>>>> the
>>>> current run"!
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiDisplayScanner>>displayLines:in:clippedBy: (in
>>> category
>>>> 'MVC-compatibility') -----
>>>> - displayLines: linesInterval in: aParagraph clippedBy:
>>>> visibleRectangle
>>>> - "The central display routine. The call on the primitive
>>>> - (scanCharactersFrom:to:in:rightX:) will be interrupted according
>>> to an
>>>> - array of stop conditions passed to the scanner at which time the
>>> code to
>>>> - handle the stop condition is run and the call on the primitive
>>> continued
>>>> - until a stop condition returns true (which means the line has
>>>> - terminated)."
>>>> - | runLength done stopCondition leftInRun startIndex string
>>>> lastPos
>>> |
>>>> - "leftInRun is the # of characters left to scan in the current
>>>> run;
>>>> - when 0, it is time to call 'self setStopConditions'"
>>>> - morphicOffset := 0 at 0.
>>>> - leftInRun := 0.
>>>> - self initializeFromParagraph: aParagraph clippedBy:
>>> visibleRectangle.
>>>> - ignoreColorChanges := false.
>>>> - paragraph := aParagraph.
>>>> - foregroundColor := paragraphColor := aParagraph foregroundColor.
>>>> - backgroundColor := aParagraph backgroundColor.
>>>> - aParagraph backgroundColor isTransparent
>>>> - ifTrue: [fillBlt := nil]
>>>> - ifFalse: [fillBlt := bitBlt copy. "Blt to fill spaces,
>>> tabs, margins"
>>>> - fillBlt sourceForm: nil; sourceOrigin:
>>>> 0 at 0.
>>>> - fillBlt fillColor: aParagraph
>>> backgroundColor].
>>>> - rightMargin := aParagraph rightMarginForDisplay.
>>>> - lineY := aParagraph topAtLineIndex: linesInterval first.
>>>> - bitBlt destForm deferUpdatesIn: visibleRectangle while: [
>>>> - linesInterval do:
>>>> - [:lineIndex |
>>>> - leftMargin := aParagraph
>>> leftMarginForDisplayForLine: lineIndex
>>>> alignment: (alignment ifNil:[textStyle alignment]).
>>>> - destX := (runX := leftMargin).
>>>> - line := aParagraph lines at: lineIndex.
>>>> - lineHeight := line lineHeight.
>>>> - fillBlt == nil ifFalse:
>>>> - [fillBlt destX: visibleRectangle left
>>> destY: lineY
>>>> - width: visibleRectangle width
>>> height: lineHeight; copyBits].
>>>> - lastIndex := line first.
>>>> - leftInRun <= 0
>>>> - ifTrue: [self setStopConditions. "also
>>> sets the font"
>>>> - leftInRun := text
>>> runLengthFor: line first].
>>>> - baselineY := lineY + line baseline.
>>>> - destY := baselineY - font ascent. "Should have
>>> happened in setFont"
>>>> - runLength := leftInRun.
>>>> - runStopIndex := lastIndex + (runLength - 1) min:
>>> line last.
>>>> - leftInRun := leftInRun - (runStopIndex -
>>>> lastIndex
>>> + 1).
>>>> - spaceCount := 0.
>>>> - done := false.
>>>> - string := text string.
>>>> - self handleIndentation.
>>>> - [done] whileFalse:[
>>>> - startIndex := lastIndex.
>>>> - lastPos := destX at destY.
>>>> - stopCondition := self scanCharactersFrom:
>>> lastIndex to: runStopIndex
>>>> - in: string
>>>> rightX:
>>> rightMargin stopConditions: stopConditions
>>>> - kern: kern.
>>>> - lastIndex >= startIndex ifTrue:[
>>>> - font displayString: string on:
>>> bitBlt
>>>> - from: startIndex to:
>>> lastIndex at: lastPos kern: kern baselineY:
>>>> baselineY].
>>>> - "see setStopConditions for stopping
>>> conditions for displaying."
>>>> - done := self perform: stopCondition].
>>>> - fillBlt == nil ifFalse:
>>>> - [fillBlt destX: destX destY: lineY width:
>>> visibleRectangle right-destX
>>>> height: lineHeight; copyBits].
>>>> - lineY := lineY + lineHeight]]!
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiDisplayScanner>>endOfRun (in category 'stop
>>>> conditions') -----
>>>> - endOfRun
>>>> - "The end of a run in the display case either means that there is
>>> actually
>>>> - a change in the style (run code) to be associated with the string
>>> or the
>>>> - end of this line has been reached."
>>>> - | runLength |
>>>> - lastIndex = line last ifTrue: [^true].
>>>> - runX := destX.
>>>> - runLength := text runLengthFor: (lastIndex := lastIndex + 1).
>>>> - runStopIndex := lastIndex + (runLength - 1) min: line last.
>>>> - self setStopConditions.
>>>> - ^ false!
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiDisplayScanner>>initializeFromParagraph:clippedBy:
>>> (in
>>>> category 'MVC-compatibility') -----
>>>> - initializeFromParagraph: aParagraph clippedBy: clippingRectangle
>>>> -
>>>> - super initializeFromParagraph: aParagraph clippedBy:
>>> clippingRectangle.
>>>> - bitBlt := BitBlt asGrafPort toForm: aParagraph destinationForm.
>>>> - bitBlt sourceX: 0; width: 0. "Init BitBlt so that the first
>>> call to a
>>>> primitive will not fail"
>>>> - bitBlt combinationRule: Form paint.
>>>> - bitBlt colorMap:
>>>> - (Bitmap with: 0 "Assumes 1-bit deep fonts"
>>>> - with: (bitBlt destForm pixelValueFor:
>>> aParagraph foregroundColor)).
>>>> - bitBlt clipRect: clippingRectangle.
>>>> - !
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiDisplayScanner>>isBreakableAt:in:in: (in category
>>>> 'multilingual scanning') -----
>>>> - isBreakableAt: index in: sourceString in: encodingClass
>>>> -
>>>> - ^ false.
>>>> - !
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiDisplayScanner>>paddedSpace (in category 'stop
>>>> conditions') -----
>>>> - paddedSpace
>>>> - "Each space is a stop condition when the alignment is right
>>> justified.
>>>> - Padding must be added to the base width of the space according to
>>>> - which space in the line this space is and according to the amount
>>> of
>>>> - space that remained at the end of the line when it was composed."
>>>> -
>>>> - spaceCount := spaceCount + 1.
>>>> - destX := destX + spaceWidth + (line justifiedPadFor: spaceCount).
>>>> - lastIndex := lastIndex + 1.
>>>> - ^ false!
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiDisplayScanner>>placeEmbeddedObject: (in category
>>>> 'scanning') -----
>>>> - placeEmbeddedObject: anchoredMorph
>>>> - anchoredMorph relativeTextAnchorPosition ifNotNil:[
>>>> - anchoredMorph position:
>>>> - anchoredMorph relativeTextAnchorPosition +
>>>> - (anchoredMorph owner textBounds origin x @ 0)
>>>> - - (0 at morphicOffset y) + (0 at lineY).
>>>> - ^true
>>>> - ].
>>>> - (super placeEmbeddedObject: anchoredMorph) ifFalse: [^ false].
>>>> - anchoredMorph isMorph ifTrue: [
>>>> - anchoredMorph position: ((destX - anchoredMorph
>>> width)@lineY) -
>>>> morphicOffset
>>>> - ] ifFalse: [
>>>> - destY := lineY.
>>>> - baselineY := lineY + anchoredMorph height..
>>>> - runX := destX.
>>>> - anchoredMorph
>>>> - displayOn: bitBlt destForm
>>>> - at: destX - anchoredMorph width @ destY
>>>> - clippingBox: bitBlt clipRect
>>>> - ].
>>>> - ^ true!
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiDisplayScanner>>plainTab (in category 'stop
>>>> conditions') -----
>>>> - plainTab
>>>> - | oldX |
>>>> - oldX := destX.
>>>> - super plainTab.
>>>> - fillBlt == nil ifFalse:
>>>> - [fillBlt destX: oldX destY: destY width: destX - oldX
>>> height: font
>>>> height; copyBits]!
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiDisplayScanner>>presentationText: (in category
>>>> 'private') -----
>>>> - presentationText: t
>>>> -
>>>> - text := t.
>>>> - !
>>>>
>>>> Item was removed:
>>>> - ----- Method:
>>>> MultiDisplayScanner>>scanMultiCharactersCombiningFrom:to:in:rightX:
>>> stopConditions:kern:
>>>> (in category 'multilingual scanning') -----
>>>> - scanMultiCharactersCombiningFrom: startIndex to: stopIndex in:
>>>> sourceString rightX: rightX stopConditions: stops kern: kernDelta
>>>> -
>>>> - | encoding f nextDestX maxAscii startEncoding char charValue |
>>>> - lastIndex := startIndex.
>>>> - lastIndex > stopIndex ifTrue: [lastIndex := stopIndex. ^ stops
>>>> at:
>>>> EndOfRun].
>>>> - startEncoding := (sourceString at: startIndex) leadingChar.
>>>> - font ifNil: [font := (TextConstants at: #DefaultMultiStyle)
>>> fontArray at:
>>>> 1].
>>>> - ((font isMemberOf: StrikeFontSet) or: [font isKindOf:
>>>> TTCFontSet])
>>>> ifTrue: [
>>>> - [f := font fontArray at: startEncoding + 1]
>>>> - on: Exception do: [:ex | f := font fontArray at:
>>> 1].
>>>> - f ifNil: [ f := font fontArray at: 1].
>>>> - maxAscii := f maxAscii.
>>>> - spaceWidth := f widthOf: Space.
>>>> - ] ifFalse: [
>>>> - maxAscii := font maxAscii.
>>>> - ].
>>>> -
>>>> - [lastIndex <= stopIndex] whileTrue: [
>>>> - encoding := (sourceString at: lastIndex) leadingChar.
>>>> - encoding ~= startEncoding ifTrue: [lastIndex := lastIndex
>>> - 1. ^ stops
>>>> at: EndOfRun].
>>>> - char := (sourceString at: lastIndex).
>>>> - charValue := char charCode.
>>>> - charValue > maxAscii ifTrue: [charValue := maxAscii].
>>>> - (encoding = 0 and: [(stopConditions at: charValue + 1) ~~
>>> nil]) ifTrue:
>>>> [
>>>> - ^ stops at: charValue + 1
>>>> - ].
>>>> - nextDestX := destX + (self widthOf: char inFont: font).
>>>> - nextDestX > rightX ifTrue: [^ stops at: CrossedX].
>>>> - destX := nextDestX + kernDelta.
>>>> - lastIndex := lastIndex + 1.
>>>> - ].
>>>> - lastIndex := stopIndex.
>>>> - ^ stops at: EndOfRun!
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiDisplayScanner>>setDestForm: (in category
>>> 'private')
>>>> -----
>>>> - setDestForm: df
>>>> - bitBlt setDestForm: df.!
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiDisplayScanner>>setFont (in category 'private')
>>> -----
>>>> - setFont
>>>> - foregroundColor := paragraphColor.
>>>> - super setFont. "Sets font and emphasis bits, and maybe
>>> foregroundColor"
>>>> - font installOn: bitBlt foregroundColor: foregroundColor
>>> backgroundColor:
>>>> Color transparent.
>>>> - text ifNotNil:[
>>>> - baselineY := lineY + line baseline.
>>>> - destY := baselineY - font ascent].
>>>> - !
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiDisplayScanner>>setPort: (in category 'private')
>>> -----
>>>> - setPort: aBitBlt
>>>> - "Install the BitBlt to use"
>>>> - bitBlt := aBitBlt.
>>>> - bitBlt sourceX: 0; width: 0. "Init BitBlt so that the first
>>> call to a
>>>> primitive will not fail"
>>>> - bitBlt sourceForm: nil. "Make sure font installation won't be
>>> confused"
>>>> - !
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiDisplayScanner>>setStopConditions (in category
>>> 'stop
>>>> conditions') -----
>>>> - setStopConditions
>>>> - "Set the font and the stop conditions for the current run."
>>>> -
>>>> - self setFont.
>>>> - self setConditionArray: (alignment = Justified ifTrue:
>>> [#paddedSpace]).
>>>> -
>>>> - "
>>>> - alignment = Justified ifTrue: [
>>>> - stopConditions == DefaultStopConditions
>>>> - ifTrue:[stopConditions := stopConditions copy].
>>>> - stopConditions at: Space asciiValue + 1 put:
>>>> #paddedSpace]
>>>> - "!
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiDisplayScanner>>tab (in category 'stop
>>>> conditions')
>>>> -----
>>>> - tab
>>>> - self plainTab.
>>>> - lastIndex := lastIndex + 1.
>>>> - ^ false!
>>>>
>>>> Item was removed:
>>>> - ----- Method:
>>>> MultiDisplayScanner>>text:textStyle:foreground:background:fillBlt:
>>> ignoreColorChanges:
>>>> (in category 'private') -----
>>>> - text: t textStyle: ts foreground: foreColor background: backColor
>>> fillBlt:
>>>> blt ignoreColorChanges: shadowMode
>>>> - text := t.
>>>> - textStyle := ts.
>>>> - foregroundColor := paragraphColor := foreColor.
>>>> - (backgroundColor := backColor) isTransparent ifFalse:
>>>> - [fillBlt := blt.
>>>> - fillBlt fillColor: backgroundColor].
>>>> - ignoreColorChanges := shadowMode!
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiDisplayScanner>>textColor: (in category 'private')
>>>> -----
>>>> - textColor: textColor
>>>> - ignoreColorChanges ifTrue: [^ self].
>>>> - foregroundColor := textColor!
>>>>
>>>> Item was removed:
>>>> - NewParagraph subclass: #MultiNewParagraph
>>>> - instanceVariableNames: 'presentationText presentationLines'
>>>> - classVariableNames: ''
>>>> - poolDictionaries: 'TextConstants'
>>>> - category: 'Etoys-Squeakland-Multilingual-Scanning'!
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiNewParagraph>>displayOn:using:at: (in category
>>>> 'fonts-display') -----
>>>> - displayOn: aCanvas using: displayScanner at: somePosition
>>>> - "Send all visible lines to the displayScanner for display"
>>>> -
>>>> - | visibleRectangle offset leftInRun line |
>>>> - visibleRectangle := aCanvas clipRect.
>>>> - offset := somePosition - positionWhenComposed.
>>>> - leftInRun := 0.
>>>> - (self lineIndexForPoint: visibleRectangle topLeft)
>>>> - to: (self lineIndexForPoint: visibleRectangle
>>>> bottomRight)
>>>> - do: [:i | line := lines at: i.
>>>> - self displaySelectionInLine: line on: aCanvas.
>>>> - line first <= line last ifTrue:
>>>> - [leftInRun := displayScanner displayLine:
>>> line
>>>> - offset:
>>> offset leftInRun: leftInRun]].
>>>> - !
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiNewParagraph>>displayOnTest:using:at: (in category
>>>> 'fonts-display') -----
>>>> - displayOnTest: aCanvas using: displayScanner at: somePosition
>>>> - "Send all visible lines to the displayScanner for display"
>>>> -
>>>> - | visibleRectangle offset leftInRun line |
>>>> - (presentationText isNil or: [presentationLines isNil]) ifTrue: [
>>>> - ^ self displayOn: aCanvas using: displayScanner at:
>>> somePosition.
>>>> - ].
>>>> - visibleRectangle := aCanvas clipRect.
>>>> - offset := somePosition - positionWhenComposed.
>>>> - leftInRun := 0.
>>>> - (self lineIndexForPoint: visibleRectangle topLeft)
>>>> - to: (self lineIndexForPoint: visibleRectangle
>>>> bottomRight)
>>>> - do: [:i | line := presentationLines at: i.
>>>> - self displaySelectionInLine: line on: aCanvas.
>>>> - line first <= line last ifTrue:
>>>> - [leftInRun := displayScanner displayLine:
>>> line
>>>> - offset:
>>> offset leftInRun: leftInRun]].
>>>> - !
>>>>
>>>> Item was removed:
>>>> - ----- Method:
>>>> MultiNewParagraph>>multiComposeLinesFrom:to:delta:into:priorLines:atY:
>>> (in
>>>> category 'composition') -----
>>>> - multiComposeLinesFrom: start to: stop delta: delta into: lineColl
>>>> priorLines: priorLines
>>>> - atY: startingY
>>>> - "While the section from start to stop has changed, composition
>>>> may
>>> ripple
>>>> all the way to the end of the text. However in a rectangular
>>>> container,
>>> if
>>>> we ever find a line beginning with the same character as before (ie
>>>> corresponding to delta in the old lines), then we can just copy the old
>>>> lines from there to the end of the container, with adjusted indices and
>>>> y-values"
>>>> -
>>>> - | newResult composer presentationInfo |
>>>> -
>>>> - composer := MultiTextComposer new.
>>>> - presentationLines := nil.
>>>> - presentationText := nil.
>>>> - newResult := composer
>>>> - multiComposeLinesFrom: start
>>>> - to: stop
>>>> - delta: delta
>>>> - into: lineColl
>>>> - priorLines: priorLines
>>>> - atY: startingY
>>>> - textStyle: textStyle
>>>> - text: text
>>>> - container: container
>>>> - wantsColumnBreaks: wantsColumnBreaks == true.
>>>> - lines := newResult first asArray.
>>>> - maxRightX := newResult second.
>>>> - presentationInfo := composer getPresentationInfo.
>>>> - presentationLines := presentationInfo first asArray.
>>>> - presentationText := presentationInfo second.
>>>> - "maxRightX printString displayAt: 0 at 0."
>>>> - ^maxRightX
>>>> - !
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiNewParagraph>>presentationLines (in category
>>>> 'accessing') -----
>>>> - presentationLines
>>>> -
>>>> - ^ presentationLines.
>>>> - !
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiNewParagraph>>presentationText (in category
>>>> 'accessing') -----
>>>> - presentationText
>>>> -
>>>> - ^ presentationText.
>>>> - !
>>>>
>>>> Item was removed:
>>>> - TextComposer subclass: #MultiTextComposer
>>>> - instanceVariableNames: 'presentation presentationLines'
>>>> - classVariableNames: ''
>>>> - poolDictionaries: 'TextConstants'
>>>> - category: 'Etoys-Squeakland-Multilingual-Scanning'!
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiTextComposer>>composeEachRectangleIn: (in category
>>> 'as
>>>> yet unclassified') -----
>>>> - composeEachRectangleIn: rectangles
>>>> -
>>>> - | myLine lastChar |
>>>> -
>>>> - 1 to: rectangles size do: [:i |
>>>> - currCharIndex <= theText size ifFalse: [^false].
>>>> - myLine := scanner
>>>> - composeFrom: currCharIndex
>>>> - inRectangle: (rectangles at: i)
>>>> - firstLine: isFirstLine
>>>> - leftSide: i=1
>>>> - rightSide: i=rectangles size.
>>>> - lines addLast: myLine.
>>>> - presentationLines addLast: scanner getPresentationLine.
>>>> - presentation ifNil: [presentation := scanner
>>> getPresentation]
>>>> - ifNotNil: [presentation := presentation, scanner
>>> getPresentation].
>>>> - actualHeight := actualHeight max: myLine lineHeight.
>>> "includes font
>>>> changes"
>>>> - currCharIndex := myLine last + 1.
>>>> - lastChar := theText at: myLine last.
>>>> - lastChar = Character cr ifTrue: [^#cr].
>>>> - wantsColumnBreaks ifTrue: [
>>>> - lastChar = TextComposer characterForColumnBreak
>>> ifTrue:
>>>> [^#columnBreak].
>>>> - ].
>>>> - ].
>>>> - ^false!
>>>>
>>>> Item was removed:
>>>> - ----- Method: MultiTextComposer>>getPresentationInfo (in category 'as
>>> yet
>>>> unclassified') -----
>>>> - getPresentationInfo
>>>> -
>>>> - ^ Array with: presentationLines with: presentation.
>>>> - !
>>>>
>>>> Item was removed:
>>>> - ----- Method:
>>>> MultiTextComposer>>multiComposeLinesFrom:to:delta:into:priorLines:atY:
>>> textStyle:text:container:wantsColumnBreaks:
>>>> (in category 'as yet unclassified') -----
>>>> - multiComposeLinesFrom: argStart to: argStop delta: argDelta into:
>>>> argLinesCollection priorLines: argPriorLines atY: argStartY textStyle:
>>>> argTextStyle text: argText container: argContainer wantsColumnBreaks:
>>>> argWantsColumnBreaks
>>>> -
>>>> - wantsColumnBreaks := argWantsColumnBreaks.
>>>> - lines := argLinesCollection.
>>>> - presentationLines := argLinesCollection copy.
>>>> - theTextStyle := argTextStyle.
>>>> - theText := argText.
>>>> - theContainer := argContainer.
>>>> - deltaCharIndex := argDelta.
>>>> - currCharIndex := startCharIndex := argStart.
>>>> - stopCharIndex := argStop.
>>>> - prevLines := argPriorLines.
>>>> - currentY := argStartY.
>>>> - defaultLineHeight := theTextStyle lineGrid.
>>>> - maxRightX := theContainer left.
>>>> - possibleSlide := stopCharIndex < theText size and: [theContainer
>>>> isMemberOf: Rectangle].
>>>> - nowSliding := false.
>>>> - prevIndex := 1.
>>>> - scanner := MultiCompositionScanner new text: theText textStyle:
>>>> theTextStyle.
>>>> - scanner wantsColumnBreaks: wantsColumnBreaks.
>>>> - isFirstLine := true.
>>>> - self composeAllLines.
>>>> - isFirstLine ifTrue: ["No space in container or empty text"
>>>> - self
>>>> - addNullLineWithIndex: startCharIndex
>>>> - andRectangle: (theContainer topLeft extent:
>>> 0 at defaultLineHeight)
>>>> - ] ifFalse: [
>>>> - self fixupLastLineIfCR
>>>> - ].
>>>> - ^{lines asArray. maxRightX}
>>>> -
>>>> - !
>>>>
>>>>
>>>>
>>>>
>>>
>>>
>>>
>>
>
More information about the Squeak-dev
mailing list
|