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

#include "gtlayout_global.h"

#ifdef DO_MENUS

	/* LT_MenuControlTagList(struct Window *Window,struct Menu *Menu,struct TagItem *Tags):
	 *
	 *	Change the state of the menus and menu items.
	 */

VOID LIBENT
LT_MenuControlTagList(REG(a0) struct Window *Window,REG(a1) struct Menu *IntuitionMenu,REG(a2) struct TagItem *Tags)
{
	RootMenu		*Root = (RootMenu *)((ULONG)IntuitionMenu - offsetof(RootMenu,Menu));
	struct TagItem	*List,*Entry;
	ULONG			 ID;
	MenuNode		*Menu;
	ItemNode		*Item;
	BOOLEAN			 GotIt;

	List = Tags;

	while(Entry = NextTagItem(&List))
	{
		switch(Entry -> ti_Tag)
		{
				// We start with a menu/item/subitem ID

			case LAMN_ID:

				GotIt = FALSE;

				ID = (ULONG)Entry -> ti_Data;

					// Check if it's on the menu list

				for(Menu = (MenuNode *)Root -> MenuList . mlh_Head ; Menu -> Node . mln_Succ ; Menu = (MenuNode *)Menu -> Node . mln_Succ)
				{
					if(Menu -> ID == ID)
					{
						GotIt = TRUE;

						Item = NULL;

						break;
					}
				}

					// If it isn't, check the item/subitem list

				if(!GotIt)
				{
					for(Item = (ItemNode *)Root -> ItemList . mlh_Head ; Item -> Node . mln_Succ ; Item = (ItemNode *)Item -> Node . mln_Succ)
					{
						if(Item -> ID == ID)
						{
							GotIt = TRUE;

							Menu = NULL;

							break;
						}
					}
				}

					// Do nothing if none is found

				if(!GotIt)
				{
					Menu = NULL;
					Item = NULL;
				}

				break;

				// Fiddle with the checkmark

			case LAMN_CheckIt:

				if(Item)
				{
					if(Entry -> ti_Tag)
						Item -> Item . Flags |=  CHECKIT;
					else
						Item -> Item . Flags &= ~CHECKIT;
				}

				break;

				// Turn menus, submenus and items off or on

			case LAMN_Disabled:

				if(Window)
				{
					if(Item)
					{
						if(Entry -> ti_Tag)
							OffMenu(Window,Item -> MenuCode);
						else
							OnMenu(Window,Item -> MenuCode);
					}

					if(Menu)
					{
						if(Entry -> ti_Tag)
							OffMenu(Window,Menu -> MenuCode);
						else
							OnMenu(Window,Menu -> MenuCode);
					}
				}
				else
				{
					if(Item)
					{
						if(Entry -> ti_Tag)
							Item -> Flags &= ~ITEMENABLED;
						else
							Item -> Flags |= ITEMENABLED;
					}

					if(Menu)
					{
						if(Entry -> ti_Tag)
							Menu -> Menu . Flags &= ~MENUENABLED;
						else
							Menu -> Menu . Flags |= MENUENABLED;
					}
				}

				break;
		}
	}
}


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


VOID __stdargs
LT_MenuControlTags(struct Window *Window,struct Menu *Menu,...)
{
	va_list VarArgs;

	va_start(VarArgs,Menu);
	LT_MenuControlTagList(Window,Menu,(struct TagItem *)VarArgs);
	va_end(VarArgs);
}

#endif	/* DO_MENUS */
