Kasten 5 * Beispiel-Implementation einiger Methoden
---------------------------------------------------

/* Datenstruktur */

struct MyData
{
	LONG pen;
};


/* Attribute */

#define MYATTR_PEN 0x8022


/* OM_NEW */

SAVEDS ULONG mNew(struct IClass *cl,Object *obj,Msg msg)
{
	struct MyData *data;

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

	data = INST_DATA(cl,obj);
	data->pen = GetTagData(MYATTR_PEN, 1, ((struct opSet *)msg)->ops_AttrList);
	return((ULONG)obj);
}


/* OM_DISPOSE */

SAVEDS ULONG mDispose(struct IClass *cl,Object *obj,Msg msg)
{
	/* OM_NEW hat nichts alloziert, */
   /* also müssen wir auch nichts freigeben */
	return(DoSuperMethodA(cl,obj,msg));
}


/* OM_SET */

SAVEDS ULONG mSet(struct IClass *cl,Object *obj,Msg msg)
{
	struct MyData *data = INST_DATA(cl,obj);
	struct TagItem *tags,*tag;

	for (tags=((struct opSet *)msg)->ops_AttrList;tag=NextTagItem(&tags);)
	{
		switch (tag->ti_Tag)
		{
			case MYATTR_PEN:
				data->pen = tag->ti_Data;         /* neuen Wert setzen */
				MUI_Redraw(obj,MADF_DRAWOBJECT);  /* neuzeichnen veranlassen */
				break;
		}
	}

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


/* OM_GET */

static ULONG mGet(struct IClass *cl,Object *obj,Msg msg)
{
	struct MyData *data = INST_DATA(cl,obj);
	ULONG *store = ((struct opGet *)msg)->opg_Storage;

	switch (((struct opGet *)msg)->opg_AttrID)
	{
		case MYATTR_PEN: *store = data->pen; return(TRUE);
	}

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


/* MUIM_AskMinMax */

SAVEDS ULONG mAskMinMax(struct IClass *cl,Object *obj,struct MUIP_AskMinMax *msg)
{
	/* Hier muß *zuerst* DoSuperMethod aufgerufen werden */

	DoSuperMethodA(cl,obj,msg);

	/* Danach können wir unseres Dimensionen dazuaddieren */

	msg->MinMaxInfo->MinWidth  += 100;
	msg->MinMaxInfo->DefWidth  += 120;
	msg->MinMaxInfo->MaxWidth  += 500;

	msg->MinMaxInfo->MinHeight += 40;
	msg->MinMaxInfo->DefHeight += 90;
	msg->MinMaxInfo->MaxHeight += 300;

	return(0);
}


/* MUIM_Draw */

SAVEDS ULONG mDraw(struct IClass *cl,Object *obj,struct MUIP_Draw *msg)
{
	struct MyData *data = INST_DATA(cl,obj);
	int i;

	/* Zuerst DoSuperMethod() aufrufen (Rahmen werden gezeichnet) */

	DoSuperMethodA(cl,obj,msg);

	/* Nur Zeichnen wenn MADF_DRAWOBJECT gesetzt ist */

	if (!(msg->flags & MADF_DRAWOBJECT))
		return(0);

	SetAPen(_rp(obj),_dri(obj)->dri_Pens[data->pen]);

	for (i=_mleft(obj);i<=_mright(obj);i+=5)
	{
		Move(_rp(obj),_mleft(obj),_mbottom(obj));
		Draw(_rp(obj),i,_mtop(obj));
		Move(_rp(obj),_mright(obj),_mbottom(obj));
		Draw(_rp(obj),i,_mtop(obj));
	}

	return(0);
}
