DIRECTORY BasicTime, BiScrollers, Cursors, Geom2D, Imager, IO, Pipal, PipalInteractiveEdit, PipalEdit, PipalPaint, PipalReal, Process, Real, RefTab, TIPUser, ViewerClasses; PipalInteractiveEditImpl: CEDAR PROGRAM IMPORTS BasicTime, BiScrollers, Geom2D, Imager, PipalPaint, PipalReal, Process, TIPUser EXPORTS PipalInteractiveEdit = BEGIN OPEN PipalInteractiveEdit; lastBiscrollerPaintTime: BasicTime.Pulses; Create: PUBLIC PROC [editor: PipalEdit.Editor, tipTable: Pipal.ROPE, notify: ViewerClasses.NotifyProc, data: REF _ NIL] RETURNS [viewerData: ViewerData] ~ { style: BiScrollers.BiScrollerStyle _ BiScrollers.GetStyle["Buttonned"]; class: BiScrollers.BiScrollerClass _ style.NewBiScrollerClass[[ flavor: $PipalInteractiveEdit, extrema: Extrema, paint: BiscrollerPaint, notify: notify, bsUserAction: ForkAndDo, finish: LIST [$Exit], menu: BiScrollers.bsMenu, icon: fileCabinet, tipTable: TIPUser.InstantiateNewTIPTable[tipTable], cursor: textPointer, mayStretch: FALSE, offsetsMustBeIntegers: TRUE, preferIntegerCoefficients: FALSE ]]; info: ViewerClasses.ViewerRec _ [name: "Pipal", iconic: FALSE, data: NEW [ViewerDataRec _ [editor: editor, data: data]]]; bs: BiScrollers.BiScroller _ class.style.CreateBiScroller[class: class, info: info]; viewerData _ NARROW[BiScrollers.ClientDataOf[bs]]; }; Extrema: BiScrollers.ExtremaProc = { viewerData: ViewerData _ NARROW[clientData]; size: PipalReal.Size _ PipalReal.ObjectSize[viewerData.editor.object]; [min, max] _ Geom2D.ExtremaOfRect[[0.0, 0.0, size.x, size.y], direction]; }; BiscrollerPaint: ViewerClasses.PaintProc = { clipArea, outlines: LIST OF PipalReal.Rectangle _ NIL; viewerData: ViewerData _ NARROW [BiScrollers.ClientDataOfViewer[self]]; editor: PipalEdit.Editor = viewerData.editor; lastBiscrollerPaintTime _ BasicTime.GetClockPulses[]; Imager.SetColor[context, Imager.black]; Imager.MaskVector[context, [-1000, 0], [1000, 0]]; Imager.MaskVector[context, [0, -1000], [0, 1000]]; PipalPaint.Paint[editor, context]; lastBiscrollerPaintTime _ BasicTime.GetClockPulses[]-lastBiscrollerPaintTime; }; ForkAndDo: BiScrollers.BSUserActionProc ~ TRUSTED {Process.Detach[FORK BiScrollers.DoBSUserAction[bs, input]]}; END. PipalInteractiveEditImpl.mesa Copyright Σ 1988 by Xerox Corporation. All rights reserved. Louis Monier January 31, 1988 3:11:31 am PST Bertrand Serlet January 31, 1988 8:17:27 pm PST Barth, February 4, 1988 12:55:42 pm PST Operations Coordinate axis Object Commands Notify: ViewerClasses.NotifyProc = { viewerData: ViewerData _ NARROW [BiScrollers.ClientDataOfViewer[self]]; atom: ATOM = NARROW [input.first]; result: REF; resultType: PipalEdit.ResultType; SELECT atom FROM $MouseDown => viewerData.mouseDown _ NARROW [input.rest.first, BiScrollers.ClientCoords]^; $TrackSelected => { area: LIST OF PipalReal.Rectangle; viewerData.mouseNow _ NARROW [input.rest.first, BiScrollers.ClientCoords]^; [resultType, result] _ PipalEdit.ApplyCommand[viewerData.editor, $SelectedOutlines]; IF resultType#selectionArea THEN ERROR; area _ NARROW [result]; area _ TranslateArea[area, PipalReal.Sub[viewerData.mouseNow, viewerData.mouseDown]]; ViewerOps.PaintViewer[self, client, FALSE, NEW [WhatChangedRec _ [ clipArea: area, outlines: area ]]]; viewerData.previousTrackingArea _ area; }; $Exit => NULL; ENDCASE => { arguments: LIST OF REF _ NIL; FOR list: LIST OF REF _ input.rest, list.rest WHILE list#NIL DO WITH list.first SELECT FROM cc: BiScrollers.ClientCoords => { viewerData.mouseNow _ cc^; arguments _ CONS [cc, arguments]; }; atom: ATOM => SELECT atom FROM $DownCoords => arguments _ CONS [NEW [PipalReal.Size _ viewerData.mouseDown], arguments]; ENDCASE => arguments _ CONS [atom, arguments]; ENDCASE => arguments _ CONS [atom, arguments]; ENDLOOP; [resultType, result] _ PipalEdit.ApplyCommand[viewerData.editor, atom, List.Reverse[arguments]]; SELECT resultType FROM none => ViewerOps.PaintViewer[self, client]; -- until the day we have commands which change menus changedArea => ViewerOps.PaintViewer[self, client, FALSE, NEW [WhatChangedRec _ [clipArea: NARROW [result]]]]; ENDCASE => ERROR; -- including object }; }; Κ"– "cedar" style˜codešœ™Kšœ<™