TextCollectorStream.st
author |
Jan Vrany <jan.vrany@labware.com> |
|
Tue, 01 Jun 2021 20:19:13 +0100 |
branch | jv |
changeset 25424 |
51bd8a6b196f |
parent 17911 |
a99f15c5efa5
|
permissions |
-rw-r--r-- |
Cherry-picked `Context`
cherry-picked Context.st from a6b6dda4caff:
* 4aaf30c174e9: #DOCUMENTATION by cg, Claus Gittinger <cg@exept.de>
* c67311afcc6c: #OTHER by cg, Claus Gittinger <cg@exept.de>
* 883f79e7b2a6: #FEATURE by cg, Claus Gittinger <cg@exept.de>
* 716f3fbb09e9: Don't mark contexts with `CATCHMARK`, Jan Vrany <jan.vrany@fit.cvut.cz>
* cff24fa817b0: #REFACTORING by stefan, Stefan Vogel <sv@exept.de>
* 521f0d837330: #UI_ENHANCEMENT by cg, Claus Gittinger <cg@exept.de>
* bf1118f0fcca: #UI_ENHANCEMENT by cg, Claus Gittinger <cg@exept.de>
* e587cdd22868: #BUGFIX by cg, Claus Gittinger <cg@exept.de>
* fe9f9487a3ed: #DOCUMENTATION by cg, Claus Gittinger <cg@exept.de>
* d5b781899274: #BUGFIX by cg, Claus Gittinger <cg@exept.de>
* 8258751a7465: #FEATURE by cg, Claus Gittinger <cg@exept.de>
* 40173e082cbc: Copyright updates, Jan Vrany <jan.vrany@fit.cvut.cz>
* 6db5c28207d5: #UI_ENHANCEMENT by cg, Claus Gittinger <cg@exept.de>
* 871ea64fd5dc: #FEATURE by cg, Claus Gittinger <cg@exept.de>
* 4b544a108e4e: #DOCUMENTATION by cg, Claus Gittinger <cg@exept.de>
* 9a8d8399e566: #FEATURE by cgexept.de, Claus Gittinger <cg@exept.de>
* 170b00be0103: #BUGFIX by stefan, Stefan Vogel <sv@exept.de>
* a6c73965eae8: #FEATURE by cg, Claus Gittinger <cg@exept.de>
* ce2a0e462ff0: #FEATURE by cg, Claus Gittinger <cg@exept.de>
* 46a260a9ca92: #FEATURE by cg, Claus Gittinger <cg@exept.de>
* 46cab49167fb: #UI_ENHANCEMENT by exept, Claus Gittinger <cg@exept.de>
* 7d52dfd3997d: #DOCUMENTATION by exept, Claus Gittinger <cg@exept.de>
* c52eeea62763: Fix `Context >> argAndVarNames` in cases when debug info is not available, Jan Vrany <jan.vrany@labware.com>
* b5d6963fe4a9: Backed out changeset c52eeea62763, Jan Vrany <jan.vrany@labware.com>
* 6fd3896f8703: #FEATURE by exept, Claus Gittinger <cg@exept.de>
* b530ee616256: #REFACTORING by cg, Claus Gittinger <cg@exept.de>
* ef9b481d7498: #FEATURE by cg, Claus Gittinger <cg@exept.de>
* ea663b72bd51: #UI_ENHANCEMENT by cg, Claus Gittinger <cg@exept.de>
* 6179572a733c: #FEATURE by exept, Claus Gittinger <cg@exept.de>
* 84155b1b6622: #DOCUMENTATION by exept, Claus Gittinger <cg@exept.de>
* 37d06602d856: *** empty log message ***, Claus Gittinger <cg@exept.de>
* f927b9022fea: *** empty log message ***, Claus Gittinger <cg@exept.de>
* 427d3be62d97: #UI_ENHANCEMENT by exept, Claus Gittinger <cg@exept.de>
"{ 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 $'
! !