-- ALECmd.mesa
-- Edited by Sweet, 4-Feb-81 13:10:29
DIRECTORY
ALEOps,
Ascii,
FrameDefs,
ImageDefs,
MiscOps,
ProcessDefs,
Window;
ALECmd: PROGRAM
IMPORTS
ALEOps, FrameDefs, ImageDefs, MiscOps, Window
EXPORTS ALEOps =
BEGIN OPEN ALEOps;
DrawSource: PROC [place: Window.Place] =
BEGIN
IF ~sourceWindow.notInTree THEN Window.RemoveFromTree[sourceWindow];
Window.Slide[sourceWindow, [x: place.x - 7, y: place.y - 4]];
IF sourceWindow.notInTree THEN
BEGIN
sourceWindow.sibling ← SELECT TRUE FROM
~destWindow.notInTree => destWindow,
~originWindow.notInTree => originWindow,
ENDCASE => NIL;
Window.InsertIntoTree[sourceWindow];
END;
Window.InvalidateBox[feedbackWindow, sourceValueBox];
END;
DrawDest: PROC [place: Window.Place] =
BEGIN
IF ~destWindow.notInTree THEN Window.RemoveFromTree[destWindow];
Window.Slide[destWindow, [x: place.x, y: place.y - 4]];
IF destWindow.notInTree THEN
BEGIN
destWindow.sibling ← SELECT TRUE FROM
~sourceWindow.notInTree => sourceWindow,
~originWindow.notInTree => originWindow,
ENDCASE => NIL;
Window.InsertIntoTree[destWindow];
END;
Window.InvalidateBox[feedbackWindow, destValueBox];
END;
DrawUpper: PROC [place: Window.Place] =
BEGIN
IF ~upperWindow.notInTree THEN Window.RemoveFromTree[upperWindow];
Window.Slide[upperWindow, place];
IF upperWindow.notInTree THEN
BEGIN
upperWindow.sibling ← SELECT TRUE FROM
~lowerWindow.notInTree => lowerWindow,
~destWindow.notInTree => destWindow,
~sourceWindow.notInTree => sourceWindow,
~originWindow.notInTree => originWindow,
ENDCASE => NIL;
Window.InsertIntoTree[upperWindow];
END;
END;
DrawLower: PROC [place: Window.Place] =
BEGIN
IF ~lowerWindow.notInTree THEN Window.RemoveFromTree[lowerWindow];
Window.Slide[lowerWindow, [x: place.x - 7, y: place.y - 7]];
IF lowerWindow.notInTree THEN
BEGIN
lowerWindow.sibling ← SELECT TRUE FROM
~upperWindow.notInTree => upperWindow,
~destWindow.notInTree => destWindow,
~sourceWindow.notInTree => sourceWindow,
~originWindow.notInTree => originWindow,
ENDCASE => NIL;
Window.InsertIntoTree[lowerWindow];
END;
END;
Print: PROC [file: STRING] =
BEGIN
ENABLE UNWIND => GiveBackKeys[];
box: ABox ← [x1: 0, y1: 0, x2: LAST[LONG INTEGER], y2: LAST[LONG INTEGER]];
inches8: ADistance = (8*LONG[16*12*16])/LONG[state.sixteenthsPerFoot];
inches10: ADistance = (10*LONG[16*12*16])/LONG[state.sixteenthsPerFoot];
IF upperWindow.notInTree AND lowerWindow.notInTree THEN
{PressPicture[file]; GO TO done};
IF ~upperWindow.notInTree THEN
BEGIN
pos: APosition = APosForPlace[upperWindow.box.place];
box.x1 ← pos.x; box.y1 ← pos.y;
END;
IF ~lowerWindow.notInTree THEN
BEGIN
place: Window.Place = lowerWindow.box.place;
pos: APosition = APosForPlace[[x: place.x+7, y: place.y+7]];
box.x2 ← pos.x; box.y2 ← pos.y;
END;
IF box.x2 < box.x1 OR box.y2 < box.y1 THEN
{OutString[" invalid box"L]; RETURN};
IF box.x2 - box.x1 ~IN [0..inches8] OR (box.y2-box.y1) ~IN [0..inches10] THEN
BEGIN
pos: APosition = [
x: MIN[box.x2, box.x1 + inches8],
y: MIN[box.y2, box.y1 + inches10]];
DrawLower[PicturePlace[pos]];
Window.ValidateTree[lowerWindow];
OutString["box trimmed, ok?"L];
IF ~Confirm[] THEN GO TO done;
box.x2 ← pos.x; box.y2 ← pos.y;
END
ELSE
BEGIN
IF ~upperWindow.notInTree THEN Window.RemoveFromTree[upperWindow];
IF ~lowerWindow.notInTree THEN Window.RemoveFromTree[lowerWindow];
END;
PressPictureInABox[file, box];
GO TO done;
EXITS
done => {GiveBackKeys[]; RETURN};
END;
BitmapBox: PUBLIC Window.Box;
state: PUBLIC State;
SELECT TRUE FROM
FrameDefs.IsBound[ImageDefs.MakeCheckPoint] =>
[] ← ImageDefs.MakeCheckPoint["ALE.image"];
FrameDefs.IsBound[ImageDefs.MakeImage] =>
{ImageDefs.MakeImage["ALE.image"]; MiscOps.ReleaseDebuggerBitmap[]};
ENDCASE;
state ← [
displayTicks: TRUE,
showingLabels: TRUE,
grain: 2,
magnify: 1,
minMagnify: 1,
currentWidth: 1,
currentTexture: solid,
currentLabelMode: portrait,
currentFont: small,
sixteenthsPerFoot: 4,
blowup: 1];
InitLines[];
BitmapBox ← [[x: 16, y: 32], [w: 576, h: 752]];
StartDisplay[];
StartMouseHandler[];
DO
op: Operation = GetCmd[];
WITH op SELECT FROM
drawSource => DrawSource[place];
drawDest => DrawDest[place];
drawUpper => DrawUpper[place];
drawLower => DrawLower[place];
setOrigin => ASetOriginPos[pos];
showTicks =>
IF state.displayTicks THEN
BEGIN
state.displayTicks ← FALSE;
DisplayBoxTicks[FALSE];
END
ELSE
BEGIN
MarksOut[];
state.displayTicks ← TRUE;
DisplayBoxTicks[TRUE];
MarksIn[];
END;
drawOrigin =>
BEGIN
MarksOut[];
Window.Slide[originWindow, [x: place.x - 5, y: place.y - 5]];
Window.InvalidateBox[feedbackWindow,
[[0,0], FeedbackBox.dims]];
MarksIn[];
END;
undrawSource =>
IF ~sourceWindow.notInTree THEN Window.RemoveFromTree[sourceWindow];
undrawDest =>
IF ~destWindow.notInTree THEN Window.RemoveFromTree[destWindow];
undrawUpper =>
IF ~upperWindow.notInTree THEN Window.RemoveFromTree[upperWindow];
undrawLower =>
IF ~lowerWindow.notInTree THEN Window.RemoveFromTree[lowerWindow];
draw => {DrawLine[from, to]; pictureChanged ← TRUE; ASetSourcePos[to]};
drawRect =>
BEGIN
deltaY: LONG CARDINAL = ABS[to.y - from.y];
deltaX: LONG CARDINAL = ABS[to.x - from.x];
newDest: APosition ← to;
IF deltaY < deltaX THEN newDest.y ← from.y
ELSE newDest.x ← from.x;
IF newDest # to THEN ASetDestPos[newDest];
DrawLine[from, newDest]; pictureChanged ← TRUE;
ASetSourcePos[newDest];
END;
repaint =>
Window.InvalidateBox[pictureWindow, [PicturePlace[cornerPos], FrameBox.dims]];
reset =>
BEGIN
ResetLines[];
Window.InvalidateBox[pictureWindow, [PicturePlace[cornerPos], FrameBox.dims]];
ClearText[]; pictureChanged ← FALSE;
END;
slide => SlideCorner[pos];
zoomIn => ZoomDetail[p1, p2];
zoomOut => ZoomGlobal[];
redrawSelections =>
{RedrawSelections[]; ClearText[]; pictureChanged ← TRUE};
pressOut => Print[file];
jamOut => JamPicture[file];
collectLabel => {CollectLabel[c, pos]; pictureChanged ← TRUE};
readIn => {ReadPicture[file]; ClearText[]; pictureChanged ← FALSE};
writeOut => {WritePicture[file]; ClearText[]; pictureChanged ← FALSE};
newSelection => {ClearSelections[]; AddSelection[pos]};
addSelection => AddSelection[pos];
subSelection => SubSelection[pos];
delete => {DeleteSelections[]; pictureChanged ← TRUE};
undelete => {UndeleteItems[]; pictureChanged ← TRUE};
sourceToClose => SourceToClosePoint[pos];
destToClose => DestToClosePoint[pos];
boxSelection => SelectInBox[pos1, pos2];
move => {MoveSelections[delta]; pictureChanged ← TRUE};
xlateAndRotate => {MoveAndRotate[source, dest]; pictureChanged ← TRUE};
dimensionSelection => {DimSelection[pos, feet]; pictureChanged ← TRUE};
copy => {CopySelections[delta]; pictureChanged ← TRUE};
ENDCASE;
Window.ValidateTree[];
ENDLOOP;
END.