-- TAPrivateImpl.mesa
-- Rick Beach, July 6, 1982 8:15 pm
-- Maureen Stone April 21, 1983 10:09 am
-- Rick Beach, November 27, 1982 10:17 am

DIRECTORY
CIFS USING [Error],
 JaMBasic USING [Object],
 JaMInternal USING [Frame],
 JaMOps USING [defaultFrame, Execute, MakeString, Push, PushReal],
 PutGet USING [FromFile],
 Rope,
 TAPrivate,
 TEditDocument USING [TEditDocumentData],
 TextEdit USING [GetRope],
 TextNode USING [NarrowToTextNode, Ref],
 ViewerClasses,
 ViewerOps;

TAPrivateImpl: PROGRAM
IMPORTS CIFS, JaMOps, PutGet, Rope, TextEdit, TextNode, ViewerOps
EXPORTS TAPrivate = {
OPEN TAPrivate;

ROPE: TYPE = Rope.ROPE;

FileNotFound: PUBLIC SIGNAL = CODE;

GetDocument: PUBLIC PROCEDURE[fileName: ROPE] RETURNS[node: TextNode.Ref, fromFile: BOOLEAN] = {
 viewer: ViewerClasses.Viewer;
 viewer ← IF Rope.Size[fileName]=0 THEN NIL ELSE ViewerOps.FindViewer[fileName];
IF viewer # NIL THEN {
  node ← NARROW[viewer.data, TEditDocument.TEditDocumentData].text;
  fromFile ← FALSE; }
ELSE {
  node ← PutGet.FromFile[fileName ! CIFS.Error => TRUSTED {SIGNAL FileNotFound}]; -- catch directory error by caller
  fromFile ← TRUE; }
 };

FixFileName: PUBLIC PROCEDURE[oldname, extension: ROPE] RETURNS [newname:ROPE] = {
 dotPosition: INTEGER ← Rope.Find[oldname, "."];
IF dotPosition < 0 THEN
  newname ← Rope.Cat[oldname, extension]
ELSE
  newname ← Rope.Cat[Rope.Substr[oldname, 0, dotPosition], extension];
 };

getViewer: JaMBasic.Object = JaMOps.MakeString[".getviewer", X];
loadBCD: JaMBasic.Object = JaMOps.MakeString[".loadbcd", X];
pushDC: JaMBasic.Object = JaMOps.MakeString[".pushdc", X];
popDC: JaMBasic.Object = JaMOps.MakeString[".popdc", X];
setCP: JaMBasic.Object = JaMOps.MakeString[".setpos", X];
translate: JaMBasic.Object = JaMOps.MakeString[".translate", X];
drawArea: JaMBasic.Object = JaMOps.MakeString[".drawarea", X];
drawPath: JaMBasic.Object = JaMOps.MakeString[".drawpath", X];
drawBox: JaMBasic.Object = JaMOps.MakeString[".drawbox", X];
outlinePath: JaMBasic.Object = JaMOps.MakeString[".calligoutlinepath", X];
calligRoundPen: JaMBasic.Object = JaMOps.MakeString[".calligroundpen", X];
calligRectangularPen: JaMBasic.Object = JaMOps.MakeString[".calligrectangularpen", X];
calligItalicPen: JaMBasic.Object = JaMOps.MakeString[".calligitalicpen", X];
calligEllipticalPen: JaMBasic.Object = JaMOps.MakeString[".calligellipticalpen", X];
calligShadowPen: JaMBasic.Object = JaMOps.MakeString[".calligshadowpen", X];
calligShadowPath: JaMBasic.Object = JaMOps.MakeString[".calligshadowpath", X];
drawImage: JaMBasic.Object = JaMOps.MakeString[".drawimage", X];
drawText: JaMBasic.Object = JaMOps.MakeString[".drawtext", X];
setHSVColor: JaMBasic.Object = JaMOps.MakeString["hsvcolor", X];

calligDefined: BOOLEANFALSE;

NoJaMGraphicsViewer: PUBLIC SIGNAL = CODE;

