/*
	UserData.mcc is a subclass of groupclass. Several gadgets
	allow entering a users name and address. This silly class
	is just a demo how to write subclasses of group class.

   Note: Compile with SAS/C 6.1 and above.
*/

/* Includes */
#include <libraries/mui.h>
#include <dos/dos.h>
#include <clib/alib_protos.h>
#include <clib/exec_protos.h>
#include <clib/dos_protos.h>
#include <clib/intuition_protos.h>
#include <clib/utility_protos.h>
#include <clib/muimaster_protos.h>
#include <stdlib.h>
#include <string.h>

#include <pragmas/exec_sysbase_pragmas.h>
#include <pragmas/dos_pragmas.h>
#include <pragmas/intuition_pragmas.h>
#include <pragmas/utility_pragmas.h>
#include <pragmas/muimaster_pragmas.h>

#include "UserData_mcc.h"

static const char VersionTag[] = "\0$VER: UserData.mcc 8.57 (03.07.94)";

#define CLASS      MUIC_UserData
#define SUPERCLASS MUIC_Group

struct Data
{
	Object *group;
	Object *first;
	Object *name;
	Object *street;
	Object *city;
	Object *country;
	Object *phone;
	Object *email;
};


static struct Library *MUIClassBase;
static struct Library *MUIMasterBase;
static struct Library *SysBase;
static struct Library *UtilityBase;
static struct Library *DOSBase;
static struct Library *IntuitionBase;

static struct MUI_CustomClass *ThisClass;


static const char *PopNames[] =
{
	"Germany",
	"Suisse",
	"Italy",
	"U.S.A.",
	"Australia",
	NULL
};


static ULONG mNew(struct IClass *cl,Object *obj,struct opSet *msg)
{
	struct Data *data;

	if (!(obj = (Object *)DoSuperMethodA(cl,obj,(Msg)msg)))
		return(0);

	data = INST_DATA(cl,obj);

	data->group = VGroup,
		Child, HGroup, GroupFrameT("Customer"),
			Child, ColGroup(2), MUIA_Weight, 200,
				Child, Label("Name:"   ), Child, HGroup,
					Child, data->name  = MUI_MakeObject(MUIO_String,NULL,50),
					Child, data->first = MUI_MakeObject(MUIO_String,NULL,50),
					End,
				Child, Label("Street:"  ), Child, data->street = MUI_MakeObject(MUIO_String,NULL,100),
				Child, Label("PC, City:"), Child, data->city   = MUI_MakeObject(MUIO_String,NULL,100),
				End,
			Child, ColGroup(2),
				Child, Label("Country:"),
				Child, data->country = PoplistObject,
					MUIA_Poplist_Array   , PopNames,
					MUIA_Popstring_String, MUI_MakeObject(MUIO_String,NULL,30),
					MUIA_Popstring_Button, MUI_MakeObject(MUIO_PopButton,MUII_PopUp),
					End,
				Child, Label("Phone:"  ), Child, data->phone = MUI_MakeObject(MUIO_String,NULL,30),
				Child, Label("EMail:"  ), Child, data->email = MUI_MakeObject(MUIO_String,NULL,30),
				End,
			End,
		End;

	if (!data->group)
	{
		CoerceMethod(cl,obj,OM_DISPOSE);
		return(0);
	}

	DoMethod(obj,OM_ADDMEMBER,data->group);

	msg->MethodID = OM_SET; /* a little trick to parse taglist */
	DoMethodA(obj,msg);     /* and set attributes with OM_SET. */
	msg->MethodID = OM_NEW; /* restore method id               */

	return((ULONG)obj);
}


static ULONG mDispose(struct IClass *cl,Object *obj,Msg msg)
{
	return(DoSuperMethodA(cl,obj,msg));
}


