/* Events source file */

#include <stdlib.h>
#include <string.h>
#include <exec/types.h>
#include <intuition/intuition.h>
#include <intuition/gadgetclass.h>
#include <libraries/asl.h>
#include <clib/gadtools_protos.h>

#include "SimpleRexx_tm.h"
#include "FL_Panel.h"
#include "FL_Panel_rev.h"

/* Prototypes */
BOOL Call_FL	        (struct TMData *                                        ); /* found in FL_Panel.c */ 
BOOL EventFunc_SAVE     (struct TMData *, struct IntuiMessage *, TMOBJECTDATA * );
BOOL EventFunc_SAVEASM  (struct TMData *, struct IntuiMessage *, TMOBJECTDATA * );
BOOL EventFunc_ABOUT    (struct TMData *, struct IntuiMessage *, TMOBJECTDATA * );
BOOL EventFunc_QUIT     (struct TMData *, struct IntuiMessage *, TMOBJECTDATA * );
BOOL EventFunc_FLPNUMY  (struct TMData *, struct IntuiMessage *, TMOBJECTDATA * );
BOOL EventFunc_FLPSeed  (struct TMData *, struct IntuiMessage *, TMOBJECTDATA * );
BOOL EventFunc_FLPRaniz (struct TMData *, struct IntuiMessage *, TMOBJECTDATA * );
BOOL EventFunc_FLPNUMX  (struct TMData *, struct IntuiMessage *, TMOBJECTDATA * );
BOOL EventFunc_FILENAME (struct TMData *, struct IntuiMessage *, TMOBJECTDATA * );
BOOL EventFunc_MAKEFRAC (struct TMData *, struct IntuiMessage *, TMOBJECTDATA * );
BOOL EventFunc_SAVEAS   (struct TMData *, struct IntuiMessage *, TMOBJECTDATA * );
void DisableAllGadgets  ( struct TMData *                                        );
void EnableAllGadgets   ( struct TMData *                                        );
void SetXLevelGadget    ( struct TMData *                                        );
void SetYLevelGadget    ( struct TMData *                                        );
void SetNameGadgt       ( struct TMData *                                        );
void SetSeedGadget      ( struct TMData *, char * NewSeed                        );
void RandomizeSeed      ( void                                                   );
/* NewMenu UserData structures */
 
TMOBJECTDATA tmobjectdata_SAVE    = { EventFunc_SAVE    };
TMOBJECTDATA tmobjectdata_SAVEASM = { EventFunc_SAVEASM };
TMOBJECTDATA tmobjectdata_ABOUT   = { EventFunc_ABOUT   };
TMOBJECTDATA tmobjectdata_QUIT    = { EventFunc_QUIT    };

/* NewGadget UserData structures */
 
TMOBJECTDATA tmobjectdata_FLPNUMY  = { EventFunc_FLPNUMY  };
TMOBJECTDATA tmobjectdata_FLPSeed  = { EventFunc_FLPSeed  };
TMOBJECTDATA tmobjectdata_FLPRaniz = { EventFunc_FLPRaniz };
TMOBJECTDATA tmobjectdata_FLPNUMX  = { EventFunc_FLPNUMX  };
TMOBJECTDATA tmobjectdata_FILENAME = { EventFunc_FILENAME };
TMOBJECTDATA tmobjectdata_MAKEFRAC = { EventFunc_MAKEFRAC };
TMOBJECTDATA tmobjectdata_SAVEAS   = { EventFunc_SAVEAS   };

/* Global Var externs */
#include "FL_Panel_GlobExt.h"


void DisableAllGadgets ( struct TMData *TMData )
{
  GT_SetGadgetAttrs ( gadget_MAKEFRAC, window_AMIGAFLP, NULL, GA_Disabled, TRUE,  TAG_END );
  GT_SetGadgetAttrs ( gadget_FLPNUMY,  window_AMIGAFLP, NULL, GA_Disabled, TRUE,  TAG_END );
  GT_SetGadgetAttrs ( gadget_FLPNUMX,  window_AMIGAFLP, NULL, GA_Disabled, TRUE,  TAG_END );
  GT_SetGadgetAttrs ( gadget_FILENAME, window_AMIGAFLP, NULL, GA_Disabled, TRUE,  TAG_END );
  GT_SetGadgetAttrs ( gadget_FLPSeed,  window_AMIGAFLP, NULL, GA_Disabled, TRUE,  TAG_END );
  GT_SetGadgetAttrs ( gadget_FLPRaniz, window_AMIGAFLP, NULL, GA_Disabled, TRUE,  TAG_END );
  GT_SetGadgetAttrs ( gadget_SAVEAS,   window_AMIGAFLP, NULL, GA_Disabled, TRUE,  TAG_END );
  GT_SetGadgetAttrs ( gadget_FLPoints, window_AMIGAFLP, NULL, GA_Disabled, TRUE,  TAG_END );
}

