<> <> <> <> <> <> <<>> DIRECTORY Atom, BiScrollers, Convert, GGBasicTypes, GGError, GGEvent, GGInterfaceTypes, GGModelTypes, GGMouseEvent, GGObjects, GGSessionLog, GGUserInput, Imager, ImagerTransformation, IO, Menus, Rope, SlackProcess, TIPUser, ViewerClasses, ViewerTools; GGUserInputImpl: CEDAR PROGRAM IMPORTS Atom, BiScrollers, Convert, GGError, GGObjects, GGSessionLog, SlackProcess, GGEvent, GGMouseEvent, IO, Rope, ViewerTools EXPORTS GGUserInput = BEGIN GargoyleData: TYPE = GGInterfaceTypes.GargoyleData; Outline: TYPE = GGModelTypes.Outline; Point: TYPE = GGBasicTypes.Point; Viewer: TYPE = ViewerClasses.Viewer; SlackHandle: TYPE = SlackProcess.SlackHandle; EventProc: TYPE = SlackProcess.EventProc; <> <> MenuNotify: PUBLIC PROC [clientData: REF ANY, action: LIST OF REF ANY] = { <> gargoyleData: GargoyleData _ NARROW[clientData]; HandleMouseless[action, gargoyleData]; }; <> PlayAction: PUBLIC PROC [point: Point, action: LIST OF REF ANY, mouseEvent: BOOL, gargoyleData: GargoyleData] = { IF mouseEvent THEN HandleMouse[point, action, gargoyleData] ELSE HandleMouseless[action, gargoyleData]; }; <> InputNotify: PUBLIC PROC [self: ViewerClasses.Viewer, input: LIST OF REF ANY] = { <> <> gargoyleData: GargoyleData _ NARROW[BiScrollers.ClientDataOfViewer[self]]; IF printAllInput THEN PrintAllInput[input, gargoyleData]; WITH input.first SELECT FROM mousePlace: BiScrollers.ClientCoords => { controlPoint: Point _ [mousePlace.x, mousePlace.y]; <> HandleMouse[controlPoint, input.rest, gargoyleData]; }; refChar: REF CHAR => { <> myRefChar: REF CHAR _ NEW[CHAR _ refChar^]; HandleMouseless[LIST[$AddChar, myRefChar], gargoyleData]; }; ENDCASE => HandleMouseless[input, gargoyleData]; }; <> <> HandleMouse: PROC [controlPoint: Point, input: LIST OF REF ANY, gargoyleData: GargoyleData] = { atom: ATOM _ NARROW[input.first]; atomName: Rope.ROPE _ Atom.GetPName[atom]; IF Rope.Equal[Rope.Substr[atomName, 0, 5], "Start", TRUE] THEN { SlackProcess.QueueInputActionWithPoint[gargoyleData.slackHandle, GGMouseEvent.HandleMouse, input, controlPoint, gargoyleData, NIL]; SlackProcess.QueueInputAction[gargoyleData.slackHandle, GGEvent.SawTextFinish, LIST[$SawTextFinish], gargoyleData, NIL]; } ELSE SELECT atom FROM $GuardUp, $MouseUp, $AllUp => SlackProcess.QueueInputActionWithPoint[gargoyleData.slackHandle, GGMouseEvent.HandleMouse, input, controlPoint, gargoyleData, NIL]; $During => SlackProcess.QueueInputActionWithPoint[gargoyleData.slackHandle, GGMouseEvent.HandleMouse, input, controlPoint, gargoyleData, LIST[$During]]; ENDCASE => NotYetImplementedMessage[atom, gargoyleData]; }; <> HandleMouseless: PROC [action: LIST OF REF ANY, gargoyleData: GargoyleData] = { <> atom: ATOM _ NARROW[action.first]; SELECT atom FROM $PaintActionArea => SimpleQueue[gargoyleData.slackHandle, GGEvent.PaintActionArea, action, gargoyleData]; $Abort => SimpleQueue[gargoyleData.slackHandle, GGMouseEvent.HandleMouseless, action, gargoyleData]; $NoOp => {}; $AddChar => SimpleQueue[gargoyleData.slackHandle, GGEvent.AddChar, action, gargoyleData]; <<>> <> $Clear => SimpleQueue[gargoyleData.slackHandle, GGEvent.Clear, action, gargoyleData]; $Reset => SimpleQueue[gargoyleData.slackHandle, GGEvent.Reset, action, gargoyleData]; $Get => { action _ CheckForSelectedRope[atom, action]; SimpleQueue[gargoyleData.slackHandle, GGEvent.Get, action, gargoyleData]; }; $Merge => { action _ CheckForSelectedRope[atom, action]; SimpleQueue[gargoyleData.slackHandle, GGEvent.Merge, action, gargoyleData]; }; $Store => { action _ CheckForSelectedRope[atom, action]; SimpleQueue[gargoyleData.slackHandle, GGEvent.Store, action, gargoyleData]; }; $Save => SimpleQueue[gargoyleData.slackHandle, GGEvent.Save, action, gargoyleData]; $Split => NotYetImplementedMessage[atom, gargoyleData]; $Stuff => SimpleQueue[gargoyleData.slackHandle, GGEvent.StuffIt, action, gargoyleData]; $StuffScreen => SimpleQueue[gargoyleData.slackHandle, GGEvent.StuffItScreen, action, gargoyleData]; <> $MergeIPEditable => { action _ CheckForSelectedRope[atom, action]; SimpleQueue[gargoyleData.slackHandle, GGEvent.MergeIPEditable, action, gargoyleData]; }; $MergeIPSlice => { action _ CheckForSelectedRope[atom, action]; SimpleQueue[gargoyleData.slackHandle, GGEvent.MergeIPSlice, action, gargoyleData]; }; $ToIP => { action _ CheckForSelectedRope[atom, action]; SimpleQueue[gargoyleData.slackHandle, GGEvent.ToIP, action, gargoyleData]; }; $ToIPScreen => { action _ CheckForSelectedRope[atom, action]; SimpleQueue[gargoyleData.slackHandle, GGEvent.ToIPScreen, action, gargoyleData]; }; $IncludeIPByReference => SimpleQueue[gargoyleData.slackHandle, GGEvent.IncludeIPByReference, action, gargoyleData]; $IncludeIPByValue => SimpleQueue[gargoyleData.slackHandle, GGEvent.IncludeIPByValue, action, gargoyleData]; $ShowIPIncludeMode => SimpleQueue[gargoyleData.slackHandle, GGEvent.ShowIPIncludeMode, action, gargoyleData]; $ToIPLit => SimpleQueue[gargoyleData.slackHandle, GGEvent.ToIPLit, action, gargoyleData]; $ToIPTestGravity => { action _ CheckForSelectedRope[atom, action]; SimpleQueue[gargoyleData.slackHandle, GGEvent.ToIPTestGravity, action, gargoyleData]; }; <<>> <> <<>> <> $Delete => SimpleQueue[gargoyleData.slackHandle, GGEvent.Delete, action, gargoyleData]; $Undelete => SimpleQueue[gargoyleData.slackHandle, GGEvent.Undelete, action, gargoyleData]; $UnionCombine => SimpleQueue[gargoyleData.slackHandle, GGEvent.UnionCombine, action, gargoyleData]; $SelectAll => SimpleQueue[gargoyleData.slackHandle, GGEvent.SelectAll, action, gargoyleData]; $AddHoles => SimpleQueue[gargoyleData.slackHandle, GGEvent.AddHoles, action, gargoyleData]; $Weld => SimpleQueue[gargoyleData.slackHandle, GGEvent.Weld, action, gargoyleData]; $SplitSegment => SimpleQueue[gargoyleData.slackHandle, GGEvent.SplitSegment, action, gargoyleData]; <<>> <> $Rotate, $Scale, $ScaleX, $ScaleY, $TranslateX, $TranslateY => { action _ CheckForSelectedRope[atom, action]; SimpleQueue[gargoyleData.slackHandle, GGEvent.TransRotScale, action, gargoyleData]; }; $SixPointTransform => SimpleQueue[gargoyleData.slackHandle, GGEvent.SixPointTransform, action, gargoyleData]; $FourPointTransform => SimpleQueue[gargoyleData.slackHandle, GGEvent.FourPointTransform, action, gargoyleData]; <<>> <> $Top => SimpleQueue[gargoyleData.slackHandle, GGEvent.Top, action, gargoyleData]; $Bottom => SimpleQueue[gargoyleData.slackHandle, GGEvent.Bottom, action, gargoyleData]; $UpOne => SimpleQueue[gargoyleData.slackHandle, GGEvent.UpOne, action, gargoyleData]; $DownOne => SimpleQueue[gargoyleData.slackHandle, GGEvent.DownOne, action, gargoyleData]; <> $Close => SimpleQueue[gargoyleData.slackHandle, GGEvent.Close, action, gargoyleData]; <<$ShowPoints => SimpleQueue[gargoyleData.slackHandle, GGEvent.ShowPoints, action, gargoyleData];>> <<$HidePoints => SimpleQueue[gargoyleData.slackHandle, GGEvent.HidePoints, action, gargoyleData];>> <> $Refresh => SimpleQueue[gargoyleData.slackHandle, GGEvent.Refresh, action, gargoyleData]; $DisableRefresh => SimpleQueue[gargoyleData.slackHandle, GGEvent.DisableRefresh, action, gargoyleData]; $EnableRefresh => SimpleQueue[gargoyleData.slackHandle, GGEvent.EnableRefresh, action, gargoyleData]; <<>> <> $PolygonInCircle => { action _ CheckForSelectedInt[atom, action]; SimpleQueue[gargoyleData.slackHandle, GGEvent.PolygonInCircle, action, gargoyleData]; }; $KnotchedLine => SimpleQueue[gargoyleData.slackHandle, GGEvent.NewKnotchedLine, action, gargoyleData]; $NewCircle => SimpleQueue[gargoyleData.slackHandle, GGEvent.NewCircle, action, gargoyleData]; $NewBox => SimpleQueue[gargoyleData.slackHandle, GGEvent.NewBox, action, gargoyleData]; $NewArrow => SimpleQueue[gargoyleData.slackHandle, GGEvent.NewArrow, action, gargoyleData]; $Frame => SimpleQueue[gargoyleData.slackHandle, GGEvent.Frame, action, gargoyleData]; <> $TestGravity => SimpleQueue[gargoyleData.slackHandle, GGEvent.TestGravity, action, gargoyleData]; $ToIPTestGravity => SimpleQueue[gargoyleData.slackHandle, GGEvent.ToIPTestGravity, action, gargoyleData]; $TestMultiGravity => SimpleQueue[gargoyleData.slackHandle, GGEvent.TestMultiGravity, action, gargoyleData]; $Statistics => SimpleQueue[gargoyleData.slackHandle, GGEvent.Statistics, action, gargoyleData]; $ResetStatistics => SimpleQueue[gargoyleData.slackHandle, GGEvent.ResetStatistics, action, gargoyleData]; <<$DrawTouchPoints => SimpleQueue[gargoyleData.slackHandle, GGEvent.DrawTouchPoints, action, gargoyleData];>> <<$DescribeTouchPoints => SimpleQueue[gargoyleData.slackHandle, GGEvent.DescribeTouchPoints, action, gargoyleData];>> $DrawTightBoxes => SimpleQueue[gargoyleData.slackHandle, GGEvent.DrawTightBoxes, action, gargoyleData]; $DrawBoundBoxes => SimpleQueue[gargoyleData.slackHandle, GGEvent.DrawBoundBoxes, action, gargoyleData]; $DrawOutlineBoxes => SimpleQueue[gargoyleData.slackHandle, GGEvent.DrawOutlineBoxes, action, gargoyleData]; $DrawSelectionBox => SimpleQueue[gargoyleData.slackHandle, GGEvent.DrawSelectionBox, action, gargoyleData]; $DrawMovingBox => SimpleQueue[gargoyleData.slackHandle, GGEvent.DrawMovingBox, action, gargoyleData]; $Typescript => SimpleQueue[gargoyleData.slackHandle, GGEvent.Typescript, action, gargoyleData]; $SlackLog => SimpleQueue[gargoyleData.slackHandle, GGEvent.SlackLog, action, gargoyleData]; $DescribeCaretObject => SimpleQueue[gargoyleData.slackHandle, GGEvent.DescribeCaretObject, action, gargoyleData]; $DescribeCaretObject => SimpleQueue[gargoyleData.slackHandle, GGEvent.DescribeCaretObject, action, gargoyleData]; $FSMInfo => SimpleQueue[gargoyleData.slackHandle, FSMInfo, action, gargoyleData]; $Splice => SimpleQueue[gargoyleData.slackHandle, GGEvent.Splice, action, gargoyleData]; $PrintAllInput => printAllInput _ TRUE; $ResetAllInput => printAllInput _ FALSE; $CauseAnError => SimpleQueue[gargoyleData.slackHandle, CauseAnError, action, gargoyleData]; <