/* $Revision Header *** Header built automatically - do not edit! ***********
 *
 *	(C) Copyright 1991 by Torsten Jürgeleit
 *
 *	Name .....: language_test.c
 *	Created ..: Thursday 19-Dec-91 20:21:13
 *	Revision .: 0
 *
 *	Date        Author                 Comment
 *	=========   ====================   ====================
 *	19-Dec-91   Torsten Jürgeleit      Created this file!
 *
 ****************************************************************************
 *
 *	Test of language support functions
 *
 * $Revision Header ********************************************************/

	/* Includes */

#include <exec/types.h>
#include <graphics/gfxbase.h>
#include <intuition/intuitionbase.h>
#include <intuition/intuition.h>
#include <functions.h>
#include <libraries/memwatch.h>		/* AFTER functions.h */
#include "/render/render.h"
#include "/texts/texts.h"
#include "/borders/borders.h"
#include "/gadgets/gadgets.h"
#include "/requester/requester.h"
#include "language.h"

	/* Defines */

#define WINDOW_WIDTH		600
#define WINDOW_HEIGHT		200
#define WINDOW_IDCMP_FLAGS	(CLOSEWINDOW | GADGET_IDCMP_FLAGS_ALL)
#define WINDOW_FLAGS		(WINDOWCLOSE | WINDOWDRAG | WINDOWDEPTH | SMART_REFRESH | NOCAREREFRESH | RMBTRAP | ACTIVATE)
#define WINDOW_TITLE		(UBYTE *)" Language test "

#define RENDER_INFO_FLAGS	(USHORT)(RENDER_INFO_FLAG_INNER_WINDOW | RENDER_INFO_FLAG_BACK_FILL)
#define OPEN_WINDOW_FLAGS	(USHORT)(OPEN_WINDOW_FLAG_CENTER_WINDOW | OPEN_WINDOW_FLAG_RENDER_PENS)

	/* Defines for language texts */

#define LANGUAGE_ENGLISH	0
#define LANGUAGE_GERMAN		1

#define LANGUAGE_TEXT_FILE	"deutsch.language"
#define LANGUAGE_TEXT_ENTRIES	14

#define LANGUAGE_TEXT_AUTO_REQUEST	(BYTE *)1
#define LANGUAGE_TEXT_REQUESTER		(BYTE *)2
#define LANGUAGE_TEXT_LANGUAGE		(BYTE *)3
#define LANGUAGE_TEXT_ENGLISH		(BYTE *)4
#define LANGUAGE_TEXT_GERMAN		(BYTE *)5
#define LANGUAGE_TEXT_AUTO_REQ_TITLE	(BYTE *)6
#define LANGUAGE_TEXT_AUTO_REQ_BODY	(BYTE *)7
#define LANGUAGE_TEXT_AUTO_REQ_POS	(BYTE *)8
#define LANGUAGE_TEXT_AUTO_REQ_NEG	(BYTE *)9
#define LANGUAGE_TEXT_REQ_TITLE		(BYTE *)10
#define LANGUAGE_TEXT_REQ_LINE1		(BYTE *)11
#define LANGUAGE_TEXT_REQ_LINE2		(BYTE *)12
#define LANGUAGE_TEXT_REQ_LINE3		(BYTE *)13
#define LANGUAGE_TEXT_REQ_GAD_CONTINUE	(BYTE *)14

	/* Globals */

struct IntuitionBase  *IntuitionBase;
struct GfxBase        *GfxBase;
struct Library        *DiskfontBase;
struct Library        *LayersBase;

	/* Statics */

STATIC struct NewWindow  test_new_window = { 0, 0, WINDOW_WIDTH,
   WINDOW_HEIGHT, 0, 0, WINDOW_IDCMP_FLAGS, WINDOW_FLAGS, NULL, NULL,
   WINDOW_TITLE, NULL, NULL, 0, 0, 0, 0, WBENCHSCREEN };
STATIC struct TextAttr  topaz60_attr = { (STRPTR)"topaz.font", TOPAZ_SIXTY,
						   FS_NORMAL, FPF_ROMFONT },
			topaz80_attr = { (STRPTR)"topaz.font", TOPAZ_EIGHTY,
						   FS_NORMAL, FPF_ROMFONT };
	/* Defines for test gadgets */

#define TEST1_GADGET_AUTO_REQUEST	0
#define TEST1_GADGET_REQUESTER		1
#define TEST1_GADGET_LANGUAGE		2

