#include "exec/types.h"
#include "exec/exec.h"
#include "intuition/intuition.h"
#include "graphics/gfxbase.h"
#include "functions.h"

struct IntuitionBase *IntuitionBase = 0L;
struct GfxBase *GfxBase = 0L;
struct Window *ControlWindow = NULL;
struct IntuiMessage *MyIntuiMessage;


WORD BoolVectors[] = {0,0,51,0,51,41,0,41,0,0};
struct Border BoolBorder = 
 { 
  -1, -1,                  /* initial offsets, gadget relative */
  3, 2, JAM1,              /* pens and drawmode */
  5,                       /* number of vectors */
  (SHORT *) BoolVectors,   /* pointer to the actual array of vectors */
  NULL                     /* next border */
 };

/* Two Images for hit gadget with alternate images (BoolGadget[2]) */


 UWORD imageone[] = 
 {
  0xFFF0, 0x0000, 0x0000, 0x0FFF,
  0x000F, 0xFF00, 0x00FF, 0xF000,
  0x0000, 0xFFF0, 0x0FFF, 0x0000,
  0x0000, 0x00FF, 0xFF00, 0x0000,
  0x0000, 0x000F, 0xF000, 0x0000,
  0x0000, 0x000F, 0xF000, 0x0000,
  0x0000, 0x00FF, 0xFF00, 0x0000,
  0x0000, 0xFFF0, 0x0FFF, 0x0000,
  0x000F, 0xFF00, 0x00FF, 0xF000,
  0xFFF0, 0x0000, 0x0000, 0x0FFF,

  0xFFF0, 0x0000, 0x0000, 0x0FFF,
  0x000F, 0xFF00, 0x00FF, 0xF000,
  0x0000, 0xFFF0, 0x0FFF, 0x0000,
  0x0000, 0x00FF, 0xFF00, 0x0000,
  0x0000, 0x000F, 0xF000, 0x0000,
  0x0000, 0x000F, 0xF000, 0x0000,
  0x0000, 0x00FF, 0xFF00, 0x0000,
  0x0000, 0xFFF0, 0x0FFF, 0x0000,
  0x000F, 0xFF00, 0x00FF, 0xF000,
  0xFFF0, 0x0000, 0x0000, 0x0FFF
 };

 UWORD imagetwo[] = 
 {
  0x0000, 0x0000, 0x0000, 0x0000,
  0x0000, 0x0000, 0x0000, 0x0000,
  0x0000, 0x0000, 0x0000, 0x0000,
  0x0000, 0x0000, 0x0000, 0x0000,
  0x0000, 0x0000, 0x0000, 0x0000,
  0x0000, 0x0000, 0x0000, 0x0000,
  0x0000, 0x0000, 0x0000, 0x0000,
  0x0000, 0x0000, 0x0000, 0x0000,
  0x0000, 0x0000, 0x0000, 0x0000,
  0x0000, 0x0000, 0x0000, 0x0000,

  0x0000, 0x0FFF, 0xFFF0, 0x0000,
  0x0000, 0x0FFF, 0xFFF0, 0x0000,
  0x0000, 0x0FFF, 0xFFF0, 0x0000,
  0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
  0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
  0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
  0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
  0x0000, 0x0FFF, 0xFFF0, 0x0000,
  0x0000, 0x0FFF, 0xFFF0, 0x0000,
  0x0000, 0x0FFF, 0xFFF0, 0x0000
 };

struct Image BoolImage = 
 {
  0,0,64,10,2,
  imageone,
  0x03, 0x0, NULL
 };

struct Image BoolHImage = 
 {
  0,0,64,10,2,
  imagetwo,
  0x03, 0x0, NULL
 };

