TextCollectorStream.st
author Jan Vrany <jan.vrany@labware.com>
Wed, 22 Mar 2023 13:57:18 +0000
branchjv
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 $'
! !