TextCollectorStream.st
author Jan Vrany <jan.vrany@labware.com>
Tue, 01 Jun 2021 20:19:13 +0100
branchjv
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 $'
! !