USHORT gadget_imageData[] =
 {
  0x0000, 0x0000, 0x0000, 0x0000,
  0x0000, 0x0000, 0x0000, 0x0000,
  0x0000, 0x0000, 0x0000, 0x0000,
  0x0000, 0x000F, 0xF000, 0x0000,
  0x0000, 0x00FF, 0xFF00, 0x0000,
  0x0000, 0x0FFF, 0xFFF0, 0x0000,
  0x0000, 0xFFFF, 0xFFFF, 0x0000,
  0x0000, 0xFFFF, 0xFFFF, 0x0000,
  0x000F, 0xFFFF, 0xFFFF, 0xF000,
  0x000F, 0xFFFF, 0xFFFF, 0xF000,
  0x000F, 0xFFFF, 0xFFFF, 0xF000,
  0x00FF, 0xFFFF, 0xFFFF, 0xFF00,
  0x00FF, 0xFFFF, 0xFFFF, 0xFF00,
  0x00FF, 0xFFFF, 0xFFFF, 0xFF00,
  0x0FFF, 0xFFFF, 0xFFFF, 0xFFF0,
  0x0FFF, 0xFFFF, 0xFFFF, 0xFFF0,
  0x00FF, 0xFFFF, 0xFFFF, 0xFF00,
  0x00FF, 0xFFFF, 0xFFFF, 0xFF00,
  0x00FF, 0xFFFF, 0xFFFF, 0xFF00,
  0x000F, 0xFFFF, 0xFFFF, 0xF000,
  0x000F, 0xFFFF, 0xFFFF, 0xF000,
  0x000F, 0xFFFF, 0xFFFF, 0xF000,
  0x0000, 0xFFFF, 0xFFFF, 0x0000,
  0x0000, 0xFFFF, 0xFFFF, 0x0000,
  0x0000, 0x0FFF, 0xFFF0, 0x0000,
  0x0000, 0x00FF, 0xFF00, 0x0000,
  0x0000, 0x000F, 0xF000, 0x0000,
  0x0000, 0x0000, 0x0000, 0x0000,
  0x0000, 0x0000, 0x0000, 0x0000,
  0x0000, 0x0000, 0x0000, 0x0000,

  0x0000, 0x0000, 0x0000, 0x0000,
  0x0000, 0x0000, 0x0000, 0x0000,
  0x0000, 0x0000, 0x0000, 0x0000,
  0x0000, 0x0000, 0x0000, 0x0000,
  0x0000, 0x0000, 0x0000, 0x0000,
  0x0000, 0x0000, 0x0000, 0x0000,
  0x0000, 0x0000, 0x0000, 0x0000,
  0x0000, 0x0000, 0x0000, 0x0000,
  0x0000, 0x0000, 0x0000, 0x0000,
  0x0000, 0x0000, 0x0000, 0x0000,
  0x0000, 0x0000, 0x0000, 0x0000,
  0x0000, 0x0000, 0x0000, 0x0000,
  0x0000, 0x000F, 0xF000, 0x0000,
  0x0000, 0x00FF, 0xFF00, 0x0000,
  0x0000, 0x00FF, 0xFF00, 0x0000,
  0x0000, 0x0FFF, 0xFFF0, 0x0000,
  0x0000, 0x0FFF, 0xFFF0, 0x0000,
  0x0000, 0x0FFF, 0xFFF0, 0x0000,
  0x0000, 0x00FF, 0xFF00, 0x0000,
  0x0000, 0x00FF, 0xFF00, 0x0000,
  0x0000, 0x000F, 0xF000, 0x0000,
  0x0000, 0x0000, 0x0000, 0x0000,
  0x0000, 0x0000, 0x0000, 0x0000,
  0x0000, 0x0000, 0x0000, 0x0000,
  0x0000, 0x0000, 0x0000, 0x0000,
  0x0000, 0x0000, 0x0000, 0x0000,
  0x0000, 0x0000, 0x0000, 0x0000,
  0x0000, 0x0000, 0x0000, 0x0000,
  0x0000, 0x0000, 0x0000, 0x0000,
  0x0000, 0x0000, 0x0000, 0x0000
 };

USHORT bool_mask[] =
 {

  0x0000, 0x0000, 0x0000, 0x0000,
  0x0000, 0x0000, 0x0000, 0x0000,
  0x0000, 0x0000, 0x0000, 0x0000,
  0x0000, 0x0000, 0x0000, 0x0000,
  0x0000, 0x0000, 0x0000, 0x0000,
  0x0000, 0x0000, 0x0000, 0x0000,
  0x0000, 0x0000, 0x0000, 0x0000,
  0x0000, 0x0000, 0x0000, 0x0000,
  0x0000, 0x0000, 0x0000, 0x0000,
  0x0000, 0x0000, 0x0000, 0x0000,
  0x0000, 0x0000, 0x0000, 0x0000,
  0x0000, 0x0000, 0x0000, 0x0000,
  0x0000, 0x000F, 0xF000, 0x0000,
  0x0000, 0x00FF, 0xFF00, 0x0000,
  0x0000, 0x00FF, 0xFF00, 0x0000,
  0x0000, 0x0FFF, 0xFFF0, 0x0000,
  0x0000, 0x0FFF, 0xFFF0, 0x0000,
  0x0000, 0x0FFF, 0xFFF0, 0x0000,
  0x0000, 0x00FF, 0xFF00, 0x0000,
  0x0000, 0x00FF, 0xFF00, 0x0000,
  0x0000, 0x000F, 0xF000, 0x0000,
  0x0000, 0x0000, 0x0000, 0x0000,
  0x0000, 0x0000, 0x0000, 0x0000,
  0x0000, 0x0000, 0x0000, 0x0000,
  0x0000, 0x0000, 0x0000, 0x0000,
  0x0000, 0x0000, 0x0000, 0x0000,
  0x0000, 0x0000, 0x0000, 0x0000,
  0x0000, 0x0000, 0x0000, 0x0000,
  0x0000, 0x0000, 0x0000, 0x0000,
  0x0000, 0x0000, 0x0000, 0x0000
 };  
  
 struct Image BoolMaskImage = 
 {
  0,0,                          /* LeftEdge, TopEdge */
  64,30,2,                      /* Width, Height, Depth */
  &gadget_imageData[0],
  0x03,0x00,                    /* PlanePick, PlaneOnOff */
  NULL                          /* Pointer to next Image */
 };

 struct BoolInfo BoolInfo =
 {
  BOOLMASK,
  &bool_mask[0],
  NULL
 };

 struct IntuiText IntuiStr_blank = {2,3,JAM2,5,5,NULL,(UBYTE *)"   ",NULL};
 struct IntuiText IntuiStr_yes   = {2,3,JAM2,5,5,NULL,(UBYTE *)"YES",NULL};
 struct IntuiText IntuiStr_no    = {2,3,JAM2,5,5,NULL,(UBYTE *)"NO ",NULL};

