DIRECTORY RopeViewer, TiogaOps, Menus, ViewerOps, ViewerClasses, ViewerTools, Rope; RopeViewerImpl: CEDAR MONITOR IMPORTS TiogaOps, ViewerOps, ViewerTools, Menus, Rope EXPORTS RopeViewer = BEGIN ourData: TYPE = RECORD [ origContents, newContents: Rope.ROPE _ NIL, origTioga: ViewerTools.TiogaContents _ NIL, beenSaved: BOOL _ FALSE, saved: CONDITION ]; SetMenu: PROC [viewer: ViewerClasses.Viewer, data: REF ourData] ~ BEGIN menu: Menus.Menu; menu _ Menus.CreateMenu[]; Menus.AppendMenuEntry[menu, Menus.CreateEntry[name: "Reset", proc: ResetProc, clientData: data, fork: FALSE, guarded: TRUE]]; Menus.AppendMenuEntry[menu, Menus.CreateEntry[name: "Save", proc: SaveProc, clientData: data, fork: FALSE]]; ViewerOps.SetMenu[viewer, menu]; END; ResetProc: Menus.ClickProc ~ BEGIN data: REF ourData ~ NARROW[clientData]; viewer: ViewerClasses.Viewer ~ NARROW[parent]; IF data.origTioga = NIL THEN { TiogaOps.SelectDocument[viewer]; TiogaOps.Delete[]; TiogaOps.ClearLooks[]; FOR i: INT IN [0..Rope.Length[data.origContents]) DO ch: CHAR _ Rope.Fetch[data.origContents, i]; IF ch = '\n THEN TiogaOps.Break[] ELSE TiogaOps.InsertChar[ch]; ENDLOOP; TiogaOps.Jump[viewer, [TiogaOps.ViewerDoc[viewer], 0]]; data.origTioga _ ViewerTools.GetTiogaContents[viewer]; }; ViewerTools.SetTiogaContents[viewer, data.origTioga]; ViewerOps.PaintViewer[viewer, $menu]; -- to sidestep a Tioga or ViewerTools bug END; SaveProc: ENTRY Menus.ClickProc ~ BEGIN data: REF ourData ~ NARROW[clientData]; viewer: ViewerClasses.Viewer ~ NARROW[parent]; IF data.beenSaved THEN RETURN; -- ignore additional clicks data.newContents _ ViewerTools.GetContents[viewer]; data.beenSaved _ TRUE; NOTIFY data.saved; END; Edit: PUBLIC ENTRY PROC [contents, caption: Rope.ROPE] RETURNS [Rope.ROPE] = BEGIN data: REF ourData _ NEW[ourData]; viewerInfo: ViewerClasses.ViewerRec; viewer: ViewerClasses.Viewer; data.origContents _ contents; viewerInfo.iconic _ FALSE; viewerInfo.name _ caption; viewerInfo.inhibitDestroy _ TRUE; viewer _ ViewerTools.MakeNewTextViewer[viewerInfo]; SetMenu[viewer, data]; ResetProc[viewer, data]; WAIT data.saved; ViewerOps.DestroyViewer[viewer]; RETURN[data.newContents]; END; END. File: RopeViewerImpl.mesa Copyright c 1984 by Xerox Corporation. All rights reserved. Created by: Bob Mayo, August 5, 1984 8:21:38 pm PDT Last Edited by: Mayo, August 13, 1984 4:52:00 pm PDT -- create a viewer onto a rope, let the guy edit it, and return the new rope Κυ˜– "Cedar" stylešœ™Jšœ Οmœ1™