/**************************************************************************
 ***************             WORKBENCH-ASSIGN               ***************
 ***************              -Version 1.02-                ***************
 ***************           Last Changes: 9-Aug-88           ***************
 ***************             © 1988 by T.A.L.               ***************
 ***************           all rights reserved              ***************
 **************************************************************************/

/**************************************************************************
 ***************         INCLUDE-FILES & DEFINES            ***************
 **************************************************************************/
#include <exec/types.h>
#include <exec/nodes.h>
#include <exec/lists.h>
#include <exec/ports.h>
#include <exec/devices.h>
#include <devices/keymap.h>
#include <graphics/regions.h>
#include <graphics/copper.h>
#include <graphics/gels.h>
#include <graphics/gfxbase.h>
#include <graphics/gfx.h>
#include <graphics/clip.h>
#include <graphics/view.h>
#include <graphics/rastport.h>
#include <graphics/layers.h>
#include <hardware/blit.h>
#include <libraries/dos.h>
#include <libraries/dosextens.h>
#include <intuition/intuition.h>
#include <intuition/intuitionbase.h>
#define INT_REV 29

/**************************************************************************
 ***************            BORDER-DEFINITIONEN             ***************
 **************************************************************************/
SHORT Gadget0Vektors[]={ 0,0, 240,0, 240,11, 0,11, 0,1 };
struct Border Gadget0Border=
       { -3,-2, 1, 0, JAM1, 5, (SHORT *)Gadget0Vektors,NULL};

SHORT Gadget1Vektors[]={ 0,0, 240,0, 240,11, 0,11, 0,1 };
struct Border Gadget1Border=
       { -3,-2, 1, 0, JAM1, 5, (SHORT *)Gadget1Vektors,NULL};

SHORT Gadget2Vektors[]={ 2,0, 22,0, 22,11, 2,11, 2,1 };
SHORT MessageVektors[]={ 0,0, 285,0, 285,11, 0,11, 0,1 };
struct Border MessageBorder=
       { -290,-2, 1, 0, JAM1, 5, (SHORT *)MessageVektors,NULL};
struct Border Gadget2Border=
       { -3,-2, 1, 0, JAM1, 5, (SHORT *)Gadget2Vektors,&MessageBorder};

/**************************************************************************
 ***************      BENÖTIGTE STRUKTUREN & VARIABLEN      ***************
 **************************************************************************/
struct GfxBase *GfxBase;
struct IntuitionBase *IntuitionBase;
struct Gadget Gadget[3];
struct Gadget *TestGadget;
struct StringInfo Info[2];
struct Window *GadgetWindow;
struct NewWindow NewWindow;
struct IntuiText Print[3],BoolText;
struct RastPort *rp;
struct IntuiMessage *message;
extern struct FileHandle *Open();
char From[30] = "FONTS:", EndString1[30] = "", To[30] = "SYS:FONTS",
     EndString2[30] = "", Befehl[61] = "", Space[2] = " ",
     AssignText[10] = "C:Assign ";
long i;
int GadID;
BOOL ende,erfolg;
ULONG MessageClass;
USHORT MessageCode;

/**************************************************************************
 ***************         BEGINN DES HAUPTPROGRAMMS          ***************
 **************************************************************************/
