[squeak-dev] The Trunk: EToys-nice.292.mcz

Nicolas Cellier nicolas.cellier.aka.nice at gmail.com
Thu Oct 5 19:10:23 UTC 2017


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}
> > -
> > - !
> >
> >
> >
> >
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20171005/5dfaf463/attachment-0001.html>


More information about the Squeak-dev mailing list