/*
 *  CELLS       An Implementation of the WireWorld cellular automata
 *              as described in Scientific American, Jan 1990.
 *
 *              Copyright 1990 by Davide P. Cervone.
 *  You may use this code, provided this copyright notice is kept intact.
 *  See the CELLS.HELP file for complete information on distribution conditions.
 */

/*
 *  File:  cReqLS.c             Data structures for the File Requester.
 */


#include "Cells.h"
#include "cRequest.h"
#include "cReqLS.h"
#include "cBoxes.h"

#define DATAIMAGE(data,w,h)   {0,0, w,h,2, &data[0], 3,0, NULL}

extern USHORT DLeftArrowData[];
extern USHORT CheckData[];


static short PanelBox[]   = FBOX(LS_PANELW,LS_PANELH);
static short Frame1Box[]  = FBOX(LS_FRAME1W,LS_FRAME1H);
static short Frame2Box[]  = FBOX(LS_FRAME2W,LS_FRAME2H);
static short NameBox[]    = FBOX(LS_NAMEW,LS_NAMEH);
static short NListBox[]   = FBOX(LS_NLISTW,LS_NLISTH);
static short SlideBox[]   = VBOX(LS_SLIDEW,LS_SLIDEH);
static short CheckBox[]   = FBOX(LS_CHECKW+2,LS_CHECKH+2);
static short MessageBox[] = FBOX(LS_MESSAGEW,LS_MESSAGEH);
static short DirBox[]     = HBOX(LS_DIRW,LS_DIRH);
static short ButtonBox[]  = FBOX(LS_BUTTONW,LS_BUTTONH);

static struct Border LSBorder[] =
{
      #define NEXTBORDER(n)     &LSBorder[n+2]
      #define BORDERNAME        LSBorder
   OUTBRDR(LSB_PANEL,  0,0, PanelBox),
   INBRDR (LSB_FRAME1, LS_FRAME1X,LS_FRAME1Y, Frame1Box),
   INBRDR (LSB_FRAME2, LS_FRAME2X,LS_FRAME2Y, Frame2Box),
   INBRDR (LSB_NAME,   LS_NAMEX,LS_NAMEY, NameBox),
   OUTBRDR(LSB_SLIDE,  LS_SLIDEX,LS_SLIDEY, SlideBox),
   OUTBRDR(LSB_CHECK,  LS_CHECKX-1,LS_CHECKY-1, CheckBox),
   INBRDR (LSB_MESSAGE, LS_MESSAGEX,LS_MESSAGEY, MessageBox),
      #undef  NEXTBORDER
      #define NEXTBORDER(n)     NULL
   OUTBRDR(LSB_DIR,     LS_DIRX,LS_DIRY, DirBox),
   INBRDR (LSB_NLIST,   LS_NLISTX,LS_NLISTY, NListBox),
   OUTBRDR(LSB_BUTTON,  0,0, ButtonBox),
};

static struct Image LSImage[] =
{
   IMAGE(-1,-1,LS_NAMEW-2,LS_NAMEH-2,BACKGROUND),
   IMAGE(0,0,0,0, FOREGROUND),
   IMAGE(LS_SLIDEX+1,LS_SLIDEY+1,LS_SLIDEW-2,LS_SLIDEH-2,BACKGROUND),
   IMAGE(1,1,LS_NLISTW-2,LS_NLISTH-2,BACKGROUND),
   IMAGE(1,1,LS_NLISTW-2,LNAMEH,TEXTSELECT),
   DATAIMAGE(DLeftArrowData,TEXTH,TEXTH),
   DATAIMAGE(CheckData,LS_CHECKW,LS_CHECKH),
   IMAGE(0,0,LS_CHECKW,LS_CHECKH,FOREGROUND),
   IMAGE(1,1,LS_MESSAGEW-2,LS_MESSAGEH-2,FOREGROUND),
   IMAGE(1,1,LS_DIRW-2,LS_DIRH-2,FOREGROUND),
};

