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

#include "gtlayout_global.h"

ObjectNode * __regargs
LTP_CreateObjectNode(LayoutHandle *handle,UBYTE type,ULONG id,STRPTR label)
{
	ObjectNode	*node;
	ULONG		 size,extra;

	switch(type)
	{
#ifdef DO_GAUGE_KIND

		case GAUGE_KIND:

			extra = sizeof(GaugeExtra);
			break;
#endif

#ifdef DO_TAPEDECK_KIND
		case TAPEDECK_KIND:

			extra = sizeof(TapeDeckExtra);
			break;
#endif	/* DO_TAPEDECK_KIND */

#ifdef DO_LEVEL_KIND
		case LEVEL_KIND:

			extra = sizeof(LevelExtra);
			break;
#endif	/* DO_LEVEL_KIND */

		case BUTTON_KIND:

			extra = sizeof(ButtonExtra);
			break;

		case XBAR_KIND:
		case YBAR_KIND:

			extra = sizeof(BarExtra);
			break;

		case BOX_KIND:

			extra = sizeof(BoxExtra);
			break;

		case FRAME_KIND:

			extra = sizeof(FrameExtra);
			break;

		case PICKER_KIND:

			extra = sizeof(PickerExtra);
			break;

		case INCREMENTER_KIND:

			extra = sizeof(IncrementerExtra);
			break;

		case LISTVIEW_KIND:

			extra = sizeof(ListExtra);
			break;

		case MX_KIND:

			extra = sizeof(RadioExtra);
			break;

		case TEXT_KIND:

			extra = sizeof(TextExtra);
			break;

		case NUMBER_KIND:

			extra = sizeof(NumberExtra);
			break;

		case CYCLE_KIND:

			extra = sizeof(CycleExtra);
			break;

		case PALETTE_KIND:

			extra = sizeof(PalExtra);
			break;

		case SLIDER_KIND:

			extra = sizeof(SliderExtra);
			break;

		case SCROLLER_KIND:

			extra = sizeof(ScrollerExtra);
			break;

		case INTEGER_KIND:

			extra = sizeof(IntegerExtra);
			break;

		case FRACTION_KIND:
		case PASSWORD_KIND:
		case STRING_KIND:

			extra = sizeof(StringExtra);
			break;

		case HORIZONTAL_KIND:
		case VERTICAL_KIND:

			extra = sizeof(GroupExtra);
			break;

		default:

			extra = 0;
			break;
	}

	size = offsetof(ObjectNode,Special) + extra;

	if(node = LTP_Alloc(handle,size))
	{
		node -> Type		= type;
		node -> Label		= label;
		node -> ID		= id;
		node -> PointBack	= node;

		switch(type)
		{
			case LISTVIEW_KIND:

				node -> LabelPlace			= PLACE_ABOVE;
				node -> Lines				= 1;
				node -> Current 			= ~0;
				node -> Special . List . LinkID		= -1;

				break;

			case PASSWORD_KIND:
			case STRING_KIND:

				node -> Special . String . LayoutHandle 	= handle;
				node -> Special . String . LinkID		= -1;
				node -> Special . String . MaxChars		= 256;
				node -> Special . String . MaxHistoryLines	= 0;

				break;

			case INTEGER_KIND:

				node -> Special . Integer . LayoutHandle	= handle;
				node -> Min					= -2147483647;
				node -> Max					= 2147483647;
				node -> Special . Integer . MaxChars		= 11;
				node -> Special . Integer . MaxHistoryLines	= 0;

				break;

#ifdef DO_FRACTION_KIND
			case FRACTION_KIND:

				node -> Special . String . LayoutHandle 	= handle;
				node -> Special . String . LinkID		= -1;
				node -> Min					= 0;
				node -> Max					= 2147483647;
				node -> Special . String . MaxChars		= 12;
				node -> Special . String . MaxHistoryLines	= 0;

				break;
#endif

#ifdef DO_TAPEDECK_KIND
			case TAPEDECK_KIND:

				node -> LabelPlace = PLACE_BELOW;
				break;
#endif	/* DO_TAPEDECK_KIND */

			case MX_KIND:

				node -> LabelPlace				= PLACE_RIGHT;
				node -> Special . Radio . TitlePlace		= PLACETEXT_LEFT;
				node -> Special . Radio . AutoPageID		= -1;

				break;

			case CYCLE_KIND:

				node -> Special . Cycle . AutoPageID = -1;
				break;

			case SCROLLER_KIND:

				node -> Special . Scroller . Visible = 2;
				break;

			case SLIDER_KIND:

				node -> Special . Slider . LevelPlace = PLACETEXT_LEFT;
				break;

			case FRAME_KIND:

				node -> Special . Frame . DrawBox = TRUE;
				break;

			case BOX_KIND:

				node -> Special . Box . DrawBox = TRUE;
				break;

			case HORIZONTAL_KIND:

				node -> Type = GROUP_KIND;
				node -> Special . Group . Horizontal = TRUE;
				break;

			case VERTICAL_KIND:

				node -> Type = GROUP_KIND;
				node -> Special . Group . Horizontal = FALSE;
				break;
#ifdef DO_LEVEL_KIND
			case LEVEL_KIND:

				node -> Type = LEVEL_KIND;
				node -> Special . Level . LevelPlace = PLACETEXT_LEFT;

				if(LocaleBase && LocaleBase -> lb_SysPatches)
					node -> Special . Level . LevelFormat = "%lD";
				else
					node -> Special . Level . LevelFormat = "%ld";

				break;
#endif	/* DO_LEVEL_KIND */
		}
	}

	return(node);
}
