/*
  Auto: make
*/

extern struct ExecBase *SysBase;
struct IntuitionBase *IntuitionBase;
struct WorkbenchBase *WorkbenchBase;
struct GfxBase       *GfxBase;
struct IconBase      *IconBase;
struct GadToolsBase  *GadToolsBase;
struct MsgPort       *mp;
struct AppWindow     *aw;
struct Screen        *Scr;
struct Window        *mw;
struct Gadget        *GList;
struct Gadget        *Gadgets[NUMGAD];
struct TextAttr      ta;
struct List          foundproj;
struct Remember      *remember=NULL;
struct IntuiText     itext;
APTR  VisualInfo ;

struct IntuiText WrongKick = 
  {
  0,1,
  JAM2,
  10,10,
  NULL,
  (UBYTE *)"'cdp' benötigt Kick 2.0 oder höher",
  NULL
  };

struct IntuiText Schade = 
  {
  2,3,
  JAM2,
  5,3,
  NULL,
  (UBYTE *)" Schade ",
  NULL
  };

struct IntuiText Pech = 
  {
  2,3,
  JAM2,
  5,3,
  NULL,
  (UBYTE *)"  Pech  ",
  NULL
  };

void main();
void bail_out();

char *olddefproj[30] =NULL;
char *newdefproj[30] =NULL;