char LSDirName[MAXFNAME];

struct IntuiText LSText[] =
{
   ITEXT(NULL,     15,4),
   ITEXT("Drive",  12,4),
   ITEXT("Info",   15,4),
   ITEXT("Delete",  9,4),
   ITEXT("MakeDir", 7,4),
   ITEXT("Cancel",  9,4),
   ITEXT(&LSDirName[0], 0,2),
   ITEXT(NULL, LS_CHECKW+5,0),
   ITEXT(NULL, 0,2),
   CTEXT(NULL, 3,1,BACKGROUND),
   CTEXT(NULL, 3,1,BACKGROUND),
   ITEXT("                    ", 3,2),      /* NList */
   ITEXT("                    ", 3,2),
   ITEXT("                    ", 3,2),
   ITEXT("                    ", 3,2),
   ITEXT("                    ", 3,2),
   ITEXT("                    ", 3,2),
   ITEXT("                    ", 3,2),
   ITEXT("                    ", 3,2),
};

char LSNameBuf[MAXFNAME];
extern char UndoBuffer[];

static struct StringInfo LSNameInfo =
   {&LSNameBuf[0], &UndoBuffer[0], 0,MAXFNAME, 0, 0,0,0, 0,0, NULL, 0, NULL};

struct PropInfo LSSlider =
   {AUTOKNOB|FREEVERT|PROPBORDERLESS,0,0,0xFFFF,0xFFFF, 0,0,0,0,0,0};


#define BUTTON(n)\
{\
   &LSGadget[n+1], LS_BUTTONX,LS_BUTTONY+LS_BUTSEP*n,\
   LS_BUTTONW,LS_BUTTONH, GADGHCOMP, RELVERIFY, BOOLGADGET| REQGADGET,\
   (APTR)&LSBorder[LSB_BUTTON],NULL, &LSText[n], 0, NULL, n, NULL\
}

#define NLIST(n)\
{\
   &LSGadget[n+1], LS_NLISTX,LS_NLISTY, LS_NLISTW,LS_NLISTH,\
   GADGHNONE|GADGIMAGE|GADGDISABLED, GADGIMMEDIATE,\
   BOOLGADGET|REQGADGET, (APTR)&LSImage[LSI_BLANK],NULL, NULL,\
   0, NULL, n, (APTR)&LSListInfo\
}

#define NAME(n)\
{\
   &LSGadget[n+1], LS_NAMEX+2,LS_NAMEY+2,LS_NAMEW-4,LS_NAMEH-4,\
   GADGHCOMP|GADGIMAGE, GADGIMMEDIATE|RELVERIFY, STRGADGET|REQGADGET,\
   (APTR)&LSImage[LSI_NAME], NULL, NULL, 0, (APTR)&LSNameInfo, n,\
   (APTR)&LSListInfo\
}

#define ARROW(n,x,y,im)\
{\
   &LSGadget[n+1], x,y,SLIDEWH,SLIDEWH, GADGHCOMP|GADGIMAGE|GADGDISABLED,\
   GADGIMMEDIATE|RELVERIFY, BOOLGADGET|REQGADGET, (APTR)&cImage[im],\
   NULL, NULL, NULL,NULL, n, (APTR)&LSListInfo\
}

#define DIR(n)\
{\
   &LSGadget[n+1], LS_DIRX,LS_DIRY, LS_DIRW,LS_DIRH, GADGHCOMP|GADGIMAGE,\
   RELVERIFY, BOOLGADGET|REQGADGET, (APTR)&LSImage[LSI_DIR],NULL,\
   &LSText[LST_DIR], 0, NULL, n, (APTR)&LSListInfo\
}

