#include <stdlib.h> 
#include <unistd.h>
/* the menu for XPP commands 
   this calls any command
   it also has lots of the direct X Gui stuff
   
*/

#include <stdio.h>
#include <string.h>
#include <X11/Xlib.h>
#include "menudrive.h"
extern char *info_message,*ic_hint[],*sing_hint[],
*null_hint[],*flow_hint[],*null_freeze[], *bvp_hint[],*color_hint[],
  *stoch_hint[];;
extern char *no_hint[],*wind_hint[],*view_hint[],*frz_hint[];
extern char *graf_hint[], *cmap_hint[],*half_hint[],*map_hint[]; 
extern *text_hint[],*edit_hint[];
extern char *adj_hint[];
extern char *phas_hint[],*kin_hint[],*view_hint[],*tab_hint[];
extern Window info_pop,main_win,draw_win;
extern int POIMAP;
extern int DCURY,DCURX;
extern int DF_FLAG,tfBell,TipsFlag;
extern int SimulPlotFlag,current_pop,num_pops,ActiveWinList[];
extern int DisplayHeight,DisplayWidth;
extern int AutoFreezeFlag,NTable;
extern Display *display;
int screen;

extern int TORUS;
typedef struct {
  Window w;
  char text[256];
  int here;} MSGBOXSTRUCT;

MSGBOXSTRUCT MsgBox;


char *getenv();


xpp_hlp()
{
  char cmd[256];
  if(getenv("XPPHELP")==NULL||getenv("BROWSER")==NULL){
    err_msg("XPPHELP or BROWSER undefined");
    return;
  }
  sprintf(cmd,"file:///%s",getenv("XPPHELP"));
  if(fork()==0){
      execlp(getenv("BROWSER"),getenv("BROWSER"),cmd,(char *)0);
  }
}


MessageBox(char *m)
{
 int wid=strlen(m)*DCURX+20;
 int hgt=4*DCURY;
 MsgBox.w=make_window(RootWindow(display,screen),
		      DisplayWidth/2,DisplayHeight/2, wid,hgt,4);
 MsgBox.here=1;
 set_window_title(MsgBox.w,"Yo!");
 strcpy(MsgBox.text,m);
 ping(); 

}
RedrawMessageBox(Window w)
{
 if(w==MsgBox.w)
 Ftext(10,2*DCURY,MsgBox.text,MsgBox.w);
}
KillMessageBox()
{
  if(MsgBox.here==0)return;
  MsgBox.here=0;
  XDestroyWindow(display,MsgBox.w);

}
int TwoChoice(char *c1,char *c2, char *q,char *key)
{
 return two_choice(c1,c2,q,key,DisplayWidth/2,DisplayHeight/2,
		   RootWindow(display,screen)); 
}
GetMouseXY(int *x,int *y)
{
 return get_mouse_xy(x,y,draw_win);
}

FlushDisplay()
{
 XFlush(display);
}
clear_draw_window()
{
  clr_scrn();
  hi_lite(draw_win);
}

 
clr_all_scrns()
{
 int i;
 int ic=current_pop;
 if(SimulPlotFlag==0){
 clr_scrn();
 hi_lite(draw_win);
 return;
 }
 
 for(i=0;i<num_pops;i++){
   make_active(ActiveWinList[i]);
   clr_scrn();
 }
 
 make_active(ic);
 hi_lite(draw_win);
}


