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

#include "gtlayout_global.h"

VOID __regargs
LTP_GetStorage(ObjectNode *Node)
{
	if(Node -> Storage)
	{
		LONG	Number = 0;
		STRPTR	String = NULL;

		switch(Node -> StorageType)
		{
			case STORAGE_BYTE:

				Number = *(BYTE *)Node -> Storage;
				break;

			case STORAGE_UBYTE:

				Number = *(UBYTE *)Node -> Storage;
				break;

			case STORAGE_WORD:

				Number = *(WORD *)Node -> Storage;
				break;

			case STORAGE_UWORD:

				Number = *(UWORD *)Node -> Storage;
				break;

			case STORAGE_LONG:

				Number = *(LONG *)Node -> Storage;
				break;

			case STORAGE_ULONG:

				Number = *(ULONG *)Node -> Storage;
				break;

			case STORAGE_STRPTR:

				String = Node -> Storage;
				break;
		}

		switch(Node -> Type)
		{
			case CHECKBOX_KIND:
			case LISTVIEW_KIND:
			case MX_KIND:
			case CYCLE_KIND:
			case PALETTE_KIND:
			case SLIDER_KIND:
			case SCROLLER_KIND:
#if defined(DO_POPUP_KIND) && defined(DO_BOOPSI_KIND)
			case POPUP_KIND:
#endif
#if defined(DO_TAB_KIND) && defined(DO_BOOPSI_KIND)
			case TAB_KIND:
#endif
#ifdef DO_GAUGE_KIND
			case GAUGE_KIND:
#endif

#ifdef DO_TAPEDECK_KIND
			case TAPEDECK_KIND:
#endif	/* DO_TAPEDECK_KIND */

#ifdef DO_FRACTION_KIND
			case FRACTION_KIND:
#endif
				Node -> Current = Number;
				break;

			case STRING_KIND:
#ifdef DO_PASSWORD_KIND
			case PASSWORD_KIND:
#endif
				Node -> Special . String . String = String;
				break;

			case INTEGER_KIND:

				Node -> Special . Integer . Number = Number;
				break;
#ifdef DO_LEVEL_KIND
			case LEVEL_KIND:

				Node -> Special . Level . Level = Number;
				break;
#endif	/* DO_LEVEL_KIND */
		}
	}
}


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


VOID __regargs
LTP_PutStorage(ObjectNode *Node)
{
	if(Node -> Storage)
	{
		LONG	Number = 0;
		STRPTR	String = NULL;

		switch(Node -> Type)
		{
			case CHECKBOX_KIND:
			case LISTVIEW_KIND:
			case MX_KIND:
			case CYCLE_KIND:
			case PALETTE_KIND:
			case SLIDER_KIND:
			case SCROLLER_KIND:
#if defined(DO_POPUP_KIND) && defined(DO_BOOPSI_KIND)
			case POPUP_KIND:
#endif
#if defined(DO_TAB_KIND) && defined(DO_BOOPSI_KIND)
			case TAB_KIND:
#endif
#ifdef DO_GAUGE_KIND
			case GAUGE_KIND:
#endif

#ifdef DO_TAPEDECK_KIND
			case TAPEDECK_KIND:
#endif	/* DO_TAPEDECK_KIND */
				Number = Node -> Current;
				break;

#ifdef DO_FRACTION_KIND
			case FRACTION_KIND:

				if(Node -> Host)
					Number = (LONG)LT_String2Fixed(((struct StringInfo *)Node -> Host -> SpecialInfo) -> Buffer);
				else
					Number = Node -> Current;

				break;
#endif

#ifdef DO_PASSWORD_KIND
			case PASSWORD_KIND:

				String = Node -> Special . String . Original;
				break;
#endif

			case STRING_KIND:

				if(Node -> Host)
					String = ((struct StringInfo *)Node -> Host -> SpecialInfo) -> Buffer;
				else
					String = Node -> Special . String . String;

				break;

			case INTEGER_KIND:

				if(Node -> Host)
					Number = ((struct StringInfo *)Node -> Host -> SpecialInfo) -> LongInt;
				else
					Number = Node -> Special . Integer . Number;

				break;
#ifdef DO_LEVEL_KIND
			case LEVEL_KIND:

				Number = Node -> Special . Level . Level;
				break;
#endif	/* DO_LEVEL_KIND */
		}

		switch(Node -> StorageType)
		{
			case STORAGE_BYTE:

				if(!String)
					*(BYTE *)Node -> Storage = (BYTE)Number;

				break;

			case STORAGE_UBYTE:

				if(!String)
					*(UBYTE *)Node -> Storage = (UBYTE)Number;

				break;

			case STORAGE_WORD:

				if(!String)
					*(WORD *)Node -> Storage = (WORD)Number;

				break;

			case STORAGE_UWORD:

				if(!String)
					*(UWORD *)Node -> Storage = (UWORD)Number;

				break;

			case STORAGE_LONG:

				if(!String)
					*(LONG *)Node -> Storage = (LONG)Number;

				break;

			case STORAGE_ULONG:

				if(!String)
					*(ULONG *)Node -> Storage = (ULONG)Number;

				break;

			case STORAGE_STRPTR:

				if(String)
					strcpy(Node -> Storage,String);

				break;
		}
	}
}
