DIRECTORY Buttons, CedarProcess, Commander, Imager, ImagerBackdoor, IO, PrintManip, TypeScript, UserProfile, ViewerClasses, ViewerIO, ViewerOps; PrintManipImpl: CEDAR MONITOR IMPORTS Buttons, CedarProcess, Commander, Imager, ImagerBackdoor, IO, TypeScript, UserProfile, ViewerIO, ViewerOps EXPORTS PrintManip ~ BEGIN OPEN PrintManip; AutoOpen: ROPE ~ "HardcopyWatcher.AutoOpen"; pendingPrintRequests: PrintRequestList _ NIL; printManipViewerClass: ViewerClasses.ViewerClass; watcher: Data _ NIL; Viewer: TYPE ~ ViewerClasses.Viewer; ButtonList: TYPE ~ LIST OF Viewer; Data: TYPE ~ REF DataRec; DataRec: TYPE ~ RECORD [ viewer: Viewer _ NIL, buttons: ButtonList _ NIL, typeScript: Viewer _ NIL, typeScriptIn: STREAM _ NIL, typeScriptOut: STREAM _ NIL, autoOpen: BOOL _ FALSE, printRequests: PrintRequestList _ NIL ]; ClearWatcher: ENTRY PROC ~ { watcher _ NIL; }; ConditionallySetWatcher: ENTRY PROC [new: Data] RETURNS [old: Data] ~ { old _ watcher; IF watcher = NIL THEN watcher _ new; }; PrintManipCmd: 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: $PrintManip, info: [name: "Print Request Manipulation", data: data]]; data.typeScript _ TypeScript.Create[[parent: data.viewer, border: TRUE, wh: 60]]; [data.typeScriptIn, data.typeScriptOut] _ ViewerIO.CreateViewerStreams[NIL, data.typeScript, "///Temp/PrintManip.TypeScript"]; TypeScriptWrite[data, "hi there teddy bear\n"]; TypeScriptWrite[data, "hi there teddy bare\n"]; UpdateViewer[data]; }; ButtonProc: Buttons.ButtonProc ~ { data: Data _ NARROW[clientData]; TypeScriptWrite[data, "button pusher!\n"]; }; MakeButtons: PROC [data: Data] ~ { nButtons: NAT _ 0; height: INTEGER _ data.viewer.wh-12; dummy: PrintRequest _ NEW[PrintRequestObject]; dummy.fileName _ "File Name"; dummy.service _ "Print Service"; FOR buttons: ButtonList _ data.buttons, buttons.rest WHILE buttons # NIL DO Buttons.Destroy[buttons.first]; ENDLOOP; data.buttons _ NIL; FOR n: NAT IN [0..5) DO nButtons _ nButtons+1; MakeButton[dummy, data, height-20*nButtons]; ENDLOOP; FOR pr: PrintRequestList _ data.printRequests, pr.rest WHILE pr # NIL DO nButtons _ nButtons+1; MakeButton[pr.first, data, height-20*nButtons]; ENDLOOP; }; MakeButton: PROC [printRequest: PrintRequest, data: Data, y: INTEGER] ~ { buttonName, id: ROPE _ NIL; IF printRequest = NIL THEN RETURN; FOR n: NAT IN [0..5) DO id _ IO.PutFR["%g %g", IO.rope[id], IO.card[printRequest.requestID[n]]]; ENDLOOP; buttonName _ IO.PutFR["%g %g %g", IO.rope[printRequest.service], IO.rope[id], IO.rope[printRequest.fileName]]; data.buttons _ CONS[ Buttons.Create[ info: [parent: data.viewer, name: buttonName, wx: 0, wy: y], proc: ButtonProc, clientData: data ], data.buttons ]; }; 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.printRequests _ GetPrintRequestList[]; MakeButtons[data]; IF data.autoOpen OR forceOpen THEN { IF data.viewer.iconic THEN ViewerOps.OpenIcon[data.viewer]; }; }; WaitTilListChanged: ENTRY PROC ~ {WAIT ListChanged}; WatchRequestList: CedarProcess.ForkableProc ~ { enum: ViewerOps.EnumProc ~ { IF v.class = printManipViewerClass THEN UpdateViewer[NARROW[v.data]]; }; DO WaitTilListChanged[]; ViewerOps.EnumerateViewers[enum]; ENDLOOP; }; ListChanged: PUBLIC CONDITION; RegisterRequestID: PUBLIC PROC [requestID: RequestID] ~ { }; UnRegisterRequestID: PUBLIC PROC [requestID: RequestID] ~ { }; GetPrintRequestList: PUBLIC PROC RETURNS [list: PrintRequestList] ~ { list _ NIL; }; printManipViewerClass _ NEW[ViewerClasses.ViewerClassRec _ [ paint: PaintProc, adjust: AdjustProc, destroy: DestroyProc ]]; ViewerOps.RegisterViewerClass[$PrintManip, printManipViewerClass]; Commander.Register["///Commands/PrintManip", PrintManipCmd, "Manipulate Print Requests"]; [] _ CedarProcess.Fork[WatchRequestList]; END. ξPrintManipImpl.mesa Copyright c 1985 by Xerox Corporation. All rights reserved. BJackson, October 29, 1986 10:03:36 pm PST Bloomenthal, October 29, 1986 10:03:43 pm PST Globals Type Declarations Procedures List Manager Start Code Κ s˜™Jšœ Οmœ1™