run_the_commands(int com)
{

  if(com<0)return;
  if(com<=MAX_M_I){
    do_init_data(com);
    return;
  }
  if(com==M_C){
    cont_integ();
    return;
  }
  if(com>=M_SG&&com<=M_SC){
    find_equilib_com(com-M_SG);
    return;
  }
  if(com>=M_NFF&&com<=M_NFA){
    froz_cline_stuff_com(com-M_NFF); return;}

  if(com>=M_NN&&com<=M_NS){
    new_clines_com(com-M_NN); return;}

  if(com>=M_DD&&com<=M_DS){
    direct_field_com(com-M_DD); return;}

  if(com>=M_WW&&com<=M_WF){
    window_zoom_com(com-M_WW); return;}

  if(com>=M_AA&&com<=M_AC){
    do_torus_com(com-M_AA); return;}

  if(com>=M_KC&&com<=M_KM){
    do_movie_com(com-M_KC); return;}

  if(com>=M_GA &&com<=M_GC){
    add_a_curve_com(com-M_GA);
    return;
  }

  if(com>=M_GFF&&com<=M_GFO){
    freeze_com(com-M_GFF);
    return;
  }

  if(com>=M_GCN&&com<=M_GCG){
    change_cmap_com(com-M_GCN);
    return;
  }

  
  if(com==M_GFKK||com==M_GFKN){
    key_frz_com(com-M_GFKN);
    return;
  }
  if(com==M_UKE||com==M_UKV){
    new_lookup_com(com-M_UKE);
    return;
  }
  if(com==M_R){
    redraw_all();
    return;
  }

  if(com==M_EE){
    clr_all_scrns();
    DF_FLAG=0;
    return;
  }

  if(com==M_X){
    xi_vs_t();
    return;
  }

  if(com==M_3){
    get_3d_par_com();
    return;
  }

  if(com==M_P){
    new_parameter();
    return;
  }

  if(com>=M_MC&&com<=M_MS){
    do_windows_com(com-M_MC);
    return;
  }
  /* CLONE */
  if(com>=M_FP&&com<=M_FL){
    do_file_com(com);
    return;
  }
  
  if(com>=M_TT&&com<=M_TS){
    do_gr_objs_com(com-M_TT);
    return;
  }
  if(com>=M_TEM&&com<=M_TED){
    edit_object_com(com-M_TEM);
    return;
  }
  if(com>=M_BR &&com<=M_BH){
    find_bvp_com(com-M_BR);
    return;
  }
  if(com>=M_V2&&com<=M_VT)change_view_com(com-M_V2);
  if(com>=M_UAN&&com<=M_UAP)make_adj_com(com-M_UAN);
  if(com>=M_UCN&&com<=M_UCA)set_col_par_com(com-M_UCN);
  if(com>=M_UPN&&com<=M_UPP)get_pmap_pars_com(com-M_UPN);
  if(com>=M_UHN&&com<=M_UH2)do_stochast_com(com-M_UHN);
  if(com>=M_UT && com<=M_UC)quick_num(com-M_UT);
}

do_stochast()
{
static char *n[]={"New seed","Compute","Data","Mean","Variance","Histogram",
		  "Old hist","Fourier","Power","fIt data","Stat","Liapunov",
		  "stAutocor","crosscoR","spEc.dns","2D-hist"};
 static char key[]="ncdmvhofpislare2";
 Window temp=main_win;
 char ch;
 int i;
 ch=(char)pop_up_list(&temp,"Stochastic",n,key,16,10,0,10,2*DCURY+8,
		       stoch_hint,info_pop,info_message);
 for(i=0;i<16;i++)
   if(ch==key[i])break;

 if(i>=0&&i<16)run_the_commands(M_UHN+i);
}
get_pmap_pars()
{
  static char *map[]={"(N)one","(S)ection","(M)ax/min","(P)eriod"};
  static char mkey[]="nsmp";
  char ch;
  Window temp=main_win;
  int i;

  ch=(char)pop_up_list(&temp,"Poincare map",map,mkey,4,13,POIMAP,10,6*DCURY+8,
		       map_hint,info_pop,info_message);

  for(i=0;i<4;i++)
    if(ch==mkey[i])break;

  if(i>=0&&i<4)run_the_commands(M_UPN+i);

}

set_col_par()
{
  char ch;
  Window tempw=main_win;
  static char *n[]={"(N)o color","(V)elocity","(A)nother quantity"};
  static char key[]="nva";
  int i;
  ch=(char)pop_up_list(&tempw,"Color code",n,key,
	3,11,0,10,12*DCURY+8,color_hint,
			 info_pop,info_message);
  for(i=0;i<3;i++)
    if(ch==key[i])break;
  if(i>=0&&i<3)run_the_commands(i+M_UCN);
}
  
