/* CreateGUI.c */

#include <OSIncludes.h>
#pragma header

#include <clib/alib_protos.h>
#include <misc/GTLayout.h>
#include <pragma/GTLayout_lib.h>

#define CATCOMP_NUMBERS
#include "catalogs/PWPrefs.h"
#include "PWPrefs.h"

#include <stdio.h>
#include <string.h>

#define LT_EndGroup 	LT_New(MainLayoutHandle,LA_Type,END_KIND,TAG_DONE)


static STRPTR GruppenStrings[MAX_GRUPPEN+1];

static WORD GruppenID;
static WORD SeitenID;
static WORD ObjektID;

static void InitGui(void)
{
	struct Gruppe *gruppe;
	STRPTR *gs;
	
	gruppe=(struct Gruppe *)GruppenListe.lh_Head;
	gs=(STRPTR *)&GruppenStrings[0];
	
	while (gruppe->gr_Node.ln_Succ)
	{
		*gs++ = gruppe->gr_Name;
		gruppe=(struct Gruppe *)gruppe->gr_Node.ln_Succ;
	}
	*gs=0;
	
}

static void MakeObjekte(struct Seite *seite)
{
	struct Objekt *obj;
	WORD id;
	
	LT_New(MainLayoutHandle,
		LA_Type,VERTICAL_KIND,
		TAG_DONE);
		
	ObjektID=0;
	obj=(struct Objekt *)seite->se_ObjektListe.lh_Head;
	
	while (obj->ob_Node.ln_Succ)
	{
		id=GruppenID+SeitenID+ObjektID;

		if (obj->ob_FrameName)
		{
			LT_New(MainLayoutHandle,
				LA_Type,VERTICAL_KIND,
				obj->ob_FrameName[0] ? LA_LabelText : LAGR_Frame, obj->ob_FrameName[0] ? obj->ob_FrameName : (STRPTR) TRUE,
				TAG_DONE);
		}
		
		LT_New(MainLayoutHandle,
			LA_Type,VERTICAL_KIND,
			TAG_DONE);

		switch (obj->ob_Typ)
		{
			case OBJ_BOOL:
				LT_New(MainLayoutHandle,
					LA_Type,CHECKBOX_KIND,
					LA_ID,id,
					LA_LabelText,obj->ob_Name,
					GTCB_Checked,obj->ob_LongValue,
					TAG_DONE);
				break;
				
			case OBJ_INTEGER:
				LT_New(MainLayoutHandle,
					LA_Type,INTEGER_KIND,
					LA_ID,id,
					LA_LabelText,obj->ob_Name,
					LA_Chars,10,
					LAIN_Min,obj->ob_Min,
					LAIN_Max,obj->ob_Max,
					LAIN_UseIncrementers,TRUE,
					LA_LONG,&obj->ob_LongValue,
					TAG_DONE);
				break;

			case OBJ_STRING:
				LT_New(MainLayoutHandle,
					LA_Type,STRING_KIND,
					LA_ID,id,
					LA_LabelText,obj->ob_Name,
					LA_Chars,40,
					LA_STRPTR,obj->ob_StringValue,
					obj->ob_CharWidth>0 ? LA_Chars : TAG_IGNORE,obj->ob_CharWidth,
					TAG_DONE);
				break;
			
			case OBJ_CYCLE:
				LT_New(MainLayoutHandle,
					LA_Type,CYCLE_KIND,
					LA_ID,id,
					LA_LabelText,obj->ob_Name,
					LA_LONG,&obj->ob_LongValue,
					LACY_LabelTable,obj->ob_Tabelle,
					TAG_DONE);
		}
		
		LT_EndGroup;

		if (obj->ob_EndFrame)
		{
			LT_EndGroup;
		}

		obj=(struct Objekt *)obj->ob_Node.ln_Succ;
		ObjektID+=1;
	}
	LT_EndGroup;
}

static void MakeSeiten(struct Gruppe *gruppe)
{
	struct Seite *seite;
	
	SeitenID=0;

	if (gruppe->gr_AnzSeiten>1)
	{
		LT_New(MainLayoutHandle,
			LA_Type,VERTICAL_KIND,
			TAG_DONE);

			LT_New(MainLayoutHandle,
				LA_Type,TAB_KIND,
				LATB_LabelTable,gruppe->gr_Tabelle,
				LATB_AutoPageID,GID_MULTIPAGEGAD,
				TAG_DONE);
				
		LT_EndGroup;
		
		LT_New(MainLayoutHandle,
			LA_Type,HORIZONTAL_KIND,
			LA_ID,GID_MULTIPAGEGAD,
			LAGR_SameSize,TRUE,
			LAGR_ActivePage,0,
			TAG_DONE);

	}
	
	seite=(struct Seite *)gruppe->gr_SeitenListe.lh_Head;
	while (seite->se_Node.ln_Succ)
	{
		/*==*/
		MakeObjekte(seite);
		/*==*/
		seite=(struct Seite *)seite->se_Node.ln_Succ;
		SeitenID+=50;
	}
	
	if (gruppe->gr_AnzSeiten>1)
	{
		LT_EndGroup;
	}
}

