BugsImpl.mesa
Copyright © 1986 by Xerox Corporation. All rights reserved.
Eric Nickell, March 19, 1986 11:08:26 am PST
Bertrand Serlet April 21, 1988 7:18:52 pm PDT
DIRECTORY
Icons, Imager, Process, Rope, ViewerEvents, ViewerLocks, ViewerOps, ViewerPrivate, ViewerSpecs;
BugsImpl: CEDAR MONITOR
IMPORTS Icons, Imager, Process, ViewerEvents, ViewerLocks, ViewerOps, ViewerPrivate, ViewerSpecs
~ BEGIN
IconFlavor: TYPE ~ Icons.IconFlavor;
ROPE: TYPE ~ Rope.ROPE;
fileName: ROPE ~ "Bugs.icons";
rightGoing: LIST OF IconFlavor ~ LIST [
Icons.NewIconFromFile[file: ROPE, n: CARDINAL],
Icons.NewIconFromFile[file: fileName, n: 0],
Icons.NewIconFromFile[file: fileName, n: 1]
];
DrawBug: PROC [x0, y0, x1: INTEGER, dx: NAT] ~ {
pictures: LIST OF IconFlavor ~ rightGoing;
current: LIST OF IconFlavor ← pictures;
NextPicture: PROC RETURNS [i: IconFlavor] ~ {
current ← current.rest;
IF current=NIL THEN current ← pictures;
RETURN [current.first];
};
FOR x: INTEGER ← x0, x+dx UNTIL x>x1 DO
Clip: PROC ~ {
Imager.ClipRectangleI[context: context, x: 0, y: 0, w: ViewerSpecs.openLeftWidth-1, h: 1024];
};
context: Imager.Context ~ ViewerPrivate.CreateContext[screen: bw];
THROUGH [0 .. 3000) DO ENDLOOP;
IF x+64 > ViewerSpecs.openLeftWidth THEN Clip[];
Icons.DrawIcon[flavor: NextPicture[], context: context, x: x, y: y0];
ENDLOOP;
};
MakeBugsCrawl: ViewerEvents.EventProc = {
[viewer: ViewerClasses.Viewer, event: ViewerEvents.ViewerEvent, before: BOOL] RETURNS [abort: BOOL ← FALSE]
tryIt: BOOL ~ SELECT event FROM
changeColumn => ~viewer.iconic,
destroy => viewer.column=left AND ~viewer.iconic,
close => viewer.column=left,
ENDCASE => ERROR;
IF tryIt THEN TRUSTED {Process.Detach[FORK ViewerLocks.CallUnderColumnLock[proc: MakeBugsCrawlInternal, column: left]]};
};
MakeBugsCrawlInternal: PROC ~ {
CountLeftHandViewers: PROC RETURNS [count: CARDINAL ← 0] ~ {
Enum: ViewerOps.EnumProc = {
[v: ViewerClasses.Viewer] RETURNS [BOOL ← TRUE]
IF v.column=left AND ~v.iconic THEN count ← count+1;
};
ViewerOps.EnumerateViewers[enum: Enum];
};
IF CountLeftHandViewers[]=0 THEN DrawBug[x0: 16, y0: 300, x1: ViewerSpecs.openLeftWidth, dx: 4];
};
[] ← ViewerEvents.RegisterEventProc[proc: MakeBugsCrawl, event: close, before: FALSE];
[] ← ViewerEvents.RegisterEventProc[proc: MakeBugsCrawl, event: destroy, before: FALSE];
[] ← ViewerEvents.RegisterEventProc[proc: MakeBugsCrawl, event: changeColumn, before: FALSE];
END.