/* ->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.Drawlevel0"


#include "h.wos"
#include "h.timex"
#include "h.main"
#include "h.ram"
#include "h.serial"
#include "h.strdef"
#include "h.file"
#include "h.dir"
#include "h.key"
#include "h.pr"
#include "h.view"
#include "h.script"
#include "h.state"
#include "h.group"
#include "h.sched"
#include "h.batch"
#include "h.config"
#include "h.pic"
#include "h.vx"
#include "h.con"
#include "h.tw"
#include "h.replay"
#include "h.dbug"
#include "h.band"
#include "h.log"

#include "h.mym"




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

static int menublock[0x3C1];    /* char 0xF01 */


int * menus[MSIZE];
       int * lastmenu;
static int * slastmenu;

int   repopf;
int   menusense;


static int  oldmx,oldmy;
static int  * oldmenu;



static void load_menus()
{
 int  * base;   
 FILE * fp;
 int    load;
 int    numenus;
 int    menuc;
 int    flags;
 int    subs;
 int    iflag;
 int    idat1;


 base=(int *)menublock;

 fp=fopen("<ArcFaxRes$Dir>.Menu","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(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));
}



/* 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);
}


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);
}




/*

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;
}

/*

static 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++;
  }
 }
}

*/


static 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=448;
 popup_menu(menuhandle,mstr.x-40,mstr.y/* +80 */);
}


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

static 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);
}


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

static void markstring(char * result)
{
 strcpy(result,"1.21 (09-Jan-2003)");
}



static void setpopinfo(void)
{
 unshadest(scan_menu,0,TW_GreySelect());
 unshadest(scan_menu,1,TW_GreyAcquire());

 unshadest(info_menu,5,modemtype & AVOICE);
/* unshadest(info_menu,6,modemtype & ASTANDALONE); */
}



static void decodescan(int m1)
{
 os_error * err;

 err=NULL;

 switch(m1)
 {
  case 0:
         err=twainselect();
         break;

  case 1:
         err=twainacquire();
         break;
 }

 report(err);
}



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

  case 1: /* scan */
         decodescan(m2);
         break;

  case 2:
         dirshow();
         break;

  case 3:
         opentxbatch();
         break;

  case 4:
         openrxbatch();
         break;

  case 5: /* voice */
         replay(NULL,0,0);
         break;

/*  case 6:
         openstandalone();
         break; */

  case 6:
         openconfig();
         break;

  case 7:
         terminatec();
         break;
 }

 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==1) 
 {
  if(isshift) openconfig();
  else        stateclick();
 }
 else
 if(buttons==4)
 {
  if(isshift) dbopen();
  else        conopen();
 }
}



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

void setupmenus(void)
{
 load_menus();

 dynamic(action_menu,0);
 dynamic(action_menu,7);

 dynamic(vxbmain_menu,0);
 dynamic(vxbmain_menu,2);
 dynamic(vxbmain_menu,3);
 dynamic(vxbmain_menu,4);

 dynamic(schedule_menu,0);
 dynamic(schedsel_menu,3);

 dynamic(group_menu,0);

 dynamic(tdir_menu,10);

 dynamic(dbug_menu,0);
 dynamic(dbug_menu,1);

 dynamic(schedbit_menu,6);
}


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==info_menu)      decodeinfo(menu1,menu2,menu3,menu4,menu5);
 else if(lastmenuc==tdir_menu)      decodedir(menu1,menu2,menu3,menu4);
 else if(lastmenuc==view_menu)      decodeview(menu1,menu2,menu3,menu4,menu5);
 else if(lastmenuc==vxbmain_menu)   decodevxbmain(menu1,menu2,menu3);
 else if(lastmenuc==schedule_menu)  decodesched(menu1,menu2,menu3,menu4);
 else if(lastmenuc==rate_menu)      decoderate(menu1);
 else if(lastmenuc==width_menu)     decodewidth(menu1);
 else if(lastmenuc==length_menu)    decodelength(menu1);
 else if(lastmenuc==driver_menu)    decodedriver(menu1);
 else if(lastmenuc==group_menu)     decodegroup(menu1,menu2,menu3,menu4);
 else if(lastmenuc==font_menu)      decodefontmenu(menu1);
 else if(lastmenuc==entry_menu)     decodeentrymenu(menu1);
 else if(lastmenuc==dbug_menu)      decodedb(menu1);
 else if(lastmenuc==voice_menu)     decodevoicemenu(menu1);
 else if(lastmenuc==server_menu)    decodeservermenu(menu1);
 else if(lastmenuc==schedpri_menu)  decodepriority(menu1);
 else if(lastmenuc==band_menu)      decodebandmenu(menu1);
 else if(lastmenuc==logfile_menu)   decodelogfile(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==vxbmain_menu)
 {
  if(m1==0) submenu=setsave(SAVEVXBSPRITE);
  else
  if(m1==2) submenu=setvxzoom();
  else
  if(m1==3) submenu=setprocess();
  else
  if(m1==4) submenu=vxprintsetup();
 }
 else
 if(lastmenu==schedule_menu)
 {
  if(m1==0) submenu=setupentrymenu(1,schedule_menu,0);
  else
  if(m1==1 && m2==3) submenu=setupafter(setafter,1);
  else
  if(m1==1 && m2==7 && m3==6) submenu=setupschedband(schedbit_menu,6);
 }
 else
 if(lastmenu==group_menu)
 {
  if(m1==0) submenu=setupentrymenu(1,group_menu,0);
 }
 else
 if(lastmenu==view_menu)
 {
  if(m1==1 && m2==0) submenu=setupinfo();
  else
  if(m1==1 && m2==7) submenu=setupentrymenu(1,action_menu,7);
  else
  if(m1==1 && m2==8 && m3==3) submenu=setupafter(viewafter,0);
  else
  if(m1==1 && m2==8 && m3==7 && m4==6) submenu=setupschedband(schedbit_menu,6);
 }
 else
 if(lastmenu==tdir_menu)
 {
  if(m1==10) submenu=setsave(SAVECSV);
 }
 else
 if(lastmenu==dbug_menu)
 {
  if(m1==0) submenu=setsave(SAVEDBBUFF);
  else
  if(m1==1) submenu=setsave(SAVEDBSPOOL);
 }

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

 m3=m4=0;
}