#define DARROW(n)\
{\
   &LSGadget[n+1], LS_DLARROWX,LS_DLARROWY,TEXTH,TEXTH, GADGHCOMP|GADGIMAGE,\
   GADGIMMEDIATE|RELVERIFY,BOOLGADGET|REQGADGET, (APTR)&LSImage[LSI_DLARROW],\
   NULL, NULL, NULL,NULL, n, (APTR)&LSListInfo\
}

#define CHECK(n)\
{\
   &LSGadget[n+1], LS_CHECKX,LS_CHECKY, LS_CHECKW+LS_CTEXTW,LS_CHECKH,\
   GADGHIMAGE|GADGIMAGE, TOGGLESELECT|GADGIMMEDIATE, BOOLGADGET|REQGADGET,\
   (APTR)&LSImage[LSI_NOCHECK], (APTR)&LSImage[LSI_CHECK],\
   &LSText[LST_CHECK], NULL,NULL, n, NULL\
}

#define SLIDER(n)\
{\
   &LSGadget[n+1], LS_SLIDEX+2,LS_SLIDEY+2,LS_SLIDEW-4,LS_SLIDEH-4,\
   GADGHCOMP|GADGIMAGE|GADGDISABLED, GADGIMMEDIATE|RELVERIFY,\
   PROPGADGET|REQGADGET, (APTR)&LSImage[LSI_SLIDE], NULL, NULL, NULL,\
   (APTR)&LSSlider, n, (APTR)&LSListInfo\
}

#define MESSAGE(n)\
{\
   &LSGadget[n+1], LS_MESSAGEX,LS_MESSAGEY, LS_MESSAGEW,LS_MESSAGEH,\
   GADGHNONE|GADGIMAGE, GADGIMMEDIATE, BOOLGADGET|REQGADGET,\
   (APTR)&LSImage[LSI_MESSAGE], NULL, NULL, NULL,NULL, n,\
   (APTR)&LSText[LST_MESS1]\
}

#define ENDLIST\
   {&LSGadget[LS_IMGADG], 0,0,0,0, GADGHNONE, 0, BOOLGADGET|REQGADGET,\
   (APTR)&LSBorder[LSB_NLIST],NULL, NULL, NULL,NULL, LS_BRDRGADG,NULL},\
   {NULL, 0,0,0,0, GADGHNONE|GADGIMAGE, 0, BOOLGADGET|REQGADGET,\
   (APTR)&LSImage[LSI_SBACK],NULL, NULL, NULL,NULL, LS_IMGADG,NULL}

static struct Gadget LSGadget[] =
{
   BUTTON(LS_LOAD),
   BUTTON(LS_DRIVE),
   BUTTON(LS_INFO),
   BUTTON(LS_DELETE),
   BUTTON(LS_MAKEDIR),
   BUTTON(LS_CANCEL),
   NAME  (LS_NAME),
   NLIST (LS_NLIST),
   SLIDER(LS_SLIDE),
   ARROW (LS_UARROW,LS_UARROWX,LS_UARROWY,LSI_UARROW),
   ARROW (LS_DARROW,LS_DARROWX,LS_DARROWY,LSI_DARROW),
   DIR   (LS_DIR),
   DARROW(LS_DLARROW),
   CHECK (LS_CHECK),
   MESSAGE(LS_MESSAGE),
   ENDLIST
};

struct ExtRequest LSRequest =
{
   {NULL, 0,0, LS_PANELW,LS_PANELH, 0,0, &LSGadget[0], &LSBorder[LSB_PANEL],
    &LSText[LST_TITLE], 0, FOREGROUND, NULL, NULL, NULL},
   NULL,NULL,NULL, &LSGadget[LS_NAME],
};

struct ListInfo LSListInfo =
{
   &LSRequest, &LSGadget[LS_NLIST], &LSGadget[LS_NAME], &LSGadget[LS_SLIDE],
   NULL, NULL, NULL, &LSText[LST_NLIST0], &LSImage[LSI_BLANK],
   8,20, 0,0, LI_NOSELECT, 0, 0
};