#define TEST1_GADGET1_TYPE		GADGET_DATA_TYPE_BUTTON
#define TEST1_GADGET1_FLAGS		GADGET_DATA_FLAG_HOTKEY
#define TEST1_GADGET1_LEFT_EDGE		((WINDOW_WIDTH / 2 - TEST1_GADGET1_WIDTH) / 2)
#define TEST1_GADGET1_TOP_EDGE		((WINDOW_HEIGHT - TEST1_GADGET1_HEIGHT) / 2)
#define TEST1_GADGET1_WIDTH		((12 + 2) * 10)
#define TEST1_GADGET1_HEIGHT		19
#define TEST1_GADGET1_TEXT		LANGUAGE_TEXT_AUTO_REQUEST
#define TEST1_GADGET1_TEXT_ATTR		&topaz60_attr

#define TEST1_GADGET2_TYPE		GADGET_DATA_TYPE_BUTTON
#define TEST1_GADGET2_FLAGS		GADGET_DATA_FLAG_HOTKEY
#define TEST1_GADGET2_LEFT_EDGE		(WINDOW_WIDTH - (TEST1_GADGET2_WIDTH + TEST1_GADGET1_LEFT_EDGE))
#define TEST1_GADGET2_TOP_EDGE		TEST1_GADGET1_TOP_EDGE
#define TEST1_GADGET2_WIDTH		TEST1_GADGET1_WIDTH
#define TEST1_GADGET2_HEIGHT		TEST1_GADGET1_HEIGHT
#define TEST1_GADGET2_TEXT		LANGUAGE_TEXT_REQUESTER
#define TEST1_GADGET2_TEXT_ATTR		TEST1_GADGET1_TEXT_ATTR

#define TEST1_GADGET3_TYPE		GADGET_DATA_TYPE_MX
#define TEST1_GADGET3_FLAGS		(GADGET_DATA_FLAG_HOTKEY | GADGET_DATA_FLAG_TEXT_LEFT | GADGET_DATA_FLAG_TEXT_COLOR2)
#define TEST1_GADGET3_LEFT_EDGE		((WINDOW_WIDTH - TEST1_GADGET3_WIDTH) / 2)
#define TEST1_GADGET3_TOP_EDGE		((WINDOW_HEIGHT - TEST1_GADGET3_HEIGHT) / 2)
#define TEST1_GADGET3_WIDTH		120
#define TEST1_GADGET3_HEIGHT		30
#define TEST1_GADGET3_TEXT		LANGUAGE_TEXT_LANGUAGE
#define TEST1_GADGET3_TEXT_ATTR		&topaz60_attr
#define TEST1_GADGET3_SPACING		2
#define TEST1_GADGET3_ACTIVE		0
#define TEST1_GADGET3_TEXT_ARRAY	&language_array[0]

STATIC BYTE *language_array[] = {
	LANGUAGE_TEXT_ENGLISH,
	LANGUAGE_TEXT_GERMAN,
	NULL
};
STATIC struct GadgetData  test1_gadget_data[] = {
   {
	TEST1_GADGET1_TYPE,		/* gd_Type */
	TEST1_GADGET1_FLAGS,		/* gd_Flags */
	TEST1_GADGET1_LEFT_EDGE,	/* gd_LeftEdge */
	TEST1_GADGET1_TOP_EDGE,		/* gd_TopEdge */
	TEST1_GADGET1_WIDTH,		/* gd_Width */
	TEST1_GADGET1_HEIGHT,		/* gd_Height */
	TEST1_GADGET1_TEXT,		/* *gd_Text */
	TEST1_GADGET1_TEXT_ATTR,	/* *gd_TextAttr */
	{ 0, 0, 0 }
   }, {
	TEST1_GADGET2_TYPE,		/* gd_Type */
	TEST1_GADGET2_FLAGS,		/* gd_Flags */
	TEST1_GADGET2_LEFT_EDGE,	/* gd_LeftEdge */
	TEST1_GADGET2_TOP_EDGE,		/* gd_TopEdge */
	TEST1_GADGET2_WIDTH,		/* gd_Width */
	TEST1_GADGET2_HEIGHT,		/* gd_Height */
	TEST1_GADGET2_TEXT,		/* *gd_Text */
	TEST1_GADGET2_TEXT_ATTR,	/* *gd_TextAttr */
	{ 0, 0, 0 }
   }, {
	TEST1_GADGET3_TYPE,		/* gd_Type */
	TEST1_GADGET3_FLAGS,		/* gd_Flags */
	TEST1_GADGET3_LEFT_EDGE,	/* gd_LeftEdge */
	TEST1_GADGET3_TOP_EDGE,		/* gd_TopEdge */
	TEST1_GADGET3_WIDTH,		/* gd_Width */
	TEST1_GADGET3_HEIGHT,		/* gd_Height */
	TEST1_GADGET3_TEXT,		/* *gd_Text */
	TEST1_GADGET3_TEXT_ATTR,	/* *gd_TextAttr */
	{
	TEST1_GADGET3_SPACING,		/* gd_MXSpacing */
	TEST1_GADGET3_ACTIVE,		/* gd_MXActiveEntry */
	TEST1_GADGET3_TEXT_ARRAY	/* gd_MXTextArray */
	}
   }, {
	INTUISUP_DATA_END		/* mark end of border data array */
   }
};
	/* Defines for auto request */

