/*************************************************************************
 ***                        gadg.c                       (JJB TEMPLAR) ***
 *** Date begun: 9/8/89.                                               ***
 *** Last modified: 16/8/89.                                           ***
 *************************************************************************/
/*** Gadget data for ty.                                               ***
 *************************************************************************/

#include <exec/types.h>
#include <intuition/intuition.h>
#include <proto/intuition.h>

#include "image.h"
#include "gadg.h"

#include "position.h"

static struct Image    g_img[22] = {
    {0,0,14,8,2,image1,3,0,NULL},
    {0,0,14,8,2,image2,3,0,NULL},
    {0,0,14,8,2,image3,3,0,NULL},
    {0,0,14,8,2,image4,3,0,NULL},
    {0,0,14,8,2,image5,3,0,NULL},
    {0,0,14,8,2,image6,3,0,NULL},
    {0,0,14,8,2,image7,3,0,NULL},
    {0,0,14,8,2,image8,3,0,NULL},
    {0,0,14,8,2,image9,3,0,NULL},
    {NULL},             /* AutoKnob. Don't need to initialize */
    {0,0,16,8,2,image11,3,0,NULL},
    {0,0,16,8,2,image12,3,0,NULL},
    {0,0,16,8,2,image13,3,0,NULL},
    {0,0,16,8,2,image14,3,0,NULL},
    {0,0,16,8,2,image15,3,0,NULL},
    {0,0,16,8,2,image16,3,0,NULL},
    {0,0,16,8,2,image17,3,0,NULL},
    {0,0,16,8,2,image18,3,0,NULL},
    {0,0,16,8,2,image19,3,0,NULL},
    {0,0,16,8,2,image20,3,0,NULL},
    {0,0,16,8,2,image21,3,0,NULL},
    {NULL}};            /* AutoKnob. Don't need to initialize */
static struct PropInfo barspec = {
    AUTOKNOB|FREEVERT,0,0,0,0x5555,};
static struct PropInfo hbrspec = {
    AUTOKNOB|FREEHORIZ,0,0,0xffff/6,0,};    /* Basically 6 positions,
                                             * independent of sc_width */

static struct Gadget   gads[22] = {
    {NULL,-15,11,14,8,GADGHCOMP|GADGIMAGE|GRELRIGHT,
     RELVERIFY,BOOLGADGET,(APTR)&g_img[0],NULL,NULL,NULL,NULL,G_UP,NULL},
    {&gads[0],-15,-80,14,8,GADGHCOMP|GADGIMAGE|GRELRIGHT|GRELBOTTOM,
     RELVERIFY,BOOLGADGET,(APTR)&g_img[1],NULL,NULL,NULL,NULL,G_DOWN,NULL},
    {&gads[1],-15,-71,14,8,GADGHCOMP|GADGIMAGE|GRELRIGHT|GRELBOTTOM,
     RELVERIFY,BOOLGADGET,(APTR)&g_img[2],NULL,NULL,NULL,NULL,G_LEFT,NULL},
    {&gads[2],-15,-62,14,8,GADGHCOMP|GADGIMAGE|GRELRIGHT|GRELBOTTOM,
     RELVERIFY,BOOLGADGET,(APTR)&g_img[3],NULL,NULL,NULL,NULL,G_RIGHT,NULL},
    {&gads[3],-15,-53,14,8,GADGHCOMP|GADGIMAGE|GRELRIGHT|GRELBOTTOM,
     RELVERIFY,BOOLGADGET,(APTR)&g_img[4],NULL,NULL,NULL,NULL,G_HELP,NULL},
    {&gads[4],-15,-44,14,8,GADGHCOMP|GADGIMAGE|GRELRIGHT|GRELBOTTOM,
     RELVERIFY,BOOLGADGET,(APTR)&g_img[5],NULL,NULL,NULL,NULL,G_SEARCH,NULL},
    {&gads[5],-15,-35,14,8,GADGHCOMP|GADGIMAGE|GRELRIGHT|GRELBOTTOM,
     RELVERIFY,BOOLGADGET,(APTR)&g_img[6],NULL,NULL,NULL,NULL,G_MARK,NULL},
    {&gads[6],-15,-26,14,8,GADGHCOMP|GADGIMAGE|GRELRIGHT|GRELBOTTOM,
     RELVERIFY,BOOLGADGET,(APTR)&g_img[7],NULL,NULL,NULL,NULL,G_MODE,NULL},
    {&gads[7],-15,-17,14,8,GADGHCOMP|GADGIMAGE|GRELRIGHT|GRELBOTTOM,
     RELVERIFY,BOOLGADGET,(APTR)&g_img[8],NULL,NULL,NULL,NULL,G_BOOM,NULL},
    {&gads[8],-15,20,16,-102,GADGHCOMP|GADGIMAGE|GRELRIGHT|GRELHEIGHT,
     RELVERIFY,PROPGADGET,(APTR)&g_img[9],NULL,NULL,NULL,(APTR)&barspec,G_SCROLL,NULL},

