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


#include "h.wos"
#include "h.main"
#include "h.ram"
#include "h.file"

#include "h.pan"

#include "h.mym"



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

int menublock[0x201];    /* char 0x804 */


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

int   repopf;


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;


 base=(int *)menublock;

 fp=fopen("<Panorama$Path>.resources.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(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=96;
 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,"1.16(11-Dec-2002)");
}



void setpopinfo(void)
{

}



void decodeinfo(int m1,int m2,int m3,int m4,int m5)
{    
 switch(m1)
 {
   case 1:
         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) squash(); */
 else
 if(buttons==1) squash2();
 else           openpan();
}




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



void setpopmain(void)
{
 int i;

 unshadest(main_menu,0,drawdiag.data && drawdiag.length);

 for(i=0;i<5;i++)      tickst(detail_menu,i,detail==(i+1));
 for(i=0;i<MAXSEL;i++) tickst(selection_menu,i,selection & (1<<i));

 for(i=0;i<MAXPROJ;i++) tickst(plot_menu,i,projection==i);

 tickst(choice_menu,0,showcoords);

}




void popmain(void)
{
 setpopmain();
 popmenu(main_menu);
}



void decodeselect(int m2)
{
 if(m2>=0) selection^=(1<<m2);
}



void decodedetail(int m2)
{
 if(m2>=0) detail=m2+1;
}



void decodeplot(int m2)
{
 if(m2>=0) setplot(m2);
}




void decodechoices(int m2)
{
 switch(m2)
 {

  case 0:
         setcoords((showcoords^=1) & projection!=SAT);
         break;


  case 1:
         savechoices();
         break;

 }
}



void decodemain(int m1,int m2,int m3,int m4,int m5)
{
 switch(m1)
 {
  case 1:                /* draw */
         drawmap();
         break;

  case 2:
         decodeselect(m2);
         break;

  case 3:
         decodedetail(m2);
         break;

  case 4:
         decodeplot(m2);
         break;

  case 7:
         decodechoices(m2);
         break;

 }

 setpopmain();
}







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

void setupmenus(void)
{
 int i;

 load_menus();

 dynamic(main_menu,0);
 dynamic(main_menu,5);
 dynamic(main_menu,6);

 for(i=0;i<=GRID;i++) if(i!=CITY) dynamic(selection_menu,i);

 dynamic(cities_menu,0);
 dynamic(cities_menu,1);
}


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==info_menu)   decodeinfo(menu1,menu2,menu3,menu4,menu5);    

 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) submenu=setsave(SAVEASDRAW);
  else
  if(m1==2) /* selection */
  {
   if(m2==CITY && m3==0) submenu=selcoldynam(CITY);
   else
   if(m2==CITY && m3==1) submenu=selcoldynam(BULLET);
   else
   if(m2>=0 && m2<=GRID) submenu=selcoldynam(m2);
  }
  else
  if(m1==5) submenu=dynamarea();
  else
  if(m1==6) submenu=dynamzoom(pandozoom,&panzoom);
 }

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

 m3=m4=0;
}

