/*
 *  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:  cLPReq.c         Data structures for the Load Part Requester.
 */


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

static short PanelBox[]   = FBOX(LP_PANELW,LP_PANELH);
static short Frame1Box[]  = FBOX(LP_FRAME1W,LP_FRAME1H);
static short Frame2Box[]  = FBOX(LP_FRAME2W,LP_FRAME2H);
static short Frame3Box[]  = FBOX(LP_FRAME3W,LP_FRAME3H);
static short NameBox[]    = FBOX(LP_NAMEW,LP_NAMEH);
static short PNameBox[]   = FBOX(LP_PNAMEW,LP_PNAMEH);
static short PSlideBox[]  = VBOX(LP_PSLIDEW,LP_PSLIDEH);
static short LNameBox[]   = FBOX(LP_LNAMEW,LP_LNAMEH);
static short LSlideBox[]  = VBOX(LP_LSLIDEW,LP_LSLIDEH);
static short ButtonVBox[] = VBOX(LP_BUTTONW,LP_BUTTONH);
static short ButtonFBox[] = FBOX(LP_BUTTONW,LP_BUTTONH);
static short ButtonBBox[] = BBOX(LP_BUTTONW,LP_BUTTONH);

static struct Border LPBorder[] =
{
      #define NEXTBORDER(n)     &LPBorder[n+2]
      #define BORDERNAME        LPBorder
   OUTBRDR(LPB_PANEL,  0,0, PanelBox),
   INBRDR (LPB_FRAME1, LP_FRAME1X,LP_FRAME1Y, Frame1Box),
   INBRDR (LPB_FRAME2, LP_FRAME2X,LP_FRAME2Y, Frame2Box),
   INBRDR (LPB_FRAME3, LP_FRAME3X,LP_FRAME3Y, Frame3Box),
   OUTBRDR(LPB_PSLIDE, LP_PSLIDEX,LP_PSLIDEY, PSlideBox),
   OUTBRDR(LPB_LSLIDE, LP_LSLIDEX,LP_LSLIDEY, LSlideBox),
   INBRDR (LPB_PNAMES, LP_PNAMEX,LP_PNAMEY, PNameBox),
   INBRDR (LPB_LNAMES, LP_LNAMEX,LP_LNAMEY, LNameBox),
      #undef  NEXTBORDER
      #define NEXTBORDER(n)     NULL
   INBRDR (LPB_NAME,   LP_NAMEX,LP_NAMEY, NameBox),
   OUTBRDR(LPB_BUTTONV, 0,0, ButtonVBox),
   OUTBRDR(LPB_BUTTONF, 0,0, ButtonFBox),
   OUTBRDR(LPB_BUTTONB, 0,0, ButtonBBox),
};

static struct Image LPImage[] =
{
   IMAGE(-1,-1,LP_NAMEW-2,LP_NAMEH-2,BACKGROUND),
   IMAGE(0,0,0,0, FOREGROUND),
   IMAGE(0,0,0,0, FOREGROUND),
   IMAGE(1,1,LP_PNAMEW-2,CHAR_HEIGHT+2,FOREGROUND),
   IMAGE(1,1,LP_PNAMEW-2,CHAR_HEIGHT+2,TEXTSELECT),
   IMAGE(1,1,LP_LNAMEW-2,CHAR_HEIGHT+2,FOREGROUND),
   IMAGE(1,1,LP_LNAMEW-2,CHAR_HEIGHT+2,TEXTSELECT),
   {LP_PSLIDEX+1,LP_PSLIDEY+1,LP_PSLIDEW-2,LP_PSLIDEH-2,0,
      NULL,0,BACKGROUND, &LPImage[LPI_LBACK]},
   {LP_LSLIDEX+1,LP_LSLIDEY+1,LP_LSLIDEW-2,LP_LSLIDEH-2,0,
      NULL,0,BACKGROUND, NULL},
};

struct IntuiText LPText[] =
{
   ITEXT("Remove", 5,3),
   ITEXT("View",  11,3),
   ITEXT("Cancel", 5,3),
   ITEXT("Use",   14,3),
   ITEXT("Use Part:     From Library:", 24,2),
   ITEXT("            ",3,2),      /* PNames */
   ITEXT("            ",3,2),
   ITEXT("            ",3,2),
   ITEXT("            ",3,2),
   ITEXT("            ",3,2),
   ITEXT("            ",3,2),
   ITEXT("            ",3,2),
   ITEXT("            ",3,2),
   ITEXT("            ",3,2),      /* LNames */
   ITEXT("            ",3,2),
   ITEXT("            ",3,2),
   ITEXT("            ",3,2),
   ITEXT("            ",3,2),
   ITEXT("            ",3,2),
};

char LPNameBuf[MAXPNAME+1];
extern char UndoBuffer[];

static struct StringInfo LPNameInfo =
   {&LPNameBuf[0], &UndoBuffer[0], 0,MAXPNAME+1, 0, 0,0,0, 0,0, NULL, 0, NULL};

struct PropInfo LPSlider[] =
{
   {AUTOKNOB|FREEVERT|PROPBORDERLESS,0,0,0x3FFF,0x3FFF, 0,0,0,0,0,0},
   {AUTOKNOB|FREEVERT|PROPBORDERLESS,0,0,0xFFFF,0xFFFF, 0,0,0,0,0,0},
};

