ColorTrixTextCommandImpl.mesa
Copyright © 1985 by Xerox Corporation. All rights reserved.
Bloomenthal, February 13, 1987 2:16:58 pm PST
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)"];
};
Start Code
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.