/* ShowLists.c  */

/* 13 Aug 1991 At 09:58:37 */
#include <exec/execbase.h>
#include <proto/intuition.h>
#include <proto/gadtools.h>
#include <proto/exec.h>
#include <intuition/gadgetclass.h>
#include <intuition/screens.h>
struct ExecBase *ExecBase;
struct IntuitionBase *IntuitionBase = NULL;
struct GadToolsBase *GadToolsBase = NULL;
struct Window *WBWindow = NULL;
struct Screen *WBScreen = NULL;
APTR vi = NULL;
BOOL activated = TRUE;
struct Gadget *currgad,*g0,*g1;
struct Gadget *gadlist = NULL;
#define NUMLISTS 6
struct List *ExecLists[NUMLISTS];
#define REFRESHBUTTON 2
#define NODEGAD_ID 1
#define LVGADHEIGHT 95
#define LVGADWIDTH 165
#define LVGADY 15
#define LVGADX 13
#define LABLEN 8

static char *CycleLabels[NUMLISTS+1] =            /* up to LABLEN long strings */
    { "  PORTS   ",
      " DEVICES  ",
      " LIBRARY  ",
      " TASKWAIT ",
      " RESOURCE ",
      "  MEMORY  ",
    };

void Bummer(char *errmsg)
{
    puts(errmsg);
    CleanExit(5);
}
int CleanExit(returnvalue)
int returnvalue;
{
    if (gadlist)
        FreeGadgets(gadlist);
    if (vi)
        FreeVisualInfo(vi);
    if (WBWindow) CloseWindow (WBWindow);
    if (WBScreen != NULL)
        UnlockPubScreen (NULL, WBScreen);
    if (GadToolsBase)
        CloseLibrary ((struct Library *)GadToolsBase);
    if (IntuitionBase)
        CloseLibrary ((struct Library *)IntuitionBase);
    if (ExecBase)
        CloseLibrary ((struct Library *)ExecBase);
    exit (returnvalue);
    return (returnvalue);
}

void handleIDCMP(struct Window *win)
{
    struct IntuiMessage *message = NULL;
    struct Gadget *gad = NULL;
    ULONG class, signals, signalmask;
    WORD code;
    int CurList=0;

    signalmask = 1L << win->UserPort->mp_SigBit;
    while (1)
    {
        signals = Wait(signalmask);
        if (signals & signalmask)
            while (message = (struct IntuiMessage *)GT_GetIMsg(win->UserPort))
            {
                class = message->Class;
                code = (WORD)message->Code;
                gad = (struct Gadget *) message->IAddress;
                GT_ReplyIMsg(message);
/*							printf("Gadget: %d,  Code: %d\n",gad->GadgetID,code); */
                switch(class)
                {
                    case CLOSEWINDOW:
                      CleanExit(0);
                    case GADGETUP:  /*  Fall through to window activated case...  */
                      CurList=code;
				    				default:  /* only activate message I hope */
                      GT_SetGadgetAttrs(g0, WBWindow, NULL,GTLV_Labels,ExecLists[CurList]);
                      break;
                }
            }
    }
}


struct NewGadget ng = {
    LVGADX,LVGADY,
    LVGADWIDTH, LVGADHEIGHT,
    "",
    NULL,
    1,
    PLACETEXT_BELOW,
    NULL,
    NULL
};


void main(int argc, char *argv[])
{

    IntuitionBase = (struct IntuitionBase *) OpenLibrary ("intuition.library", 36);
    if (IntuitionBase == NULL)
        CleanExit(30);
    ExecBase = (struct ExecBase *) OpenLibrary ("exec.library", 36);
    if (ExecBase == NULL)
        CleanExit(30);
    GadToolsBase = (struct GadToolsBase *) OpenLibrary ("gadtools.library", 36);
    if (GadToolsBase == NULL)
        CleanExit(30);
    WBScreen = LockPubScreen(NULL);
    if (WBScreen == NULL)
        CleanExit(30);

    vi = GetVisualInfo (WBScreen, TAG_DONE);
    if (vi == NULL)
        CleanExit(30);

    ExecLists[0]= &(ExecBase->PortList);
    ExecLists[1]= &(ExecBase->DeviceList);
    ExecLists[2]= &(ExecBase->LibList);
    ExecLists[3]= &(ExecBase->TaskWait);
    ExecLists[4]= &(ExecBase->ResourceList);
    ExecLists[5]= &(ExecBase->MemList);

    ng.ng_TextAttr = WBScreen->Font;
		ng.ng_TopEdge= (WBScreen->Font->ta_YSize *4)/3;
    ng.ng_VisualInfo = vi;
    g0 = CreateContext (&gadlist);
		ng.ng_Flags= PLACETEXT_IN;
		ng.ng_GadgetID=NODEGAD_ID;
    g0 = CreateGadget(LISTVIEW_KIND, g0, &ng,
                    GTLV_Labels,ExecLists[0],
/*                     GTLV_ShowSelected,NULL, */
/*                     GTLV_Active, 1, */
										TAG_DONE);
    if (!g0)
        Bummer("ListView Gad failed");
		ng.ng_Height = ng.ng_TopEdge; /* (WBScreen->Font->ta_YSize *4)/3;  */
		ng.ng_TopEdge += LVGADHEIGHT+ng.ng_Height;
    ng.ng_Flags= PLACETEXT_IN;
		ng.ng_GadgetID=REFRESHBUTTON;
/* 		ng.ng_GadgetText=" REFRESH ";
    g1 = CreateGadget(BUTTON_KIND, g0, &ng, TAG_DONE); */
    g1 = CreateGadget(CYCLE_KIND, g0, &ng, GTCY_Labels, CycleLabels,TAG_DONE);
    if (!g1)
        Bummer("Button Gad failed");
    WBWindow = OpenWindowTags (NULL, WA_Title, (ULONG) "Amiga Lists",
        WA_Flags, (ULONG)SMART_REFRESH|WINDOWCLOSE|WINDOWDEPTH|WINDOWDRAG|ACTIVATE,
        WA_InnerHeight, LVGADHEIGHT+4*ng.ng_Height,
        WA_InnerWidth,LVGADWIDTH+2*LVGADX,
        WA_AutoAdjust, TRUE,
        WA_GimmeZeroZero, TRUE,
        WA_IDCMP, (ULONG)CLOSEWINDOW|BUTTONIDCMP|ACTIVEWINDOW,
        TAG_DONE);
    AddGList (WBWindow, gadlist, -1, -1, NULL);
    RefreshGList(WBWindow->FirstGadget, WBWindow, NULL, (UWORD)-1);
    GT_RefreshWindow (WBWindow, NULL);
    handleIDCMP (WBWindow);
}
