/* $Revision Header * Header built automatically - do not edit! *************
 *
 *	(C) Copyright 1990 by Olaf 'Olsen' Barthel & MXM
 *
 *	Name .....: TermSub.c
 *	Created ..: Monday 21-Jan-91 20:12
 *	Revision .: 0
 *
 *	Date            Author          Comment
 *	=========       ========        ====================
 *	21-Jan-91       Olsen           Created this file!
 *
 * $Revision Header ********************************************************/

#include "TermGlobal.h"

	/* This module deals with the so-called `sub window', which is
	 * brought up whenever a list of phone entries is to be dialed.
	 */

STATIC struct Menu	*SubMenu;

STATIC struct Gadget	*SubGadgetList;
STATIC struct Gadget	*SubGadgetArray[4];

STATIC WORD		 PositionX = -1,PositionY = -1;

#define SUB_DIAL	1
#define SUB_QUIT	2

#define SUBWIDTH	354
#define SUBHEIGHT	124

enum	{	MEN_NEXT=1,MEN_PREV,MEN_WINDOW,MEN_DIALENTRY,MEN_DELETECALL,
		MEN_CANCEL,MEN_QUITPANEL };

STATIC struct NewMenu CallMenu[] =
{
	{ NM_TITLE, "Project",		 0 , 0, 0, (APTR)0},
	{  NM_ITEM, "Next Entry",	"N", 0, 0, (APTR)MEN_NEXT},
	{  NM_ITEM, "Previous Entry",	"P", 0, 0, (APTR)MEN_PREV},
	{  NM_ITEM, "Other Window",	"W", 0, 0, (APTR)MEN_WINDOW},
	{  NM_ITEM, NM_BARLABEL,	 0 , 0, 0, (APTR)0},
	{  NM_ITEM, "Dial",		"D", 0, 0, (APTR)MEN_DIALENTRY},
	{  NM_ITEM, "Delete Call",	"E", 0, 0, (APTR)MEN_DELETECALL},
	{  NM_ITEM, "Cancel",		"C", 0, 0, (APTR)MEN_CANCEL},
	{  NM_ITEM, NM_BARLABEL,	 0 , 0, 0, (APTR)0},
	{  NM_ITEM, "Quit",		"Q", 0, 0, (APTR)MEN_QUITPANEL},
	{ NM_END, 0,			 0 , 0, 0, (APTR)0}
};

STATIC struct Gadget *
SubCreateAllGadgets(struct Gadget **GadgetArray,struct Gadget **GadgetList,APTR VisualInfo,UWORD TopEdge)
{
	struct Gadget		*Gadget;
	struct NewGadget	 NewGadget;
	UWORD			 Offset,Counter = 0;

	if(Gadget = CreateContext(GadgetList))
	{
		NewGadget . ng_Width		= 334;
		NewGadget . ng_Height		= 100;
		NewGadget . ng_GadgetText	= NULL;
		NewGadget . ng_TextAttr		= &DefaultFont;
		NewGadget . ng_VisualInfo	= VisualInfo;
		NewGadget . ng_GadgetID		= Counter;
		NewGadget . ng_LeftEdge		= 10;
		NewGadget . ng_TopEdge		= 1 + TopEdge;

		GadgetArray[Counter++] = Gadget = CreateGadget(LISTVIEW_KIND,Gadget,&NewGadget,
			GTLV_Labels,		&EmptyList,
			GTLV_ShowSelected,	NULL,
		TAG_DONE);

		Offset = SUBWIDTH / 3 + 3;

		NewGadget . ng_Width		= 92;
		NewGadget . ng_Height		= 12;
		NewGadget . ng_GadgetText	= "_Dial";
		NewGadget . ng_GadgetID		= Counter;
		NewGadget . ng_Flags		= 0;
		NewGadget . ng_LeftEdge		= 10;
		NewGadget . ng_TopEdge		= SUBHEIGHT - 3 - NewGadget . ng_Height;

		GadgetArray[Counter++] = Gadget = CreateGadget(BUTTON_KIND,Gadget,&NewGadget,
			GT_Underscore,	'_',
		TAG_DONE);

		NewGadget . ng_GadgetText	= "D_elete Call";
		NewGadget . ng_GadgetID		= Counter;
		NewGadget . ng_LeftEdge		= NewGadget . ng_LeftEdge + Offset;

		GadgetArray[Counter++] = Gadget = CreateGadget(BUTTON_KIND,Gadget,&NewGadget,
			GT_Underscore,	'_',
		TAG_DONE);

		NewGadget . ng_GadgetText	= "_Cancel";
		NewGadget . ng_GadgetID		= Counter;
		NewGadget . ng_LeftEdge		= NewGadget . ng_LeftEdge + Offset;

		GadgetArray[Counter++] = Gadget = CreateGadget(BUTTON_KIND,Gadget,&NewGadget,
			GT_Underscore,	'_',
		TAG_DONE);
	}

	return(Gadget);
}

