/*
**	termPickScreen.c
**
**	Simplified public screen selection routine
**
**	Copyright © 1990-1995 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	*PanelWindow;
			ULONG		 Index = (ULONG)~0,i;
			struct Node	*Node;
			LONG		 MaxWidth,MaxHeight,Len;

			MaxWidth = MaxHeight = 0;

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

				Len = strlen(Node -> ln_Name);

				if(Len > MaxWidth)
					MaxWidth = Len;

				MaxHeight++;
			}

			if(MaxWidth < 30)
				MaxWidth = 30;

			if(MaxHeight < 5)
				MaxHeight = 5;
			else
			{
				if(MaxHeight > 20)
					MaxHeight = 20;
			}

			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,	30,
						LA_ID,		GAD_LIST,
						LA_Lines,	5,
						LALV_MaxGrowX,	MaxWidth,
						LALV_MaxGrowY,	MaxHeight,
						LALV_ResizeY,	TRUE,
						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(PanelWindow = LT_Build(Handle,
				LAWN_TitleID,		MSG_TERMPICKSCREEN_SCREENS_TXT,
				LAWN_IDCMP,		IDCMP_CLOSEWINDOW,
				LAWN_HelpHook,		&GuideHook,
				LAWN_Parent,		Window,
				WA_DepthGadget,		TRUE,
				WA_CloseGadget,		TRUE,
				WA_DragBar,		TRUE,
				WA_RMBTrap,		TRUE,
				WA_Activate,		TRUE,
				WA_SimpleRefresh,	TRUE,
			TAG_DONE))
			{
				struct IntuiMessage	*Message;
				BOOLEAN			 Done = FALSE;
				ULONG			 MsgClass;
				UWORD			 MsgCode;
				struct Gadget		*MsgGadget;

				LT_ShowWindow(Handle,TRUE);

				PushWindow(PanelWindow);

				do
				{
					if(Wait(PORTMASK(PanelWindow -> UserPort) | SIG_BREAK) & SIG_BREAK)
						break;

					while(Message = (struct IntuiMessage *)LT_GetIMsg(Handle))
					{
						MsgClass	= Message -> Class;
						MsgCode		= Message -> Code;
						MsgGadget	= (struct Gadget *)Message -> IAddress;

						LT_ReplyIMsg(Message);

						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);
}