void EnableAllGadgets ( struct TMData *TMData )
{
  GT_SetGadgetAttrs ( gadget_FLPoints, window_AMIGAFLP, NULL, GA_Disabled, FALSE, TAG_END );
  GT_SetGadgetAttrs ( gadget_SAVEAS,   window_AMIGAFLP, NULL, GA_Disabled, FALSE, TAG_END );
  GT_SetGadgetAttrs ( gadget_FLPRaniz, window_AMIGAFLP, NULL, GA_Disabled, FALSE, TAG_END );
  GT_SetGadgetAttrs ( gadget_FLPSeed,  window_AMIGAFLP, NULL, GA_Disabled, FALSE, TAG_END );
  GT_SetGadgetAttrs ( gadget_FILENAME, window_AMIGAFLP, NULL, GA_Disabled, FALSE, TAG_END );
  GT_SetGadgetAttrs ( gadget_FLPNUMX,  window_AMIGAFLP, NULL, GA_Disabled, FALSE, TAG_END );
  GT_SetGadgetAttrs ( gadget_FLPNUMY,  window_AMIGAFLP, NULL, GA_Disabled, FALSE, TAG_END );
  GT_SetGadgetAttrs ( gadget_MAKEFRAC, window_AMIGAFLP, NULL, GA_Disabled, FALSE, TAG_END );
}

/* Menu event functions */

BOOL EventFunc_SAVE(struct TMData *TMData, struct IntuiMessage *imsg, TMOBJECTDATA *tmobjectdata)
{
  return ( Call_FL ( TMData ) );
}

BOOL EventFunc_SAVEASM(struct TMData *TMData, struct IntuiMessage *imsg, TMOBJECTDATA *tmobjectdata)
{
  return EventFunc_SAVEAS(TMData, imsg, tmobjectdata);
}

BOOL EventFunc_ABOUT(struct TMData *TMData, struct IntuiMessage *imsg, TMOBJECTDATA *tmobjectdata)
{
  LONG  GadReturn = 0L;
  UBYTE  AboutInfo[] = {  "The Amiga Fractal Landscape Panel (C) 1996 by      \n"
                          "    Software Industry & General Hardware           \n"
                          "    ALL RIGHTS RESERVED                            \n"
                          "    Version: "
                          VERS
                          "\n\n"
                          "    Software Industry & General Hardware (S.I.G.H.)\n"
                          "    713 Hunter Street                              \n"
                          "    Ramona, CA 92065 USA (Pacific TZ)              \n"
                          "    Author : Clark Williams                        \n"
                          "    email  : clwilli@ibm.net                     \n\n"
                          "The Amiga Fractal Landscape Program by             \n"
                          "(C)1996 by Patrick Sauvageau (psauvage@aei.ca)\0"      };

  UBYTE *ABOUTinfo = &AboutInfo[0];

  GadReturn = TM_Request ( NULL, "Amiga Fractal Landscape Panel", ABOUTinfo, "Okay|Okay", NULL, NULL );
  return ( FALSE );
}

BOOL EventFunc_QUIT(struct TMData *TMData, struct IntuiMessage *imsg, TMOBJECTDATA *tmobjectdata)
{
  return ( TRUE );
}

/* Gadget event functions */
 
BOOL EventFunc_FLPSeed(struct TMData *TMData, struct IntuiMessage *imsg, TMOBJECTDATA *tmobjectdata)
{
    char NewSeed [ 16 ];
    int  i;

    for ( i = 0; i < 16; ++i ) { NewSeed [ i ] = '\0'; } /* Null out the seed string */
    strcpy ( NewSeed,
              (( struct StringInfo * ) gadget_FLPSeed->SpecialInfo)->Buffer);
    Seed = atoi ( NewSeed );
    return ( FALSE );
}

void SetNameGadget ( struct TMData *TMData )
{
    GT_SetGadgetAttrs ( gadget_FILENAME,
                        window_AMIGAFLP, NULL, GTST_String, UsersFileName, TAG_END );
    GT_RefreshWindow  ( window_AMIGAFLP, NULL );
}

