/*
 *  Source machine generated by GadToolsBox V2.0b
 *  which is (c) Copyright 1991-1993 Jaba Development
 *
 *  GUI Designed by : -- Heinz Reinert --
 */
#include <exec/types.h>
#include <string.h>
#include <intuition/intuition.h>
#include <intuition/classes.h>
#include <intuition/classusr.h>
#include <intuition/imageclass.h>
#include <intuition/gadgetclass.h>
#include <libraries/gadtools.h>
#include <graphics/displayinfo.h>
#include <graphics/GfxBase.h>
#include <clib/exec_protos.h>
#include <clib/intuition_protos.h>
#include <clib/gadtools_protos.h>
#include <clib/graphics_protos.h>
#include <clib/utility_protos.h>
#include <proto/intuition.h>
#include <proto/graphics.h>
#include <proto/exec.h>
#include <proto/dos.h>
#include <proto/gadtools.h>
#include <exec/memory.h>


/***************************************/
#define GetString( g )      ((( struct StringInfo * )g->SpecialInfo )->Buffer  )
#define GetNumber( g )      ((( struct StringInfo * )g->SpecialInfo )->LongInt )

#define GD_list                                0
#define GD_gadtxt                              1
#define GD_command                             2
#define GD_command2                            3
#define GD_new                                 4
#define GD_del                                 5
#define GD_start                               6
#define GD_save                                7
#define GD_req                                 8

#define GDX_list                               0
#define GDX_gadtxt                             1
#define GDX_command                            2
#define GDX_command2                           3
#define GDX_new                                4
#define GDX_del                                5
#define GDX_start                              6
#define GDX_save                               7
#define GDX_req                                8

#define Project0_CNT 9
UBYTE *vers = "\0$VER: StartWindow 2";

extern struct IntuitionBase *IntuitionBase;
extern struct Library       *GadToolsBase;

extern struct Screen        *Scr;
extern UBYTE                 *PubScreenName;
extern APTR                  VisualInfo;
extern struct Window        *Project0Wnd;
extern struct Gadget        *Project0GList;
extern struct Gadget        *Project0Gadgets[9];
extern UWORD                 Project0Left;
extern UWORD                 Project0Top;
extern UWORD                 Project0Width;
extern UWORD                 Project0Height;
extern UBYTE                *Project0Wdt;
extern struct TextAttr       topaz8;
extern UWORD                 Project0GTypes[];
extern struct NewGadget      Project0NGad[];
extern ULONG                 Project0GTags[];


extern int SetupScreen( void );
extern void CloseDownScreen( void );
extern int OpenProject0Window( void );
extern void CloseProject0Window( void );

/***************************************/

struct Screen         *Scr = NULL;
UBYTE                 *PubScreenName = NULL;
APTR                   VisualInfo = NULL;
struct Window         *Project0Wnd = NULL;
struct Gadget         *Project0GList = NULL;
struct Gadget         *Project0Gadgets[9];
UWORD                  Project0Left = 440;
UWORD                  Project0Top = 10;
UWORD                  Project0Width = 190;
UWORD                  Project0Height = 0;
UBYTE                 *Project0Wdt = (UBYTE *)"StartWindow2";

struct TextAttr topaz8 = {
        ( STRPTR )"topaz.font", 8, 0x00, 0x01 };

UWORD Project0GTypes[] = {
        LISTVIEW_KIND,
        STRING_KIND,
        STRING_KIND,
        STRING_KIND,
        BUTTON_KIND,
        BUTTON_KIND,
        BUTTON_KIND,
        BUTTON_KIND,
        BUTTON_KIND
};

struct NewGadget Project0NGad[] = {
        4, 2, 161, 88, NULL, NULL, GD_list, 0, NULL, NULL,
        4, 86, 138, 12, NULL, NULL, GD_gadtxt, 0, NULL, NULL,
        4, 98, 161, 12, NULL, NULL, GD_command, 0, NULL, NULL,
        4, 110, 161, 12, NULL, NULL, GD_command2, 0, NULL, NULL,
        4, 122, 54, 11, (UBYTE *)"NEW", NULL, GD_new, PLACETEXT_IN, NULL, NULL,
        114, 122, 51, 11, (UBYTE *)"DEL", NULL, GD_del, PLACETEXT_IN, NULL, NULL,
        4, 133, 161, 13, (UBYTE *)"RUN", NULL, GD_start, PLACETEXT_IN, NULL, NULL,
        59, 122, 54, 11, (UBYTE *)"SAVE", NULL, GD_save, PLACETEXT_IN, NULL, NULL,
        142, 86, 23, 12, (UBYTE *)"R", NULL, GD_req, PLACETEXT_IN, NULL, NULL
};

