/* ->c.mym */

#include <stdlib.h>
#include <stdio.h>
#include <stdarg.h>
#include <string.h>
#include <signal.h>
#include <ctype.h>
#include <time.h>

#include "h.os"
#include "h.wimp"
#include "h.akbd"

#include "h.wos"
#include "h.timex"
#include "h.main"
#include "h.ram"
#include "h.serial"
#include "h.serialdev"
#include "h.term"
#include "h.ftp"
#include "h.file"
#include "h.vax"
#include "h.dir"
#include "h.key"
#include "h.pr"
#include "h.batch"

#include "h.record"

#include "h.tek"

#include "h.vxdef"
#include "h.vxbuff"
#include "h.vxmenu"
#include "h.vxwimp"
#include "h.view"
#include "h.vtmenu"

#include "h.vtdef"
#include "h.vtwimp"

#include "h.script"

#include "h.xmodem"


#include "h.mym"



/*****************************************************************************/

int menublock[0xD41];    /* char 0x3504 */


int * menus[50];
int * lastmenu;
int * slastmenu;

int   repopf;
int   menusense;


static int  oldmx,oldmy;
static int  * oldmenu;



void load_menus()
{
 int  * base;   
 FILE * fp;
 int    load;
 int    numenus;
 int    menuc;
 int    flags;
 int    subs;
 int    iflag;
 int    idat1;
 char   string[256];


 base=(int *)menublock;

 sprintf(string,"%s.Menu",path(RESP));

 fp=fopen(string,"rb");

 fread(&load,sizeof(int),1,fp);

 numenus=getc(fp);

 for(menuc=0;menuc<numenus;menuc++)
 {
  menus[menuc]=base;
  fread(base,sizeof(int),7,fp);
  base+=7;

  do
  {
   fread(base,sizeof(int),1,fp);
   flags=*base;
   base++;

   fread(&subs,sizeof(int),1,fp);
   if(subs>0) subs=subs-load+(int)menublock;
   *base=subs;
   base++;

   fread(base,sizeof(int),1,fp);
   iflag=*base;
   base++;

   fread(&idat1,sizeof(int),1,fp);
   if(iflag & 0x100) idat1=idat1-load+(int)menublock;
   *base=idat1;
   base++;

   fread(base,sizeof(int),2,fp);
   base+=2;

  } while((flags & 0x80)==0);
 }

 fread(base,1,sizeof(menublock)-(base-menublock)*sizeof(int),fp);

 fclose(fp);
 slastmenu=lastmenu=NULL;
}                   


void mwpoint(menuhandle,item,pointer) int * menuhandle; int item,pointer;
{
 *(menuhandle+(7+1+6*item))=pointer;
}


/* return a pointer to a menu's sub menu */

int * pointm(int * menuhandle,int item)
{
 return((int *)(*(menuhandle+(7+1+6*item))));
}



void shade(menuhandle,item)  int * menuhandle; int item;
{
 *(menuhandle+(7+2+6*item))=*(menuhandle+(7+2+6*item)) | 0x400000;
}




void dynamic(menuhandle,item)  int * menuhandle; int item;
{
 *(menuhandle+(7+6*item))=*(menuhandle+(7+6*item)) | 0x8;
}


void unshade(menuhandle,item)  int * menuhandle; int item;
{
  shade(menuhandle,item);
 *(menuhandle+(7+2+6*item))=*(menuhandle+(7+2+6*item)) ^ 0x400000;
}



void tick(menuhandle,item)  int * menuhandle; int item;
{
 *(menuhandle+(7+6*item))=*(menuhandle+(7+6*item)) | 0x1;
}

void untick(menuhandle,item)  int * menuhandle; int item;
{
  tick(menuhandle,item);
 *(menuhandle+(7+6*item))=*(menuhandle+(7+6*item)) ^ 0x1;
}

void tickst(int * menuhandle,int item,int state)
{
 if(state) tick(menuhandle,item);
 else      untick(menuhandle,item);
}