    {&gads[9],    4,-8,16,8,GADGHCOMP|GADGIMAGE|GRELBOTTOM,
     RELVERIFY|BOTTOMBORDER,BOOLGADGET,(APTR)&g_img[10],NULL,NULL,NULL,NULL,G_LEFT,NULL},
    {&gads[10],-195,-8,16,8,GADGHCOMP|GADGIMAGE|GRELRIGHT|GRELBOTTOM,
     RELVERIFY,BOOLGADGET,(APTR)&g_img[11],NULL,NULL,NULL,NULL,G_RIGHT,NULL},
    {&gads[11],-177,-8,16,8,GADGHCOMP|GADGIMAGE|GRELRIGHT|GRELBOTTOM,
     RELVERIFY,BOOLGADGET,(APTR)&g_img[12],NULL,NULL,NULL,NULL,G_PERCENT,NULL},
    {&gads[12],-159,-8,16,8,GADGHCOMP|GADGIMAGE|GRELRIGHT|GRELBOTTOM,
     RELVERIFY,BOOLGADGET,(APTR)&g_img[13],NULL,NULL,NULL,NULL,G_VERSION,NULL},
    {&gads[13],-141,-8,16,8,GADGHCOMP|GADGIMAGE|GRELRIGHT|GRELBOTTOM,
     RELVERIFY,BOOLGADGET,(APTR)&g_img[14],NULL,NULL,NULL,NULL,G_REPAINT,NULL},
    {&gads[14],-123,-8,16,8,GADGHCOMP|GADGIMAGE|GRELRIGHT|GRELBOTTOM,
     RELVERIFY,BOOLGADGET,(APTR)&g_img[15],NULL,NULL,NULL,NULL,G_PRINT,NULL},
    {&gads[15],-105,-8,16,8,GADGHCOMP|GADGIMAGE|GRELRIGHT|GRELBOTTOM,
     RELVERIFY,BOOLGADGET,(APTR)&g_img[16],NULL,NULL,NULL,NULL,G_TOP,NULL},
    {&gads[16], -87,-8,16,8,GADGHCOMP|GADGIMAGE|GRELRIGHT|GRELBOTTOM,
     RELVERIFY,BOOLGADGET,(APTR)&g_img[17],NULL,NULL,NULL,NULL,G_BOTTOM,NULL},
    {&gads[17], -69,-8,16,8,GADGHCOMP|GADGIMAGE|GRELRIGHT|GRELBOTTOM,
     RELVERIFY,BOOLGADGET,(APTR)&g_img[18],NULL,NULL,NULL,NULL,G_PREV,NULL},
    {&gads[18], -51,-8,16,8,GADGHCOMP|GADGIMAGE|GRELRIGHT|GRELBOTTOM,
     RELVERIFY,BOOLGADGET,(APTR)&g_img[19],NULL,NULL,NULL,NULL,G_FILE,NULL},
    {&gads[19], -33,-8,16,8,GADGHCOMP|GADGIMAGE|GRELRIGHT|GRELBOTTOM,
     RELVERIFY,BOOLGADGET,(APTR)&g_img[20],NULL,NULL,NULL,NULL,G_NEXT,NULL},
    {&gads[20],  22,-8,-220,9,GADGHCOMP|GADGIMAGE|GRELWIDTH|GRELBOTTOM,
     RELVERIFY,PROPGADGET,(APTR)&g_img[21],NULL,NULL,NULL,(APTR)&hbrspec,G_HSCROLL,NULL}};

