/* $Revision Header *** Header built automatically - do not edit! ***********
 *
 *	(C) Copyright 1991 by Torsten Jürgeleit
 *
 *	Name .....: menus_test.c
 *	Created ..: Thursday 19-Dec-91 18:03:07
 *	Revision .: 2
 *
 *	Date        Author                 Comment
 *	=========   ====================   ====================
 *	11-Jul-92   Torsten Jürgeleit      now get pointer to console device
 *	03-Jun-92   Torsten Jürgeleit      alternate color for menu item texts
 *	19-Dec-91   Torsten Jürgeleit      Created this file!
 *
 ****************************************************************************
 *
 *	Test of menu support functions
 *
 * $Revision Header ********************************************************/

	/* Includes */

#include <exec/types.h>
#include <graphics/gfxbase.h>
#include <graphics/text.h>
#include <intuition/intuitionbase.h>
#include <intuition/intuition.h>
#ifdef AZTEC_C
#include <functions.h>   /* needed for Aztec C - prototypes and pragmas for all Amiga system functions */
#endif
#include <libraries/memwatch.h>   /* header file for memory debug link library (Fish 240) - AFTER functions.h */
#include "/render/render.h"
#include "/texts/texts.h"
#include "menus.h"

	/* Defines */

#define WINDOW_WIDTH		600
#define WINDOW_HEIGHT		180
#define WINDOW_IDCMP		(CLOSEWINDOW | MENUPICK)
#define WINDOW_FLAGS		(WINDOWCLOSE | WINDOWDRAG | WINDOWDEPTH | SMART_REFRESH | NOCAREREFRESH | ACTIVATE)
#define WINDOW_TITLE		(UBYTE *)" Menus 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_SCREEN | OPEN_WINDOW_FLAG_RENDER_PENS)

#define MESSAGE1_TEXT		"Select menu item"
#define MESSAGE1_TOP_EDGE	60
#define MESSAGE1_TEXT_ATTR	&topaz60_attr

#define MESSAGE2_TEXT		"Menu no. %d menu item no. %d sub item no. %d selected"
#define MESSAGE2_TOP_EDGE	120
#define MESSAGE2_TEXT_ATTR	&topaz80_attr

	/* Globals */

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

	/* Statics */

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

#define TEST_MENU_TEXT_ATTR	&topaz60_attr

	/* Statics for test menus */

STATIC struct MenuData  test_menu_data[] = {
   {
	MENU_DATA_TYPE_TITLE, 0, "Menu 0", NULL, 0
   }, {
	   MENU_DATA_TYPE_ITEM, MENU_DATA_FLAG_ATTRIBUTE | MENU_DATA_FLAG_SELECTED, "Item 0.0", "0", ~(1L << 0)
   }, {

	   MENU_DATA_TYPE_ITEM, MENU_DATA_FLAG_ATTRIBUTE, "Item 0.1", "1", ~(1L << 1)
   }, {
	   MENU_DATA_TYPE_ITEM, MENU_DATA_FLAG_HIGH_BOX, "Item 0.2", NULL, 0
   }, {
	      MENU_DATA_TYPE_SUBITEM, 0, "Item 0.2.0", "A", 0
   }, {
	      MENU_DATA_TYPE_SUBITEM, 0, "Item 0.2.1", "B", 0
   }, {
	   MENU_DATA_TYPE_ITEM, MENU_DATA_FLAG_TEXT_COLOR2, "Item 0.3", NULL, 0
   }, {
	MENU_DATA_TYPE_TITLE, 0, "Menu 1", NULL, 0
   }, {
	   MENU_DATA_TYPE_ITEM, MENU_DATA_FLAG_HIGH_BOX, "Item 1.0", "C", 0
   }, {
	   MENU_DATA_TYPE_ITEM, MENU_DATA_FLAG_EMPTY_LINE, "Item 1.1", "D", 0
   }, {
	   MENU_DATA_TYPE_ITEM, 0, "Item 1.2", NULL, 0
   }, {
	      MENU_DATA_TYPE_SUBITEM, 0, "Item 1.2.0", "E", 0
   }, {
	      MENU_DATA_TYPE_SUBITEM, 0, "Item 1.2.1", "F", 0
   }, {
	   MENU_DATA_TYPE_ITEM, 0, "Item 1.3", NULL, 0
   }, {
	      MENU_DATA_TYPE_SUBITEM, 0, "Item 1.3.0", "G", 0
   }, {
	      MENU_DATA_TYPE_SUBITEM, MENU_DATA_FLAG_EMPTY_LINE, "Item 1.3.1", "H", 0
   }, {
	   MENU_DATA_TYPE_ITEM, MENU_DATA_FLAG_TEXT_COLOR2, "Item 1.4", "I", 0
   }, {
	INTUISUP_DATA_END		/* mark end of menu data */
   }
};
	/* Prototypes */