InitJaMGraphics: PUBLIC PROCEDURE = {
 jaMViewer: ViewerClasses.Viewer ← ViewerOps.FindViewer["JaM"];
IF jaMViewer=NIL THEN
  SIGNAL NoJaMGraphicsViewer;
IF ~calligDefined THEN {
  -- Define the Calligraphy graphics functions which reside in TACallig.bcd
  JaMOps.Execute[JaMOps.defaultFrame, JaMOps.MakeString["(artwork) .dup 50 .dict .def .load .begin", X]];
  JaMOps.Execute[JaMOps.defaultFrame, JaMOps.MakeString["(.moveto) (.calligmoveto).cvx .def", X]];
  JaMOps.Execute[JaMOps.defaultFrame, JaMOps.MakeString["(.lineto) (.calliglineto).cvx .def", X]];
  JaMOps.Execute[JaMOps.defaultFrame, JaMOps.MakeString["(.curveto) (.calligcurveto).cvx .def", X]];
  JaMOps.Execute[JaMOps.defaultFrame, JaMOps.MakeString["(.drawpath) (.calligdrawpath).cvx .def", X]];
  JaMOps.Execute[JaMOps.defaultFrame, JaMOps.MakeString["(.drawarea) (.calligdrawarea).cvx .def", X]];
  JaMOps.Execute[JaMOps.defaultFrame, JaMOps.MakeString["(hsvcolor) (.hsvcolor) .cvx .def", X]];
  calligDefined ← TRUE};
 };

PushDC: PUBLIC PROCEDURE = {
 JaMOps.Execute[JaMOps.defaultFrame, pushDC] };

PopDC: PUBLIC PROCEDURE= {
 JaMOps.Execute[JaMOps.defaultFrame, popDC] };

PushReal: PUBLIC PROCEDURE[r: REAL] = {
 JaMOps.PushReal[JaMOps.defaultFrame.opstk, r] };

DrawArea: PUBLIC PROCEDURE = {
 JaMOps.Execute[JaMOps.defaultFrame, drawArea] };

DrawPath: PUBLIC PROCEDURE = {
 JaMOps.Execute[JaMOps.defaultFrame, drawPath] };

OutlinePath: PUBLIC PROCEDURE = {
 JaMOps.Execute[JaMOps.defaultFrame, outlinePath] };

DrawBox: PUBLIC PROCEDURE = {
 JaMOps.Execute[JaMOps.defaultFrame, drawBox] };

SetCP: PUBLIC PROCEDURE = {
 JaMOps.Execute[JaMOps.defaultFrame, setCP] };

Translate: PUBLIC PROCEDURE = {
 JaMOps.Execute[JaMOps.defaultFrame, translate] };

RoundPen: PUBLIC PROCEDURE = {
 JaMOps.Execute[JaMOps.defaultFrame, calligRoundPen] };

ItalicPen: PUBLIC PROCEDURE = {
 JaMOps.Execute[JaMOps.defaultFrame, calligItalicPen] };

RectangularPen: PUBLIC PROCEDURE = {
 JaMOps.Execute[JaMOps.defaultFrame, calligRectangularPen] };

EllipticalPen: PUBLIC PROCEDURE = {
 JaMOps.Execute[JaMOps.defaultFrame, calligEllipticalPen] };

ShadowPen: PUBLIC PROCEDURE = {
 JaMOps.Execute[JaMOps.defaultFrame, calligShadowPen] };

ShadowPath: PUBLIC PROCEDURE = {
 JaMOps.Execute[JaMOps.defaultFrame, calligShadowPath] };

DrawImage: PUBLIC PROCEDURE[imageFileName: Rope.ROPE] = {
 JaMOps.Push[JaMOps.defaultFrame.opstk, JaMOps.MakeString[
  LOOPHOLE[Rope.Flatten[imageFileName]], L]];
 JaMOps.Execute[JaMOps.defaultFrame, drawImage];
 };

PushString: PUBLIC PROCEDURE[node: TextNode.Ref] = {
 rope: ROPE ← TextEdit.GetRope[TextNode.NarrowToTextNode[node]];
IF rope#NIL THEN
  JaMOps.Push[JaMOps.defaultFrame.opstk,
   JaMOps.MakeString[LOOPHOLE[Rope.Flatten[rope]]]] };

DrawText: PUBLIC PROCEDURE = {
 JaMOps.Execute[JaMOps.defaultFrame, drawText] };

ExecuteNode: PUBLIC PROCEDURE[node: TextNode.Ref] = {
 rope: ROPE ← TextEdit.GetRope[TextNode.NarrowToTextNode[node]];
IF rope#NIL THEN
  JaMOps.Execute[JaMOps.defaultFrame,
   JaMOps.MakeString[LOOPHOLE[Rope.Flatten[rope]], X]];
 };

SetHSV: PUBLIC PROCEDURE[h, s, v: REAL] = {
 JaMOps.PushReal[JaMOps.defaultFrame.opstk, h];
 JaMOps.PushReal[JaMOps.defaultFrame.opstk, s];
 JaMOps.PushReal[JaMOps.defaultFrame.opstk, v];
 JaMOps.Execute[JaMOps.defaultFrame, setHSVColor];
 };

}.
}.