DIRECTORY CDRopeViewer, Menus, ViewerOps, ViewerClasses, ViewerTools, Rope; CDRopeViewerImpl: CEDAR MONITOR IMPORTS ViewerOps, ViewerTools, Menus EXPORTS CDRopeViewer = BEGIN SaveProc: TYPE = CDRopeViewer.SaveProc; MyData: TYPE = RECORD [ tiogaContents: ViewerTools.TiogaContents _ NIL, init: BOOL _ FALSE, finished: BOOL _ FALSE, --monitored save: SaveProc _ NIL, clientData: REF _ NIL, skipSaveOnDiscard: BOOL _ TRUE, saved: CONDITION ]; ResetButton: Menus.ClickProc = { data: REF MyData ~ NARROW[clientData]; viewer: ViewerClasses.Viewer ~ NARROW[parent]; IF ShouldSkip[data, FALSE] THEN RETURN; -- ignore additional clicks ViewerTools.SetTiogaContents[viewer, data.tiogaContents]; ViewerOps.PaintViewer[viewer, $menu]; }; ClearButton: Menus.ClickProc = { data: REF MyData ~ NARROW[clientData]; viewer: ViewerClasses.Viewer ~ NARROW[parent]; IF ShouldSkip[data, FALSE] THEN RETURN; -- ignore additional clicks ViewerTools.SetTiogaContents[viewer, NEW[ViewerTools.TiogaContentsRec]]; ViewerOps.PaintViewer[viewer, $menu]; }; Destroy: PROC [viewer: ViewerClasses.Viewer] = { first: ViewerClasses.Viewer _ viewer; WHILE viewer#NIL DO next: ViewerClasses.Viewer _ viewer.link; ViewerOps.DestroyViewer[viewer]; IF next=first OR next=NIL THEN EXIT; viewer _ next; ENDLOOP }; SaveButton: Menus.ClickProc = { data: REF MyData ~ NARROW[clientData]; viewer: ViewerClasses.Viewer ~ NARROW[parent]; IF ShouldSkip[data, TRUE] THEN RETURN; -- ignore additional clicks data.tiogaContents _ ViewerTools.GetTiogaContents[viewer]; data.save[data.tiogaContents.contents, data.tiogaContents.formatting, data.clientData, FALSE]; NotifyFinished[data]; Destroy[viewer]; }; DetachButton: Menus.ClickProc = { data: REF MyData ~ NARROW[clientData]; viewer: ViewerClasses.Viewer ~ NARROW[parent]; newViewer: ViewerClasses.Viewer; tiogaContents: ViewerTools.TiogaContents; IF ShouldSkip[data, FALSE] THEN RETURN; -- ignore additional clicks tiogaContents _ ViewerTools.GetTiogaContents[viewer]; newViewer _ ViewerTools.MakeNewTextViewer[[name: "[Detached comment]"]]; ViewerTools.SetTiogaContents[newViewer, tiogaContents]; }; DiscardButton: Menus.ClickProc = { data: REF MyData ~ NARROW[clientData]; IF ShouldSkip[data, TRUE] THEN RETURN; IF ~data.skipSaveOnDiscard THEN { data.save[data.tiogaContents.contents, data.tiogaContents.formatting, data.clientData, TRUE] }; NotifyFinished[data]; Destroy[NARROW[parent]]; }; ShouldSkip: ENTRY PROC [data: REF MyData, finish: BOOL_FALSE] RETURNS [skip: BOOL] = { ENABLE UNWIND => NULL; skip _ data.finished OR ~data.init; IF finish THEN data.finished _ data.init; }; NotifyFinished: ENTRY PROC [data: REF MyData] = { ENABLE UNWIND => NULL; NOTIFY data.saved; }; WaitUntilDone: ENTRY PROC[myData: REF MyData] = { ENABLE UNWIND => NULL; WHILE ~myData.finished DO WAIT myData.saved; ENDLOOP; }; Edit: PUBLIC PROC [contents, caption, formatting: Rope.ROPE_NIL, save: SaveProc_NIL, clientData: REF_NIL, fork: BOOL_TRUE, saveOnDiscard: BOOL_FALSE] = { MakeMenu: PROC [data: REF MyData, needDiscard: BOOL, previous: Menus.Menu] RETURNS [menu: Menus.Menu] = { RemoveEntry: PROC [key: Rope.ROPE] = { entry: Menus.MenuEntry = Menus.FindEntry[menu, key]; IF entry#NIL THEN Menus.ReplaceMenuEntry[menu, entry, NIL]; }; AddEntry: PROC [key: Rope.ROPE, proc: Menus.ClickProc, guarded: BOOL _ FALSE] ~ { Menus.InsertMenuEntry[menu, Menus.CreateEntry[name: key, proc: proc, clientData: data, documentation: NIL, fork: TRUE, guarded: guarded]]; }; menu _ IF previous#NIL THEN Menus.CopyMenu[previous] ELSE Menus.CreateMenu[]; RemoveEntry["Get"]; RemoveEntry["GetImpl"]; RemoveEntry["Store"]; RemoveEntry["Clear"]; RemoveEntry["Reset"]; RemoveEntry["Save"]; RemoveEntry["PrevFile"]; IF needDiscard AND save#NIL THEN AddEntry["Discard", DiscardButton, TRUE]; IF save#NIL THEN AddEntry["Save", SaveButton]; AddEntry["Detach", DetachButton]; AddEntry["Reset", ResetButton, TRUE]; AddEntry["Clear", ClearButton, TRUE]; }; viewer: ViewerClasses.Viewer; myData: REF MyData _ NEW[MyData _ [ tiogaContents: NEW[ViewerTools.TiogaContentsRec _ [contents: contents, formatting: formatting]], init: FALSE, finished: FALSE, save: save, clientData: clientData ]]; viewer _ ViewerTools.MakeNewTextViewer[[ iconic: FALSE, name: caption, inhibitDestroy: saveOnDiscard ]]; ViewerOps.SetMenu[viewer, MakeMenu[myData, saveOnDiscard, viewer.menu]]; ViewerTools.SetTiogaContents[viewer, myData.tiogaContents]; ViewerTools.SetSelection[viewer, NEW[ViewerTools.SelPosRec]]; IF save=NIL THEN ViewerTools.InhibitUserEdits[viewer]; ViewerOps.PaintViewer[viewer, $menu]; myData.init _ TRUE; IF ~fork THEN WaitUntilDone[myData]; }; END. CDRopeViewerImpl.mesa Copyright c 1984, 1985 by Xerox Corporation. All rights reserved. Similar to an module of: Bob Mayo Created by: Christian Jacobi, November 20, 1984 11:31:53 am PST Last Edited by: Christian Jacobi, September 19, 1985 8:38:37 pm PDT Jean-Marc Frailong December 3, 1987 6:22:56 pm PST --PROC[contents, formatting: Rope.ROPE, clientData: REF, discard: BOOL] --Destroys all the linked viewers If save is NIL, the viewer is made ReadOnly and the Save/Discard buttons are not defined. Κˆ˜code– "Cedar" stylešœ™Kšœ Οmœ7™BK™!K™?K™CK™2K˜—šΟk ˜ Kšœ˜Kšœ˜Kšœ ˜ Kšœ˜Kšœ ˜ Kšœ˜—K˜šΟnœžœžœ˜#Kšžœ˜&Kšžœ˜—Kšž˜K˜šœ žœ˜'KšΟcG™G—K˜šœžœžœ˜Kšœ+žœ˜/Kšœžœžœ˜Kšœ žœžœ  ˜#Kšœžœ˜Kšœ žœžœ˜Kšœžœžœ˜Kšœž ˜K˜K˜—šŸ œ˜ Kšœžœ žœ ˜&Kšœžœ ˜.Kš žœžœžœžœ ˜DKšœ9˜9Kšœ%˜%Kšœ˜K˜—šŸ œ˜ Kšœžœ žœ ˜&Kšœžœ ˜.Kš žœžœžœžœ ˜DKšœ%žœ ˜HKšœ%˜%Kšœ˜K˜—šŸœžœ#˜0Kš !™!Kšœ%˜%šžœžœž˜Kšœ)˜)Kšœ ˜ Kš žœ žœžœžœž˜$Kšœ˜Kšž˜—K˜—K˜šŸ œ˜Kšœžœ žœ ˜&Kšœžœ ˜.Kš žœžœžœžœ ˜CKšœ:˜:KšœWžœ˜^Kšœ˜Kšœ˜Kšœ˜K˜—šŸ œ˜!Kšœžœ žœ ˜&Kšœžœ ˜.Kšœ ˜ Kšœ)˜)Kš žœžœžœžœ ˜DKšœ5˜5KšœH˜HKšœ7˜7Kšœ˜K˜—šŸ œ˜"Kšœžœ žœ ˜&Kšžœžœžœžœ˜&šžœžœ˜!KšœWžœ˜\Kšœ˜—Kšœ˜Kšœžœ ˜Kšœ˜K˜—šŸ œžœžœžœžœžœžœžœ˜VKšžœžœžœ˜Kšœžœ ˜#Kšžœžœ˜)Kšœ˜—K˜šŸœžœžœžœ ˜1Kšžœžœžœ˜Kšžœ ˜Kšœ˜—K˜šŸ œžœžœ žœ ˜1Kšžœžœžœ˜šžœž˜Kšžœ˜Kšžœ˜—Kšœ˜—K˜šŸœžœžœ&žœžœžœžœžœžœžœžœžœ˜™KšœY™Yš Ÿœžœžœžœžœ˜išŸ œžœ žœ˜&Kšœ4˜4Kšžœžœžœ%žœ˜;K˜—š Ÿœžœ žœ"žœžœ˜QKšœfžœžœ˜ŠK˜—Kš œžœ žœžœžœ˜MKšœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kš žœ žœžœžœ$žœ˜JKšžœžœžœ˜.Kšœ!˜!Kšœžœ˜%Kšœžœ˜%Kšœ˜K˜—Kšœ˜šœžœ žœ ˜#KšœžœN˜`Kšœžœ˜ Kšœ žœ˜Kšœ ˜ Kšœ˜Kšœ˜—šœ(˜(Kšœžœ˜Kšœ˜Kšœ˜Kšœ˜—KšœH˜HKšœ;˜;Kšœ!žœ˜=Kšžœžœžœ&˜6Kšœ%˜%Kšœžœ˜Kšžœžœ˜$Kšœ˜—K™Kšžœ˜—…—$¬