/*  compiler directives to fetch the necessary header files */
#include <exec/types.h>
#include <exec/exec.h>
#include <intuition/intuition.h>
#include <intuition/intuitionbase.h>
#include <graphics/gfxbase.h>
#include <graphics/gfx.h>
#include <graphics/text.h>
#include <devices/serial.h>
#include <stdio.h>
#include <ctype.h>
#include <libraries/dos.h>

/********************************************/
/* menu's declarations and initializations */
/******************************************/

/* define maximum number of menu items */
#define FILEMAX 4

/*   declare storage space for menu items and
 *   their associated IntuiText structures
 */
struct MenuItem FileItem[FILEMAX];
struct IntuiText FileText[FILEMAX];

/* define maximum number of menu items */
#define RSMAX 13

/*   declare storage space for menu items and
 *   their associated IntuiText structures
 */
struct MenuItem RSItem[RSMAX];
struct IntuiText RSText[RSMAX];

/* define maximum number of menu items */
#define OPTMAX 10

/*   declare storage space for menu items and
 *   their associated IntuiText structures
 */
struct MenuItem OptItem[OPTMAX];
struct IntuiText OptText[OPTMAX];

/* current number of available menu topics */
#define MAXMENU 3

/*   declaration of menu structure array for
 *   number of current topics.  Intuition
 *   will use the address of this array to
 *   set and clear the menus associated with
 *   the window.
 */
struct Menu menu[MAXMENU];

/*****************************************************************/
/*    The following function initializes the structure arrays    */
/*   needed to provide the File menu topic.                      */
/*****************************************************************/
InitFileItems()
{
short n;

/* initialize each menu item and IntuiText with loop */
for( n=0; n<FILEMAX; n++ )
   {
   FileItem[n].NextItem = &FileItem[n] + 1;
   FileItem[n].LeftEdge = 0;
   FileItem[n].TopEdge = 10 * n;
   FileItem[n].Width = 130;
   FileItem[n].Height = 9;
   FileItem[n].Flags = ITEMTEXT | ITEMENABLED | HIGHBOX;
   FileItem[n].MutualExclude = 0;
   FileItem[n].ItemFill = (APTR)&FileText[n];
   FileItem[n].SelectFill = NULL;
   FileItem[n].Command = 0;
   FileItem[n].SubItem = NULL;
   FileItem[n].NextSelect = 0;

   FileText[n].FrontPen = 0;
   FileText[n].BackPen = 1;
   FileText[n].DrawMode = JAM2;     /* render in fore and background */
   FileText[n].LeftEdge = 0;
   FileText[n].TopEdge = 1;
   FileText[n].ITextFont = NULL;
   FileText[n].NextText = NULL;
   }
FileItem[FILEMAX-1].NextItem = NULL;

/* initialize text for specific menu items */
FileText[0].IText = (UBYTE *)"Ascii Capture";
FileText[1].IText = (UBYTE *)"Ascii Send";
FileText[2].IText = (UBYTE *)"Xmodem Receive";
FileText[3].IText = (UBYTE *)"Xmodem Send";

return( 0 );
}

/*****************************************************************/
/*    The following function initializes the structure arrays    */
/*   needed to provide the Opt menu topic.                      */
/*****************************************************************/
InitOptItems()
{
short n;

/* initialize each menu item and IntuiText with loop */
for( n=0; n<OPTMAX; n++ )
   {
   OptItem[n].NextItem = &OptItem[n] + 1;
   OptItem[n].LeftEdge = 0;
   OptItem[n].TopEdge = 10 * n;
   OptItem[n].Width = 160;
   OptItem[n].Height = 9;
   OptItem[n].Flags = ITEMTEXT | ITEMENABLED | HIGHBOX | CHECKIT;
   OptItem[n].MutualExclude = 0;
   OptItem[n].ItemFill = (APTR)&OptText[n];
   OptItem[n].SelectFill = NULL;
   OptItem[n].Command = 0;
   OptItem[n].SubItem = NULL;
   OptItem[n].NextSelect = 0;

   OptText[n].FrontPen = 0;
   OptText[n].BackPen = 1;
   OptText[n].DrawMode = JAM2;     /* render in fore and background */
   OptText[n].LeftEdge = 0;
   OptText[n].TopEdge = 1;
   OptText[n].ITextFont = NULL;
   OptText[n].NextText = NULL;
   }
OptItem[OPTMAX-1].NextItem = NULL;

/* initialize text for specific menu items */
OptText[0].IText = (UBYTE *)"  Edit Macro Keys";
OptText[1].IText = (UBYTE *)"  PhoneBook";
OptText[2].IText = (UBYTE *)"  Convert Text";
OptText[3].IText = (UBYTE *)"  Binary Image";
OptText[4].IText = (UBYTE *)"  Send CR Only";
OptText[5].IText = (UBYTE *)"  Send CR/LF";
OptText[6].IText = (UBYTE *)"  Strip";
OptText[7].IText = (UBYTE *)"  Don't Strip";
OptText[8].IText = (UBYTE *)"  80 Column";
OptText[9].IText = (UBYTE *)"  76 Column";

OptItem[2].MutualExclude = 0x8;
OptItem[3].MutualExclude = 0x4;
OptItem[4].MutualExclude = 0x20;
OptItem[5].MutualExclude = 0x10;
OptItem[6].MutualExclude = 0x80;
OptItem[7].MutualExclude = 0x40;
OptItem[8].MutualExclude = 0x200;
OptItem[9].MutualExclude = 0x100;

OptItem[0].Flags = ITEMTEXT | ITEMENABLED | HIGHBOX;
OptItem[1].Flags = ITEMTEXT | ITEMENABLED | HIGHBOX;
OptItem[2].Flags |= CHECKED;
OptItem[5].Flags |= CHECKED;
OptItem[6].Flags |= CHECKED;
OptItem[8].Flags |= CHECKED;
return( 0 );

}