extern struct ListInfo PListInfo;
extern struct ListInfo LListInfo;


#define BUTTON(n,t,x,y,b,f)\
{\
   &LPGadget[n+1], LP_BUTTONX+LP_BUTTONW*x,LP_BUTTONY+LP_BUTTONH*y,\
   LP_BUTTONW,LP_BUTTONH, GADGHCOMP, f, BOOLGADGET| REQGADGET,\
   (APTR)&LPBorder[b],NULL, &LPText[t], 0, NULL, n, NULL\
}

#define NAMES(n,x,y,t,im,li)\
{\
   &LPGadget[n+1], x,y, LP_PNAMEW,LP_PNAMEH, GADGHNONE|GADGIMAGE,\
   GADGIMMEDIATE, BOOLGADGET| REQGADGET,\
   (APTR)&LPImage[im],NULL, &LPText[t], 0, NULL, n, (APTR)&li\
}

#define NAME(n)\
{\
   &LPGadget[n+1], LP_NAMEX+2,LP_NAMEY+2,LP_NAMEW-4,LP_NAMEH-4,\
   GADGHCOMP| GADGIMAGE, GADGIMMEDIATE|RELVERIFY, STRGADGET|REQGADGET,\
   (APTR)&LPImage[LPI_NAME], NULL, NULL, 0, (APTR)&LPNameInfo, n,\
   (APTR)&PListInfo\
}

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

#define SLIDER(n,x,y,w,h,li)\
{\
   &LPGadget[n+1], x+2,y+2,w-4,h-4, GADGHCOMP|GADGIMAGE,\
   GADGIMMEDIATE|RELVERIFY, PROPGADGET|REQGADGET,\
   (APTR)&LPImage[n-LP_PSLIDE+LPI_PSLIDE], NULL, NULL, NULL,\
   (APTR)&LPSlider[n-LP_PSLIDE], n, (APTR)&li\
}

#define ENDLIST\
   {NULL, 0,0,0,0, GADGHNONE|GADGIMAGE, 0, BOOLGADGET|REQGADGET,\
   (APTR)&LPImage[LPI_PBACK],NULL, NULL, NULL,NULL, LP_IMGADG,NULL}

static struct Gadget LPGadget[] =
{
   BUTTON(LP_REMOVE, LPT_REMOVE, 0,0, LPB_BUTTONB, RELVERIFY),
   BUTTON(LP_VIEW,   LPT_VIEW,   1,0, LPB_BUTTONV, GADGIMMEDIATE|TOGGLESELECT),
   BUTTON(LP_CANCEL, LPT_CANCEL, 0,1, LPB_BUTTONB, RELVERIFY),
   BUTTON(LP_USE,    LPT_USE,    1,1, LPB_BUTTONF, RELVERIFY),
   NAMES (LP_PNAMES,LP_PNAMEX,LP_PNAMEY,LPT_PNAME0,LPI_PBLANK,PListInfo),
   NAMES (LP_LNAMES,LP_LNAMEX,LP_LNAMEY,LPT_LNAME0,LPI_LBLANK,LListInfo),
   SLIDER(LP_PSLIDE,LP_PSLIDEX,LP_PSLIDEY,LP_PSLIDEW,LP_PSLIDEH,PListInfo),
   SLIDER(LP_LSLIDE,LP_LSLIDEX,LP_LSLIDEY,LP_LSLIDEW,LP_LSLIDEH,LListInfo),
   ARROW (LP_PUARROW,LP_PUARROWX,LP_PUARROWY,LPI_UARROW,PListInfo),
   ARROW (LP_PDARROW,LP_PDARROWX,LP_PDARROWY,LPI_DARROW,PListInfo),
   ARROW (LP_LUARROW,LP_LUARROWX,LP_LUARROWY,LPI_UARROW,LListInfo),
   ARROW (LP_LDARROW,LP_LDARROWX,LP_LDARROWY,LPI_DARROW,LListInfo),
   NAME(LP_NAME),
   ENDLIST
};

struct ExtRequest LPRequest =
{
   {NULL, 0,0, LP_PANELW,LP_PANELH, 0,0, &LPGadget[0], &LPBorder[LPB_PANEL],
    &LPText[LPT_TITLE], 0, FOREGROUND, NULL, NULL, NULL},
   NULL,NULL,NULL, &LPGadget[LP_NAME],
};

static struct ListInfo PListInfo =
{
   &LPRequest, &LPGadget[LP_PNAMES], &LPGadget[LP_NAME], &LPGadget[LP_PSLIDE],
   NULL, NULL, NULL, &LPText[LPT_PNAME0], &LPImage[LPI_PBLANK],
   8,12, 0,0, LI_NOSELECT, 0, 0
};

static struct ListInfo LListInfo =
{
   &LPRequest, &LPGadget[LP_LNAMES], NULL, &LPGadget[LP_LSLIDE],
   NULL, NULL, NULL, &LPText[LPT_LNAME0], &LPImage[LPI_LBLANK],
   6,12, 0,0, LI_NOSELECT, 0, 0
};