void SetXLevelGadget ( struct TMData *TMData )
{
  GT_SetGadgetAttrs ( gadget_FLPNUMX, window_AMIGAFLP, NULL, GTSL_Level, XPointCardinality, TAG_END );
  GT_RefreshWindow  ( window_AMIGAFLP, NULL );
}

void SetYLevelGadget ( struct TMData *TMData )
{
  GT_SetGadgetAttrs ( gadget_FLPNUMY, window_AMIGAFLP, NULL, GTSL_Level, YPointCardinality, TAG_END );
  GT_RefreshWindow  ( window_AMIGAFLP, NULL );
}

void SetSeedGadget ( struct TMData *TMData, char * NewSeed )
{
 GT_SetGadgetAttrs ( gadget_FLPSeed,
                     window_AMIGAFLP, NULL, GTST_String, NewSeed, TAG_END );
 GT_RefreshWindow  ( window_AMIGAFLP, NULL );
}

void RandomizeSeed ( void )
{
    srand ( Seed ); /* Do the randomize */
    Seed = rand();  /* This is the value of the slider right now. */
}

BOOL EventFunc_FLPRaniz(struct TMData *TMData, struct IntuiMessage *imsg, TMOBJECTDATA *tmobjectdata)
{
    char NewSeed [ 16 ];
    int i;

    GT_SetGadgetAttrs ( gadget_FLPSeed, window_AMIGAFLP, NULL, GA_Disabled, TRUE, TAG_END );
    for ( i = 0; i < 16; ++i ) { NewSeed [ i ] = '\0'; } /* NULL out the seed string */
    strncpy ( NewSeed,
              (( struct StringInfo * ) gadget_FLPSeed->SpecialInfo)->Buffer, 8 );
    Seed = atoi ( NewSeed );

    RandomizeSeed(); /* Do the randomize */

    i = stcu_d ( NewSeed, Seed );
    SetSeedGadget ( TMData, NewSeed );
    GT_SetGadgetAttrs ( gadget_FLPSeed, window_AMIGAFLP, NULL, GA_Disabled, FALSE, TAG_END );
    return ( FALSE );
}

BOOL EventFunc_FLPNUMX(struct TMData *TMData, struct IntuiMessage *imsg, TMOBJECTDATA *tmobjectdata)
{
  XPointCardinality = imsg->Code; /* This is the value of the X slider right now. */
  return ( FALSE );
}

BOOL EventFunc_FLPNUMY ( struct TMData *TMData, struct IntuiMessage *imsg, TMOBJECTDATA *tmobjectdata )
{
  YPointCardinality = imsg->Code; /* This is the value of the X slider right now. */
  return ( FALSE );
}

BOOL EventFunc_FILENAME(struct TMData *TMData, struct IntuiMessage *imsg, TMOBJECTDATA *tmobjectdata)
{
    UBYTE FileName [ 150 ];

    strncpy ( FileName, UsersFileName, 149 );

    strncpy ( UsersFileName,
              (( struct StringInfo * ) gadget_FILENAME->SpecialInfo)->Buffer, 149 );

    /* Check to see if user entered a blank file name. */
    /* If they did, then put back old file name        */
    if ( !UsersFileName [ 0 ] ) {  strncpy ( UsersFileName, FileName, 149 ); }

    SetNameGadget ( TMData );
    return ( FALSE );
}

BOOL EventFunc_MAKEFRAC(struct TMData *TMData, struct IntuiMessage *imsg, TMOBJECTDATA *tmobjectdata)
{
  BOOL done = FALSE;

  DisableAllGadgets ( TMData );

  done = Call_FL ( TMData );

  EnableAllGadgets ( TMData );

  return ( done );
}

BOOL EventFunc_SAVEAS(struct TMData *TMData, struct IntuiMessage *imsg, TMOBJECTDATA *tmobjectdata)
{
    UBYTE *FileName;
    FileName = &UsersFileName[0];

    if ( NULL != getfilename( TMData,                              /* struct TMData *TMData */
                              "Enter Fractal Landscape File Name", /* UBYTE *title          */
                              FileName,                            /* UBYTE *buffer         */
                              (ULONG) 149,                         /* int    buflen         */
                              TMData->TMWindowInfo[1].Window,      /* struct WINDOW *Window */
                              TRUE                                 /* BOOL save             */ ) )
       {
         SetNameGadget ( TMData );
       }
    return ( FALSE );
}
