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;
~
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];