#define TEST1_AUTO_REQ_TITLE		LANGUAGE_TEXT_AUTO_REQ_TITLE
#define TEST1_AUTO_REQ_BODY_TEXT	LANGUAGE_TEXT_AUTO_REQ_BODY
#define TEST1_AUTO_REQ_POS_TEXT		LANGUAGE_TEXT_AUTO_REQ_POS
#define TEST1_AUTO_REQ_NEG_TEXT		LANGUAGE_TEXT_AUTO_REQ_NEG
#define TEST1_AUTO_REQ_FLAGS		(AUTO_REQ_FLAG_BACK_FILL | AUTO_REQ_FLAG_TEXT_CENTER | AUTO_REQ_FLAG_TEXT_COLOR2 | AUTO_REQ_FLAG_HOTKEY | AUTO_REQ_FLAG_MOVE_POINTER_NEG)

	/* Defines for requester */

#define TEST2_REQ_WIDTH		200
#define TEST2_REQ_HEIGHT	100
#define TEST2_REQ_FLAGS		(REQ_DATA_FLAG_BACK_FILL | REQ_DATA_FLAG_CENTER | REQ_DATA_FLAG_INNER_WINDOW)
#define TEST2_REQ_TITLE		LANGUAGE_TEXT_REQ_TITLE

#define TEST2_TEXT1_TYPE	TEXT_DATA_TYPE_TEXT
#define TEST2_TEXT1_FLAGS	(TEXT_DATA_FLAG_CENTER | TEXT_DATA_FLAG_BOLD)
#define TEST2_TEXT1_LEFT_EDGE	0
#define TEST2_TEXT1_TOP_EDGE	20
#define TEST2_TEXT1_TEXT	LANGUAGE_TEXT_REQ_LINE1
#define TEST2_TEXT1_TEXT_ATTR	&topaz60_attr

#define TEST2_TEXT2_TYPE	TEXT_DATA_TYPE_TEXT
#define TEST2_TEXT2_FLAGS	(TEXT_DATA_FLAG_CENTER | TEXT_DATA_FLAG_ITALIC | TEXT_DATA_FLAG_COLOR2)
#define TEST2_TEXT2_LEFT_EDGE	0
#define TEST2_TEXT2_TOP_EDGE	(TEST2_TEXT1_TOP_EDGE + 10)
#define TEST2_TEXT2_TEXT	LANGUAGE_TEXT_REQ_LINE2
#define TEST2_TEXT2_TEXT_ATTR	&topaz80_attr

#define TEST2_TEXT3_TYPE	TEXT_DATA_TYPE_TEXT
#define TEST2_TEXT3_FLAGS	(TEXT_DATA_FLAG_CENTER | TEXT_DATA_FLAG_UNDERLINED)
#define TEST2_TEXT3_LEFT_EDGE	0
#define TEST2_TEXT3_TOP_EDGE	(TEST2_TEXT2_TOP_EDGE + 10)
#define TEST2_TEXT3_TEXT	LANGUAGE_TEXT_REQ_LINE3
#define TEST2_TEXT3_TEXT_ATTR	&topaz80_attr

#define TEST2_BORDER1_TYPE		BORDER_DATA_TYPE_BOX2_OUT
#define TEST2_BORDER1_LEFT_EDGE		20
#define TEST2_BORDER1_TOP_EDGE		10
#define TEST2_BORDER1_WIDTH		(TEST2_REQ_WIDTH - 2 * TEST2_BORDER1_LEFT_EDGE)
#define TEST2_BORDER1_HEIGHT		(TEST2_REQ_HEIGHT - (3 * TEST2_BORDER1_TOP_EDGE + TEST2_GADGET1_HEIGHT))

#define TEST2_GADGET_CONTINUE		0