make_adj()
{
 Window temp=main_win;
 static char *n[]={"(N)ew adj","(M)ake H","(A)djoint","(O)rbit","(H)fun","(P)arameters"};
 static char key[]="nmaohp";
 char ch;
 int i;
 ch=(char)pop_up_list(&temp,"Adjoint",n,key,6,10,0,10,11*DCURY+8,adj_hint,
		      info_pop,info_message);
 for(i=0;i<6;i++)
   if(ch==key[i])break;
 if(i>=0&&i<6)
   run_the_commands(M_UAN+i);
}

do_file_com(int com)
{
  switch(com){
  case M_FT:
    do_transpose();
    break;
  case M_FG: 
    get_intern_set();
    break;
  case M_FI:  
    TipsFlag=1-TipsFlag;
    break;
  case M_FP:
    make_txtview();
    break;
  case M_FW: 
    do_lunch(0);
    break;
  case M_FS: 
    file_inf();
    break;
  case M_FA:
#ifdef AUTO
    do_auto_win();
#endif
    break;
  case M_FC:
    q_calc();
    break;
  case M_FR:
    do_lunch(1);
    break;
  case M_FB: 
    tfBell=1-tfBell;
    break;
  case M_FH:
    xpp_hlp();

    break;
  case M_FQ: 
    if(yes_no_box())bye_bye();
    break;
  case M_FER:
    edit_rhs();
  break;
  case M_FEF:
    edit_functions();
    break;
  case M_FES:
    save_as();
    break;
  case M_FEL:
    load_new_dll();
    break;
  case M_FL:
    clone_ode();
  break;
                
  }
}

do_gr_objs()
{
 char ch;
 int i;
  static char *list[]={"(T)ext","(A)rrow","(P)ointer","(M)arker",
			 "(E)dit","(D)elete all","marker(S)"};
  static char key[]="tapmeds";
  static char title[]="Text,etc";
  static char *elist[]={"(M)ove","(C)hange","(D)elete"};
  static char ekey[]="mcd";
  static char etitle[]="Edit";
  Window temp=main_win;
  ch=(char)pop_up_list(&temp,title,list,key,7,10,0,10,10*DCURY+8,
		       text_hint,info_pop,info_message);
  if(ch==27)return;
  if(ch=='e'){
    ch=(char)pop_up_list(&temp,etitle,elist,ekey,3,9,0,10,10*DCURY+8,

		       edit_hint,info_pop,info_message);

      if(ch==27)return;
    for(i=0;i<3;i++){
      if(ch==ekey[i])break;
    }
    if(i>=0&&i<3)
      run_the_commands(M_TEM+i);
    return;
  }
  for(i=0;i<7;i++)
    if(ch==key[i])break;
  if(i>=0&&i<7)
    run_the_commands(M_TT+i);
}




new_lookup()
{
  static char *n[]={"(E)dit","(V)iew"};
  static char key[]="ev";
  char ch;
  int i;
    Window temp=main_win;
   if(NTable==0)return;
  ch=(char)pop_up_list(&temp,"Tables",n,key,2,12,1,10,11*DCURY+8,
		      tab_hint,info_pop,info_message);
  if(ch==key[0])run_the_commands(M_UKE);
    if(ch==key[1])run_the_commands(M_UKV);
}
find_bvp()
{
 static char *n[]={"(R)ange","(N)o show","(S)how","(P)eriodic","(H)omoclinic"};
 static char key[]="rnsph";
 char ch;
 int i;
  Window temp=main_win;
ch=(char)pop_up_list(&temp,"Bndry Value Prob",n,key,5,12,1,10,6*DCURY+8,
		      bvp_hint,info_pop,info_message);
 if(ch==27)return;
 for(i=0;i<5;i++)
   if(ch==key[i])break;
 if(i>=0&&i<5)run_the_commands(M_BR+i);

}

change_view()
{
Window temp=main_win;
 static char *n[]={"2D" ,"3D","Array","Toon"};
 static char key[]="23at"; 
 char ch;
 int i;
 
 ch=(char)pop_up_list(&temp,"Axes",n,key,4,5,0,10,13*DCURY+8,
		      view_hint,info_pop,info_message);
 for(i=0;i<4;i++)
   if(ch==key[i])break;
 if(i>=0&&i<4)run_the_commands(M_V2+i);
}