static void MakeGruppen(void)
{
	struct Gruppe *gruppe;

	LT_New(MainLayoutHandle,
			LA_Type,HORIZONTAL_KIND,
			LA_ID,GID_MULTIGROUPGAD,
			LAGR_ActivePage,0,
			LAGR_SameSize,TRUE,
			TAG_DONE);
				
	
	GruppenID=1000;

	gruppe=(struct Gruppe *)GruppenListe.lh_Head;
	while(gruppe->gr_Node.ln_Succ)
	{
		if (gruppe->gr_AnzSeiten<2)
		{
			LT_New(MainLayoutHandle,
				LA_Type,VERTICAL_KIND,
				LA_LabelText,((struct Seite *)gruppe->gr_SeitenListe.lh_Head)->se_Name,
				TAG_DONE);
		} else {
			LT_New(MainLayoutHandle,
				LA_Type,VERTICAL_KIND,
				LAGR_Frame,TRUE,
				TAG_DONE);
		}
			/*==*/
			MakeSeiten(gruppe);
			/*==*/
			
		LT_EndGroup;
		gruppe=(struct Gruppe *)gruppe->gr_Node.ln_Succ;
		GruppenID+=1000;
	}

	LT_EndGroup;	
}

struct Window *MakeGUI(void)
{
	InitGui();
	
	if (!(MainLayoutHandle=LT_CreateHandleTags(0,
									LAHN_LocaleHook,&LocaleHook,
									TAG_DONE)))
	{
		Ende(MSG(ERR_NO_LAYOUTHANDLE));
	}
	
	LT_New(MainLayoutHandle,
		LA_Type,VERTICAL_KIND,
		TAG_DONE);

		LT_New(MainLayoutHandle,
			LA_Type,HORIZONTAL_KIND,
			TAG_DONE);
			
			LT_New(MainLayoutHandle,
				LA_Type,VERTICAL_KIND,
				LA_LabelText,MSG(GAD_GROUP),
				LAGR_SameHeight,GID_MULTIGROUPGAD,
				TAG_DONE);
				
				LT_New(MainLayoutHandle,
					LA_Type,LISTVIEW_KIND,
					LALV_Labels,GruppenStrings,
					LALV_CursorKey,TRUE,
					LALV_Lines,10,
					LALV_MaxGrowY,1000,
					LALV_Link,NIL_LINK,
					LALV_AutoPageID,GID_MULTIGROUPGAD,
					GTLV_Selected,0,
					TAG_DONE);
				
			LT_EndGroup;
		
			/*==*/
			MakeGruppen();
			/*==*/

		LT_EndGroup;


		LT_New(MainLayoutHandle,
			LA_Type,HORIZONTAL_KIND,
			LAGR_Frame,TRUE,
			LAGR_SameSize,TRUE,
			LAGR_Spread,TRUE,
			TAG_DONE);

			LT_New(MainLayoutHandle,
				LA_Type,BUTTON_KIND,
				LA_LabelText,MSG(GAD_SAVE),
				LA_ID,GID_SAVE,
				TAG_DONE);
			LT_New(MainLayoutHandle,
				LA_Type,BUTTON_KIND,
				LA_LabelText,MSG(GAD_USE),
				LA_ID,GID_USE,
				TAG_DONE);
			LT_New(MainLayoutHandle,
				LA_Type,BUTTON_KIND,
				LA_LabelText,MSG(GAD_TEST),
				LA_ID,GID_TEST,
				TAG_DONE);
			LT_New(MainLayoutHandle,
				LA_Type,BUTTON_KIND,
				LA_LabelText,MSG(GAD_CANCEL),
				LA_ID,GID_CANCEL,
				TAG_DONE);


		LT_EndGroup;

	LT_EndGroup;


	return LT_Build(MainLayoutHandle,
		     LAWN_Title,"PWPrefs",
		     LAWN_IDCMP,IDCMP_CLOSEWINDOW|IDCMP_GADGETHELP,
		     WA_DragBar,TRUE,
		     WA_DepthGadget,TRUE,
		     WA_CloseGadget,TRUE,
		     TAG_DONE);
}

	
