/*
**	termPickScreen.c
**
**	Simplified public screen selection routine
**
**	Copyright © 1990-1994 by Olaf `Olsen' Barthel
**		All Rights Reserved
*/

#include "termGlobal.h"

enum	{	GAD_LIST=1,GAD_USE,GAD_CANCEL };

	/* BuildScreenList():
	 *
	 *	Build a private copy of the public screen list.
	 */

STATIC struct List *
BuildScreenList(VOID)
{
	struct List *List,*PubScreenList;

		/* Get the list body. */

	if(List = (struct List *)AllocVecPooled(sizeof(struct List),MEMF_ANY))
	{
		NewList(List);

			/* Get access to the public screen list. */

		if(PubScreenList = LockPubScreenList())
		{
			struct Node *Next,*Node;

			Node = PubScreenList -> lh_Head;

				/* Scan the list. */

			while(Next = Node -> ln_Succ)
			{
					/* Don't include the current `term' public
					 * screen name in it.
					 */

				if(strcmp(Node -> ln_Name,TermIDString))
				{
					struct Node *New = CreateNode(Node -> ln_Name);

						/* Got a new node? */

					if(New)
						AddTail(List,New);
				}

				Node = Next;
			}

			UnlockPubScreenList();
		}

			/* In case the list happens to remain empty,
			 * include the Workbench screen in it.
			 */

		if(!List -> lh_Head -> ln_Succ)
		{
			struct Node *New = CreateNode("Workbench");

			if(New)
				AddTail(List,New);
			else
			{
				FreeVecPooled(List);

				List = NULL;
			}
		}
	}

	return(List);
}

	/* PickScreen(STRPTR Name):
	 *
	 *	Your nice public screen selection routine.
	 */

BYTE __regargs
PickScreen(struct Window *Window,STRPTR Name)
{
	struct List	*ScreenList;
	BYTE		 Result = FALSE;

	if(ScreenList = BuildScreenList())
	{
		struct LayoutHandle *Handle;
	
		if(Handle = LT_CreateHandleTags(Window -> WScreen,
			LH_LocaleHook,	&LocaleHook,
		TAG_DONE))
		{
			struct Window	*Window;
			ULONG		 Index = (ULONG)~0,i;
			struct Node	*Node;

			for(Node = ScreenList -> lh_Head, i = 0 ; Node -> ln_Succ ; Node = Node -> ln_Succ, i++)
			{
				if(!strcmp(Node -> ln_Name,Name))
				{
					Index = i;

					break;
				}
			}

			LT_New(Handle,
				LA_Type,	VERTICAL_KIND,
			TAG_DONE);
			{
				LT_New(Handle,
					LA_Type,	VERTICAL_KIND,
					LA_LabelID,	MSG_V36_1271,
				TAG_DONE);
				{
					LT_New(Handle,
						LA_Type,	LISTVIEW_KIND,
						LA_LabelID,	MSG_TERMPICKSCREEN_SCREEN_LIST_GAD,
						LA_Chars,	40,
						LA_ID,		GAD_LIST,
						LA_Lines,	10,
						LALV_MaxGrowY,	20,
						GTLV_Labels,	ScreenList,
						GTLV_Selected,	Index,
						LALV_Link,	NIL_LINK,
						LALV_CursorKey,	TRUE,
					TAG_DONE);
	
					LT_EndGroup(Handle);
				}
	
				LT_New(Handle,
					LA_Type,VERTICAL_KIND,
				TAG_DONE);
				{
					LT_New(Handle,
						LA_Type,	XBAR_KIND,
						LAXB_FullSize,	TRUE,
					TAG_DONE);
	
					LT_EndGroup(Handle);
				}

				LT_New(Handle,LA_Type,HORIZONTAL_KIND,
					LAGR_SameSize,	TRUE,
					LAGR_Spread,	TRUE,
				TAG_DONE);
				{
					LT_New(Handle,
						LA_Type,	BUTTON_KIND,
						LA_LabelID,	MSG_GLOBAL_USE_GAD,
						LA_ID,		GAD_USE,
						LABT_ReturnKey,	TRUE,
						LABT_ExtraFat,	TRUE,
					TAG_DONE);
	
					LT_New(Handle,
						LA_Type,	BUTTON_KIND,
						LA_LabelID,	MSG_GLOBAL_CANCEL_GAD,
						LA_ID,		GAD_CANCEL,
						LABT_EscKey,	TRUE,
						LABT_ExtraFat,	TRUE,
					TAG_DONE);
	
					LT_EndGroup(Handle);
				}
	
				LT_EndGroup(Handle);
			}
	
			if(Window = LT_Layout(Handle,LocaleString(MSG_TERMPICKSCREEN_SCREENS_TXT),NULL,0,0,IDCMP_CLOSEWINDOW,0,
				LAWN_HelpHook,		&GuideHook,
				WA_DepthGadget,		TRUE,
				WA_CloseGadget,		TRUE,
				WA_DragBar,		TRUE,
				WA_RMBTrap,		TRUE,
				WA_Activate,		TRUE,
			TAG_DONE))
			{
				struct IntuiMessage	*Message;
				BOOLEAN			 Done = FALSE;
				ULONG			 MsgClass,
							 MsgQualifier;
				UWORD			 MsgCode;
				struct Gadget		*MsgGadget;

				LT_ShowWindow(Handle,TRUE);

				PushWindow(Window);
	
				do
				{
					if(Wait(PORTMASK(Window -> UserPort) | SIG_BREAK) & SIG_BREAK)
						break;
	
					while(Message = (struct IntuiMessage *)GT_GetIMsg(Window -> UserPort))
					{
						MsgClass	= Message -> Class;
						MsgQualifier	= Message -> Qualifier;
						MsgCode		= Message -> Code;
						MsgGadget	= (struct Gadget *)Message -> IAddress;
	
						GT_ReplyIMsg(Message);
	
						LT_HandleInput(Handle,MsgQualifier,&MsgClass,&MsgCode,&MsgGadget);
	
						if(MsgClass == IDCMP_CLOSEWINDOW)
							Done = TRUE;
	
						if(MsgClass == IDCMP_GADGETUP)
						{
							switch(MsgGadget -> GadgetID)
							{
								case GAD_USE:

									if(Index != (ULONG)~0)
									{
										struct Node *Node = GetListNode(Index,ScreenList);

										if(Node)
										{
											strcpy(Name,Node -> ln_Name);

											Result = TRUE;
										}
									}

									Done = TRUE;
									break;
	
								case GAD_CANCEL:
	
									Done = TRUE;
									break;

								case GAD_LIST:

									Index = MsgCode;
									break;
							}
						}

						if(MsgClass == IDCMP_IDCMPUPDATE)
						{
							struct Node *Node = GetListNode(Index = MsgCode,ScreenList);

							if(Node)
							{
								strcpy(Name,Node -> ln_Name);

								Done = Result = TRUE;

								LT_PressButton(Handle,GAD_USE);
							}
						}
					}
				}
				while(!Done);
	
				PopWindow();
			}
	
			LT_DeleteHandle(Handle);
		}

		DeleteList(ScreenList);
	}
	else
		DisplayBeep(Window -> WScreen);

	return(Result);
}
