/* checkbox gadget subclass */

#include <proto/bgui.h>
#include <proto/intuition.h>
#include <libraries/bgui_macros.h>
#include "checkbox.h"

Class *CheckClass;

struct SizeDelta
{
  ULONG ScrWidth;
  ULONG ScrHeight;
  ULONG FontHeight;
  LONG DeltaX;
  LONG DeltaY;
};

#define DELTAS 4
static struct SizeDelta Deltas[DELTAS] = {
  { 640,200,8,-11,1 },
  { 640,200,9,-15,0 },
  { 640,256,8,-6,1 },
  { 640,256,9,-9,0 },
};

ULONG CheckGadg_DIMENSIONS(Class *cl,Object *o,struct grmDimensions *dim)
{
  ULONG retval = DoSuperMethodA(cl,o,(Msg)dim);

  if (dim->grmd_GInfo != NULL)
  {
    int i;

    for (i = 0; i < DELTAS; i++)
    {
      if (dim->grmd_RPort->TxHeight == Deltas[i].FontHeight)
      {
	struct Screen* Scr = dim->grmd_GInfo->gi_Screen;

        if (Scr->Width == Deltas[i].ScrWidth)
	{
	  if (Scr->Height == Deltas[i].ScrHeight)
	  {
	    *(dim->grmd_MinSize.Width) += Deltas[i].DeltaX;
	    *(dim->grmd_MinSize.Height) += Deltas[i].DeltaY;
	  }
	}
      }
    }
  }
  return retval;
}

__geta4 ULONG DispatchCheckGadg(__a0 Class *cl,__a2 Object *o,__a1 Msg msg)
{
  ULONG retval;

  switch (msg->MethodID)
  {
    case GRM_DIMENSIONS:
      retval = CheckGadg_DIMENSIONS(cl,o,(struct grmDimensions *)msg);
      break;
    default:
      retval = DoSuperMethodA(cl,o,(Msg)msg);
      break;
  }
  return retval;
}

Class *InitCheckClass(void)
{
  Class *super;

  if (CheckClass == NULL)
  {
    if (super = BGUI_GetClassPtr(BGUI_CHECKBOX_GADGET))
    {
      CheckClass = MakeClass(NULL,NULL,super,0,0);
      if (CheckClass)
	CheckClass->cl_Dispatcher.h_Entry = (HOOKFUNC)DispatchCheckGadg;
    }
  }
  return CheckClass;
}

void FreeCheckClass(void)
{
  if (CheckClass) FreeClass(CheckClass);
  CheckClass = NULL;
}