BYTE
OpenSubWindow()
{
	if(SubCreateAllGadgets(&SubGadgetArray[0],&SubGadgetList,VisualInfo,Screen -> WBorTop + Screen -> Font -> ta_YSize + 1))
	{
		if(SubMenu = CreateMenus(CallMenu,
			GTMN_FrontPen, 0,
		TAG_DONE))
		{
			if(LayoutMenus(SubMenu,VisualInfo,
				GTMN_TextAttr,&DefaultFont,
			TAG_DONE))
			{
				if(PositionX == -1)
					PositionX = (Screen -> Width - SUBWIDTH) >> 1;

				if(PositionY == -1)
					PositionY = Window -> Height - SUBHEIGHT;

				if(SubWindow = OpenWindowTags(NULL,
					WA_Width,	SUBWIDTH,
					WA_Height,	SUBHEIGHT,

					WA_Left,	PositionX,
					WA_Top,		PositionY,

					WA_DragBar,	TRUE,
					WA_DepthGadget,	TRUE,
					WA_CloseGadget,	TRUE,
					WA_RMBTrap,	TRUE,
					WA_CustomScreen,Screen,

					WA_IDCMP,	IDCMP_CLOSEWINDOW | BUTTONIDCMP | LISTVIEWIDCMP | IDCMP_MENUPICK,

					WA_Title,	"Dial List",
				TAG_DONE))
				{
					AddGList(SubWindow,SubGadgetList,(UWORD)-1,(UWORD)-1,NULL);
					RefreshGList(SubGadgetList,SubWindow,NULL,(UWORD)-1);
					GT_RefreshWindow(SubWindow,NULL);

					if(SubList)
					{
						SubItemNum = SubListNum - 1;

						GT_SetGadgetAttrs(SubGadgetArray[0],SubWindow,NULL,
							GTLV_Labels,SubList,
							GTLV_Selected,SubListNum,
						TAG_DONE);
					}

					SetMenuStrip(SubWindow,SubMenu);

					SubWindow -> Flags &= ~WFLG_RMBTRAP;

					return(TRUE);
				}
			}

			FreeMenus(SubMenu);
			SubMenu = NULL;
		}

		FreeGadgets(SubGadgetList);
		SubGadgetList = NULL;
	}

	return(FALSE);
}

VOID
CloseSubWindow()
{
	if(SubWindow)
	{
		SubWindow -> Flags |= WFLG_RMBTRAP;
		ClearMenuStrip(SubWindow);

		if(SubGadgetList)
			RemoveGList(SubWindow,SubGadgetList,(UWORD)-1);

		PositionX = SubWindow -> LeftEdge;
		PositionY = SubWindow -> TopEdge;

		CloseWindow(SubWindow);

		SubWindow = NULL;
	}

	if(SubMenu)
	{
		FreeMenus(SubMenu);

		SubMenu = NULL;
	}

	if(SubGadgetList)
	{
		FreeGadgets(SubGadgetList);

		SubGadgetList = NULL;
	}
}

VOID
AddSubEntry(LONG Entry)
{
	if(!SubList)
	{
		if(SubList = (struct List *)AllocMem(sizeof(struct List),MEMF_PUBLIC | MEMF_CLEAR))
			NewList(SubList);
	}

	if(SubList)
	{
		struct PhoneNode *SubNode;

		if(SubNode = (struct PhoneNode *)AllocMem(sizeof(struct PhoneNode),MEMF_PUBLIC|MEMF_CLEAR))
		{
			GT_SetGadgetAttrs(SubGadgetArray[0],SubWindow,NULL,
				GTLV_Labels,~0,
			TAG_DONE);

			SubNode -> VanillaNode . ln_Name	= Phonebook[Entry] -> Name;
			SubNode -> Entry			= Phonebook[Entry];
			SubNode -> Number			= Entry;

			AddTail(SubList,&SubNode -> VanillaNode);

			SubItemNum = SubListNum;

			GT_SetGadgetAttrs(SubGadgetArray[0],SubWindow,NULL,
				GTLV_Labels,	SubList,
				GTLV_Selected,	SubListNum++,
			TAG_DONE);
		}
	}
}

