/*
 *  CREATERADIOBUTTON.C
 */

#include "newlook.h"

extern void CopyMem(APTR,APTR,ULONG);

static SHORT radioled_pairs[10*2]= {
  5,2,
 11,2,  /* ..1111111111112.. */
 12,3,  /* .11...........22. */
  4,3,  /* 11...3333333...22 */
  4,4,  /* 11..333333333..22 */
 12,4,  /* 11..333333333..22 */
 12,5,  /* 11..333333333..22 */
  4,5,  /* 11...3333333...22 */
  5,6,  /* .11...........22. */
 11,6   /* ..1222222222222.. */
};

static SHORT radioborder_pairs[2][2*9]= {
     2,0,  0,2,  0,6,  2,8,  2,7,  1,6,  1,2,  3,0, 13,0,
    14,8, 16,6, 16,2, 14,0, 14,1, 15,2, 15,6, 13,8,  3,8 
};

struct Gadget *CreateRadioButton(x,y,pn,id)
SHORT x,y;
BOOL pn;
USHORT id;
{
  struct Gadget *g;
  struct Border *b[2][3];  /* b[0][x]= unselected, b[1][x]= selected */

  ULONG UserHandle= SetNewLookHandle(PRIVATE_HANDLE);

  if(g= (struct Gadget *)SmartAllocate(GADGETSIZE))
  {
    if(b[0][0]= (struct Border *)SmartAllocate(BORDERSIZE))
    {
      if(b[0][1]= (struct Border *)SmartAllocate(BORDERSIZE))
      {
        if(b[0][2]= (struct Border *)SmartAllocate(BORDERSIZE))
        {
          if(b[1][0]= (struct Border *)SmartAllocate(BORDERSIZE))
          {
            if(b[1][1]= (struct Border *)SmartAllocate(BORDERSIZE))
            {
              if(b[1][2]= (struct Border *)SmartAllocate(BORDERSIZE))
              {
                b[0][0]->LeftEdge   = b[1][0]->LeftEdge = 0;
                b[0][0]->TopEdge    = b[1][0]->TopEdge  = 0;
                b[0][0]->BackPen    = b[1][0]->BackPen  = 0;
                b[0][0]->Count      = b[1][0]->Count    = 10;
                b[0][0]->XY         = b[1][0]->XY       = radioled_pairs;

                b[0][0]->FrontPen   = 0;
                b[0][0]->DrawMode   = JAM2;
                b[0][0]->NextBorder = b[0][1];

                b[1][0]->FrontPen   = 3;
                b[1][0]->DrawMode   = JAM1;
                b[1][0]->NextBorder = b[1][1];


                b[0][1]->LeftEdge   = b[0][2]->LeftEdge = 0;
                b[0][1]->TopEdge    = b[0][2]->TopEdge  = 0;
                b[0][1]->BackPen    = b[0][2]->BackPen  = 0;
                b[0][1]->DrawMode   = b[0][2]->DrawMode = JAM1;
                b[0][1]->Count      = b[0][2]->Count    = 9;

                b[0][1]->XY         = radioborder_pairs[0];
                b[0][2]->XY         = radioborder_pairs[1];

                CopyMem((APTR)b[0][1], (APTR)b[1][1], (ULONG)BORDERSIZE);
                CopyMem((APTR)b[0][2], (APTR)b[1][2], (ULONG)BORDERSIZE);

                b[0][1]->FrontPen   = 2;
                b[0][1]->NextBorder = b[0][2];

                b[0][2]->FrontPen   = 1;
                b[0][2]->NextBorder = (struct Border *)NULL;

                b[1][1]->FrontPen   = 1;
                b[1][1]->NextBorder = b[1][2];

                b[1][2]->FrontPen   = 2;
                b[1][2]->NextBorder = (struct Border *)NULL;

                g->NextGadget    = (struct Gadget *)NULL;
                g->LeftEdge      = x;
                g->TopEdge       = y;
                g->Width         = RADIOBUTTON_WIDTH;
                g->Height        = RADIOBUTTON_HEIGHT;
                g->Flags         = pn ? GADGHIMAGE|SELECTED : GADGHIMAGE;
                g->Activation    = GADGIMMEDIATE|RELVERIFY|TOGGLESELECT;
                g->GadgetType    = BOOLGADGET;
                g->GadgetRender  = (APTR)b[0][0];
                g->SelectRender  = (APTR)b[1][0];
                g->GadgetText    = (struct IntuiText *)NULL;
                g->MutualExclude = (LONG)0L;
                g->SpecialInfo   = (APTR)NULL;
                g->GadgetID      = id;
                g->UserData      = (APTR)NULL;

                MakePrivateHandlePublic(UserHandle);
                return g;
              }
            }
          }
        }
      }
    }
  }
  if(UserHandle != PRIVATE_HANDLE)
  { SmartFreeAll(PRIVATE_HANDLE);
    (void)SetNewLookHandle(UserHandle);
  }
  return (struct Gadget *)NULL;
}
