/*
 *  CREATECYCLEBUTTON.C
 */

#include "newlook.h"

extern struct TextFont *OpenFont(struct TextAttr *);
extern void CloseFont(struct TextFont *);
extern LONG IntuiTextLength(struct IntuiText *);

static SHORT cycle_pairs[2*14]= {
  12,8,
  11,8,  /*......................*/
  11,9,  /*.....*******......*+..*/
   5,9,  /*....**.....**.....*+..*/
   4,8,  /*....**.....**.....*+..*/
   4,2,  /*....**...******...*+..*/
   5,8,  /*....**....****....*+..*/
   5,1,  /*....**.....**.....*+..*/
  11,1,  /*....**............*+..*/
  11,6,  /*....**.....**.....*+..*/
   9,4,  /*.....*******......*+..*/
  14,4,  /*......................*/
  12,6,
  12,2
};

static SHORT csep_pairs[2][4]= { 18,1, 18,9,   /* black */
                                 19,1, 19,9 }; /* white */

struct Gadget *CreateCycleButton(x,y,w, tlist, id)
SHORT x,y,w;
STRPTR *tlist;
USHORT id;
{
  struct Gadget *g;
  struct IntuiText *it;
  struct CycleInfo *ci;
  struct Border *b, *c, *s0, *s1;
  const SHORT h= 13;

  ULONG UserHandle= SetNewLookHandle(PRIVATE_HANDLE);

  if(g= (struct Gadget *)SmartAllocate(GADGETSIZE))
  {
    if(b= CreateBorder(0,0,w,h,FALSE))
    {
      if(c= (struct Border *)SmartAllocate(BORDERSIZE))
      {
        if(s0= (struct Border *)SmartAllocate(BORDERSIZE))
        {
          if(s1= (struct Border *)SmartAllocate(BORDERSIZE))
          {
            if(ci= (struct CycleInfo *)SmartAllocate(CYCLEINFOSIZE))
            {
              if(it= CreateIText(0,0,NULL))
              {
                struct TextFont *tf;
                it->IText= (UBYTE *)*tlist;

                if(tf= (struct TextFont *)OpenFont(&Topaz80))
                { it->TopEdge= (h-tf->tf_Baseline)/2;
                  CloseFont(tf);
                }
                else it->TopEdge= (h-6)/2; /* `known' topaz80 dimensions */

                it->LeftEdge= (w+21-IntuiTextLength(it))/2;

                /* cycle arrow */
                c->LeftEdge     = 2;
                c->TopEdge      = 1;
                c->FrontPen     = 1;
                c->BackPen      = 0;
                c->DrawMode     = JAM1;
                c->Count        = 14;
                c->XY           = cycle_pairs;
                c->NextBorder   = s0;

                /* black seperator */
                s0->LeftEdge     = 2;
                s0->TopEdge      = 1;
                s0->FrontPen     = 1;
                s0->BackPen      = 0;
                s0->DrawMode     = JAM1;
                s0->Count        = 2;
                s0->XY           = csep_pairs[0];
                s0->NextBorder   = s1;

                /* white seperator */
                s1->LeftEdge     = 2;
                s1->TopEdge      = 1;
                s1->FrontPen     = 2;
                s1->BackPen      = 0;
                s1->DrawMode     = JAM1;
                s1->Count        = 2;
                s1->XY           = csep_pairs[1];
                s1->NextBorder   = b;

                /* struct CycleInfo */
                ci->ci_UserData  = (APTR)NULL;
                ci->ci_IntuiText = it;
                ci->ci_Items     = tlist;
                ci->ci_CurrentIndex = 0;

                g->NextGadget    = (struct Gadget *)NULL;
                g->LeftEdge      = x;
                g->TopEdge       = y;
                g->Width         = w;
                g->Height        = h;
                g->Flags         = GADGHCOMP;
                g->Activation    = GADGIMMEDIATE|RELVERIFY;
                g->GadgetType    = BOOLGADGET;
                g->GadgetRender  = (APTR)c;
                g->SelectRender  = (APTR)NULL;
                g->GadgetText    = it;
                g->MutualExclude = (LONG)0L;
                g->SpecialInfo   = (APTR)NULL;
                g->GadgetID      = id;
                g->UserData      = (APTR)ci;

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