-- file: Editor.Mesa -- last edited by Brotz, April 27, 1981 4:38 PM -- last edited by Levin, February 21, 1980 3:44 PM DIRECTORY dsD: FROM "DisplayDefs", inD: FROM "InteractorDefs", KeyDefs, ovD: FROM "OverviewDefs", vmD: FROM "VirtualMgrDefs"; Editor: DEFINITIONS = BEGIN OPEN inD; -- Editor Department of the Interactor Division -- Implements the editor for the composed message. Commands are: Insert, Append, -- Replace, Delete, Undo, Redo. Other operations (which are not commands per se) are -- selection, scrolling, and command aborting. EditorType: TYPE = {modal, modeless}; CommandType: TYPE = {noCommand, insert, delete, append, replace, get}; Rectangle: TYPE = RECORD [left, right: dsD.ScreenXCoord, top, bottom: dsD.ScreenYCoord]; UnderlineType: TYPE = {target, source}; UnrecognizedCommandProcedure: TYPE = PROCEDURE [mnp: MessageTextNbrPtr, char: CHARACTER]; shiftedSelectionFlag: CHARACTER = 241C; -- If in keystream, indicates use secondary selection. nextCode: CHARACTER = 35C; -- NEXT key set to this value if editor is modeless. cancelCode: CHARACTER = 36C; -- CANCEL key set to this value if editor is modeless. insertDeletionCode: CHARACTER = 37C; -- LF key set to this value if editor is modeless. nextBracketStringCode: CHARACTER = 242C; -- red bug of bracket command house. composedMessagePages: CARDINAL = 5; insertionBufferPages: CARDINAL = 2; deletionBufferPages: CARDINAL = 2; -- Procedures -- AcceptTypeIn: PROCEDURE [mnp: MessageTextNbrPtr, char: CHARACTER]; BracketCommand: PROCEDURE [mnp: MessageTextNbrPtr, char: CHARACTER]; ButlersBoundaryCommand: PROCEDURE [commandNumber: CARDINAL]; CancelSourceSelection: PROCEDURE [mnp: MessageTextNbrPtr]; CancelTargetSelection: PROCEDURE; Decode: KeyboardInputAcceptor; -- Dispatches to specific routines for handling a specific editor command. Fixes up -- scratch buffer and lastCommand upon return of any of the command routines. Deleter: PROCEDURE [mnp: MessageTextNbrPtr]; -- Deletes primary selection from mnp.message. Sets new primary selection to the null range -- at the start of the just used primary selection. Depends on caller to adjust primary -- selection after return if default selection is desired. DoTargetSelection: PROCEDURE; FCommand: PROCEDURE; FindOperation: PROCEDURE [s: STRING, start, end: ovD.CharIndex, mnp: MessageTextNbrPtr] RETURNS [found: BOOLEAN, at, atEnd, patternEnd: ovD.CharIndex]; -- Searches for a match to s within [start .. end) of mnp.message. If found, returns TRUE, -- with [at .. atEnd) the matched range, and patternEnd the first character not matched -- by the pattern, which may differ from atEnd due to } selection termination. GCommand: PROCEDURE [mnp: MessageTextNbrPtr]; -- Replaces the current primary selection with the contents of the file named in -- the get/put brackets. InsertFromLastCommand: PROCEDURE [mnp: MessageTextNbrPtr]; -- Only callable if editorType = modal. Implements R ESC, A ESC, I ESC. InsertLastDeletion: PROCEDURE [mnp: MessageTextNbrPtr]; -- Only callable if editor is modeless. Implements the editor Move command. InsertRangeInMess: PROCEDURE [targetIndex: ovD.CharIndex, targetMessage: vmD.ComposeMessagePtr, from: vmD.MessageRange]; -- ### Temporary KLUDGE to keep from losing virtual manager error messages. MakeCharIndexVisible: PROCEDURE [index: ovD.CharIndex, mnp: MessageTextNbrPtr, offScreenSlop: CARDINAL _ 40] RETURNS [line: LinePtr]; -- Ensures that the caret will be visible during type in. PCommand: PROCEDURE [mnp: MessageTextNbrPtr]; -- Writes the current primary selection onto the file named in the get/put brackets. PrepareForTypeIn: PROCEDURE [mnp: MessageTextNbrPtr]; -- Resets primary selection and handles pending delete properly. Redo: PROCEDURE [mnp: MessageTextNbrPtr]; -- Redoes the last command with the Segment [start .. end). ReplaceRangeInMess: PROCEDURE [to, from: vmD.MessageRange]; -- ### Temporary KLUDGE to keep from losing virtual manager error messages. SCommand: PROCEDURE; SelectEverything: PROCEDURE [mnp: MessageTextNbrPtr]; -- Implements editor E command. SelectNextBlank: PROCEDURE [mnp: MessageTextNbrPtr, forward: BOOLEAN _ TRUE]; -- Implements editor NEXT command. TCommand: PROCEDURE [mnp: MessageTextNbrPtr]; TurnOnDeliver: PROCEDURE; Undo: PROCEDURE [mnp: MessageTextNbrPtr]; -- Undoes the last command, ignoring subsequent window commands or selections. UnrecognizedCommand: PROCEDURE; UpdateScreen: PROCEDURE [start: ovD.CharIndex, nCharsDeleted, nCharsInserted: CARDINAL, mnp: MessageTextNbrPtr, select: BOOLEAN _ TRUE]; -- Shortcut call to screen refreshers. Updates selections and Deliver command as well. -- Smart Display Section of the Editor Department -- Maintains lines and characters within lines on the screen. Handles scrolling, -- refreshing, mapping x,y to character indices. RefreshFromFirstChange: PROCEDURE [actionIndex: ovD.CharIndex, deletedChars, insertedChars: CARDINAL, mnp: MessageTextNbrPtr]; -- A change in the message text has occured at actionPoint. Its relation to the screen is -- unknown. This routine is to fix up the screen to reflect the new state of the message -- text. RefreshToPlaceCharOnLine: PROCEDURE [startCharIndex: ovD.CharIndex, line: LinePtr, mnp: MessageTextNbrPtr, underline: BOOLEAN _ TRUE]; -- Refresh CM window from line on (inclusive), so that firstCharIndex appears somewhere -- in line after refresh. Selections will be refreshed with their underlines iff underline -- is TRUE. RefreshSoThatFirstCharStartsLine: PROCEDURE [firstChar: ovD.CharIndex, firstLine: LinePtr, mnp: MessageTextNbrPtr, underline: BOOLEAN _ TRUE]; -- Refresh all lines of screen in range [firstLine .. bottomLine], so that firstChar starts -- firstLine. Selections will be refreshed with their underlines iff underline is TRUE. -- Side effects: advances highWaterMark. RefreshEndOfMessage: PROCEDURE [mnp: MessageTextNbrPtr]; -- Repaints "End of Message" line if visible with current endOfMessageString. MapXInLineToCharIndex: PROCEDURE [x: ScreenXCoord, line: LinePtr, message: vmD.VirtualMessagePtr] RETURNS [index: ovD.CharIndex, leftX, rightX: ScreenXCoord]; -- Returns the charIndex covering x in line and returns the x bounds of that charIndex. ScrollUpCM: PROCEDURE [y: ScreenYCoord, mnp: MessageTextNbrPtr]; -- y is the ScreenYCoord of the cursor. Scrolls the screen Up, based on this y position. -- Adjusts all structures to reflect the new screen contents. MapYToNonBlankLine: PROCEDURE [y: ScreenYCoord, mnp: MessageTextNbrPtr] RETURNS [line: LinePtr]; -- Returns the screen line associated with y. If y falls on blank line below the end of -- message, then returns the end of message line. ClearScreenLinesToTrailingBlankLines: PROCEDURE [startLine: LinePtr, charIndex: ovD.CharIndex, mnp: MessageTextNbrPtr]; -- Clears the screen bit map and fixes the line blocks for all lines from [startLine .. -- firstLineOffScreen]. ScrollDownCM: PROCEDURE [y: ScreenYCoord, mnp: MessageTextNbrPtr]; -- y is the ScreenYCoord of the cursor. Scrolls the screen Down, based on this y position. -- Adjusts all structures to reflect the new screen contents. Underline: PROCEDURE [start, end: ovD.CharIndex, underlineType: UnderlineType, pendingDelete: BOOLEAN, mnp: MessageTextNbrPtr]; -- Draws an underline indication on the screen for the visible section of the message in -- the range [start .. end). DrawUnderlineInLine: PROCEDURE [start, end: ScreenXCoord, line: LinePtr, underlineType: UnderlineType, pendingDelete: BOOLEAN]; -- XOR's an underline from start to end on the last scan line for line. DeUnderline: PROCEDURE [start, end: ovD.CharIndex, underlineType: UnderlineType, pendingDelete: BOOLEAN, mnp: MessageTextNbrPtr]; -- Removes the underline indication on the screen for the visible section of the message -- in the range [start .. end). UnderlineSelection: PROCEDURE [selection: TextSelectionPtr, underline: UnderlineType]; -- Underlines entire selection. DeUnderlineSelection: PROCEDURE [selection: TextSelectionPtr, underline: UnderlineType]; -- DeUnderlines entire selection. ClearSourceSelection: PROCEDURE; -- DeUnderlines and reinitializes intC.source. InitializeSelection: PROCEDURE [selection: TextSelectionPtr]; -- Initializes a selection to its default values. FormatCM: PROCEDURE [cm: vmD.ComposeMessagePtr]; -- Formats all of the composed message from the high water mark to the end, -- expanding the message to break up long lines if necessary. highWaterMark is -- set to the end of the message. MapCharIndexToLine: PROCEDURE [index: ovD.CharIndex, mnp: MessageTextNbrPtr] RETURNS [LinePtr]; -- Returns the screen line that contains index. Returns NIL if index is not currently -- displayed on any visible screen line. RangeRightXInLine: PROCEDURE [start, to: ovD.CharIndex, startX: ScreenXCoord, message: vmD.VirtualMessagePtr] RETURNS [width: CARDINAL]; -- Returns the sum of the widths in screen raster points of the characters from the -- interval [start .. to) in messsage if placed starting at startX. MapCharIndexInLineToLeftX: PROCEDURE [index: ovD.CharIndex, line: LinePtr, message: vmD.VirtualMessagePtr] RETURNS [x: ScreenXCoord]; -- index is in line. -- Returns the ScreenXCoord of the left edge of the character corresponding to index in -- message. AdjustFirstCharIndices: PROCEDURE [firstLine: LinePtr, increment: INTEGER]; -- Increments the firstCharIndex of all screen lines from firstLine on. MapCursorToCharIndex: PROCEDURE [x: ScreenXCoord, y: ScreenYCoord, mnp: MessageTextNbrPtr] RETURNS [index: ovD.CharIndex]; -- Map x,y to a char index in message. If x,y is to the right of the rightmost char on its -- line, treat as rightmost character. Similarly, if y is too far down on screen, treat as if -- y was on the last screen line that holds normal message text. NthLineFrom: PROCEDURE [line: LinePtr, n: CARDINAL] RETURNS [nthLine: LinePtr]; -- Returns the nth line from line in the line chain, or NIL if fewer than n lines remain. SetHighWaterMark: PROCEDURE [h: ovD.CharIndex]; -- Sets highWaterMark. -- Keyboard management procedures -- ShiftKey: PROCEDURE [state: KeyDefs.updown] RETURNS [yes: BOOLEAN]; ComKey: PROCEDURE [state: KeyDefs.updown] RETURNS [yes: BOOLEAN]; ControlKey: PROCEDURE [state: KeyDefs.updown] RETURNS [yes: BOOLEAN]; ComTap: PROCEDURE RETURNS [yes: BOOLEAN]; -- Returns TRUE iff a Com tap has occurred. Upon return of TRUE, Com tap is reset. ControlTap: PROCEDURE RETURNS [yes: BOOLEAN]; -- Returns TRUE iff a Control tap has occurred. Upon return of TRUE, Control tap is reset. ResetTaps: PROCEDURE; -- To be called when any mouse buttons go down in selection areas or on a SHIFT-CANCEL. MonitorTaps: PROCEDURE; -- To be called continuously. Maintains Control and COM key states and records Com and -- Control taps. -- Buffer management procedures -- ResetInsertionBuffer: PROCEDURE [mnp: MessageTextNbrPtr]; -- Resets mnp.insertionBuffer to be empty. ResetDeletionBuffer: PROCEDURE [mnp: MessageTextNbrPtr]; -- Resets mnp.deletionBuffer to be empty. ResetBuffers: PROCEDURE [mnp: MessageTextNbrPtr]; -- Resets both mnp.insertionBufffer and mnp.deletionBuffer. SwapMessageWithDeletionBuffer: PROCEDURE [mnp: MessageTextNbrPtr]; -- Exchanges contents of mnp.message with mnp.deletionBuffer. SwapMessageWithInsertionBuffer: PROCEDURE [mnp: MessageTextNbrPtr]; -- Exchanges contents of mnp.message with mnp.insertionBuffer. SwapInsertionWithDeletionBuffer: PROCEDURE [mnp: MessageTextNbrPtr]; -- Exchanges contents of mnp.insertionBuffer with mnp.deletionBuffer. END. -- of Editor --z19932(529)\f1