#define TEST2_GADGET1_TYPE		GADGET_DATA_TYPE_BUTTON
#define TEST2_GADGET1_FLAGS		(GADGET_DATA_FLAG_HOTKEY | GADGET_DATA_FLAG_MOVE_POINTER)
#define TEST2_GADGET1_LEFT_EDGE		((TEST2_REQ_WIDTH - TEST2_GADGET1_WIDTH) / 2)
#define TEST2_GADGET1_TOP_EDGE		(TEST2_REQ_HEIGHT - (TEST2_GADGET1_HEIGHT + 10))
#define TEST2_GADGET1_WIDTH		((8 + 2) * 10)
#define TEST2_GADGET1_HEIGHT		19
#define TEST2_GADGET1_TEXT		LANGUAGE_TEXT_REQ_GAD_CONTINUE
#define TEST2_GADGET1_TEXT_ATTR		&topaz60_attr

	/* Statics for test borders */

STATIC struct TextData  test2_text_data[] = {
   {
	TEST2_TEXT1_TYPE,	/* td_Type */
	TEST2_TEXT1_FLAGS,	/* td_Flags */
	TEST2_TEXT1_LEFT_EDGE,	/* td_LeftEdge */
	TEST2_TEXT1_TOP_EDGE,	/* td_TopEdge */
	TEST2_TEXT1_TEXT,	/* *td_Text */
	TEST2_TEXT1_TEXT_ATTR	/* *td_TextAttr */
   }, {
	TEST2_TEXT2_TYPE,	/* td_Type */
	TEST2_TEXT2_FLAGS,	/* td_Flags */
	TEST2_TEXT2_LEFT_EDGE,	/* td_LeftEdge */
	TEST2_TEXT2_TOP_EDGE,	/* td_TopEdge */
	TEST2_TEXT2_TEXT,	/* *td_Text */
	TEST2_TEXT2_TEXT_ATTR	/* *td_TextAttr */
   }, {
	TEST2_TEXT3_TYPE,	/* td_Type */
	TEST2_TEXT3_FLAGS,	/* td_Flags */
	TEST2_TEXT3_LEFT_EDGE,	/* td_LeftEdge */
	TEST2_TEXT3_TOP_EDGE,	/* td_TopEdge */
	TEST2_TEXT3_TEXT,	/* *td_Text */
	TEST2_TEXT3_TEXT_ATTR	/* *td_TextAttr */
   }, {
	INTUISUP_DATA_END	/* mark end of border data array */
   }
};
STATIC struct BorderData  test2_border_data[] = {
   {
	TEST2_BORDER1_TYPE,		/* bd_Type */
	TEST2_BORDER1_LEFT_EDGE,	/* bd_LeftEdge */
	TEST2_BORDER1_TOP_EDGE,		/* bd_TopEdge */
	TEST2_BORDER1_WIDTH,		/* bd_Width */
	TEST2_BORDER1_HEIGHT		/* bd_Height */
   }, {
	INTUISUP_DATA_END		/* mark end of border data array */
   }
};
STATIC struct GadgetData  test2_gadget_data[] = {
   {
	TEST2_GADGET1_TYPE,		/* gd_Type */
	TEST2_GADGET1_FLAGS,		/* gd_Flags */
	TEST2_GADGET1_LEFT_EDGE,	/* gd_LeftEdge */
	TEST2_GADGET1_TOP_EDGE,		/* gd_TopEdge */
	TEST2_GADGET1_WIDTH,		/* gd_Width */
	TEST2_GADGET1_HEIGHT,		/* gd_Height */
	TEST2_GADGET1_TEXT,		/* *gd_Text */
	TEST2_GADGET1_TEXT_ATTR,	/* *gd_TextAttr */
	{ 0, 0, 0 }
   }, {
	INTUISUP_DATA_END		/* mark end of border data array */
   }
};
STATIC struct RequesterData  test2_requester_data = {
	0,			/* rd_LeftEdge */
	0,			/* rd_TopEdge */
	TEST2_REQ_WIDTH,	/* rd_Width */
	TEST2_REQ_HEIGHT,	/* rd_Height */
	TEST2_REQ_FLAGS,	/* rd_Flags */
	TEST2_REQ_TITLE,	/* *rd_Title */
	&test2_text_data[0],	/* *rd_Texts */
	&test2_border_data[0],	/* *rd_Borders */
	&test2_gadget_data[0]	/* *rd_Gadgets */
};
STATIC BYTE *english_language_text_array[] = {
	(BYTE *)LANGUAGE_TEXT_ENTRIES,

	/* Texts for main display */
	"_Auto Request",
	"_Requester",
	"_Language",
	"English",
	"Deutsch",

	/* Texts for auto request */
	" Auto Request ",
	"Test line 1\\n\\nTest line 2\\nTest line 3\\n\\nTest line 4",
	"_Positive",
	"_Negative",

	/* Texts for requester */
	" Requester ",
	"Text Line 1",
	"Text Line 2",
	"Text Line 3",
	"_Continue"
};
	/* Prototypes */

