program CassetteCoverPrinter_PAL;

{ This program prints out cassette labels either as ASCII-Files or as source
  for use with LaTeX.
  PAL Version 1.1
  ©1991 by Jörn Clausen                                                      }


{ Get the right stuff. }
uses Intuition,Graphics;
from Windows uses ArpFilerequester;


{ A few useful things. }
const spaces="                                ";
      line="+-------------------------------------------------------------------+";
      fileIDstandard="CASSDATA"


{ This one needed for all the borders. }
type IntArr10=array [1..10] of integer;


{ Loads of definitions. }
var MyScreen                                  : ^Screen;
    MyWindow                                  : ^Window;
    Msg                                       : ^IntuiMessage;
    Running,success                           : boolean;
    ProjMen,PrinMen                           : Menu;
    Clear,Load,Save,About,Quit,ASCII,LaTeX,
    ToFile,ToPrinter                          : MenuItem;
    SongGad                                   : array [1..30] of Gadget;
    SongTexInfo                               : array [1..30] of StringInfo;
    SongTex,UndoSongTex,OtherSideTex          : array [1..30] of String[32];
    TitleGad                                  : array [1..4] of Gadget;
    TitleTexInfo                              : array [1..4] of StringInfo;
    TitleTex,UndoTitleTex                     : array [1..4] of String[32];
    NRGad,SourceGad,DateGad                   : array [1..2] of Gadget;
    DateTexInfo                               : array [1..2] of StringInfo;
    DateTex,UndoDateTex                       : array [1..2] of String[11];
    LengthGad,PosGad,SwitchGad                : Gadget;
    TextBord,NRBord,SourceBord,DateBord,
    LengthBord,PosBord,SwitchBord             : Border;
    TextBordXY,NRBordXY,SourceBordXY,
    DateBordXY,LengthBordXY,PosBordXY,
    SwitchBordXY                              : IntArr10;
    NRGadText,SourceGadText,DateIText,
    LengthGadText,PosGadText,SwitchGadText,
    ClearIText,LoadIText,SaveIText,AboutIText,
    QuitIText,ASCIIIText,LaTeXIText,
    ToFileIText,ToPrinterIText                : IntuiText;
    Side,Length,Pos                           : integer;
    NR,Source                                 : array [1..2] of integer;
    NRText                                    : array [1..5] of String[9];
    LengthText                                : array [1..5] of String[4];
    PosText                                   : array [1..3] of String[7];
    SourceText                                : array [1..9] of String[9];
    Picked,PMenu,PMenuItem,PMenuSubItem       : integer;
    ClickGad                                  : ^Gadget;
    Output                                    : text;


{ This looks rather ugly, but how can I convert integers to strings without
  causing too much problems? }
procedure PrintNumbers;
  var start,i,j : integer;
      NumIText  : IntuiText;
      Number    : String;
 begin
  for j:=1 to 15 do
   begin
    start:=Side*15;
    i:=j+start;
    if i<10 then
     Number:=Concat(' ',chr(i+48));
    if (i>9) and (i<20) then
     Number:=Concat('1',chr(i+38));
    if (i>19) and (i<30) then
     Number:=Concat('2',chr(i+28));
    if i=30 then Number:='30';
    NumIText:=IntuiText(1,0,JAM2,0,0,nil,Number,nil);
    PrintIText(MyWindow^.RPort,^NumIText,310,11*j+3);
   end;
 end;


procedure PrintNR(NRSide:integer);
  var NRIText : IntuiText;
 begin
  NRIText:=IntuiText(1,0,JAM2,0,0,nil,NRText[NR[NRSide]],nil);
  PrintIText(MyWindow^.RPort,^NRIText,340*(NRSide-1)+62,211);
 end;


procedure PrintSource(SourceSide:integer);
  var SourceIText : IntuiText;
 begin
  SourceIText:=IntuiText(1,0,JAM2,0,0,nil,SourceText[Source[SourceSide]],nil);
  PrintIText(MyWindow^.RPort,^SourceIText,340*(SourceSide-1)+217,211);
 end;


