<> <> <> DIRECTORY Args, Atom, Buttons, ChoiceButtons, ColorTrixBasics, ColorTrixDispatch, ColorTrixMisc, Commander, Convert, Imager, ImagerBackdoor, ImagerColor, IO, MessageWindow, Rope, ViewerClasses, ViewerOps, ViewerTools; ColorTrixTextCommandImpl: CEDAR PROGRAM IMPORTS Args, Atom, Buttons, ChoiceButtons, ColorTrixBasics, ColorTrixDispatch, ColorTrixMisc, Convert, ImagerBackdoor, ImagerColor, MessageWindow, Rope, ViewerOps, ViewerTools ~ BEGIN ROPE: TYPE ~ Rope.ROPE; STREAM: TYPE ~ IO.STREAM; Viewer: TYPE ~ ViewerClasses.Viewer; PixelMap: TYPE ~ ColorTrixBasics.PixelMap; PixelMapMisc: TYPE ~ ColorTrixBasics.PixelMapMisc; Context: TYPE ~ Imager.Context; Color: TYPE ~ Imager.Color; CtTextData: TYPE ~ REF CtTextDataRec; CtTextDataRec: TYPE ~ RECORD [ viewer: Viewer _ NIL, context: Context _ NIL, bounds: Imager.Rectangle, x, y, c: Viewer _ NIL, trackButton: Viewer _ NIL, styleButton: Viewer _ NIL, printButton: Viewer _ NIL ]; CtText: PUBLIC Commander.CommandProc ~ { IF Args.NArgs[cmd] > 0 THEN { x: Args.Arg _ Args.ArgInt[cmd, 0]; y: Args.Arg _ Args.ArgInt[cmd, 1]; text: Args.Arg _ Args.ArgRope[cmd, 2]; IF NOT x.ok OR NOT y.ok OR NOT text.ok THEN RETURN[$Failure, NIL]; ColorTrixMisc.PrintRope[text.rope, x.int, y.int]; } ELSE { ProcButton: PROC [x, y: NAT, name: ROPE, proc: Buttons.ButtonProc] RETURNS [v: Viewer] ~ { v _ Buttons.Create[ info: [parent: data.viewer, name: name, wx: x, wy: y], proc: proc, clientData: data, paint: TRUE]; }; TextButton: PROC [x, y, w: NAT, name, text: ROPE] RETURNS [v: Viewer] ~ { v _ ChoiceButtons.BuildTextPrompt[data.viewer, x, y, name, text, , w].textViewer; }; data: CtTextData _ NEW[CtTextDataRec]; data.context _ ColorTrixBasics.InitCd[smooth, TRUE, FALSE, FALSE]; data.bounds _ ImagerBackdoor.GetBounds[data.context]; data.viewer _ ViewerOps.CreateViewer[ flavor: $CtText, info: [openHeight: 34, name: "Ct Text", data: data, scrollable: FALSE, column: right, iconic: TRUE]]; ViewerOps.OpenIcon[data.viewer]; data.x _ TextButton[0, 3, 40, "x:", "0"]; data.y _ TextButton[60, 3, 40, "y:", "0"]; data.c _ TextButton[125, 3, 50, "color:", "Black"]; data.trackButton _ ProcButton[225, 3, "Track-Off", ToggleTrack]; data.styleButton _ ProcButton[295, 3, "PrintStyle ", ToggleStyle]; data.printButton _ ProcButton[370, 3, "PRINT", Print]; }; }; Destroy: ViewerClasses.DestroyProc ~ { ColorTrixMisc.UnRegisterClient[[Tracker, NIL, self.data]]; }; Blink: PROC [rope: ROPE] ~ { MessageWindow.Append[rope, TRUE]; MessageWindow.Blink[]; }; Tracker: ColorTrixMisc.MouseProc ~ { ctTextData: CtTextData ~ NARROW[data]; Buttons.ReLabel[ctTextData.x, Convert.RopeFromInt[mouse.x]]; Buttons.ReLabel[ctTextData.y, Convert.RopeFromInt[mouse.y]]; }; ToggleTrack: Buttons.ButtonProc ~ { data: CtTextData ~ NARROW[clientData]; viewer: Viewer ~ NARROW[parent]; IF Rope.Equal[viewer.name, "Track-Off"] THEN { Buttons.ReLabel[viewer, "Track-On"]; ColorTrixMisc.RegisterClient[[Tracker, NIL, data]]; } ELSE { Buttons.ReLabel[viewer, "Track-Off"]; ColorTrixMisc.UnRegisterClient[[Tracker, NIL, data]]; }; }; ToggleStyle: Buttons.ButtonProc ~ { viewer: Viewer ~ NARROW[parent]; IF Rope.Equal[viewer.name, "ScreenStyle"] THEN Buttons.ReLabel[viewer, "PrintStyle "] ELSE Buttons.ReLabel[viewer, "ScreenStyle"]; }; Print: Buttons.ButtonProc ~ { badButton: ERROR; GetValue: PROC [viewer: Viewer] RETURNS [NAT] ~ { num: INT; selection: ROPE _ ViewerTools.GetContents[viewer]; num _ Convert.IntFromRope[selection ! Convert.Error => ERROR badButton]; IF num < 0 THEN ERROR badButton; RETURN[num]; }; data: CtTextData ~ NARROW[clientData]; color: Color _ ImagerColor.ColorFromAtom[Atom.MakeAtom[ViewerTools.GetContents[data.c]]]; x: NAT _ GetValue[data.x ! badButton => GOTO BadButton]; y: NAT _ GetValue[data.y ! badButton => GOTO BadButton]; screenStyle: BOOL ~ Rope.Equal[data.styleButton.name, "ScreenStyle"]; error: ROPE ~ ColorTrixMisc.PrintTiogaSelection[x, y, color, data.context, screenStyle]; IF error # NIL THEN Blink[error]; EXITS BadButton => Blink["Bad coordinate(s)"]; }; <> ctTextUsage: ROPE ~ "Ct Text [x, y: INT, text: ROPE] If arguments given, print text starting at pixel loaction (x, y). Otherwise, create a viewer to print any selected text."; ViewerOps.RegisterViewerClass[ $CtText, NEW[ViewerClasses.ViewerClassRec _ [destroy: Destroy]]]; ColorTrixDispatch.RegisterCtOp["Text", CtText, ctTextUsage]; END.