<<>> <> <> <> DIRECTORY Commander, Controls, ControlsPrivate, Draw2d, Imager, ImagerFont, IO, MessageWindow, Process, Real, Rope, SF, ViewerSpecs, ViewerOps, ViewerTools; ControlsCommandsImpl: CEDAR PROGRAM IMPORTS Commander, Controls, ControlsPrivate, Draw2d, Imager, ImagerFont, IO, MessageWindow, Process, Real, Rope, SF, ViewerOps, ViewerSpecs, ViewerTools ~ BEGIN ROPE: TYPE ~ Rope.ROPE; Control: TYPE ~ Controls.Control; IntegerPair: TYPE ~ Controls.IntegerPair; Mouse: TYPE ~ Controls.Mouse; OuterData: TYPE ~ Controls.OuterData; Context: TYPE ~ Imager.Context; Font: TYPE ~ ImagerFont.Font; Box: TYPE ~ SF.Box; <> ControlsExamplesData: TYPE ~ REF ControlsExamplesDataRep; ControlsExamplesDataRep: TYPE ~ RECORD [ outer: Controls.Viewer ¬ NIL, outerData: OuterData ¬ NIL, font: Font ¬ NIL, oldBox: Box ¬ [[0, 0], [1000, 1000]], pos: IntegerPair ¬ [0, 0], controls: LIST OF Control, text: ROPE ¬ "Some Text", toggleState: BOOL ¬ TRUE, mtEnabled: BOOL ¬ TRUE, natState: NAT ¬ 0, newControl: Control ¬ NIL, newControlState: {add, del} ¬ add ]; ControlsExamples: Commander.CommandProc ~ { d: ControlsExamplesData ¬ NEW[ControlsExamplesDataRep]; d.pos ¬ [ViewerSpecs.openLeftWidth/2, 100]; d.font ¬ ImagerFont.Scale[ImagerFont.Find["xerox/pressfonts/helvetica-mrr"], 16.0]; d.controls ¬ LIST[ Controls.NewControl["no detents", dial, d,, 360.0, 90.0], Controls.NewControl["1 detent", dial, d,, 360.0, 60.0,,,,,,,,,,, LIST[[180.0]]], Controls.NewControl["2 detents", dial, d,, 360.0,,,,,,,,,,,, LIST[[45], [290]]], Controls.NewControl["Lin", vSlider, d,, 1.0, 0.3,,,,,,,,,,, LIST[[0.6]]], Controls.NewControl["Log", vSlider, d,, 1.0, 0.3,,,,,,,,,,,, log], Controls.NewControl["Exp", vSlider, d,, 1.0,,,,,,,,,,,,, exp], Controls.NewControl["Horiz", hSlider, d,, 1.0, 0.5,,,,,,, 60], Controls.NewControl["Side", hSlider, d,, 1.0, 0.5,,,,,,, 60,, [left, center, TRUE]], Controls.NewControl[name: "Function", type: function, w: 180, min: 0.0, max: 1., row: 1], Controls.NewControl[name: "Contour", type: contour, w: 180], Controls.NewControl[name: "Sketch", type: sketch, w: 180]]; d.outer ¬ Controls.OuterViewer[ name: "Controls Examples", controls: d.controls, buttons: LIST[ <> Controls.ClickButton["Trapping: on", ToggleMouseTrap, d], Controls.ClickButton["Toggle", ToggleButton, d], Controls.ClickButton["State 0", StateButton, d], Controls.ClickButton["Text", TextButton, d], Controls.TextButton["Msg1: ", "??", Msg1Button, d], Controls.TextButton["Msg2: ", "??", Msg2Button, d], Controls.ClickButton["Add Control", NewControlButton, d], Controls.ClickButton["Reset Sliders and Dials", ClearButton, d,,,,,,, TRUE]], typescriptHeight: 18, biScrollable: TRUE, graphicsHeight: 200, mouseProc: MouseProc, drawProc: DrawProc, clientData: d ].parent; d.outerData ¬ NARROW[d.outer.data]; }; OverwriteText: PROC [context: Context, oldBox: Box, pos: IntegerPair, text: ROPE, font: Font] RETURNS [Box] ~ { Action: PROC ~ { Imager.SetFont[context, font]; Imager.SetXY[context, [pos.x, pos.y]]; Imager.ShowRope[context, text]; }; e: ImagerFont.Extents ¬ ImagerFont.RopeBoundingBox[font, text]; newMin: SF.Vec ¬ [Real.Round[pos.y-e.descent]-2, Real.Round[pos.x-e.leftExtent]-2]; newMax: SF.Vec ¬ [Real.Round[pos.y+e.ascent]+2, Real.Round[pos.x+e.rightExtent]+2]; min: SF.Vec ¬ SF.Min[newMin, oldBox.min]; max: SF.Vec ¬ SF.Max[newMax, oldBox.max]; Imager.DoWithBuffer[context, Action, min.f, min.s, max.f-min.f, max.s-min.s, Imager.white]; RETURN[[newMin, newMax]]; }; DrawProc: Controls.DrawProc ~ { d: ControlsExamplesData ¬ NARROW[clientData]; d.oldBox ¬ OverwriteText[context, d.oldBox, d.pos, d.text, d.font]; }; MouseProc: Controls.MouseProc ~ { d: ControlsExamplesData ¬ NARROW[clientData]; d.pos ¬ [mouse.pos.x, mouse.pos.y]; IF mouse.state # up THEN ViewerOps.PaintViewer[d.outerData.graphics, client, FALSE, clientData]; }; <> <> <> <> <> <<};>> <