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

H. Hirzel hannes.hirzel at gmail.com
Thu Oct 5 19:03:01 UTC 2017


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>>scanMultiCharactersCombiningFrom:to:in:rightX:stopConditions:kern:
> (in category 'scanning') -----
> - scanMultiCharactersCombiningFrom: startIndex to: stopIndex in:
> sourceString rightX: rightX stopConditions: stops kern: kernDelta
> -
> - 	| encoding f nextDestX maxAscii startEncoding char charValue |
> - 	lastIndex := startIndex.
> - 	lastIndex > stopIndex ifTrue: [lastIndex := stopIndex. ^ stops at:
> EndOfRun].
> - 	startEncoding := (sourceString at: startIndex) leadingChar.
> - 	font ifNil: [font := (TextConstants at: #DefaultMultiStyle) fontArray at:
> 1].
> - 	((font isMemberOf: StrikeFontSet) or: [font isKindOf: TTCFontSet])
> ifTrue: [
> - 		[f := font fontArray at: startEncoding + 1]
> - 			on: Exception do: [:ex | f := font fontArray at: 1].
> - 		f ifNil: [ f := font fontArray at: 1].
> - 		maxAscii := f maxAscii.
> - 		spaceWidth := f widthOf: Space.
> - 	] ifFalse: [
> - 		maxAscii := font maxAscii.
> - 	].
> -
> - 	[lastIndex <= stopIndex] whileTrue: [
> - 		encoding := (sourceString at: lastIndex) leadingChar.
> - 		encoding ~= startEncoding ifTrue: [lastIndex := lastIndex - 1. ^ stops
> at: EndOfRun].
> - 		char := (sourceString at: lastIndex).
> - 		charValue := char charCode.
> - 		charValue > maxAscii ifTrue: [charValue := maxAscii].
> - 		(encoding = 0 and: [(stopConditions at: charValue + 1) ~~ nil]) ifTrue:
> [
> - 			^ stops at: charValue + 1
> - 		].
> - 		nextDestX := destX + (self widthOf: char inFont: font).
> - 		nextDestX > rightX ifTrue: [^ stops at: CrossedX].
> - 		destX := nextDestX + kernDelta.
> - 		lastIndex := lastIndex + 1.
> - 	].
> - 	lastIndex := stopIndex.
> - 	^ stops at: EndOfRun!
>
> Item was removed:
> - ----- Method: MultiCharacterBlockScanner>>setFont (in category 'stop
> conditions') -----
> - setFont
> - 	specialWidth := nil.
> - 	super setFont!
>
> Item was removed:
> - ----- Method: MultiCharacterBlockScanner>>setStopConditions (in category
> 'stop conditions') -----
> - setStopConditions
> - 	"Set the font and the stop conditions for the current run."
> - 	
> - 	self setFont.
> - 	self setConditionArray: (alignment = Justified ifTrue: [#paddedSpace]).
> - !
>
> Item was removed:
> - ----- Method: MultiCharacterBlockScanner>>tab (in category 'stop
> conditions') -----
> - tab
> - 	| currentX |
> - 	currentX := (alignment == Justified and: [self leadingTab not])
> - 		ifTrue:		"imbedded tabs in justified text are weird"
> - 			[destX + (textStyle tabWidth - (line justifiedTabDeltaFor: spaceCount))
> max: destX]
> - 		ifFalse:
> - 			[textStyle
> - 				nextTabXFrom: destX
> - 				leftMargin: leftMargin
> - 				rightMargin: rightMargin].
> - 	lastSpaceOrTabExtent := lastCharacterExtent copy.
> - 	self lastSpaceOrTabExtentSetX: (currentX - destX max: 0).
> - 	currentX >= characterPoint x
> - 		ifTrue:
> - 			[lastCharacterExtent := lastSpaceOrTabExtent copy.
> - 			^ self crossedX].
> - 	destX := currentX.
> - 	lastIndex := lastIndex + 1.
> - 	^false!
>
> Item was removed:
> - Object subclass: #MultiCharacterScanner
> - 	instanceVariableNames: 'destX lastIndex xTable destY stopConditions text
> textStyle alignment leftMargin rightMargin font line runStopIndex spaceCount
> spaceWidth emphasisCode kern indentationLevel wantsColumnBreaks presentation
> presentationLine numOfComposition baselineY firstDestX'
> - 	classVariableNames: 'DefaultStopConditions NilCondition
> PaddedSpaceCondition SpaceCondition'
> - 	poolDictionaries: 'TextConstants'
> - 	category: 'Etoys-Squeakland-Multilingual-Scanning'!
>
> Item was removed:
> - ----- Method: MultiCharacterScanner class>>initialize (in category 'class
> initialization') -----
> - initialize
> - "
> - 	MultiCharacterScanner initialize
> - "
> - 	| a |
> - 	a := Array new: 258.
> - 	a at: 1 + 1 put: #embeddedObject.
> - 	a at: Tab asciiValue + 1 put: #tab.
> - 	a at: CR asciiValue + 1 put: #cr.
> - 	a at: EndOfRun put: #endOfRun.
> - 	a at: CrossedX put: #crossedX.
> - 	NilCondition := a copy.
> - 	DefaultStopConditions := a copy.
> -
> - 	PaddedSpaceCondition := a copy.
> - 	PaddedSpaceCondition at: Space asciiValue + 1 put: #paddedSpace.
> - 	
> - 	SpaceCondition := a copy.
> - 	SpaceCondition at: Space asciiValue + 1 put: #space.
> - !
>
> Item was removed:
> - ----- Method: MultiCharacterScanner>>addCharToPresentation: (in category
> 'multilingual scanning') -----
> - addCharToPresentation: char
> -
> - !
>
> Item was removed:
> - ----- Method: MultiCharacterScanner>>addEmphasis: (in category 'private')
> -----
> - addEmphasis: code
> - 	"Set the bold-ital-under-strike emphasis."
> - 	emphasisCode := emphasisCode bitOr: code!
>
> Item was removed:
> - ----- Method: MultiCharacterScanner>>addKern: (in category 'private')
> -----
> - addKern: kernDelta
> - 	"Set the current kern amount."
> - 	kern := kern + kernDelta!
>
> Item was removed:
> - ----- Method:
> MultiCharacterScanner>>basicScanCharactersFrom:to:in:rightX:stopConditions:kern:
> (in category 'scanning') -----
> - basicScanCharactersFrom: startIndex to: stopIndex in: sourceString rightX:
> rightX stopConditions: stops kern: kernDelta
> - 	"Primitive. This is the inner loop of text display--but see
> - 	scanCharactersFrom: to:rightX: which would get the string,
> - 	stopConditions and displaying from the instance. March through source
> - 	String from startIndex to stopIndex. If any character is flagged with a
> - 	non-nil entry in stops, then return the corresponding value. Determine
> - 	width of each character from xTable, indexed by map.
> - 	If dextX would exceed rightX, then return stops at: 258.
> - 	Advance destX by the width of the character. If stopIndex has been
> - 	reached, then return stops at: 257. Optional.
> - 	See Object documentation whatIsAPrimitive."
> - 	| ascii nextDestX char |
> - 	<primitive: 103>
> - 	lastIndex := startIndex.
> - 	[lastIndex <= stopIndex]
> - 		whileTrue:
> - 			[char := (sourceString at: lastIndex).
> - 			ascii := char asciiValue + 1.
> - 			(stops at: ascii) == nil ifFalse: [^stops at: ascii].
> - 			"Note: The following is querying the font about the width
> - 			since the primitive may have failed due to a non-trivial
> - 			mapping of characters to glyphs or a non-existing xTable."
> - 			nextDestX := destX + (font widthOf: char).
> - 			nextDestX > rightX ifTrue: [^stops at: CrossedX].
> - 			destX := nextDestX + kernDelta.
> - 			lastIndex := lastIndex + 1].
> - 	lastIndex := stopIndex.
> - 	^stops at: EndOfRun!
>
> Item was removed:
> - ----- Method: MultiCharacterScanner>>columnBreak (in category 'scanning')
> -----
> - columnBreak
> -
> - 	^true!
>
> Item was removed:
> - ----- Method: MultiCharacterScanner>>combinableChar:for: (in category
> 'scanner methods') -----
> - combinableChar: char for: prevEntity
> -
> - !
>
> Item was removed:
> - ----- Method: MultiCharacterScanner>>embeddedObject (in category
> 'scanning') -----
> - embeddedObject
> - 	| savedIndex |
> - 	savedIndex := lastIndex.
> - 	text attributesAt: lastIndex do:[:attr|
> - 		attr anchoredMorph ifNotNil:[
> - 			"Following may look strange but logic gets reversed.
> - 			If the morph fits on this line we're not done (return false for true)
> - 			and if the morph won't fit we're done (return true for false)"
> - 			(self placeEmbeddedObject: attr anchoredMorph) ifFalse:[^true]]].
> - 	lastIndex := savedIndex + 1. "for multiple(!!) embedded morphs"
> - 	^false!
>
> Item was removed:
> - ----- Method: MultiCharacterScanner>>handleIndentation (in category
> 'scanning') -----
> - handleIndentation
> - 	self indentationLevel timesRepeat: [
> - 		self plainTab]!
>
> Item was removed:
> - ----- Method: MultiCharacterScanner>>indentationLevel (in category
> 'scanning') -----
> - indentationLevel
> - 	"return the number of tabs that are currently being placed at the
> beginning of each line"
> - 	^indentationLevel ifNil:[0]!
>
> Item was removed:
> - ----- Method: MultiCharacterScanner>>indentationLevel: (in category
> 'scanning') -----
> - indentationLevel: anInteger
> - 	"set the number of tabs to put at the beginning of each line"
> - 	indentationLevel := anInteger!
>
> Item was removed:
> - ----- Method: MultiCharacterScanner>>initialize (in category 'initialize')
> -----
> - initialize
> - 	destX := destY := leftMargin := 0.!
>
> Item was removed:
> - ----- Method: MultiCharacterScanner>>initializeFromParagraph:clippedBy:
> (in category 'private') -----
> - initializeFromParagraph: aParagraph clippedBy: clippingRectangle
> -
> - 	text := aParagraph text.
> - 	textStyle := aParagraph textStyle.
> - !
>
> Item was removed:
> - ----- Method: MultiCharacterScanner>>initializeStringMeasurer (in category
> 'initialize') -----
> - initializeStringMeasurer
> - 	stopConditions := Array new: 258.
> - 	stopConditions at: CrossedX put: #crossedX.
> - 	stopConditions at: EndOfRun put: #endOfRun.
> - !
>
> Item was removed:
> - ----- Method: MultiCharacterScanner>>isBreakableAt:in:in: (in category
> 'scanner methods') -----
> - isBreakableAt: index in: sourceString in: encodingClass
> -
> - 	^ encodingClass isBreakableAt: index in: sourceString.
> - !
>
> Item was removed:
> - ----- Method: MultiCharacterScanner>>leadingTab (in category 'scanning')
> -----
> - leadingTab
> - 	"return true if only tabs lie to the left"
> - 	line first to: lastIndex do:
> - 		[:i | (text at: i) == Tab ifFalse: [^ false]].
> - 	^ true!
>
> Item was removed:
> - ----- Method: MultiCharacterScanner>>measureString:inFont:from:to: (in
> category 'scanning') -----
> - measureString: aString inFont: aFont from: startIndex to: stopIndex
> - 	"WARNING: In order to use this method the receiver has to be set up using
> #initializeStringMeasurer"
> - 	destX := destY := lastIndex := 0.
> - 	baselineY := aFont ascent.
> - 	xTable := aFont xTable.
> - 	font := aFont.  " added Dec 03, 2004 "
> - "	map := aFont characterToGlyphMap."
> - 	self scanCharactersFrom: startIndex to: stopIndex in: aString rightX:
> 999999 stopConditions: stopConditions kern: 0.
> - 	^destX!
>
> Item was removed:
> - ----- Method: MultiCharacterScanner>>placeEmbeddedObject: (in category
> 'scanning') -----
> - placeEmbeddedObject: anchoredMorph
> - 	"Place the anchoredMorph or return false if it cannot be placed.
> - 	In any event, advance destX by its width."
> - 	| w |
> - 	"Workaround: The following should really use #textAnchorType"
> - 	anchoredMorph relativeTextAnchorPosition ifNotNil:[^true].
> - 	destX := destX + (w := anchoredMorph width).
> - 	(destX > rightMargin and: [(leftMargin + w) <= rightMargin])
> - 		ifTrue: ["Won't fit, but would on next line"
> - 				^ false].
> - 	lastIndex := lastIndex + 1.
> - 	self setFont.  "Force recalculation of emphasis for next run"
> - 	^ true!
>
> Item was removed:
> - ----- Method: MultiCharacterScanner>>plainTab (in category 'scanning')
> -----
> - plainTab
> - 	"This is the basic method of adjusting destX for a tab."
> - 	destX := (alignment == Justified and: [self leadingTab not])
> - 		ifTrue:		"embedded tabs in justified text are weird"
> - 			[destX + (textStyle tabWidth - (line justifiedTabDeltaFor: spaceCount))
> max: destX]
> - 		ifFalse:
> - 			[textStyle nextTabXFrom: destX
> - 				leftMargin: leftMargin
> - 				rightMargin: rightMargin]!
>
> Item was removed:
> - ----- Method: MultiCharacterScanner>>registerBreakableIndex (in category
> 'multilingual scanning') -----
> - registerBreakableIndex
> -
> - 	"Record left x and character index of the line-wrappable point.
> - 	The default implementation here does nothing."
> -
> - 	^ false.
> - !
>
> Item was removed:
> - ----- Method: MultiCharacterScanner>>removeLastCharFromPresentation (in
> category 'multilingual scanning') -----
> - removeLastCharFromPresentation
> - !
>
> Item was removed:
> - ----- Method:
> MultiCharacterScanner>>scanCharactersFrom:to:in:rightX:stopConditions:kern:
> (in category 'scanning') -----
> - scanCharactersFrom: startIndex to: stopIndex in: sourceString rightX:
> rightX stopConditions: stops kern: kernDelta
> -
> - 	| startEncoding selector |
> - 	(sourceString isByteString) ifTrue: [^ self basicScanCharactersFrom:
> startIndex to: stopIndex in: sourceString rightX: rightX stopConditions:
> stops kern: kernDelta.].
> -
> - 	(sourceString isWideString) ifTrue: [
> - 		startIndex > stopIndex ifTrue: [lastIndex := stopIndex. ^ stops at:
> EndOfRun].
> - 		startEncoding :=  (sourceString at: startIndex) leadingChar.
> - 		selector := EncodedCharSet scanSelectorAt: startEncoding.
> - 		^ self perform: selector withArguments: (Array with: startIndex with:
> stopIndex with: sourceString with: rightX with: stopConditions with:
> kernDelta).
> - 	].
> - 	
> - 	^ stops at: EndOfRun
> - !
>
> Item was removed:
> - ----- Method:
> MultiCharacterScanner>>scanJapaneseCharactersFrom:to:in:rightX:stopConditions:kern:
> (in category 'scanner methods') -----
> - scanJapaneseCharactersFrom: startIndex to: stopIndex in: sourceString
> rightX: rightX stopConditions: stops kern: kernDelta
> -
> - 	| ascii encoding f nextDestX maxAscii startEncoding |
> - 	lastIndex := startIndex.
> - 	lastIndex > stopIndex ifTrue: [lastIndex := stopIndex. ^ stops at:
> EndOfRun].
> - 	startEncoding := (sourceString at: startIndex) leadingChar.
> - 	font ifNil: [font := (TextConstants at: #DefaultMultiStyle) fontArray at:
> 1].
> - 	((font isMemberOf: StrikeFontSet) or: [font isKindOf: TTCFontSet])
> ifTrue: [
> - 		[f := font fontArray at: startEncoding + 1]
> - 			on: Exception do: [:ex | f := font fontArray at: 1].
> - 		f ifNil: [ f := font fontArray at: 1].
> - 		maxAscii := f maxAscii.
> - 		"xTable := f xTable.
> - 		maxAscii := xTable size - 2."
> - 		spaceWidth := f widthOf: Space.
> - 	] ifFalse: [
> - 		(font isMemberOf: HostFont) ifTrue: [
> - 			f := font.
> - 			maxAscii := f maxAscii.
> - 			spaceWidth := f widthOf: Space.
> - 		] ifFalse: [
> - 			maxAscii := font maxAscii.
> - 		].
> - 	].
> - 	[lastIndex <= stopIndex] whileTrue: [
> - 		"self halt."
> - 		encoding := (sourceString at: lastIndex) leadingChar.
> - 		encoding ~= startEncoding ifTrue: [lastIndex := lastIndex - 1. ^ stops
> at: EndOfRun].
> - 		ascii := (sourceString at: lastIndex) charCode.
> - 		ascii > maxAscii ifTrue: [ascii := maxAscii].
> - 		(encoding = 0 and: [(stopConditions at: ascii + 1) ~~ nil]) ifTrue: [^
> stops at: ascii + 1].
> - 		(self isBreakableAt: lastIndex in: sourceString in: (EncodedCharSet
> charsetAt: encoding)) ifTrue: [
> - 			self registerBreakableIndex.
> - 		].
> - 		nextDestX := destX + (font widthOf: (sourceString at: lastIndex)).
> - 		nextDestX > rightX ifTrue: [firstDestX ~= destX ifTrue: [^ stops at:
> CrossedX]].
> - 		destX := nextDestX + kernDelta.
> - 		lastIndex := lastIndex + 1.
> - 	].
> - 	lastIndex := stopIndex.
> - 	^ stops at: EndOfRun!
>
> Item was removed:
> - ----- Method:
> MultiCharacterScanner>>scanMultiCharactersCombiningFrom:to:in:rightX:stopConditions:kern:
> (in category 'scanner methods') -----
> - scanMultiCharactersCombiningFrom: startIndex to: stopIndex in:
> sourceString rightX: rightX stopConditions: stops kern: kernDelta
> -
> - 	| charCode encoding f maxAscii startEncoding combining combined
> combiningIndex c |
> - 	lastIndex := startIndex.
> - 	lastIndex > stopIndex ifTrue: [lastIndex := stopIndex. ^ stops at:
> EndOfRun].
> - 	startEncoding := (sourceString at: startIndex) leadingChar.
> - 	font ifNil: [font := (TextConstants at: #DefaultMultiStyle) fontArray at:
> 1].
> - 	((font isMemberOf: StrikeFontSet) or: [font isKindOf: TTCFontSet])
> ifTrue: [
> - 		[f := font fontArray at: startEncoding + 1]
> - 			on: Exception do: [:ex | f := font fontArray at: 1].
> - 		f ifNil: [ f := font fontArray at: 1].
> - 		maxAscii := f maxAscii.
> - 		spaceWidth := font widthOf: Space.
> - 	] ifFalse: [
> - 		maxAscii := font maxAscii.
> - 		spaceWidth := font widthOf: Space.
> - 	].
> -
> - 	combining := nil.
> - 	[lastIndex <= stopIndex] whileTrue: [
> - 		charCode := (sourceString at: lastIndex) charCode.
> - 		c := (sourceString at: lastIndex).
> - 		combining ifNil: [
> - 			combining := CombinedChar new.
> - 			combining add: c.
> - 			combiningIndex := lastIndex.
> - 			lastIndex := lastIndex + 1.
> - 		] ifNotNil: [
> - 			(combining add: c) ifFalse: [
> - 				self addCharToPresentation: (combined := combining combined).
> - 				combining := CombinedChar new.
> - 				combining add: c.
> - 				charCode := combined charCode.
> - 				encoding := combined leadingChar.
> - 				encoding ~= startEncoding ifTrue: [lastIndex := lastIndex - 1.
> - 					(encoding = 0 and: [(stopConditions at: charCode + 1) ~~ nil])
> ifTrue: [
> - 						^ stops at: charCode + 1
> - 					] ifFalse: [
> - 						 ^ stops at: EndOfRun
> - 					].
> - 				].
> - 				charCode > maxAscii ifTrue: [charCode := maxAscii].
> - 				""
> - 				(encoding = 0 and: [(stopConditions at: charCode + 1) ~~ nil]) ifTrue:
> [
> - 					combining ifNotNil: [
> - 						self addCharToPresentation: (combining combined).
> - 					].
> - 					^ stops at: charCode + 1
> - 				].
> - 				(self isBreakableAt: lastIndex in: sourceString in: Latin1Environment)
> ifTrue: [
> - 					self registerBreakableIndex.
> - 				].		
> - 				destX > rightX ifTrue: [
> - 					destX ~= firstDestX ifTrue: [
> - 						lastIndex := combiningIndex.
> - 						self removeLastCharFromPresentation.
> - 						^ stops at: CrossedX]].
> - 				combiningIndex := lastIndex.
> - 				lastIndex := lastIndex + 1.
> - 			] ifTrue: [
> - 				lastIndex := lastIndex + 1.
> - 				numOfComposition := numOfComposition + 1.
> - 			].
> - 		].
> - 	].
> - 	lastIndex := stopIndex.
> - 	combining ifNotNil: [
> - 		combined := combining combined.
> - 		self addCharToPresentation: combined.
> - 		"assuming that there is always enough space for at least one character".
> - 		destX := destX + (self widthOf: combined inFont: font).
> - 	].
> - 	^ stops at: EndOfRun!
>
> Item was removed:
> - ----- Method:
> MultiCharacterScanner>>scanMultiCharactersFrom:to:in:rightX:stopConditions:kern:
> (in category 'scanning') -----
> - scanMultiCharactersFrom: startIndex to: stopIndex in: sourceString rightX:
> rightX stopConditions: stops kern: kernDelta
> -
> - 	| ascii encoding f nextDestX maxAscii startEncoding |
> - 	lastIndex := startIndex.
> - 	lastIndex > stopIndex ifTrue: [lastIndex := stopIndex. ^ stops at:
> EndOfRun].
> - 	startEncoding := (sourceString at: startIndex) leadingChar.
> - 	font ifNil: [font := (TextConstants at: #DefaultMultiStyle) fontArray at:
> 1].
> - 	((font isMemberOf: StrikeFontSet) or: [font isKindOf: TTCFontSet])
> ifTrue: [
> - 		[f := font fontArray at: startEncoding + 1]
> - 			on: Exception do: [:ex | f := font fontArray at: 1].
> - 		f ifNil: [ f := font fontArray at: 1].
> - 		maxAscii := f maxAscii.
> - 		spaceWidth := f widthOf: Space.
> - 	] ifFalse: [
> - 		maxAscii := font maxAscii.
> - 	].
> -
> - 	[lastIndex <= stopIndex] whileTrue: [
> - 		encoding := (sourceString at: lastIndex) leadingChar.
> - 		encoding ~= startEncoding ifTrue: [lastIndex := lastIndex - 1. ^ stops
> at: EndOfRun].
> - 		ascii := (sourceString at: lastIndex) charCode.
> - 		ascii > maxAscii ifTrue: [ascii := maxAscii].
> - 		(encoding = 0 and: [ascii < stopConditions size and: [(stopConditions
> at: ascii + 1) ~~ nil]]) ifTrue: [^ stops at: ascii + 1].
> - 		(self isBreakableAt: lastIndex in: sourceString in: Latin1Environment)
> ifTrue: [
> - 			self registerBreakableIndex.
> - 		].
> - 		nextDestX := destX + (font widthOf: (sourceString at: lastIndex)).
> - 		nextDestX > rightX ifTrue: [destX ~= firstDestX ifTrue: [^ stops at:
> CrossedX]].
> - 		destX := nextDestX + kernDelta.
> - 		lastIndex := lastIndex + 1.
> - 	].
> - 	lastIndex := stopIndex.
> - 	^ stops at: EndOfRun!
>
> Item was removed:
> - ----- Method:
> MultiCharacterScanner>>scanMultiCharactersR2LFrom:to:in:rightX:stopConditions:kern:
> (in category 'scanner methods') -----
> - scanMultiCharactersR2LFrom: startIndex to: stopIndex in: sourceString
> rightX: rightX stopConditions: stops kern: kernDelta
> -
> - 	"Note that 'rightX' really means 'endX' in R2L context.  Ie.  rightX is
> usually smaller than destX."
> - 	| ascii encoding f nextDestX maxAscii startEncoding |
> - 	lastIndex := startIndex.
> - 	lastIndex > stopIndex ifTrue: [lastIndex := stopIndex. ^ stops at:
> EndOfRun].
> - 	startEncoding := (sourceString at: startIndex) leadingChar.
> - 	font ifNil: [font := (TextConstants at: #DefaultMultiStyle) fontArray at:
> 1].
> - 	((font isMemberOf: StrikeFontSet) or: [font isKindOf: TTCFontSet])
> ifTrue: [
> - 		[f := font fontArray at: startEncoding + 1]
> - 			on: Exception do: [:ex | f := font fontArray at: 1].
> - 		f ifNil: [ f := font fontArray at: 1].
> - 		maxAscii := f maxAscii.
> - 		spaceWidth := f widthOf: Space.
> - 	] ifFalse: [
> - 		maxAscii := font maxAscii.
> - 	].
> -
> - 	[lastIndex <= stopIndex] whileTrue: [
> - 		encoding := (sourceString at: lastIndex) leadingChar.
> - 		encoding ~= startEncoding ifTrue: [lastIndex := lastIndex - 1. ^ stops
> at: EndOfRun].
> - 		ascii := (sourceString at: lastIndex) charCode.
> - 		ascii > maxAscii ifTrue: [ascii := maxAscii].
> - 		(encoding = 0 and: [(stopConditions at: ascii + 1) ~~ nil]) ifTrue: [^
> stops at: ascii + 1].
> - 		(self isBreakableAt: lastIndex in: sourceString in: Latin1Environment)
> ifTrue: [
> - 			self registerBreakableIndex.
> - 		].
> - 		nextDestX := destX - (font widthOf: (sourceString at: lastIndex)).
> - 		nextDestX < rightX ifTrue: [^ stops at: CrossedX].
> - 		destX := nextDestX - kernDelta.
> - 		lastIndex := lastIndex + 1.
> - 	].
> - 	lastIndex := stopIndex.
> - 	^ stops at: EndOfRun!
>
> Item was removed:
> - ----- Method:
> MultiCharacterScanner>>scanSimChineseCharactersFrom:to:in:rightX:stopConditions:kern:
> (in category 'scanner methods') -----
> - scanSimChineseCharactersFrom: startIndex to: stopIndex in: sourceString
> rightX: rightX stopConditions: stops kern: kernDelta
> -
> - 	| ascii encoding f nextDestX maxAscii startEncoding |
> - 	lastIndex := startIndex.
> - 	lastIndex > stopIndex ifTrue: [lastIndex := stopIndex. ^ stops at:
> EndOfRun].
> - 	startEncoding := (sourceString at: startIndex) leadingChar.
> - 	font ifNil: [font := (TextConstants at: #DefaultMultiStyle) fontArray at:
> 1].
> - 	((font isMemberOf: StrikeFontSet) or: [font isKindOf: TTCFontSet])
> ifTrue: [
> - 		[f := font fontArray at: startEncoding + 1]
> - 			on: Exception do: [:ex | f := font fontArray at: 1].
> - 		f ifNil: [ f := font fontArray at: 1].
> - 		maxAscii := f maxAscii.
> - 		"xTable := f xTable.
> - 		maxAscii := xTable size - 2."
> - 		spaceWidth := f widthOf: Space.
> - 	] ifFalse: [
> - 		(font isMemberOf: HostFont) ifTrue: [
> - 			f := font.
> - 			maxAscii := f maxAscii.
> - 			spaceWidth := f widthOf: Space.
> - 		] ifFalse: [
> - 			maxAscii := font maxAscii.
> - 		].
> - 	].
> - 	[lastIndex <= stopIndex] whileTrue: [
> - 		"self halt."
> - 		encoding := (sourceString at: lastIndex) leadingChar.
> - 		encoding ~= startEncoding ifTrue: [lastIndex := lastIndex - 1. ^ stops
> at: EndOfRun].
> - 		ascii := (sourceString at: lastIndex) charCode.
> - 		ascii > maxAscii ifTrue: [ascii := maxAscii].
> - 		(encoding = 0 and: [(stopConditions at: ascii + 1) ~~ nil]) ifTrue: [^
> stops at: ascii + 1].
> - 		(self isBreakableAt: lastIndex in: sourceString in: (EncodedCharSet
> charsetAt: encoding)) ifTrue: [
> - 			self registerBreakableIndex.
> - 		].
> - 		nextDestX := destX + (font widthOf: (sourceString at: lastIndex)).
> - 		nextDestX > rightX ifTrue: [firstDestX ~= destX ifTrue: [^ stops at:
> CrossedX]].
> - 		destX := nextDestX + kernDelta.
> - 		lastIndex := lastIndex + 1.
> - 	].
> - 	lastIndex := stopIndex.
> - 	^ stops at: EndOfRun!
>
> Item was removed:
> - ----- Method: MultiCharacterScanner>>setActualFont: (in category
> 'private') -----
> - setActualFont: aFont
> - 	"Set the basal font to an isolated font reference."
> -
> - 	font := aFont!
>
> Item was removed:
> - ----- Method: MultiCharacterScanner>>setAlignment: (in category 'private')
> -----
> - setAlignment: style
> - 	alignment := style.
> - 	!
>
> Item was removed:
> - ----- Method: MultiCharacterScanner>>setConditionArray: (in category
> 'private') -----
> - setConditionArray: aSymbol
> -
> - 	aSymbol == #paddedSpace ifTrue: [^stopConditions := PaddedSpaceCondition
> "copy"].
> - 	"aSymbol == #space ifTrue: [^stopConditions := SpaceCondition copy]."
> - 	aSymbol == nil ifTrue: [^stopConditions := NilCondition "copy"].
> - 	self error: 'undefined stopcondition for space character'.
> - !
>
> Item was removed:
> - ----- Method: MultiCharacterScanner>>setFont (in category 'private') -----
> - setFont
> - 	| priorFont |
> - 	"Set the font and other emphasis."
> - 	priorFont := font.
> - 	text == nil ifFalse:[
> - 		emphasisCode := 0.
> - 		kern := 0.
> - 		indentationLevel := 0.
> - 		alignment := textStyle alignment.
> - 		font := nil.
> - 		(text attributesAt: lastIndex forStyle: textStyle)
> - 			do: [:att | att emphasizeScanner: self]].
> - 	font == nil ifTrue:
> - 		[self setFont: textStyle defaultFontIndex].
> - 	font := font emphasized: emphasisCode.
> - 	priorFont ifNotNil: [destX := destX + priorFont descentKern].
> - 	destX := destX - font descentKern.
> - 	"NOTE: next statement should be removed when clipping works"
> - 	leftMargin ifNotNil: [destX := destX max: leftMargin].
> - 	kern := kern - font baseKern.
> -
> - 	"Install various parameters from the font."
> - 	spaceWidth := font widthOf: Space.
> - 	xTable := font xTable.
> - "	map := font characterToGlyphMap."
> - 	stopConditions := DefaultStopConditions.!
>
> Item was removed:
> - ----- Method: MultiCharacterScanner>>setFont: (in category 'private')
> -----
> - setFont: fontNumber
> - 	"Set the font by number from the textStyle."
> -
> - 	self setActualFont: (textStyle fontAt: fontNumber)!
>
> Item was removed:
> - ----- Method: MultiCharacterScanner>>text:textStyle: (in category
> 'private') -----
> - text: t textStyle: ts
> - 	text := t.
> - 	textStyle := ts!
>
> Item was removed:
> - ----- Method: MultiCharacterScanner>>textColor: (in category 'private')
> -----
> - textColor: ignored
> - 	"Overridden in DisplayScanner"!
>
> Item was removed:
> - ----- Method: MultiCharacterScanner>>wantsColumnBreaks: (in category
> 'initialize') -----
> - wantsColumnBreaks: aBoolean
> -
> - 	wantsColumnBreaks := aBoolean!
>
> Item was removed:
> - ----- Method: MultiCharacterScanner>>widthOf:inFont: (in category
> 'multilingual scanning') -----
> - widthOf: char inFont: aFont
> -
> - 	(char isMemberOf: CombinedChar) ifTrue: [
> - 		^ aFont widthOf: char base.
> - 	] ifFalse: [
> - 		^ aFont widthOf: char.
> - 	].
> -
> -
> - !
>
> Item was removed:
> - MultiCharacterScanner subclass: #MultiCompositionScanner
> - 	instanceVariableNames: 'spaceX lineHeight baseline breakableIndex
> lineHeightAtBreak baselineAtBreak breakAtSpace lastWidth'
> - 	classVariableNames: ''
> - 	poolDictionaries: ''
> - 	category: 'Etoys-Squeakland-Multilingual-Scanning'!
>
> Item was removed:
> - ----- Method: MultiCompositionScanner>>addCharToPresentation: (in category
> 'multilingual scanning') -----
> - addCharToPresentation: char
> -
> - 	presentation nextPut: char.
> - 	lastWidth := self widthOf: char inFont: font.
> - 	destX := destX + lastWidth.
> - !
>
> Item was removed:
> - ----- Method: MultiCompositionScanner>>columnBreak (in category 'stop
> conditions') -----
> - columnBreak
> -
> - 	"Answer true. Set up values for the text line interval currently being
> - 	composed."
> -
> - 	line stop: lastIndex.
> - 	presentationLine stop: lastIndex - numOfComposition.
> - 	spaceX := destX.
> - 	line paddingWidth: rightMargin - spaceX.
> - 	presentationLine paddingWidth: rightMargin - spaceX.
> - 	^true!
>
> Item was removed:
> - ----- Method:
> MultiCompositionScanner>>composeFrom:inRectangle:firstLine:leftSide:rightSide:
> (in category 'scanning') -----
> - composeFrom: startIndex inRectangle: lineRectangle
> - 	firstLine: firstLine leftSide: leftSide rightSide: rightSide
> - 	"Answer an instance of TextLineInterval that represents the next line in
> the paragraph."
> - 	| runLength done stopCondition |
> - 	"Set up margins"
> - 	leftMargin := lineRectangle left.
> - 	leftSide ifTrue: [leftMargin := leftMargin +
> - 						(firstLine ifTrue: [textStyle firstIndent]
> - 								ifFalse: [textStyle restIndent])].
> - 	destX := spaceX := leftMargin.
> - 	firstDestX := destX.
> - 	rightMargin := lineRectangle right.
> - 	rightSide ifTrue: [rightMargin := rightMargin - textStyle rightIndent].
> - 	lastIndex := startIndex.	"scanning sets last index"
> - 	destY := lineRectangle top.
> - 	lineHeight := baseline := 0.  "Will be increased by setFont"
> - 	self setStopConditions.	"also sets font"
> - 	runLength := text runLengthFor: startIndex.
> - 	runStopIndex := (lastIndex := startIndex) + (runLength - 1).
> - 	line := (TextLine start: lastIndex stop: 0 internalSpaces: 0
> paddingWidth: 0)
> - 				rectangle: lineRectangle.
> - 	presentationLine := (TextLine start: lastIndex stop: 0 internalSpaces: 0
> paddingWidth: 0)
> - 				rectangle: lineRectangle.
> - 	numOfComposition := 0.
> - 	spaceCount := 0.
> - 	self handleIndentation.
> - 	leftMargin := destX.
> - 	line leftMargin: leftMargin.
> - 	presentationLine leftMargin: leftMargin.
> -
> - 	presentation := TextStream on: (Text fromString: (WideString new: text
> size)).
> -
> - 	done := false.
> - 	[done]
> - 		whileFalse:
> - 			[stopCondition := self scanCharactersFrom: lastIndex to: runStopIndex
> - 				in: text string rightX: rightMargin stopConditions: stopConditions
> - 				kern: kern.
> - 			"See setStopConditions for stopping conditions for composing."
> - 			(self perform: stopCondition)
> - 				ifTrue: [presentationLine lineHeight: lineHeight + textStyle leading
> - 							baseline: baseline + textStyle leading.
> - 						^ line lineHeight: lineHeight + textStyle leading
> - 							baseline: baseline + textStyle leading]]!
>
> Item was removed:
> - ----- Method:
> MultiCompositionScanner>>composeLine:fromCharacterIndex:inParagraph: (in
> category 'scanning') -----
> - composeLine: lineIndex fromCharacterIndex: startIndex inParagraph:
> aParagraph
> - 	"Answer an instance of TextLineInterval that represents the next line in
> the paragraph."
> - 	| runLength done stopCondition |
> - 	destX := spaceX := leftMargin := aParagraph
> leftMarginForCompositionForLine: lineIndex.
> - 	destY := 0.
> - 	rightMargin := aParagraph rightMarginForComposition.
> - 	leftMargin >= rightMargin ifTrue: [self error: 'No room between margins
> to compose'].
> - 	lastIndex := startIndex.	"scanning sets last index"
> - 	lineHeight := textStyle lineGrid.  "may be increased by setFont:..."
> - 	baseline := textStyle baseline.
> - 	baselineY := destY + baseline.
> - 	self setStopConditions.	"also sets font"
> - 	self handleIndentation.
> - 	runLength := text runLengthFor: startIndex.
> - 	runStopIndex := (lastIndex := startIndex) + (runLength - 1).
> - 	line := TextLineInterval
> - 		start: lastIndex
> - 		stop: 0
> - 		internalSpaces: 0
> - 		paddingWidth: 0.
> - 	presentationLine := TextLineInterval
> - 		start: lastIndex
> - 		stop: 0
> - 		internalSpaces: 0
> - 		paddingWidth: 0.
> - 	numOfComposition := 0.
> - 	presentation := TextStream on: (Text fromString: (WideString new: text
> size)).
> - 	spaceCount := 0.
> - 	done := false.
> - 	[done]
> - 		whileFalse:
> - 			[stopCondition := self scanCharactersFrom: lastIndex to: runStopIndex
> - 				in: text string rightX: rightMargin stopConditions: stopConditions
> - 				kern: kern.
> - 			"See setStopConditions for stopping conditions for composing."
> - 			(self perform: stopCondition)
> - 				ifTrue: [presentationLine lineHeight: lineHeight + textStyle leading
> - 							baseline: baseline + textStyle leading.
> - 						^line lineHeight: lineHeight + textStyle leading
> - 							baseline: baseline + textStyle leading]]!
>
> Item was removed:
> - ----- Method: MultiCompositionScanner>>cr (in category 'stop conditions')
> -----
> - cr
> - 	"Answer true. Set up values for the text line interval currently being
> - 	composed."
> -
> - 	line stop: lastIndex.
> - 	presentationLine stop: lastIndex - numOfComposition.
> - 	spaceX := destX.
> - 	line paddingWidth: rightMargin - spaceX.
> - 	presentationLine paddingWidth: rightMargin - spaceX.
> - 	^true!
>
> Item was removed:
> - ----- Method: MultiCompositionScanner>>crossedX (in category 'stop
> conditions') -----
> - crossedX
> - 	"There is a word that has fallen across the right edge of the composition
> - 	rectangle. This signals the need for wrapping which is done to the last
> - 	space that was encountered, as recorded by the space stop condition."
> -
> - 	(breakAtSpace) ifTrue: [
> - 		spaceCount >= 1 ifTrue:
> - 			["The common case. First back off to the space at which we wrap."
> - 			line stop: breakableIndex.
> - 			presentationLine stop: breakableIndex - numOfComposition.
> - 			lineHeight := lineHeightAtBreak.
> - 			baseline := baselineAtBreak.
> - 			spaceCount := spaceCount - 1.
> - 			breakableIndex := breakableIndex - 1.
> -
> - 			"Check to see if any spaces preceding the one at which we wrap.
> - 				Double space after punctuation, most likely."
> - 			[(spaceCount > 1 and: [(text at: breakableIndex) = Space])]
> - 				whileTrue:
> - 					[spaceCount := spaceCount - 1.
> - 					"Account for backing over a run which might
> - 						change width of space."
> - 					font := text fontAt: breakableIndex withStyle: textStyle.
> - 					breakableIndex := breakableIndex - 1.
> - 					spaceX := spaceX - (font widthOf: Space)].
> - 			line paddingWidth: rightMargin - spaceX.
> - 			presentationLine paddingWidth: rightMargin - spaceX.
> - 			presentationLine internalSpaces: spaceCount.
> - 			line internalSpaces: spaceCount]
> - 		ifFalse:
> - 			["Neither internal nor trailing spaces -- almost never happens."
> - 			lastIndex := lastIndex - 1.
> - 			[destX <= rightMargin]
> - 				whileFalse:
> - 					[destX := destX - (font widthOf: (text at: lastIndex)).
> - 					lastIndex := lastIndex - 1].
> - 			spaceX := destX.
> - 			line paddingWidth: rightMargin - destX.
> - 			presentationLine paddingWidth: rightMargin - destX.
> - 			presentationLine stop: (lastIndex max: line first).
> - 			line stop: (lastIndex max: line first)].
> - 		^true
> - 	].
> -
> - 	(breakableIndex isNil or: [breakableIndex < line first]) ifTrue: [
> - 		"Any breakable point in this line.  Just wrap last character."
> - 		breakableIndex := lastIndex - 1.
> - 		lineHeightAtBreak := lineHeight.
> - 		baselineAtBreak := baseline.
> - 	].
> -
> - 	"It wasn't a space, but anyway this is where we break the line."
> - 	line stop: breakableIndex.
> - 	presentationLine stop: breakableIndex.
> - 	lineHeight := lineHeightAtBreak.
> - 	baseline := baselineAtBreak.
> - 	^ true.
> - !
>
> Item was removed:
> - ----- Method: MultiCompositionScanner>>endOfRun (in category 'stop
> conditions') -----
> - endOfRun
> - 	"Answer true if scanning has reached the end of the paragraph.
> - 	Otherwise step conditions (mostly install potential new font) and answer
> - 	false."
> -
> - 	| runLength |
> - 	lastIndex = text size
> - 	ifTrue:	[line stop: lastIndex.
> - 			presentationLine stop: lastIndex - numOfComposition.
> - 			spaceX := destX.
> - 			line paddingWidth: rightMargin - destX.
> - 			presentationLine paddingWidth: rightMargin - destX.
> - 			^true]
> - 	ifFalse:	[
> - 			"(text at: lastIndex) charCode = 32 ifTrue: [destX := destX +
> spaceWidth]."
> - 			runLength := (text runLengthFor: (lastIndex := lastIndex + 1)).
> - 			runStopIndex := lastIndex + (runLength - 1).
> - 			self setStopConditions.
> - 			^false]
> - !
>
> Item was removed:
> - ----- Method: MultiCompositionScanner>>forParagraph: (in category
> 'intialize-release') -----
> - forParagraph: aParagraph
> - 	"Initialize the receiver for scanning the given paragraph."
> -
> - 	self
> - 		initializeFromParagraph: aParagraph
> - 		clippedBy: aParagraph clippingRectangle.
> - !
>
> Item was removed:
> - ----- Method: MultiCompositionScanner>>getPresentation (in category
> 'multilingual scanning') -----
> - getPresentation
> -
> - 	^ presentation contents.
> -
> - !
>
> Item was removed:
> - ----- Method: MultiCompositionScanner>>getPresentationLine (in category
> 'multilingual scanning') -----
> - getPresentationLine
> -
> - 	^ presentationLine.
> - !
>
> Item was removed:
> - ----- Method: MultiCompositionScanner>>isBreakableAt:in:in: (in category
> 'multilingual scanning') -----
> - isBreakableAt: index in: sourceString in: encodingClass
> -
> - 	^ encodingClass isBreakableAt: index in: sourceString.
> - !
>
> Item was removed:
> - ----- Method: MultiCompositionScanner>>placeEmbeddedObject: (in category
> 'stop conditions') -----
> - placeEmbeddedObject: anchoredMorph
> - 	| descent |
> - 	"Workaround: The following should really use #textAnchorType"
> - 	anchoredMorph relativeTextAnchorPosition ifNotNil:[^true].
> - 	(super placeEmbeddedObject: anchoredMorph) ifFalse: ["It doesn't fit"
> - 		"But if it's the first character then leave it here"
> - 		lastIndex < line first ifFalse:[
> - 			line stop: lastIndex-1.
> - 			^ false]].
> - 	descent := lineHeight - baseline.
> - 	lineHeight := lineHeight max: anchoredMorph height.
> - 	baseline := lineHeight - descent.
> - 	line stop: lastIndex.
> - 	presentationLine stop: lastIndex - numOfComposition.
> - 	^ true!
>
> Item was removed:
> - ----- Method: MultiCompositionScanner>>presentation (in category
> 'accessing') -----
> - presentation
> -
> - 	^ presentation.
> - !
>
> Item was removed:
> - ----- Method: MultiCompositionScanner>>presentationLine (in category
> 'accessing') -----
> - presentationLine
> -
> - 	^ presentationLine.
> - !
>
> Item was removed:
> - ----- Method: MultiCompositionScanner>>registerBreakableIndex (in category
> 'multilingual scanning') -----
> - registerBreakableIndex
> -
> - 	"Record left x and character index of the line-wrappable point.
> - 	Used for wrap-around. Answer whether the character has crossed the
> - 	right edge of the composition rectangle of the paragraph."
> -
> - 	(text at: lastIndex) = Character space ifTrue: [
> - 		breakAtSpace := true.
> - 		spaceX := destX.
> - 		spaceCount := spaceCount + 1.
> - 		lineHeightAtBreak := lineHeight.
> - 		baselineAtBreak := baseline.
> - 		breakableIndex := lastIndex.
> - 		destX > rightMargin ifTrue: 	[^self crossedX].
> - 	] ifFalse: [
> - 		breakAtSpace := false.
> - 		lineHeightAtBreak := lineHeight.
> - 		baselineAtBreak := baseline.
> - 		breakableIndex := lastIndex - 1.
> - 	].
> - 	^ false.
> - !
>
> Item was removed:
> - ----- Method: MultiCompositionScanner>>removeLastCharFromPresentation (in
> category 'multilingual scanning') -----
> - removeLastCharFromPresentation
> -
> - 	presentation ifNotNil: [
> - 		presentation position: presentation position - 1.
> - 	].
> - 	destX := destX - lastWidth.
> - !
>
> Item was removed:
> - ----- Method: MultiCompositionScanner>>rightX (in category 'accessing')
> -----
> - rightX
> - 	"Meaningful only when a line has just been composed -- refers to the
> - 	line most recently composed. This is a subtrefuge to allow for easy
> - 	resizing of a composition rectangle to the width of the maximum line.
> - 	Useful only when there is only one line in the form or when each line
> - 	is terminated by a carriage return. Handy for sizing menus and lists."
> -
> - 	breakAtSpace ifTrue: [^ spaceX].
> -
> - 	^ destX.
> - !
>
> Item was removed:
> - ----- Method: MultiCompositionScanner>>setActualFont: (in category
> 'scanning') -----
> - setActualFont: aFont
> - 	"Keep track of max height and ascent for auto lineheight"
> - 	| descent |
> - 	super setActualFont: aFont.
> - 	"'   ', lastIndex printString, '   ' displayAt: (lastIndex * 15)@0."
> - 	lineHeight == nil
> - 		ifTrue: [descent := font descent.
> - 				baseline := font ascent.
> - 				lineHeight := baseline + descent]
> - 		ifFalse: [descent := lineHeight - baseline max: font descent.
> - 				baseline := baseline max: font ascent.
> - 				lineHeight := lineHeight max: baseline + descent]!
>
> Item was removed:
> - ----- Method: MultiCompositionScanner>>setFont (in category 'stop
> conditions') -----
> - setFont
> - 	super setFont.
> - 	breakAtSpace := false.
> - 	wantsColumnBreaks == true ifTrue: [
> - 		stopConditions := stopConditions copy.
> - 		stopConditions at: TextComposer characterForColumnBreak asciiValue + 1
> put: #columnBreak.
> - 	].
> - !
>
> Item was removed:
> - ----- Method: MultiCompositionScanner>>setStopConditions (in category
> 'stop conditions') -----
> - setStopConditions
> - 	"Set the font and the stop conditions for the current run."
> - 	
> - 	self setFont!
>
> Item was removed:
> - ----- Method: MultiCompositionScanner>>tab (in category 'stop conditions')
> -----
> - tab
> - 	"Advance destination x according to tab settings in the paragraph's
> - 	textStyle. Answer whether the character has crossed the right edge of
> - 	the composition rectangle of the paragraph."
> -
> - 	destX := textStyle
> - 				nextTabXFrom: destX leftMargin: leftMargin rightMargin: rightMargin.
> - 	destX > rightMargin ifTrue:	[^self crossedX].
> - 	lastIndex := lastIndex + 1.
> - 	^false
> - !
>
> Item was removed:
> - MultiCharacterScanner subclass: #MultiDisplayScanner
> - 	instanceVariableNames: 'bitBlt lineY runX foregroundColor backgroundColor
> fillBlt lineHeight paragraph paragraphColor morphicOffset
> ignoreColorChanges'
> - 	classVariableNames: ''
> - 	poolDictionaries: ''
> - 	category: 'Etoys-Squeakland-Multilingual-Scanning'!
>
> Item was removed:
> - ----- Method: MultiDisplayScanner class>>defaultFont (in category
> 'queries') -----
> - defaultFont
> - 	^ TextStyle defaultFont!
>
> Item was removed:
> - ----- Method: MultiDisplayScanner>>cr (in category 'stop conditions')
> -----
> - cr
> - 	"When a carriage return is encountered, simply increment the pointer
> - 	into the paragraph."
> -
> - 	lastIndex := lastIndex + 1.
> - 	^false!
>
> Item was removed:
> - ----- Method: MultiDisplayScanner>>crossedX (in category 'stop
> conditions') -----
> - crossedX
> - 	"This condition will sometimes be reached 'legally' during display, when,
> - 	for instance the space that caused the line to wrap actually extends over
> - 	the right boundary. This character is allowed to display, even though it
> - 	is technically outside or straddling the clipping ectangle since it is in
> - 	the normal case not visible and is in any case appropriately clipped by
> - 	the scanner."
> -
> - 	^ true !
>
> Item was removed:
> - ----- Method: MultiDisplayScanner>>displayLine:offset:leftInRun: (in
> category 'scanning') -----
> - displayLine: textLine offset: offset leftInRun: leftInRun
> - 	"The call on the primitive (scanCharactersFrom:to:in:rightX:) will be
> interrupted according to an array of stop conditions passed to the scanner
> at which time the code to handle the stop condition is run and the call on
> the primitive continued until a stop condition returns true (which means the
> line has terminated).  leftInRun is the # of characters left to scan in the
> current run; when 0, it is time to call setStopConditions."
> - 	| done stopCondition nowLeftInRun startIndex string lastPos |
> - 	line := textLine.
> - 	morphicOffset := offset.
> - 	lineY := line top + offset y.
> - 	lineHeight := line lineHeight.
> - 	rightMargin := line rightMargin + offset x.
> - 	lastIndex := line first.
> - 	leftInRun <= 0 ifTrue: [self setStopConditions].
> - 	leftMargin := (line leftMarginForAlignment: alignment) + offset x.
> - 	destX := runX := leftMargin.
> - 	fillBlt == nil ifFalse:
> - 		["Not right"
> - 		fillBlt destX: line left destY: lineY
> - 			width: line width left height: lineHeight; copyBits].
> - 	lastIndex := line first.
> - 	leftInRun <= 0
> - 		ifTrue: [nowLeftInRun := text runLengthFor: lastIndex]
> - 		ifFalse: [nowLeftInRun := leftInRun].
> - 	baselineY := lineY + line baseline.
> - 	destY := baselineY - font ascent.
> - 	runStopIndex := lastIndex + (nowLeftInRun - 1) min: line last.
> - 	spaceCount := 0.
> - 	done := false.
> - 	string := text string.
> - 	[done] whileFalse:[
> - 		startIndex := lastIndex.
> - 		lastPos := destX at destY.
> - 		stopCondition := self scanCharactersFrom: lastIndex to: runStopIndex
> - 						in: string rightX: rightMargin stopConditions: stopConditions
> - 						kern: kern.
> - 		lastIndex >= startIndex ifTrue:[
> - 			font displayString: string on: bitBlt
> - 				from: startIndex
> - 	"XXXX: The following is an interesting bug. All stopConditions exept
> #endOfRun
> - 		have lastIndex past the last character displayed. #endOfRun sets it *on*
> the character.
> - 		If we display up until lastIndex then we will also display invisible
> characters like
> - 		CR and tab. This problem should be fixed in the scanner (i.e., position
> lastIndex
> - 		consistently) but I don't want to deal with the fallout right now so we
> keep the
> - 		fix minimally invasive."
> - 				to: (stopCondition == #endOfRun ifTrue:[lastIndex]
> ifFalse:[lastIndex-1])
> - 				at: lastPos kern: kern baselineY: baselineY].
> - 		"see setStopConditions for stopping conditions for displaying."
> - 		done := self perform: stopCondition.
> - 		"lastIndex > runStopIndex ifTrue: [done := true]."
> - 	].
> - 	^ runStopIndex - lastIndex   "Number of characters remaining in the
> current run"!
>
> Item was removed:
> - ----- Method: MultiDisplayScanner>>displayLines:in:clippedBy: (in category
> 'MVC-compatibility') -----
> - displayLines: linesInterval in: aParagraph clippedBy: visibleRectangle
> - 	"The central display routine. The call on the primitive
> - 	(scanCharactersFrom:to:in:rightX:) will be interrupted according to an
> - 	array of stop conditions passed to the scanner at which time the code to
> - 	handle the stop condition is run and the call on the primitive continued
> - 	until a stop condition returns true (which means the line has
> - 	terminated)."
> - 	| runLength done stopCondition leftInRun startIndex string lastPos |
> - 	"leftInRun is the # of characters left to scan in the current run;
> - 		when 0, it is time to call 'self setStopConditions'"
> - 	morphicOffset := 0 at 0.
> - 	leftInRun := 0.
> - 	self initializeFromParagraph: aParagraph clippedBy: visibleRectangle.
> - 	ignoreColorChanges := false.
> - 	paragraph := aParagraph.
> - 	foregroundColor := paragraphColor := aParagraph foregroundColor.
> - 	backgroundColor := aParagraph backgroundColor.
> - 	aParagraph backgroundColor isTransparent
> - 		ifTrue: [fillBlt := nil]
> - 		ifFalse: [fillBlt := bitBlt copy.  "Blt to fill spaces, tabs, margins"
> - 				fillBlt sourceForm: nil; sourceOrigin: 0 at 0.
> - 				fillBlt fillColor: aParagraph backgroundColor].
> - 	rightMargin := aParagraph rightMarginForDisplay.
> - 	lineY := aParagraph topAtLineIndex: linesInterval first.
> - 	bitBlt destForm deferUpdatesIn: visibleRectangle while: [
> - 		linesInterval do:
> - 			[:lineIndex |
> - 			leftMargin := aParagraph leftMarginForDisplayForLine: lineIndex
> alignment: (alignment ifNil:[textStyle alignment]).
> - 			destX := (runX := leftMargin).
> - 			line := aParagraph lines at: lineIndex.
> - 			lineHeight := line lineHeight.
> - 			fillBlt == nil ifFalse:
> - 				[fillBlt destX: visibleRectangle left destY: lineY
> - 					width: visibleRectangle width height: lineHeight; copyBits].
> - 			lastIndex := line first.
> - 			leftInRun <= 0
> - 				ifTrue: [self setStopConditions.  "also sets the font"
> - 						leftInRun := text runLengthFor: line first].
> - 			baselineY := lineY + line baseline.
> - 			destY := baselineY - font ascent.  "Should have happened in setFont"
> - 			runLength := leftInRun.
> - 			runStopIndex := lastIndex + (runLength - 1) min: line last.
> - 			leftInRun := leftInRun - (runStopIndex - lastIndex + 1).
> - 			spaceCount := 0.
> - 			done := false.
> - 			string := text string.
> - 			self handleIndentation.
> - 			[done] whileFalse:[
> - 				startIndex := lastIndex.
> - 				lastPos := destX at destY.
> - 				stopCondition := self scanCharactersFrom: lastIndex to: runStopIndex
> - 							in: string rightX: rightMargin stopConditions: stopConditions
> - 							kern: kern.
> - 				lastIndex >= startIndex ifTrue:[
> - 					font displayString: string on: bitBlt
> - 						from: startIndex to: lastIndex at: lastPos kern: kern baselineY:
> baselineY].
> - 				"see setStopConditions for stopping conditions for displaying."
> - 				done := self perform: stopCondition].
> - 			fillBlt == nil ifFalse:
> - 				[fillBlt destX: destX destY: lineY width: visibleRectangle right-destX
> height: lineHeight; copyBits].
> - 			lineY := lineY + lineHeight]]!
>
> Item was removed:
> - ----- Method: MultiDisplayScanner>>endOfRun (in category 'stop
> conditions') -----
> - endOfRun
> - 	"The end of a run in the display case either means that there is actually
> - 	a change in the style (run code) to be associated with the string or the
> - 	end of this line has been reached."
> - 	| runLength |
> - 	lastIndex = line last ifTrue: [^true].
> - 	runX := destX.
> - 	runLength := text runLengthFor: (lastIndex := lastIndex + 1).
> - 	runStopIndex := lastIndex + (runLength - 1) min: line last.
> - 	self setStopConditions.
> - 	^ false!
>
> Item was removed:
> - ----- Method: MultiDisplayScanner>>initializeFromParagraph:clippedBy: (in
> category 'MVC-compatibility') -----
> - initializeFromParagraph: aParagraph clippedBy: clippingRectangle
> -
> - 	super initializeFromParagraph: aParagraph clippedBy: clippingRectangle.
> - 	bitBlt := BitBlt asGrafPort toForm: aParagraph destinationForm.
> - 	bitBlt sourceX: 0; width: 0.	"Init BitBlt so that the first call to a
> primitive will not fail"
> - 	bitBlt combinationRule: Form paint.
> - 	bitBlt colorMap:
> - 		(Bitmap with: 0      "Assumes 1-bit deep fonts"
> - 				with: (bitBlt destForm pixelValueFor: aParagraph foregroundColor)).
> - 	bitBlt clipRect: clippingRectangle.
> - !
>
> Item was removed:
> - ----- Method: MultiDisplayScanner>>isBreakableAt:in:in: (in category
> 'multilingual scanning') -----
> - isBreakableAt: index in: sourceString in: encodingClass
> -
> - 	^ false.
> - !
>
> Item was removed:
> - ----- Method: MultiDisplayScanner>>paddedSpace (in category 'stop
> conditions') -----
> - paddedSpace
> - 	"Each space is a stop condition when the alignment is right justified.
> - 	Padding must be added to the base width of the space according to
> - 	which space in the line this space is and according to the amount of
> - 	space that remained at the end of the line when it was composed."
> -
> - 	spaceCount := spaceCount + 1.
> - 	destX := destX + spaceWidth + (line justifiedPadFor: spaceCount).
> - 	lastIndex := lastIndex + 1.
> - 	^ false!
>
> Item was removed:
> - ----- Method: MultiDisplayScanner>>placeEmbeddedObject: (in category
> 'scanning') -----
> - placeEmbeddedObject: anchoredMorph
> - 	anchoredMorph relativeTextAnchorPosition ifNotNil:[
> - 		anchoredMorph position:
> - 			anchoredMorph relativeTextAnchorPosition +
> - 			(anchoredMorph owner textBounds origin x @ 0)
> - 			- (0 at morphicOffset y) + (0 at lineY).
> - 		^true
> - 	].
> - 	(super placeEmbeddedObject: anchoredMorph) ifFalse: [^ false].
> - 	anchoredMorph isMorph ifTrue: [
> - 		anchoredMorph position: ((destX - anchoredMorph width)@lineY) -
> morphicOffset
> - 	] ifFalse: [
> - 		destY := lineY.
> - 		baselineY := lineY + anchoredMorph height..
> - 		runX := destX.
> - 		anchoredMorph
> - 			displayOn: bitBlt destForm
> - 			at: destX - anchoredMorph width @ destY
> - 			clippingBox: bitBlt clipRect
> - 	].
> - 	^ true!
>
> Item was removed:
> - ----- Method: MultiDisplayScanner>>plainTab (in category 'stop
> conditions') -----
> - plainTab
> - 	| oldX |
> - 	oldX := destX.
> - 	super plainTab.
> - 	fillBlt == nil ifFalse:
> - 		[fillBlt destX: oldX destY: destY width: destX - oldX height: font
> height; copyBits]!
>
> Item was removed:
> - ----- Method: MultiDisplayScanner>>presentationText: (in category
> 'private') -----
> - presentationText: t
> -
> - 	text := t.
> - !
>
> Item was removed:
> - ----- Method:
> MultiDisplayScanner>>scanMultiCharactersCombiningFrom:to:in:rightX:stopConditions:kern:
> (in category 'multilingual scanning') -----
> - scanMultiCharactersCombiningFrom: startIndex to: stopIndex in:
> sourceString rightX: rightX stopConditions: stops kern: kernDelta
> -
> - 	| encoding f nextDestX maxAscii startEncoding char charValue |
> - 	lastIndex := startIndex.
> - 	lastIndex > stopIndex ifTrue: [lastIndex := stopIndex. ^ stops at:
> EndOfRun].
> - 	startEncoding := (sourceString at: startIndex) leadingChar.
> - 	font ifNil: [font := (TextConstants at: #DefaultMultiStyle) fontArray at:
> 1].
> - 	((font isMemberOf: StrikeFontSet) or: [font isKindOf: TTCFontSet])
> ifTrue: [
> - 		[f := font fontArray at: startEncoding + 1]
> - 			on: Exception do: [:ex | f := font fontArray at: 1].
> - 		f ifNil: [ f := font fontArray at: 1].
> - 		maxAscii := f maxAscii.
> - 		spaceWidth := f widthOf: Space.
> - 	] ifFalse: [
> - 		maxAscii := font maxAscii.
> - 	].
> -
> - 	[lastIndex <= stopIndex] whileTrue: [
> - 		encoding := (sourceString at: lastIndex) leadingChar.
> - 		encoding ~= startEncoding ifTrue: [lastIndex := lastIndex - 1. ^ stops
> at: EndOfRun].
> - 		char := (sourceString at: lastIndex).
> - 		charValue := char charCode.
> - 		charValue > maxAscii ifTrue: [charValue := maxAscii].
> - 		(encoding = 0 and: [(stopConditions at: charValue + 1) ~~ nil]) ifTrue:
> [
> - 			^ stops at: charValue + 1
> - 		].
> - 		nextDestX := destX + (self widthOf: char inFont: font).
> - 		nextDestX > rightX ifTrue: [^ stops at: CrossedX].
> - 		destX := nextDestX + kernDelta.
> - 		lastIndex := lastIndex + 1.
> - 	].
> - 	lastIndex := stopIndex.
> - 	^ stops at: EndOfRun!
>
> Item was removed:
> - ----- Method: MultiDisplayScanner>>setDestForm: (in category 'private')
> -----
> - setDestForm: df
> - 	bitBlt setDestForm: df.!
>
> Item was removed:
> - ----- Method: MultiDisplayScanner>>setFont (in category 'private') -----
> - setFont
> - 	foregroundColor := paragraphColor.
> - 	super setFont.  "Sets font and emphasis bits, and maybe foregroundColor"
> - 	font installOn: bitBlt foregroundColor: foregroundColor backgroundColor:
> Color transparent.
> - 	text ifNotNil:[
> - 		baselineY := lineY + line baseline.
> - 		destY := baselineY - font ascent].
> - !
>
> Item was removed:
> - ----- Method: MultiDisplayScanner>>setPort: (in category 'private') -----
> - setPort: aBitBlt
> - 	"Install the BitBlt to use"
> - 	bitBlt := aBitBlt.
> - 	bitBlt sourceX: 0; width: 0.	"Init BitBlt so that the first call to a
> primitive will not fail"
> - 	bitBlt sourceForm: nil. "Make sure font installation won't be confused"
> - !
>
> Item was removed:
> - ----- Method: MultiDisplayScanner>>setStopConditions (in category 'stop
> conditions') -----
> - setStopConditions
> - 	"Set the font and the stop conditions for the current run."
> - 	
> - 	self setFont.
> - 	self setConditionArray: (alignment = Justified ifTrue: [#paddedSpace]).
> -
> - "
> - 	alignment = Justified ifTrue: [
> - 		stopConditions == DefaultStopConditions
> - 			ifTrue:[stopConditions := stopConditions copy].
> - 		stopConditions at: Space asciiValue + 1 put: #paddedSpace]
> - "!
>
> Item was removed:
> - ----- Method: MultiDisplayScanner>>tab (in category 'stop conditions')
> -----
> - tab
> - 	self plainTab.
> - 	lastIndex := lastIndex + 1.
> - 	^ false!
>
> Item was removed:
> - ----- Method:
> MultiDisplayScanner>>text:textStyle:foreground:background:fillBlt:ignoreColorChanges:
> (in category 'private') -----
> - text: t textStyle: ts foreground: foreColor background: backColor fillBlt:
> blt ignoreColorChanges: shadowMode
> - 	text := t.
> - 	textStyle := ts.
> - 	foregroundColor := paragraphColor := foreColor.
> - 	(backgroundColor := backColor) isTransparent ifFalse:
> - 		[fillBlt := blt.
> - 		fillBlt fillColor: backgroundColor].
> - 	ignoreColorChanges := shadowMode!
>
> Item was removed:
> - ----- Method: MultiDisplayScanner>>textColor: (in category 'private')
> -----
> - textColor: textColor
> - 	ignoreColorChanges ifTrue: [^ self].
> - 	foregroundColor := textColor!
>
> Item was removed:
> - NewParagraph subclass: #MultiNewParagraph
> - 	instanceVariableNames: 'presentationText presentationLines'
> - 	classVariableNames: ''
> - 	poolDictionaries: 'TextConstants'
> - 	category: 'Etoys-Squeakland-Multilingual-Scanning'!
>
> Item was removed:
> - ----- Method: MultiNewParagraph>>displayOn:using:at: (in category
> 'fonts-display') -----
> - displayOn: aCanvas using: displayScanner at: somePosition
> - 	"Send all visible lines to the displayScanner for display"
> -
> - 	| visibleRectangle offset leftInRun line |
> - 	visibleRectangle := aCanvas clipRect.
> - 	offset := somePosition - positionWhenComposed.
> - 	leftInRun := 0.
> - 	(self lineIndexForPoint: visibleRectangle topLeft)
> - 		to: (self lineIndexForPoint: visibleRectangle bottomRight)
> - 		do: [:i | line := lines at: i.
> - 			self displaySelectionInLine: line on: aCanvas.
> - 			line first <= line last ifTrue:
> - 				[leftInRun := displayScanner displayLine: line
> - 								offset: offset leftInRun: leftInRun]].
> - !
>
> Item was removed:
> - ----- Method: MultiNewParagraph>>displayOnTest:using:at: (in category
> 'fonts-display') -----
> - displayOnTest: aCanvas using: displayScanner at: somePosition
> - 	"Send all visible lines to the displayScanner for display"
> -
> - 	| visibleRectangle offset leftInRun line |
> - 	(presentationText isNil or: [presentationLines isNil]) ifTrue: [
> - 		^ self displayOn: aCanvas using: displayScanner at: somePosition.
> - 	].
> - 	visibleRectangle := aCanvas clipRect.
> - 	offset := somePosition - positionWhenComposed.
> - 	leftInRun := 0.
> - 	(self lineIndexForPoint: visibleRectangle topLeft)
> - 		to: (self lineIndexForPoint: visibleRectangle bottomRight)
> - 		do: [:i | line := presentationLines at: i.
> - 			self displaySelectionInLine: line on: aCanvas.
> - 			line first <= line last ifTrue:
> - 				[leftInRun := displayScanner displayLine: line
> - 								offset: offset leftInRun: leftInRun]].
> - !
>
> Item was removed:
> - ----- Method:
> MultiNewParagraph>>multiComposeLinesFrom:to:delta:into:priorLines:atY: (in
> category 'composition') -----
> - multiComposeLinesFrom: start to: stop delta: delta into: lineColl
> priorLines: priorLines
> - 	atY: startingY
> - 	"While the section from start to stop has changed, composition may ripple
> all the way to the end of the text.  However in a rectangular container, if
> we ever find a line beginning with the same character as before (ie
> corresponding to delta in the old lines), then we can just copy the old
> lines from there to the end of the container, with adjusted indices and
> y-values"
> -
> - 	| newResult composer presentationInfo |
> -
> - 	composer := MultiTextComposer new.
> - 	presentationLines := nil.
> - 	presentationText := nil.
> - 	newResult := composer
> - 		multiComposeLinesFrom: start
> - 		to: stop
> - 		delta: delta
> - 		into: lineColl
> - 		priorLines: priorLines
> - 		atY: startingY
> - 		textStyle: textStyle
> - 		text: text
> - 		container: container
> - 		wantsColumnBreaks: wantsColumnBreaks == true.
> - 	lines := newResult first asArray.
> - 	maxRightX := newResult second.
> - 	presentationInfo := composer getPresentationInfo.
> - 	presentationLines := presentationInfo first asArray.
> - 	presentationText := presentationInfo second.
> - 	"maxRightX printString displayAt: 0 at 0."
> - 	^maxRightX
> - !
>
> Item was removed:
> - ----- Method: MultiNewParagraph>>presentationLines (in category
> 'accessing') -----
> - presentationLines
> -
> - 	^ presentationLines.
> - !
>
> Item was removed:
> - ----- Method: MultiNewParagraph>>presentationText (in category
> 'accessing') -----
> - presentationText
> -
> - 	^ presentationText.
> - !
>
> Item was removed:
> - TextComposer subclass: #MultiTextComposer
> - 	instanceVariableNames: 'presentation presentationLines'
> - 	classVariableNames: ''
> - 	poolDictionaries: 'TextConstants'
> - 	category: 'Etoys-Squeakland-Multilingual-Scanning'!
>
> Item was removed:
> - ----- Method: MultiTextComposer>>composeEachRectangleIn: (in category 'as
> yet unclassified') -----
> - composeEachRectangleIn: rectangles
> -
> - 	| myLine lastChar |
> -
> - 	1 to: rectangles size do: [:i |
> - 		currCharIndex <= theText size ifFalse: [^false].
> - 		myLine := scanner
> - 			composeFrom: currCharIndex
> - 			inRectangle: (rectangles at: i)				
> - 			firstLine: isFirstLine
> - 			leftSide: i=1
> - 			rightSide: i=rectangles size.
> - 		lines addLast: myLine.
> - 		presentationLines addLast: scanner getPresentationLine.
> - 		presentation ifNil: [presentation := scanner getPresentation]
> - 			ifNotNil: [presentation := presentation, scanner getPresentation].
> - 		actualHeight := actualHeight max: myLine lineHeight.  "includes font
> changes"
> - 		currCharIndex := myLine last + 1.
> - 		lastChar := theText at: myLine last.
> - 		lastChar = Character cr ifTrue: [^#cr].
> - 		wantsColumnBreaks ifTrue: [
> - 			lastChar = TextComposer characterForColumnBreak ifTrue:
> [^#columnBreak].
> - 		].
> - 	].
> - 	^false!
>
> Item was removed:
> - ----- Method: MultiTextComposer>>getPresentationInfo (in category 'as yet
> unclassified') -----
> - getPresentationInfo
> -
> - 	^ Array with: presentationLines with: presentation.
> - !
>
> Item was removed:
> - ----- Method:
> MultiTextComposer>>multiComposeLinesFrom:to:delta:into:priorLines:atY:textStyle:text:container:wantsColumnBreaks:
> (in category 'as yet unclassified') -----
> - multiComposeLinesFrom: argStart to: argStop delta: argDelta into:
> argLinesCollection priorLines: argPriorLines atY: argStartY textStyle:
> argTextStyle text: argText container: argContainer wantsColumnBreaks:
> argWantsColumnBreaks
> -
> - 	wantsColumnBreaks := argWantsColumnBreaks.
> - 	lines := argLinesCollection.
> - 	presentationLines := argLinesCollection copy.
> - 	theTextStyle := argTextStyle.
> - 	theText := argText.
> - 	theContainer := argContainer.
> - 	deltaCharIndex := argDelta.
> - 	currCharIndex := startCharIndex := argStart.
> - 	stopCharIndex := argStop.
> - 	prevLines := argPriorLines.
> - 	currentY := argStartY.
> - 	defaultLineHeight := theTextStyle lineGrid.
> - 	maxRightX := theContainer left.
> - 	possibleSlide := stopCharIndex < theText size and: [theContainer
> isMemberOf: Rectangle].
> - 	nowSliding := false.
> - 	prevIndex := 1.
> - 	scanner := MultiCompositionScanner new text: theText textStyle:
> theTextStyle.
> - 	scanner wantsColumnBreaks: wantsColumnBreaks.
> - 	isFirstLine := true.
> - 	self composeAllLines.
> - 	isFirstLine ifTrue: ["No space in container or empty text"
> - 		self
> - 			addNullLineWithIndex: startCharIndex
> - 			andRectangle: (theContainer topLeft extent: 0 at defaultLineHeight)
> - 	] ifFalse: [
> - 		self fixupLastLineIfCR
> - 	].
> - 	^{lines asArray. maxRightX}
> -
> - !
>
>
>
>



More information about the Squeak-dev mailing list