void untickmenu(int * menuhandle)
{
 int item=0;

 while(menuhandle)
 {
  *(menuhandle+(7+6*item))&=0xFFFFFFFE;
  if((*(menuhandle+(7+6*item))) & 0x80) break;
  item++;
 }
}




/*

void undynamic(menuhandle,item)  int * menuhandle; int item;
{
  dynamic(menuhandle,item);
 *(menuhandle+(7+6*item))=*(menuhandle+(7+6*item)) ^ 0x8;
}

 */


void unshadest(int * menuhandle,int item,int state)
{
 if(state) unshade(menuhandle,item);
 else      shade(menuhandle,item);
}




char * menuaddr(menuhandle,item) int * menuhandle; int item;
{ int * i;
  i=(menuhandle+(7+6*item));
  if( (* (i+2)) & 0x100) return((char *)(*(i+3)));
  else                   return((char *)(i+3));
}


void writemenu(int * menuhandle,int item,char * string)
{
 int  * i;
 char * p;
 int    j;

 i=(menuhandle+(7+6*item));
 if( (* (i+2)) & 0x100) p=(char *)(*(i+3));
 else                   p=(char *)(i+3);

 for(j=0;j<12;j++)
 {
  if(*string) *p++=*string++;
  else        *p++=32;
 }
}



void writemenuf(int * menuhandle,int item,char * format, ...)
{
 va_list args;
 va_start(args, format);
 vsprintf(menuaddr(menuhandle,item), format, args);
 va_end(args);
}



/* attempt to read an integer from a menu entry */
/* return 1 on success                          */

int getmenuint(int * menuhandle,int item,int * val)
{
 int code;
 code=sscanf(menuaddr(menuhandle,item),"%d",val);
 return(code==1);
}



/*

int * menuicon(int * menuhandle,int item)
{
  return(menuhandle+(7+6*item+2));
}

*/

int islastm(int * menuhandle,int item)
{
 return((*(menuhandle+(7+6*item))) & 0x80);
}



void menumakelastst(int * menuhandle,int item,int state)
{
 if(state) *(menuhandle+(7+6*item))|=0x80;
 else      *(menuhandle+(7+6*item))&=0x7F;
}



void unshademenust(int * menuhandle,int item,int state)
{
 menuhandle=pointm(menuhandle,item);
 if(menuhandle)
 {
  item=0;
  while(1)
  {
   unshadest(menuhandle,item,state);
   if(islastm(menuhandle,item)) break;
   item++;
  }
 }
}






void popup_menu(menuhandle,x,y) int * menuhandle; int x,y;
{
 os_error * ep;

 ep=wimp_create_menu((wimp_menustr *)menuhandle,x,y);
 if(ep)
 {
  report(ep);
  return;
 }

 oldmenu=menuhandle;
 oldmx=x;
 oldmy=y;

 slastmenu=lastmenu=menuhandle;
}


void popmenu(menuhandle) int * menuhandle; 
{
 wimp_mousestr mstr;
 wimp_get_point_info(&mstr);
 if(menuhandle==info_menu && mstr.y<200) mstr.y=280;
 popup_menu(menuhandle,mstr.x-80,mstr.y+80);
}


void repopmenu(void)
{
 popup_menu(oldmenu,oldmx,oldmy);
}

int repop(void)
{
 wimp_mousestr mstr;
 wimp_get_point_info(&mstr);
 return(mstr.bbits & 0x1);
}

void zapmenu(void)
{
 wimp_create_menu((wimp_menustr *)-1,0,0);
}




/************************************************************************/

void markstring(char * result)
{
 strcpy(result,"2.24 (31-Oct-12)");
}


void setpopinfo(void)
{

}



