
#define __RC_OBJ_C__
#include "e_gem.h"

void ob_dostate(OBJECT *tree, int obj, int state)
{
	tree[obj].ob_state |= state;
}

void ob_undostate(OBJECT *tree, int obj, int state)
{
	tree[obj].ob_state &= ~state;
}

int ob_isstate(OBJECT *tree, int obj, int state)
{
	if ((tree[obj].ob_state & state)==state)
		return (TRUE);
	else
		return (FALSE);
}

void ob_doflag(OBJECT *tree, int obj, int flag)
{
	tree[obj].ob_flags |= flag;
}

void ob_undoflag(OBJECT *tree, int obj, int flag)
{
	tree[obj].ob_flags &= ~flag;
}

int ob_isflag(OBJECT *tree, int obj, int flag)
{
	if ((tree[obj].ob_flags & flag)==flag)
		return (TRUE);
	else
		return (FALSE);
}

void ob_xywh(OBJECT *tree, int obj, GRECT *rec)
{
	*rec = *((GRECT *) &tree[obj].ob_x);
}

static char **typetest(OBJECT *tree, int obj)
{
	OBJECT *t = tree + obj;
	int ot;

	switch ((ot = t->ob_type) & 0xff)
	{
	case G_TEXT:
	case G_FTEXT:
	case G_BOXTEXT:
	case G_FBOXTEXT:
		return &(t->ob_spec.tedinfo->te_ptext);
	case G_STRING:
	case G_BUTTON:
	case G_TITLE:
		return &(t->ob_spec.free_string);
	default:
		if ((ot & G_TYPE)==G_XTEXT)
			return ((char **) &(t->ob_spec.userblk->ub_parm));
		else
			return (NULL);
	}
}

char *ob_get_text(OBJECT *tree, int obj, int clear)
{
	char **te;

	if (te = typetest(tree, obj))
	{
		if (clear)
			**te = '\0';
		return (*te);
	} else
		return (NULL);
}

void ob_set_text(OBJECT *tree, int obj, char *text)
{
	char **te;

	if (te = typetest(tree, obj))
		*te = text;
}

void ob_draw_dialog(OBJECT *tree,int x,int y,int w,int h)
{
	int tx,ty,tw,th;

	form_center(tree,&tx,&ty,&tw,&th);
	form_dial(FMD_START,tx,ty,tw,th,tx,ty,tw,th);

	if (x|y|w|h)
		form_dial(FMD_GROW,x,y,w,h,tx,ty,tw,th);
	objc_draw(tree,0,MAX_DEPTH,tx,ty,tw,th);
}

void ob_undraw_dialog(OBJECT *tree,int x,int y,int w,int h)
{
	int tx,ty,tw,th;

	form_center(tree,&tx,&ty,&tw,&th);
	if (x|y|w|h)
		form_dial(FMD_SHRINK,tx,ty,tw,th,x,y,w,h);
	form_dial(FMD_FINISH,tx,ty,tw,th,tx,ty,tw,th);
}

#ifdef __GNUC__
int rc_inside(int x, int y, GRECT *rec)
{
	return (x >= rec->g_x && x < rec->g_x + rec->g_w &&
			y >= rec->g_y && y < rec->g_y + rec->g_h);
}
#endif	/* __GNUC__ */

#ifdef LATTICE
void rc_grect_to_array(GRECT *rec,int *pxy)
{
	pxy[0] = rec->g_x;
	pxy[1] = rec->g_y;
	pxy[2] = rec->g_x + rec->g_w - 1;
	pxy[3] = rec->g_y + rec->g_h - 1;
}
#endif	/* LATTICE */

void rc_array_to_grect(int *pxy,GRECT *rec)
{
	rec->g_x = pxy[0];
	rec->g_y = pxy[1];
	rec->g_w = pxy[2] - pxy[0] + 1;
	rec->g_h = pxy[3] - pxy[1] + 1;
}

int EvntMulti(EVENT *evnt_struct)
{
	return (evnt_struct->ev_mwich = evnt_multi(evnt_struct->ev_mflags,
		evnt_struct->ev_mbclicks,
		evnt_struct->ev_bmask,
		evnt_struct->ev_mbstate,
		evnt_struct->ev_mm1flags,
		evnt_struct->ev_mm1x,
		evnt_struct->ev_mm1y,
		evnt_struct->ev_mm1width,
		evnt_struct->ev_mm1height,
		evnt_struct->ev_mm2flags,
		evnt_struct->ev_mm2x,
		evnt_struct->ev_mm2y,
		evnt_struct->ev_mm2width,
		evnt_struct->ev_mm2height,
		evnt_struct->ev_mmgpbuf,
		((unsigned long)evnt_struct->ev_mthicount << 16) + evnt_struct->ev_mtlocount,
		&evnt_struct->ev_mmox,
		&evnt_struct->ev_mmoy,
		&evnt_struct->ev_mmobutton,
		&evnt_struct->ev_mmokstate,
		&evnt_struct->ev_mkreturn,
		&evnt_struct->ev_mbreturn));
}