main()
 {

/***************                 VARIABLEN                  ***************/
  struct FileHandle *Ausgabe;
  void StringAppend();

/***************           EINLESEN DER LIBRARIES           ***************/
  IntuitionBase = (struct IntuitionBase *)
                   OpenLibrary("intuition.library",INT_REV);
  if (IntuitionBase == NULL) exit(FALSE);

  GfxBase = (struct GfxBase *)
                   OpenLibrary("graphics.library",INT_REV);
  if (GfxBase == NULL) exit(FALSE);

/***************             GADGET-DEFINITIONEN            ***************/
  Info[0].Buffer=From;
  Info[0].UndoBuffer=EndString1;
  Info[0].MaxChars=30;
  Info[0].BufferPos=0;
  Info[0].DispPos=0;
  Info[0].UndoPos=0;

  Gadget[0].LeftEdge=10;
  Gadget[0].TopEdge=30;
  Gadget[0].Width=280;
  Gadget[0].Height=10;
  Gadget[0].Flags=GADGHCOMP;
  Gadget[0].Activation=TOGGLESELECT;
  Gadget[0].GadgetType=STRGADGET;
  Gadget[0].GadgetRender=(APTR)&Gadget0Border;
  Gadget[0].SelectRender=NULL;
  Gadget[0].GadgetText=NULL;
  Gadget[0].MutualExclude=NULL;
  Gadget[0].SpecialInfo=(APTR) &Info[0];
  Gadget[0].GadgetID=1;
  Gadget[0].UserData=NULL;
  Gadget[0].NextGadget=&Gadget[1];

  Info[1].Buffer=To;
  Info[1].UndoBuffer=EndString2;
  Info[1].MaxChars=30;
  Info[1].BufferPos=0;
  Info[1].DispPos=0;
  Info[1].UndoPos=0;

  Gadget[1].LeftEdge=10;
  Gadget[1].TopEdge=63;
  Gadget[1].Width=280;
  Gadget[1].Height=10;
  Gadget[1].Flags=GADGHCOMP;
  Gadget[1].Activation=TOGGLESELECT;
  Gadget[1].GadgetType=STRGADGET;
  Gadget[1].GadgetRender=(APTR)&Gadget1Border;
  Gadget[1].SelectRender=NULL;
  Gadget[1].GadgetText=NULL;
  Gadget[1].MutualExclude=NULL;
  Gadget[1].SpecialInfo=(APTR) &Info[1];
  Gadget[1].GadgetID=2;
  Gadget[1].UserData=NULL;
  Gadget[1].NextGadget=&Gadget[2];

  BoolText.ITextFont=NULL;
  BoolText.FrontPen=2;
  BoolText.BackPen=0;
  BoolText.DrawMode=JAM1;
  BoolText.LeftEdge=2;
  BoolText.TopEdge=0;
  BoolText.IText=(UBYTE *) "OK";
  BoolText.NextText=NULL;
  
  Gadget[2].LeftEdge=296;
  Gadget[2].TopEdge=79;
  Gadget[2].Width=20;
  Gadget[2].Height=10;
  Gadget[2].Flags=GADGHBOX;
  Gadget[2].Activation=TOGGLESELECT|GADGIMMEDIATE|RELVERIFY;
  Gadget[2].GadgetType=BOOLGADGET;
  Gadget[2].GadgetRender=(APTR)&Gadget2Border;
  Gadget[2].SelectRender=NULL;
  Gadget[2].GadgetText=&BoolText;
  Gadget[2].MutualExclude=NULL;
  Gadget[2].SpecialInfo=NULL;
  Gadget[2].GadgetID=3;
  Gadget[2].UserData=NULL;
  Gadget[2].NextGadget=NULL;

/***************              WINDOW-DEFINITION             ***************/
  NewWindow.LeftEdge=0;
  NewWindow.TopEdge=0;
  NewWindow.Width=330;
  NewWindow.Height=100;
  NewWindow.DetailPen=2;
  NewWindow.BlockPen=1;
  NewWindow.Title=(UBYTE *)"   WORKBENCH-ASSIGN - © 1988, T.A.L.";
  NewWindow.Flags=ACTIVATE|SMART_REFRESH|REPORTMOUSE;
  NewWindow.IDCMPFlags=REFRESHWINDOW|MOUSEBUTTONS|MOUSEMOVE|GADGETDOWN|
                       GADGETUP;
  NewWindow.Type=WBENCHSCREEN;
  NewWindow.FirstGadget=&Gadget[0];
  NewWindow.CheckMark=NULL;
  NewWindow.Screen=NULL;
  NewWindow.BitMap=NULL;
  NewWindow.MinWidth=0;
  NewWindow.MinHeight=0;
  NewWindow.MaxWidth=0;
  NewWindow.MaxHeight=0;
  GadgetWindow = (struct Window *) OpenWindow(&NewWindow);

/***************               TEXT-DEFINITIONEN            ***************/
  Print[0].ITextFont=NULL;
  Print[0].FrontPen=2;
  Print[0].BackPen=0;
  Print[0].DrawMode=JAM1;
  Print[0].LeftEdge=10;
  Print[0].TopEdge=17;
  Print[0].IText=(UBYTE *) "LOGISCHES DEVICE:";
  Print[0].NextText=&Print[1];

  Print[1].ITextFont=NULL;
  Print[1].FrontPen=2;
  Print[1].BackPen=0;
  Print[1].DrawMode=JAM1;
  Print[1].LeftEdge=10;
  Print[1].TopEdge=50;
  Print[1].IText=(UBYTE *) "DIRECTORY:";
  Print[1].NextText=NULL;
  
  Print[2].ITextFont=NULL;
  Print[2].FrontPen=2;
  Print[2].BackPen=0;
  Print[2].DrawMode=JAM1;
  Print[2].LeftEdge=10;
  Print[2].TopEdge=80;
  Print[2].NextText=NULL;

/***************               WINDOW-AUFBAU                ***************/
  rp=GadgetWindow->RPort;
  PrintIText(rp,&Print,0,0);
  RefreshGadgets(&Gadget[0],GadgetWindow,NULL);
  ende = FALSE;

/***************              ABFAGE-SCHLEIFE               ***************/
  for (;;)
   {
    if (message = (struct IntuiMessage *)GetMsg(GadgetWindow->UserPort))
     {
      MessageClass = message->Class;
      MessageCode  = message->Code;
      ReplyMsg(message);

      switch (MessageClass)
       {
        case GADGETDOWN  :
        case GADGETUP    : TestGadget = (struct Gadget *) message->IAddress;
                           GadID = TestGadget->GadgetID;
                           switch (GadID)
                            {
                             case 3: ende = TRUE;
                                     break;
                            }
                           break;
        case MOUSEBUTTONS: break;
       }
     }
    if (ende == TRUE)
     {
      StringAppend(Befehl,AssignText); StringAppend(Befehl,From);
      StringAppend(Befehl,Space); StringAppend(Befehl,To);
      Print[2].IText = (UBYTE *)&Befehl;
      PrintIText(rp,&Print[2],0,0);
      Ausgabe=Open("CON:0/100/640/155/Assign-OutPut",MODE_OLDFILE);
      if ((erfolg=Execute(Befehl,NULL,Ausgabe)) == FALSE) exit(FALSE);
      for (i=0;i<=200000;i++);
      Close (Ausgabe);
      CloseWindow(GadgetWindow);
      CloseLibrary(IntuitionBase);
      CloseLibrary(GfxBase);
      exit (TRUE);
     }
   }
 }

/***************                  FUNKTIONEN                ***************/
void StringAppend(s,t)
 register char *s,*t;
 {
  while (*s)
   s++;
  while(*s++ = *t++);
 }

