/*
	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.
*/


/* Compiler specific stuff */
#if defined(_DCC)
#define REG(x) __ ## x
#define SAVEDS __geta4
#define ASM
#define REGARGS __regargs
#else
#if defined(__SASC)
#define REG(x) register __ ## x
#define SAVEDS __saveds
#define ASM __asm
#define REGARGS __regargs
#else
#error "Don't know how to handle register arguments for your compiler."
#endif
#endif



/* 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_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 10.11 (23.12.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;
};


struct Library *MUIClassBase;
struct Library *MUIMasterBase;
struct Library *SysBase;
struct Library *UtilityBase;
struct Library *DOSBase;
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) 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)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 SAVEDS ASM ULONG Dispatcher(REG(a0) struct IClass *cl,
				   REG(a2) Object *obj,
				   REG(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(REG(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(REG(a6) struct Library *mybase)
{
	if (MUIMasterBase)
	{
		if (ThisClass) MUI_DeleteCustomClass(ThisClass);
		CloseLibrary(MUIMasterBase);
	}
}


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