;/*
   MakeClass Image VER 1 REV 02 ;ASM
   Avail Flush >NIL:
   Quit
*/

///Header
#include <libraries/feelin.h>

#include <clib/utility_protos.h>
#include <clib/feelin_protos.h>

#include <pragmas/dos_pragmas.h>
#include <pragmas/utility_pragmas.h>

UBYTE FCC_Name[] = FC_Image;
UBYTE FCC_ID[]   = "$VER: FC_Image 1.02 (06-02-01) by Olivier Laviale (lotan9@aol.com)";

struct Library       *DOSBase,*UtilityBase;
struct FeelinBase    *FeelinBase;

struct LocalObjectData
{
   APTR                       ImageDisplay;
};
//+

/*** Methods ***************************************************************/

///Image_New
ULONG SAVEDS image_New(struct FeelinClass *Class,APTR Obj,struct LocalObjectData *LOD,struct TagItem *Tags)
{
   LOD->ImageDisplay = F_NewObjA(FC_ImageDisplay,Tags);
   return F_SuperDoA(Class,Obj,FM_New,(ULONG *)Tags);
}
//+
///Image_Dispose
ULONG SAVEDS image_Dispose(struct FeelinClass *Class,APTR Obj,struct LocalObjectData *LOD)
{
   LOD->ImageDisplay = (APTR)F_DisposeObj(LOD->ImageDisplay);
   return F_SuperDoA(Class,Obj,FM_Dispose,NULL);
}
//+

///Image_Setup
ULONG SAVEDS image_Setup(struct FeelinClass *Class,APTR Obj,struct LocalObjectData *LOD,ULONG *Setup)
{
   if (F_SuperDoA(Class,Obj,FM_Setup,Setup))
   {
      F_DoA(LOD->ImageDisplay,FM_ImageDisplay_Setup,Setup);

      return TRUE;
   }
   return FALSE;
}
//+
///Image_Cleanup
ULONG SAVEDS image_Cleanup(struct FeelinClass *Class,APTR Obj,struct LocalObjectData *LOD)
{
   F_Do(LOD->ImageDisplay,FM_ImageDisplay_Cleanup,_render(Obj));
   return F_SuperDoA(Class,Obj,FM_Cleanup,NULL);
}
//+
///Image_AskMinMax
ULONG SAVEDS image_AskMinMax(struct FeelinClass *Class,APTR Obj,struct LocalObjectData *LOD)
{
   _minw(Obj) += F_Get(LOD->ImageDisplay,FA_Image_Width);
   _minh(Obj) += F_Get(LOD->ImageDisplay,FA_Image_Height);

   return F_SuperDoA(Class,Obj,FM_AskMinMax,NULL);
}
//+
///Image_Draw
ULONG SAVEDS image_Draw(struct FeelinClass *Class,APTR Obj,struct LocalObjectData *LOD,struct FS_Draw *Draw)
{
   struct FeelinRect rect;

   if (Draw->Flags & FF_Draw_Update) F_SuperDoA(Class,Obj,FM_Draw,(ULONG *)Draw);

   F_Set(LOD->ImageDisplay,FA_Image_State,F_Get(Obj,FA_Selected) ? FV_Image_Selected : FV_Image_Normal);

   if (FF_Draw_Object & Draw->Flags)
   {
      rect.x1 = _mx(Obj) ; rect.x2 = rect.x1 + _mw(Obj) - 1;
      rect.y1 = _my(Obj) ; rect.y2 = rect.y1 + _mh(Obj) - 1;

      F_Do(LOD->ImageDisplay,FM_ImageDisplay_Draw,&rect,_render(Obj));
   }

   return NULL;
}
//+

/*** Class *****************************************************************/

///FCC_Dispatcher
ULONG SAVEDS ASM FCC_Dispatcher(REG_A2 struct FeelinClass *Class,REG_A0 APTR Obj,REG_D0 Method,REG_A1 ULONG *Args)
{
   struct LocalObjectData *LOD = INST_DATA(Class,Obj);

   switch (Method)
   {
      case FM_New:       return image_New       (Class,Obj,LOD,(struct TagItem *)Args);
      case FM_Dispose:   return image_Dispose   (Class,Obj,LOD);

      case FM_Setup:     return image_Setup     (Class,Obj,LOD,Args);
      case FM_Cleanup:   return image_Cleanup   (Class,Obj,LOD);
      case FM_AskMinMax: return image_AskMinMax (Class,Obj,LOD);
      case FM_Draw:      return image_Draw      (Class,Obj,LOD,(struct FS_Draw *)Args);

      default:           return F_SuperDoA(Class,Obj,Method,Args);
   }
}
//+
///FCC_Info
ULONG * SAVEDS ASM FCC_Info(REG_A0 struct FeelinBase *Feelin)
{
   static ULONG Tags[] =
   {  FA_SuperID,    (ULONG)FC_Area,
      FA_Dispatcher, (ULONG)FCC_Dispatcher,
      FA_DataSize,   sizeof (struct LocalObjectData),
      NULL
   };

   FeelinBase  = Feelin;
   DOSBase     = Feelin->Dos;
   UtilityBase = Feelin->Utility;

   return Tags;
}
//+