VOID test_action(struct RenderInfo  *ri, struct Window  *win,
						      struct MenuList  *ml);
	/* Pragmas */

#pragma regcall(test_action(a0,a1,a2))

	/* Menus test */

   LONG
main(VOID)
{
   struct IOStdReq    io;
   struct RenderInfo  *ri;
   struct Window      *win;
   struct MenuList    *ml;

   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 (!OpenDevice("console.device", -1L,
					     (struct IORequest *)&io, 0L)) {
		  ConsoleDevice = io.io_Device;
		  if (ri = get_render_info(NULL, RENDER_INFO_FLAGS)) {
		     if (win = open_window(ri, &test_new_window,
						       OPEN_WINDOW_FLAGS)) {
			print_text(ri, win, MESSAGE1_TEXT, 0,
				     MESSAGE1_TOP_EDGE, TEXT_DATA_TYPE_TEXT,
				 TEXT_DATA_FLAG_CENTER, MESSAGE2_TEXT_ATTR);
			if (ml = create_menu(ri, win, &test_menu_data[0],
					       TEST_MENU_TEXT_ATTR, NULL)) {
			   attach_menu(win, ml);
			   test_action(ri, win, ml);
			   remove_menu(ml);
			   free_menu(ml);
			}
			close_window(win, FALSE);
		    }
		    free_render_info(ri);
		  }
		  CloseDevice((struct IORequest *)&io);
	       }
	       CloseLibrary(LayersBase);
	    }
	    CloseLibrary(DiskfontBase);
	 }
	 CloseLibrary(GfxBase);
      }
      CloseLibrary(IntuitionBase);
   }
   MWTerm();
   return(0L);
}
	/* Perform IDCMP action */

   VOID
test_action(struct RenderInfo  *ri, struct Window  *win, struct MenuList  *ml)
{
   struct MsgPort  *up = win->UserPort;
   BOOL keepon = TRUE;

   do {
      struct IntuiMessage  *msg;

      WaitPort(up);
      while (msg = (struct IntuiMessage *)GetMsg(up)) {
	 ULONG  class = msg->Class;
	 USHORT code  = msg->Code;

	 ReplyMsg((struct Message *)msg);
	 switch (class) {
	    case CLOSEWINDOW :
	       keepon = FALSE;
	       break;

	    case MENUPICK :
	       while (code != MENUNULL) {
		  BYTE buffer[80];

		  sprintf(&buffer[0], MESSAGE2_TEXT,
			      (MENUNUM(code) != NOMENU ? MENUNUM(code) : 0),
			      (ITEMNUM(code) != NOITEM ? ITEMNUM(code) : 0),
				(SUBNUM(code) != NOSUB ? SUBNUM(code) : 0));
		  clear_window(ri, win, 0, MESSAGE2_TOP_EDGE, WINDOW_WIDTH,
								     10, 0);
		  print_text(ri, win, &buffer[0], 0, MESSAGE2_TOP_EDGE,
				TEXT_DATA_TYPE_TEXT, TEXT_DATA_FLAG_CENTER |
				 TEXT_DATA_FLAG_COLOR2, MESSAGE2_TEXT_ATTR);
		  code = menu_item_address(ml, code)->NextSelect;
	       }
	       break;
	 }
      }
   } while (keepon == TRUE);
}
