/*  GadTools layout toolkit
**
**  Copyright © 1993-1995 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;

#if defined(DO_POPUP_KIND) && defined(DO_BOOPSI_KIND)
		case POPUP_KIND:

			extra = sizeof(PopupExtra);
			break;
#endif

#if defined(DO_TAB_KIND) && defined(DO_BOOPSI_KIND)
		case TAB_KIND:

			extra = sizeof(TabExtra);
			break;
#endif

		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;

#ifdef DO_BOOPSI_KIND
		case BOOPSI_KIND:

			extra = sizeof(BOOPSIExtra);
			break;
#endif	/* DO_BOOPSI_KIND */

		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;
				node -> Special . List . AutoPageID	= -1;

				break;

			case PASSWORD_KIND:
			case STRING_KIND:

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

				break;

			case INTEGER_KIND:

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

				break;
#ifdef DO_BOOPSI_KIND
			case BOOPSI_KIND:

				node -> Special . BOOPSI . Link = NIL_LINK;
				break;
#endif	/* DO_BOOPSI_KIND */

#ifdef DO_FRACTION_KIND
			case FRACTION_KIND:

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

				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;
#if defined(DO_POPUP_KIND) && defined(DO_BOOPSI_KIND)
			case POPUP_KIND:

				node -> Special . Popup . AutoPageID = -1;
				break;
#endif

#if defined(DO_TAB_KIND) && defined(DO_BOOPSI_KIND)
			case TAB_KIND:

				node -> Special . Tab . AutoPageID = -1;
				break;
#endif
			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;
				node -> Special . Slider . LevelFormat = (LocaleBase && LocaleBase -> lb_SysPatches) ? "%lD" : "%ld";

				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;
				break;
#ifdef DO_LEVEL_KIND
			case LEVEL_KIND:

				node -> Special . Level . LevelPlace	= PLACETEXT_LEFT;
				node -> LabelPlace			= PLACE_LEFT;
				node -> Special . Level . LevelFormat	= (LocaleBase && LocaleBase -> lb_SysPatches) ? "%lD" : "%ld";

				break;
#endif	/* DO_LEVEL_KIND */

#ifdef DO_GAUGE_KIND
			case GAUGE_KIND:

				node -> Special . Gauge . LastPercentage = -1;
				break;
#endif	/* DO_GAUGE_KIND */
		}
	}

	return(node);
}