struct Gadget *fgadg = &(gads[21]);

extern struct Window    *Window;
extern int              sc_height,sc_width;
extern int              scroll_bar;
extern int              l_start;

extern LONG position(int);  /* Access to position table */
extern void printf(char *);
extern char *strint(int);
extern void jump_back(int);
extern int  linecount();

static LONG size,scr;

void    mModifyProp(g,s,hp,vp,hb,vb) /*==================================*/
struct Gadget   *g;     /* Do this because Intuition fn doesn't have a   */
struct PropInfo *s;     /* prototype, and I don't want refs to amiga.lib */
UWORD   hp,vp,hb,vb;    /* since I'm trying to use cres.o                */
{
    s->HorizPot = hp;       s->VertPot = vp;
    s->HorizBody = hb;      s->VertBody = vb;
    OnGadget(g,Window,NULL);    /* Should do redraw. Will it do recalc? */
}

void    setbar(f) /*=====================================================*/
int     f;        /* If f is true, then re-calc proportions.             */
{                 /* 2 means reset both sizes, 1 means reset screen size */
register LONG   pos;
register LONG   temp;
register UWORD  vp,vb;

    if (!scroll_bar && (f < 2)) return;
    if (!scroll_bar) {
        mModifyProp(&gads[9],&barspec,0,0,0,0xffff);
        OffGadget(&gads[9],Window,NULL);
        return;     /* If f == 2, and no bar, then make knob full size */
    }
    pos = position(TOP)/60;     /* Assume about 60chars/line, for now. */
    if (f == 2) size = linecount();     /* Reset file size */

    if ((pos <= 0) || (pos > size)) vp = 0x0000;  /* Ensure size >= pos */
    else {
        temp = size/pos;    /* Can't be div by zero because just checked */
        vp = 0xffff/temp;   /* Can't be div by zero because size >= pos */
    }
    if (f >= 1) {
        scr = sc_height;
        if ((scr <= 0) || (scr > size)) vb = 0xffff;
        else {
            temp = size/scr;
            vb = 0xffff/temp;
        }
    }
    else vb = barspec.VertBody;

    mModifyProp(&gads[9],&barspec,0,vp,0,vb);
}

void    usebar() /*======================================================*/
{
register ULONG  vp,pos;

    if (!scroll_bar) return; /* Shouldn't happen, because bar should be off */

    vp = barspec.VertPot;
    pos = (vp * size) >> 16;
    pos -= scr;
    if (pos < 1) pos = 1;
    jump_back(pos);     /* Line oriented */
}

int     rbut(msg) /*=====================================================*/
struct IntuiMessage *msg; /* Go through gadget list, and return GadgetID */
{
register int    x,y,my;
register struct Gadget *gp;

    x = msg->MouseX;    y = msg->MouseY;    my = (y - Window->Height) + 1;
    gp = &gads[8];      /* Skip scroll bar */

  /* Out of bounds? */
    if ((x < Window->Width-16) || (x > Window->Width-3) ||
        (y < 11) || (y > Window->Height - 11)) return(G_NULL);

    while (gp) {
        if (gp->Flags & GRELBOTTOM) {
            if ((my >= gp->TopEdge) && (my < gp->TopEdge + 8)) return(gp->GadgetID);
        }
        else {
            if ((y >= gp->TopEdge) && (y < gp->TopEdge + 8)) return(gp->GadgetID);
        }
        gp = gp->NextGadget;
    }
    return(G_NULL);
}

void    sethbar() /*=====================================================*/
{
    hbrspec.HorizPot = (0xffff / 60) * l_start;
    OnGadget(&gads[21],Window,NULL);    /* Better than ModifyProp */
}

void    usehbar() /*=====================================================*/
{
    l_start = (hbrspec.HorizPot * 60) / 0xffff;
}