void decodeinfo(int m1,int m2,int m3,int m4,int m5)
{    

 switch(m1)
 {
  case 1:
         decodedial(m2);
         break;

#ifndef VICK
  case 2:                      /* select terminal */
         decodeterm(m2);
         break;
#endif


#ifndef VICK
  case 3:                      /* choices */
         openchoices();
         break;
#endif

  case 4:                      /* minimise memory */
         minimisememory();
         break;

#ifndef VICK
  case 5:
         terminatec();
         break;
#endif
 }

 setpopinfo();

 m3=m4=m5;
}



void popinfo(void)
{
 char string[64];
 int  handle;

 handle=createwindow(INFO);
 if(!handle) return;

 markstring(string);
 writeicon(handle,3,string);
 mwpoint(info_menu,0,handle);

 setpopinfo();

 popmenu(info_menu);
}


void decodeiconbar(void)
{
 if(buttons==2) popinfo();
 else
 if(buttons==4) iconterm();
 else
 if(buttons==1) toggleactive();
}




/*****************************************************************************/



void setpopmain(void)
{
 setpopvtterm();
 setpopftp();
 setpopmisc();
}




void popmain(void)
{
 if(isctrl!=menusense && usermacros())
 {
  popmenu((int*)setusermacros());
 }
 else
 {
  setpopmain();
  popmenu(main_menu);
 }
}




void decodemain(int m1,int m2,int m3,int m4,int m5)
{
 switch(m1)
 {
  case 0:
  case 1:
  case 2:
  case 3:
         decodevtterm(m1,m2,m3,m4,m5);
         break;

  case 4:
         decodesettings(m2,m3,m4,m5);
         break;

  case 5:                                    /* comms */
         decodecomms(m2,m3,m4,m5);
         break;

  case 6:
         decodeftp(m2,m3,m4,m5);
         break;

  case 7:
         decodemisc(m2,m3);
         break;

 }

 setpopmain();
}






/***************************************************************************/



void setpopvxmain(void)
{
 setpopvxterm();
 setpopftp();
 setpopmisc();
}



void popvxmain(void)
{
 if(isctrl!=menusense && usermacros())
 {
  popmenu((int*)setusermacros());
 }
 else
 {
  setpopvxmain();
  popmenu(vxmain_menu);
 }
}



void decodevxmain(int m1,int m2,int m3,int m4,int m5)
{
 switch(m1)
 {
  case 0:
  case 1:
  case 2:
  case 3:
         decodevxterm(m1,m2,m3,m4);
         break;

  case 4:
         decodesettings(m2,m3,m4,m5);
         break;

  case 5:                                /* communications */
         decodecomms(m2,m3,m4,m5);
         break;

  case 6:
         decodeftp(m2,m3,m4,m5);
         break;

  case 7:
         decodemisc(m2,m3);
         break;

 }

 setpopvxmain();
}



/*****************************************************************************/



void setpoptekmain(void)
{
 shade(tekmain_menu,1);
 setpoptekterm();
 setpopftp();
 setpopmisc();
}



void poptekmain(void)
{
 if(isctrl!=menusense && usermacros())
 {
  popmenu((int*)setusermacros());
 }
 else
 {
  setpoptekmain();
  popmenu(tekmain_menu);
 }
}



void decodetekmain(int m1,int m2,int m3,int m4,int m5)
{
 switch(m1)
 {
  case 0:
  case 1:
  case 2:
  case 3:
         decodetekterm(m1,m2,m3,m4);
         break;

  case 4:
         decodesettings(m2,m3,m4,m5);
         break;

  case 5:                                     /* communications */
         decodecomms(m2,m3,m4,m5);
         break;

  case 6:
         decodeftp(m2,m3,m4,m5);
         break;

 case  7:
         decodemisc(m2,m3);
         break;

 }

 setpoptekmain();
}



/***************************************************************************/

