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

#include "gtlayout_global.h"

VOID __regargs
LTP_Spread(LayoutHandle *Handle,ObjectNode *Group,LONG Width,LONG Height)
{
	ObjectNode	*Node;
	LONG		 Count;

	Count = 0;

	SCANGROUP(Group,Node)
	{
		Count++;
	}

	if(Group -> Special . Group . Horizontal)
	{
		LONG Room = Width - Group -> Width,Left,Width,i = 0;

		if(Count > 1)
		{
			Left = 0;

			Room += --Count * Handle -> InterWidth;
		}
		else
			Left = Room / 2;

		SCANGROUP(Group,Node)
		{
			if(!LIKE_STRING_KIND(Node) || Node -> Special . String . LinkID == -1)
			{
				Width = Node -> Width;

				switch(Node -> LabelPlace)
				{
					case PLACE_LEFT:

						if(Node -> Type == MX_KIND)
						{
							Left += Node -> Special . Radio . LabelWidth + INTERWIDTH;

							if(Node -> Label)
							{
								if(Node -> Special . Radio . TitlePlace == PLACETEXT_LEFT)
									Left += Node -> LabelWidth + INTERWIDTH;
								else
									Width += INTERWIDTH + Node -> LabelWidth;
							}
						}
						else
							Left += Node -> LabelWidth + INTERWIDTH;

						break;

					case PLACE_RIGHT:

						if(Node -> Type == MX_KIND)
						{
							Width += INTERWIDTH + Node -> Special . Radio . LabelWidth;

							if(Node -> Label)
							{
								if(Node -> Special . Radio . TitlePlace == PLACETEXT_LEFT)
									Left += Node -> LabelWidth + INTERWIDTH;
								else
									Width += INTERWIDTH + Node -> LabelWidth;
							}
						}
						else
							Width += INTERWIDTH + Node -> LabelWidth;

						break;
				}

				if(Node -> Type == LISTVIEW_KIND && Node -> Special . List . ExtraLabelWidth)
					Left += Node -> Special . List . ExtraLabelWidth + INTERWIDTH;

				if(Node -> Type == SLIDER_KIND)
				{
					if(Node -> Special . Slider . LevelPlace == PLACETEXT_RIGHT)
						Width += INTERWIDTH + Node -> Special . Slider . LevelWidth;

					if(Node -> Special . Slider . LevelPlace == PLACETEXT_LEFT && Node -> LabelPlace != PLACE_LEFT)
						Left += INTERWIDTH + Node -> Special . Slider . LevelWidth;
				}

#ifdef DO_LEVEL_KIND
				if(Node -> Type == LEVEL_KIND)
				{
					if(Node -> Special . Level . LevelPlace == PLACETEXT_RIGHT)
						Width += INTERWIDTH + Node -> Special . Level . MaxLevelWidth;

					if(Node -> Special . Level . LevelPlace == PLACETEXT_LEFT && Node -> LabelPlace != PLACE_LEFT)
						Left += INTERWIDTH + Node -> Special . Level . MaxLevelWidth;
				}
#endif	/* DO_LEVEL_KIND*/

				Node -> Left = Left;

				Left += Width + ((Room * (i + 1)) / Count - (Room * i) / Count);

				i++;
			}
		}
	}
	else
	{
		LONG Room = Height - Group -> Height,Height,Top,y,i = 0;

		if(Count > 1)
		{
			Top = 0;

			Room += --Count * Handle -> InterHeight;
		}
		else
			Top = Room / 2;

		SCANGROUP(Group,Node)
		{
			if(!LIKE_STRING_KIND(Node) || Node -> Special . String . LinkID == -1)
			{
				if(Count++)
				{
					if(Node -> ExtraSpace > 0)
						y = Top + Node -> ExtraSpace * Handle -> InterHeight;
					else
					{
						if(Node -> ExtraSpace < 0)
							y = Top - Node -> ExtraSpace;
						else
							y = Top + Handle -> InterHeight;
					}
				}
				else
					y = Top;

				if(Node -> LabelPlace == PLACE_ABOVE)
					y += Handle -> RPort . TxHeight + INTERHEIGHT;

				Node -> Top = y;

				if(Node -> LabelPlace == PLACE_BELOW && Node -> Label)
					Height = Node -> Height + INTERHEIGHT + Handle -> RPort . TxHeight;
				else
					Height = Node -> Height;

				Top = y + Height + ((Room * (i + 1)) / Count - (Room * i) / Count);

				i++;
			}
		}
	}
}
