-- file: InteractorDefs -- edited: by McCreight, September 12, 1980 2:36 PM -- edited: by Brotz, April 9, 1981 1:03 PM -- edited: by Levin, January 7, 1981 5:07 PM -- edited: by Schroeder, November 5, 1980 9:00 AM DIRECTORY crD: FROM "CoreDefs", dsD: FROM "DisplayDefs", exD: FROM "ExceptionDefs", Inline, KeyDefs, ovD: FROM "OverviewDefs", prA: FROM "ProtectionAbstractions", RetrieveDefs, StreamDefs, vmD: FROM "VirtualMgrDefs"; inD: DEFINITIONS IMPORTS Inline = BEGIN -- Purpose: handles user interactions including the display, keyboard and mouse. This -- division gathers together commands and their arguments and is responsible for the -- display of all error messages. InstallCatcher: PROCEDURE; -- Sets up uncaught signal handler during MCStart BuildScreenStructures: PROCEDURE; -- Allocates and fills in the region - neighborhood - house structure. Implemented in -- InitInteractor.Mesa SetScreenParameters: PROCEDURE [screenParameters: ScreenParametersArray]; -- Sets all Y dependent parameters for the screen. Links DCB's into the hardware display -- chain. IdleLoop: PROCEDURE; -- Called by cursor tracking routines and any other routine that has time on its hands. -- Checks clock and calls procedures that must be activated at regular intervals, such as -- the time update for the top window and periodic mail checks. SetTime: PROCEDURE; -- initiates time requests on the network. ReportMBXState: PROCEDURE[mbxState: RetrieveDefs.MBXState]; -- reports mailbox state on the screen UpdateTOCThumbLine: PROCEDURE; -- Checks the TOC thumb line for a change in state and updates accordingly. IndicateCommandBusy: PROCEDURE [hp: HousePtr]; -- Shows that a command is in progress, by: displaying the command house in gray and -- changing the cursor shape. IndicateCommandFinished: PROCEDURE [hp: HousePtr]; -- Shows that a command is finished, by: displaying the command house in white. MakeCommandsCallable: PROCEDURE [callable: BOOLEAN]; -- Sets the callable property of all commands currently on screen to be the value of the -- input parameter. MouseButton: PROCEDURE [button: ButtonType, position: KeyDefs.updown] RETURNS [BOOLEAN] = INLINE -- Returns Boolean value for test of any mouse button position BEGIN -- Hardware convention: Mouse button up corresponds to its bit in mouseButton^ being 1. mouse: POINTER TO UNSPECIFIED = LOOPHOLE[177030B]; RETURN[Inline.BITAND[mouse^, button] # (IF position = up THEN 0 ELSE LOOPHOLE[button])]; END; -- of MouseButton -- AcceptKeyboardInput: PROCEDURE; -- Called by cursor tracking routines when keyboard input is acceptable. Dispatches to -- the proper command interpreter. The standard Laurel editor operates in a mode such -- that the acceptKeyboardInputStream is identical to intC.keystream. Thus, when input -- is present on the acceptKeyboardInputStream it is also present on the intC.keystream. -- Other command interpreters may introduce a filter between these two keystreams. -- This procedure guarantees that input is present on the acceptKeyboardInputStream; -- if operating in a nonstandard mode, the current KeyboardInputAcceptor must funnel -- input from this keystream to whichever keystream is used by subsequent procedures. StartBlinkingCaret: PROCEDURE [x: ScreenXCoord, y: ScreenYCoord]; -- Notes time of call, places caret at x,y. SetCaretBlinking: PROCEDURE [charIndex: ovD.CharIndex, mnp: MessageTextNbrPtr]; -- Like StartBlinkingCaret, but works with indexes and messages. SetBracketsCaretBlinking: PROCEDURE; -- Like StartBlinkingCaret, but works with the current caret in brackets. MaintainBlinkingCaret: PROCEDURE; -- Inverts caret at remembered x,y at appropriate time. StopBlinkingCaret: PROCEDURE; -- Restores caret picture to original state. CaretIsBlinking: PROCEDURE RETURNS [BOOLEAN]; -- Indicates whether the editor is in a state such that the caret should be blinking. PlayTune: PROCEDURE [s: STRING]; -- Tweaks speaker output to play tune encoded in s. ScreenTracker: PROCEDURE [trackerType: TrackerType]; -- Determines which cursor tracking routine should handle cursor tracking based on the -- cursor's current position. This procedure is the highest on any calling chain. A -- return to ScreenTracker means that a lower level cursor tracker has determined that -- the cursor has moved out of its jurisdiction and a new lower level cursor tracker -- should be invoked. CommandTracker: PROCEDURE [cnp: CommandNbrPtr, trackerType: TrackerType]; -- This is the nbrTracker for command neighborhoods. Sets cursor shape for command -- neighborhood. Watches for button up and down, calls routines to invert and restore -- command houses on screen. Calls routines in Command Dept. as appropriate. HouseTracker: PROCEDURE [hp: HousePtr, trackerType: TrackerType]; -- Tracks cursor when within a command house. Watches for button down and up, -- inverts house display pattern, and calls command procedure when fired. TextHouseRefresher: PROCEDURE [hp: HousePtr]; -- Repaints one text house on the display screen according to the parameters contained in -- hp^. BracketsHouseRefresher: PROCEDURE [hp: HousePtr]; -- Repaints one brackets command house on the display screen. FreePagesHouseRefresher: PROCEDURE [count: CARDINAL]; -- Repaints the free pages house with count on the display screen. NullHouseRefresher: PROCEDURE [hp: HousePtr]; -- Place-holder for houses that don't exist. MoveTOCDMBoundary: PROCEDURE[bnp: BoundaryPadNbrPtr, y: ScreenYCoord]; -- Changes TOC-DM boundary to legal position closest to y. MoveDMCMBoundary: PROCEDURE[bnp: BoundaryPadNbrPtr, y: ScreenYCoord]; -- Changes DM-CM boundary to legal position closest to y. AdjustBoundaries: PROCEDURE [tocdmY, dmcmY: ScreenYCoord]; -- Adjust screen so that the boundary pads will be at tocdmY and dmcmY. -- TOC Department of the Interactor Division -- Responsible for cursor tracking and display manipulation within the TOC town. -- Procedures in this department may call on the Virtual TOC routines and share a -- number of common data structures, such as the TOC line index, selected item indices, -- TOC town boundaries, etc. TOCTracker: PROCEDURE [tnp: TOCTextNbrPtr, trackerType: TrackerType]; -- Tracks cursor within the TOC text neighborhood. Chooses among three -- subneighborhood cursor trackers depending on the cursor's position. TOCTextPainter: PROCEDURE [tnp: TOCTextNbrPtr]; -- Paints the entire TOC Text neighborhood. Consider: PROCEDURE [lowIndex, highIndex: vmD.TOCIndex, tnp: TOCTextNbrPtr]; -- Paints considered marker on the first lines of all visible TOCEntries in the range -- [lowIndex..highIndex]. Deconsider: PROCEDURE [lowIndex, highIndex: vmD.TOCIndex, tnp: TOCTextNbrPtr]; -- Removes selected marker from the first lines of all visible TOCEntries in the range -- [lowIndex..highIndex]. DisplayTOCTail: PROCEDURE [tnp: TOCTextNbrPtr, line: LinePtr, index: vmD.TOCIndex, lineNum: TOCLineNumber]; -- Paints the rest of the TOC neighborhood from line to the bottom. The first text -- displayed is lineNum of index. Displays End of messages if necessary. DisplayTOCEntry: PROCEDURE [tnp: TOCTextNbrPtr, index: vmD.TOCIndex, suppressed: CARDINAL, firstLine: LinePtr] RETURNS [firstUnusedLine: LinePtr, nLines: CARDINAL]; -- Paints the index'th TOCEntry on screen. suppressed gives number of lines of the -- TOCEntry to skip before displaying the rest of the TOCEntry. firstLine points to the -- Line descriptor for the first line to be used. DisplayTOCEntry stops displaying when -- either it has displayed the entire entry or it runs to the end of the Line list. In -- either case it returns the total number of lines (including suppressed lines) that this -- TOCEntry requires and the next available Line. MapTOCIndexToTOCLine: PROCEDURE [index: vmD.TOCIndex, tnp: TOCTextNbrPtr, line: LinePtr _ NIL] RETURNS [LinePtr]; -- Returns the tocLine for index. Returns NIL if index is not currently displayed. Starts -- search at line if not NIL. MapYToTOCIndex: PROCEDURE [y: ScreenYCoord, tnp: TOCTextNbrPtr] RETURNS [vmD.TOCIndex]; -- Returns the vmD.TOCIndex of the TOCEntry that occupies the line containing y. ThisIsAFirstLine: PROCEDURE [y: ScreenYCoord, tnp: TOCTextNbrPtr] RETURNS [BOOLEAN]; -- Returns TRUE if y is in a first line of a TOCEntry, FALSE otherwise. MapTOCIndexToTopY: PROCEDURE [index: vmD.TOCIndex, tnp: TOCTextNbrPtr] RETURNS [ScreenYCoord, BOOLEAN]; -- Returns the first scanline for index. Returns FALSE if index is not currently -- displayed. ScrollUpTOC: PROCEDURE [y: ScreenYCoord, tnp: TOCTextNbrPtr]; -- Computes number of lines to scroll up, moves area of screen up, refreshes bottom of -- TOC with new text, and fixes up Line structures. ScrollDownTOC: PROCEDURE [y: ScreenYCoord, tnp: TOCTextNbrPtr]; -- Computes number of lines to scroll down, moves area of screen down, refreshes top of -- TOC with new text, and fixes up Line structures. ThumbTOC: PROCEDURE [tlnp: ThumbLineNbrPtr, x: ScreenXCoord]; -- Determines which TOCEntry will be the first entry on screen after thumbing. Calls -- DisplayTOC to display that entry and those that follow. MakeTOCIndexVisible: PROCEDURE [index: vmD.TOCIndex]; -- Makes the first line of index visible within the TOC window, including as much of the -- entry as possible. FillScreenWithWords: PROCEDURE [x: ScreenXCoord, y: ScreenYCoord, limX: ScreenXCoord, startCharIndex: CARDINAL, s: STRING] RETURNS [firstUnusedCharIndex: CARDINAL, firstEmptyX: ScreenXCoord]; -- Fills the screen section [x..limX) with characters from s, breaking just before a word -- begins. All white space characters remain on the same line as the word they follow. NextTOCEntry: PROCEDURE [tnp: TOCTextNbrPtr, entry: vmD.TOCIndex] RETURNS [exists: BOOLEAN, nextEntry: vmD.TOCIndex]; -- Determines the next TOCEntry after entry according to the current TOC filter. ScrollUpDM: PROCEDURE [y: ScreenYCoord, mnp: MessageTextNbrPtr]; -- Scrolls message line containing y or End of Message line to top of neighborhood. ScrollDownDM: PROCEDURE [y: ScreenYCoord, mnp: MessageTextNbrPtr]; -- Scrolls top message line of neighborhood down to line containing y. Will not scroll -- first line of message below top line however. -- DM Department of the Interactor Division -- Responsible for cursor tracking and display manipulation within the DM town. -- Procedures in this division may call on the Virtual DM routines and share a number of -- common data structures, such as selected item indices, town boundaries, etc. DisplayDMTail: PROCEDURE [mnp: MessageTextNbrPtr, line: LinePtr, startIndex: ovD.CharIndex]; -- Fills out as much of the displayed message as possible starting in line with startIndex. ThumbDM: PROCEDURE [tlnp: ThumbLineNbrPtr, x: ScreenXCoord]; -- Determines which CharIndex of mnp.message will be on the top line and displays the -- message accordingly. -- CM Department of the Interactor Division -- Responsible for cursor tracking and display manipulation within the CM town. -- Procedures in this division may call on the Virtual CM routines and share a number of -- common data structures, such as selected item indices, town boundaries, etc. TextNbrTracker: PROCEDURE [mnp: MessageTextNbrPtr, trackerType: TrackerType]; -- Tracks cursor within a message text area. Monitors mouse buttons for selection. Calls on -- TextScrollBarTracker and Selector to track the cursor within their respective domains. ThumbCM: PROCEDURE [tlnp: ThumbLineNbrPtr, x: ScreenXCoord]; -- Determines which CharIndex of mnp.message will be on the top line and displays the -- message accordingly. MoveLines: PROCEDURE [top, bottom, newTop: LinePtr, mnp: MessageTextNbrPtr] RETURNS [newBottom: LinePtr]; -- Boundary Department of the Interactor Division BoundaryLineNbrTracker: PROCEDURE [bnp: BoundaryLineNbrPtr]; -- Tracks cursor within a boundary line neighborhood. BoundaryPadNbrTracker: PROCEDURE [bnp: BoundaryPadNbrPtr, trackerType: TrackerType]; -- Tracks cursor within a boundary pad neighborhood. ExceptionsTracker: PROCEDURE [mnp: MessageTextNbrPtr, trackerType: TrackerType]; -- Tracks cursor within the Exceptions neighborhood. ThumbLineNbrTracker: PROCEDURE [tlnp: ThumbLineNbrPtr, trackerType: TrackerType]; -- Tracks cursor within a thumb line neighborhood. ChangeCommandMenu: PROCEDURE [cnp: CommandNbrPtr, region: RegionPtr, linesToKeep: CARDINAL]; -- The list of houses pointed to by cnp has changed. linesToKeep is the number of line of -- the cnp that have not changed. Changes the menu on screen to display all houses now -- in cnp's houses list. Rearranges screen if necessary to accommodate changed command -- neighborhood height. GetStringForBrackets: PROCEDURE [hp: HousePtr, leftX, rightX: ScreenXCoord, maxDeltaX: CARDINAL, bracketFace: dsD.FaceType, displayChars: BOOLEAN, initialDisplayString, abortString, outputString: STRING, acceptWhiteSpace: BOOLEAN _ FALSE, enumerate: PROC [STRING] _ NIL] RETURNS [aborted: BOOLEAN, newRightX: ScreenXCoord]; -- Displays initialDisplayString in brackets. Accepts keyboard input and -- displays it appended to initialDisplayString. If abort (DEL or CANCEL), -- displays abortString in brackets and terminates. On termination (DEL or -- CANCEL or ESC (or DO)), puts the then displayed string in outputString. -- Returns the new right x position. -- Editor Department of the Interactor Division -- cf. EditorDefs.Mesa -- Command Department of the Interactor Division -- Contains Interactor portion of all commands. Any screen manipulation caused by -- command invocation is done by these procedures. Global data for various commands is -- held here. Display of errors occurring from commands is done by procedures in this -- department. All procedures in this department have no call or return parameters so that -- the type of each procedure is the same. Thus, callers of these procedures will be able to -- be table driven. GetMailFileCommand: CommandProcedure; -- Calls ReturnMailFileOperation with activeMailFileName and TOCStructure. Clears TOC -- Entries neighborhood and clears DM text neighborhood. Calls GetMailFileOperation -- with GMFFileName, user's file server name, password and file server port.; calls -- DisplayException if failure is reported back. Determines what portion of the TOC -- should be displayed, selects a default selected message interval, and calls DisplayTOC -- to display the TOC. LoginCommand: CommandProcedure; -- Prompts for name and password. Returns them in user. -- Side effects: changes user. QuitCommand: CommandProcedure; -- Calls QuitOperation. Calls DisplayException if failure is reported back. GetNewMailCommand: CommandProcedure; -- Calls AccessNewMailOperation with activeMailFileName, user's DMS name, user's file -- server name, mail server password, file server password, mail server port, and file -- server port. Calls DisplayException if failure is reported back. DeleteCommand: CommandProcedure; -- Sets deleted field and changed field for each selected TOCEntry. Updates the display to -- reflect the changes. UndeleteCommand: CommandProcedure; -- Clears deleted field for each TOCEntry in the closed interval [selectedTOCEntry1 .. -- selectedTOCEntry2]. Updates the display to reflect the changes. HardcopyCommand: CommandProcedure; -- Calls HardcopyOperation with active mail file stream and the interval end points -- selectedTOCEntry1, selectedTOCEntry2. Calls DisplayException if failure is reported -- back. SetPrinterCommand: CommandProcedure; -- Sets intC.hardcopyHost to contents of following brackets. SetCopiesCommand: CommandProcedure; -- Sets intC.hardCopies to contents of following brackets. SetDuplexCommand: CommandProcedure; -- Complements intC.twoSidedPrinting and Yes/No contents of following brackets. SetPasswordProtectedCommand: CommandProcedure; -- Complements intC.passwordPrinting and Yes/No contents of following brackets. SetOverrideFormCommand: CommandProcedure; -- Sets form to use for subsequent hardcopies to contents of following brackets. HardcopyConfirmCommand: CommandProcedure; -- Restores original command menu and continues hardcopy processing. HardcopyCancelCommand: CommandProcedure; -- Cancels hardcopy processing and restores original command menu. DisplayMessageCommand: CommandProcedure; -- Clears DM text neighborhood. Sets selectedTOCEntry2 to SelectedTOCEntry1. Calls -- VirtualizeMessage with selectedTOCEntry1 and the DM VirtualStructure; calls -- DisplayException if failure is reported back. Calls DisplayOneLine on the DM -- VirtualStructure until either the neighborhood is full or the end of the DM -- neighborhood is reached. MoveMessageToFileCommand: CommandProcedure; -- Calls AppendMailToFileOperation with [selectedTOCEntry1 .. selectedTOCEntry2], -- MMFFileName, and activeMailFileStream. Calls DisplayException if failure is -- reported back. Confirm: PROCEDURE [lineNumber: CARDINAL] RETURNS [confirmed: BOOLEAN]; -- Displays confirmation message on lineNumber of exception region, waits for -- confirmation input from user, displays exception if unexpected input received. ConfirmInner: PROCEDURE [lineNumber: CARDINAL] RETURNS [char: CHARACTER]; -- Displays confirmation message on lineNumber of exception region, waits for -- confirmation input from user, returns character typed by user. ConfirmBrackets: PROCEDURE [hp: HousePtr, acceptWhiteSpace: BOOLEAN _ FALSE, fileExtension: STRING _ NIL] RETURNS [confirmed: BOOLEAN]; -- Accepts keyboard input file name, sets hp.text to this file name, and displays it in its -- display position. Changes area of screen sensitive to mouse to reflect new brackets -- size. Returns Boolean value FALSE if brackets fill in is aborted, TRUE if completed. AskUserToConfirm: PROCEDURE [exception: exD.Exception] RETURNS [confirmed: BOOLEAN]; -- Displays string corresponding to exception and the confirmation request message to -- user. Returns the user's answer. NewFormCommand: CommandProcedure; -- Clears old composed message and initializes a new one to the standard composed -- message template. Refreshes display of the composed message. AnswerCommand: CommandProcedure; -- Clears old composed message and initializes a new one to the standard reply. Refreshes -- display of the composed message. ForwardCommand: CommandProcedure; -- Clears old composed message and initializes a new one to the standard template for -- forwarded messages, followed by the entire displayed message (surrounded by dashed -- lines). Refreshes display of the composed message. GetCommand: CommandProcedure; -- Replaces the current composed message with the contents of the file named in the -- brackets. PutCommand: CommandProcedure; -- Writes the current composed message onto the file named in the brackets. CopyCommand: CommandProcedure; -- Copies a remote or local file to a remote or local file using opD.Copy. The composed -- message is not affected by this command. RunCommand: CommandProcedure; -- Interface to bcd loader and typescript handler. SendCommand: CommandProcedure; -- Calls SendOperation with CM VirtualStructure. Calls DisplayException if failure is -- reported back. SendOperation: PROCEDURE [formatProc: PROC [vmD.ComposeMessagePtr], confirmed: BOOLEAN _ FALSE]; -- Guts of SendCommand. FindCommand: CommandProcedure; -- Starting at the current selection, searches for text in following brackets. If found, selects -- the found text and normalizes it in the composed message region. SubstituteCommand: CommandProcedure; -- Within the bounds of the current selection, substitutes the text in the following brackets -- for each occurence of the text in the preceding brackets. ShortenEditorMenuCommand: CommandProcedure; -- Restores the editor menu to its original one line appearance. NullCommand: CommandProcedure; -- Does nothing. Purely a placeholder for information houses. -- Interface Variables keyboardInputAcceptorPtr: POINTER TO KeyboardInputAcceptor; -- Things Defined Elsewhere ScreenXCoord: TYPE = dsD.ScreenXCoord; ScreenYCoord: TYPE = dsD.ScreenYCoord; ErrorCode: TYPE = ovD.ErrorCode; ok: ErrorCode = ovD.ok; -- Type Definitions KeyboardInputAcceptor: TYPE = PROCEDURE [mnp: MessageTextNbrPtr, char: CHARACTER]; CommandProcedure: TYPE = PROCEDURE [hp: HousePtr, confirmed: BOOLEAN]; TrackerType: TYPE = {normal, brackets}; ButtonType: TYPE = MACHINE DEPENDENT {middle(1), right(2), left(4), any(7)}; Region: TYPE = RECORD [nextRegion: RegionPtr, -- next region on chain dcb: dsD.DCBptr, -- DCB for this region regionType: RegionType, -- identifies which region this is topY, -- first scan line of region bottomY: ScreenYCoord, -- first scan line not in region cursorShape: dsD.CursorShape, -- shape for region nbrs: NbrPtr]; -- first Nbr on Neighborhood list RegionPtr: TYPE = POINTER TO Region; RegionType: TYPE = {mailCommandRegion, tocRegion, tocCommandRegion, dmRegion, cmCommandRegion, cmRegion, exceptionsRegion}; ScreenParametersArray: TYPE = ARRAY RegionType OF CARDINAL; Nbr: TYPE = RECORD [nextNbr: NbrPtr, -- next Nbr on chain nLines: CARDINAL, -- actual number of screen lines covered by this Nbr topY, -- first scan line in nbr. bottomY: ScreenYCoord, -- first scan line not in nbr. leftX, -- first X coord. in neighborhood rightX: ScreenXCoord, -- first X coord. not in neighborhood cursorShape: dsD.CursorShape, -- shape for neighborhood nbrVariant: SELECT nbrClassTag: NbrClass FROM command => [houses: HousePtr, nbrTracker: PROCEDURE [CommandNbrPtr, TrackerType]], tocText => [lines, firstLineOffScreen: LinePtr, nbrTracker: PROCEDURE [TOCTextNbrPtr, TrackerType]], messageText => [haveMessage: BOOLEAN, editable: BOOLEAN, lines, firstLineOffScreen: LinePtr, message: vmD.VirtualMessagePtr, protectedFieldPtr: prA.ProtectedFieldPtr, insertionBuffer: vmD.ComposeMessagePtr, deletionBuffer: vmD.ComposeMessagePtr, endString: STRING, -- Normally points to "End of Message.". nbrTracker: PROCEDURE [MessageTextNbrPtr, TrackerType]], boundaryLine => [nbrTracker: PROCEDURE [BoundaryLineNbrPtr]], boundaryPad => [command: PROCEDURE [BoundaryPadNbrPtr, ScreenYCoord], nbrTracker: PROCEDURE [BoundaryPadNbrPtr, TrackerType]], thumbLine => [exists: BOOLEAN, length, start, end, selection: CARDINAL, startX, endX, selectionX: ScreenXCoord, command: PROCEDURE [ThumbLineNbrPtr, ScreenXCoord], nbrTracker: PROCEDURE [ThumbLineNbrPtr, TrackerType]], ENDCASE]; NbrPtr: TYPE = POINTER TO Nbr; CommandNbrPtr: TYPE = POINTER TO command Nbr; TOCTextNbrPtr: TYPE = POINTER TO tocText Nbr; MessageTextNbrPtr: TYPE = POINTER TO messageText Nbr; BoundaryLineNbrPtr: TYPE = POINTER TO boundaryLine Nbr; BoundaryPadNbrPtr: TYPE = POINTER TO boundaryPad Nbr; ThumbLineNbrPtr: TYPE = POINTER TO thumbLine Nbr; NbrClass: TYPE = {command, tocText, messageText, boundaryLine, boundaryPad, thumbLine}; House: TYPE = RECORD [nextHouse: HousePtr, -- next house on chain lineNumber: CARDINAL, -- line of the command Nbr for this House (starting at 0) topY, -- first Y coord. in house bottomY: ScreenYCoord, -- first Y not in house leftX, -- first X coord. in house rightX: ScreenXCoord, -- first X coord. not in house text: STRING, -- string to be displayed on screen fixedEdge: {left, right}, -- side of house whose position is fixed typeface: dsD.FaceType, -- typeface for text picture: dsD.PictureClass _ resetMenuIcon, -- picture if usePicture is TRUE needsConfirmation: BOOLEAN, -- TRUE = command must be confirmed trackerIndicateDone: BOOLEAN, -- TRUE = tracker will handle ungraying. callable: BOOLEAN, -- TRUE = tracker indicate call status and call command. usePicture: BOOLEAN _ FALSE, -- TRUE = paint picture instead of text. command: CommandProcedure, -- to be called if house is bugged houseRefresher: PROCEDURE [HousePtr]]; -- paints house HousePtr: TYPE = POINTER TO House; Line: TYPE = RECORD [y: ScreenYCoord, -- Y position of this line nextLine: LinePtr, state: LineState, lineVariant: SELECT OVERLAID * FROM tocLine => [linePair: LinePair], messageLine => [rightX: ScreenXCoord, firstCharIndex, -- first CharIndex displayed pendingIndex: ovD.CharIndex], -- first CharIndex after reformatting ENDCASE]; LinePtr: TYPE = POINTER TO Line; LinePair: TYPE = RECORD [index: vmD.TOCIndex, -- which TOC is displayed in line lineNumber: TOCLineNumber]; -- which line of this TOC Entry LinePairPtr: TYPE = POINTER TO LinePair; LineState: TYPE = {index, end, empty, normalText, endOfMessage, trailingBlankLine}; TextSelection: TYPE = RECORD [mnp: MessageTextNbrPtr, start, end, point: ovD.CharIndex, mode: SelectionMode, pendingDelete: BOOLEAN]; TextSelectionPtr: TYPE = POINTER TO TextSelection; SelectionMode: TYPE = {char, word, line, paragraph, everything}; TOCLineNumber: TYPE = CARDINAL; CaretState: TYPE = {white, black, notVisible}; NewMailStatus: TYPE = {newMail, noNewMail, badMailboxID}; TextNbrSizes: TYPE = RECORD[toc, dm, cm: CARDINAL]; BoundarySetArray: TYPE = ARRAY [0 .. 9] OF TextNbrSizes; BoundarySet: TYPE = POINTER TO BoundarySetArray; -- Global Constants -- leftMargin: ScreenXCoord = dsD.xOrigin; rightMargin: ScreenXCoord = leftMargin + dsD.bmWidth*16; lineBarLeftX: ScreenXCoord = 24; consideredLeftX: ScreenXCoord = leftMargin; markLeftX: ScreenXCoord = leftMargin + 7; numberLeftX: ScreenXCoord = leftMargin + 19; numberRightX: ScreenXCoord = leftMargin + 43; CRWidth: CARDINAL = 5; digitWidth: CARDINAL = 6; maxBracketStringLength: CARDINAL = 60; maxLinesPerTOCEntry: CARDINAL = 3; mouseX: POINTER TO CARDINAL = LOOPHOLE[424B]; mouseY: POINTER TO CARDINAL = LOOPHOLE[425B]; cursorX: POINTER TO CARDINAL = LOOPHOLE[426B]; cursorY: POINTER TO CARDINAL = LOOPHOLE[427B]; realTimeClock: POINTER TO CARDINAL = LOOPHOLE[430B]; END. -- of InteractorDefsz20461(635)\f1 26296f0