The Trunk: ST80-fbs.165.mcz

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
4 messages Options
Reply | Threaded
Open this post in threaded view
|

The Trunk: ST80-fbs.165.mcz

commits-2
Frank Shearar uploaded a new version of ST80 to project The Trunk:
http://source.squeak.org/trunk/ST80-fbs.165.mcz

==================== Summary ====================

Name: ST80-fbs.165
Author: fbs
Time: 13 December 2013, 6:56:32.522 pm
UUID: 1fc821e0-cf5e-7e49-9037-8fb7b5e58ec0
Ancestors: ST80-fbs.164

Transcripter is actually MVC specific. Move it there, and other UI frameworks can define their own emergency evaluator.

=============== Diff against ST80-fbs.164 ===============

Item was changed:
  SystemOrganization addCategory: #'ST80-Controllers'!
  SystemOrganization addCategory: #'ST80-Editors'!
  SystemOrganization addCategory: #'ST80-Framework'!
  SystemOrganization addCategory: #'ST80-Menus'!
  SystemOrganization addCategory: #'ST80-Menus-Tests'!
  SystemOrganization addCategory: #'ST80-Paths'!
  SystemOrganization addCategory: #'ST80-Pluggable Views'!
+ SystemOrganization addCategory: #'ST80-REPL'!
  SystemOrganization addCategory: #'ST80-Support'!
  SystemOrganization addCategory: #'ST80-Support-Tests'!
  SystemOrganization addCategory: #'ST80-Symbols'!
  SystemOrganization addCategory: #'ST80-ToolBuilder'!
  SystemOrganization addCategory: #'ST80-Views'!

Item was added:
+ ReadWriteStream subclass: #Transcripter
+ instanceVariableNames: 'frame para'
+ classVariableNames: ''
+ poolDictionaries: ''
+ category: 'ST80-REPL'!
+
+ !Transcripter commentStamp: '<historical>' prior: 0!
+ Transcripter is a dog-simple scrolling stream with display.  It is intended to operate with no support from MVC or color in a minimal, or headless version of Squeak.  No attention has been paid to appearance or performance.!

Item was added:
+ ----- Method: Transcripter class>>emergencyEvaluator (in category 'utilities') -----
+ emergencyEvaluator
+ (Transcripter newInFrame: (0@0 corner: 320@200))
+ show: 'Type ''revert'' to revert your last method change.
+ Type ''exit'' to exit the emergency evaluator.';
+ readEvalPrint!

Item was added:
+ ----- Method: Transcripter class>>newInFrame: (in category 'instance creation') -----
+ newInFrame: frame
+ "
+ (Transcripter newInFrame: (0@0 extent: 100@200))
+ nextPutAll: 'Hello there'; endEntry;
+ cr; print: 355.0/113; endEntry;
+ readEvalPrint.
+ "
+ | transcript |
+ transcript := self on: (String new: 100).
+ transcript initInFrame: frame.
+ ^ transcript clear!

Item was added:
+ ----- Method: Transcripter class>>startTranscriptProcess (in category 'instance creation') -----
+ startTranscriptProcess   "Transcripter startTranscriptProcess"
+ | activeProcess |
+ Transcript := self newInFrame: Display boundingBox.
+ activeProcess := [Transcript readEvalPrint.
+ Smalltalk processShutDownList: true; quitPrimitive]
+ newProcess
+ priority: Processor userSchedulingPriority.
+ activeProcess resume.
+ Processor terminateActive
+ !

Item was added:
+ ----- Method: Transcripter>>black (in category 'private') -----
+ black
+ Display depth = 1 ifTrue: [^ Bitmap with: 16rFFFFFFFF "Works without color support"].
+ ^ Color black!

Item was added:
+ ----- Method: Transcripter>>clear (in category 'accessing') -----
+ clear
+ Display fill: (frame insetBy: -2) fillColor: self black;
+ fill: frame fillColor: self white.
+ self on: (String new: 100); endEntry!

Item was added:
+ ----- Method: Transcripter>>confirm: (in category 'command line') -----
+ confirm: queryString
+
+ | choice |
+ [choice := self request: queryString , '
+ Please type yes or no followed by return'.
+ choice first asUppercase = $Y ifTrue: [^ true].
+ choice first asUppercase = $N ifTrue: [^ false]] repeat!