void main(argc, argv)
LONG argc;
BYTE **argv;
{
  BOOL inloop=TRUE;
  ULONG class; 
  USHORT code;
  ULONG winsig;
  ULONG appsig;  
  ULONG signals;
  ULONG receivedsig;
  UWORD fontheight;
  UWORD fontwidth;
  ULONG ILock;
  ULONG wvsize;

  struct IntuiMessage *winmsg;
  struct AppMessage   *appmsg;
  struct NewGadget     ng;
  struct Gadget       *g, *gad;

/*
if (argc==2)
  {
  Printf("So gehts: cdp <altes DefaultProject> <neues DefaultProject>\n\n",0);
  Printf("By: Andreas Obländer, Idee: Clemens Reifenrath\n\n",0);
  Printf("cdp (ChangeDefaultProject) ersetzt alle Defaultprojects von Project-\n",0);
  Printf("icons mit Namen \"altes DefaultProject\" durch \"neues DefaultProject\"\n",0);
  Printf("im aktuellen Verzeichnis.\n",0);
  bail_out(0);
  }
*/



  if(argc>=2)strncpy(olddefproj,argv[1],29); 
  if(argc>=3)strncpy(newdefproj,argv[2],29);




  if(!(IntuitionBase = (struct IntuitionBase *)
         OpenLibrary( "intuition.library", 36L )))
              {
              if (SysBase->LibNode.lib_Version < 36 )
                  {
                  if (IntuitionBase = (struct IntuitionBase *)
                       OpenLibrary( "intuition.library", 0L ))
                         AutoRequest(NULL,&WrongKick,&Schade,&Pech,0,0,320,60); 
                  bail_out(20);
                  } 
              Printf(" No intuition.library ?!?\n",0);
              bail_out(20);
              }


  if(!(WorkbenchBase = (struct WorkbenchBase *)
         OpenLibrary( WORKBENCH_NAME, 36L )))
              {
              Printf(" No workbench.library ?!?\n",0);
              bail_out(20);
              };

  if(!(GfxBase = (struct GfxBase *)
         OpenLibrary( "graphics.library", 0 )))
              {
              Printf(" No graphics.library ?!?\n",0);
              bail_out(20);
              };

  if(!(GadToolsBase = (struct GadToolsBase *)
         OpenLibrary( "gadtools.library", 36L )))
              {
              Printf(" No gadtools.library ?!?\n",0);
              bail_out(20);
              };

  if(!(IconBase = (struct IconBase *)
         OpenLibrary( ICONNAME, 0 )))
              {
              Printf(" No icon.library ?!?\n",0);
              bail_out(20);
              };

  /* Während ich in der IntuitionBase lese, möchte ich nicht, */
  /* daß sich der Bildschirm ändert */

  ILock=LockIBase(0L);
  Scr=IntuitionBase->ActiveScreen; /* Ich gehe davon aus, daß das die Workbench ist ... */
  UnlockIBase(ILock);


  if(!(VisualInfo = (APTR)GetVisualInfoA(Scr,NULL)))
              {
              Printf(" No Visualinfo!\n",0);
              bail_out(20);
              };

  if(!(g = CreateContext( &GList )))
              {
              Printf(" No CreateContext!\n",0);
              bail_out(20);
              };


  /* Ich hole mir den eingestellten DefaultFont, damit mich mein Fenster */
  /* entsprechend zeichnen kann */
  
  fontheight=GfxBase->DefaultFont->tf_YSize;
  fontwidth =GfxBase->DefaultFont->tf_XSize;
  
  /* die TextAttr-Struktur wird in der NewGadgetstruktur und in PrintIText gebraucht */

  ta.ta_Name=(STRPTR)GfxBase->DefaultFont->tf_Message.mn_Node.ln_Name;
  ta.ta_YSize=fontheight;
  ta.ta_Style=GfxBase->DefaultFont->tf_Style;
  ta.ta_Flags=GfxBase->DefaultFont->tf_Flags;

  wvsize = 15*fontheight;

    /* Newgadgetstruktur füllen */
    /* Daten fürs 2. Gadget von unten */

    ng.ng_LeftEdge        =    10*fontwidth;
    ng.ng_TopEdge         =    wvsize - 2*(fontheight+6); /* 2. Gadget von unten */
    ng.ng_Width           =    30*fontwidth;
    ng.ng_Height          =    fontheight+4;
    ng.ng_GadgetText      =    (UBYTE *)"Ersetze:";
    ng.ng_TextAttr        =    &ta;
    ng.ng_GadgetID        =    SEARCH_GADID;
    ng.ng_Flags           =    0;
    ng.ng_VisualInfo      =    VisualInfo;

    g = CreateGadget( STRING_KIND, g, &ng, GTST_MaxChars, 40
                                         , GTST_String, argv[1] ? (ULONG) olddefproj: 0     
                                         , TAG_DONE);
    SEARCH_GAD = g;


    /* Daten fürs 1. Gadget von unten */

    ng.ng_TopEdge         =    wvsize - 1*(fontheight+6); /* 1. Gadget von unten */
    ng.ng_GadgetID        =    REPLACE_GADID;
    ng.ng_GadgetText      =    (UBYTE *)"durch  :";

    g = CreateGadget( STRING_KIND, g, &ng, GTST_MaxChars, 40
                                         , GTST_String, argv[2] ? (ULONG) newdefproj: 0     
                                         , TAG_DONE);

    REPLACE_GAD = g;


    /* Daten fürs Listview-Gadget */

    ng.ng_TopEdge         =    20;
    ng.ng_Height          =    7*fontheight+4;
    ng.ng_GadgetText      =    NULL;
    ng.ng_GadgetID        =    LV_GADID;
    ng.ng_Flags           =    NG_HIGHLABEL|PLACETEXT_LEFT;

    g = CreateGadget( LISTVIEW_KIND, g, &ng, GTLV_Labels    , &foundproj,
                                             LAYOUTA_SPACING, 1,
                                             TAG_DONE);                 


    LV_GAD = g;

 

  /* Wenn das letzte Gadget erfolgreich erzeugt wurde, sind auch die anderen ok */
  /* Ich kann mich also darauf beschränken das letzte Gadget zu testen */

  if(!g)
              {
              Printf(" No CreateGadget!\n",0);
              bail_out(20);
              };

  /* Die fertige Liste der Gadgets in die "Newwindowstruktur" eintragen */


  /* ... und Window öffnen */

  if(!(mw = OpenWindowTags( 0L, WA_Left,          10
                              , WA_Top,           15
                              , WA_Width,         42*fontwidth
                              , WA_Height,        wvsize 
                              , WA_IDCMP,         IDCMP_CLOSEWINDOW|IDCMP_GADGETUP|IDCMP_GADGETDOWN|MOUSEMOVE
                              , WA_Flags,         WFLG_DRAGBAR|WFLG_DEPTHGADGET|WFLG_CLOSEGADGET|WFLG_SMART_REFRESH|WFLG_ACTIVATE
                              , WA_Gadgets,       GList
                              , WA_Title,         (ULONG)"cdp © 1992 Andreas Obländer"
                              , TAG_DONE )))
        {
        Printf(" No OpenWindowTags !\n",0);
        bail_out(15);
        };

  GT_RefreshWindow( mw, 0l );


  /*  Das Programm hat auch einen Namen */
  /*  Er wird in drei Zeilen links neben das Listviewgadget gezeichnet */

    ta.ta_Style=FSF_ITALIC;

    itext.FrontPen = 3;
    itext.BackPen = 0;
    itext.DrawMode = JAM1;
    itext.LeftEdge = 2*fontwidth;
    itext.TopEdge = wvsize - 6*(fontheight+6);
    itext.ITextFont = &ta;
    itext.NextText = NULL;

    /* das "C" von Change */

    itext.TopEdge = wvsize - 6*(fontheight+6);
    itext.IText = (UBYTE *)"C";
    PrintIText(mw->RPort, &itext, 0L, 0L);

    /* das "D" von Default */

    itext.TopEdge = wvsize - 5*(fontheight+6);
    itext.IText = (UBYTE *)"D";
    PrintIText(mw->RPort, &itext, 0L, 0L);

    /* das "P" von Project */

    itext.TopEdge = wvsize - 4*(fontheight+6);
    itext.IText = (UBYTE *)"P";
    PrintIText(mw->RPort, &itext, 0L, 0L);

    /* Jetzt in einer anderen Farbe und ein Zeichen weiter rechts den Rest schreiben */

    itext.FrontPen = 1;
    itext.LeftEdge = 3*fontwidth;

    /* das "hange" von Change */

    itext.TopEdge = wvsize - 6*(fontheight+6);
    itext.IText = (UBYTE *)"hange";
    PrintIText(mw->RPort, &itext, 0L, 0L);

    /* das "efault" von Default */

    itext.TopEdge = wvsize - 5*(fontheight+6);
    itext.IText = (UBYTE *)"efault";
    PrintIText(mw->RPort, &itext, 0L, 0L);

    /* das "roject" von Project */

    itext.TopEdge = wvsize - 4*(fontheight+6);
    itext.IText = (UBYTE *)"roject";
    PrintIText(mw->RPort, &itext, 0L, 0L);

    /* wieder zurück auf die normale Schriftart und JAM2 zum überschreiben von */
    /* bereits geschriebenem */

    ta.ta_Style=GfxBase->DefaultFont->tf_Style;
    itext.DrawMode = JAM2;
    itext.LeftEdge = 11*fontwidth;
    itext.TopEdge = wvsize - 3*(fontheight+5);

  /* Der MessagePort wird für AddAppWindow gebraucht */
  /* Bei Erfolg wird es ein Public Port mit Namen "cdp_appwindow" */

  if(!(mp = CreateMsgPort()))
              {
              Printf(" No CreateMsgPort !\n",0);
              bail_out(15);
              }
  else        {
              mp->mp_Node.ln_Pri = 0;
              mp->mp_Node.ln_Name = "cdp_appwindow";
              AddPort(mp);
              }

  /* Die Workbench wird mich durch diese Funktion benachrichtigen, wenn jemand */
  /* ein Icon in mein Window abgelegt hat */

  if(!(aw=AddAppWindow(0L,0L,mw,mp,0L)))
              {
              Printf("No AppWindow !\n",0);
              bail_out(15);
              }
  
  winsig = 1 <<  mw->UserPort->mp_SigBit; /* die IDCMP-Signale meines normale Windows */
  appsig = 1 <<  mp->mp_SigBit;           /* die Nachrichten von der WorkBench */
  signals = winsig | appsig;              /* Ich will auf beides reagieren     */

  while( inloop )
  {
    receivedsig=Wait( signals );          /* Warten auf irgendein Ereignis */
    if(receivedsig&winsig)                /* War es eine IDCMP-Nachricht vom Window? */
    {
      while(winmsg = (struct IntuiMessage *) GT_GetIMsg(mw->UserPort))
      {
        class = winmsg->Class;  
        code  = winmsg->Code;
        gad = (struct Gadget *)winmsg->IAddress;
        GT_ReplyIMsg( winmsg );           /* GT_ReplyIMsg zeichnet auch die Gadgets */
        switch( class )                   /* neu. z.B. SliderBar ... */
        {
          case CLOSEWINDOW:    
               inloop=FALSE;
               break;
          case GADGETUP:     
               switch (gad->GadgetID)
                {
                int i;
                struct Node *chosen;
                
                case LV_GADID:            /* Das LV_Gadget wurde angeklickt */
                                          /* ich suche mit Hilfe von "code" */
                                          /* den entsprechenden Eintrag aus */
                                          /* der Liste der gefundenen Project- */
                                          /* namen raus                        */

                  chosen=foundproj.lh_Head;
                  for  (i=0;i<code;i++) chosen=chosen->ln_Succ;

                                          /* kopiere ihn .... */
                  strncpy(olddefproj,chosen->ln_Name,29); 

                                          /* und trage ihn im "Suche"-gadget ein */

                  GT_SetGadgetAttrs(SEARCH_GAD, mw, NULL, GTST_MaxChars, 40
                                                        , GTST_String, (ULONG) olddefproj     
                                                        , TAG_DONE);
                  break;
                }  

        }
      }
    }
    if(receivedsig&appsig)    /* Es war eine Nachricht von der WorkBench */
    {
      while (appmsg = (struct AppMessage *) GetMsg (mp))
        {
        if(appmsg->am_Type == MTYPE_APPWINDOW)        
          {

          /* Benutzer informieren */
          itext.IText = (UBYTE *)"Einlesen...";
          PrintIText(mw->RPort, &itext, 0L, 0L);

          strncpy(olddefproj,((struct StringInfo *)SEARCH_GAD->SpecialInfo)->Buffer,29);
          strncpy(newdefproj,((struct StringInfo *)REPLACE_GAD->SpecialInfo)->Buffer,29);

          process_icons(appmsg->am_ArgList,appmsg->am_NumArgs); /* Hier gehts los !!! */

          /* Benutzer informieren */
          itext.IText = (UBYTE *)"           ";
          PrintIText(mw->RPort, &itext, 0L, 0L);

          }
        ReplyMsg(appmsg);
        }
    }  
  }
bail_out(0);
}

void bail_out(rc)
long rc;
{
if (remember) FreeRemember(&remember, TRUE);
if (aw) RemoveAppWindow( aw); 
if (mp) 
  {
  RemPort (mp);
  DeleteMsgPort (mp);
  }
if (mw) CloseWindow (mw);
if (GList)         FreeGadgets(GList);
if (VisualInfo)    FreeVisualInfo(VisualInfo);
if (IconBase)      CloseLibrary (IconBase);
if (GadToolsBase)  CloseLibrary (GadToolsBase);
if (GfxBase)       CloseLibrary (GfxBase);
if (WorkbenchBase) CloseLibrary (WorkbenchBase);
if (IntuitionBase) CloseLibrary (IntuitionBase);
exit(rc);  
}