ULONG Project0GTags[] = {
        (TAG_DONE),
        (GTST_MaxChars), 256, (TAG_DONE),
        (GTST_MaxChars), 256, (TAG_DONE),
        (GTST_MaxChars), 256, (TAG_DONE),
        (TAG_DONE),
        (TAG_DONE),
        (TAG_DONE),
        (TAG_DONE),
        (TAG_DONE)
};

int SetupScreen( void )
{
        if ( ! ( Scr = LockPubScreen( PubScreenName )))
                return( 1L );

        if ( ! ( VisualInfo = GetVisualInfo( Scr, TAG_DONE )))
                return( 2L );

        return( 0L );
}

void CloseDownScreen( void )
{
        if ( VisualInfo ) {
                FreeVisualInfo( VisualInfo );
                VisualInfo = NULL;
        }

        if ( Scr        ) {
                UnlockPubScreen( NULL, Scr );
                Scr = NULL;
        }
}

int OpenProject0Window( void )
{
        struct NewGadget        ng;
        struct Gadget   *g;
        UWORD           lc, tc;
        UWORD           offx = Scr->WBorLeft, offy = Scr->WBorTop + Scr->RastPort.TxHeight + 1;

        if ( ! ( g = CreateContext( &Project0GList )))
                return( 1L );

        for( lc = 0, tc = 0; lc < Project0_CNT; lc++ ) {

                CopyMem((char * )&Project0NGad[ lc ], (char * )&ng, (long)sizeof( struct NewGadget ));

                ng.ng_VisualInfo = VisualInfo;
                ng.ng_TextAttr   = &topaz8;
                ng.ng_LeftEdge  += offx;
                ng.ng_TopEdge   += offy;

                Project0Gadgets[ lc ] = g = CreateGadgetA((ULONG)Project0GTypes[ lc ], g, &ng, ( struct TagItem * )&Project0GTags[ tc ] );

                while( Project0GTags[ tc ] ) tc += 2;
                tc++;

                if ( NOT g )
                        return( 2L );
        }

        if ( ! ( Project0Wnd = OpenWindowTags( NULL,
                                WA_Left,        Project0Left,
                                WA_Top,         Project0Top,
                                WA_Width,       Project0Width,
                                WA_Height,      Project0Height + offy,
                                WA_IDCMP,       LISTVIEWIDCMP|STRINGIDCMP|BUTTONIDCMP|IDCMP_CLOSEWINDOW|IDCMP_REFRESHWINDOW,
                                WA_Flags,       WFLG_SIZEGADGET|WFLG_DRAGBAR|WFLG_DEPTHGADGET|WFLG_CLOSEGADGET|WFLG_SMART_REFRESH,
                                WA_Gadgets,     Project0GList,
                                WA_Title,       Project0Wdt,
                                WA_ScreenTitle, "StartWindow2 Heinz Reinert 1994",
                                WA_PubScreen,   Scr,
                                WA_MinWidth,    190,
                                WA_MinHeight,   160,
                                WA_MaxWidth,    190,
                                WA_MaxHeight,   160,
                                TAG_DONE )))
        return( 4L );

        GT_RefreshWindow( Project0Wnd, NULL );

        return( 0L );
}

void CloseProject0Window( void )
{
        if ( Project0Wnd        ) {
                CloseWindow( Project0Wnd );
                Project0Wnd = NULL;
        }

        if ( Project0GList      ) {
                FreeGadgets( Project0GList );
                Project0GList = NULL;
        }
}

/*********************************************/
/* Main Program Part */


/* Structur for Data-Entries */

struct PRJ {

    char    Name[0];

    char    gadtxt[20];
    char    command[75];
    char    command2[75];
    USHORT  new;
    USHORT  del;
    USHORT  save;
    USHORT  req;
    USHORT  start;
};

