<<-- TEditSelection.mesa, Edited by Paxton on December 29, 1982 10:31 am>> DIRECTORY Graphics USING [Context], Rope USING [ROPE], TextNode USING [Location, Ref, Span], TEditDocument, TEditFormat USING [LineInfo], ViewerClasses USING [ModifyProc, Viewer]; TEditSelection: CEDAR DEFINITIONS = BEGIN OPEN TEditDocument, ViewerClasses; pSel, sSel, oldSel, nilSel, fSel: READONLY Selection; <<-- pSel and sSel are the global primary and secondary selections>> <<-- fSel is the global feedback selection>> <<-- oldSel is old secondary selection saved for Repeat's>> <<-- nilSel is for deselecting>> ------ Selection Allocating and Access ------ Create: PROC RETURNS [Selection]; -- to create a selection record Alloc: PROC RETURNS [Selection]; -- gets it from a small cache Free: PROC [Selection]; -- returns it to the cache. ok if fail to return. disaster if return twice Copy: PROC [source, dest: Selection]; -- the approved way to access selection records <> ------ Selection Display and Control ------ PushOrExchangeSelections, MakePrimary, MakeSecondary, CancelPrimary, CancelSecondary, CancelFeedback: PROC ; CallWithSelAndDocAndTddLocks: PROC [ viewer: Viewer, id: SelectionId _ primary, proc: PROC [tdd: TEditDocumentData, tSel: Selection]]; UnlockDocAndPSel: PROC [root: TextNode.Ref]; LockSel: PROC [selection: SelectionId, who: Rope.ROPE]; <> UnlockSel: PROC [selection: SelectionId]; <> <<>> LockBothSelections: PROC [who: Rope.ROPE]; -- locks primary, then secondary UnlockBothSelections: PROC; MakeSelection: PROC [new: Selection _ NIL, selection: SelectionId _ primary, startValid, endValid: BOOLEAN _ FALSE, forkPaint: BOOL _ TRUE] ; <> CaretVisible: PROC RETURNS [BOOL]; IsDown: PROC [id: SelectionId] RETURNS [BOOL]; ForceDown: PROC [id: SelectionId]; ShowSelection: PROC [id: SelectionId, self: Viewer, context: Graphics.Context]; TakeDownForRedisplay: PROC [id: SelectionId, self: Viewer, context: Graphics.Context]; FixUpAfterDisplay: PROC [id: SelectionId, self: Viewer, context: Graphics.Context, caret: BOOL]; AdjustSelStates: PROC [self: Viewer]; TakeSelectionDown: PROC [id: SelectionId, self: Viewer, context: Graphics.Context]; PutSelectionUp: PROC [id: SelectionId, self: Viewer, context: Graphics.Context]; FakeSecondary: PROC [sel: Selection]; -- change sSel without showing it Deselect: PROC [selection: SelectionId _ primary]; <> MarkSelection: PROC [dc: Graphics.Context, viewer: Viewer, selection: Selection, id: SelectionId] ; ExtendSelection: PROC [dc: Graphics.Context, viewer: Viewer, old, new: Selection, id: SelectionId, updateEnd: BOOLEAN] ; CannotFindIt: ERROR; <<-- can be raised by ComputeSpanLines, ComputePosLine, or ComputePosPoint>> ComputeSpanLines: PUBLIC PROC [viewer: Viewer, span: TextNode.Span] RETURNS [start, end: INTEGER, startClipped, endClipped: BOOLEAN] ; ComputePosLine: PROC [ viewer: Viewer, pos: TextNode.Location, firstLine: INTEGER _ 0] RETURNS [line: INTEGER, clipped: BOOLEAN]; ComputePosPoint: PROC [ viewer: Viewer, pos: TextNode.Location, firstLine: INTEGER _ 0, lineOnly: BOOLEAN _ FALSE] RETURNS [sp: SelectionPoint]; FixupSelection: PROC [selection: Selection, viewer: Viewer, start, end: BOOLEAN _ TRUE] ; FixupCaret: PROC [selection: Selection] ; KillSelection: PROC ; -- including resetting inputFocus MakePointSelection: PROC [selection: Selection, pos: TextNode.Location]; InputModify: ModifyProc ; SelectEverything: PROC; -- expand to include everything GrowSelectionToBlanks: PROC; GrowSelectionToSomething: PROC [left, right: PROC [CHAR] RETURNS [BOOLEAN]]; <> GrowSelection: PROC; PendingDeleteSelection: PROC; NotPendingDeleteSelection: PROC; CaretBeforeSelection: PROC; CaretAfterSelection: PROC; ------ Misc functions ------ SelectionRoot: PROC [s: Selection _ pSel] RETURNS [root: TextNode.Ref]; InsertionPoint: PROC [s: Selection _ pSel] RETURNS [ip: TextNode.Location]; GetSelectionGrain: PROC [sel: Selection] RETURNS [SelectionGrain]; InvalidateLineCache: PROC ; GetCachedLineInfo: PROC [viewer: Viewer, tdd: TEditDocumentData, line: INTEGER] RETURNS [TEditFormat.LineInfo, INTEGER] ; Position: PROC [viewer: Viewer] ; FindWhere: TYPE = { forwards, backwards, anywhere }; Find: PROC [ viewer: Viewer, findWhere: FindWhere _ anywhere, def, word: BOOLEAN _ FALSE, id: SelectionId _ primary, case: BOOL _ TRUE -- case => case of characters is significant -- ]; FindRope: PROC [viewer: Viewer, rope: Rope.ROPE, findWhere: FindWhere _ anywhere, def, word: BOOLEAN _ FALSE, id: SelectionId _ primary, case: BOOL _ TRUE -- case => case of characters is significant -- ]; DoFind: PROC [viewer: Viewer, rope: Rope.ROPE, findWhere: FindWhere _ anywhere, def, word: BOOLEAN _ FALSE, id: SelectionId _ primary, case: BOOL _ TRUE -- case => case of characters is significant -- ] RETURNS [found: BOOL]; ------ Screen to viewbox transforms ------ SelectProc: TYPE = PROC [viewer: Viewer, tdd: TEditDocumentData, x,y: INTEGER, sel: SelectionId, pDel: BOOLEAN] ; SelectPoint, SelectChar, SelectWord, SelectNode, SelectBranch, Update: SelectProc; LevelChange: TYPE = {reduce, expand, same}; Extend: PROC [ viewer: Viewer, tdd: TEditDocumentData, x,y: INTEGER, sel: SelectionId, pDel: BOOLEAN, changeLevel: LevelChange, saveEnds: BOOLEAN]; SetSelLooks: PROC [sel: Selection]; END.