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

#include "gtlayout_global.h"

#ifdef DO_MENUS

	/* LTP_FillSub(struct MenuItem *Item):
	 *
	 *	Fill in the submenu item IDs.
	 */

VOID __regargs
LTP_FillSub(ULONG MenuID,ULONG ItemID,struct MenuItem *Item)
{
	ULONG			 Count = 0;
	ItemNode		*Node;
	struct MenuItem	*First = Item;

	do
	{
		Node = (ItemNode *)((ULONG)Item - sizeof(struct MinNode));

		Node -> MenuCode = FULLMENUNUM(MenuID,ItemID,Count);

		if(Item -> MutualExclude && (Item -> Flags & CHECKED))
		{
			struct MenuItem	*This		= First;
			ULONG			 Exclude	= Item -> MutualExclude;
			UWORD			 i;

			for(i = 0 ; i < 32 && This ; i++, This = This -> NextItem)
			{
				if(This != Item && (This -> Flags & CHECKIT) && (Exclude & (1L << i)))
					This -> Flags &= ~CHECKED;
			}
		}

		Count++;
	}
	while(Item = Item -> NextItem);
}

	/* FillItem(struct MenuItem *Item):
	 *
	 *	Fill in the menu item IDs.
	 */

VOID __regargs
LTP_FillItem(ULONG MenuID,struct MenuItem *Item)
{
	ULONG			 Count = 0;
	ItemNode		*Node;
	struct MenuItem	*First = Item;

	do
	{
		Node = (ItemNode *)((ULONG)Item - sizeof(struct MinNode));

		Node -> MenuCode = FULLMENUNUM(MenuID,Count,NOSUB);

		if(Item -> SubItem)
			LTP_FillSub(MenuID,Count,Item -> SubItem);

		if(Item -> MutualExclude && (Item -> Flags & CHECKED))
		{
			struct MenuItem	*This		= First;
			ULONG			 Exclude	= Item -> MutualExclude;
			UWORD			 i;

			for(i = 0 ; i < 32 && This ; i++, This = This -> NextItem)
			{
				if(This != Item && (This -> Flags & CHECKIT) && (Exclude & (1L << i)))
					This -> Flags &= ~CHECKED;
			}
		}

		Count++;
	}
	while(Item = Item -> NextItem);
}

	/* LTP_FillMenu(struct Menu *Menu):
	 *
	 *	Fill in the menu IDs.
	 */

VOID __regargs
LTP_FillMenu(struct Menu *Menu)
{
	ULONG		 Count = 0;
	MenuNode	*Node;

	do
	{
		Node = (MenuNode *)((ULONG)Menu - sizeof(struct MinNode));

		Node -> MenuCode = FULLMENUNUM(Count,NOITEM,NOSUB);

		if(Menu -> FirstItem)
			LTP_FillItem(Count,Menu -> FirstItem);

		Count++;
	}
	while(Menu = Menu -> NextMenu);
}

#endif	/* DO_MENUS */