struct PRJnode {
        struct  Node n;
        struct  PRJ d;
};

/* PRJ-Nodes are in this List */

struct List prjlist;

/* The actual Entry */

struct PRJnode *currentprj;

/* String-Gadgets */

void gt_SetString( struct Gadget        *gad,
                                   struct Window        *w,
                                   char                         *string )
{
        GT_SetGadgetAttrs( gad, w, NULL, GTST_String, string, TAG_DONE );
}

char * gt_GetString( struct Gadget      *gad )
{
        struct StringInfo *si = gad->SpecialInfo;

        if( si )
                return( ( char * ) si->Buffer );
        else
                return( NULL );
}

/* Manage Lists for Listview-Gadgets */
/* Add List */

void gt_AttachList(     struct Gadget   *lv,
                                        struct Window   *w,
                                        struct List     *list )
{
        GT_SetGadgetAttrs( lv, w, NULL, GTLV_Labels, list, TAG_DONE );
}

/* Put Actuel Entry */

void gt_SetLV( struct Gadget    *gad,
                           struct Window        *w,
                           ULONG                        value)
{
        GT_SetGadgetAttrs( gad, w, NULL, GTLV_Selected, value, TAG_DONE );
}

/* get x-Entry from Exec-List */

struct Node * gt_GetListEntry( struct List *l,
                                                           int num )
{
        int count = 0;
        struct Node *n = l->lh_Head;

        while( n->ln_Succ )
        {
                if( num==count ) return( n );
                n = n->ln_Succ;
                count++;
        }
        return( NULL );
}

/* Number of a Node in List? */

int gt_GetListEntryNum( struct List *l,
                                                struct Node *n )
{
        int count = 0;
        struct Node *r = l->lh_Head;

        while( r->ln_Succ )
        {
                if( r==n ) return( count );
                r = r->ln_Succ;
                count++;
        }
        return( -1 );
}

/* Count Entries of List */

int gt_GetListNumEntries( struct List *l )
{
        int count = 0;
        struct Node *n = l->lh_Head;

        while( n->ln_Succ )
        {
                n = n->ln_Succ;
                count++;
        }

        return( count );
}

/************************************************************************/

/* Load Command.DAT */

void loadprjlist( void )
{
        struct PRJ new;
        struct PRJnode *n;
        BPTR f;

        /* Init List */
        NewList( &prjlist );
        currentprj = NULL;

        /* Open Command.DAT */
        f = Open( "S:Command.DAT", MODE_OLDFILE );
        if( !f )
                return;

        /* Inputs read in */
        while( Read( f, &new, sizeof( new ) ) == sizeof( new ) )
        {
               /* New Node */
                n = AllocVec( sizeof( *n ), 0 );
                if( !n )
                        break;

        /* Copy Structur and add to List */
                n->d = new;
                n->n.ln_Name = n->d.Name;
                n->n.ln_Pri      = - n->d.Name[0];
                Enqueue( &prjlist, (struct Node *) n );
        }

        Close( f );
}

/* Saves List and Frees it */
void save_and_freeprjlist( void )
{
        struct PRJnode *n;
        BPTR f;

        f = Open( "S:Command.DAT", MODE_NEWFILE );

        while( ( n = (struct PRJnode * ) RemHead( &prjlist ) ) )
        {
            /* Save Node */
                if( f )
                        Write( f, &n->d, sizeof( struct PRJ ) );
            /* Free Node */
                FreeVec( n );
        }

        if( f )
                Close( f );
}


/************************************************************************/

/* Puts actual Structur-Values to Gadgets */

void setgadvals( void )
{

        if( !currentprj )
            return;

        gt_SetString(   Project0Gadgets[ GD_gadtxt ], Project0Wnd,
                                                       currentprj->d.Name );

        gt_SetString(   Project0Gadgets[ GD_command ], Project0Wnd,
                                                    currentprj->d.command );

        gt_SetString(   Project0Gadgets[ GD_command2 ], Project0Wnd,
                                                    currentprj->d.command2 );

}

/* Create a new Empty Input */

