/*
 * Example program for using quick menu package.  Contains the necessary
 * declarations for a simple menu strip which it creates and destroys after
 * letting the user play with it.
 */
#include <intuition/intuition.h>
#include "qmenu.h"


#define NILSUB	{NULL,NULL}

/*
 * String arrays get defined in sort-of reverse order.
 * I.e. the subitems get defined before the parent items.
 * (One rule is that menu items that cause a Requester to
 * appear are followed by "...".)
 * The string arrays themselves are terminated by a null 
 * string pointer.
 */
char *mpo_str[] = {
	"!=ORaw Text...",
	"Processed Text...",
	"Drawing...",
	"Picture...",
	"Old Settings...",
	NULL };

char *mps_str[] = {
	"!=TText...",
	"!=DDrawing...",
	"Picture...",
	NULL };

char *mp_str[] = {
	"!=NNew...",
	"Open",
	"!=SSave...",
	"Save as",
	"Print...",
	"Save Settings",
	"About...",
	"-",
	"!bQuit...",
	NULL };

/* Array of NewMenu structs to go with the above text items.
 * Needs to be a one-to-one correspondence between text items
 * (not rules) and NewMenu structs.
 */
struct NewMenu mp_sub[] = {
	NILSUB,
	{ mpo_str, NULL },
	NILSUB,
	{ mps_str, NULL },
	NILSUB,
	NILSUB,
	NILSUB,
	NILSUB
};

char *mes_str[] = {
	"!+!0111!=PPlain",
	"!c!1!=BBold",
	"!c!1!=IItalic",
	"!c!1!=UUnderline",
	NULL };

char *me_str[] = {
	"!=QUndo",
	"-",
	"!=ZDelete",
	"!=XCut",
	"!=CCopy",
	"!=VPaste",
	"-",
	"Set Font...",
	"Set Style",
	NULL };

struct NewMenu me_sub[] = {
	NILSUB,
	NILSUB,
	NILSUB,
	NILSUB,
	NILSUB,
	NILSUB,
	{ mes_str, NULL }
};

char *mdz_str[] = {
	"!=>In",
	"!=<Out",
	"!=MManual",
	NULL };

char *mdv_str[] = {
	"!+!tText",
	"!+!tLines",
	"!+!tImages",
	"!+!tBoxes",
	"!+!tLabels",
	NULL };

char *mds_str[] = {
	"Interlace",
	"Non-interlace",
	"Workbench",
	NULL };

char *md_str[] = { 
	"Zoom",
	"!=AAuto Scale",
	"-",
	"!c!tCoordinates",
	"Visible",
	"-",
	"Screen Colors...",
	"Screen Type",
	NULL };

struct NewMenu md_sub[] = {
	{ mdz_str, NULL },
	NILSUB,
	NILSUB,
	{ mdv_str, NULL },
	NILSUB,
	{ mds_str, NULL }
};

char *mhc_str[] = {
	"Plot...",
	"Set...",
	"Lay in...",
	NULL };

char *mhw_str[] = {
	"!+!0111111Full Impulse",
	"!c!1011111!=1Warp 1",
	"!c!1101111!=2Warp 2",
	"!c!1110111!=3Warp 3",
	"!c!1111011!=4Warp 4",
	"!c!1111101!=5Warp 5",
	"!c!1111110Space Normal",
	NULL };

char *mhp_str[] = {
	"Stun",
	"Kill",
	"Maim",
	"Burn",
	"Overload",
	"Ineffective",
	"Burn Out",
	NULL };

char *mh_str[] = {
	"New Course",
	"Speed",
	"Standard Orbit",
	"Tractor Beam...",
	"Lock Phasers",
	"-",
	"\"Make It So.\"",
	NULL };

struct NewMenu mh_sub[] = {
	{ mhc_str, NULL },
	{ mhw_str, NULL },
	NILSUB,
	NILSUB,
	{ mhp_str, NULL },
	NILSUB
};

char *mt_str[] = {
	"Hammer",
	"Screwdriver",
	"Chisel",
	"Knife",
	"Felt Pen",
	"Air Freshener",
	"-",
	"Hammer Size...",
	"Screw Type...",
	"Pine Scent...",
	NULL };

char *mm_str[] = {
	"Rotate...",
	"Spin...",
	"Turn Around...",
	"Flip Out...",
	"Randomize...",
	"Energize...",
	"Simplify",
	"Complexify",
	NULL };

char *main_str[] = {
	"Project",
	"Edit",
	"Display",
	"Tools",
	"Helm",
	"Modify",
	NULL };

struct NewMenu main_sub[] = {
	{ mp_str, mp_sub },
	{ me_str, me_sub },
	{ md_str, md_sub },
	{ mt_str, NULL },
	{ mh_str, mh_sub },
	{ mm_str, NULL }
};

struct NewMenu main_menu = { main_str, main_sub };

struct TextAttr ta = { (UBYTE*) "topaz.font", 8,0,0 };


/* Basic stuff for the test program.
 */
struct NewWindow nwin = {
	50,20, 200,100, -1,-1, CLOSEWINDOW,
	WINDOWCLOSE|WINDOWDRAG|ACTIVATE,
	NULL,NULL, (UBYTE*) "Test the Menus", NULL,NULL,
	0,0,0,0, WBENCHSCREEN
};

#define OLIB(var,nam)	(var=OpenLibrary(nam,33L))

struct IntuitionBase *IntuitionBase;
struct Window *mywin;


struct Window *OpenWindow();
void *OpenLibrary();
void *GetMsg();


main ()
{
	if (OLIB(IntuitionBase,"intuition.library")) {
		if (mywin = OpenWindow (&nwin)) {
			Body ();
			CloseWindow (mywin);
		}
		CloseLibrary (IntuitionBase);
	}
}


Body ()
{
	struct IntuiMessage *im;
	struct Menu *m;

	if (!(m = GenMenu (&main_menu))) return;

	SetMenuStrip (mywin, m);

	/* Wait for the close window message.
	 */
	while (!(im = (struct IntuiMessage *) GetMsg (mywin->UserPort)))
		WaitPort (mywin->UserPort);
	ReplyMsg (im);

	ReadMenuState (m);
	ClearMenuStrip (mywin);
	FreeMenu (m);
}


ReadMenuState (m)
	struct Menu *m;
{
	struct MenuItem	*mi;

	/* Get the text style menu array and test for checkmarks.
	 */
	mi = m[1].FirstItem[8].SubItem;
	printf ("Text Style: ");
	if (mi[0].Flags & CHECKED) printf ("Plain");
	if (mi[1].Flags & CHECKED) printf ("Bold ");
	if (mi[2].Flags & CHECKED) printf ("Italic ");
	if (mi[3].Flags & CHECKED) printf ("Underline");
	printf ("\n");
}
