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;
CallWithSelAndDocAndTddLocks:
PROC [viewer: Viewer, id: SelectionId ¬ primary,
proc:
PROC [tdd: TEditDocumentData, tSel: Selection]];
UnlockDocAndPSel: PROC [root: Tioga.Node];
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: BOOL ¬ FALSE, forkPaint: BOOL ¬ TRUE];
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: Tioga.Span]
RETURNS [start, end: INTEGER, startClipped, endClipped: BOOL];
ComputePosLine:
PROC [
viewer: Viewer, pos: Tioga.Location, firstLine: INTEGER ¬ 0]
RETURNS [line: INTEGER, clipped: BOOL];
ComputePosPoint:
PROC [
viewer: Viewer, pos: Tioga.Location,
firstLine: INTEGER ¬ 0, lineOnly: BOOL ¬ FALSE]
RETURNS [sp: SelectionPoint];
FixupSelection: PROC [selection: Selection, viewer: Viewer, start, end: BOOL ¬ TRUE];
FixupCaret: PROC [selection: Selection];
KillSelection: PROC; -- including resetting inputFocus
MakePointSelection:
PROC [selection: Selection, pos: Tioga.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;
Misc functions
SelectionRoot: PROC [s: Selection ¬ pSel] RETURNS [root: Tioga.Node];
InsertionPoint: PROC [s: Selection ¬ pSel] RETURNS [ip: Tioga.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: BOOL ¬ FALSE,
id: SelectionId ¬ primary,
case: BOOL ¬ TRUE -- case => case of characters is significant -- ];
FindRope:
PROC [viewer: Viewer, rope:
ROPE,
findWhere: FindWhere ¬ anywhere,
def, word: BOOL ¬ FALSE,
id: SelectionId ¬ primary,
case: BOOL ¬ TRUE -- case => case of characters is significant -- ];
DoFind:
PROC [viewer: Viewer, rope:
ROPE,
findWhere: FindWhere ¬ anywhere,
def, word: BOOL ¬ FALSE,
id: SelectionId ¬ primary,
case: BOOL ¬ TRUE -- case => case of characters is significant -- ]
RETURNS [found: BOOL];
SetSelLooks:
PROC [sel: Selection];
ShowPosition:
PROC[viewer: Viewer, skipCommentNodes:
BOOL ¬
TRUE];