intitial checkin
authorStefan Vogel <sv@exept.de>
Wed, 19 Feb 1997 13:06:26 +0100
changeset 2409 790d1ea9e8ff
parent 2408 fd31506f31ef
child 2410 eea60bba0412
intitial checkin
TextCollectorStream.st
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TextCollectorStream.st	Wed Feb 19 13:06:26 1997 +0100
@@ -0,0 +1,197 @@
+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:[
+        WriteErrorSignal 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.1 1997-02-19 12:06:26 stefan Exp $'
+! !