% This File is OBSOLETE

%
%  Example of menus for JED.  This is designed to aid in learning
%  the editor since after a menu item has been chosen, the user is 
%  informed of the keybinding of the function.
%

enable_top_status_line (1);
if (TOP_WINDOW_ROW == 1) error ("Menu bar has been disabled.  It must be present to use the menus.");

define menu_build_display_string (list)
{
   variable i = 0, cmd, s = Null_String;
   
   forever 
     {
	cmd = extract_element (list, i, ',');
	if (cmd == NULL) break;
	if (i) s += ", ";
	s = sprintf("%s(%d)%s", s, i, cmd);
	++i;
     }
   s;
}


define menu_list_length (list)
{
   variable i = 0;
   
   i - 1;
}

variable Menu_Last_Cmd;
variable Menu_Abort;  Menu_Abort = 0;

define menu_select_cmd (s_list, cmd_list)
{
   variable cmd, i, s, n;
   i = 0;
  
   n = 0; 
   while (NULL != extract_element(cmd_list, n, ',')) n++;
   n--;
  
   s = strcat ("Menu: ", menu_build_display_string(s_list));
   
   
   do
     {
	Menu_Abort = 0;

	forever 
	  {
	     message ("Pick a number or press Ctrl-G to abort or SPACE to go back to previous level.");
	     set_top_status_line (s); pop (); update_sans_update_hook(1);
	     i = getkey();
	     if (i == 7) call ("kbd_quit");
	     if (i == ' ')
	       {
		  Menu_Abort = 1;
		  return;
	       }

	     i -= '0';
  
	     if ((i >= 0) and (i <= n)) break;
    

	     beep();
	     flush_input();
	     % flush("Pick a number or press Ctrl-G to abort or SPACE to go back.");
	     % pop(input_pending(20));
	  }
   
	cmd = extract_element(cmd_list, i, ',');
  
	if (cmd [0] == '@')
	  {	
	     Menu_Last_Cmd = substr(cmd, 2, strlen(cmd));
	     call (Menu_Last_Cmd);
	  }
	else
	  {
	     Menu_Last_Cmd = cmd;
	     eval(strcat (".", cmd));  %  Use RPN--- no need to parse it
	  }
     }
   while(Menu_Abort);
}

define menu_window_cmds ()
{
   menu_select_cmd ("One window,Split Window,Other Window,Del Window,Redraw",
		    "@one_window,@split_window,@other_window,@delete_window,@redraw");
}


define search_replace ()
{
   menu_select_cmd ("Search Forward,Search Backward,Replace",
		    "search_forward,search_backward,replace_cmd");
}


define menu_deletion_cmd ()
{
   menu_select_cmd ("Delete Char,Delete Word",
		    "del,delete_word");
}



define menu_cut_paste ()
{
   menu_select_cmd ("Deleting,Begin Region,Cut Region,Copy Region,Paste",
		    "menu_deletion_cmd,@set_mark_cmd,@kill_region,@copy_region,@yank");
}



define menu_movement ()
{
   menu_select_cmd ("Page Up,Page Down,Top,Bottom,Page Left,Page Right",
		    "@page_up,@page_down,@beg_of_buffer,@end_of_buffer,@scroll_right,@scroll_left");
}



define menu_buffer_modes ()
{
   menu_select_cmd ("C-Mode,Text-Mode,No-Mode,Fortran-Mode",
		    "c_mode,text_mode,no_mode,fortran");
}

define menu_basics ()
{
   menu_select_cmd ("Search/Replace,Movement,Cut/Paste,Undo,Formatting",
		    "search_replace,menu_movement,menu_cut_paste,@undo,@format_paragraph");
}


define menu_buffers ()
{
   menu_select_cmd ("Kill Buffer,Switch To Buffer,List Buffers,Set buffer modes",
		    "@kill_buffer,@switch_to_buffer,list_buffers,menu_buffer_modes");
}


define menu_files ()
{
   menu_select_cmd ("Open File,Save to File,Save Buffers,Insert File",
		    "@find_file,@write_buffer,@save_some_buffers,@insert_file");
}



define menu_help ()
{
   menu_select_cmd ("Pop up help,Browse Documentation,Show Key,Where is Command",
		    "help,info_reader,showkey,where_is");
}


define menu_misc ()
{
#ifdef UNIX VMS
   menu_select_cmd ("compose mail,send mail,ispell,shell command,suspend",
		    "mail,mail_send,ispell,do_shell_cmd,@sys_spawn_cmd");
#else
   menu_select_cmd ("Shell command,Suspend",
		    "do_shell_cmd,@sys_spawn_cmd");
#endif
}



define menu_main_cmds ()
{
   variable n, key, len, next, nlen;
   
   try
     {
	menu_select_cmd ("File,Edit,Buffers,Windows,Help,Misc,Exit",
			 "menu_files,menu_basics,menu_buffers,menu_window_cmds,menu_help,menu_misc,@exit_jed");
     }
   finally
     () = set_top_status_line (Global_Top_Status_Line);
   
     %
     %  Show user keybinding of the function.
     %  The problem with this is that any function which leaves a message
     %  in the message buffer, the message will be destroyed.  Here I 
     %  update screen and sleep for a second before continuing.  Menus are
     %  intrinsically inefficient anyway.
     %
  
   if (strlen(MESSAGE_BUFFER))
     { 
	update_sans_update_hook (0);
	() = input_pending(20);
     }
   
   if (Menu_Abort)
     {
	return; 
     }
   
   if (n = which_key (Menu_Last_Cmd), n)
     {
	key = (); n--;
	
	len = strlen (key);
	loop (n)
	  {
	     next = ();
	     nlen = strlen (next);
	     if (nlen < len)
	       {
		  len = nlen;
		  key = next;
	       }
	  }

	sprintf ("%s is on key %s", Menu_Last_Cmd, expand_keystring (key));
     }
   else strcat (Menu_Last_Cmd, " is not on any keys.");
   message (());
}

