/* commgad.c -- create command gadgets */

/*
Copyright (c) 1989 Commodore-Amiga, Inc.

Executables based on this information may be used in software
for Commodore Amiga computers. All other rights reserved.
This information is provided "as is"; no warranties are made.
All use is at your own risk, and no liability or responsibility
is assumed.
*/

#include "sysall.h"

#define D(x)	;

static struct Image *cImage = NULL;	/* shared Image */
static	UWORD		*cMask;

struct Image	*CreateImage();
struct Image	*makeCommandImage();
struct Gadget	*CreateBoolGadget();
struct RastPort	*CreateImageRPort();
void freeCommandImage(void);

/*
 *	creates linked list of "command" gadgets, with sequential
 *	GadgetID values.
 */
struct Gadget	*commandGadgets(struct RastPort *rp, char **argv, int numgad, int id )
{
	int					num;
	char				**a;
	struct Rectangle	textent;
	struct Gadget		*glist = NULL;
	struct Gadget		*g;

	g = (struct Gadget *) &glist;

	textListExtent( rp, argv, numgad, &textent );

	if ( makeCommandImage( &textent ) )
	{

		/* make gadget for each line of text */
		for ( a = argv, num = numgad; num; ++a, --num )
		{

			if ( g->NextGadget = CreateBoolGadget( cImage, cMask, id++, *a ) )
			{
				g = g->NextGadget;
				D( printf("cG: gadget: %lx\n", g ) );

				/* position gadget text */
				g->GadgetText->LeftEdge = (g->Width - textLength(rp, *a))/2;
				g->GadgetText->TopEdge = (g->Height - rp->TxHeight)/2;
					/*rp->TxBaseline + (g->Height - rp->TxHeight)/2;*/

				/* set gadget flags */
				g->Activation |= RELVERIFY;
			}
			else
			{
				FreeGadgets( glist );
				glist = NULL;
				freeCommandImage();
				break;
			}
		}
	}
	D( printf("cG return: %lx\n", glist ) );
	return ( glist );
}

void cleanupCommGadgets(void)
{
	freeCommandImage();
}

/*
 * returns pointer to static command image, or NULL
 */
struct Image	*makeCommandImage(struct Rectangle	*extent)
{
	struct RastPort	*rp;
	int	width, height;
	UWORD			*ImagePlane();

	width = extent->MaxX - extent->MinX + 1;
	height = extent->MaxY - extent->MinY + 1;

	/* add some margin	*/
	width	+= 16;			/* scale by resolution soon	*/
	height	+= 6;

	if ( !cImage )
	{
		if ( cImage = CreateImage( width, height, 3 ) )
		{


			if ( rp = CreateImageRPort( cImage ) )
			{
				drawBox( rp, width, height, 6, 3, 2, 1 );
				DeleteImageRPort( rp );

				/* use third plane for mask	*/
				cMask = ImagePlane( cImage, 2 );
				cImage->Depth = 2;	/* Do this AFTER ImageRPort! */
			}
			else
			{
				freeCommandImage();		/* nulls out cImage */
			}
		}
	}

	D( printf("mCI returning %lx\n", cImage ) );
	return ( cImage );
}

void freeCommandImage(void)
{
	if ( cImage ) DeleteImage( cImage );
	cImage = NULL;
}