do_windows()
{
 int com=-1,i;
char ch;
 static char *list[]={"(C)reate","(K)ill all","(D)estroy","(B)ottom",
		"(A)uto","(M)anual","(S)imPlot On"};
 static char *list2[]={"(C)reate","(K)ill all","(D)estroy","(B)ottom",
		"(A)uto","(M)anual","(S)imPlot Off"};
 static char key[]="ckdbams";
 static char title[]="Make window";
 Window temp=main_win;
 if(SimulPlotFlag==0)
   ch=(char)pop_up_list(&temp,title,list,key,7,11,0,10,14*DCURY+8,
			half_hint,info_pop,info_message);
 else
    ch=(char)pop_up_list(&temp,title,list2,key,7,11,0,10,14*DCURY+8,
 			half_hint,info_pop,info_message);
 for(i=0;i<7;i++){
   if(ch==key[i])
     break;
 }

 if(i>=0&&i<7)
   run_the_commands(M_MC+i);
}
 

add_a_curve()
{
  int com=-1;
  static char *na[]={"(A)dd curve","(D)elete last","(R)emove all",
		     "(E)dit curve", "(P)ostscript","(F)reeze","a(X)es opts",
		     "exp(O)rt data", "(C)olormap"};
  static char *nc[]={"(N)ormal","(P)eriodic","(H)ot","(C)ool","(B)lue-red",
		     "(G)ray"};  
  static char *nf[]={"(F)reeze","(D)elete","(E)dit","(R)emove all","(K)ey",
		 "(B)if.Diag","(C)lr. BD","(O)n freeze"};
  static char *nf2[]={"(F)reeze","(D)elete","(E)dit","(R)emove all","(K)ey",
		 "(B)if.Diag","(C)lr. BD","(O)ff freeze"};
  static char *nk[]={"(N)o key","(K)ey"};
  static char keya[]="adrepfxoc";
  static char keyc[]="nphcbg";
  static char keyf[]="fderkbco";
  static char keyk[]="nk";
  Window temp=main_win;
  char ch;
  int i,j;
  ch=(char)pop_up_list(&temp,"Curves",na,keya,9,15,0,10,8*DCURY+8,
		      graf_hint,info_pop,info_message);
  for(i=0;i<9;i++)
    if(ch==keya[i])
      break;
  if(i==5){
    if(AutoFreezeFlag==0)  
      ch=(char)pop_up_list(&temp,"Freeze",nf,keyf,8,15,0,10,8*DCURY+8,
			   frz_hint,info_pop,info_message);
    else
      ch=(char)pop_up_list(&temp,"Freeze",nf2,keyf,8,15,0,10,8*DCURY+8,
			   frz_hint,info_pop,info_message);
    for(j=0;j<8;j++)
      if(ch==keyf[j])
	break;
    if(j==4){
      ch=(char)pop_up_list(&temp,"Key",nk,keyk,2,9,0,10,8*DCURY+8,
			   no_hint,info_pop,info_message);
      if(ch==keyk[0])
	com=M_GFKN;
      if(ch==keyk[1])
	com=M_GFKK;
    }
    else {
      if(j>=0&&j<8)
	com=M_GFF+j;
    }
  }
  else {
    if(i==8){
      ch=(char)pop_up_list(&temp,"Colormap",nc,keyc,6,15,0,10,8*DCURY+8,
			   cmap_hint,info_pop,info_message);
      for(j=0;j<6;j++)
	if(ch==keyc[j])
	  break;
      if(j>=0&&j<6)
	com=M_GCN+j;
    }
    else {
      if(i>=0&&i<9)
	com=M_GA+i;
    }
  }
  run_the_commands(com);
}




do_movie()
{
 int i;
 char ch;
 static char *list[]={"(C)apture","(R)eset","(P)layback","(A)utoplay","(S)ave","(M)ake AniGif"};
 static char key[]="crpasm";
 Window temp=main_win;
 ch=(char)pop_up_list(&temp,"Kinescope",list,key,6,11,0,10,8*DCURY+8,
		      kin_hint,info_pop,info_message);
 for(i=0;i<6;i++)
   if(ch==key[i])
     break;
 if(i>=0&&i<6)
   run_the_commands(i+M_KC);
}