void setupmenus(void)
{
 load_menus();

 dynamic(vtfile_menu,0);
 dynamic(vtfile_menu,1);
 dynamic(vtfile_menu,2);

 dynamic(vtselec_menu,0);

 dynamic(vtsetup_menu,0);
 dynamic(vtsetup_menu,1);
 dynamic(vtsetup_menu,2);
 dynamic(vtsetup_menu,3);
 dynamic(vtsetup_menu,4);
 dynamic(vtsetup_menu,5);



 dynamic(vxmain_menu,2);

 dynamic(vxfile_menu,1);
 dynamic(vxfile_menu,2);
 dynamic(vxfile_menu,3);
 dynamic(vxfile_menu,4);


 dynamic(vxsetup_menu,0);
 dynamic(vxsetup_menu,1);
 dynamic(vxsetup_menu,2);
 dynamic(vxsetup_menu,3);
 dynamic(vxsetup_menu,4);


 dynamic(tekfile_menu,0);
 dynamic(tekfile_menu,1);

 dynamic(tekprint_menu,0);




 dynamic(vxbuff_menu,1);
 dynamic(vxbuff_menu,2);

 dynamic(vxbmain_menu,3);
 dynamic(vxbmain_menu,4);
 dynamic(vxbmain_menu,7);

 dynamic(action_menu,0);
 dynamic(action_menu,5);

 dynamic(comms_menu,0);
 dynamic(comms_menu,1);

 dynamic(line_menu,0);
 dynamic(line_menu,2);


 dynamic(info_menu,1);
 dynamic(info_menu,2);

 dynamic(misc_menu,0);
 dynamic(misc_menu,2);
 dynamic(misc_menu,6);

 dynamic(macros_menu,6);

 dynamic(kermit_menu,9);

 dynamic(ftp_menu,0);
 dynamic(ftp_menu,1);
 dynamic(ftp_menu,2);
 dynamic(ftp_menu,3);
 dynamic(ftp_menu,6);
 dynamic(ftp_menu,7);
 dynamic(ftp_menu,10);
}



void decodemen(void)
{
 int menu1,menu2,menu3,menu4,menu5;
 int * lastmenuc;

 menu1=wimpevent.data.menu[0];
 menu2=wimpevent.data.menu[1];
 menu3=wimpevent.data.menu[2];
 menu4=wimpevent.data.menu[3];
 menu5=wimpevent.data.menu[4];

 if(menu1==-1) return;
 lastmenuc=lastmenu;
 slastmenu=lastmenu=NULL;
 repopf=repop();

      if(lastmenuc==main_menu)   decodemain(menu1,menu2,menu3,menu4,menu5);    
 else if(lastmenuc==vxmain_menu) decodevxmain(menu1,menu2,menu3,menu4,menu5);
 else if(lastmenuc==info_menu)   decodeinfo(menu1,menu2,menu3,menu4,menu5);    
 else if(lastmenuc==view_menu)    decodeview(menu1,menu2,menu3);
 else if(lastmenuc==vxbmain_menu) decodevxbmain(menu1,menu2,menu3);
 else if(lastmenuc==tekmain_menu) decodetekmain(menu1,menu2,menu3,menu4,menu5);
 else if(lastmenuc==tdir_menu)       decodedir(menu1,menu2,menu3,menu4);
 else if(lastmenuc==entry_menu)      decodeentry(menu1,menu2,menu3,menu4);
 else if(lastmenuc==macros_menu)     macrosdecode(menu1,menu2,menu3,menu4);
 else if(lastmenuc==((int*)myrambuff)) decoderammenu(menu1);
 else if(lastmenuc==term_menu)         decodedefterm(menu1);
 else if(lastmenuc==printer_menu)      decodeprinter(menu1);
 else if(lastmenuc==flow_menu)         decodeflow(menu1);
 else if(lastmenuc==datab_menu)        decodedata(menu1);
 else if(lastmenuc==parity_menu)       decodeparity(menu1);
 else if(lastmenuc==stopb_menu)        decodestop(menu1);
 else if(lastmenuc==txrate_menu)       decodetxrate(menu1);
 else if(lastmenuc==rxrate_menu)       decoderxrate(menu1);

 if(repopf) repopmenu();
}


