/*
**	$Filename: demo.c$
**	$Release: , V$
**	$Revision: 1.5 $
**	$Date: 1994/01/11 19:34:00 $
**
**  Shows  you hwo to use TagListLibrary. You will need OS2.0 include files
**  to compile this demo, but you can run the program from OS1.2.
**
**	(C) Copyright 1993 Zeal-Computer
**	All Rights Reserved
*/


#include <exec/exec.h>
#include <utility/tagitem.h>
#include <intuition/intuition.h>
#include <libraries/taglist.h>
#include <proto/exec.h>
#include <proto/intuition.h>
#include <proto/taglist.h>

#include <stdio.h>
#include <stdlib.h>

struct Library *TagListBase;

/*
** mewwindow_map
**
** This  is a "program" that takes arguments from a taglist and writes them
** into a NewWindow structure.
**
** BUGS: There  is  no efficient way to handle the tagitems WA_CustomScreen
**       and  WA_PubScreen  so  these  must  be  handled  by the user. (See
**       OpenWindowA)
*/
TAGMAPITEM newwindow_map[] =
{
	TAGMAP(WA_Left,NewWindow,LeftEdge,0,WORD,INT,DEFAULT,0),
	TAGMAP(WA_Top,NewWindow,TopEdge,0,WORD,INT,DEFAULT,0),
	TAGMAP(WA_Width,NewWindow,Width,1,WORD,INT,DEFAULT,0),
	TAGMAP(WA_Height,NewWindow,Height,1,WORD,INT,DEFAULT,0),
	TAGMAP(WA_MinWidth,NewWindow,MinWidth,0,WORD,INT,DEFAULT,0),
	TAGMAP(WA_MinHeight,NewWindow,MinHeight,0,WORD,INT,DEFAULT,0),
	TAGMAP(WA_MaxWidth,NewWindow,MaxWidth,0,WORD,INT,DEFAULT,-1),
	TAGMAP(WA_MaxHeight,NewWindow,MaxHeight,0,WORD,INT,DEFAULT,-1),
	TAGMAP(WA_DetailPen,NewWindow,DetailPen,0,BYTE,INT,DEFAULT,0),
	TAGMAP(WA_BlockPen,NewWindow,BlockPen,0,BYTE,INT,DEFAULT,1),
	TAGMAP(WA_IDCMP,NewWindow,IDCMPFlags,0,LONG,INT,DEFAULT,0),
	TAGMAP(WA_Flags,NewWindow,Flags,0,LONG,INT,DEFAULT,0),
	TAGMAP(WA_Gadgets,NewWindow,FirstGadget,0,LONG,INT,DEFAULT,0),
	TAGMAP(WA_Checkmark,NewWindow,CheckMark,0,LONG,INT,DEFAULT,0),
	TAGMAP(WA_Title,NewWindow,Title,0,LONG,INT,DEFAULT,0),
	TAGMAP(WA_SuperBitMap,NewWindow,BitMap,0,LONG,INT,DEFAULT,0),

	/* NewWindow.Flags are initialized by TAGMAP(WA_Flags,...), thus we must use NODEFAULT */
	TAGMAP(WA_SizeGadget,NewWindow,Flags,0,LONG,BOOL,NODEFAULT,WFLG_SIZEGADGET),
	TAGMAP(WA_DragBar,NewWindow,Flags,0,LONG,BOOL,NODEFAULT,WFLG_DRAGBAR),
	TAGMAP(WA_DepthGadget,NewWindow,Flags,0,LONG,BOOL,NODEFAULT,WFLG_DEPTHGADGET),
	TAGMAP(WA_CloseGadget,NewWindow,Flags,0,LONG,BOOL,NODEFAULT,WFLG_CLOSEGADGET),
	TAGMAP(WA_Backdrop,NewWindow,Flags,0,LONG,BOOL,NODEFAULT,WFLG_BACKDROP),
	TAGMAP(WA_ReportMouse,NewWindow,Flags,0,LONG,BOOL,NODEFAULT,WFLG_REPORTMOUSE),
	TAGMAP(WA_NoCareRefresh,NewWindow,Flags,0,LONG,BOOL,NODEFAULT,WFLG_NOCAREREFRESH),
	TAGMAP(WA_Borderless,NewWindow,Flags,0,LONG,BOOL,NODEFAULT,WFLG_BORDERLESS),
	TAGMAP(WA_Activate,NewWindow,Flags,0,LONG,BOOL,NODEFAULT,WFLG_ACTIVATE),
	TAGMAP(WA_RMBTrap,NewWindow,Flags,0,LONG,BOOL,NODEFAULT,WFLG_RMBTRAP),
	TAGMAP(WA_WBenchWindow,NewWindow,Flags,0,LONG,BOOL,NODEFAULT,WFLG_WBENCHWINDOW),
	TAGMAP(WA_SuperBitMap,NewWindow,Flags,0,LONG,BOOL,NODEFAULT,WFLG_SUPER_BITMAP),
	TAGMAP(WA_SimpleRefresh,NewWindow,Flags,0,LONG,BOOL,NODEFAULT,WFLG_SIMPLE_REFRESH),
	TAGMAP(WA_SmartRefresh,NewWindow,Flags,0,LONG,BOOL,NODEFAULT,WFLG_SMART_REFRESH),
	TAGMAP(WA_SizeBRight,NewWindow,Flags,0,LONG,BOOL,NODEFAULT,WFLG_SIZEBRIGHT),
	TAGMAP(WA_SizeBBottom,NewWindow,Flags,0,LONG,BOOL,NODEFAULT,WFLG_SIZEBBOTTOM),
	TAGMAP(WA_GimmeZeroZero,NewWindow,Flags,0,LONG,BOOL,NODEFAULT,WFLG_GIMMEZEROZERO),

	TAG_DONE
};