do_torus()
{
  Window temp=main_win;
  static char *n[]={"(A)ll","(N)one","(C)hoose"};
 static char key[]="anc";
 char ch;
 int i;
 ch=(char)pop_up_list(&temp,"Torus",n,key,3,9,1-TORUS,10,4*DCURY+8,
		      phas_hint,info_pop,info_message);
 for(i=0;i<3;i++)
   if(ch==key[i])
     break;
 if(i>=0&&i<3)
   run_the_commands(M_AA+i);
}

window_zoom()
{

static char *n[]={"(W)indow","(Z)oom In", "Zoom (O)ut", "(F)it"};
 static char key[]="wzof";
 char ch;
 int i;
  Window temp=main_win;
   ch=(char)pop_up_list(&temp,"Window",n,key,4,13,0,10,13*DCURY+8,
			wind_hint,info_pop,info_message);
for(i=0;i<4;i++)
  if(ch==key[i])
    break;
if(i>=0&&i<4)
  run_the_commands(M_WW+i);
}
  
direct_field()
{
  int i;
  static char *n[]={"(D)irect Field","(F)low","(N)o dir. fld.","(C)olorize",
  "(S)caled Dir.Fld"};
  static char key[]="dfncs";
  char ch;
 Window temp=main_win;
 ch=(char)pop_up_list(&temp,"Two-D Fun",n,key,5,18,0,10,6*DCURY+8,
		       flow_hint,info_pop,info_message);

 for(i=0;i<5;i++)
   if(ch==key[i])
     break;
 if(i>=0&&i<5)
   run_the_commands(M_DD+i);
}
new_clines()
{
  int i;
  Window temp=main_win;
  static char *n[]={"(N)ew","(R)estore","(A)uto","(M)anual","(F)reeze","(S)ave"};
  static char key[]="nramfs";
  char ch;
  ch=(char)pop_up_list(&temp,"Nullclines",n,key,6,10,0,10,6*DCURY+8,
		       null_hint,info_pop,info_message);
  for(i=0;i<6;i++)
    if(ch==key[i])
      break;
  if(i>=0&&i<6)
    run_the_commands(M_NN+i);
}
froz_cline_stuff()
{
 Window temp=main_win;
  static char *n[]={"(F)reeze","(D)elete all","(R)ange","(A)nimate"};
  static char key[]="fdra";
  char ch;
  int i;
   ch=(char)pop_up_list(&temp,"Freeze cline",n,key,4,10,0,10,6*DCURY+8,
		       null_freeze,info_pop,info_message);
   for(i=0;i<4;i++){
    if(ch==key[i])
      break;
   }
   if(i>=0&&i<4)
     run_the_commands(M_NFF+i);
}
find_equilibrium()
{ 
  int i;
  static char *n[]={"(G)o","(M)ouse","(R)ange","monte(C)ar"};
  static char key[]="gmrc";
  char ch;
  Window temp=main_win;
  ch=(char)pop_up_list(&temp,"Equilibria",n,key,4,12,1,10,6*DCURY+8,
		      sing_hint,info_pop,info_message);
 if(ch==27)
   return;
 for(i=0;i<4;i++){
   if(ch==key[i])
     break;
 }

 if(i>-1&&i<4)
   run_the_commands(i+M_SG);
}
 
ini_data_menu()
{
 int i;
Window temp=main_win;
 static char *n[]={"(R)ange","(2)par range","(L)ast","(O)ld","(G)o","(M)ouse","(S)hift","(N)ew",
		    "s(H)oot","(F)ile","form(U)la","m(I)ce","DAE guess",
  "(B)ackward"};
  static char key[]="r2logmsnhfuidb";
  char ch;
  ch= (char)pop_up_list(&temp,"Integrate",n,key,14,13,3,10,3*DCURY+8,
			ic_hint,info_pop,info_message);

 if(ch==27)
    return;
   
  for(i=0;i<14;i++){
    if(ch==key[i])
      break;
  }
 
 run_the_commands(i);
 
 
}

new_param()
{
 run_the_commands(M_P);
}

clear_screens()
{
  run_the_commands(M_EE);

}



x_vs_t()
{
 run_the_commands(M_X);
}


redraw_them_all()
{
  run_the_commands(M_R);

}

get_3d_par()
{
  run_the_commands(M_3);
}






syntax highlighted by Code2HTML, v. 0.9.1