DIRECTORY Feedback, FutureValues, GGInterfaceTypes, GGModelTypes, GGScene, GGSliceOps, GGUserInput, Imager, ImagerColorPrivate, IO, Rope; GGValueEventImpl: CEDAR PROGRAM IMPORTS Feedback, FutureValues, GGScene, GGSliceOps, GGUserInput, ImagerColorPrivate, IO = BEGIN Color: TYPE = Imager.Color; FutureValue: TYPE = FutureValues.FutureValue; GGData: TYPE = GGInterfaceTypes.GGData; ROPE: TYPE = Rope.ROPE; Slice: TYPE = GGModelTypes.Slice; SliceDescriptor: TYPE = GGModelTypes.SliceDescriptor; UserInputProc: TYPE = GGUserInput.UserInputProc; GetSelectedSlices: UserInputProc = { fv: FutureValue ¬ NARROW[event.rest.first]; slices: LIST OF SliceDescriptor ¬ GGScene.ListSelectedSlices[ggData.scene, first, normal]; fv.value ¬ slices; FutureValues.NowAvailable[fv]; }; GetAreaColor: UserInputProc = { fv: FutureValue ¬ NARROW[event.rest.first]; errorRope: ROPE; color: Color; success: BOOL ¬ TRUE; [color, success, errorRope] ¬ GetColorOfSelectedSlice[TRUE, ggData, "GetAreaColor"]; fv.value ¬ color; FutureValues.NowAvailable[fv]; }; GetLineColor: UserInputProc = { fv: FutureValue ¬ NARROW[event.rest.first]; errorRope: ROPE; color: Color; success: BOOL ¬ TRUE; [color, success, errorRope] ¬ GetColorOfSelectedSlice[FALSE, ggData, "GetLineColor"]; fv.value ¬ color; FutureValues.NowAvailable[fv]; }; GetColorOfSelectedSlice: PROC [fill: BOOL, ggData: GGData, opName: ROPE] RETURNS [color: Color, success: BOOL ¬ TRUE, error: ROPE ¬ NIL] = { aborted: BOOL ¬ FALSE; sliceD: SliceDescriptor; UniqueColorOrAbort: PROC [thisD: SliceDescriptor] RETURNS [done: BOOL ¬ FALSE] = { thisColor: Color; isUnique: BOOL ¬ TRUE; IF sliceD = NIL THEN { sliceD ¬ thisD; IF fill THEN [color, isUnique] ¬ GGSliceOps.GetFillColor[thisD.slice, thisD.parts] ELSE [color, isUnique] ¬ GGSliceOps.GetStrokeColor[thisD.slice, thisD.parts]; done ¬ NOT isUnique; } ELSE { IF fill THEN [color, isUnique] ¬ GGSliceOps.GetFillColor[thisD.slice, thisD.parts] ELSE [color, isUnique] ¬ GGSliceOps.GetStrokeColor[thisD.slice, thisD.parts]; IF NOT isUnique OR NOT ImagerColorPrivate.ColorEqual[thisColor, color] THEN done ¬ TRUE }; }; aborted ¬ GGScene.WalkSelectedSlices[ggData.scene, first, UniqueColorOrAbort, normal]; IF aborted OR sliceD = NIL THEN { error ¬ ReportSelectionProblems[aborted, sliceD, opName, ggData]; success ¬ FALSE; }; }; ReportSelectionProblems: PROC [aborted: BOOL, sliceD: SliceDescriptor, opName: ROPE, ggData: GGData] RETURNS [error: ROPE] = { IF aborted THEN { error ¬ IO.PutFR1["%g failed: there is more than one value for this key", [rope[opName]] ]; Feedback.PutF[ggData.router, oneLiner, $Complaint, "%g failed: there is more than one value for this key", [rope[opName]] ]; } ELSE IF sliceD = NIL THEN { error ¬ IO.PutFR1["%g failed: no objects are targeted", [rope[opName]] ]; Feedback.PutF[ggData.router, oneLiner, $Complaint, "%g failed: no objects are selected", [rope[opName]] ]; }; }; RegisterEventProcs: PROC = { OPEN GGUserInput; RegisterAction[$GetSelectedSlices, GetSelectedSlices, none, FALSE]; RegisterAction[$GetAreaColor, GetAreaColor, none, FALSE]; RegisterAction[$GetLineColor, GetLineColor, none, FALSE]; }; RegisterEventProcs[]; END. Ϊ GGValueEventImpl.mesa Copyright c 1992 by Xerox Corporation. All rights reserved. Bier, June 30, 1993 11:20 pm PDT Contents: Registered Gargoyle actions that return values using the GGFutureValue interface. ΚΪ•NewlineDelimiter ™code™Kšœ Οmœ1™