-- TiogaSelection.mesa, Edited by Paxton on June 17, 1983 1:34 pm
DIRECTORY
Graphics USING [Context],
Rope USING [ROPE],
TiogaNode USING [Location, RefBranchNode, Span],
TiogaDocument,
TiogaFormat USING [LineInfo],
ViewerClasses USING [ModifyProc, Viewer];
TiogaSelection: CEDAR DEFINITIONS = BEGIN OPEN TiogaDocument, 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
No one should do pSel^ ← tSel^ or vice versa ... call Copy instead. It's monitored.
------ Selection Locking ------
CallWithSelAndDocAndTddLocks: PROC [
viewer: Viewer, id: SelectionId ← primary,
proc: PROC [tdd: TiogaDocumentData, tSel: Selection]];
UnlockDocAndPSel: PROC [root: TiogaNode.RefBranchNode];
LockSel: PROC [selection: SelectionId, who: Rope.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.ROPE]; -- locks primary, then secondary
UnlockBothSelections: PROC;
------ Selection Commands ------
KillSelection: PROC ; -- including resetting inputFocus
MakePointSelection: PROC [selection: Selection, pos: TiogaNode.Location];
SelectEverything: PROC; -- expand to include everything
GrowSelectionToBlanks: PROC;
GrowSelectionToSomething: PROC [left, right: PROC [CHAR] RETURNS [BOOLEAN]];
grows until procs return true.
GrowSelection: PROC;
PendingDeleteSelection: PROC;
NotPendingDeleteSelection: PROC;
CaretBeforeSelection: PROC;
CaretAfterSelection: PROC;
------ Selection Display and Control ------
PushOrExchangeSelections, MakePrimary, MakeSecondary,
CancelPrimary, CancelSecondary, CancelFeedback: PROC ;
MakeSelection: PROC [new: Selection ← NIL, selection: SelectionId ← primary,
startValid, endValid: BOOLEANFALSE, 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.
Deselect: PROC [selection: SelectionId ← primary];
Take down the selection without giving up the input focus.
InputModify: ModifyProc ;
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
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: TiogaNode.Span]
RETURNS [start, end: INTEGER, startClipped, endClipped: BOOLEAN] ;
ComputePosLine: PROC [
viewer: Viewer, pos: TiogaNode.Location, firstLine: INTEGER ← 0]
RETURNS [line: INTEGER, clipped: BOOLEAN];
ComputePosPoint: PROC [
viewer: Viewer, pos: TiogaNode.Location,
firstLine: INTEGER ← 0, lineOnly: BOOLEANFALSE]
RETURNS [sp: SelectionPoint];
FixupSelection: PROC [selection: Selection, viewer: Viewer, start, end: BOOLEANTRUE] ;
FixupCaret: PROC [selection: Selection] ;
------ Misc functions ------
SelectionRoot: PROC [s: Selection ← pSel] RETURNS [root: TiogaNode.RefBranchNode];
InsertionPoint: PROC [s: Selection ← pSel] RETURNS [ip: TiogaNode.Location];
GetSelectionGrain: PROC [sel: Selection] RETURNS [SelectionGrain];
InvalidateLineCache: PROC ;
GetCachedLineInfo: PROC [viewer: Viewer, tdd: TiogaDocumentData, line: INTEGER]
RETURNS [TiogaFormat.LineInfo, INTEGER] ;
Position: PROC [viewer: Viewer] ;
FindWhere: TYPE = { forwards, backwards, anywhere };
Find: PROC [
viewer: Viewer, findWhere: FindWhere ← anywhere,
def, word: BOOLEANFALSE,
id: SelectionId ← primary,
case: BOOLTRUE -- case => case of characters is significant -- ];
FindRope: PROC [viewer: Viewer, rope: Rope.ROPE,
findWhere: FindWhere ← anywhere,
def, word: BOOLEANFALSE,
id: SelectionId ← primary,
case: BOOLTRUE -- case => case of characters is significant -- ];
DoFind: PROC [viewer: Viewer, rope: Rope.ROPE,
findWhere: FindWhere ← anywhere,
def, word: BOOLEANFALSE,
id: SelectionId ← primary,
case: BOOLTRUE -- case => case of characters is significant -- ]
RETURNS [found: BOOL];
------ Screen to viewbox transforms ------
SelectProc: TYPE = PROC [viewer: Viewer, tdd: TiogaDocumentData,
x,y: INTEGER, sel: SelectionId, pDel: BOOLEAN] ;
SelectPoint, SelectChar, SelectWord, SelectNode, SelectBranch, Update: SelectProc;
LevelChange: TYPE = {reduce, expand, same};
Extend: PROC [
viewer: Viewer,
tdd: TiogaDocumentData,
x,y: INTEGER,
sel: SelectionId,
pDel: BOOLEAN,
changeLevel: LevelChange,
saveEnds: BOOLEAN];
SetSelLooks: PROC [sel: Selection];
END.