VOID test_action(struct RenderInfo  *ri, struct Window  *win);

	/* Pragmas */

#pragma regcall(test_action(a0,a1))

	/* Language test */

   LONG
main(VOID)
{
   struct RenderInfo  *ri;
   struct Window      *win;

   MWInit((BPTR)NULL, 0L);
   if (IntuitionBase = OpenLibrary("intuition.library", 0L)) {
      if (GfxBase = OpenLibrary("graphics.library", 0L)) {
	 if (DiskfontBase = OpenLibrary("diskfont.library", 0L)) {
	    if (LayersBase = OpenLibrary("layers.library", 0L)) {
	       if (ri = get_render_info(NULL, RENDER_INFO_FLAGS)) {
		  if (win = open_window(ri, &test_new_window,
						       OPEN_WINDOW_FLAGS)) {
		     test_action(ri, win);
		     close_window(win, FALSE);
		  }
		  free_render_info(ri);
	       }
	       CloseLibrary(LayersBase);
	    }
	    CloseLibrary(DiskfontBase);
	 }
	 CloseLibrary(GfxBase);
      }
      CloseLibrary(IntuitionBase);
   }
   MWTerm();
   return(0L);
}
	/* Perform IDCMP action */

   VOID
test_action(struct RenderInfo  *ri, struct Window  *win)
{
   USHORT language = LANGUAGE_ENGLISH;
   BOOL   keepon3 = TRUE;

   do {
      struct GadgetList  *gl;
      BYTE   **language_text_array;
      USHORT new_language;

      /* Build language text array */
      switch (language) {
	 case LANGUAGE_ENGLISH :
	    language_text_array = &english_language_text_array[0];
	    break;

	 case LANGUAGE_GERMAN :
	    language_text_array = build_language_text_array(LANGUAGE_TEXT_FILE,
						     LANGUAGE_TEXT_ENTRIES);
	    break;
      }

      /* Create and display gadgets */
      if (!language_text_array || !(gl = create_gadgets(ri,
		       &test1_gadget_data[0], 0, 0, language_text_array))) {
	 keepon3 = FALSE;
      } else {
	 struct MsgPort  *up = win->UserPort;
	 BOOL keepon2 = TRUE;

	 set_gadget_attributes(gl, TEST1_GADGET_LANGUAGE, 0L,
	     USE_CURRENT_VALUE, (ULONG)language, (VOID *)USE_CURRENT_VALUE);
	 clear_window(ri, win, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, 0);
	 display_gadgets(win, gl);
	 do {
	    struct IntuiMessage   *msg1, *msg2;
	    struct RequesterList  *rl;

	    WaitPort(up);
	    while (msg2 = get_msg(up)) {
	       switch (msg2->Class) {
		  case CLOSEWINDOW :
		     keepon3 = FALSE;
		     break;

		  case ISUP_ID :
		     switch (msg2->Code) {
			case TEST1_GADGET_AUTO_REQUEST :
			   auto_request(win, TEST1_AUTO_REQ_TITLE,
						   TEST1_AUTO_REQ_BODY_TEXT,
						    TEST1_AUTO_REQ_POS_TEXT,
					    TEST1_AUTO_REQ_NEG_TEXT, 0L, 0L,
				 TEST1_AUTO_REQ_FLAGS, language_text_array);
			   break;

			case TEST1_GADGET_REQUESTER :
			   if (rl = display_requester(win,
						      &test2_requester_data,
						     language_text_array)) {
			      BOOL keepon1 = TRUE;

			      do {
				 WaitPort(up);
				 while (msg1 = get_msg(up)) {
				    if (msg1->Class == ISUP_ID) {
				       keepon1 = FALSE;
				    }
				    reply_msg(msg1);
				 }
			      } while (keepon1 == TRUE);
			      remove_requester(rl);
			   }
			   break;

			case TEST1_GADGET_LANGUAGE :
			   new_language = (USHORT)(LONG)msg2->IAddress;
			   keepon2      = FALSE;
			   break;
		     }
		     break;
	       }
	       reply_msg(msg2);
	    }
	 } while (keepon2 == TRUE && keepon3 == TRUE);
	 remove_gadgets(gl);
	 free_gadgets(gl);
      }

      /* Free language text array */
      if (language_text_array && language == LANGUAGE_GERMAN) {
	 free_language_text_array(language_text_array);
      }
      language = new_language;
   } while (keepon3 == TRUE);
}