Item was added:
+ ----- Method: Transcripter>>endEntry (in category 'accessing') -----
+ endEntry
+ | c d cb |
+ c := self contents.
+ Display extent ~= DisplayScreen actualScreenSize ifTrue:
+ ["Handle case of user resizing physical window"
+ DisplayScreen startUp.
+ frame := frame intersect: Display boundingBox.
+ ^ self clear; show: c].
+ para setWithText: c asText
+ style: TextStyle default
+ compositionRectangle: ((frame insetBy: 4) withHeight: 9999)
+ clippingRectangle: frame
+ foreColor: self black backColor: self white.
+ d := para compositionRectangle bottom - frame bottom.
+ d > 0 ifTrue:
+ ["Scroll up to keep all contents visible"
+ cb := para characterBlockAtPoint: para compositionRectangle topLeft
+ + (0@(d+para lineGrid)).
+ self on: (c copyFrom: cb stringIndex to: c size).
+ readLimit:= position:= collection size.
+ ^ self endEntry].
+ para display!

Item was added:
+ ----- Method: Transcripter>>initInFrame: (in category 'initialization') -----
+ initInFrame: rect
+ Smalltalk at: #Paragraph ifPresent: [:classParagraph | "MVC"
+ frame := rect insetBy: 2.  "Leave room for border"
+ para := classParagraph withText: self contents asText
+ style: TextStyle default
+ compositionRectangle: ((frame insetBy: 4) withHeight: 9999)
+ clippingRectangle: frame
+ foreColor: self black backColor: self white]!

