DIRECTORY IO USING [Error], Menus USING [AppendMenuEntry, CreateEntry, CreateMenu, Menu, MenuProc], PrincOpsUtils USING [IsBound], Process USING [Detach], Rope, PutGet USING [FromRope], TextEdit USING [SetLooks], TextLooks USING [Looks, noLooks], TextNode USING [Ref], TiogaFileOps USING [CreateRoot, Ref, SetContents, SetFormat], TiogaOps USING [Ref, FirstChild, LastLocWithin, PutProp], TSExtras USING [PrintSuppliedNodes, PrintTiogaViewer, NodeProc], TSTranslate USING [FontNotFound], ViewerOps USING [AddProp, FetchProp, SetMenu], ViewerTools USING [TiogaContents], UserProfile USING [Boolean], ViewerClasses USING [Viewer], WalnutDefs USING [Error], WalnutOps USING [MsgsInSetEnumeration, GetDisplayProps, GetMsg, MsgExists, SizeOfMsgSet], WalnutPrintOps USING [], WalnutControlInternal USING [workingMenu, ChangeMenu], WalnutWindowInternal USING [walnut, Report, ReportRope]; WalnutPrintImpl: CEDAR MONITOR IMPORTS IO, Menus, PrincOpsUtils, Process, Rope, ViewerOps, UserProfile, PutGet, TextEdit, TiogaFileOps, TiogaOps, TSExtras, TSTranslate, WalnutDefs, WalnutOps, WalnutControlInternal, WalnutWindowInternal EXPORTS WalnutPrintOps = BEGIN OPEN WalnutWindowInternal; ROPE: TYPE = Rope.ROPE; Viewer: TYPE = ViewerClasses.Viewer; blankMenu: PUBLIC Menus.Menu = Menus.CreateMenu[]; printingMenu: Menus.Menu _ Menus.CreateMenu[]; PrintCallReturned: CONDITION; PrintingInfoObject: TYPE = RECORD[done: BOOL, abortRef: REF BOOL, allOK: BOOL _ TRUE]; PrintingInfo: TYPE = REF PrintingInfoObject; lastReportFromPrinter: ROPE _ NIL; MsgSetPrintProc: PUBLIC ENTRY Menus.MenuProc = BEGIN ENABLE UNWIND => NULL; self: Viewer = NARROW[parent]; prevMenu: Menus.Menu _ self.menu; BEGIN ENABLE UNWIND => CONTINUE; aborted: REF BOOL = NEW[BOOL _ FALSE]; printInfo: PrintingInfo; msgSet: ROPE; IF ~TSetterAvailable[] THEN RETURN; msgSet _ NARROW[ViewerOps.FetchProp[self, $WalnutMsgSetName]]; IF ~AnyMessages[msgSet] THEN RETURN; printInfo _ NEW[PrintingInfoObject _ [done: FALSE, abortRef: aborted]]; ViewerOps.AddProp[self, $PrintingInfo, printInfo]; self.inhibitDestroy _ TRUE; TRUSTED {Process.Detach[FORK PrintMSProc[msgSet, printInfo]]}; ViewerOps.SetMenu[self, printingMenu]; UNTIL printInfo.done DO WAIT PrintCallReturned; ENDLOOP; END; ViewerOps.SetMenu[self, prevMenu]; self.inhibitDestroy _ FALSE; END; MsgPrintProc: PUBLIC ENTRY Menus.MenuProc = BEGIN ENABLE UNWIND => NULL; self: Viewer = NARROW[parent]; prevMenu: Menus.Menu _ self.menu; msg: ROPE = NARROW[ViewerOps.FetchProp[self, $WalnutMsgName]]; IF ViewerOps.FetchProp[self, $Frozen] # NIL AND ~WalnutOps.MsgExists[msg] THEN { WalnutWindowInternal.Report[ "Msg ", msg, " in a frozen viewer doesn't exist in this database"]; RETURN }; IF ~TSetterAvailable[] THEN RETURN; BEGIN ENABLE UNWIND => CONTINUE; aborted: REF BOOL = NEW[BOOL _ FALSE]; printInfo: PrintingInfo; printInfo _ NEW[PrintingInfoObject _ [done: FALSE, abortRef: aborted]]; ViewerOps.AddProp[self, $PrintingInfo, printInfo]; self.inhibitDestroy _ TRUE; Report["Printing the msg: ", self.name]; TRUSTED {Process.Detach[FORK PrintViewer[self, printInfo]]}; ViewerOps.SetMenu[self, printingMenu]; UNTIL printInfo.done DO WAIT PrintCallReturned; ENDLOOP; END; ViewerOps.SetMenu[self, prevMenu]; self.inhibitDestroy _ FALSE; END; PrintMsgSet: PUBLIC ENTRY PROC[msgSet: ROPE] RETURNS[allOK: BOOL] = BEGIN ENABLE UNWIND => NULL; printInfo: PrintingInfo; IF ~TSetterAvailable[] THEN RETURN; IF ~AnyMessages[msgSet] THEN RETURN; BEGIN ENABLE UNWIND => CONTINUE; aborted: REF BOOL = NEW[BOOL _ FALSE]; printInfo _ NEW[PrintingInfoObject _ [done: FALSE, abortRef: aborted]]; ViewerOps.AddProp[walnut, $PrintingInfo, printInfo]; walnut.inhibitDestroy _ TRUE; TRUSTED {Process.Detach[FORK PrintMSProc[msgSet, printInfo]]}; WalnutControlInternal.ChangeMenu[printingMenu, TRUE]; UNTIL printInfo.done DO WAIT PrintCallReturned; ENDLOOP; END; walnut.inhibitDestroy _ FALSE; RETURN[printInfo.allOK]; END; PrintMsgList: PUBLIC ENTRY PROC[mList: LIST OF ROPE, msViewer: Viewer] RETURNS[allOK: BOOL] = BEGIN ENABLE UNWIND => NULL; prevMenu: Menus.Menu _ msViewer.menu; printInfo: PrintingInfo; IF ~TSetterAvailable[] THEN RETURN; IF mList = NIL THEN RETURN; BEGIN ENABLE UNWIND => CONTINUE; aborted: REF BOOL = NEW[BOOL _ FALSE]; printInfo _ NEW[PrintingInfoObject _ [done: FALSE, abortRef: aborted]]; ViewerOps.AddProp[msViewer, $PrintingInfo, printInfo]; msViewer.inhibitDestroy _ TRUE; Report["Printing selected msg from ", msViewer.name]; TRUSTED {Process.Detach[FORK PrintML[mList, msViewer.name, printInfo]]}; ViewerOps.SetMenu[msViewer, printingMenu]; UNTIL printInfo.done DO WAIT PrintCallReturned; ENDLOOP; END; ViewerOps.SetMenu[msViewer, prevMenu]; msViewer.inhibitDestroy _ FALSE; RETURN[printInfo.allOK]; END; TSetterAvailable: INTERNAL PROC RETURNS[ok: BOOL] = BEGIN TRUSTED { ok _ PrincOpsUtils.IsBound[LOOPHOLE[TSExtras.PrintTiogaViewer]]}; IF ~ok THEN { Report["You must load TSetter to be able to print; type TSetter to a commandTool"]; Report["Then try the Print again"]; RETURN[FALSE] }; RETURN[TRUE]; END; AnyMessages: PROC[msgSet: ROPE] RETURNS[any: BOOL] = { IF any _ (WalnutOps.SizeOfMsgSet[msgSet].messages # 0) THEN RETURN; Report["Msgset: ", msgSet, " contains no msgs"]; }; PrintViewer: PROC [viewer: Viewer, printInfo: PrintingInfo] = BEGIN ENABLE UNWIND => {SignalPrintDone[printInfo]}; lastReportFromPrinter _ NIL; TRUSTED {TSExtras.PrintTiogaViewer[viewer: viewer, nameForSeparatorPage: viewer.name, aborted: printInfo.abortRef, messageProc: PrintReport ! TSTranslate.FontNotFound => { printInfo.abortRef^ _ TRUE; ReportRope[fontName]; Report[" not found - aborting"]; CONTINUE}]}; SignalPrintDone[printInfo]; END; lotaStars: ROPE = "* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n"; PrintMSProc: PROC [msgSet: ROPE, printInfo: PrintingInfo] = { ENABLE BEGIN WalnutDefs.Error => { Failure[printInfo, explanation]; CONTINUE}; UNWIND => SignalPrintDone[printInfo]; END; msL: LIST OF ROPE; msg: ROPE; firstCall: BOOL _ TRUE; firstMsg: BOOL _ TRUE; newPage, smallHeaders: BOOL; SupplyMsg: TSExtras.NodeProc = { IF firstCall THEN { node _ FirstNode[rootName]; firstCall _ FALSE; RETURN }; IF msL = NIL THEN RETURN[NIL]; ReportProgress[firstMsg]; node _ FormatMsg[msg _ msL.first, firstMsg, newPage, smallHeaders]; msL _ msL.rest; firstMsg _ FALSE; }; rootName: ROPE _ Rope.Concat["Msgset: ", msgSet]; lastReportFromPrinter _ NIL; newPage _ UserProfile.Boolean[key: "Walnut.NewPageEveryMsg", default: FALSE]; smallHeaders _ UserProfile.Boolean[key: "Walnut.PrintSmallHeaders", default: TRUE]; BEGIN ENABLE WalnutDefs.Error, IO.Error, UNWIND => printInfo.abortRef^ _ TRUE; Report["Printing msgs from ", rootName]; msL _ WalnutOps.MsgsInSetEnumeration[msgSet, TRUE].mL; TSExtras.PrintSuppliedNodes[nodeProc: SupplyMsg, nameForSeparatorPage: rootName, aborted: printInfo.abortRef, messageProc: PrintReport ! TSTranslate.FontNotFound => {printInfo.abortRef^ _ TRUE; PrintReport[fontName]; PrintReport[" not found - aborting"]; CONTINUE}]; SignalPrintDone[printInfo]; END; -- for UNWIND }; PrintML: PROC [mL: LIST OF ROPE, name: ROPE, printInfo: PrintingInfo] = { ENABLE BEGIN WalnutDefs.Error => { Failure[printInfo, explanation]; CONTINUE}; UNWIND => SignalPrintDone[printInfo]; END; msg: ROPE; firstMsg: BOOL _ TRUE; firstCall: BOOL _ TRUE; newPage, smallHeaders: BOOL; SupplyMsg: TSExtras.NodeProc = { IF firstCall THEN { node _ FirstNode[name]; firstCall _ FALSE; RETURN }; IF mL = NIL THEN RETURN[NIL]; msg _ mL.first; mL _ mL.rest; ReportProgress[firstMsg]; node _ FormatMsg[msg, firstMsg, newPage, smallHeaders]; firstMsg _ FALSE; }; lastReportFromPrinter _ NIL; newPage _ UserProfile.Boolean[key: "Walnut.NewPageEveryMsg", default: FALSE]; smallHeaders _ UserProfile.Boolean[key: "Walnut.PrintSmallHeaders", default: TRUE]; BEGIN ENABLE WalnutDefs.Error, IO.Error => {printInfo.abortRef^ _ TRUE}; TRUSTED { TSExtras.PrintSuppliedNodes[nodeProc: SupplyMsg, nameForSeparatorPage: name, aborted: printInfo.abortRef, messageProc: PrintReport ! TSTranslate.FontNotFound => {printInfo.abortRef^ _ TRUE; PrintReport[fontName]; PrintReport[" not found - aborting"]; CONTINUE}] }; SignalPrintDone[printInfo]; END; }; ReportProgress: PROC[first: BOOL] = { IF first THEN ReportRope["\n."] ELSE ReportRope["."] }; PrintReport: PROC[r: ROPE] = BEGIN IF r = lastReportFromPrinter THEN RETURN; ReportRope[lastReportFromPrinter _ r]; ReportRope["\n"]; END; SignalPrintDone: ENTRY PROC[printInfo: PrintingInfo] = BEGIN printInfo.done _ TRUE; BROADCAST PrintCallReturned; END; Failure: ENTRY PROC[printInfo: PrintingInfo, who: ROPE] = BEGIN Report[who, "; printing NOT done"]; printInfo.done _ TRUE; printInfo.allOK _ FALSE; BROADCAST PrintCallReturned; END; AbortPrintProc: PUBLIC ENTRY Menus.MenuProc = BEGIN ENABLE UNWIND => NULL; self: Viewer _ NARROW[parent]; printInfo: PrintingInfo _ NARROW[ViewerOps.FetchProp[self, $PrintingInfo]]; IF printInfo = NIL THEN RETURN; -- perhaps an error?? IF printInfo.done THEN RETURN; -- too late?? printInfo.abortRef^ _ TRUE; IF self = walnut THEN WalnutControlInternal.ChangeMenu[WalnutControlInternal.workingMenu, FALSE] ELSE ViewerOps.SetMenu[self, blankMenu]; END; FirstNode: PROC[rootName: ROPE] RETURNS[node: TextNode.Ref] = BEGIN root: TiogaFileOps.Ref _ TiogaFileOps.CreateRoot[]; mark: ROPE = "outsideFooter"; -- kludge prefix: ROPE = "(cedar) style (firstHeadersAfterPage) (0) .cvx .def"; -- magic TRUSTED { TiogaOps.PutProp[LOOPHOLE[root], $Mark, mark]; TiogaOps.PutProp[LOOPHOLE[root], $Prefix, prefix]; }; TiogaFileOps.SetContents[root, rootName]; TRUSTED {node _ LOOPHOLE[root, TextNode.Ref]}; END; FormatMsg: PROC[msg: ROPE, firstMsg, newPage, smallHeaders: BOOL] RETURNS[node: TextNode.Ref] = { contents: ViewerTools.TiogaContents _ WalnutOps.GetMsg[msg].contents; endHeadersPos: INT _ Rope.Find[contents.contents, "\n\n"]; tocAndSubject: ROPE _ WalnutOps.GetDisplayProps[msg].TOCentry; node _ PutGet.FromRope[Rope.Concat[contents.contents, contents.formatting]]; IF smallHeaders THEN IF endHeadersPos > 0 THEN { lastLoc: INT; first: TiogaOps.Ref; TRUSTED {first _ TiogaOps.FirstChild[LOOPHOLE[node]]}; lastLoc _ TiogaOps.LastLocWithin[first].where; IF lastLoc > endHeadersPos THEN -- no formatting already { looks: TextLooks.Looks _ TextLooks.noLooks; looks['s] _ TRUE; looks['p] _ TRUE; TRUSTED {TextEdit.SetLooks[LOOPHOLE[node], LOOPHOLE[first], looks, 0, endHeadersPos+1]}; }; }; IF tocAndSubject.Length[] > 75 THEN tocAndSubject _ Rope.Concat[tocAndSubject.Substr[0, 70], " . . ."]; IF ~newPage THEN tocAndSubject _ Rope.Concat[lotaStars, tocAndSubject]; IF ~firstMsg THEN tocAndSubject _ Rope.Concat["\n\n", tocAndSubject]; TRUSTED { TiogaFileOps.SetContents[LOOPHOLE[node], tocAndSubject]; TiogaFileOps.SetFormat[LOOPHOLE[node], IF newPage THEN "head" ELSE "head2"] }; }; Menus.AppendMenuEntry[printingMenu, Menus.CreateEntry["AbortPrint", AbortPrintProc]]; END. .WalnutPrintImpl.mesa Copyright c 1985 by Xerox Corporation. All rights reserved. Willie-Sue, November 7, 1985 12:29:04 pm PST Contents: Implementation of printing of Msgs, MsgSets, MsgSetTOC's (someday) Status: mostly here functionally, but not yet completed. Created by: Willie-Sue, June 29, 1983 Last edit by: Willie-Sue on: December 27, 1984 2:45:23 pm PST * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * prints msgset, using the msgset viewer Report["Printing selected msgs from ", msViewer.name]; prints msg displayed in viewer prints msgset * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * start code need an immediate menu button here, can't wait on walnutQueue Κ˜šΟn™Icodešœ Οmœ1™˜@J˜@J˜Jšœ+˜+—šŸ˜J˜J˜——JšŸœŸœ˜ J˜JšŸœŸœŸœ˜JšœŸœ˜$J˜Jšœ Ÿœ!˜2J˜.J˜JšœM™MJšœŸ œ˜JšœŸœŸœŸœ ŸœŸœ ŸœŸœ˜VJšœŸœŸœ˜,JšœŸœŸœ˜"J˜Jšœ&™&šœŸœŸœ˜.šŸœŸœŸœŸœ˜JšœŸœ ˜J˜!J˜šŸœŸœŸœŸœ˜ Jš œ ŸœŸœŸœŸœŸœ˜&J˜JšœŸœ˜ JšŸœŸœŸœ˜#Jšœ Ÿœ/˜>JšŸœŸœŸœ˜$J˜Jšœ ŸœŸœ˜GJ˜2JšœŸœ˜JšŸœŸœ"˜>J˜&JšŸœŸœŸœŸœ˜8—JšŸœ˜J˜J˜"JšœŸœ˜—JšŸœ˜J˜—š œŸœŸœ˜+šŸœŸœŸœŸœ˜JšœŸœ ˜J˜!JšœŸœŸœ,˜>šŸœ&ŸœŸœŸœ˜P˜J˜C—JšŸ˜J˜—J˜JšŸœŸœŸœ˜#J˜šŸœŸœŸœŸœ˜ Jš œ ŸœŸœŸœŸœŸœ˜&J˜Jšœ ŸœŸœ˜GJ˜2JšœŸœ˜J˜(JšŸœŸœ ˜Jšœ/Ÿœ˜5JšŸœŸœŸœŸœ˜8—JšŸœ˜J˜JšœŸœ˜JšŸœ˜JšŸœ˜J˜—š œŸœŸœŸœŸœŸœŸœ˜FJšŸœŸœ˜šŸœŸœŸœŸœ˜J˜%J˜JšŸœŸœŸœ˜#JšŸœ ŸœŸœŸœ˜J˜šŸœŸœŸœŸœ˜ Jš œ ŸœŸœŸœŸœŸœ˜&Jšœ ŸœŸœ˜GJ˜6JšœŸœ˜—šœ6™6J˜5JšŸœŸœ,˜HJ˜*JšŸœŸœŸœŸœ˜8JšŸœ˜J˜J˜&JšœŸœ˜ JšŸœ˜J˜——šŸœ˜J˜——š œŸœŸœŸœŸœ˜3šŸ˜JšŸœŸœ˜KšŸœŸœ˜ JšœS˜SJšœ#˜#JšŸœŸœ˜ Jšœ˜—JšŸœŸœ˜ —JšŸœ˜—J˜š  œŸœ ŸœŸœŸœ˜6JšŸœ5ŸœŸœ˜CJšœ0˜0Jšœ˜J˜—Jšœ™J˜š œŸœ,˜=šŸœŸœŸœ!˜4JšœŸœ˜šŸœO˜V˜7˜šœŸœ˜3Jšœ!Ÿœ˜-J˜———J˜——JšŸœ˜J˜—Jšœ ™ J˜Jšœ ŸœC˜RJ˜š œŸœ Ÿœ˜=šŸ ˜ Jšœ7Ÿœ˜AJšŸœ˜%JšŸœ˜—JšœŸœŸœŸœ˜JšœŸœ˜ Jšœ ŸœŸœ˜Jšœ ŸœŸœ˜JšœŸœ˜š œ˜ šŸœ Ÿ˜˜Jšœ Ÿœ˜JšŸ˜—J˜—J˜Jš ŸœŸœŸœŸœŸœ˜J˜J˜CJ˜Jšœ Ÿœ˜Jšœ˜—J˜Jšœ Ÿœ#˜1JšœŸœ˜JšœFŸœ˜MJšœMŸœ˜SJ˜šŸœŸ˜ JšœŸœŸœŸœ˜AJ˜J˜(Jšœ-Ÿœ˜7J˜J˜0J˜J˜˜6šœŸœ˜3Jšœ&Ÿœ˜1—J˜—J˜—JšŸœΟc ˜Jšœ˜J˜—š œŸœŸœŸœŸœŸœ˜IšŸ ˜ Jšœ7Ÿœ˜AJšŸœ˜%JšŸœ˜JšœŸœ˜ Jšœ ŸœŸœ˜Jšœ ŸœŸœ˜JšœŸœ˜š œ˜ šŸœ Ÿ˜˜Jšœ Ÿœ˜JšŸ˜—J˜—Jš ŸœŸœŸœŸœŸœ˜J˜J˜ J˜J˜7Jšœ Ÿœ˜Jšœ˜—J˜JšœŸœ˜JšœFŸœ˜MšœMŸœ˜SJ˜—šŸœŸœŸœ!Ÿœ˜HšŸ˜˜2J˜J˜˜6šœŸœ˜3Jšœ&Ÿœ˜0———šœ˜J˜——J˜—JšŸœ˜—Jšœ˜J˜—šœŸœŸœ˜#JšœŸœŸœŸœ˜9J˜—š œŸœŸœ˜šŸ˜JšŸœŸœŸœ˜)J˜&J˜—JšŸœ˜J˜—šœŸœŸœ˜6šŸ˜JšœŸœ˜JšŸ œ˜—JšŸœ˜J˜—šœŸœŸœŸœ˜9šŸ˜J˜#JšœŸœ˜JšœŸœ˜JšŸ œ˜—JšŸœ˜J˜—šœŸœŸœ˜-šŸœŸœŸœŸœ˜JšœŸœ ˜JšœŸœ+˜KJš Ÿœ ŸœŸœŸœ ˜6JšŸœŸœŸœ  ˜.JšœŸœ˜šŸœŸ˜šœDŸœ˜JJšŸœ$˜(———JšŸœ˜J˜—JšœM™MJ˜š œŸœ ŸœŸœ˜=šŸ˜J˜3JšœŸœ  ˜(JšœŸœ;  ˜PšŸ˜šœŸœ˜0JšœŸœ˜2J˜——J˜)JšŸœ Ÿœ˜.—JšŸœ˜J˜—š œŸœŸœ#Ÿœ˜AšŸœ˜J˜EJšœŸœ(˜:JšœŸœ+˜>J˜LšŸœŸœŸœŸ˜.šœ Ÿœ˜J˜JšŸœŸœ ˜6J˜.šŸœŸœ ˜9˜-Jšœ Ÿœ˜Jšœ Ÿœ˜šŸœŸœ˜*JšŸœ%˜-—J˜———J˜—šŸœŸ˜#J˜C—JšŸœ Ÿœ7˜GJšŸœ Ÿœ4˜EšŸ˜šœŸœ˜:Jš œŸœŸœ ŸœŸœ ˜K—J˜——Jšœ˜J˜—JšœM™MJ˜Jšœ ™ Jšœ=™=J˜UJ˜JšŸœ˜J˜J˜—…—*¬;ο