/***************************************************************************/
/**                                                                       **/
/** This file contains the code for the customclass                       **/
/**                                                                       **/
/***************************************************************************/

#include "WAinclude.h"
#define D(x)

/* Datatype customclass */

extern struct GfxBase* GfxBase;

/******** NEW *********/

ULONG __saveds DTImageNew(struct IClass* cl,Object *obj,struct OpSet *msg)
{
	struct DTImageData* data;
	struct TagItem *tags;	

	if (!(obj = (Object *)DoSuperMethodA(cl,obj,(Msg)msg)))
	{
		return(0);
	}
	
	data=INST_DATA(cl,obj);

	
	/* check what attributes we have and set the class' datafields */
	tags=((struct opSet *)msg)->ops_AttrList;
	data->name 			= (char *)GetTagData(MUIA_DTImage_File,(ULONG)"anim",tags);
	

	return((unsigned long)obj);
	 
}
	 

/******** Setup *********/

ULONG __saveds DTImageSetup(struct IClass* cl,Object *obj,struct MUIP_HandleInput * msg)
{	 

	struct DTImageData *data = INST_DATA(cl,obj);
	ULONG lck;
	
	if (!DoSuperMethodA(cl,obj,(Msg)msg))
		return(FALSE);

	if(data->ipimage=IP_RequestImageTags(data->name, ImagePool_Screen, _screen(obj), TAG_DONE ))
		data->bitmap=data->ipimage->BMP;
	
	return(TRUE);
}


/******** Ask minmax *********/

ULONG __saveds DTImageAskMinMax(struct IClass *cl,Object *obj,struct MUIP_AskMinMax *msg)
{

  	struct DTImageData *data = INST_DATA(cl,obj);
	struct MUI_MinMax *mi;

	DoSuperMethodA(cl,obj,(Msg)msg);

	mi = msg->MinMaxInfo;

	D(KPrintF("AskMinMax\n");)
	
	if (data->bitmap)
	{
		int w, h;
		
		w=data->ipimage->Width;
		h=data->ipimage->Height;

		mi->MinWidth  += w;
		mi->MinHeight += h;
		mi->DefWidth  += w;
		mi->DefHeight += h;
		mi->MaxWidth  += w;
		mi->MaxHeight += h;
	}
	else
	{
		
		mi->MinWidth  += 10;
		mi->MinHeight += 10;
		mi->DefWidth  += 10;
		mi->DefHeight += 10;
		mi->MaxWidth  += 10;
		mi->MaxHeight += 50;
	}
	
	D(KPrintF("DoneAskMinMax\n");)
	return(0);

}

/******** Draw *********/

ULONG __saveds DTImageDraw(struct IClass *cl,Object *obj,struct MUIP_Draw *msg)
{
	struct DTImageData *data = INST_DATA(cl,obj);

	DoSuperMethodA(cl,obj,(Msg)msg);
	
	/* time to draw... */
	if ((msg->flags & MADF_DRAWUPDATE) | (msg->flags & MADF_DRAWOBJECT))
	{
		if (data->bitmap)
		{
			BltBitMapRastPort(data->bitmap,0,0,_rp(obj),_mleft(obj),_mtop(obj),_width(obj), _height(obj),0xc0);
		}
	}

	return(0);
}


/******** Clean up *********/

ULONG __saveds DTImageCleanup(struct IClass *cl,Object *obj,Msg msg)
{
   struct DTImageData *data=INST_DATA(cl,obj);

	if(data->bitmap)
		IP_FreeImage(data->ipimage);
	
   return(DoSuperMethodA(cl,obj,msg));
}


/******** Dispose *********/

ULONG __saveds DTImageDispose(struct IClass *cl,Object *obj,Msg msg)
{

   struct DTImageData *data=INST_DATA(cl,obj);

	return(DoSuperMethodA(cl,obj,msg));
}


/******** Dispatcher *********/

__asm __saveds ULONG DTImageDispatcher(register __a0 struct IClass *cl,
		register __a2 Object *obj ,
		register __a1 Msg msg )
{
	switch (msg->MethodID)
	{
	   
		case OM_NEW: 				return(DTImageNew	(cl,obj,(APTR)msg));
		case OM_DISPOSE:			return(DTImageDispose	(cl,obj,(APTR)msg));
		case MUIM_AskMinMax: 	return(DTImageAskMinMax (cl,obj,(APTR)msg));
		case MUIM_Setup:			return(DTImageSetup	(cl,obj,(APTR)msg));
		case MUIM_Draw:			return(DTImageDraw      (cl,obj,(APTR)msg));
		case MUIM_Cleanup:		return(DTImageCleanup	(cl,obj,(APTR)msg));
	}

	return(DoSuperMethodA(cl,obj,msg));
}
