author | Claus Gittinger <cg@exept.de> |
Tue, 05 Dec 1995 20:12:25 +0100 | |
changeset 238 | a81e517187e4 |
parent 174 | d80a6cc3f9b2 |
child 308 | b216a5efa2c8 |
permissions | -rw-r--r-- |
0 | 1 |
" |
5 | 2 |
COPYRIGHT (c) 1989 by Claus Gittinger |
59 | 3 |
All Rights Reserved |
0 | 4 |
|
5 |
This software is furnished under a license and may be used |
|
6 |
only in accordance with the terms of that license and with the |
|
7 |
inclusion of the above copyright notice. This software may not |
|
8 |
be provided or otherwise made available to, or used by, any |
|
9 |
other person. No title to or ownership of the software is |
|
10 |
hereby transferred. |
|
11 |
" |
|
12 |
||
13 |
EditTextView subclass:#TextCollector |
|
14 |
instanceVariableNames:'entryStream lineLimit destroyAction |
|
59 | 15 |
outstandingLines outstandingLine |
119 | 16 |
flushBlock flushPending inFlush collecting timeDelay access' |
0 | 17 |
classVariableNames:'' |
18 |
poolDictionaries:'' |
|
19 |
category:'Views-Text' |
|
20 |
! |
|
21 |
||
15 | 22 |
!TextCollector class methodsFor:'documentation'! |
23 |
||
34
c4b386a8cc57
critical-lock; allows show:/showCr: from multiple processes
claus
parents:
22
diff
changeset
|
24 |
copyright |
c4b386a8cc57
critical-lock; allows show:/showCr: from multiple processes
claus
parents:
22
diff
changeset
|
25 |
" |
c4b386a8cc57
critical-lock; allows show:/showCr: from multiple processes
claus
parents:
22
diff
changeset
|
26 |
COPYRIGHT (c) 1989 by Claus Gittinger |
59 | 27 |
All Rights Reserved |
34
c4b386a8cc57
critical-lock; allows show:/showCr: from multiple processes
claus
parents:
22
diff
changeset
|
28 |
|
c4b386a8cc57
critical-lock; allows show:/showCr: from multiple processes
claus
parents:
22
diff
changeset
|
29 |
This software is furnished under a license and may be used |
c4b386a8cc57
critical-lock; allows show:/showCr: from multiple processes
claus
parents:
22
diff
changeset
|
30 |
only in accordance with the terms of that license and with the |
c4b386a8cc57
critical-lock; allows show:/showCr: from multiple processes
claus
parents:
22
diff
changeset
|
31 |
inclusion of the above copyright notice. This software may not |
c4b386a8cc57
critical-lock; allows show:/showCr: from multiple processes
claus
parents:
22
diff
changeset
|
32 |
be provided or otherwise made available to, or used by, any |
c4b386a8cc57
critical-lock; allows show:/showCr: from multiple processes
claus
parents:
22
diff
changeset
|
33 |
other person. No title to or ownership of the software is |
c4b386a8cc57
critical-lock; allows show:/showCr: from multiple processes
claus
parents:
22
diff
changeset
|
34 |
hereby transferred. |
c4b386a8cc57
critical-lock; allows show:/showCr: from multiple processes
claus
parents:
22
diff
changeset
|
35 |
" |
c4b386a8cc57
critical-lock; allows show:/showCr: from multiple processes
claus
parents:
22
diff
changeset
|
36 |
! |
c4b386a8cc57
critical-lock; allows show:/showCr: from multiple processes
claus
parents:
22
diff
changeset
|
37 |
|
c4b386a8cc57
critical-lock; allows show:/showCr: from multiple processes
claus
parents:
22
diff
changeset
|
38 |
version |
174
d80a6cc3f9b2
uff - version methods changed to return stings
Claus Gittinger <cg@exept.de>
parents:
155
diff
changeset
|
39 |
^ '$Header: /cvs/stx/stx/libwidg/TextCollector.st,v 1.24 1995-11-11 16:23:12 cg Exp $' |
34
c4b386a8cc57
critical-lock; allows show:/showCr: from multiple processes
claus
parents:
22
diff
changeset
|
40 |
! |
c4b386a8cc57
critical-lock; allows show:/showCr: from multiple processes
claus
parents:
22
diff
changeset
|
41 |
|
15 | 42 |
documentation |
43 |
" |
|
34
c4b386a8cc57
critical-lock; allows show:/showCr: from multiple processes
claus
parents:
22
diff
changeset
|
44 |
a view for editable text, which also understands some stream messages. |
c4b386a8cc57
critical-lock; allows show:/showCr: from multiple processes
claus
parents:
22
diff
changeset
|
45 |
Instances of this view can take the place of a stream and display the |
c4b386a8cc57
critical-lock; allows show:/showCr: from multiple processes
claus
parents:
22
diff
changeset
|
46 |
received text. |
c4b386a8cc57
critical-lock; allows show:/showCr: from multiple processes
claus
parents:
22
diff
changeset
|
47 |
Its main use in the system is the Transcript, but it can also be used for |
110 | 48 |
things like trace-windows, errorLogs etc. |
0 | 49 |
|
60 | 50 |
If collecting is turned on, a textcollector will not immediately display |
34
c4b386a8cc57
critical-lock; allows show:/showCr: from multiple processes
claus
parents:
22
diff
changeset
|
51 |
entered text, but wait for some short time (timeDelay) and collect incoming |
c4b386a8cc57
critical-lock; allows show:/showCr: from multiple processes
claus
parents:
22
diff
changeset
|
52 |
data - finally updating the whole chunk in one piece. |
c4b386a8cc57
critical-lock; allows show:/showCr: from multiple processes
claus
parents:
22
diff
changeset
|
53 |
This helps slow display devices, which would otherwise scroll a lot. |
c4b386a8cc57
critical-lock; allows show:/showCr: from multiple processes
claus
parents:
22
diff
changeset
|
54 |
(on fast displays this is less of a problem). |
15 | 55 |
|
60 | 56 |
The total number of lines kept is controlled by lineLimit, if more lines |
57 |
than this limit are added at the bottom, the textcollector will forget lines |
|
58 |
at the top. |
|
59 |
You can set linelimit to nil (i.e. no limit), but you may need a lot |
|
34
c4b386a8cc57
critical-lock; allows show:/showCr: from multiple processes
claus
parents:
22
diff
changeset
|
60 |
of memory then ... |
77 | 61 |
|
110 | 62 |
StyleSheet paramters (transcript only): |
77 | 63 |
|
64 |
transcriptForegroundColor defaults to textForegroundColor |
|
65 |
transcriptBackgroundColor' defaults to textBackgroundColor. |
|
66 |
||
67 |
transcriptCursorForegroundColor |
|
68 |
transcriptCursorBackgroundColor |
|
15 | 69 |
" |
70 |
! ! |
|
0 | 71 |
|
72 |
!TextCollector class methodsFor:'defaults'! |
|
73 |
||
74 |
defaultLineLimit |
|
15 | 75 |
"the number of lines remembered by default" |
76 |
||
77 |
^ 600 |
|
78 |
! |
|
79 |
||
60 | 80 |
defaultTranscriptSize |
81 |
"the number of cols/lines by which the Transcript should come up" |
|
82 |
||
83 |
^ 70@11 |
|
84 |
! |
|
85 |
||
15 | 86 |
defaultTimeDelay |
87 |
"the time in seconds to wait & collect by default" |
|
88 |
||
34
c4b386a8cc57
critical-lock; allows show:/showCr: from multiple processes
claus
parents:
22
diff
changeset
|
89 |
^ 0.3 |
0 | 90 |
! ! |
91 |
||
92 |
!TextCollector class methodsFor:'instance creation'! |
|
93 |
||
94 |
newTranscript |
|
110 | 95 |
"create and open a new transcript." |
96 |
||
130 | 97 |
|topView transcript f v lines cols| |
0 | 98 |
|
7 | 99 |
topView := StandardSystemView label:'Transcript' minExtent:(100 @ 100). |
0 | 100 |
|
60 | 101 |
v := HVScrollableView for:self miniScrollerH:true miniScrollerV:false in:topView. |
0 | 102 |
v origin:(0.0 @ 0.0) corner:(1.0 @ 1.0). |
103 |
transcript := v scrolledView. |
|
104 |
"transcript partialLines:false." |
|
105 |
||
106 |
f := transcript font. |
|
60 | 107 |
|
108 |
" |
|
109 |
should add the height of the frame & scrollbars to be exact ... |
|
110 |
" |
|
111 |
cols := self defaultTranscriptSize x. |
|
112 |
lines := self defaultTranscriptSize y. |
|
113 |
topView extent:(((f widthOf:'x') * cols) @ (f height * lines)). |
|
0 | 114 |
|
110 | 115 |
transcript beTranscript. |
59 | 116 |
|
80 | 117 |
" |
118 |
run it at a slightly higher prio, to allow for |
|
119 |
delayed buffered updates to be performed |
|
120 |
" |
|
121 |
topView openWithPriority:(Processor userSchedulingPriority + 1). |
|
15 | 122 |
|
0 | 123 |
^ transcript |
110 | 124 |
|
125 |
" |
|
126 |
TextCollector newTranscript |
|
127 |
" |
|
0 | 128 |
! ! |
129 |
||
130 |
!TextCollector methodsFor:'initialize / release'! |
|
131 |
||
132 |
initialize |
|
133 |
super initialize. |
|
134 |
||
135 |
outstandingLines := OrderedCollection new. |
|
34
c4b386a8cc57
critical-lock; allows show:/showCr: from multiple processes
claus
parents:
22
diff
changeset
|
136 |
|
0 | 137 |
flushBlock := [self endEntry]. |
119 | 138 |
flushPending := inFlush := false. |
15 | 139 |
collecting := true. |
140 |
timeDelay := self class defaultTimeDelay. |
|
119 | 141 |
access := RecursionLock new. "/ Semaphore forMutualExclusion. |
0 | 142 |
|
143 |
lineLimit := self class defaultLineLimit. |
|
144 |
entryStream := ActorStream new. |
|
145 |
entryStream nextPutBlock:[:something | self nextPut:something]. |
|
146 |
entryStream nextPutAllBlock:[:something | self nextPutAll:something] |
|
147 |
! |
|
148 |
||
97 | 149 |
editMenu |
150 |
|m idx| |
|
59 | 151 |
|
97 | 152 |
m := super editMenu. |
59 | 153 |
|
154 |
" |
|
155 |
textcollectors do not support #accept |
|
156 |
remove it from the menu (and the preceeding separating line) |
|
157 |
" |
|
97 | 158 |
idx := m indexOf:#accept. |
59 | 159 |
idx ~~ 0 ifTrue:[ |
97 | 160 |
m remove:idx. |
161 |
(m labels at:(idx - 1)) = '-' ifTrue:[ |
|
162 |
m remove:idx - 1 |
|
59 | 163 |
]. |
164 |
]. |
|
97 | 165 |
^ m |
59 | 166 |
! |
167 |
||
36 | 168 |
reinitialize |
169 |
"recreate access-semaphore; image could have been save (theoretically) |
|
170 |
with the semaphore locked - int this case, we had a deadlock" |
|
171 |
||
172 |
flushPending := false. |
|
119 | 173 |
access := RecursionLock new. "/ Semaphore forMutualExclusion. |
36 | 174 |
super reinitialize. |
175 |
! |
|
176 |
||
34
c4b386a8cc57
critical-lock; allows show:/showCr: from multiple processes
claus
parents:
22
diff
changeset
|
177 |
mapped |
c4b386a8cc57
critical-lock; allows show:/showCr: from multiple processes
claus
parents:
22
diff
changeset
|
178 |
"view became visible - show collected lines (if any)" |
c4b386a8cc57
critical-lock; allows show:/showCr: from multiple processes
claus
parents:
22
diff
changeset
|
179 |
|
c4b386a8cc57
critical-lock; allows show:/showCr: from multiple processes
claus
parents:
22
diff
changeset
|
180 |
super mapped. |
c4b386a8cc57
critical-lock; allows show:/showCr: from multiple processes
claus
parents:
22
diff
changeset
|
181 |
self endEntry |
c4b386a8cc57
critical-lock; allows show:/showCr: from multiple processes
claus
parents:
22
diff
changeset
|
182 |
! |
c4b386a8cc57
critical-lock; allows show:/showCr: from multiple processes
claus
parents:
22
diff
changeset
|
183 |
|
0 | 184 |
destroy |
185 |
destroyAction notNil ifTrue:[ |
|
59 | 186 |
destroyAction value |
0 | 187 |
]. |
34
c4b386a8cc57
critical-lock; allows show:/showCr: from multiple processes
claus
parents:
22
diff
changeset
|
188 |
Processor removeTimedBlock:flushBlock. |
c4b386a8cc57
critical-lock; allows show:/showCr: from multiple processes
claus
parents:
22
diff
changeset
|
189 |
flushBlock := nil. |
c4b386a8cc57
critical-lock; allows show:/showCr: from multiple processes
claus
parents:
22
diff
changeset
|
190 |
outstandingLines := OrderedCollection new. |
c4b386a8cc57
critical-lock; allows show:/showCr: from multiple processes
claus
parents:
22
diff
changeset
|
191 |
outstandingLine := ''. |
0 | 192 |
super destroy |
193 |
! ! |
|
194 |
||
110 | 195 |
!TextCollector methodsFor:'transcript specials'! |
196 |
||
197 |
beTranscript |
|
198 |
|fg bg cFg cBg| |
|
199 |
||
200 |
Smalltalk at:#Transcript put:self. |
|
201 |
||
202 |
" |
|
203 |
fancy feature: whenever Transcript is closed, reset to StdError |
|
204 |
" |
|
205 |
self destroyAction:[Smalltalk at:#Transcript put:Stderr]. |
|
206 |
||
130 | 207 |
fg := styleSheet colorAt:'transcriptForegroundColor' default:self foregroundColor. |
208 |
bg := styleSheet colorAt:'transcriptBackgroundColor' default:self backgroundColor. |
|
110 | 209 |
self foregroundColor:fg backgroundColor:bg. |
210 |
self viewBackground:bg. |
|
211 |
||
130 | 212 |
cFg := styleSheet colorAt:'transcriptCursorForegroundColor' default:bg. |
213 |
cBg := styleSheet colorAt:'transcriptCursorBackgroundColor' default:fg. |
|
110 | 214 |
self cursorForegroundColor:cFg backgroundColor:cBg. |
215 |
||
216 |
"self lineLimit:1000. " "or whatever you think makes sense" |
|
217 |
! ! |
|
218 |
||
0 | 219 |
!TextCollector methodsFor:'accessing'! |
220 |
||
221 |
collect:aBoolean |
|
34
c4b386a8cc57
critical-lock; allows show:/showCr: from multiple processes
claus
parents:
22
diff
changeset
|
222 |
"turn on/off collecting - if on, do not output immediately |
15 | 223 |
but collect text and output en-bloque after some time delta" |
0 | 224 |
|
225 |
collecting := aBoolean |
|
226 |
! |
|
227 |
||
228 |
lineLimit:aNumber |
|
229 |
"define the number of text-lines I am supposed to hold" |
|
230 |
||
231 |
lineLimit := aNumber |
|
232 |
! |
|
233 |
||
234 |
destroyAction:aBlock |
|
34
c4b386a8cc57
critical-lock; allows show:/showCr: from multiple processes
claus
parents:
22
diff
changeset
|
235 |
"define the action to be performed when I get destroyed. |
c4b386a8cc57
critical-lock; allows show:/showCr: from multiple processes
claus
parents:
22
diff
changeset
|
236 |
This is a special feature, to allow resetting Transcript to Stderr |
c4b386a8cc57
critical-lock; allows show:/showCr: from multiple processes
claus
parents:
22
diff
changeset
|
237 |
when closed. (see TextCollectorclass>>newTranscript)" |
0 | 238 |
|
239 |
destroyAction := aBlock |
|
240 |
! |
|
241 |
||
242 |
endEntry |
|
243 |
"flush collected output" |
|
244 |
||
36 | 245 |
|nLines lines| |
0 | 246 |
|
133 | 247 |
shown ifFalse:[ |
248 |
flushPending ifFalse:[ |
|
249 |
self installDelayedUpdate. |
|
250 |
]. |
|
251 |
^ self |
|
252 |
]. |
|
119 | 253 |
inFlush ifTrue:[^ self]. |
34
c4b386a8cc57
critical-lock; allows show:/showCr: from multiple processes
claus
parents:
22
diff
changeset
|
254 |
|
15 | 255 |
Processor removeTimedBlock:flushBlock. |
59 | 256 |
flushPending ifFalse:[^ self]. |
15 | 257 |
|
52 | 258 |
access critical:[ |
119 | 259 |
inFlush := true. |
59 | 260 |
flushPending := false. |
261 |
outstandingLines size ~~ 0 ifTrue:[ |
|
262 |
"insert the bunch of lines - if any" |
|
263 |
lines := outstandingLines. |
|
264 |
outstandingLines := OrderedCollection new. |
|
36 | 265 |
|
59 | 266 |
nLines := lines size. |
267 |
(nLines ~~ 0) ifTrue:[ |
|
268 |
self insertLines:lines withCr:true. |
|
131 | 269 |
self cursorToEnd. |
59 | 270 |
self withCursorOffDo:[ |
271 |
(cursorLine >= (firstLineShown + nFullLinesShown)) ifTrue:[ |
|
272 |
self scrollDown:nLines |
|
273 |
] |
|
274 |
]. |
|
275 |
]. |
|
276 |
]. |
|
277 |
"and the last partial line - if any" |
|
278 |
outstandingLine notNil ifTrue:[ |
|
279 |
self insertStringAtCursor:outstandingLine. |
|
280 |
outstandingLine := ''. |
|
281 |
]. |
|
119 | 282 |
self checkLineLimit. |
283 |
inFlush := false. |
|
155 | 284 |
device flush. |
119 | 285 |
]. |
286 |
flushPending ifTrue:[ |
|
287 |
flushPending := false. |
|
288 |
self installDelayedUpdate |
|
34
c4b386a8cc57
critical-lock; allows show:/showCr: from multiple processes
claus
parents:
22
diff
changeset
|
289 |
] |
0 | 290 |
! ! |
291 |
||
292 |
!TextCollector methodsFor:'private'! |
|
293 |
||
294 |
checkLineLimit |
|
295 |
"this method checks if the text has become too large (> lineLimit) |
|
296 |
and cuts off some lines at the top if so; it must be called whenever lines |
|
297 |
have been added to the bottom" |
|
298 |
||
299 |
|nDel| |
|
300 |
||
301 |
lineLimit notNil ifTrue:[ |
|
59 | 302 |
(cursorLine > lineLimit) ifTrue:[ |
303 |
nDel := list size - lineLimit. |
|
304 |
list removeFromIndex:1 toIndex:nDel. |
|
305 |
cursorLine := cursorLine - nDel. |
|
306 |
firstLineShown := firstLineShown - nDel. |
|
307 |
(firstLineShown < 1) ifTrue:[ |
|
308 |
cursorLine := cursorLine - firstLineShown + 1. |
|
309 |
firstLineShown := 1 |
|
310 |
]. |
|
311 |
self contentsChanged |
|
312 |
] |
|
0 | 313 |
] |
34
c4b386a8cc57
critical-lock; allows show:/showCr: from multiple processes
claus
parents:
22
diff
changeset
|
314 |
! |
c4b386a8cc57
critical-lock; allows show:/showCr: from multiple processes
claus
parents:
22
diff
changeset
|
315 |
|
c4b386a8cc57
critical-lock; allows show:/showCr: from multiple processes
claus
parents:
22
diff
changeset
|
316 |
installDelayedUpdate |
c4b386a8cc57
critical-lock; allows show:/showCr: from multiple processes
claus
parents:
22
diff
changeset
|
317 |
"arrange for collecting input for some time, |
c4b386a8cc57
critical-lock; allows show:/showCr: from multiple processes
claus
parents:
22
diff
changeset
|
318 |
and output all buffered strings at once after a while. |
c4b386a8cc57
critical-lock; allows show:/showCr: from multiple processes
claus
parents:
22
diff
changeset
|
319 |
This makes output to the transcript much faster on systems |
c4b386a8cc57
critical-lock; allows show:/showCr: from multiple processes
claus
parents:
22
diff
changeset
|
320 |
with poor scrolling performance (i.e. dump vga cards ...)." |
c4b386a8cc57
critical-lock; allows show:/showCr: from multiple processes
claus
parents:
22
diff
changeset
|
321 |
|
131 | 322 |
|p| |
34
c4b386a8cc57
critical-lock; allows show:/showCr: from multiple processes
claus
parents:
22
diff
changeset
|
323 |
|
c4b386a8cc57
critical-lock; allows show:/showCr: from multiple processes
claus
parents:
22
diff
changeset
|
324 |
flushPending ifFalse:[ |
59 | 325 |
flushPending := true. |
119 | 326 |
inFlush ifFalse:[ |
327 |
" |
|
328 |
we could run under a process, which dies in the meantime; |
|
329 |
therefore, we have to arrange for the transcript process to |
|
330 |
be interrupted and do the update. |
|
331 |
" |
|
131 | 332 |
windowGroup isNil ifTrue:[ |
119 | 333 |
p := Processor activeProcess |
334 |
] ifFalse:[ |
|
131 | 335 |
p := windowGroup process |
119 | 336 |
]. |
337 |
Processor addTimedBlock:flushBlock for:p afterSeconds:timeDelay. |
|
338 |
] |
|
34
c4b386a8cc57
critical-lock; allows show:/showCr: from multiple processes
claus
parents:
22
diff
changeset
|
339 |
] |
0 | 340 |
! ! |
341 |
||
135 | 342 |
!TextCollector methodsFor:'events'! |
343 |
||
344 |
exposeX:x y:y width:w height:h |
|
345 |
"flush buffered text when exposed" |
|
346 |
||
347 |
super exposeX:x y:y width:w height:h. |
|
348 |
self endEntry |
|
349 |
! ! |
|
350 |
||
0 | 351 |
!TextCollector methodsFor:'stream messages'! |
352 |
||
353 |
lineLength |
|
354 |
^ width // (font width) |
|
355 |
! |
|
356 |
||
357 |
nextPut:something |
|
358 |
"this allows TextCollectors to be used Stream-wise" |
|
359 |
||
360 |
flushPending ifTrue:[ |
|
59 | 361 |
self endEntry |
0 | 362 |
]. |
363 |
(something isMemberOf:Character) ifTrue:[ |
|
59 | 364 |
((something == Character cr) or:[something == Character nl]) ifTrue:[ |
365 |
^ self cr |
|
366 |
]. |
|
367 |
self insertCharAtCursor:something |
|
0 | 368 |
] ifFalse:[ |
59 | 369 |
self insertStringAtCursor:(something printString). |
370 |
self checkLineLimit |
|
0 | 371 |
]. |
155 | 372 |
device flush |
0 | 373 |
! |
374 |
||
375 |
nextPutAll:something |
|
376 |
"this allows TextCollectors to be used Stream-wise" |
|
377 |
||
378 |
^ self nextPut:something |
|
379 |
! |
|
380 |
||
381 |
cr |
|
15 | 382 |
"output a carriage return, finishing the current line" |
383 |
||
131 | 384 |
access critical:[ |
385 |
collecting ifTrue:[ |
|
59 | 386 |
outstandingLine notNil ifTrue:[ |
387 |
outstandingLines add:outstandingLine. |
|
388 |
]. |
|
389 |
outstandingLine := ''. |
|
131 | 390 |
|
391 |
flushPending ifFalse:[ |
|
392 |
self installDelayedUpdate |
|
393 |
] |
|
394 |
] ifFalse:[ |
|
59 | 395 |
self cursorReturn. |
396 |
self checkLineLimit. |
|
131 | 397 |
self cursorToEnd. |
59 | 398 |
]. |
0 | 399 |
] |
400 |
! |
|
401 |
||
402 |
show:anObject |
|
403 |
"insert the argument aString at current cursor position" |
|
404 |
||
77 | 405 |
|aString| |
0 | 406 |
|
407 |
aString := anObject printString. |
|
408 |
collecting ifTrue:[ |
|
59 | 409 |
access critical:[ |
410 |
outstandingLine notNil ifTrue:[ |
|
411 |
outstandingLine := outstandingLine , aString |
|
412 |
] ifFalse:[ |
|
413 |
outstandingLine := aString |
|
414 |
]. |
|
415 |
]. |
|
416 |
flushPending ifFalse:[ |
|
417 |
self installDelayedUpdate |
|
418 |
] |
|
0 | 419 |
] ifFalse:[ |
59 | 420 |
access critical:[ |
421 |
self nextPut:aString. |
|
422 |
]. |
|
0 | 423 |
] |
424 |
! |
|
425 |
||
426 |
showCr:aString |
|
427 |
"insert the argument aString followed by a newline |
|
428 |
at current cursor position" |
|
429 |
||
430 |
self show:aString. |
|
431 |
self cr |
|
432 |
! |
|
433 |
||
434 |
doesNotUnderstand:aMessage |
|
435 |
"this is funny: all message we do not understand, are passed |
|
436 |
on to the stream which will send the characters via nextPut: |
|
437 |
This way, we understand all Stream messages - great isn't it !! |
|
438 |
" |
|
15 | 439 |
^ entryStream perform:(aMessage selector) withArguments:(aMessage arguments) |
0 | 440 |
! ! |