Item was added:
+ ----- Method: Transcripter>>readEvalPrint (in category 'command line') -----
+ readEvalPrint
+ | line okToRevert |
+ okToRevert := true.
+ [#('quit' 'exit' 'done' ) includes: (line := self request: '>')]
+ whileFalse:
+ [line = 'revert'
+ ifTrue: [okToRevert
+ ifTrue: [RecentMessages default revertMostRecent.
+ self cr; show: 'reverted: ' , RecentMessages default mostRecent.
+ okToRevert := false]
+ ifFalse: [self cr; show: 'Only one level of revert currently supported']]
+ ifFalse: [self cr; show: ([Compiler evaluate: line] ifError: [:err :ex | err])]]!

Item was added:
+ ----- Method: Transcripter>>request: (in category 'command line') -----
+ request: prompt
+ | startPos char contents |
+ self cr; show: prompt.
+ startPos := position.
+ [[Sensor keyboardPressed] whileFalse.
+ (char := Sensor keyboard) = Character cr]
+ whileFalse:
+ [char = Character backspace
+ ifTrue: [readLimit := position := (position - 1 max: startPos)]
+ ifFalse: [self nextPut: char].
+ self endEntry].
+ contents := self contents.
+ ^ contents copyFrom: startPos + 1 to: contents size!

Item was added:
+ ----- Method: Transcripter>>show: (in category 'accessing') -----
+ show: anObject
+ self nextPutAll: anObject asString; endEntry!

Item was added:
+ ----- Method: Transcripter>>white (in category 'private') -----
+ white
+ Display depth = 1 ifTrue: [^ Bitmap with: 0 "Works without color support"].
+ ^ Color white!


Reply | Threaded
Open this post in threaded view
|

Re: The Trunk: ST80-fbs.165.mcz

David T. Lewis
According to the class comment:

Transcripter is a dog-simple scrolling stream with display.  It is
intended to operate with no support from MVC or color in a minimal, or
headless version of Squeak.  No attention has been paid to appearance or
performance.

This is explicitly designed to *not* be part of MVC or any other UI
framework, and it is clearly documented as such. It does not belong in the
ST80 package.

Dave

> Frank Shearar uploaded a new version of ST80 to project The Trunk:
> http://source.squeak.org/trunk/ST80-fbs.165.mcz
>
> ==================== Summary ====================
>
> Name: ST80-fbs.165
> Author: fbs
> Time: 13 December 2013, 6:56:32.522 pm
> UUID: 1fc821e0-cf5e-7e49-9037-8fb7b5e58ec0
> Ancestors: ST80-fbs.164
>
> Transcripter is actually MVC specific. Move it there, and other UI
> frameworks can define their own emergency evaluator.
>
> =============== Diff against ST80-fbs.164 ===============
>
> Item was changed:
>   SystemOrganization addCategory: #'ST80-Controllers'!
>   SystemOrganization addCategory: #'ST80-Editors'!
>   SystemOrganization addCategory: #'ST80-Framework'!
>   SystemOrganization addCategory: #'ST80-Menus'!
>   SystemOrganization addCategory: #'ST80-Menus-Tests'!
>   SystemOrganization addCategory: #'ST80-Paths'!
>   SystemOrganization addCategory: #'ST80-Pluggable Views'!
> + SystemOrganization addCategory: #'ST80-REPL'!
>   SystemOrganization addCategory: #'ST80-Support'!
>   SystemOrganization addCategory: #'ST80-Support-Tests'!
>   SystemOrganization addCategory: #'ST80-Symbols'!
>   SystemOrganization addCategory: #'ST80-ToolBuilder'!
>   SystemOrganization addCategory: #'ST80-Views'!
>
> Item was added:
> + ReadWriteStream subclass: #Transcripter
> + instanceVariableNames: 'frame para'
> + classVariableNames: ''
> + poolDictionaries: ''
> + category: 'ST80-REPL'!
> +
> + !Transcripter commentStamp: '<historical>' prior: 0!
> + Transcripter is a dog-simple scrolling stream with display.  It is
> intended to operate with no support from MVC or color in a minimal, or
> headless version of Squeak.  No attention has been paid to appearance or
> performance.!
>
> Item was added:
> + ----- Method: Transcripter class>>emergencyEvaluator (in category
> 'utilities') -----
> + emergencyEvaluator
> + (Transcripter newInFrame: (0@0 corner: 320@200))
> + show: 'Type ''revert'' to revert your last method change.
> + Type ''exit'' to exit the emergency evaluator.';
> + readEvalPrint!
>
> Item was added:
> + ----- Method: Transcripter class>>newInFrame: (in category 'instance
> creation') -----
> + newInFrame: frame
> + "
> + (Transcripter newInFrame: (0@0 extent: 100@200))
> + nextPutAll: 'Hello there'; endEntry;
> + cr; print: 355.0/113; endEntry;
> + readEvalPrint.
> + "
> + | transcript |
> + transcript := self on: (String new: 100).
> + transcript initInFrame: frame.
> + ^ transcript clear!
>
> Item was added:
> + ----- Method: Transcripter class>>startTranscriptProcess (in category
> 'instance creation') -----
> + startTranscriptProcess   "Transcripter startTranscriptProcess"
> + | activeProcess |
> + Transcript := self newInFrame: Display boundingBox.
> + activeProcess := [Transcript readEvalPrint.
> + Smalltalk processShutDownList: true; quitPrimitive]
> + newProcess
> + priority: Processor userSchedulingPriority.
> + activeProcess resume.
> + Processor terminateActive
> + !
>
> Item was added:
> + ----- Method: Transcripter>>black (in category 'private') -----
> + black
> + Display depth = 1 ifTrue: [^ Bitmap with: 16rFFFFFFFF "Works without
> color support"].
> + ^ Color black!
>
> Item was added:
> + ----- Method: Transcripter>>clear (in category 'accessing') -----
> + clear
> + Display fill: (frame insetBy: -2) fillColor: self black;
> + fill: frame fillColor: self white.
> + self on: (String new: 100); endEntry!
>
> Item was added:
> + ----- Method: Transcripter>>confirm: (in category 'command line') -----
> + confirm: queryString
> +
> + | choice |
> + [choice := self request: queryString , '
> + Please type yes or no followed by return'.
> + choice first asUppercase = $Y ifTrue: [^ true].
> + choice first asUppercase = $N ifTrue: [^ false]] repeat!
>
> Item was added:
> + ----- Method: Transcripter>>endEntry (in category 'accessing') -----
> + endEntry
> + | c d cb |
> + c := self contents.
> + Display extent ~= DisplayScreen actualScreenSize ifTrue:
> + ["Handle case of user resizing physical window"
> + DisplayScreen startUp.
> + frame := frame intersect: Display boundingBox.
> + ^ self clear; show: c].
> + para setWithText: c asText
> + style: TextStyle default
> + compositionRectangle: ((frame insetBy: 4) withHeight: 9999)
> + clippingRectangle: frame
> + foreColor: self black backColor: self white.
> + d := para compositionRectangle bottom - frame bottom.
> + d > 0 ifTrue:
> + ["Scroll up to keep all contents visible"
> + cb := para characterBlockAtPoint: para compositionRectangle topLeft
> + + (0@(d+para lineGrid)).
> + self on: (c copyFrom: cb stringIndex to: c size).
> + readLimit:= position:= collection size.
> + ^ self endEntry].
> + para display!
>
> Item was added:
> + ----- Method: Transcripter>>initInFrame: (in category 'initialization')
> -----
> + initInFrame: rect
> + Smalltalk at: #Paragraph ifPresent: [:classParagraph | "MVC"
> + frame := rect insetBy: 2.  "Leave room for border"
> + para := classParagraph withText: self contents asText
> + style: TextStyle default
> + compositionRectangle: ((frame insetBy: 4) withHeight: 9999)
> + clippingRectangle: frame
> + foreColor: self black backColor: self white]!
>
> Item was added:
> + ----- Method: Transcripter>>readEvalPrint (in category 'command line')
> -----
> + readEvalPrint
> + | line okToRevert |
> + okToRevert := true.
> + [#('quit' 'exit' 'done' ) includes: (line := self request: '>')]
> + whileFalse:
> + [line = 'revert'
> + ifTrue: [okToRevert
> + ifTrue: [RecentMessages default revertMostRecent.
> + self cr; show: 'reverted: ' , RecentMessages default mostRecent.
> + okToRevert := false]
> + ifFalse: [self cr; show: 'Only one level of revert currently
> supported']]
> + ifFalse: [self cr; show: ([Compiler evaluate: line] ifError: [:err :ex
> | err])]]!
>
> Item was added:
> + ----- Method: Transcripter>>request: (in category 'command line') -----
> + request: prompt
> + | startPos char contents |
> + self cr; show: prompt.
> + startPos := position.
> + [[Sensor keyboardPressed] whileFalse.
> + (char := Sensor keyboard) = Character cr]
> + whileFalse:
> + [char = Character backspace
> + ifTrue: [readLimit := position := (position - 1 max: startPos)]
> + ifFalse: [self nextPut: char].
> + self endEntry].
> + contents := self contents.
> + ^ contents copyFrom: startPos + 1 to: contents size!
>
> Item was added:
> + ----- Method: Transcripter>>show: (in category 'accessing') -----
> + show: anObject
> + self nextPutAll: anObject asString; endEntry!
>
> Item was added:
> + ----- Method: Transcripter>>white (in category 'private') -----
> + white
> + Display depth = 1 ifTrue: [^ Bitmap with: 0 "Works without color
> support"].
> + ^ Color white!
>
>



Reply | Threaded
Open this post in threaded view
|

Re: The Trunk: ST80-fbs.165.mcz

Frank Shearar-3
On 13 December 2013 19:17, David T. Lewis <[hidden email]> wrote:

> According to the class comment:
>
> Transcripter is a dog-simple scrolling stream with display.  It is
> intended to operate with no support from MVC or color in a minimal, or
> headless version of Squeak.  No attention has been paid to appearance or
> performance.
>
> This is explicitly designed to *not* be part of MVC or any other UI
> framework, and it is clearly documented as such. It does not belong in the
> ST80 package.

I am more than happy for someone to move it where it needs to go, or
similar. Right now it's clearly built to work with ST80 - it relies on
Paragraph, after all, despite the class comment. (Here's an example of
why I seriously dislike using class names, instead of classes.)

frank

> Dave
>
>> Frank Shearar uploaded a new version of ST80 to project The Trunk:
>> http://source.squeak.org/trunk/ST80-fbs.165.mcz
>>
>> ==================== Summary ====================
>>
>> Name: ST80-fbs.165
>> Author: fbs
>> Time: 13 December 2013, 6:56:32.522 pm
>> UUID: 1fc821e0-cf5e-7e49-9037-8fb7b5e58ec0
>> Ancestors: ST80-fbs.164
>>
>> Transcripter is actually MVC specific. Move it there, and other UI
>> frameworks can define their own emergency evaluator.
>>
>> =============== Diff against ST80-fbs.164 ===============
>>
>> Item was changed:
>>   SystemOrganization addCategory: #'ST80-Controllers'!
>>   SystemOrganization addCategory: #'ST80-Editors'!
>>   SystemOrganization addCategory: #'ST80-Framework'!
>>   SystemOrganization addCategory: #'ST80-Menus'!
>>   SystemOrganization addCategory: #'ST80-Menus-Tests'!
>>   SystemOrganization addCategory: #'ST80-Paths'!
>>   SystemOrganization addCategory: #'ST80-Pluggable Views'!
>> + SystemOrganization addCategory: #'ST80-REPL'!
>>   SystemOrganization addCategory: #'ST80-Support'!
>>   SystemOrganization addCategory: #'ST80-Support-Tests'!
>>   SystemOrganization addCategory: #'ST80-Symbols'!
>>   SystemOrganization addCategory: #'ST80-ToolBuilder'!
>>   SystemOrganization addCategory: #'ST80-Views'!
>>
>> Item was added:
>> + ReadWriteStream subclass: #Transcripter
>> +     instanceVariableNames: 'frame para'
>> +     classVariableNames: ''
>> +     poolDictionaries: ''
>> +     category: 'ST80-REPL'!
>> +
>> + !Transcripter commentStamp: '<historical>' prior: 0!
>> + Transcripter is a dog-simple scrolling stream with display.  It is
>> intended to operate with no support from MVC or color in a minimal, or
>> headless version of Squeak.  No attention has been paid to appearance or
>> performance.!
>>
>> Item was added:
>> + ----- Method: Transcripter class>>emergencyEvaluator (in category
>> 'utilities') -----
>> + emergencyEvaluator
>> +     (Transcripter newInFrame: (0@0 corner: 320@200))
>> +             show: 'Type ''revert'' to revert your last method change.
>> + Type ''exit'' to exit the emergency evaluator.';
>> +             readEvalPrint!
>>
>> Item was added:
>> + ----- Method: Transcripter class>>newInFrame: (in category 'instance
>> creation') -----
>> + newInFrame: frame
>> + "
>> + (Transcripter newInFrame: (0@0 extent: 100@200))
>> +     nextPutAll: 'Hello there'; endEntry;
>> +     cr; print: 355.0/113; endEntry;
>> +     readEvalPrint.
>> + "
>> +     | transcript |
>> +     transcript := self on: (String new: 100).
>> +     transcript initInFrame: frame.
>> +     ^ transcript clear!
>>
>> Item was added:
>> + ----- Method: Transcripter class>>startTranscriptProcess (in category
>> 'instance creation') -----
>> + startTranscriptProcess   "Transcripter startTranscriptProcess"
>> +     | activeProcess |
>> +     Transcript := self newInFrame: Display boundingBox.
>> +     activeProcess := [Transcript readEvalPrint.
>> +                                     Smalltalk processShutDownList: true; quitPrimitive]
>> +                                             newProcess
>> +                                     priority: Processor userSchedulingPriority.
>> +     activeProcess resume.
>> +     Processor terminateActive
>> + !
>>
>> Item was added:
>> + ----- Method: Transcripter>>black (in category 'private') -----
>> + black
>> +     Display depth = 1 ifTrue: [^ Bitmap with: 16rFFFFFFFF "Works without
>> color support"].
>> +     ^ Color black!
>>
>> Item was added:
>> + ----- Method: Transcripter>>clear (in category 'accessing') -----
>> + clear
>> +     Display fill: (frame insetBy: -2) fillColor: self black;
>> +                     fill: frame fillColor: self white.
>> +     self on: (String new: 100); endEntry!
>>
>> Item was added:
>> + ----- Method: Transcripter>>confirm: (in category 'command line') -----
>> + confirm: queryString
>> +
>> +     | choice |
>> +     [choice := self request: queryString , '
>> + Please type yes or no followed by return'.
>> +     choice first asUppercase = $Y ifTrue: [^ true].
>> +             choice first asUppercase = $N ifTrue: [^ false]] repeat!
>>
>> Item was added:
>> + ----- Method: Transcripter>>endEntry (in category 'accessing') -----
>> + endEntry
>> +     | c d cb |
>> +     c := self contents.
>> +     Display extent ~= DisplayScreen actualScreenSize ifTrue:
>> +             ["Handle case of user resizing physical window"
>> +             DisplayScreen startUp.
>> +             frame := frame intersect: Display boundingBox.
>> +             ^ self clear; show: c].
>> +     para setWithText: c asText
>> +             style: TextStyle default
>> +             compositionRectangle: ((frame insetBy: 4) withHeight: 9999)
>> +             clippingRectangle: frame
>> +             foreColor: self black backColor: self white.
>> +     d := para compositionRectangle bottom - frame bottom.
>> +     d > 0 ifTrue:
>> +             ["Scroll up to keep all contents visible"
>> +             cb := para characterBlockAtPoint: para compositionRectangle topLeft
>> +                                                                                     + (0@(d+para lineGrid)).
>> +             self on: (c copyFrom: cb stringIndex to: c size).
>> +             readLimit:= position:= collection size.
>> +             ^ self endEntry].
>> +     para display!
>>
>> Item was added:
>> + ----- Method: Transcripter>>initInFrame: (in category 'initialization')
>> -----
>> + initInFrame: rect
>> +     Smalltalk at: #Paragraph ifPresent: [:classParagraph | "MVC"
>> +             frame := rect insetBy: 2.  "Leave room for border"
>> +             para := classParagraph withText: self contents asText
>> +                                     style: TextStyle default
>> +                                     compositionRectangle: ((frame insetBy: 4) withHeight: 9999)
>> +                                     clippingRectangle: frame
>> +                                     foreColor: self black backColor: self white]!
>>
>> Item was added:
>> + ----- Method: Transcripter>>readEvalPrint (in category 'command line')
>> -----
>> + readEvalPrint
>> +     | line okToRevert |
>> +     okToRevert := true.
>> +     [#('quit' 'exit' 'done' ) includes: (line := self request: '>')]
>> +             whileFalse:
>> +             [line = 'revert'
>> +             ifTrue: [okToRevert
>> +                     ifTrue: [RecentMessages default revertMostRecent.
>> +                                     self cr; show: 'reverted: ' , RecentMessages default mostRecent.
>> +                                     okToRevert := false]
>> +                     ifFalse: [self cr; show: 'Only one level of revert currently
>> supported']]
>> +             ifFalse: [self cr; show: ([Compiler evaluate: line] ifError: [:err :ex
>> | err])]]!
>>
>> Item was added:
>> + ----- Method: Transcripter>>request: (in category 'command line') -----
>> + request: prompt
>> +     | startPos char contents |
>> +     self cr; show: prompt.
>> +     startPos := position.
>> +     [[Sensor keyboardPressed] whileFalse.
>> +     (char := Sensor keyboard) = Character cr]
>> +             whileFalse:
>> +             [char = Character backspace
>> +                     ifTrue: [readLimit := position := (position - 1 max: startPos)]
>> +                     ifFalse: [self nextPut: char].
>> +             self endEntry].
>> +     contents := self contents.
>> +     ^ contents copyFrom: startPos + 1 to: contents size!
>>
>> Item was added:
>> + ----- Method: Transcripter>>show: (in category 'accessing') -----
>> + show: anObject
>> +     self nextPutAll: anObject asString; endEntry!
>>
>> Item was added:
>> + ----- Method: Transcripter>>white (in category 'private') -----
>> + white
>> +     Display depth = 1 ifTrue: [^ Bitmap with: 0 "Works without color
>> support"].
>> +     ^ Color white!
>>
>>
>
>
>

Reply | Threaded
Open this post in threaded view
|

Re: The Trunk: ST80-fbs.165.mcz

Frank Shearar-3
On 14 December 2013 19:58, Frank Shearar <[hidden email]> wrote:

> On 13 December 2013 19:17, David T. Lewis <[hidden email]> wrote:
>> According to the class comment:
>>
>> Transcripter is a dog-simple scrolling stream with display.  It is
>> intended to operate with no support from MVC or color in a minimal, or
>> headless version of Squeak.  No attention has been paid to appearance or
>> performance.
>>
>> This is explicitly designed to *not* be part of MVC or any other UI
>> framework, and it is clearly documented as such. It does not belong in the
>> ST80 package.
>
> I am more than happy for someone to move it where it needs to go, or
> similar. Right now it's clearly built to work with ST80 - it relies on
> Paragraph, after all, despite the class comment. (Here's an example of
> why I seriously dislike using class names, instead of classes.)

I forgot to add: regardless, its home is not in Collections, but in
System or, ideally, even higher.

> frank
>
>> Dave
>>
>>> Frank Shearar uploaded a new version of ST80 to project The Trunk:
>>> http://source.squeak.org/trunk/ST80-fbs.165.mcz
>>>
>>> ==================== Summary ====================
>>>
>>> Name: ST80-fbs.165
>>> Author: fbs
>>> Time: 13 December 2013, 6:56:32.522 pm
>>> UUID: 1fc821e0-cf5e-7e49-9037-8fb7b5e58ec0
>>> Ancestors: ST80-fbs.164
>>>
>>> Transcripter is actually MVC specific. Move it there, and other UI
>>> frameworks can define their own emergency evaluator.
>>>
>>> =============== Diff against ST80-fbs.164 ===============
>>>
>>> Item was changed:
>>>   SystemOrganization addCategory: #'ST80-Controllers'!
>>>   SystemOrganization addCategory: #'ST80-Editors'!
>>>   SystemOrganization addCategory: #'ST80-Framework'!
>>>   SystemOrganization addCategory: #'ST80-Menus'!
>>>   SystemOrganization addCategory: #'ST80-Menus-Tests'!
>>>   SystemOrganization addCategory: #'ST80-Paths'!
>>>   SystemOrganization addCategory: #'ST80-Pluggable Views'!
>>> + SystemOrganization addCategory: #'ST80-REPL'!
>>>   SystemOrganization addCategory: #'ST80-Support'!
>>>   SystemOrganization addCategory: #'ST80-Support-Tests'!
>>>   SystemOrganization addCategory: #'ST80-Symbols'!
>>>   SystemOrganization addCategory: #'ST80-ToolBuilder'!
>>>   SystemOrganization addCategory: #'ST80-Views'!
>>>
>>> Item was added:
>>> + ReadWriteStream subclass: #Transcripter
>>> +     instanceVariableNames: 'frame para'
>>> +     classVariableNames: ''
>>> +     poolDictionaries: ''
>>> +     category: 'ST80-REPL'!
>>> +
>>> + !Transcripter commentStamp: '<historical>' prior: 0!
>>> + Transcripter is a dog-simple scrolling stream with display.  It is
>>> intended to operate with no support from MVC or color in a minimal, or
>>> headless version of Squeak.  No attention has been paid to appearance or
>>> performance.!
>>>
>>> Item was added:
>>> + ----- Method: Transcripter class>>emergencyEvaluator (in category
>>> 'utilities') -----
>>> + emergencyEvaluator
>>> +     (Transcripter newInFrame: (0@0 corner: 320@200))
>>> +             show: 'Type ''revert'' to revert your last method change.
>>> + Type ''exit'' to exit the emergency evaluator.';
>>> +             readEvalPrint!
>>>
>>> Item was added:
>>> + ----- Method: Transcripter class>>newInFrame: (in category 'instance
>>> creation') -----
>>> + newInFrame: frame
>>> + "
>>> + (Transcripter newInFrame: (0@0 extent: 100@200))
>>> +     nextPutAll: 'Hello there'; endEntry;
>>> +     cr; print: 355.0/113; endEntry;
>>> +     readEvalPrint.
>>> + "
>>> +     | transcript |
>>> +     transcript := self on: (String new: 100).
>>> +     transcript initInFrame: frame.
>>> +     ^ transcript clear!
>>>
>>> Item was added:
>>> + ----- Method: Transcripter class>>startTranscriptProcess (in category
>>> 'instance creation') -----
>>> + startTranscriptProcess   "Transcripter startTranscriptProcess"
>>> +     | activeProcess |
>>> +     Transcript := self newInFrame: Display boundingBox.
>>> +     activeProcess := [Transcript readEvalPrint.
>>> +                                     Smalltalk processShutDownList: true; quitPrimitive]
>>> +                                             newProcess
>>> +                                     priority: Processor userSchedulingPriority.
>>> +     activeProcess resume.
>>> +     Processor terminateActive
>>> + !
>>>
>>> Item was added:
>>> + ----- Method: Transcripter>>black (in category 'private') -----
>>> + black
>>> +     Display depth = 1 ifTrue: [^ Bitmap with: 16rFFFFFFFF "Works without
>>> color support"].
>>> +     ^ Color black!
>>>
>>> Item was added:
>>> + ----- Method: Transcripter>>clear (in category 'accessing') -----
>>> + clear
>>> +     Display fill: (frame insetBy: -2) fillColor: self black;
>>> +                     fill: frame fillColor: self white.
>>> +     self on: (String new: 100); endEntry!
>>>
>>> Item was added:
>>> + ----- Method: Transcripter>>confirm: (in category 'command line') -----
>>> + confirm: queryString
>>> +
>>> +     | choice |
>>> +     [choice := self request: queryString , '
>>> + Please type yes or no followed by return'.
>>> +     choice first asUppercase = $Y ifTrue: [^ true].
>>> +             choice first asUppercase = $N ifTrue: [^ false]] repeat!
>>>
>>> Item was added:
>>> + ----- Method: Transcripter>>endEntry (in category 'accessing') -----
>>> + endEntry
>>> +     | c d cb |
>>> +     c := self contents.
>>> +     Display extent ~= DisplayScreen actualScreenSize ifTrue:
>>> +             ["Handle case of user resizing physical window"
>>> +             DisplayScreen startUp.
>>> +             frame := frame intersect: Display boundingBox.
>>> +             ^ self clear; show: c].
>>> +     para setWithText: c asText
>>> +             style: TextStyle default
>>> +             compositionRectangle: ((frame insetBy: 4) withHeight: 9999)
>>> +             clippingRectangle: frame
>>> +             foreColor: self black backColor: self white.
>>> +     d := para compositionRectangle bottom - frame bottom.
>>> +     d > 0 ifTrue:
>>> +             ["Scroll up to keep all contents visible"
>>> +             cb := para characterBlockAtPoint: para compositionRectangle topLeft
>>> +                                                                                     + (0@(d+para lineGrid)).
>>> +             self on: (c copyFrom: cb stringIndex to: c size).
>>> +             readLimit:= position:= collection size.
>>> +             ^ self endEntry].
>>> +     para display!
>>>
>>> Item was added:
>>> + ----- Method: Transcripter>>initInFrame: (in category 'initialization')
>>> -----
>>> + initInFrame: rect
>>> +     Smalltalk at: #Paragraph ifPresent: [:classParagraph | "MVC"
>>> +             frame := rect insetBy: 2.  "Leave room for border"
>>> +             para := classParagraph withText: self contents asText
>>> +                                     style: TextStyle default
>>> +                                     compositionRectangle: ((frame insetBy: 4) withHeight: 9999)
>>> +                                     clippingRectangle: frame
>>> +                                     foreColor: self black backColor: self white]!
>>>
>>> Item was added:
>>> + ----- Method: Transcripter>>readEvalPrint (in category 'command line')
>>> -----
>>> + readEvalPrint
>>> +     | line okToRevert |
>>> +     okToRevert := true.
>>> +     [#('quit' 'exit' 'done' ) includes: (line := self request: '>')]
>>> +             whileFalse:
>>> +             [line = 'revert'
>>> +             ifTrue: [okToRevert
>>> +                     ifTrue: [RecentMessages default revertMostRecent.
>>> +                                     self cr; show: 'reverted: ' , RecentMessages default mostRecent.
>>> +                                     okToRevert := false]
>>> +                     ifFalse: [self cr; show: 'Only one level of revert currently
>>> supported']]
>>> +             ifFalse: [self cr; show: ([Compiler evaluate: line] ifError: [:err :ex
>>> | err])]]!
>>>
>>> Item was added:
>>> + ----- Method: Transcripter>>request: (in category 'command line') -----
>>> + request: prompt
>>> +     | startPos char contents |
>>> +     self cr; show: prompt.
>>> +     startPos := position.
>>> +     [[Sensor keyboardPressed] whileFalse.
>>> +     (char := Sensor keyboard) = Character cr]
>>> +             whileFalse:
>>> +             [char = Character backspace
>>> +                     ifTrue: [readLimit := position := (position - 1 max: startPos)]
>>> +                     ifFalse: [self nextPut: char].
>>> +             self endEntry].
>>> +     contents := self contents.
>>> +     ^ contents copyFrom: startPos + 1 to: contents size!
>>>
>>> Item was added:
>>> + ----- Method: Transcripter>>show: (in category 'accessing') -----
>>> + show: anObject
>>> +     self nextPutAll: anObject asString; endEntry!
>>>
>>> Item was added:
>>> + ----- Method: Transcripter>>white (in category 'private') -----
>>> + white
>>> +     Display depth = 1 ifTrue: [^ Bitmap with: 0 "Works without color
>>> support"].
>>> +     ^ Color white!
>>>
>>>
>>
>>
>>