void newprj( void )
{
        struct PRJnode *new;

        new = AllocVec( sizeof( *new ), MEMF_CLEAR );

        if( !new )
                return;

        currentprj = new;

        new->n.ln_Name = new->d.Name;

        strcpy( new->d.Name, "new" );

        gt_AttachList( Project0Gadgets[GD_list], Project0Wnd,
                                                      (struct List *) ~0 );

        new->n.ln_Pri    = - new->d.Name[0];
        Enqueue( &prjlist, (struct Node *) new );

        gt_AttachList( Project0Gadgets[GD_list], Project0Wnd, &prjlist );

        gt_SetLV( Project0Gadgets[GD_list], Project0Wnd,
                                     gt_GetListEntryNum( &prjlist, new ) );
        setgadvals();
}

/* Work on Gadget-Event */
void dogadup( struct IntuiMessage *im )
{
        struct Gadget *g = im->IAddress;

        switch( g->GadgetID )
        {

/*** Enter List ***/
case GD_list:
        currentprj = (struct PRJnode *) gt_GetListEntry( &prjlist, im->Code );
        setgadvals();
        break;

/*** New ***/
case GD_new:
        newprj();
        break;

/*** Delete ***/
case GD_del:
        if( currentprj )
        {
        gt_AttachList( Project0Gadgets[ GD_list ], Project0Wnd,
                                                       (struct List *) ~0 );
        Remove( currentprj );
        FreeVec( currentprj );
        currentprj = FALSE;
        gt_AttachList( Project0Gadgets[ GD_list ], Project0Wnd, &prjlist );
        gt_SetLV( Project0Gadgets[ GD_list ], Project0Wnd, ~0 );
        }
        break;
/*** Program Name ***/
case GD_gadtxt:
        if( currentprj )
        {
        gt_AttachList( Project0Gadgets[ GD_list ], Project0Wnd,
                                                         (struct List *) ~0 );
   strcpy( currentprj->d.Name, gt_GetString( Project0Gadgets[ GD_gadtxt ] ) );
        gt_AttachList( Project0Gadgets[ GD_list ], Project0Wnd, &prjlist );
        }
        break;

/*** Command-string ***/
case GD_command:
        if( currentprj )
        strcpy( currentprj->d.command,
                             gt_GetString( Project0Gadgets[ GD_command ] ) );
        break;

/*** Command-string ***/
case GD_command2:
        if( currentprj )
        strcpy( currentprj->d.command2,
                             gt_GetString( Project0Gadgets[ GD_command2 ] ) );
        break;

/*** Start Program ***/
case GD_start:
        Execute(currentprj->d.command, NULL, Output());
        Execute("WAIT 2 secs ", NULL, Output());
        Execute(currentprj->d.command2, NULL, Output());
        break;

/*** Save List ***/
case GD_save:
        {
            save_and_freeprjlist();
            loadprjlist();
        }
        break;

/*** Requester ***/
case GD_req:
           Execute("RUN >NIL: RequShell", NULL, Output());
        break;
        }
}

/* Program start */

int main( void )
{

        struct IntuiMessage     *im,imsg;
        BOOL   Done = FALSE;

        /*** Open Screen and Window ***/
        SetupScreen();
        OpenProject0Window();

        /*** Load List ***/
        loadprjlist();

        /*** Show List ***/
        gt_AttachList( Project0Gadgets[GD_list], Project0Wnd, &prjlist );

        /*** Main Loop ***/
        while( !Done )
        {
                /*** Wait for IntuiMessage ***/

                while( !( im=GT_GetIMsg( Project0Wnd->UserPort ) ) )
                        WaitPort( Project0Wnd->UserPort );

                /*** Copy ***/
                imsg = *im;
                GT_ReplyIMsg( im );

                switch( imsg.Class )
                {
            /*** CLOSEWINDOW: Close Window ***/
                        case IDCMP_CLOSEWINDOW:
                                Done = TRUE;
                                break;

            /*** Gadgetup; Gadget selected ***/
                        case GADGETUP:
                                dogadup( &imsg );
                                break;

            /*** REFRESH: Graphicobjects (Boxen) redraw ***/
                        case IDCMP_REFRESHWINDOW:
                                GT_BeginRefresh( Project0Wnd );
                                GT_EndRefresh( Project0Wnd, TRUE );
                                break;

                }

        }

        /*** Close Window and Screen ***/
        CloseProject0Window();
        CloseDownScreen();

        /*** Save List ***/
        save_and_freeprjlist();

        return(0);
}