/*
** OpenWindowA
**
** Open a window using arguments from a taglist.
*/
struct Window *
OpenWindowA(TAGITEM *tags)
{
	struct NewWindow nw;

	/* Write arguments in taglist into the nw buffer. If TL_MapTagList return any missflags this */
	/* function will fail. */
	if(TL_MapTagList(newwindow_map,(APTR)&nw,tags)) return NULL;

	/* Handle the tagitems WA_CustomScreen and WA_PubScreen. */
	if(nw.Screen=(APTR)TL_GetTagData(WA_CustomScreen,NULL,tags)) nw.Type = CUSTOMSCREEN;
	else if(nw.Screen=(APTR)TL_GetTagData(WA_PubScreen,NULL,tags)) nw.Type = PUBLICSCREEN;
	else nw.Type = WBENCHSCREEN;

	/* Print some information */
	printf("NewWindow\n");
	printf(" LeftEdge %d, TopEdge %d, Width %d, Height %d,\n",nw.LeftEdge,nw.TopEdge,nw.Width,nw.Height);
	printf(" DetailPen %d, BlockPen %d,\n",nw.DetailPen,nw.BlockPen);
	printf(" IDCMPFlags 0x%X, Flags 0x%X,\n",nw.IDCMPFlags,nw.Flags);
	printf(" FirstGadget 0x%X, CheckMark 0x%X, Title 0x%X,\n",nw.FirstGadget,nw.CheckMark,nw.Title);
	printf(" Screen 0x%X, BitMap 0x%X,\n",nw.Screen,nw.BitMap);
	printf(" MinWidth %d, MinHeight %d, MaxWidth %d, MaxHeight %d,\n",nw.MinWidth,nw.MinHeight,nw.MaxWidth,nw.MaxHeight);
	printf(" Type 0x%X\n",nw.Type);

	return OpenWindow(&nw);
}

/*
** handle_window
**
** Handle IDCMP messages send to a window.
*/
VOID
handle_window(struct Window *win)
{
	if(win)
	{
		for(;;)
		{
			struct IntuiMessage *msg;
			ULONG class;
	
			WaitPort(win->UserPort);
			msg=(struct IntuiMessage *)GetMsg(win->UserPort);
			class=msg->Class;
			ReplyMsg((struct Message *)msg);
			if(class==IDCMP_CLOSEWINDOW) break;
		}
		CloseWindow(win);
	}
}

/*
** quit
**
** This function is called by the exit() function, and deallocates resources.
*/
VOID
quit(VOID)
{
	if(TagListBase) CloseLibrary(TagListBase);
}


/*
** main
**
** Function called at program start.
*/
VOID
main(VOID)
{
	/* add our quit() function to the list of functions called upon exit */
	atexit(quit);
	/* open TagListLibrary or exit if the library can not be opned */
	if(!(TagListBase=OpenLibrary("taglist.library",TAGLIST_VERSION))) exit(20);
	{
		/* build our taglist */
		TAGITEM tags[] =
		{
			WA_Left,0,WA_Top,0,WA_Width,640,WA_Height,200,WA_DetailPen,2,WA_BlockPen,1,
			WA_CloseGadget,TRUE,WA_DragBar,TRUE,
			WA_Title,(TAGDATA)((APTR)"A window created with OpenWindowA()"),
			WA_IDCMP,IDCMP_CLOSEWINDOW,
			TAG_DONE
		};
		/* open a window using our taglist and handle IDCMP messages send to this window */
		handle_window(OpenWindowA(tags));
	}
	/* exit with no errorcode. (Remember exit() will call quit().) */
	exit(0);
}
