TEditSelection.mesa
Copyright © 1985 by Xerox Corporation. All rights reserved.
Edited by Paxton on December 29, 1982 10:31 am
Doug Wyatt, April 2, 1985 2:52:40 pm PST
DIRECTORY
Imager USING [Context],
Rope USING [ROPE],
TextNode USING [Location, Ref, Span],
TEditDocument USING [Selection, SelectionGrain, SelectionId, SelectionPoint, TEditDocumentData],
ViewerClasses USING [ModifyProc, Viewer];
TEditSelection: CEDAR DEFINITIONS
= BEGIN OPEN TEditDocument;
ROPE: TYPE ~ Rope.ROPE;
Viewer: TYPE ~ ViewerClasses.Viewer;
Selection Access and Allocating
pSel: READONLY Selection;
sSel: READONLY Selection;
fSel: READONLY Selection;
oldSel: READONLY Selection;
nilSel: 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 Repeats
nilSel is for deselecting
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
No one should do pSel^ ← tSel^ or vice versa ... call Copy instead. It's monitored.
Selection Display and Control
PushOrExchangeSelections: PROC;
MakePrimary: PROC;
MakeSecondary: PROC;
CancelPrimary: PROC;
CancelSecondary: PROC;
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];
lock the selection so that no other process can change it
UnlockSel: PROC [selection: SelectionId];
give up lock on the selection
LockBothSelections: PROC [who: ROPE]; -- locks primary, then secondary
UnlockBothSelections: PROC;
MakeSelection: PROC [new: Selection ← NIL, selection: SelectionId ← primary,
startValid, endValid: BOOLFALSE, forkPaint: BOOLTRUE];
start and end valid are if metrics were precomputed and can be trusted by the selection display code. forkPaint is false for selection display code; true for edit ops and others.
CaretVisible: PROC RETURNS [BOOL];
IsDown: PROC [id: SelectionId] RETURNS [BOOL];
ForceDown: PROC [id: SelectionId];
ShowSelection: PROC [id: SelectionId, self: Viewer, context: Imager.Context];
TakeDownForRedisplay: PROC [id: SelectionId, self: Viewer, context: Imager.Context];
FixUpAfterDisplay: PROC [id: SelectionId, self: Viewer, context: Imager.Context, caret: BOOL];
AdjustSelStates: PROC [self: Viewer];
TakeSelectionDown: PROC [id: SelectionId, self: Viewer, context: Imager.Context];
PutSelectionUp: PROC [id: SelectionId, self: Viewer, context: Imager.Context];
FakeSecondary: PROC [sel: Selection]; -- change sSel without showing it
Deselect: PROC [selection: SelectionId ← primary];
Take down the selection without giving up the input focus.
MarkSelection: PROC [dc: Imager.Context, viewer: Viewer, selection: Selection, id: SelectionId];
ExtendSelection: PROC [dc: Imager.Context, viewer: Viewer,
old, new: Selection, id: SelectionId, updateEnd: BOOL];
CannotFindIt: ERROR;
can be raised by ComputeSpanLines, ComputePosLine, or ComputePosPoint
ComputeSpanLines: PROC [viewer: Viewer, span: TextNode.Span]
RETURNS [start, end: INTEGER, startClipped, endClipped: BOOL];
ComputePosLine: PROC [
viewer: Viewer, pos: TextNode.Location, firstLine: INTEGER ← 0]
RETURNS [line: INTEGER, clipped: BOOL];
ComputePosPoint: PROC [
viewer: Viewer, pos: TextNode.Location,
firstLine: INTEGER ← 0, lineOnly: BOOLFALSE]
RETURNS [sp: SelectionPoint];
FixupSelection: PROC [selection: Selection, viewer: Viewer, start, end: BOOLTRUE];
FixupCaret: PROC [selection: Selection];
KillSelection: PROC; -- including resetting inputFocus
MakePointSelection: PROC [selection: Selection, pos: TextNode.Location];
InputModify: ViewerClasses.ModifyProc;
SelectEverything: PROC; -- expand to include everything
GrowSelectionToBlanks: PROC;
GrowSelectionToSomething: PROC [left, right: PROC [CHAR] RETURNS [BOOL]];
grows until procs return true.
GrowSelection: PROC;
PendingDeleteSelection: PROC;
NotPendingDeleteSelection: PROC;
CaretBeforeSelection: PROC;
CaretAfterSelection: PROC;
Making and Extending selections
SelectProc: TYPE = PROC [viewer: Viewer, tdd: TEditDocumentData,
x, y: INTEGER, sel: SelectionId, pDel: BOOL];
SelectPoint: SelectProc;
SelectChar: SelectProc;
SelectWord: SelectProc;
SelectNode: SelectProc;
SelectBranch: SelectProc;
Update: SelectProc;
LevelChange: TYPE = {reduce, expand, same};
Extend: PROC [viewer: Viewer, tdd: TEditDocumentData,
x, y: INTEGER, sel: SelectionId, pDel: BOOL,
changeLevel: LevelChange, saveEnds: BOOL];
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];
Position: PROC [viewer: Viewer];
FindWhere: TYPE = { forwards, backwards, anywhere };
Find: PROC [
viewer: Viewer, findWhere: FindWhere ← anywhere,
def, word: BOOLFALSE,
id: SelectionId ← primary,
case: BOOLTRUE -- case => case of characters is significant -- ];
FindRope: PROC [viewer: Viewer, rope: ROPE,
findWhere: FindWhere ← anywhere,
def, word: BOOLFALSE,
id: SelectionId ← primary,
case: BOOLTRUE -- case => case of characters is significant -- ];
DoFind: PROC [viewer: Viewer, rope: ROPE,
findWhere: FindWhere ← anywhere,
def, word: BOOLFALSE,
id: SelectionId ← primary,
case: BOOLTRUE -- case => case of characters is significant -- ]
RETURNS [found: BOOL];
SetSelLooks: PROC [sel: Selection];
ShowPosition: PROC[viewer: Viewer, skipCommentNodes: BOOLTRUE];
END.