/* called on dynamic menu event */

void dynamicmenu(int submenu,int x,int y,int m1,int m2,int m3,int m4)
{
 os_error * ep;

 if(lastmenu==main_menu)
 {
  if(m1==0)   /* File */
  {
   if(m2==0) submenu=setsave(SAVEVTBUFF);
   else
   if(m2==1) submenu=setsave(SAVEVTSCREEN);
   else
   if(m2==2) submenu=setsave(SAVEVTSPOOL);
  }
  else
  if(m1==1)   /* Select */
  {
   if(m2==0) submenu=setsave(SAVEVTSELECT);
  }
  else
  if(m1==3)   /* Terminal Setup */
  {
   if(m2==0) submenu=setupvtlinemode();
   else
   if(m2==1) submenu=setupvtdisplay();
   else
   if(m2==2) submenu=setupvtkey();
   else
   if(m2==3) submenu=setupmiscvt();
   else
   if(m2==4) submenu=vtsetwindow();
   else
   if(m2==5) submenu=dynamzoom(vtdozoom,&vtzoom,vtvarzoom);
  }
  else
  if(m1==4)  /* line settings */
  {
   if(m2==0) submenu=dynamsettings();
   else
   if(m2==2) submenu=setuplinklevel();
  }
  else
  if(m1==5)  /* Comms */
  {
   if(m2==0) submenu=setupentrymenu();
   else
   if(m2==1) submenu=setupdialoptions();
  }
  else
  if(m1==6)  /* FTP */
  {
   if(m2==0) submenu=xmodemsetup();
   else
   if(m2==1) submenu=xmodem1ksetup();
   else
   if(m2==2) submenu=ymodemsetup();
   else
   if(m2==3) submenu=zmodemsetup();
   else
   if(m2==4  && m3==9) submenu=kermitsetup();
   else
   if(m2==6) submenu=asciisetup();
   else
   if(m2==7) submenu=cetsetup();
   else
   if(m2==10) submenu=setupbatconfig();
  }
  else
  if(m1==7) /* Script */
  {
   if(m2==0) submenu=setsave(SAVECONFIG);
   else
   if(m2==2) submenu=setsave(SAVERECORD);
   else
   if(m2==6) submenu=setusermacros();
  }
 }
 else
 if(lastmenu==vxmain_menu)
 {
  if(m1==0)   /* File */
  {
   if(m2==0 && m3==1) submenu=setsave(SAVEVXBUFFFRAME);
   else
   if(m2==0 && m3==2) submenu=setsave(SAVEVXBUFFTEXT);
   else
   if(m2==1) submenu=setsave(SAVEVXCFRAME);
   else
   if(m2==2) submenu=setsave(SAVEVXCSPRITE);
   else
   if(m2==3) submenu=setsave(SAVEVXCTEXT);
   else
   if(m2==4) submenu=setsave(SAVEVXSPOOL);
  }
  else
  if(m1==1)   /* Select */
  {
  }
  else
  if(m1==2)   /* Print */
  {
   submenu=vxprintsetup();
  }
  else
  if(m1==3)   /* Terminal Setup */
  {
   if(m2==0) submenu=setupvxlinemode();
   else
   if(m2==1) submenu=setupvxdisplay();
   else
   if(m2==2) submenu=setupvxkey();
   else
   if(m2==3) submenu=setupmiscvx();
   else
   if(m2==4) submenu=dynamzoom(vxdozoom,&vscr->zoom,vxmainvarzoom);
  }
  else
  if(m1==4)  /* line settings */
  {
   if(m2==0) submenu=dynamsettings();
   else
   if(m2==2) submenu=setuplinklevel();
  }
  else
  if(m1==5)  /* Comms */
  {
   if(m2==0) submenu=setupentrymenu();
   else
   if(m2==1) submenu=setupdialoptions();
  }
  else
  if(m1==6)  /* FTP */
  {
   if(m2==0) submenu=xmodemsetup();
   else
   if(m2==1) submenu=xmodem1ksetup();
   else
   if(m2==2) submenu=ymodemsetup();
   else
   if(m2==3) submenu=zmodemsetup();
   else
   if(m2==4  && m3==9) submenu=kermitsetup();
   else
   if(m2==6) submenu=asciisetup();
   else
   if(m2==7) submenu=cetsetup();
   else
   if(m2==10) submenu=setupbatconfig();
  }
  else
  if(m1==7) /* Script */
  {
   if(m2==0) submenu=setsave(SAVECONFIG);
   else
   if(m2==2) submenu=setsave(SAVERECORD);
   else
   if(m2==6) submenu=setusermacros();
  }
 }
 else
 if(lastmenu==tekmain_menu)
 {
  if(m1==0)   /* File */
  {
   if(m2==0) submenu=setsave(SAVETEKSCREEN);
   else
   if(m2==1) submenu=setsave(SAVETEKSPOOL);
  }
  else
  if(m1==1)   /* Select */
  {

  }
  else
  if(m1==2)   /* Print */
  {
   if(m2==0) submenu=tekprintsetup();
  }
  else
  if(m1==3)   /* Terminal Setup */
  {
   if(m2==0) submenu=setupvtlinemode();
   else
   if(m2==1) submenu=setuptekdisplay();
   else
   if(m2==2) submenu=setupvtkey();
   else
   if(m2==3) submenu=setupmisctek();
   else
   if(m2==4) submenu=vtsetwindow();
   else
   if(m2==5) submenu=dynamzoom(tekdozoom,&tekzoom,tekvarzoom);
  }
  else
  if(m1==4)  /* line settings */
  {
   if(m2==0) submenu=dynamsettings();
   else
   if(m2==2) submenu=setuplinklevel();
  }
  else
  if(m1==5)  /* Comms */
  {
   if(m2==0) submenu=setupentrymenu();
   else
   if(m2==1) submenu=setupdialoptions();
  }
  else
  if(m1==6)  /* FTP */
  {
   if(m2==0) submenu=xmodemsetup();
   else
   if(m2==1) submenu=xmodem1ksetup();
   else
   if(m2==2) submenu=ymodemsetup();
   else
   if(m2==3) submenu=zmodemsetup();
   else
   if(m2==4  && m3==9) submenu=kermitsetup();
   else
   if(m2==6) submenu=asciisetup();
   else
   if(m2==7) submenu=cetsetup();
   else
   if(m2==10) submenu=setupbatconfig();
  }
  else
  if(m1==7) /* Script */
  {
   if(m2==0) submenu=setsave(SAVECONFIG);
   else
   if(m2==2) submenu=setsave(SAVERECORD);
   else
   if(m2==6) submenu=setusermacros();
  }
 }
 else
 if(lastmenu==vxbmain_menu)
 {
  if(m1==3) submenu=setsave(SAVEVXBUFFMFRAME);
  else
  if(m1==4) submenu=setsave(SAVEVXBUFFMTEXT);
  else
  if(m1==7) submenu=dynamzoom(vxbdozoom,&vxbuff[vxbmenu].vsc->zoom,vxbvarzoom);
 }
 else
 if(lastmenu==view_menu)
 {
  if(m1==1 && m2==0) submenu=dynamview();
  else
  if(m1==1 && m2==5) submenu=dynamviewnames();
 }
 else
 if(lastmenu==info_menu)
 {
  if(m1==1 && m2==-1) submenu=setupentrymenu();
  else
  if(m1==2 && m2==-1) setpopterm();
 }
 else
 if(lastmenu==macros_menu)
 {
  if(m1==6) submenu=setsave(SAVEMACROS);
 }

 ep=wimp_create_submenu((wimp_menustr *)submenu,x,y);
 if(ep) report(ep);

 m3=m4=0;
}

