home *** CD-ROM | disk | FTP | other *** search
/ Il CD di internet / CD.iso / SOURCE / AP / JED / JED097-1.TAR / jed / lib / menu.sl < prev    next >
Encoding:
Text File  |  1994-12-12  |  4.8 KB  |  232 lines

  1. %
  2. %  Example of menus for JED.  This is designed to aid in learning
  3. %  the editor since after a menu item has been chosen, the user is 
  4. %  informed of the keybinding of the function.
  5. %
  6.  
  7. enable_top_status_line (1);
  8. if (TOP_WINDOW_ROW == 1) error ("Menu bar has been disabled.  It must be present to use the menus.");
  9.  
  10. define menu_build_display_string (list)
  11. {
  12.    variable i = 0, cmd, s = Null_String;
  13.    
  14.    forever 
  15.      {
  16.     cmd = extract_element (list, i, ',');
  17.     !if (strlen(cmd)) break;
  18.     if (i) s = strcat(s, ", ");
  19.     s = Sprintf("%s(%d)%s", s, i, cmd, 3);
  20.     ++i;
  21.      }
  22.    s;
  23. }
  24.  
  25.  
  26. define menu_list_length (list)
  27. {
  28.    variable i = 0;
  29.    
  30.    i - 1;
  31. }
  32.  
  33. variable Menu_Last_Cmd;
  34. variable Menu_Abort;  Menu_Abort = 0;
  35.  
  36. define menu_select_cmd (s_list, cmd_list)
  37. {
  38.    variable cmd, i, s, n;
  39.    i = 0;
  40.   
  41.    n = 0; while (strlen(extract_element(cmd_list, n, ','))) n++;
  42.    n--;
  43.   
  44.    s = strcat ("Menu: ", menu_build_display_string(s_list));
  45.    
  46.    
  47.    do
  48.      {
  49.     Menu_Abort = 0;
  50.  
  51.     forever 
  52.       {
  53.          message ("Pick a number or press Ctrl-G to abort or SPACE to go back to previous level.");
  54.          set_top_status_line (s); pop (); update(1);
  55.          i = getkey();
  56.          if (i == 7) call ("kbd_quit");
  57.          if (i == ' ')
  58.            {
  59.           Menu_Abort = 1;
  60.           return;
  61.            }
  62.  
  63.          i -= '0';
  64.   
  65.          if ((i >= 0) and (i <= n)) break;
  66.     
  67.  
  68.          beep();
  69.          flush_input();
  70.          % flush("Pick a number or press Ctrl-G to abort or SPACE to go back.");
  71.          % pop(input_pending(20));
  72.       }
  73.    
  74.     cmd = extract_element(cmd_list, i, ',');
  75.   
  76.     if (int (substr(cmd, 1, 1)) == '@')
  77.       {    
  78.          Menu_Last_Cmd = substr(cmd, 2, strlen(cmd));
  79.          call (Menu_Last_Cmd);
  80.       }
  81.     else
  82.       {
  83.          Menu_Last_Cmd = cmd;
  84.          eval(strcat (".", cmd));  %  Use RPN--- no need to parse it
  85.       }
  86.      }
  87.    while(Menu_Abort);
  88. }
  89.  
  90. define menu_window_cmds ()
  91. {
  92.    menu_select_cmd ("One window,Split Window,Other Window,Del Window,Redraw",
  93.             "@one_window,@split_window,@other_window,@delete_window,@redraw");
  94. }
  95.  
  96.  
  97. define search_replace ()
  98. {
  99.    menu_select_cmd ("Search Forward,Search Backward,Replace",
  100.             "search_forward,search_backward,replace_cmd");
  101. }
  102.  
  103.  
  104. define menu_deletion_cmd ()
  105. {
  106.    menu_select_cmd ("Delete Char,Delete Word",
  107.             "del,delete_word");
  108. }
  109.  
  110.  
  111.  
  112. define menu_cut_paste ()
  113. {
  114.    menu_select_cmd ("Deleting,Begin Region,Cut Region,Copy Region,Paste",
  115.             "menu_deletion_cmd,@set_mark_cmd,@kill_region,@copy_region,@yank");
  116. }
  117.  
  118.  
  119.  
  120. define menu_movement ()
  121. {
  122.    menu_select_cmd ("Page Up,Page Down,Top,Bottom,Page Left,Page Right",
  123.             "@page_up,@page_down,@beg_of_buffer,@end_of_buffer,@scroll_right,@scroll_left");
  124. }
  125.  
  126.  
  127.  
  128. define menu_buffer_modes ()
  129. {
  130.    menu_select_cmd ("C-Mode,Text-Mode,No-Mode,Fortran-Mode",
  131.             "c_mode,text_mode,no_mode,fortran");
  132. }
  133.  
  134. define menu_basics ()
  135. {
  136.    menu_select_cmd ("Search/Replace,Movement,Cut/Paste,Undo,Formatting",
  137.             "search_replace,menu_movement,menu_cut_paste,@undo,@format_paragraph");
  138. }
  139.  
  140.  
  141. define menu_buffers ()
  142. {
  143.    menu_select_cmd ("Kill Buffer,Switch To Buffer,List Buffers,Set buffer modes",
  144.             "@kill_buffer,@switch_to_buffer,list_buffers,menu_buffer_modes");
  145. }
  146.  
  147.  
  148. define menu_files ()
  149. {
  150.    menu_select_cmd ("Open File,Save to File,Save Buffers,Insert File",
  151.             "@find_file,@write_buffer,@save_buffers,@insert_file");
  152. }
  153.  
  154.  
  155.  
  156. define menu_help ()
  157. {
  158.    menu_select_cmd ("Pop up help,Browse Documentation,Show Key,Where is Command",
  159.             "help,info_mode,showkey,where_is");
  160. }
  161.  
  162.  
  163. define menu_misc ()
  164. {
  165. #ifdef UNIX VMS
  166.    menu_select_cmd ("compose mail,send mail,ispell,shell command,suspend",
  167.             "mail,send,ispell,do_shell_cmd,@sys_spawn_cmd");
  168. #else
  169.    menu_select_cmd ("Shell command,Suspend",
  170.             "do_shell_cmd,@sys_spawn_cmd");
  171. #endif
  172. }
  173.  
  174.  
  175.  
  176. define menu_main_cmds ()
  177. {
  178.    variable n, key, len, next, nlen;
  179.    
  180.    ERROR_BLOCK 
  181.      {
  182.     set_top_status_line (Global_Top_Status_Line);
  183.     pop ();
  184.      }
  185.    
  186.    menu_select_cmd ("File,Edit,Buffers,Windows,Help,Misc,Exit",
  187.             "menu_files,menu_basics,menu_buffers,menu_window_cmds,menu_help,menu_misc,@exit_jed");
  188.  
  189.    EXECUTE_ERROR_BLOCK ();
  190.    
  191.      %
  192.      %  Show user keybinding of the function.
  193.      %  The problem with this is that any function which leaves a message
  194.      %  in the message buffer, the message will be destroyed.  Here I 
  195.      %  update screen and sleep for a second before continuing.  Menus are
  196.      %  intrinsically inefficient anyway.
  197.      %
  198.   
  199.    if (strlen(MESSAGE_BUFFER))
  200.      { 
  201.     update (0);
  202.     input_pending(20); pop();
  203.      }
  204.    
  205.    if (Menu_Abort)
  206.      {
  207.     return; 
  208.      }
  209.    
  210.    if (n = which_key (Menu_Last_Cmd), n)
  211.      {
  212.     =key; n--;
  213.     
  214.     len = strlen (key);
  215.     loop (n)
  216.       {
  217.          =next;
  218.          nlen = strlen (next);
  219.          if (nlen < len)
  220.            {
  221.           len = nlen;
  222.           key = next;
  223.            }
  224.       }
  225.  
  226.     Sprintf ("%s is on key %s", Menu_Last_Cmd, expand_keystring (key), 2);
  227.      }
  228.    else strcat (Menu_Last_Cmd, " is not on any keys.");
  229.    message (());
  230. }
  231.  
  232.