/*****************************************************************/
/*    The following function initializes the structure arrays    */
/*   needed to provide the BaudRate menu topic.                  */
/*****************************************************************/
InitRSItems()
{
short n;

/* initialize each menu item and IntuiText with loop */
for( n=0; n<RSMAX; n++ )
   {
   RSItem[n].NextItem = &RSItem[n] + 1;
   RSItem[n].LeftEdge = 0;
   RSItem[n].TopEdge = 10 * n;
   RSItem[n].Width = 120;
   RSItem[n].Height = 9;
   RSItem[n].Flags = ITEMTEXT | ITEMENABLED | HIGHBOX | CHECKIT;
   RSItem[n].ItemFill = (APTR)&RSText[n];
   RSItem[n].SelectFill = NULL;
   RSItem[n].Command = 0;
   RSItem[n].NextSelect = 0;
   RSItem[n].SubItem = NULL;

   RSText[n].FrontPen = 0;
   RSText[n].BackPen = 1;
   RSText[n].DrawMode = JAM2;     /* render in fore and background */
   RSText[n].LeftEdge = 0;
   RSText[n].TopEdge = 1;
   RSText[n].ITextFont = NULL;
   RSText[n].NextText = NULL;
   }
RSItem[RSMAX-1].NextItem = NULL;

/* initialize text for specific menu items */
RSText[0].IText = (UBYTE *)"  300 Baud";
RSText[1].IText = (UBYTE *)"  1200 Baud";
RSText[2].IText = (UBYTE *)"  2400 Baud";
RSText[3].IText = (UBYTE *)"  4800 Baud";
RSText[4].IText = (UBYTE *)"  9600 Baud";
RSText[5].IText = (UBYTE *)"  7 Data Bits";
RSText[6].IText = (UBYTE *)"  8 Data Bits";
RSText[7].IText = (UBYTE *)"  Full Duplex";
RSText[8].IText = (UBYTE *)"  Half Duplex";
RSText[9].IText = (UBYTE *)"  Echo";
RSText[10].IText = (UBYTE *)"  Odd";
RSText[11].IText = (UBYTE *)"  Even";
RSText[12].IText = (UBYTE *)"  None";

RSItem[0].MutualExclude = 0x1e;
RSItem[1].MutualExclude = 0x1d;
RSItem[2].MutualExclude = 0x1b;
RSItem[3].MutualExclude = 0x17;
RSItem[4].MutualExclude = 0x0f;
RSItem[5].MutualExclude = 0x40;
RSItem[6].MutualExclude = 0x20;
RSItem[7].MutualExclude = 0x300;
RSItem[8].MutualExclude = 0x280;
RSItem[9].MutualExclude = 0x180;
RSItem[10].MutualExclude = 0x1800;
RSItem[11].MutualExclude = 0x1400;
RSItem[12].MutualExclude = 0x0c00;

RSItem[0].Flags = ITEMTEXT | ITEMENABLED | HIGHBOX | CHECKIT | CHECKED;
RSItem[6].Flags = ITEMTEXT | ITEMENABLED | HIGHBOX | CHECKIT | CHECKED;
RSItem[7].Flags = ITEMTEXT | ITEMENABLED | HIGHBOX | CHECKIT | CHECKED;
RSItem[12].Flags = ITEMTEXT | ITEMENABLED | HIGHBOX | CHECKIT | CHECKED;

return( 0 );
}

/**********************************************************************/
/*  if you need to know what each value means.                        */
/**********************************************************************/
InitMenu()
{
menu[0].NextMenu = &menu[1];
menu[0].LeftEdge = 25;
menu[0].TopEdge = 0;
menu[0].Width = 50;
menu[0].Height = 10;
menu[0].Flags = MENUENABLED;
menu[0].MenuName = "File";           /* text for menu-bar display */
menu[0].FirstItem = &FileItem[0];    /* pointer to first item in list */

menu[1].NextMenu = &menu[2];
menu[1].LeftEdge = 90;
menu[1].TopEdge = 0;
menu[1].Width = 70;
menu[1].Height = 10;
menu[1].Flags = MENUENABLED;
menu[1].MenuName = "RS232";        /* text for menu-bar display */
menu[1].FirstItem = &RSItem[0];    /* pointer to first item in list */

menu[2].NextMenu = NULL;
menu[2].LeftEdge = 170;
menu[2].TopEdge = 0;
menu[2].Width = 85;
menu[2].Height = 10;
menu[2].Flags = MENUENABLED;
menu[2].MenuName = "Options";        /* text for menu-bar display */
menu[2].FirstItem = &OptItem[0];    /* pointer to first item in list */

return( 0 );
}

