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

#include "gtlayout_global.h"

#ifdef DO_MENUS

	/* LT_NewMenuTagList():
	 *
	 *	Create a new menu, based on the Screen, Font and template given.
	 */

struct Menu * LIBENT
LT_NewMenuTagList(REG(a0) struct TagItem *TagList)
{
	RootMenu		*Root;
	struct Image	*AmigaGlyph	= NULL,
					*CheckGlyph = NULL;
	LONG			 ErrorValue,
					*Error = &ErrorValue;
	struct Screen	*Screen = NULL;
	struct TextAttr	*TextAttr = NULL;
	struct TagItem	*List,
					*Entry;
	LayoutHandle	*Handle = NULL;
	struct Hook		*LocaleHook = NULL;
	WORD			 ExtraSpace = 0;

	List = TagList;

	while(Entry = NextTagItem(&List))
	{
		switch(Entry -> ti_Tag)
		{
			case LAMN_AmigaGlyph:

				AmigaGlyph = (struct Image *)Entry -> ti_Data;
				break;

			case LAMN_CheckmarkGlyph:

				CheckGlyph = (struct Image *)Entry -> ti_Data;
				break;

			case LAMN_Error:

				Error = (LONG *)Entry -> ti_Data;
				break;

			case LAMN_Screen:

				Screen = (struct Screen *)Entry -> ti_Data;
				break;

			case LAMN_TextAttr:

				TextAttr = (struct TextAttr *)Entry -> ti_Data;
				break;

			case LAMN_Handle:

				Handle		= (LayoutHandle *)Entry -> ti_Data;
				Screen		= Handle -> Screen;
				TextAttr	= Handle -> InitialTextAttr;
				AmigaGlyph	= Handle -> AmigaGlyph;
				CheckGlyph	= Handle -> CheckGlyph;
				break;

			case LAMN_ExtraSpace:

				ExtraSpace = (WORD)(Entry -> ti_Data & 0x7FFF);
				break;

			case LH_LocaleHook:

				LocaleHook = (struct Hook *)Entry -> ti_Data;
				break;
		}
	}

	if(Handle)
		LocaleHook = Handle -> LocaleHook;

	if(Root = LTP_NewMenu(Screen,TextAttr,AmigaGlyph,CheckGlyph,Error))
	{
		Root -> Handle		= Handle;
		Root -> LocaleHook	= LocaleHook;

			// Create the menu

		if(LTP_CreateMenuTagList(Root,Error,TagList))
		{
				// Do the layout

			if(LTP_LayoutMenu(Root,0,ExtraSpace))
				return(&Root -> Menu);
			else
				*Error = ERROR_DISK_FULL;
		}

		LT_DisposeMenu(&Root -> Menu);
	}

	return(NULL);
}


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


struct Menu * __stdargs
LT_NewMenuTags(Tag FirstTag,...)
{
	return(LT_NewMenuTagList((struct TagItem *)&FirstTag));
}

#endif	/* DO_MENUS */
