/*
\\              Custom `select' class
*/

        #include <Global/Main_Global.h>


ULONG ASM SAVEDS _Select_Dispatcher( REG(a0) struct IClass *cl,
					REG(a2) Object *o,
					REG(a1) Msg msg)
{

	switch(msg->MethodID)
	{
	//	case OM_NEW:	     return(Select_New(cl,o,(APTR)msg));
		case MUIM_DragQuery: return(Select_DragQuery(cl,o,(APTR)msg));
		case MUIM_DragDrop:  return(Select_DragDrop(cl,o,(APTR)msg));       

	}
	
     return(DoSuperMethodA(cl,o,(APTR) msg));
}


ULONG Select_New(struct IClass *cl, Object *obj, struct opSet *msg)

{
	         
  	
	
        if(obj = (Object *)DoSuperNew(cl,obj,	                               
	                                      	                   
	                                 TAG_MORE,msg->ops_AttrList))
	    {
	    return((ULONG)obj);
	    }
  return(0);
}

ULONG Select_DragQuery( struct IClass *cl, Object *o, struct MUIP_DragQuery *msg)
{
  
 if(msg->obj==o)
   return(MUIV_DragQuery_Refuse);
   
 return(MUIV_DragQuery_Accept);
}

ULONG Select_DragDrop( struct IClass *cl,Object *o,struct MUIP_DragDrop *msg)
{
  return(TRUE);
}
















        // Root for window, returns object clicked on in MUIA_Locate_Obj

static ULONG Locate_Setup( struct IClass *cl, Object *o, struct MUIP_Setup *msg )
{
        MUI_RequestIDCMP( o, IDCMP_MOUSEBUTTONS );
        return( DoSuperMethodA( cl, o, msg ) );
}
static ULONG Locate_Cleanup( struct IClass *cl, Object *o, APTR msg )
{
        MUI_RejectIDCMP( o, IDCMP_MOUSEBUTTONS );
        return( DoSuperMethodA( cl, o, msg ) );
}

static BOOL inobject( WORD x, WORD y, Object *o )
{
        if( (_mleft(o) > x) || (_mright(o) < x) ) return( FALSE );
        if( (_mtop(o) > y) || (_mbottom(o) < y) ) return( FALSE );
        return( TRUE );
}

static ULONG Locate_Input( struct IClass *cl, Object *o, struct MUIP_HandleInput *msg )
{
        WORD x, y;
        struct Module *curr, *test, *limit;

        if((msg->imsg->Class & IDCMP_MOUSEBUTTONS) && (msg->imsg->Qualifier == IEQUALIFIER_LEFTBUTTON))
        {
         x = msg->imsg->MouseX;
         y = msg->imsg->MouseY;
         
         if( inobject( x, y, o ) )
            {
              for( curr = FirstNode( &Global->ObjectList ); curr->MUI_Object == _win(o); curr = NextNode( test ) );
                  limit = NextNode( curr );
                  for( test = curr; test != limit; test = ParseObjectList( test ) )
                        {
                          if( inobject( x, y, curr->MUI_Object ) ) curr = test;
                        }
                        newselectobj = curr;
                        set( o, MUIA_Locate_Object, curr );
                }
        }
        return( 1 );
}

SAVEDS ASM ULONG _Locate_Dispatcher(    REG(a0) struct IClass *cl,
                                        REG(a2) Object *o,
                                        REG(a1) Msg msg )
{
        switch( msg->MethodID )
        {
                case MUIM_Setup:        return( Locate_Setup( cl, o, (APTR) msg ) );
                case MUIM_Cleanup:      return( Locate_Cleanup( cl, o, (APTR) msg ) );
                case MUIM_HandleInput:  return( Locate_Input( cl, o, (APTR) msg ) );
                default:                return( DoSuperMethodA( cl, o, (APTR) msg ) );
        }
}
