#include "BOOPSILib.h"

#define MYLIB_BOOPSI
#define MYLIB_GRAPHICS
#define ROM_VERSION 39

#ifndef INTUITION_GADGETCLASS_H
#include <intuition/gadgetclass.h>
#endif

#ifndef INTUITION_IMAGECLASS_H
#include <intuition/imageclass.h>
#endif

#include "MyLib.h"

#include "StaticSavedsAsmA0A1A2.h"

/****** Label/--background-- *********************************************
*
*	This class implements label texts.
*
*	Parent class: gadgetclass
*
*************************************************************************/

struct InstanceData
{
  struct BOOPSILibS_LayoutInfo LayoutInfo;
};

/************************************************************************/

struct IClass *BOOPSILibC_Label;

/************************************************************************/

METHOD(OM_NEW,struct opSet *)

{
  if ((TheObject=(Object *)SUPER_METHOD)!=NULL)
    {
      ((struct ExtGadget *)TheObject)->GadgetText=(struct IntuiText *)GetTagData(GA_Text,NULL,Message->ops_AttrList);
      INSTANCEDATA->LayoutInfo.Weight=0;
    }
  return (ULONG)TheObject;
}

/************************************************************************/

METHOD(BOOPSILibM_Init,const struct BOOPSILibP_Init *)

{
  struct InstanceData *InstanceData;
  struct RastPort RastPort;

  DoMethod(Message->Root,BOOPSILibM_Root_AddGadget,(struct Gadget *)TheObject);
  ((struct ExtGadget *)TheObject)->SelectRender=Message->Font;
  InitRastPort(&RastPort);
  InstanceData=INSTANCEDATA;
  SetFont(&RastPort,Message->Font);
  InstanceData->LayoutInfo.Width.Max=InstanceData->LayoutInfo.Width.Min=
    LabelText(&RastPort,(char *)((struct ExtGadget *)TheObject)->GadgetText,FALSE);
  InstanceData->LayoutInfo.Height.Max=InstanceData->LayoutInfo.Height.Min=RastPort.TxHeight;
  return (ULONG)&InstanceData->LayoutInfo;
}

/************************************************************************/

METHOD(BOOPSILibM_Layout,const struct BOOPSILibP_Layout *)

{
  *(struct IBox *)&((struct ExtGadget *)TheObject)->LeftEdge=Message->Position;
  return 0;
}

/************************************************************************/

METHOD(OM_GET,struct opGet *)

{
  switch (Message->opg_AttrID)
    {
    case BOOPSILibA_LayoutInfo:
      *Message->opg_Storage=(ULONG)&INSTANCEDATA->LayoutInfo;
      return TRUE;
    }
  return SUPER_METHOD;
}

/************************************************************************/

METHOD(GM_RENDER,const struct gpRender *)

{
  UWORD *Pens;
  struct InstanceData *InstanceData;

  InstanceData=INSTANCEDATA;
  Pens=Message->gpr_GInfo->gi_DrInfo->dri_Pens;
  SetABPenDrMd(Message->gpr_RPort,Pens[TEXTPEN],Pens[BACKGROUNDPEN],JAM2);
  SetFont(Message->gpr_RPort,(struct TextFont *)((struct ExtGadget *)TheObject)->SelectRender);
  Move(Message->gpr_RPort,
       ((struct ExtGadget *)TheObject)->LeftEdge,
       ((struct ExtGadget *)TheObject)->TopEdge+Message->gpr_RPort->TxBaseline);
  LabelText(Message->gpr_RPort,(char *)((struct ExtGadget *)TheObject)->GadgetText,TRUE);
  return 0;
}

/************************************************************************/

STATIC_SAVEDS_ASM_A0A1A2(ULONG,Dispatcher,struct IClass *,TheClass,Msg,Message,Object *,TheObject)

{
  switch(Message->MethodID)
    {
      METHOD_DISP(OM_NEW,struct opSet *);
      METHOD_DISP(OM_GET,struct opGet *);
      METHOD_DISP(BOOPSILibM_Init,struct BOOPSILibP_Init *);
      METHOD_DISP(BOOPSILibM_Layout,struct BOOPSILibP_Layout *);
      METHOD_DISP(GM_RENDER,struct gpRender *);
    }
  return SUPER_METHOD;
}

/************************************************************************/

struct IClass *CreateBOOPSILibC_Label(void)

{
  if ((BOOPSILibC_Label=MakeClass(NULL,BOOPSI_gadgetclass,NULL,sizeof(struct InstanceData),0))!=NULL)
    {
      BOOPSILibC_Label->cl_Dispatcher.h_Entry=Dispatcher;
    }
  return BOOPSILibC_Label;
}