/* gadget structure */

 struct Gadget BoolGadget[5] =
{ 
 {
  NULL,                      /* pointer to Next Gadget */
  10,20,50,40,               /* Left, Top, Width, Height of Hit Box */
  GADGHCOMP,                 /* Flags */
  GADGIMMEDIATE | RELVERIFY, /* Activation flags */
  BOOLGADGET,                /* Type */
  (APTR) &BoolBorder,        /* pointer to Border Image */
  NULL,                      /* pointer to Select Render */
  &IntuiStr_yes,             /* Pointer to GadgetText */
  0,                         /* MutualExclude */
  NULL,                      /* pointer to SpecialInfo */
  0,                         /* ID */
  NULL                        /* pointer to special data */
 },

 {
  &BoolGadget[0], /* pointer to Next Gadget */
  110,20,64,10, /* Left, Top, Width, Height of Hit Box */
  GADGHIMAGE|GADGIMAGE,   /* Flags */
  GADGIMMEDIATE | RELVERIFY|TOGGLESELECT, /* Activation flags */
  BOOLGADGET, /* Type */
  (APTR) &BoolImage, /* pointer to Border Image */
  (APTR) &BoolHImage,  /* pointer to Select Render */
  &IntuiStr_yes, /* Pointer to GadgetText */
  0, /* MutualExclude */
  NULL, /* pointer to SpecialInfo */
  0, /*  ID */
  NULL
 },

 {
  &BoolGadget[1], /* pointer to Next Gadget */
  220,20,64,30, /* Left, Top, Width, Height of Hit Box */
  GADGHCOMP|GADGIMAGE,   /* Flags */
  GADGIMMEDIATE | RELVERIFY|TOGGLESELECT|BOOLEXTEND, /* Activation flags */
  BOOLGADGET, /* Type */
  (APTR) &BoolMaskImage, /* pointer to  Image */
  NULL,  /* pointer to Select Render */
  NULL,  /* Pointer to GadgetText */
  0, /* MutualExclude */
  (APTR)&BoolInfo, /* pointer to SpecialInfo */
  0, /*  ID */
  NULL
 },

 {
  &BoolGadget[2],                      /* pointer to Next Gadget */
  10,120,64,10,               /* Left, Top, Width, Height of Hit Box */
  GADGHCOMP|GADGIMAGE|SELECTED,                 /* Flags */
  GADGIMMEDIATE, /* Activation flags */
  BOOLGADGET,                /* Type */
  (APTR)&BoolImage,        /* pointer to Image */
  NULL,                      /* pointer to Select Render */
  NULL,             /* Pointer to GadgetText */
  0,                         /* MutualExclude */
  NULL,                      /* pointer to SpecialInfo */
  0,                         /* ID */
  NULL                        /* pointer to special data */
 },
 
 {
  &BoolGadget[3],                      /* pointer to Next Gadget */
  110,120,64,10,               /* Left, Top, Width, Height of Hit Box */
  GADGHCOMP|GADGIMAGE,                 /* Flags */
  GADGIMMEDIATE, /* Activation flags */
  BOOLGADGET,                /* Type */
  (APTR)&BoolHImage,        /* pointer to Image */
  NULL,                      /* pointer to Select Render */
  NULL,             /* Pointer to GadgetText */
  0,                         /* MutualExclude */
  NULL,                      /* pointer to SpecialInfo */
  0,                         /* ID */
  NULL                        /* pointer to special data */
 }
};
 
 struct NewWindow NewControlWindow =
 { 
  20,20,
  320,160,
  2,3,
  GADGETUP|GADGETDOWN|CLOSEWINDOW|MENUPICK,
  WINDOWDRAG|WINDOWDEPTH|WINDOWCLOSE|ACTIVATE,
  &BoolGadget[4], /* pointer to first gadget */
  NULL,
  (UBYTE *) "Boolean Gadgets",
  NULL,
  NULL,
  20,20,
  320,160,
  WBENCHSCREEN
 };

 struct IntuiText ghost_text = { 2,1,JAM2,5,1,NULL,(UBYTE *)"GHOST",NULL};

 struct MenuItem ghost_item = 
 {
  NULL,0,5,140,10,
  HIGHCOMP|ITEMENABLED|ITEMTEXT|COMMSEQ,
  NULL, (APTR) &ghost_text,
  NULL, 'G', NULL
 };

 struct Menu gadget_menu =
 {
  NULL,0,0,60,10,
  MENUENABLED,"Gadgets",
  &ghost_item
 };

