//****************
//
// Name : GadgetAux.C
//
//****************


//******** Header Files

#include <exec/memory.h>
#include <exec/lists.h>

#include <clib/exec_protos.h>
#include <clib/alib_protos.h>

#include <pragmas/exec_pragmas.h>

#include <string.h>
#include "TDEBUG.h"
#include "GadgetAux.H"


//******** Aleternative Build

static struct List MungBung;

ULONG MPMG_MenuBuildNew(void) {
  MPMMData *mm;

  mm=(MPMMData *)AllocVec(sizeof(MPMMData),MEMF_CLEAR|MEMF_PUBLIC|MEMF_REVERSE);

  if (mm) {
    NewList(&MungBung);
    AddTail(&MungBung,(struct Node *)mm);
    NewList(&(mm->Labels));
    mm->Count=0;
  } else {
    DPRINT("GadgetAux: MenuBuildNew(): AllocVec() failed\n",0);
  }

  return (ULONG)mm;
} // MPMG_MenuBuildNew


BOOL MPMG_MenuBuildAdd(UBYTE npm_Type, STRPTR npm_Label, ULONG npm_Flags, APTR npm_UserData, APTR Icon, UWORD npm_Code) {
  MPMMData *mm;
  MPMMItem *mi;
  BOOL rc=TRUE;

  if (IsListEmpty(&MungBung)) {
    DPRINT("GadgetAux: MenuBuildAdd(): List Is Empty, aborting\n",0);
    return FALSE;
  }

  mm=(MPMMData *)MungBung.lh_TailPred; // get last (current) menu
  switch (npm_Type) {
    case MPM_LABEL:
    case MPM_MENU:
    case MPM_PROM:
    case MPM_ITEM:
      mi=(MPMMItem *)AllocVec(sizeof(MPMMItem),MEMF_PUBLIC|MEMF_CLEAR|MEMF_REVERSE);
      if (NULL==mi) {
	DPRINT("GadgetAux: MenuBuildAdd(): AllocVec() failed, aborting\n",0);
	rc=FALSE;
	break;
      } else {
	AddTail(&(mm->Labels),(struct Node *)mi);
	mi->Node.ln_Name = npm_Label;
	mi->NumChars     = strlen(npm_Label);
	mi->Flags        = npm_Flags;
	mi->UserData     = npm_UserData;
	mi->Code         = npm_Code;
	mi->Icon         = Icon;
	mm->Count++;
	switch (npm_Type) {
	  case MPM_PROM:
	    mi->Type=MIT_PROM;
	    break;
	  case MPM_MENU:
	    mi->Type=MIT_MENU;
	    mm=(MPMMData *)AllocVec(sizeof(MPMMData),MEMF_CLEAR|MEMF_PUBLIC|MEMF_REVERSE);
	    if (mm) {
	      AddTail(&MungBung,(struct Node *)mm);
	      NewList(&(mm->Labels));
	      mm->Count=0;
	      mi->SubMenu=mm;
	    } else {
	      DPRINT("GadgetAux: MenuBuildAdd(): MPM_MENU: AllocVec() failed, aborting\n",0);
	      rc=FALSE;
	    } // if AllocVec
	    break;
	  case MPM_LABEL:
	    mi->Type=MIT_LABEL;
	    break;
	  case MPM_ITEM:
	    mi->Type=MIT_ITEM;
	    break;
	  default:
	    DPRINT("GadgetAux: MenuBuildAdd(): Illegal MPM Type\n",0);
	    break;
	} // switch
      } // if AllocVec
      break;
    case MPM_MEND:
      if (0==mm->Count) {
	MPMG_MenuBuildAdd(MPM_LABEL,"(Empty)",0L,0L, 0L, 0L);
      }
      RemTail(&MungBung);
      break;
    case MPM_END:
      if (0==mm->Count) {
	MPMG_MenuBuildAdd(MPM_LABEL,"(Empty)",0L,0L, 0L, 0L);
      }
      NewList(&MungBung);
    case MPM_IGNORE:
      break;
    default:
      rc=FALSE;
      break;
  } // switch

  return rc;
} // MPMG_MenuBuildAdd


//******** More public functions

ULONG MPMG_CreateMenusA(struct NewPMenu *npm, struct TagItem *taglist) {
  ULONG menu;

  menu=MPMG_MenuBuildNew();
  for( ; npm->npm_Type!=MPM_END ; npm++ ) {
    MPMG_MenuBuildAdd(npm->npm_Type,     npm->npm_Label, npm->npm_Flags,
		 npm->npm_UserData, NULL, npm->npm_Code);
  }

  return menu;
} // MPMG_CreateMenus


BOOL MPMG_DisposeMenus(ULONG m) {
  MPMMData *pmenu;
  MPMMItem *mynode;

  pmenu=(MPMMData *)m;
  while (pmenu->Labels.lh_Head->ln_Succ) {
    mynode=(MPMMItem *)RemHead(&(pmenu->Labels));
    if ((ITEM_IS_MENU(mynode)) && (mynode->SubMenu)) MPMG_DisposeMenus((ULONG)mynode->SubMenu);
    FreeVec(mynode);
  } // while
  FreeVec(pmenu);

  return TRUE;
} // MPMG_DisposeMenus


//******** End of file

