DIRECTORY Stretch, Atom USING [GetPName], CDSequencer USING [Command, ImplementCommand], Rope USING [Cat, ROPE], CDDirectory USING [Include], CDInline USING [SubPoints], CDOps USING [DelayedRedraw], CDObjectProcs USING [RegisterFurther, FetchFurther], TerminalIO USING [WriteRope], CD USING [Design, Position, ObPtr, ObjectProcs]; StretchImpl: CEDAR PROGRAM IMPORTS Atom, Rope, CDDirectory, CDObjectProcs, CDInline, TerminalIO, CDSequencer, CDOps EXPORTS Stretch = BEGIN OPEN Stretch; DoStretch: PUBLIC PROC [obj: CD.ObPtr, place: INT, dir: Direction, amount: INT] RETURNS [CD.ObPtr, Rope.ROPE] = { proc: REF StretchProc _ NARROW[CDObjectProcs.FetchFurther[obj.p, $StretchProc]]; ob: CD.ObPtr; msg: Rope.ROPE; IF amount = 0 THEN RETURN[obj, NIL]; IF proc = NIL THEN RETURN[NIL, Rope.Cat["Don't know how to stretch objects of type '", Atom.GetPName[obj.p.objectType], "'."]]; [ob, msg] _ proc[obj, place, dir, amount]; RETURN[ob, msg]; }; StretchArea: PROC [comm: CDSequencer.Command] = BEGIN oldObj: CD.ObPtr _ comm.design.actual.first.dummyCell.ob; obj: CD.ObPtr; dist: CD.Position; xPlace, yPlace: INT; msg: Rope.ROPE; obj _ oldObj; dist _ CDInline.SubPoints[comm.pos, comm.sPos]; IF dist.x < 0 THEN xPlace _ comm.pos.x ELSE xPlace _ comm.sPos.x; IF dist.y < 0 THEN yPlace _ comm.pos.y ELSE yPlace _ comm.sPos.y; [obj, msg] _ DoStretch[obj, xPlace, $right, dist.x]; IF obj = NIL THEN { TerminalIO.WriteRope[msg]; TerminalIO.WriteRope[" Stretch not done."]; TerminalIO.WriteRope["\n"]; RETURN; }; [obj, msg] _ DoStretch[obj, yPlace, $up, dist.y]; IF obj = NIL THEN { TerminalIO.WriteRope[msg]; TerminalIO.WriteRope[" Stretch not done."]; TerminalIO.WriteRope["\n"]; RETURN; }; IF obj = oldObj THEN RETURN; IF ~CDDirectory.Include[comm.design, obj] THEN { TerminalIO.WriteRope["Error: Could not include new object into the design.\n"]; RETURN; }; comm.design.actual.first.dummyCell.ob _ obj; comm.design.actual.first.specific _ NARROW[obj.specificRef]; CDOps.DelayedRedraw[design: comm.design, eraseFirst: TRUE]; TerminalIO.WriteRope["Stretch Done.\n"]; END; Init: PROC[] = BEGIN nilProc: REF StretchProc _ NIL; CDObjectProcs.RegisterFurther[$StretchProc, NIL, nilProc]; CDSequencer.ImplementCommand[$StretchArea, StretchArea]; END; Init[]; END. πFile: StretchImpl.mesa Copyright c 1984 by Xerox Corporation. All rights reserved. Created by: Mayo, June 26, 1984 12:12:25 pm PDT Last Edited by: Mayo, August 6, 1984 5:35:29 pm PDT -- Top-level command routines -- Main body Κ4˜– "Cedar" stylešœ™Jšœ Οmœ1™