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

#ifndef _GTLAYOUT_GLOBAL_H
#include "gtlayout_global.h"
#endif

#ifdef DO_MENUS

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

VOID
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;
			LONG			 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
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;
			LONG			 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
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 */
