<> <> <> <> DIRECTORY TerminalIO, TiogaRopeEditor, TiogaOps, ViewerOps, ViewerClasses, Rope; TiogaRopeEditorImpl: CEDAR PROGRAM IMPORTS TerminalIO, TiogaOps, ViewerOps, Rope EXPORTS TiogaRopeEditor = BEGIN OurAtom: ATOM = $RopeEdit; TiogaInitProc: ViewerClasses.InitProc; <<-- create a viewer onto a rope, let the guy edit it, and return the new rope>> Edit: PUBLIC PROC [old, caption, comment: Rope.ROPE _ NIL] RETURNS [Rope.ROPE] = BEGIN viewerInfo: ViewerClasses.ViewerRec; viewer: ViewerClasses.Viewer; viewerInfo.iconic _ FALSE; viewerInfo.name _ caption; viewerInfo.inhibitDestroy _ TRUE; viewer _ ViewerOps.CreateViewer[OurAtom, viewerInfo]; TiogaOps.SelectDocument[viewer]; TiogaOps.PutProp[TiogaOps.GetCaret[].node, $Comment, NEW[BOOL _ TRUE]]; TiogaOps.InsertRope[comment]; TiogaOps.Break[]; TiogaOps.PutProp[TiogaOps.GetCaret[].node, $Comment, NEW[BOOL _ FALSE]]; TiogaOps.InsertRope[old]; RETURN[old]; END; <> <> <> <> <> <> <<>> OurSaveProc: ViewerClasses.SaveProc -- PROC [self: Viewer, force: BOOL _ FALSE] -- = BEGIN newRope: Rope.ROPE _ NIL; node: TiogaOps.Ref; TiogaOps.SelectDocument[self]; node _ TiogaOps.SelectionRoot[]; TerminalIO.WriteRope["Contents were:\n"]; DO IF ~TiogaOps.IsComment[node] THEN { r: Rope.ROPE _ TiogaOps.GetRope[node]; IF r # NIL THEN newRope _ Rope.Cat[newRope, r, "\n"]; }; node _ TiogaOps.StepForward[node]; IF node = NIL THEN EXIT; ENDLOOP; TerminalIO.WriteRope[newRope]; TerminalIO.WriteRope["-------------\n"]; ViewerOps.DestroyViewer[self]; END; Init: PROC [] = BEGIN ourClass: ViewerClasses.ViewerClass _ NEW[ViewerClasses.ViewerClassRec]; ourClass^ _ ViewerOps.FetchViewerClass[$Text]^; ourClass.save _ OurSaveProc; TiogaInitProc _ ourClass.init; <> ViewerOps.RegisterViewerClass[OurAtom, ourClass]; END; Init[]; END.