BYTE
RemSubEntry()
{
	struct PhoneNode	*SubNode;
	LONG			 i;

	SubNode = (struct PhoneNode *)SubList -> lh_Head;

	i = 0;

	while(i < SubItemNum)
	{
		SubNode = (struct PhoneNode *)SubNode -> VanillaNode . ln_Succ;

		i++;
	}

	if(SubListNum)
	{
		if(SubItemNum == (--SubListNum))
		{
			if(SubItemNum)
				SubItemNum--;
		}
	}
	else
		SubItemNum = 0;

	if(SubWindow)
	{
		GT_SetGadgetAttrs(SubGadgetArray[0],SubWindow,NULL,
			GTLV_Labels,~0,
		TAG_DONE);
	}

	Remove(SubNode);

	FreeMem(SubNode,sizeof(struct PhoneNode));

	if(!SubListNum)
	{
		if(SubList)
			FreeMem(SubList,sizeof(struct List));

		SubList = NULL;

		CloseSubWindow();

		return(TRUE);
	}
	else
	{
		if(SubWindow)
		{
			GT_SetGadgetAttrs(SubGadgetArray[0],SubWindow,NULL,
				GTLV_Labels,SubList,
				GTLV_Selected,SubItemNum,
			TAG_DONE);
		}

		return(FALSE);
	}
}

VOID
FreeSubList()
{
	if(SubList)
	{
		struct PhoneNode	*NextNode,*SubNode;
		LONG			 i;

		if(SubList -> lh_Head)
			NextNode = (struct PhoneNode *)SubList -> lh_Head -> ln_Succ;
		else
			NextNode = NULL;

		SubNode = (struct PhoneNode *)SubList -> lh_Head;

		for(i = 0 ; i < SubListNum ; i++)
		{
			NextNode = (struct PhoneNode *)SubNode -> VanillaNode . ln_Succ;

			FreeMem(SubNode,sizeof(struct PhoneNode));

			SubNode = NextNode;
		}

		SubListNum = 0;

		FreeMem(SubList,sizeof(struct List));

		SubList = NULL;
	}
}

BYTE
HandleSubWindow(struct Window *PanelWindow)
{
	if(SubWindow)
	{
		struct IntuiMessage	*Massage;
		ULONG			 Class,Code;
		struct Gadget		*Gadget;

		while(Massage = (struct IntuiMessage *)GT_GetIMsg(SubWindow -> UserPort))
		{
			Class	= Massage -> Class;
			Code	= Massage -> Code;
			Gadget	= (struct Gadget *)Massage -> IAddress;

			GT_ReplyIMsg(Massage);

			if(Class == IDCMP_MENUPICK)
			{
				struct MenuItem *MenuItem;

				while(Code != MENUNULL)
				{
					MenuItem = ItemAddress(SubMenu,Code);

					switch((ULONG)MENU_USERDATA(MenuItem))
					{
						case MEN_QUITPANEL:	return(SUB_QUIT);

						case MEN_CANCEL:	CloseSubWindow();
									FreeSubList();

									return(0);

						case MEN_NEXT:		if(SubItemNum == SubListNum - 1)
										SubItemNum = 0;
									else
										SubItemNum++;

									GT_SetGadgetAttrs(SubGadgetArray[0],SubWindow,NULL,
										GTLV_Selected,SubItemNum,
									TAG_DONE);

									break;

						case MEN_PREV:		if(SubItemNum == 0)
										SubItemNum = SubListNum - 1;
									else
										SubItemNum--;

									GT_SetGadgetAttrs(SubGadgetArray[0],SubWindow,NULL,
										GTLV_Selected,SubItemNum,
									TAG_DONE);

									break;

						case MEN_WINDOW:	if(PanelWindow)
									{
										WindowToFront(PanelWindow);

										ActivateWindow(PanelWindow);
									}

									break;

						case MEN_DIALENTRY:	return(SUB_DIAL);
									break;

						case MEN_DELETECALL:	if(RemSubEntry())
										return(0);

									break;

						default:		break;
					}

					Code = MenuItem -> NextSelect;
				}
			}

			if(Class == IDCMP_CLOSEWINDOW)
				return(SUB_QUIT);

			if(Class == IDCMP_GADGETUP)
			{
				switch(Gadget -> GadgetID)
				{
					case 0:	SubItemNum = Code;
						break;

					case 1:	return(SUB_DIAL);
						break;

					case 2:	if(RemSubEntry())
							return(0);

						break;

					case 3:	CloseSubWindow();

						FreeSubList();

						return(0);
				}
			}
		}
	}

	return(0);
}
