// Contact steffen.mars@stenloese.mail.telia.com for CXX classes

#include <CXX:Protos/WinX.cxx>
#include <CXX:Protos/GadgX.cxx>
#include <CXX:Protos/StringX.cxx>

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

const int	OK=1;
const int	CANCEL=2;
const int	ENTER=3;

const int	ERR_NONE=0;
const int	ERR_ARGS=1;
const int	ERR_CANCEL=2;
const int	ERR_ABOUT=3;
const int	ERR_ARG=4;
const int	ERR_SUCCESS=100;

UWORD moenster[]={0x5555,0xAAAA};
char		*version = "$VER:RequestString v5.40";
char		*usage   = "RequestString v5.40\nUSAGE: RequestString [TITLE <windowtitle>] [GADGETS <ok_text> <cancel_text>] [BODY <input_text>] [BOX <left> <top> <width> <height>] [DEFAULT <text>]\n";

int main(int argc, char **argv)
{
	if (argc == 2 && argv[1][0]=='?')
	{
		printf("%s",usage);
		return 0;
	}
		
	WinX		window(32,32,"RequestString");
	DummyGX		nogadget(100);
	BoolGX		ok("OK",OK);
	BoolGX		cancel("Cancel",CANCEL);
	StringGX	text(0,512,ENTER,SGX_SHADOWTEXT | SGX_DOUBLE);
	GXGroup		gadgets("Request",4096,31941,57343,29498,2,2,2,2,GXG_FILL);
	StringX		string;
	GadgX*		gx;
	int			x,error=0,result,v1,v2,v3,v4;
	char*		input="Input";

	window.Limits(32,32,~0,32);
	window.Pattern(moenster,1);
	window.DrawMode(JAM2);
	window.GraphicsPenA(2);
	window.GraphicsPenB(0);
	for (x=1; x<argc && !error; x++)
	{
		string = argv[x];
		
		if (string == "TITLE")
		{
			if (argc-x <2) error=ERR_ARGS;
			window.Titles(argv[++x],0);
			continue;
		}

		if (string == "GADGETS")
		{
			if (argc-x <3) error=ERR_ARGS;
			ok.SetTitle(argv[++x]);
			cancel.SetTitle(argv[++x]);
			continue;
		}

		if (string == "BODY")
		{
			if (argc-x <2) error=ERR_ARGS;
			input = argv[++x];
			continue;
		}
		
		if (string == "BOX")
		{
			if (argc-x < 5) error=ERR_ARGS;
			v1 = atoi(argv[++x]);
			v2 = atoi(argv[++x]);
			v3 = atoi(argv[++x]);
			v4 = atoi(argv[++x]);
			window.Limits(32,32,~0,v4);
			window.Box(v1,v2,v3,v4);
			window.WaitIDCMP(IDCMP_NEWSIZE);
			continue;
		}
		
		if (string == "DEFAULT")
		{
			if (argc-x <2) error=ERR_ARGS;
			else text.Fill(argv[++x]);
			continue;
		}
		
		printf("Bad argument : %s\n",string.Pointer());
		return 5;
	}
	if (!error)
	{
		gadgets.AddGX(&text);
		gadgets.AddGX(&nogadget);
		gadgets.AddGX(&ok);
		gadgets.AddGX(&cancel);
		gadgets.Start(&window);
		text.Activate();
		window.Textual(4096,4096,57343,19749,input);
	}
	while(!error)
	{
		window.MsgWait();
		switch (window.Event())
		{
			case IDCMP_GADGETDOWN:
			case IDCMP_GADGETUP:
			gx = window.GadgetX();
			if (gx) switch(gx->ID())
			{
				case CANCEL:
				error = ERR_CANCEL;
				break;
				
				case OK:
				case ENTER:
				printf("\"%s\"\n",text.Container());
				error = ERR_SUCCESS;
				break;
				
				default:
				break;
			}
			break;
			
			case IDCMP_CLOSEWINDOW:
			error = ERR_CANCEL;
			break;
			
			case IDCMP_NEWSIZE:
			window.GraphicsPenA(2);
			window.GraphicsPenB(0);
			gadgets.Resize();
			window.Textual(4096,4096,57343,19749,input);
			text.Activate();
			break;

			default:
			break;
		}
	}
	switch (error)
	{
		case ERR_ARGS:
		printf("Wrong number of arguments.\n%s",usage);
		result = 10;
		break;
		
		case ERR_CANCEL:
		result=5;
		break;
		
		case ERR_SUCCESS:
		result=0;
		break;
		
		default:
		result=20;
		break;
	}
	return result;
}
