DIRECTORY
Buttons USING [ButtonProc, Create, Destroy],
CedarProcess USING [Fork, ForkableProc],
Commander USING [CommandProc, Register],
Imager USING [black, MaskRectangle, SetColor, white],
ImagerBackdoor USING [GetBounds],
IO USING [card, PutFR, PutRope, rope, STREAM],
PrintingP4V3 USING [RequestID],
PrintingP4V3Aux USING [ExposeInterpressMasterStatus],
Rope USING [ROPE],
TypeScript USING [Create],
UserProfile USING [Boolean],
ViewerClasses USING [AdjustProc, DestroyProc, PaintProc, Viewer, ViewerClass, ViewerClassRec],
ViewerIO USING [CreateViewerStreams],
ViewerOps USING [CreateViewer, EnumerateViewers, EnumProc, EstablishViewerPosition, OpenIcon, RegisterViewerClass],
XNSPrintRequestManager USING [GetPrintRequestList, GetPrintRequestStatus, ListChanged, PrintRequest, PrintRequestList, RequestStatus];
XNSPrintRequestWatcher:
CEDAR
MONITOR
IMPORTS Buttons, CedarProcess, Commander, Imager, ImagerBackdoor, IO, PrintingP4V3Aux, TypeScript, UserProfile, ViewerIO, ViewerOps, XNSPrintRequestManager ~ {
OPEN Printing: PrintingP4V3, PrintingAux: PrintingP4V3Aux, XNSPrintRequestManager;
Commander Constants
XNSPrintRequestWatcher: ROPE ~ "XNSPrintRequestWatcher";
doc: ROPE ~ "\nCreate viewer to monitor and/or manipulate XNS print requests";
usage: ROPE ~ "Usage: XNSPrintRequestWatcher";
NAMESTRIPE: ROPE ~ "Print Request Manipulation";
TYPESCRIPT: ROPE ~ "///Temp/XNSPrintRequestWatcher.TypeScript";
Types
ButtonList: TYPE ~ LIST OF Viewer;
ROPE: TYPE ~ Rope.ROPE;
Viewer:
TYPE ~ ViewerClasses.Viewer;
Data: TYPE ~ REF DataRec;
DataRec:
TYPE ~
RECORD [
actualRequest: PrintRequest ← NIL, -- only for the ButtonProc
autoOpen: BOOL ← FALSE,
buttons: ButtonList ← NIL,
requests: PrintRequestList ← NIL,
typeScript: Viewer ← NIL,
typeScriptIn: IO.STREAM ← NIL,
typeScriptOut: IO.STREAM ← NIL,
viewer: Viewer ← NIL
];
Commander Proc
RequestWatcherCmd: Commander.CommandProc ~ {
data: Data ← NEW [DataRec];
otherGuy: Data ← ConditionallySetWatcher[data];
IF (otherGuy #
NIL)
THEN {
UpdateViewer[otherGuy, TRUE];
RETURN;
};
data.autoOpen ← UserProfile.Boolean[AUTOOPEN, FALSE];
data.viewer ← ViewerOps.CreateViewer[
flavor: $XNSPrintRequestWatcher,
info: [name: NAMESTRIPE, data: data]
];
data.typeScript ← TypeScript.Create[[parent: data.viewer, border: TRUE, wh: 60]];
[data.typeScriptIn, data.typeScriptOut] ← ViewerIO.CreateViewerStreams[NIL, data.typeScript, TYPESCRIPT];
TypeScriptWrite[data, "Beginning of Typescript...\n"];
UpdateViewer[data];
};
Viewer Procs
TypeScriptWrite:
PUBLIC
PROC [data: Data, rope:
ROPE] ~ {
IF (data.typeScriptOut # NIL) THEN IO.PutRope[data.typeScriptOut, rope];
};
AdjustProc: ViewerClasses.AdjustProc ~ {
data: Data ← NARROW [self.data];
nButtons: NAT ← 0;
height: INTEGER ← self.wh-12;
FOR buttons: ButtonList ← data.buttons, buttons.rest
WHILE (buttons #
NIL)
DO
button: Viewer ← buttons.first;
nButtons ← nButtons+1;
ViewerOps.EstablishViewerPosition[button, 0, (height-(20*nButtons)), button.ww, button.wh];
ENDLOOP;
ViewerOps.EstablishViewerPosition[data.typeScript, 0, 0, self.ww, (height-(20*nButtons)-4)];
RETURN[TRUE];
};
DestroyProc: ViewerClasses.DestroyProc ~ {
data: Data ← NARROW [self.data];
ClearWatcher[];
};
PaintProc: ViewerClasses.PaintProc = {
data: Data ← NARROW [self.data];
IF (whatChanged =
NIL)
THEN {
Imager.SetColor[context, Imager.white];
Imager.MaskRectangle[context, ImagerBackdoor.GetBounds[context]];
Imager.SetColor[context, Imager.black];
};
};
UpdateViewer:
PROC [data: Data, forceOpen:
BOOL ←
FALSE] ~ {
data.requests ← GetPrintRequestList[];
MakeButtons[data];
IF ( (data.autoOpen)
OR (forceOpen) )
THEN {
IF (data.viewer.iconic) THEN ViewerOps.OpenIcon[data.viewer];
};
};
Button Procs
ButtonProc: Buttons.ButtonProc ~ {
data: Data ← NARROW [clientData];
msg: ROPE ← NIL;
request: PrintRequest ← data.actualRequest;
requestStatus: RequestStatus;
TypeScriptWrite[data, "Checking: "];
TypeScriptWrite[data, data.actualRequest.fileName];
TypeScriptWrite[data, "\n"];
requestStatus ← XNSPrintRequestManager.GetPrintRequestStatus[request];
msg ← PrintingAux.ExposeInterpressMasterStatus[requestStatus.status, 1];
TypeScriptWrite[data, "status: ("];
TypeScriptWrite[data, msg];
TypeScriptWrite[data, ") statusMessage: "];
TypeScriptWrite[data, requestStatus.statusMessage];
TypeScriptWrite[data, "\n"];
};
MakeButtons:
PROC [data: Data] ~ {
FOR buttons: ButtonList ← data.buttons, buttons.rest
WHILE (buttons #
NIL)
DO
Buttons.Destroy[buttons.first];
ENDLOOP;
data.buttons ← NIL;
FOR pr: PrintRequestList ← data.requests, pr.rest
WHILE (pr #
NIL)
DO
MakeButton[pr.first, data];
ENDLOOP;
[] ← AdjustProc[data.viewer];
};
MakeButton:
PROC [request: PrintRequest, data: Data] ~ {
buttonName: ROPE ← NIL;
id: ROPE ← NIL;
IF (request = NIL) THEN RETURN;
FOR n:
NAT
IN [0..5)
DO
id ← IO.PutFR["%g %g", IO.rope[id], IO.card[request.requestID[n]]];
ENDLOOP;
buttonName ←
IO.PutFR["%g %g %g",
IO.rope[request.context.printerName], IO.rope[id], IO.rope[request.fileName]];
data.actualRequest ← request;
data.buttons ←
CONS[
Buttons.Create[
info: [parent: data.viewer, name: buttonName],
proc: ButtonProc,
clientData: data
],
data.buttons
];
};
}...