procedure PrintLength;
  var LengthIText : IntuiText;
 begin
  LengthIText:=IntuiText(1,0,JAM2,0,0,nil,LengthText[Length],nil);
  PrintIText(MyWindow^.RPort,^LengthIText,164,242);
 end;


procedure PrintPos;
  var PosIText : IntuiText;
 begin
  PosIText:=IntuiText(1,0,JAM2,0,0,nil,PosText[Pos],nil);
  PrintIText(MyWindow^.RPort,^PosIText,333,242);
 end;


{ Define tape sorts, lengths, noise reductions etc. Adjust them according to
  your special needs. }
procedure DoVariables;
 begin
  NR[1]:=4; NR[2]:=4;
  NRText[1]:='None    '; NRText[2]:='Dolby B '; NRText[3]:='Db B MPX';
  NRText[4]:='Dolby C '; NRText[5]:='Db C MPX';
  Source[1]:=1; Source[2]:=1;
  SourceText[1]:='CD      '; SourceText[2]:='Phono   ';
  SourceText[3]:='Tuner   '; SourceText[4]:='DAT     ';
  SourceText[5]:='Tape    '; SourceText[6]:='Video   ';
  SourceText[7]:='TV      '; SourceText[8]:='Computer';
  SourceText[9]:='        ';
  Length:=4;
  LengthText[1]:='30 '; LengthText[2]:='45 '; LengthText[3]:='60 ';
  LengthText[4]:='90 '; LengthText[5]:='120';
  Pos:=2;
  PosText[1]:='Normal'; PosText[2]:='Chrome'; PosText[3]:='Metal ';
  Side:=0;
 end;