static ULONG mSet(struct IClass *cl,Object *obj,struct opSet *msg)
{
	struct Data *data = INST_DATA(cl,obj);
	struct TagItem *tags,*tag;

	for (tags=msg->ops_AttrList;tag=NextTagItem(&tags);)
	{
		switch (tag->ti_Tag)
		{
			case MUIA_UserData_Name   : set(data->name   ,MUIA_String_Contents,tag->ti_Data); break;
			case MUIA_UserData_First  : set(data->first  ,MUIA_String_Contents,tag->ti_Data); break;
			case MUIA_UserData_Street : set(data->street ,MUIA_String_Contents,tag->ti_Data); break;
			case MUIA_UserData_City   : set(data->city   ,MUIA_String_Contents,tag->ti_Data); break;
			case MUIA_UserData_Country: set(data->country,MUIA_String_Contents,tag->ti_Data); break;
			case MUIA_UserData_EMail  : set(data->email  ,MUIA_String_Contents,tag->ti_Data); break;
			case MUIA_UserData_Phone  : set(data->phone  ,MUIA_String_Contents,tag->ti_Data); break;
		}
	}

	return(DoSuperMethodA(cl,obj,msg));
}


static ULONG mGet(struct IClass *cl,Object *obj,Msg msg)
{
	struct Data *data = INST_DATA(cl,obj);

	switch (((struct opGet *)msg)->opg_AttrID)
	{
		case MUIA_UserData_Name   : return(DoMethodA(data->name   ,msg));
		case MUIA_UserData_First  : return(DoMethodA(data->first  ,msg));
		case MUIA_UserData_Street : return(DoMethodA(data->street ,msg));
		case MUIA_UserData_City   : return(DoMethodA(data->city   ,msg));
		case MUIA_UserData_Country: return(DoMethodA(data->country,msg));
		case MUIA_UserData_EMail  : return(DoMethodA(data->email  ,msg));
		case MUIA_UserData_Phone  : return(DoMethodA(data->phone  ,msg));
	}

	return(DoSuperMethodA(cl,obj,msg));
}


static ULONG mEdit(struct IClass *cl,Object *obj,Msg msg)
{
	/* do something here */
	return(0);
}


static ULONG mPrint(struct IClass *cl,Object *obj,Msg msg)
{
	/* do some other thing here */
	return(0);
}


static ULONG __asm Dispatcher(register __a0 struct IClass *cl,register __a2 Object *obj,register __a1 Msg msg)
{
	switch (msg->MethodID)
	{
		case OM_NEW                  : return(mNew        (cl,obj,(APTR)msg));
		case OM_DISPOSE              : return(mDispose    (cl,obj,(APTR)msg));
		case OM_GET                  : return(mGet        (cl,obj,(APTR)msg));
		case OM_SET                  : return(mSet        (cl,obj,(APTR)msg));

		case MUIM_UserData_Edit      : return(mEdit       (cl,obj,(APTR)msg));
		case MUIM_UserData_Print     : return(mPrint      (cl,obj,(APTR)msg));
	}

	return(DoSuperMethodA(cl,obj,msg));
}


long __asm __UserLibInit(register __a6 struct Library *mybase)
{
	SysBase = *((struct Library **)4);
	MUIClassBase = mybase;

	if (MUIMasterBase = OpenLibrary("muimaster.library",8))
	{
		if (ThisClass = MUI_CreateCustomClass(mybase,SUPERCLASS,NULL,sizeof(struct Data),Dispatcher))
		{
			UtilityBase   = ThisClass->mcc_UtilityBase;
			DOSBase       = ThisClass->mcc_DOSBase;
			IntuitionBase = ThisClass->mcc_IntuitionBase;
			return(0);
		}
		CloseLibrary(MUIMasterBase);
	}
	return(-1);
}


void __asm __UserLibCleanup(register __a6 struct Library *mybase)
{
	if (MUIMasterBase)
	{
		if (ThisClass) MUI_DeleteCustomClass(ThisClass);
		CloseLibrary(MUIMasterBase);
	}
}


struct MUI_CustomClass * __asm MCC_GetClass(VOID)
{
	return(ThisClass);
}
