Copyright (C) 1994, Digital Equipment Corp.
<* PRAGMA LL *>A
TypescriptVBT is a subtype of TextEditVBT, with additional
features to make it serve as a ``glass teletype'' with a memory.
Abstractly, a typescript contains
reader(v) an intermittent, unseekable reader
writer(v) a buffered, unseekable writer
readingThread(v) a thread
reader(v) provides the client with input that the user typed.
writer(v) is used to display output. The reader and writer are
paired such that the writer is flushed whenever a seek blocks on
the reader. The writer is not flushed at every newline.
All input to the typescript, once it has been read, and all output,
become part of the {\em history} of the typescript, and is not
modifiable; it remains until the client deletes it by calling
ClearHistory. Selections that lie fully or partially within the
history region are never ``replace-mode'' selections (see
Section~\ref{ReplaceMode}, page~\pageref{ReplaceMode}). Any
attempt to type or insert text in the history region becomes an
insertion at the end of the typescript instead.
readingThread(v) is initially NIL. When a client reads from
v, readingThread(v) is set to Thread.Self(). The
handleInterrupt method (see below) alerts readingThread(v).
This is useful when the reading thread is blocked waiting for
input.
A typescript's textport, v.tp, must be of type
TypescriptVBT.Port (which is a subtype of TextPort.T). The
textport's returnAction method makes the text of the current
type-in region available to the reader and no longer editable. The
textport's setReadOnly method is a no-op.
Typescripts do not allow the use of Undo and Redo.
INTERFACEThe callTypescriptVBT ; IMPORT Rd, TextEditVBT, TextPort, VBT, Wr, Thread; TYPE T <: Public; Public = TextEditVBT.T OBJECT METHODS <* LL.sup <= VBT.mu *> init (scrollable := TRUE): T; interrupt (time: VBT.TimeStamp); handleInterrupt (time: VBT.TimeStamp); terminate (); setThread (thread: Thread.T := NIL); END; Port <: TextPort.T;
v.init() initializes v as an empty typescript.
It is a checked runtime error if v.tp is NIL or is not of type
TypescriptVBT.Port, which is a subtype of TextPort.T.
The call v.interrupt(time) simulates an interrupt by
flushing any pending type-in, writing the characters ^C, and then
calling v.handleInterrupt(time).
The call v.handleInterrupt(time) alerts readingThread(v).
After v.terminate() is called, subsequent attempts to read from
v will causes it to report end of file, and v becomes
unresponsive to further user input, although it will continue to
display output written to its output stream. This is appropriate
when v is being discarded.
The call v.setThread(thread) changes readingThread(v). This
can be used to protect Thread.Self() from being alerted after it
has finished reading from reader(v). Subsequent reads on
reader(v) will reset the readingThread(v) to Thread.Self().
TYPE Reader <: PublicReader; PublicReader = Rd.T OBJECT METHODS typescript (): T END; Writer <: PublicWriter; PublicWriter = Wr.T OBJECT METHODS typescript (): T END; PROCEDURE GetRd (v: T): Reader;
Get the input stream forv. By definition,GetRd(v).typescript() = v
PROCEDURE GetWr (v: T): Writer;
Get the output stream forv. By definition,GetWr(v).typescript() = v
PROCEDURE GetHistory (v: T): TEXT; <* LL <= VBT.mu *>
Return the ``history'' text of v. PROCEDURE ClearHistory (v: T); <* LL <= VBT.mu *>
Clear the ``history'' text of v. END TypescriptVBT.