main()
{
 struct MenuItem *ItemAddress();
 ULONG Signals,MIClass,MICode, itemnum;
 APTR MIAddress;
 LONG gad_pos, real_pos;
 VOID OpenALL(), CloseALL(), CleanUp();
 
 OpenALL();

 if(!(ControlWindow = (struct Window *) OpenWindow(&NewControlWindow))) CloseALL();

 SetMenuStrip(ControlWindow,&gadget_menu);

 for(;;)
 {
  Signals = Wait(1L << ControlWindow->UserPort->mp_SigBit);
  while(MyIntuiMessage=(struct IntuiMessage *)GetMsg(ControlWindow->UserPort))
  {
   MIClass = MyIntuiMessage->Class;
   MICode  = MyIntuiMessage->Code;
   MIAddress = MyIntuiMessage->IAddress;
   ReplyMsg(MyIntuiMessage);
   switch(MIClass)
   {
    case MENUPICK:

    while(MICode != MENUNULL)
    {
     itemnum = ITEMNUM(MICode);
     switch(itemnum)
     {
      case 0:

      gad_pos = RemoveGList(ControlWindow,&BoolGadget[2],1L);
      BoolGadget[2].Flags ^= GADGDISABLED;
      real_pos = AddGList(ControlWindow,&BoolGadget[2],gad_pos,1L,(LONG)NULL);
      RefreshGList(&BoolGadget[2],ControlWindow,(LONG)NULL,1L);
      break;
     } /* switch */
     MICode = (ItemAddress(&gadget_menu,MICode))->NextSelect;
    } /* while */
    break;

    case GADGETUP:

    if(MIAddress == &BoolGadget[0])
    {
     gad_pos = RemoveGList(ControlWindow,&BoolGadget[0],1L);
     BoolGadget[0].GadgetText = &IntuiStr_blank;
     real_pos = AddGList(ControlWindow,&BoolGadget[0],gad_pos,1L,(LONG)NULL);
     RefreshGList(&BoolGadget[0],ControlWindow,(LONG)NULL,1L);

     gad_pos = RemoveGList(ControlWindow,&BoolGadget[0],1L);
     BoolGadget[0].GadgetText = &IntuiStr_no;
     real_pos = AddGList(ControlWindow,&BoolGadget[0],gad_pos,1L,(LONG)NULL);
     RefreshGList(&BoolGadget[0],ControlWindow,(LONG)NULL,1L);
    }
    break;

    case GADGETDOWN:

    if(MIAddress == &BoolGadget[3] || MIAddress == &BoolGadget[4])
    {
     gad_pos = RemoveGList(ControlWindow,&BoolGadget[4],2L);
     BoolGadget[3].Flags ^=SELECTED;
     BoolGadget[4].Flags ^=SELECTED;
     AddGList(ControlWindow, &BoolGadget[4], gad_pos, 2L, NULL);
     RefreshGList(&BoolGadget[4], ControlWindow,(LONG)NULL,2L);
    }
    break;

    case CLOSEWINDOW:

    while(MyIntuiMessage=(struct IntuiMessage *)
     GetMsg(ControlWindow->UserPort)) ReplyMsg(MyIntuiMessage);
    CleanUp();
    exit(TRUE);
    break;
   } /* switch */
  } /* while */
 } /* for */
}
/* ************************************** end *************************** */

VOID OpenALL()
{
 /*==Intuition==*/

 if(!(IntuitionBase=(struct IntuitionBase *) OpenLibrary( "intuition.library",(LONG)LIBRARY_VERSION) ));
 {
   CloseALL();
 }

 /*==Graphics Library==*/

 if(!(GfxBase=(struct GfxBase *)OpenLibrary("graphics.library",(LONG)LIBRARY_VERSION)));
 {
   CloseALL();
 }
}

VOID CloseALL()
{
 if(ControlWindow) CloseWindow(ControlWindow);
 /* if(Scrn) CloseScreen(Scrn); */
 if(GfxBase) CloseLibrary(GfxBase);
} 

VOID CleanUp()
{
 CloseALL();
}