{ Open Screen and Window. OK, OK, I know, this should be done more carefully,
  but this is the way described in the handbook. I guess, that Open_Screen and
  Open_Window, which are special Kick-Pascal functions, check if they return a
  screen or a window. For this reason I don't check it again.}
procedure DoScreen;
 begin
  MyScreen:=Open_Screen(0,0,640,256,2,0,1,HIRES,'Cassette Cover Printer V1.1');
  MyWindow:=Open_Window(0,0,640,256,1,GADGETUP+GADGETDOWN+MENUPICK+_CLOSEWINDOW,WINDOWDEPTH+WINDOWCLOSE+ACTIVATE,'Cassette Cover Printer V1.1',MyScreen,320,640,320,640);
 end;


{ Define the pull-down-menus. }
procedure DoMenu;
 begin
  ProjMen:=Menu(^PrinMen,10,0,90,10,MENUENABLED,'Project',^Load,0,0,0,0);
   Load:=MenuItem(^Save,0,0,90,10,ITEMTEXT+ITEMENABLED+HIGHCOMP+COMMSEQ,0,^LoadIText,nil,'O',nil,0);
   LoadIText:=IntuiText(0,1,JAM2,1,1,nil,'Open',nil);
   Save:=MenuItem(^Clear,0,10,90,10,ITEMTEXT+ITEMENABLED+HIGHCOMP+COMMSEQ,0,^SaveIText,nil,'S',nil,0);
   SaveIText:=IntuiText(0,1,JAM2,1,1,nil,'Save',nil);
   Clear:=MenuItem(^About,0,20,90,10,ITEMTEXT+ITEMENABLED+HIGHCOMP+COMMSEQ,0,^ClearIText,nil,'C',nil,0);
   ClearIText:=IntuiText(0,1,JAM2,1,1,nil,'Clear',nil);
   About:=MenuItem(^Quit,0,30,90,10,ITEMTEXT+ITEMENABLED+HIGHCOMP,0,^AboutIText,nil,chr(0),nil,0);
   AboutIText:=IntuiText(0,1,JAM2,1,1,nil,'About',nil);
   Quit:=MenuItem(nil,0,40,90,10,ITEMTEXT+ITEMENABLED+HIGHCOMP,0,^QuitIText,nil,chr(0),nil,0);
   QuitIText:=IntuiText(0,1,JAM2,1,1,nil,'Quit',nil);

  PrinMen:=Menu(nil,120,0,90,10,MENUENABLED,'Print',^ASCII,0,0,0,0);
   ASCII:=MenuItem(^LaTeX,0,0,90,10,ITEMTEXT+ITEMENABLED+HIGHNONE,0,^ASCIIIText,nil,chr(0),^ToPrinter,0);
   ASCIIIText:=IntuiText(0,1,JAM2,1,1,nil,'ASCII',nil);
    ToPrinter:=MenuItem(^ToFile,90,0,130,10,ITEMTEXT+ITEMENABLED+HIGHCOMP+COMMSEQ,0,^ToPrinterIText,nil,'P',nil,0);
    ToPrinterIText:=IntuiText(0,1,JAM2,1,1,nil,'to Printer',nil);
    ToFile:=MenuItem(nil,90,10,130,10,ITEMTEXT+ITEMENABLED+HIGHCOMP+COMMSEQ,0,^ToFileIText,nil,'F',nil,0);
    ToFileIText:=IntuiText(0,1,JAM2,1,1,nil,'to File',nil);
   LaTeX:=MenuItem(nil,0,10,90,10,ITEMTEXT+ITEMENABLED+HIGHCOMP+COMMSEQ,0,^LaTeXIText,nil,'L',nil,0);
   LaTeXIText:=IntuiText(0,1,JAM2,1,1,nil,'LaTeX',nil);

  SetMenuStrip(MyWindow,^ProjMen);
 end;


{ And define all the gadgets. }
procedure DoGadgets;
  var i : integer;
 begin
  TextBord:=Border(0,0,1,0,JAM1,5,^TextBordXY,nil);
  TextBordXY:=IntArr10(-3,-2,258,-2,258,9,-3,9,-3,-2);
  for i:=1 to 15 do
   begin
    SongGad[i]:=Gadget(nil,22,11*i+3,255,8,GADGHCOMP,GADGIMMEDIATE+RELVERIFY,STRGADGET,^TextBord,nil,nil,0,^SongTexInfo[i],i,0);
    SongTexInfo[i]:=StringInfo(^SongTex[i],^UndoSongTex[i],0,32,0,0,0,0,0,0,nil,0,nil);
    SongTex[i]:=''; UndoSongTex[i]:=''; OtherSideTex[i]:='';
    AddGadget(MyWindow,^SongGad[i],nil);
    SongGad[i+15]:=Gadget(nil,362,11*i+3,255,8,GADGHCOMP,GADGIMMEDIATE+RELVERIFY,STRGADGET,^TextBord,nil,nil,0,^SongTexInfo[i+15],i+15,0);
    SongTexInfo[i+15]:=StringInfo(^SongTex[i+15],^UndoSongTex[i+15],0,32,0,0,0,0,0,0,nil,0,nil);
    SongTex[i+15]:=''; UndoSongTex[i+15]:=''; OtherSideTex[i+15]:='';
    AddGadget(MyWindow,^SongGad[i+15],nil);
   end;

  for i:=1 to 2 do
   begin
    TitleGad[i]:=Gadget(nil,22,11*i+173,255,8,GADGHCOMP,GADGIMMEDIATE+RELVERIFY,STRGADGET,^TextBord,nil,nil,0,^TitleTexInfo[i],i+30,0);
    TitleTexInfo[i]:=StringInfo(^TitleTex[i],UndoTitleTex[i],0,32,0,0,0,0,0,0,nil,0,nil);
    TitleTex[i]:=''; UndoTitleTex[i]:='';
    AddGadget(MyWindow,^TitleGad[i],nil);
    TitleGad[i+2]:=Gadget(nil,362,11*i+173,255,8,GADGHCOMP,GADGIMMEDIATE+RELVERIFY,STRGADGET,^TextBord,nil,nil,0,^TitleTexInfo[i+2],i+32,0);
    TitleTexInfo[i+2]:=StringInfo(^TitleTex[i+2],UndoTitleTex[i+2],0,32,0,0,0,0,0,0,nil,0,nil);
    TitleTex[i+2]:=''; UndoTitleTex[i+2]:='';
    AddGadget(MyWindow,^TitleGad[i+2],nil);
   end;

  NRBord:=Border(0,0,1,0,JAM1,5,^NRBordXY,nil);
  NRBordXY:=IntArr10(-4,-2,23,-2,23,9,-4,9,-4,-2);
  NRGadText:=IntuiText(1,0,JAM1,2,0,nil,'NR',nil);
  for i:=1 to 2 do
   begin
    NRGad[i]:=Gadget(nil,340*(i-1)+23,211,20,8,GADGHBOX,RELVERIFY,BOOLGADGET,^NRBord,nil,^NRGadText,0,nil,34+i,0);
    AddGadget(MyWindow,^NRGad[i],nil);
    PrintNR(i);
   end;

  SourceBord:=Border(0,0,1,0,JAM1,5,^SourceBordXY,nil);
  SourceBordXY:=IntArr10(-4,-2,53,-2,53,9,-4,9,-4,-2);
  SourceGadText:=IntuiText(1,0,JAM1,1,0,nil,'Source',nil);
  for i:=1 to 2 do
   begin
    SourceGad[i]:=Gadget(nil,340*(i-1)+148,211,50,8,GADGHBOX,RELVERIFY,BOOLGADGET,^SourceBord,nil,^SourceGadText,0,nil,36+i,0);
    AddGadget(MyWindow,^SourceGad[i],nil);
    PrintSource(i);
   end;

  DateBord:=Border(0,0,1,0,JAM1,5,^DateBordXY,nil);
  DateBordXY:=IntArr10(-3,-2,90,-2,90,9,-3,9,-3,-2);
  DateIText:=IntuiText(1,0,JAM1,0,0,nil,'Date',nil);
  for i:=1 to 2 do
   begin
    DateGad[i]:=Gadget(nil,340*(i-1)+69,227,87,8,GADGHCOMP,GADGIMMEDIATE,STRGADGET,^DateBord,nil,nil,0,^DateTexInfo[i],38+i,0);
    DateTexInfo[i]:=StringInfo(^DateTex[i],^UndoDateTex[i],0,11,0,0,0,0,0,0,nil,0,nil);
    DateTex[i]:=''; UndoDateTex[i]:='';
    AddGadget(MyWindow,^DateGad[i],nil);
    PrintIText(MyWindow^.RPort,^DateIText,340*(i-1)+20,227);
   end;

  LengthBord:=Border(0,0,1,0,JAM1,5,^LengthBordXY,nil);
  LengthBordXY:=IntArr10(-4,-2,21,-2,21,9,-4,9,-4,-2);
  LengthGadText:=IntuiText(1,0,JAM1,5,0,nil,'C',nil);
  LengthGad:=Gadget(nil,128,242,18,8,GADGHBOX,RELVERIFY,BOOLGADGET,^LengthBord,nil,^LengthGadText,0,nil,41,0);
  AddGadget(MyWindow,^LengthGad,nil);
  PrintLength;

  PosBord:=Border(0,0,1,0,JAM1,5,^PosBordXY,nil);
  PosBordXY:=IntArr10(-4,-2,70,-2,70,9,-4,9,-4,-2);
  PosGadText:=IntuiText(1,0,JAM1,2,0,nil,'Position',nil);
  PosGad:=Gadget(nil,247,242,67,8,GADGHBOX,RELVERIFY,BOOLGADGET,^PosBord,nil,^PosGadText,0,nil,42,0);
  AddGadget(MyWindow,^PosGad,nil);
  PrintPos;

  SwitchBord:=Border(0,0,1,0,JAM1,5,^SwitchBordXY,nil);
  SwitchBordXY:=IntArr10(-4,-2,101,-2,101,9,-4,9,-4,-2);
  SwitchGadText:=IntuiText(1,0,JAM1,1,0,nil,'Switch Sides',nil);
  SwitchGad:=Gadget(nil,430,242,98,8,GADGHBOX,RELVERIFY,BOOLGADGET,^SwitchBord,nil,^SwitchGadText,0,nil,43,0);
  AddGadget(MyWindow,^SwitchGad,nil);

  PrintNumbers;
  RefreshGadgets(MyWindow^.FirstGadget,MyWindow,nil);
 end;


{ Switch to next noise redurction, source, etc. }
procedure NextNR(NRSide:integer);
 begin
  if NR[NRSide]=5 then
   NR[NRSide]:=1
  else
   NR[NRSide]:=Succ(NR[NRSide]);
  PrintNR(NRSide);
 end;


procedure NextSource(SourceSide:integer);
 begin
  if Source[SourceSide]=9 then
   Source[SourceSide]:=1
  else
   Source[SourceSide]:=Succ(Source[SourceSide]);
  PrintSource(SourceSide);
 end;


procedure NextLength;
 begin
  if Length=5 then
   Length:=1
  else
   Length:=Succ(Length);
  PrintLength;
 end;


procedure NextPos;
 begin
  if Pos=3 then
   Pos:=1
  else
   Pos:=Succ(Pos);
  PrintPos;
 end;


procedure SwitchSides;
  var i     : integer;
      dummy : String[32];
 begin
  for i:=1 to 30 do
   begin
    dummy:=SongTex[i];
    SongTex[i]:=OtherSideTex[i];
    OtherSideTex[i]:=dummy;
   end;
  RefreshGadgets(MyWindow^.FirstGadget,MyWindow,nil);
  if Side=0 then
   Side:=1
  else
   Side:=0;
  PrintNumbers;
 end;


{ Load data-file. }
procedure LoadData;
  var i                           : integer;
      filename,fileID             : string;
      BodyIText,PosIText,NegIText : IntuiText;
      loadfile,answer             : boolean;
 begin
  loadfile:=false;
  while not loadfile do
   begin
    filename:=FileReq(MyWindow,'Load Data');
    if filename='' then exit;
    Reset(Output,filename);
    readln(Output,fileID);
    if fileID=fileIDstandard then loadfile:=true else
     begin
      BodyIText:=IntuiText(0,1,JAM2,30,5,nil,'This is no Data-File',nil);
      PosIText:=IntuiText(0,1,JAM2,6,3,nil,'Retry',nil);
      NegIText:=IntuiText(0,1,JAM2,6,3,nil,'Cancel',nil);
      answer:=AutoRequest(MyWindow,^BodyIText,^PosIText,^NegIText,RELVERIFY,RELVERIFY,250,60);
      if answer=false then exit;
     end;
   end;
   if side=1 then SwitchSides;
   for i:=1 to 4 do
    readln(Output,TitleTex[i]);
   for i:=1 to 15 do
    readln(Output,SongTex[i]);
   for i:=1 to 15 do
    readln(Output,OtherSideTex[i]);
   for i:=16 to 30 do
    readln(Output,SongTex[i]);
   for i:=16 to 30 do
    readln(Output,OtherSideTex[i]);
   for i:=1 to 2 do
    begin
     readln(Output,NR[i]);
     readln(Output,Source[i]);
     readln(Output,DateTex[i]);
    end;
   readln(Output,Length);
   readln(Output,Pos);
   Close(Output);
   RefreshGadgets(MyWindow^.FirstGadget,MyWindow,nil);
   for i:=1 to 2 do
    begin
     PrintNR(i);
     PrintSource(i);
    end;
   PrintLength;
   PrintPos;
  end;


{ Save data-file. }
procedure SaveData;
  var i        : integer;
      filename : string;
 begin
  filename:=FileReq(MyWindow,'Save Data');
  if filename<>'' then
   begin
    if Side=1 then SwitchSides;
    Rewrite(Output,filename);
    writeln(Output,fileIDstandard);
    for i:=1 to 4 do
     writeln(Output,TitleTex[i]);
    for i:=1 to 15 do
     writeln(Output,SongTex[i]);
    for i:=1 to 15 do
     writeln(Output,OtherSideTex[i]);
    for i:=16 to 30 do
     writeln(Output,SongTex[i]);
    for i:=16 to 30 do
     writeln(Output,OtherSideTex[i]);
    for i:=1 to 2 do
     begin
      writeln(Output,NR[i]);
      writeln(Output,Source[i]);
      writeln(Output,DateTex[i]);
     end;
    writeln(Output,Length);
    writeln(Output,Pos);
    Close(Output);
    DisplayBeep(MyScreen);
   end;
 end;


{ Erase present contents of the gadgest. }
procedure ClearData;
  var i                           : integer;
      BodyIText,PosIText,NegIText : IntuiText;
      answer                      : boolean;
 begin
  BodyIText:=IntuiText(0,1,JAM2,7,5,nil,'Data will be lost! Continue?',nil);
  PosIText:=IntuiText(0,1,JAM2,6,3,nil,'Yes, Please',nil);
  NegIText:=IntuiText(0,1,JAM2,6,3,nil,'Oh, No!',nil);
  answer:=AutoRequest(MyWindow,^BodyIText,^PosIText,^NegIText,RELVERIFY,RELVERIFY,260,60);
  if answer=false then exit;
  for i:=1 to 30 do
   begin
    SongTex[i]:=''; UndoSongTex[i]:='';
    OtherSideTex[i]:='';
   end;
  for i:=1 to 4 do
   begin
    TitleTex[i]:=''; UndoTitleTex[i]:='';
   end;
  DateTex[1]:=''; UndoDateTex[1]:='';
  DateTex[2]:=''; UndoDateTex[2]:='';
  DoVariables;
  RefreshGList(MyWindow^.FirstGadget,MyWindow,nil,-1);
  PrintNumbers;
  PrintNR(1); PrintNR(2);
  PrintSource(1); PrintSource(2);
  PrintLength;
  PrintPos;
 end;


{ Output line to whatever will receive it, either PRT: or a file. }
procedure PrintLine(TexA,TexB:String;Middle:Char);
  var PTexA,PTexB : string;
 begin
  PTexA:=TexA+Copy(spaces,1,31-StrLen(TexA));
  PTexB:=TexB+Copy(spaces,1,31-StrLen(TexB));
  writeln(Output,"| "+PTexA+" "+Middle+" "+PTexB+" |");
 end;


{ Print the cover made out of ASCII-character. }
procedure OutputCover(filename:string);
  var i          : integer;
      Middle     : char;
      pron,proff : string;
      ExtPrint   : boolean;
 begin
  pron:=chr(27)+"[4w"+chr(27)+"[2"+chr(34)+"z"+chr(27)+"(B";
  proff:=chr(27)+"[0w"+chr(27)+"[1"+chr(34)+"z";
  if Side=1 then SwitchSides;
  ExtPrint:=false;
  for i:=1 to 30 do
   if OtherSideTex[i]<>'' then ExtPrint:=True;
  ReWrite(Output,filename);
  write(Output,pron);
  writeln(Output,line);
  if ExtPrint then
   begin
    for i:=1 to 15 do
      PrintLine(OtherSideTex[i],OtherSideTex[i+15],"|");
    writeln(Output,line);
   end;
  Middle:="|"
  for i:=1 to 15 do
   begin
    if ExtPrint and (i=15) then Middle:="V";
    PrintLine(SongTex[i],SongTex[i+15],Middle);
   end;
  writeln(Output,line);
  PrintLine(TitleTex[1],TitleTex[2]," ");
  PrintLine(TitleTex[3],TitleTex[4]," ");
  writeln(Output,line);
  PrintLine("NR: "+NRText[NR[1]]+"   Source: "+SourceText[Source[1]],"NR: "+NRText[NR[2]]+"   Source: "+SourceText[Source[2]],"|");
  PrintLine("Date: "+DateTex[1],"Date: "+DateTex[2],"|");
  writeln(Output,"|"+Copy(spaces,1,15)+"C"+LengthText[Length]+Copy(spaces,1,24)+"Position: "+PosText[Pos]+Copy(spaces,1,8)+"|");
  writeln(Output,line);
  writeln(Output,proff);
  Close(Output);
  DisplayBeep(MyScreen);
 end;


{ Send cover to printer. }
procedure PrintCover;
 begin
  OutputCover('prt:');
 end;


{ Send cover to file. }
procedure SaveCover;
  var filename:string;
 begin
  filename:=FileReq(MyWindow,'Save Cover');
  if filename<>'' then OutputCover(filename);
 end;


{ Produce LaTeX-file. }
procedure SaveLaTeX;
  var i        : integer;
      filename : string;
      ExtPrint : boolean;
 begin
  filename:=FileReq(MyWindow,'Save LaTeX Source File');
  if filename<>'' then
   begin
    ExtPrint:=false;
    if Side=1 then SwitchSides;
    for i:=1 to 30 do
     if OtherSideTex[i]<>'' then ExtPrint:=True;
    Rewrite(Output,filename);
    writeln(Output,'\documentstyle{article}');
    writeln(Output,'\begin{document}');
    writeln(Output,'\pagestyle{empty}');
    writeln(Output,'\unitlength1mm');
    writeln(Output);
    if ExtPrint then
     begin
      writeln(Output,'\begin{picture}(102,161)(0,0)');
      writeln(Output,' \put(0,0){\framebox(102,161){}}');
      writeln(Output,' \put(51,29){\line(0,1){132}}');
      writeln(Output,' \put(0,95){\line(1,0){102}}');
     end
    else
     begin
      writeln(Output,'\begin{picture}(102,95)(0,0)');
      writeln(Output,' \put(0,0){\framebox(102,95){}}');
      writeln(Output,' \put(51,29){\line(0,1){66}}');
     end;
    writeln(Output,' \put(0,16){\framebox(102,13){}}');
    writeln(Output,' \put(0,6){\line(1,0){102}}');
    writeln(Output,' \put(51,6){\line(0,1){10}}');
    writeln(Output);
    writeln(Output,' \put(0,1){\makebox(51,5){C'+LengthText[Length]+'}}');
    writeln(Output,' \put(51,1){\makebox(51,5){Position: '+PosText[Pos]+'}}');
    writeln(Output,' \put(1,6){\makebox(24,5)[l]{Date: '+DateTex[1]+'}}');
    writeln(Output,' \put(52,6){\makebox(24,5)[l]{Date: '+DateTex[2]+'}}');
    writeln(Output,' \put(1,11){\makebox(21,5)[l]{NR: '+NRText[NR[1]]+'}}');
    writeln(Output,' \put(52,11){\makebox(21,5)[l]{NR: '+NRText[NR[2]]+'}}');
    writeln(Output,' \put(26,8.5){\makebox(24,5)[r]{Src: '+SourceText[Source[1]]+'}}');
    writeln(Output,' \put(77,8.5){\makebox(24,5)[r]{Src: '+SourceText[Source[2]]+'}}');
    writeln(Output);
    writeln(Output,' \put(1,22.5){\makebox(49,5.5)[l]{\large '+TitleTex[1]+'}}');
    writeln(Output,' \put(52,22.5){\makebox(49,5.5)[l]{\large '+TitleTex[2]+'}}');
    writeln(Output,' \put(1,17){\makebox(49,5.5)[l]{\large '+TitleTex[3]+'}}');
    writeln(Output,' \put(52,17){\makebox(49,5.5)[l]{\large '+TitleTex[4]+'}}');
    writeln(Output);
    if ExtPrint then
     begin
      for i:=1 to 15 do
       writeln(Output,' \put(1,',160.7-i*4.4,'){\makebox(49,4.1)[tl]{'+OtherSideTex[i]+'}}');
      writeln(Output);
      for i:=1 to 15 do
       writeln(Output,' \put(52,',160.7-i*4.4,'){\makebox(49,4.1)[tl]{'+OtherSideTex[i+15]+'}}');
     end;
    for i:=1 to 15 do
     writeln(Output,' \put(1,',94.7-i*4.4,'){\makebox(49,4.1)[tl]{'+SongTex[i]+'}}');
    writeln(Output);
    for i:=1 to 15 do
     writeln(Output,' \put(52,',94.7-i*4.4,'){\makebox(49,4.1)[tl]{'+SongTex[i+15]+'}}');
    writeln(Output);
    writeln(Output,'\end{picture}');
    writeln(Output);
    writeln(Output,'\end{document}');
    Close(Output);
    DisplayBeep(MyScreen);
   end;
 end;


{ Ahem, well, in case anybody is interested... }
procedure Copyright;
  var CopyWindow:^Window;
      CopyMsg:^IntuiMessage;
      line1,line2,line3:IntuiText;
 begin
  CopyWindow:=Open_Window(150,48,340,120,1,MOUSEBUTTONS,ACTIVATE,nil,MyScreen,300,160,300,160);
  line1:=IntuiText(1,0,JAM2,0,0,nil,'Cassette Cover Printer V1.1',^line2);
  line2:=IntuiText(1,0,JAM2,24,28,nil,'©1991 by Jörn Clausen',^line3);
  line3:=IntuiText(1,0,JAM2,44,56,nil,'This is Freeware',nil);
  PrintIText(CopyWindow^.RPort,^line1,62,28);
  while CopyMsg^.Class<>MOUSEBUTTONS do
   begin
    CopyMsg:=Wait_Port(CopyWindow^.UserPort);
    CopyMsg:=Get_Msg(CopyWindow^.UserPort);
   end;
  Close_Window(CopyWindow);
 end;


{ Hope you have enjoyed the program. }
procedure QuitProg;
  var BodyIText,PosIText,NegIText : IntuiText;
      answer                      : boolean;
 begin
  BodyIText:=IntuiText(0,1,JAM2,72,5,nil,'Really Quit?',nil);
  PosIText:=IntuiText(0,1,JAM2,6,3,nil,'Yes, Please',nil);
  NegIText:=IntuiText(0,1,JAM2,6,3,nil,'Oh, No!',nil);
  answer:=AutoRequest(MyWindow,^BodyIText,^PosIText,^NegIText,RELVERIFY,RELVERIFY,260,60);
  if answer=true then running:=false;
 end;


{ And clean up the mess (although Kick-Pascal promisses to do all this on its
  own, I prefer to close the things I used on my own). }
procedure CloseAll;
  var dummy : ptr;
 begin
  dummy:=RemoveGList(MyWindow,MyWindow^.FirstGadget,-1);
  ClearMenuStrip(MyWindow);
  Close_Window(MyWindow);
  Close_Screen(MyScreen);
 end;


{ Finally made it to the main loop? Keep on reading. }
begin
 DoVariables;
 DoScreen;
 DoMenu;
 DoGadgets;
 running:=true;
 while running=true do
  begin
   Msg:=Wait_Port(MyWindow^.UserPort);
   Msg:=Get_Msg(MyWindow^.UserPort);
   case Msg^.Class of
    _CLOSEWINDOW : QuitProg;
    GADGETUP     : begin
                    ClickGad:=Msg^.IAddress;
                    case ClickGad^.GadgetID of
                     1..14,16..29 : success:=ActivateGadget(^SongGad[ClickGad^.GadgetID+1],MyWindow,nil);
                            31,33 : success:=ActivateGadget(^TitleGad[ClickGad^.GadgetID-29],MyWindow,nil);
                               35 : NextNR(1);
                               36 : NextNR(2);
                               37 : NextSource(1);
                               38 : NextSource(2);
                               41 : NextLength;
                               42 : NextPos;
                               43 : SwitchSides;
                     OTHERWISE;
                    end;
                   end;
    MENUPICK     : begin
                    Picked:=Msg^.Code;
                    PMenu:=Picked and $1f;
                    PMenuItem:=(Picked and $7e0) div 32;
                    PMenuSubItem:=(Picked and $f800) div 2048;
                    case PMenu of
                     0 : case PMenuItem of
                          0 : LoadData;
                          1 : SaveData;
                          2 : ClearData;
                          3 : Copyright;
                          4 : QuitProg;
                         end;
                     1 : case PMenuItem of
                          0 : If PMenuSubItem=0 then
                               PrintCover
                              else
                               SaveCover;
                          1 : SaveLaTeX;
                         end;
                     OTHERWISE;
                    end;
                   end;
    OTHERWISE;
   end;
  end;
 CloseAll;
end.

