/*  GadTools layout toolkit
**
**  Copyright © 1993-1995 by Olaf `Olsen' Barthel
**  Freely distributable.
*/

#include "gtlayout_global.h"

WORD __regargs
LTP_Find_Clicked_Item(LayoutHandle *handle,ObjectNode *radio,LONG x,LONG y)
{
	if(x >= radio -> Left + INTERWIDTH)
	{
		WORD i,top = radio -> Top,height,single;

		height = ((radio -> Height + handle -> InterHeight) / radio -> Lines);
		single = height - handle -> InterHeight;

		for(i = 0 ; i <= radio -> Max ; i++)
		{
			if(y >= top && y < top + single)
				return(i);
			else
				top += height;
		}
	}

	return(-1);
}


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


ObjectNode * __regargs
LTP_FindNode_Position(ObjectNode *group,LONG x,LONG y)
{
	ObjectNode	*node;
	ULONG		 page;

	SCANPAGE(group,node,page)
	{
		if(node -> Type == GROUP_KIND)
		{
			ObjectNode *result;

			if(result = LTP_FindNode_Position(node,x,y))
				return(result);
			else
			{
				if(node -> Top <= y && node -> Top + node -> Height > y && node -> Left <= x && node -> Left + node -> Width > x)
				{
					while(node)
					{
						if(node -> ID <= PHANTOM_GROUP_ID)
							node = node -> Special . Group . ParentGroup;
						else
							return(node);
					}

					return(NULL);
				}
			}
		}
		else
		{
			if(node -> Top <= y && node -> Top + node -> Height > y)
			{
				switch(node -> Type)
				{
					case CHECKBOX_KIND:

						if(node -> LabelPlace == PLACE_LEFT)
						{
							if(node -> Left - (node -> LabelWidth + INTERWIDTH) <= x && node -> Left - INTERWIDTH > x)
								return(node);
						}
						else
						{
							if(node -> Left + node -> Width + INTERWIDTH <= x && node -> Left + node -> Width + INTERWIDTH + node -> LabelWidth > x)
								return(node);
						}

						break;

					case MX_KIND:

						if(node -> Left + node -> Width + INTERWIDTH <= x && node -> Left + node -> Width + INTERWIDTH + node -> Special . Radio . LabelWidth > x)
							return(node);

						break;

					default:

						if(node -> Left <= x && node -> Left + node -> Width > x)
						{
							if(node -> Type == PICKER_KIND)
								return(node -> Special . Picker . Parent -> UserData);

							if(node -> Type == INCREMENTER_KIND)
								return(node -> Special . Incrementer . Parent -> UserData);

							return(node);
						}
				}
			}
		}
	}

	return(NULL);
}


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


ObjectNode * __regargs
LTP_FindNode(ObjectNode *group,LONG id)
{
	ObjectNode *node;
	ObjectNode *result;

	SCANGROUP(group,node)
	{
		if(node -> Type == GROUP_KIND)
		{
			if(node -> ID == id)
				return(node);

			if(result = LTP_FindNode(node,id))
				return(result);
		}
		else
		{
			if((node -> ID == id) && (node -> Type != PICKER_KIND) && (node -> Type != INCREMENTER_KIND))
				return(node);
		}
	}

	return(NULL);
}


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


struct Gadget * __regargs
LTP_FindGadget(LayoutHandle *handle,LONG id)
{
	if(handle && handle -> GadgetArray)
	{
		LONG i = handle -> Count;

		while(i--)
		{
			if(handle -> GadgetArray[i])
			{
				if(handle -> GadgetArray[i] -> GadgetID == id && handle -> GadgetArray[i] -> UserData)
				{
					register struct ObjectNode *Node = (struct ObjectNode *)handle -> GadgetArray[i] -> UserData;

					if(Node -> PointBack == Node && Node -> Host == handle -> GadgetArray[i])
						return(handle -> GadgetArray[i]);
				}
			}
		}
	}

	return(NULL);
}
