TextCollectorStream.st
author |
Jan Vrany <jan.vrany@labware.com> |
|
Wed, 22 Mar 2023 13:57:18 +0000 |
branch | jv |
changeset 25445 |
1623217d2268 |
parent 17911 |
a99f15c5efa5
|
permissions |
-rw-r--r-- |
Cherry-picked OrderedCollection.st from 0b286fd51da7:
* d4c86d7c0bfc: #TUNING by stefan, Stefan Vogel <sv@exept.de>
* 692b6497a669: #DOCUMENTATION by stefan, Stefan Vogel <sv@exept.de>
* d47bb2912953: #DOCUMENTATION by stefan, Stefan Vogel <sv@exept.de>
* abb4316c6bff: #FEATURE by cg, Claus Gittinger <cg@exept.de>
* 3a8fce0e8d11: #TUNING by stefan, Stefan Vogel <sv@exept.de>
* 03d29bf8c5bb: #REFACTORING by stefan, Stefan Vogel <sv@exept.de>
* cccc6c4abcfc: #REFACTORING by stefan, Stefan Vogel <sv@exept.de>
* 35d957c7a840: #FEATURE by cg, Claus Gittinger <cg@exept.de>
* 6b11890f5f2c: #OTHER by cg, Claus Gittinger <cg@exept.de>
* abb6108fb06b: #FEATURE by cg, Claus Gittinger <cg@exept.de>
* 2c4768bb2e89: #FEATURE by cg, Claus Gittinger <cg@exept.de>
* 4029e964d0f1: #FEATURE by cg, Claus Gittinger <cg@exept.de>
* ddcab3a9c2df: #OTHER by cg, Claus Gittinger <cg@exept.de>
* 2213eb56e0c7: #REFACTORING by exept, Claus Gittinger <cg@exept.de>
* 09ca874a6160: #REFACTORING by exept, Claus Gittinger <cg@exept.de>
* 30b332af1f33: #BUGFIX by stefan, Stefan Vogel <sv@exept.de>
* 779764ba117b: #REFACTORING by cg, Claus Gittinger <cg@exept.de>
* b3d232a613c9: #BUGFIX by stefan, Stefan Vogel <sv@exept.de>
* c417f7edaec1: #BUGFIX by stefan, Stefan Vogel <sv@exept.de>
* 904b6538f379: #FEATURE by exept, Claus Gittinger <cg@exept.de>
* c5887f03e01f: #REFACTORING by stefan, Stefan Vogel <sv@exept.de>
* 8912d03aff48: #BUGFIX by exept, Claus Gittinger <cg@exept.de>
* de5cd1dab4c3: #DOCUMENTATION by exept, Claus Gittinger <cg@exept.de>
* 9bbd26603378: #OTHER by exept, Claus Gittinger <cg@exept.de>
* c2c9dc110f42: #FEATURE by stefan, Stefan Vogel <sv@exept.de>
* 81d123c6703d: #DOCUMENTATION by stefan, Stefan Vogel <sv@exept.de>
* 8aadbb21458a: #BUGFIX by stefan, Stefan Vogel <sv@exept.de>
* f210dbb8b2f6: #TUNING by stefan, Stefan Vogel <sv@exept.de>
* c2c774fc53c0: #FEATURE by exept, Claus Gittinger <cg@exept.de>
* b6f462670875: #DOCUMENTATION by exept, Claus Gittinger <cg@exept.de>
* 27ae4021d5d6: #FEATURE by stefan, Stefan Vogel <sv@exept.de>
* 10d9e9d85594: #TUNING by exept, Claus Gittinger <cg@exept.de>
* 2653d855dcc7: #DOCUMENTATION by exept, Claus Gittinger <cg@exept.de>
* 6ea1698a1a34: #FEATURE by stefan, Stefan Vogel <sv@exept.de>
* 28762315e664: #OTHER by exept, Claus Gittinger <cg@exept.de>
* 7142ea786f3e: #TUNING by stefan, Stefan Vogel <sv@exept.de>
* 7875acb42b53: #BUGFIX by stefan, Stefan Vogel <sv@exept.de>
* 163a0eebc97e: #BUGFIX by Maren, matilk
"{ Package: 'stx:libbasic' }"
WriteStream subclass:#TextCollectorStream
instanceVariableNames:'access lineLimit partialLastLine'
classVariableNames:''
poolDictionaries:''
category:'Streams-Misc'
!
!TextCollectorStream class methodsFor:'documentation'!
documentation
"
a textCollectorStream is much like a regular writeStream.
In addition to collecting characters, it does a delayed update
of its collection, and may be used as a model for a TextView to
work like a TextCollector.
Currently ListViews are optimezed for StringCollections as model.
So stream on a StringCollection for best performance.
[author:]
Stefan Vogel
[see also:]
WriteStream
TextCollector StringCollection
"
!
examples
"
[exBegin]
|s|
s := TextCollectorStream on:StringCollection new.
s show:'Hello '.
s showCR:'World'.
s contents inspect
[exEnd]
"
!
history
"Created: 18.2.1997 / 13:18:17 / stefan"
! !
!TextCollectorStream class methodsFor:'defaults'!
defaultLineLimit
"the number of lines remembered by default"
^ 600
"Created: 18.2.1997 / 14:41:38 / stefan"
! !
!TextCollectorStream methodsFor:'accessing'!
access
"return the value of the instance variable 'access' (automatically generated)"
^ access
"Created: 19.2.1997 / 09:01:21 / stefan"
!
access:something
"set the value of the instance variable 'access' (automatically generated)"
access := something.
"Created: 19.2.1997 / 09:01:21 / stefan"
!
lineLimit
"return the value of the instance variable 'lineLimit' (automatically generated)"
^ lineLimit
"Created: 19.2.1997 / 09:01:21 / stefan"
!
lineLimit:something
"set the value of the instance variable 'lineLimit' (automatically generated)"
lineLimit := something.
"Created: 19.2.1997 / 09:01:21 / stefan"
! !
!TextCollectorStream methodsFor:'initialization'!
initialize
super initialize.
"/ access := RecursionLock new.
lineLimit := self class defaultLineLimit.
"first line is empty"
partialLastLine := false.
"Created: 18.2.1997 / 14:39:50 / stefan"
"Modified: 19.2.1997 / 11:59:01 / stefan"
!
on:aCollection
self initialize.
^ super on:aCollection.
"Created: 19.2.1997 / 08:59:45 / stefan"
!
on:aCollection from:start to:end
self initialize.
^ super on:aCollection from:start to:end.
"Created: 19.2.1997 / 09:00:07 / stefan"
!
with:aCollection
self initialize.
^ super with:aCollection.
"Created: 19.2.1997 / 09:00:24 / stefan"
! !
!TextCollectorStream methodsFor:'writing'!
nextPut:anObject
"an Object may be a Character (cr or nl), or anything
responding to #printString."
|string newPartialLastLine size|
(writeLimit notNil
and:[position >= writeLimit]) ifTrue:[
WriteError raiseErrorString:'write beyond writeLimit'
].
anObject isCharacter ifTrue:[
((anObject == Character cr) or:[anObject == Character nl]) ifTrue:[
partialLastLine ifFalse:[
collection add:''. "add empty line"
position := position + 1.
].
partialLastLine := false.
^ anObject.
].
].
string := anObject printString.
(string includes:Character cr) ifTrue:[
newPartialLastLine := (string last ~= Character cr).
string := string asStringCollection.
partialLastLine ifTrue:[
string at:1 put:((collection removeLast ? ''), (string at:1)).
].
size := collection size + string size.
size > lineLimit ifTrue:[
collection removeFirst:(size - lineLimit min:(collection size)).
position := lineLimit.
].
collection addAll:string.
position := position + string size.
partialLastLine := newPartialLastLine.
] ifFalse:[
partialLastLine ifTrue:[
collection add:((collection removeLast ? ''), string).
] ifFalse:[
collection add:string.
position := position + 1.
].
partialLastLine := true.
].
^ anObject
"Created: 18.2.1997 / 14:29:51 / stefan"
"Modified: 19.2.1997 / 11:47:37 / stefan"
!
show:anObject
self nextPut:anObject
"Created: 18.2.1997 / 17:20:53 / stefan"
!
showCR:anObject
self nextPut:anObject; nextPut:Character cr
"Created: 18.2.1997 / 17:21:12 / stefan"
! !
!TextCollectorStream class methodsFor:'documentation'!
version
^ '$Header: /cvs/stx/stx/libbasic/TextCollectorStream.st,v 1.2 2006/04/06 10:54:06 stefan Exp $'
! !