/* we_menue.c                                             */
/* Copyright (C) 1993 Fred Kruse                          */
/* This is free software; you can redistribute it and/or  */
/* modify it under the terms of the                       */
/* GNU General Public License, see the file COPYING.      */

#include "messages.h"
#include "edit.h"

int             e_p_show_messages(FENSTER *f);
int             e_p_show_watches(FENSTER *f);
int             e_blck_gt_beg(FENSTER *f);
int             e_blck_gt_end(FENSTER *f);
int             e_blck_mrk_line(FENSTER *f);
int             e_blck_mrk_all(FENSTER *f);
int             e_blck_to_left(FENSTER *f);
int             e_blck_to_right(FENSTER *f);
int             e_cl_project(FENSTER *f);
int             e_p_add_item(FENSTER *f);
int             e_p_del_item(FENSTER *f);
int             e_show_project(FENSTER *f);
int             e_info(FENSTER *f);
int             e_help_options(FENSTER *f);
int             e_hp_ret(FENSTER *f);
int             e_hp_back(FENSTER *f);
int             e_hp_prev(FENSTER *f);
int             e_hp_next(FENSTER *f);

/* main menu control bar */
int WpeHandleMainmenu(int n, FENSTER *f)
{
  extern int      e_mn_men;
  int             i, c = 255, nold = n <= 0 ? 1 : n - 1;
  extern OPT      opt[];
  extern char    *e_hlp, *e_hlp_str[];
  ECNT           *cn = f->ed;
  MENU           *mainmenu = MALLOC(MENOPT * sizeof(MENU));

  for(i = 0; i < MENOPT; i++)
    mainmenu[i].width = 0;
  fk_cursor(0);
  if(n < 0)
    n = 0;
  else
    c = WPE_CR;
#ifdef UNIX
#ifdef NEWSTYLE
  if(WpeIsXwin())
    mainmenu[0].position = -3;
  else
#endif
    mainmenu[0].position = -2;
  mainmenu[0].no_of_items = 6;
  mainmenu[0].width = 23;
#else
  mainmenu[0].position = -3;
  mainmenu[0].no_of_items = 4;
  mainmenu[0].width = 20;
#endif
  if((mainmenu[0].menuitems = MALLOC(mainmenu[0].no_of_items * sizeof(OPTK))) == NULL)
    e_error(e_msg[ERR_LOWMEM], 1, f->fb);
  mainmenu[0].menuitems[0] = WpeFillSubmenuItem("About WE", 0, 'A', e_about_WE);
  mainmenu[0].menuitems[1] = WpeFillSubmenuItem("Clear Desktop", 0, 'C', e_clear_desk);
  mainmenu[0].menuitems[2] = WpeFillSubmenuItem("Repaint Desktop", 0, 'R', e_repaint_desk);
  mainmenu[0].menuitems[3] = WpeFillSubmenuItem("System Info", 0, 'S', e_sys_info);
#ifdef UNIX
  mainmenu[0].menuitems[4] = WpeFillSubmenuItem("Show Wastebasket", 5, 'W', WpeShowWastebasket);
  mainmenu[0].menuitems[5] = WpeFillSubmenuItem("Delete Wastebasket", 0, 'D', WpeDelWastebasket);
#endif
  mainmenu[1].position = -3;
#ifdef UNIX
  mainmenu[1].width = 24;
  mainmenu[1].no_of_items = 11;
  if((mainmenu[1].menuitems = MALLOC(mainmenu[1].no_of_items * sizeof(OPTK))) == NULL)
    e_error(e_msg[ERR_LOWMEM], 1, f->fb);
  if(f->ed->edopt & ED_CUA_STYLE)
  {
    mainmenu[1].menuitems[0] = WpeFillSubmenuItem("File-Manager     F2", 0, 'M', WpeManager);
    mainmenu[1].menuitems[2] = WpeFillSubmenuItem("Save         Alt F2", 0, 'S', e_m_save);
    mainmenu[1].menuitems[10] = WpeFillSubmenuItem("Quit         Alt F4", 0, 'Q', e_quit);
  }
  else
  {
    mainmenu[1].menuitems[0] = WpeFillSubmenuItem("File-Manager     F3", 0, 'M', WpeManager);
    mainmenu[1].menuitems[2] = WpeFillSubmenuItem("Save             F2", 0, 'S', e_m_save);
    mainmenu[1].menuitems[10] = WpeFillSubmenuItem("Quit          Alt X", 0, 'Q', e_quit);
  }
  mainmenu[1].menuitems[1] = WpeFillSubmenuItem("New", 0, 'N', e_new);
  mainmenu[1].menuitems[3] = WpeFillSubmenuItem("Save As", 5, 'A', WpeSaveAsManager);
  mainmenu[1].menuitems[4] = WpeFillSubmenuItem("Save aLl", 6, 'L', e_saveall);
  mainmenu[1].menuitems[5] = WpeFillSubmenuItem("Execute", 0, 'E', WpeExecuteManager);
  mainmenu[1].menuitems[6] = WpeFillSubmenuItem("SHell", 1, 'H', WpeShell);
  mainmenu[1].menuitems[7] = WpeFillSubmenuItem("Find", 0, 'F', WpeFindWindow);
  mainmenu[1].menuitems[8] = WpeFillSubmenuItem("Grep", 0, 'G', WpeGrepWindow);
  mainmenu[1].menuitems[9] = WpeFillSubmenuItem("Print File", 0, 'P', WpePrintFile);
#endif
  mainmenu[2].position = -3;
  mainmenu[2].width = 27;
#if !defined(NO_XWINDOWS) && !defined(DJGPP)
  if(WpeIsXwin())
    mainmenu[2].no_of_items = 9;
  else
#endif
    mainmenu[2].no_of_items = 7;
  if((mainmenu[2].menuitems = MALLOC(mainmenu[2].no_of_items * sizeof(OPTK))) == NULL)
    e_error(e_msg[ERR_LOWMEM], 1, f->fb);
  mainmenu[2].menuitems[0] = WpeFillSubmenuItem("Cut     Shift Del / ^X", 2, 'T', e_edt_del);
  mainmenu[2].menuitems[1] = WpeFillSubmenuItem("Copy         ^Ins / ^C", 0, 'C', e_edt_copy);
  mainmenu[2].menuitems[2] = WpeFillSubmenuItem("Paste   Shift Ins / ^V", 0, 'P', e_edt_einf);
  mainmenu[2].menuitems[3] = WpeFillSubmenuItem("Show Buffer         ^W", 0, 'S', e_show_clipboard);
  mainmenu[2].menuitems[4] = WpeFillSubmenuItem("Delete            ^Del", 0, 'D', e_blck_del);
  mainmenu[2].menuitems[5] = WpeFillSubmenuItem("Undo                ^U", 0, 'U', e_make_undo);
  mainmenu[2].menuitems[6] = WpeFillSubmenuItem("Redo                ^R", 0, 'R', e_make_redo);
#ifndef NO_XWINDOWS
  if(WpeIsXwin())
  {
    mainmenu[2].menuitems[7] = WpeFillSubmenuItem("PAste(XBuffer) Alt Ins", 0, 'A', e_u_copy_X_buffer);
    mainmenu[2].menuitems[8] = WpeFillSubmenuItem("COpy(XBuffer)  Alt Del", 0, 'O', e_u_paste_X_buffer);
  }
#endif
  mainmenu[3].position = -3;
  mainmenu[3].width = 28;
  mainmenu[3].no_of_items = 4;
  if((mainmenu[3].menuitems = MALLOC(mainmenu[3].no_of_items * sizeof(OPTK))) == NULL)
    e_error(e_msg[ERR_LOWMEM], 1, f->fb);
  if(f->ed->edopt & ED_CUA_STYLE)
  {
    mainmenu[3].menuitems[0] = WpeFillSubmenuItem("Find      Alt F3 / ^O F", 0, 'F', e_find);
    mainmenu[3].menuitems[1] = WpeFillSubmenuItem("Replace Shift F3 / ^O A", 0, 'R', e_replace);
    mainmenu[3].menuitems[2] = WpeFillSubmenuItem("Search again         F3", 0, 'S', e_rep_search);
  }
  else
  {
    mainmenu[3].menuitems[0] = WpeFillSubmenuItem("Find          F4 / ^O F", 0, 'F', e_find);
    mainmenu[3].menuitems[1] = WpeFillSubmenuItem("Replace   Alt F4 / ^O A", 0, 'R', e_replace);
    mainmenu[3].menuitems[2] = WpeFillSubmenuItem("Search again         ^L", 0, 'S', e_rep_search);
  }
  mainmenu[3].menuitems[3] = WpeFillSubmenuItem("Go to Line        Alt G", 0, 'G', e_goto_line);
  mainmenu[4].position = -3;
  mainmenu[4].width = 25;
  mainmenu[4].no_of_items = 15;
  if((mainmenu[4].menuitems = MALLOC(mainmenu[4].no_of_items * sizeof(OPTK))) == NULL)
    e_error(e_msg[ERR_LOWMEM], 1, f->fb);
  mainmenu[4].menuitems[0] = WpeFillSubmenuItem("Begin Mark      ^K B", 0, 'B', e_blck_begin);
  mainmenu[4].menuitems[1] = WpeFillSubmenuItem("End Mark        ^K K", 0, 'E', e_blck_end);
  mainmenu[4].menuitems[2] = WpeFillSubmenuItem("Mark WhOle      ^K X", 7, 'O', e_blck_mrk_all);
  mainmenu[4].menuitems[3] = WpeFillSubmenuItem("Mark Line       ^K L", 5, 'L', e_blck_mrk_line);
  mainmenu[4].menuitems[4] = WpeFillSubmenuItem("Goto Begin      ^K A", 0, 'G', e_blck_gt_beg);
  mainmenu[4].menuitems[5] = WpeFillSubmenuItem("Goto ENd        ^K Z", 6, 'N', e_blck_gt_end);
  mainmenu[4].menuitems[6] = WpeFillSubmenuItem("Copy            ^K C", 0, 'C', e_blck_copy);
  mainmenu[4].menuitems[7] = WpeFillSubmenuItem("Move            ^K V", 0, 'M', e_blck_move);
  mainmenu[4].menuitems[8] = WpeFillSubmenuItem("Delete          ^K Y", 0, 'D', e_blck_del);
  mainmenu[4].menuitems[9] = WpeFillSubmenuItem("Hide            ^K H", 0, 'H', e_blck_hide);
  mainmenu[4].menuitems[10] = WpeFillSubmenuItem("Read            ^K R", 0, 'R', e_blck_read);
  mainmenu[4].menuitems[11] = WpeFillSubmenuItem("Write           ^K W", 0, 'W', e_blck_write);
  mainmenu[4].menuitems[12] = WpeFillSubmenuItem("Move to RIght   ^K I", 9, 'I', e_blck_to_right);
  mainmenu[4].menuitems[13] = WpeFillSubmenuItem("Move to LefT    ^K U", 11, 'T', e_blck_to_left);
  mainmenu[4].menuitems[14] = WpeFillSubmenuItem("ChAnge Case     ^K D", 2, 'A', e_changecase_dialog);
#ifdef PROG
  if(WpeIsProg())
  {
    mainmenu[5].position = -3;
    mainmenu[5].width = 35;
    mainmenu[5].no_of_items = 12;
    if((mainmenu[5].menuitems = MALLOC(mainmenu[5].no_of_items * sizeof(OPTK))) == NULL)
      e_error(e_msg[ERR_LOWMEM], 1, f->fb);
    mainmenu[5].menuitems[0] = WpeFillSubmenuItem("Compile         Alt F9 / Alt C", 0, 'C', e_compile);
    mainmenu[5].menuitems[1] = WpeFillSubmenuItem("Make                F9 / Alt M", 0, 'M', e_p_make);
    mainmenu[5].menuitems[2] = WpeFillSubmenuItem("Run                ^F9 / Alt U", 0, 'R', e_run);
    mainmenu[5].menuitems[3] = WpeFillSubmenuItem("Install                  Alt L", 0, 'I', e_install);
    mainmenu[5].menuitems[4] = WpeFillSubmenuItem("Execute Make             Alt A", 0, 'E', e_exec_make);
    mainmenu[5].menuitems[5] = WpeFillSubmenuItem("Next Error      Alt F8 / Alt T", 0, 'N', e_next_error);
    mainmenu[5].menuitems[6] = WpeFillSubmenuItem("Previous Error  Alt F7 / Alt V", 0, 'P', e_previous_error);
    mainmenu[5].menuitems[7] = WpeFillSubmenuItem("Show Definition           ^O S", 0, 'S', e_sh_def);
    mainmenu[5].menuitems[8] = WpeFillSubmenuItem("Show NeXt Definition      ^O N", 7, 'X', e_sh_nxt_def);
    mainmenu[5].menuitems[9] = WpeFillSubmenuItem("Matching BracKet          ^O K", 13, 'K', e_nxt_brk);
    mainmenu[5].menuitems[10] = WpeFillSubmenuItem("Beautify                  ^O B", 0, 'B', e_p_beautify);
    mainmenu[5].menuitems[11] = WpeFillSubmenuItem("Arguments                     ", 0, 'A', e_arguments);

    mainmenu[MENOPT - 4].position = -3;
    mainmenu[MENOPT - 4].width = 23;
    mainmenu[MENOPT - 4].no_of_items = 5;
    if((mainmenu[MENOPT - 4].menuitems = MALLOC(mainmenu[MENOPT - 4].no_of_items * sizeof(OPTK))) == NULL)
      e_error(e_msg[ERR_LOWMEM], 1, f->fb);
    mainmenu[MENOPT - 4].menuitems[0] = WpeFillSubmenuItem("Open Project", 5, 'P', e_project);
    mainmenu[MENOPT - 4].menuitems[1] = WpeFillSubmenuItem("Close Project", 0, 'C', e_cl_project);
    mainmenu[MENOPT - 4].menuitems[2] = WpeFillSubmenuItem("Add Item", 0, 'A', e_p_add_item);
    mainmenu[MENOPT - 4].menuitems[3] = WpeFillSubmenuItem("Delete Item", 0, 'D', e_p_del_item);
    mainmenu[MENOPT - 4].menuitems[4] = WpeFillSubmenuItem("Options", 0, 'O', e_project_options);
  }
#endif
#ifdef DEBUGGER
  if(WpeIsProg())
  {
    mainmenu[MENOPT - 5].position = -3;
    mainmenu[MENOPT - 5].width = 33;
    mainmenu[MENOPT - 5].no_of_items = 13;
    if((mainmenu[MENOPT - 5].menuitems = MALLOC(mainmenu[MENOPT - 5].no_of_items * sizeof(OPTK))) == NULL)
      e_error(e_msg[ERR_LOWMEM], 1, f->fb);

    if(f->ed->edopt & ED_CUA_STYLE)
    {
      mainmenu[MENOPT - 5].menuitems[0] = WpeFillSubmenuItem("Toggle Breakpoint  F5 / ^G B", 7, 'B', e_breakpoint);
      mainmenu[MENOPT - 5].menuitems[2] = WpeFillSubmenuItem("Make Watch        ^F5 / ^G W", 5, 'W', e_make_watches);
      mainmenu[MENOPT - 5].menuitems[6] = WpeFillSubmenuItem("Show stacK        ^F3 / ^G K", 9, 'K', e_deb_stack);
    }
    else
    {
      mainmenu[MENOPT - 5].menuitems[0] = WpeFillSubmenuItem("Toggle Breakpoint ^F8 / ^G B", 7, 'B', e_breakpoint);
      mainmenu[MENOPT - 5].menuitems[2] = WpeFillSubmenuItem("Make Watch        ^F7 / ^G W", 5, 'W', e_make_watches);
      mainmenu[MENOPT - 5].menuitems[6] = WpeFillSubmenuItem("Show stacK        ^F6 / ^G K", 9, 'K', e_deb_stack);
    }
    mainmenu[MENOPT - 5].menuitems[1] = WpeFillSubmenuItem("ReMove all Breakp.      ^G M", 2, 'M', e_remove_breakpoints);
    mainmenu[MENOPT - 5].menuitems[3] = WpeFillSubmenuItem("Edit watch              ^G E", 0, 'E', e_edit_watches);
    mainmenu[MENOPT - 5].menuitems[4] = WpeFillSubmenuItem("Delete watch            ^G D", 0, 'D', e_delete_watches);
    mainmenu[MENOPT - 5].menuitems[5] = WpeFillSubmenuItem("Remove All watches      ^G A", 7, 'A', e_remove_all_watches);
    mainmenu[MENOPT - 5].menuitems[7] = WpeFillSubmenuItem("Goto cursor             ^G U", 0, 'U', e_d_goto_cursor);
    mainmenu[MENOPT - 5].menuitems[8] = WpeFillSubmenuItem("Finish function         ^G F", 0, 'F', e_d_finish_func);
    mainmenu[MENOPT - 5].menuitems[9] = WpeFillSubmenuItem("Trace              F7 / ^G T", 0, 'T', e_deb_trace);
    mainmenu[MENOPT - 5].menuitems[10] = WpeFillSubmenuItem("Step               F8 / ^G S", 0, 'S', e_deb_next);
    mainmenu[MENOPT - 5].menuitems[11] = WpeFillSubmenuItem("Run/Continue     ^F10 / ^G R", 0, 'R', e_deb_run);
    mainmenu[MENOPT - 5].menuitems[12] = WpeFillSubmenuItem("Quit              ^F2 / ^G Q", 0, 'Q', e_d_quit);
  }
#endif
  mainmenu[MENOPT - 3].position = -4;
  mainmenu[MENOPT - 3].width = 22;
#ifdef PROG
  if(WpeIsProg())
#ifdef DEBUGGER
    mainmenu[MENOPT - 3].no_of_items = 8;
#else
    mainmenu[MENOPT - 3].no_of_items = 7;
#endif
  else
#endif
    mainmenu[MENOPT - 3].no_of_items = 5;
  if((mainmenu[MENOPT - 3].menuitems = MALLOC(mainmenu[MENOPT - 3].no_of_items * sizeof(OPTK))) == NULL)
    e_error(e_msg[ERR_LOWMEM], 1, f->fb);
  mainmenu[MENOPT - 3].menuitems[0] = WpeFillSubmenuItem("Adjust Colors", 0, 'A', e_ad_colors);
  mainmenu[MENOPT - 3].menuitems[1] = WpeFillSubmenuItem("Save Options", 0, 'S', e_opt_save);
  mainmenu[MENOPT - 3].menuitems[2] = WpeFillSubmenuItem("Editor", 0, 'E', e_edt_options);
  mainmenu[MENOPT - 3].menuitems[3] = WpeFillSubmenuItem("File-Manager", 0, 'F', WpeFileManagerOptions);
  mainmenu[MENOPT - 3].menuitems[4] = WpeFillSubmenuItem("Help", 0, 'H', e_help_options);
#ifdef PROG
  if(WpeIsProg())
  {
    mainmenu[MENOPT - 3].menuitems[5] = WpeFillSubmenuItem("ProGramming", 3, 'G', e_program_opt);
    mainmenu[MENOPT - 3].menuitems[6] = WpeFillSubmenuItem("Compiler", 0, 'C', e_run_options);
#ifdef DEBUGGER
    mainmenu[MENOPT - 3].menuitems[7] = WpeFillSubmenuItem("Debugger", 0, 'D', e_deb_options);
#endif
  }
#endif
#ifdef NEWSTYLE
  if(WpeIsXwin())
    mainmenu[MENOPT - 2].position = -13;
  else
#endif
    mainmenu[MENOPT - 2].position = -14;
  mainmenu[MENOPT - 2].width = 28;
#ifdef DJGPP
#ifdef PROG
  mainmenu[MENOPT - 2].no_of_items = 10;
#else
  mainmenu[MENOPT - 2].no_of_items = 8;
#endif
#else
#ifdef UNIX
#ifdef PROG
  if(WpeIsProg())
#ifdef DEBUGGER
    mainmenu[MENOPT - 2].no_of_items = !WpeIsXwin()? 11 : 10;
#else
    mainmenu[MENOPT - 2].no_of_items = !WpeIsXwin()? 10 : 9;
#endif
  else
#endif
    mainmenu[MENOPT - 2].no_of_items = !WpeIsXwin()? 8 : 7;
#else
  mainmenu[MENOPT - 2].no_of_items = !WpeIsXwin()? 7 : 6;
#endif
#endif
  if((mainmenu[MENOPT - 2].menuitems = MALLOC(mainmenu[MENOPT - 2].no_of_items * sizeof(OPTK))) == NULL)
    e_error(e_msg[ERR_LOWMEM], 1, f->fb);
  if(f->ed->edopt & ED_CUA_STYLE)
  {
    mainmenu[MENOPT - 2].menuitems[0] = WpeFillSubmenuItem("Size/Move            ^L", 0, 'S', e_size_move);
    mainmenu[MENOPT - 2].menuitems[1] = WpeFillSubmenuItem("Zoom   Shift F6 / Alt Z", 0, 'Z', e_ed_zoom);
    mainmenu[MENOPT - 2].menuitems[4] = WpeFillSubmenuItem("Next        ^F6 / Alt N", 2, 'X', e_ed_next);
    mainmenu[MENOPT - 2].menuitems[5] = WpeFillSubmenuItem("Close       ^F4 / Alt X", 0, 'C', e_close_window);
  }
  else
  {
    mainmenu[MENOPT - 2].menuitems[0] = WpeFillSubmenuItem("Size/Move        Alt F2", 0, 'S', e_size_move);
    mainmenu[MENOPT - 2].menuitems[1] = WpeFillSubmenuItem("Zoom         F5 / Alt Z", 0, 'Z', e_ed_zoom);
    mainmenu[MENOPT - 2].menuitems[4] = WpeFillSubmenuItem("Next         F6 / Alt N", 2, 'X', e_ed_next);
    mainmenu[MENOPT - 2].menuitems[5] = WpeFillSubmenuItem("Close            Alt F3", 0, 'C', e_close_window);
  }
  mainmenu[MENOPT - 2].menuitems[2] = WpeFillSubmenuItem("Tile           Shift F4", 0, 'T', e_ed_tile);
  mainmenu[MENOPT - 2].menuitems[3] = WpeFillSubmenuItem("Cascade        Shift F5", 1, 'A', e_ed_cascade);
  mainmenu[MENOPT - 2].menuitems[6] = WpeFillSubmenuItem("List All          Alt 0", 0, 'L', e_list_all_win);
#ifndef DJGPP
  if(!WpeIsXwin())
#endif
    mainmenu[MENOPT - 2].menuitems[7] = WpeFillSubmenuItem("Output    Alt F5 / ^G P", 0, 'O', e_u_deb_out);
#ifdef PROG
  if(WpeIsProg())
  {
    mainmenu[MENOPT - 2].menuitems[mainmenu[MENOPT - 2].no_of_items - 2] = 
      WpeFillSubmenuItem("Messages", 0, 'M', e_p_show_messages);
    mainmenu[MENOPT - 2].menuitems[mainmenu[MENOPT - 2].no_of_items - 1] = 
      WpeFillSubmenuItem("Project", 0, 'P', e_show_project);
#ifdef DEBUGGER
    mainmenu[MENOPT - 2].menuitems[mainmenu[MENOPT - 2].no_of_items - 3] = 
      WpeFillSubmenuItem("Watches", 0, 'W', e_p_show_watches);
#endif
  }
#endif
#ifdef NEWSTYLE
  if(WpeIsXwin())
    mainmenu[MENOPT - 1].position = -21;
  else
#endif
    mainmenu[MENOPT - 1].position = -22;
  mainmenu[MENOPT - 1].width = 27;
#if defined(PROG) && !defined(DJGPP)
  mainmenu[MENOPT - 1].no_of_items = 8;
#else
  mainmenu[MENOPT - 1].no_of_items = 6;
#endif
  if((mainmenu[MENOPT - 1].menuitems = MALLOC(mainmenu[MENOPT - 1].no_of_items * sizeof(OPTK))) == NULL)
    e_error(e_msg[ERR_LOWMEM], 1, f->fb);
  mainmenu[MENOPT - 1].menuitems[0] = WpeFillSubmenuItem("Editor              F1", 0, 'E', e_help);
#if defined(PROG) && !defined(DJGPP)
  mainmenu[MENOPT - 1].menuitems[1] = WpeFillSubmenuItem("Topic Search       ^F1", 0, 'T', e_topic_search);
  mainmenu[MENOPT - 1].menuitems[2] = WpeFillSubmenuItem("FUnction Index  Alt F1", 1, 'U', e_funct_in);
/*   mainmenu[MENOPT-1].menuitems[2] = WpeFillSubmenuItem("Functions      Alt F1", 0, 'F', e_funct); */
#endif
  mainmenu[MENOPT - 1].menuitems[mainmenu[MENOPT - 1].no_of_items - 5] = 
    WpeFillSubmenuItem("Info                  ", 0, 'I', e_info);
  mainmenu[MENOPT - 1].menuitems[mainmenu[MENOPT - 1].no_of_items - 4] = 
    WpeFillSubmenuItem("Goto              <CR>", 0, 'G', e_hp_ret);
  mainmenu[MENOPT - 1].menuitems[mainmenu[MENOPT - 1].no_of_items - 3] = 
    WpeFillSubmenuItem("Back             <BSP>", 0, 'B', e_hp_back);
  mainmenu[MENOPT - 1].menuitems[mainmenu[MENOPT - 1].no_of_items - 2] = 
    WpeFillSubmenuItem("Next    Alt F8 / Alt T", 0, 'G', e_hp_next);
  mainmenu[MENOPT - 1].menuitems[mainmenu[MENOPT - 1].no_of_items - 1] = 
    WpeFillSubmenuItem("Prev.   Alt F7 / Alt V", 0, 'P', e_hp_prev);

  /* check for valid n */
  if(n < 0 || n > MENOPT - 1)
    n = 0;

  /* go until the user leaves the main control bar */
  while(c != WPE_ESC)
  {

    f = cn->f[cn->mxedt];
    if(e_tst_dfkt(f, c) == 0)
    {
      c = 0;
      break;
    }

    /* check for a menu shortcut */
    for(i = 0; i < MENOPT; i++)
      if(c == opt[i].s || c == opt[i].as)
      {
        n = i;
        c = WPE_CR;
      }

    /* if the selection is not the same as before do some drawing */
    if(nold != n)
    {
      /* paint unselected the option */
      e_pr_str_wsd(opt[nold].x, 0, opt[nold].t, f->fb->mt.fb, 0, 1,
                   f->fb->ms.fb, (nold == 0 ? 0 : opt[nold].x - e_mn_men),
       (nold == MENOPT - 1) ? MAXSCOL - 1 : opt[nold + 1].x - e_mn_men - 1);

      /* paint selected the option */
      e_pr_str_wsd(opt[n].x, 0, opt[n].t, f->fb->mz.fb, 0, 1,
                   f->fb->mz.fb, (n == 0 ? 0 : opt[n].x - e_mn_men),
             (n == MENOPT - 1) ? MAXSCOL - 1 : opt[n + 1].x - e_mn_men - 1);

      /* store the selected menu option for later use */
      nold = n;
    }

    if(c == WPE_CR)
#ifdef PROG
#ifdef DEBUGGER
    {
      if(!WpeIsProg() && n > 4)
        e_hlp = e_hlp_str[9 + n];
      else
        e_hlp = e_hlp_str[6 + n];
#else
    {
      if(!WpeIsProg() && n > 4)
        e_hlp = e_hlp_str[8 + n];
      else
        e_hlp = e_hlp_str[6 + n];
#endif
#else
    {
      e_hlp = e_hlp_str[6 + n];
#endif
      /* Handle user interaction with the submenu.
         If the user moved to another main option, the function returns. */
      if(mainmenu[n].width != 0)
        c = WpeHandleSubmenu(opt[n].x + mainmenu[n].position, 1,
                             opt[n].x + mainmenu[n].width + mainmenu[n].position, 
                             mainmenu[n].no_of_items + 2, n, mainmenu[n].menuitems, f);
      if(c < MENOPT)
      {
        n = c;
        c = WPE_CR;
      }
      else if(c != WPE_ESC)
        c = 0;
    }
    else
    {
      e_hlp = e_hlp_str[24];
#if MOUSE
      if((c = e_getch()) == -1)
        c = e_m1_mouse();
#else
      c = e_getch();
#endif
      c = e_toupper(c);
    }
    if(c == CDO || c == CtrlN)        /* down -> submenu open */
      c = WPE_CR;
    else if(c == CLE || c == CtrlB)   /* going left in the main menu */
      n--;
    else if(c == CRI || c == CtrlF)   /* going right in the main menu */
      n++;
    else if(c == POS1 || c == CtrlA)  /* most left in the main menu */
      n = 0;
    else if(c == ENDE || c == CtrlE)  /* most right in the main menu */
      n = MENOPT - 1;
    else if(c == AltX)                /* quit the whole business */
      c = e_quit(f);

    /* adjust the selected main menu */
    if(n < 0)
      n = MENOPT - 1;
    else if(n >= MENOPT)
      n = 0;
  }

  /* paint unselected the last selected main menu option */
  f = cn->f[cn->mxedt];
  e_pr_str_wsd(opt[nold].x, 0, opt[nold].t, f->fb->mt.fb, 0, 1,
               f->fb->ms.fb, (nold == 0 ? 0 : opt[nold].x - e_mn_men),
       (nold == MENOPT - 1) ? MAXSCOL - 1 : opt[nold + 1].x - e_mn_men - 1);

  /* free up the submenu structure */
  for(i = 0; i < MENOPT; i++)
    if(mainmenu[i].width != 0)
      FREE(mainmenu[i].menuitems);
  FREE(mainmenu);

  fk_cursor(1);
  return(c);
}

/* sub menu box */
int WpeHandleSubmenu(int xa, int ya, int xe, int ye, int nm, OPTK * fopt, FENSTER * f)
{
#if MOUSE
  extern struct mouse e_mouse;
  extern int      e_mn_men;
#endif
  PIC            *pic;
  int             i, n = 0, nold = 1, c = 0;
  extern OPT      opt[];

  /* save whatever will be behind the submenu */
#ifdef NEWSTYLE
  if(WpeIsXwin())
    pic = e_open_view(xa + 1, ya, xe - 1, ye, f->fb->mt.fb, 1);
  else
#endif
    pic = e_open_view(xa, ya, xe, ye, f->fb->mt.fb, 1);

  if(pic == NULL)
  {
    e_error(e_msg[ERR_LOWMEM], 0, f->fb);
    return(WPE_ESC);
  }

  /* draw the frame and the background of the submenu */
  e_std_rahmen(xa + 1, ya, xe - 1, ye, NULL, 0, f->fb->mr.fb, 0);

  /* draw the submenu items (colors are default, none selected) */
  for(i = ya + 1; i < ye; i++)
    e_pr_str_scan(xa + 3, i, fopt[i - ya - 1].t, f->fb->mt.fb, fopt[i - ya - 1].x, 1,
                  f->fb->ms.fb, xa + 2, xe - 2);

#if MOUSE
  /* show the actual changes */
  e_refresh();
  /* until mouse button released */
  while(e_mshit() != 0)
  {
    c = -1;
    /* mouse is in the range of the submenu */
    if(e_mouse.y > ya && e_mouse.y < ye)
    {
      n = e_mouse.y - ya - 1;
      /* if a new item is selected */
      if(nold != n)
      {
        /* check whether nold is in the range of the available items and unselect it */
        if(nold < ye - ya - 1 && nold >= 0)
          e_pr_str_scan(xa + 3, nold + ya + 1, fopt[nold].t, f->fb->mt.fb, fopt[nold].x,
                        1, f->fb->ms.fb, xa + 2, xe - 2);
        /* draw the newly selected item */
        e_pr_str_scan(xa + 3, n + ya + 1, fopt[n].t, f->fb->mz.fb, fopt[n].x, 1,
                      f->fb->mz.fb, xa + 2, xe - 2);
        /* save the selection */
        nold = n;
        e_refresh();
      }
    }
    /* mouse is in the main menu area */
    else if(e_mouse.y == 0)
    {
      /* search for the selected main menu option */
      for(i = 1; i < MENOPT; i++)
        if(e_mouse.x < opt[i].x - e_mn_men)
          break;
      /* check whether a new menu option has been selected */
      if(i != nm + 1)
      {
        /* if yes, restore what was behind */
        e_close_view(pic, 1);
        return(i - 1);
      }
    }
  }

  /* there was a selection and mouse is within the submenu !!! */
  if(c < 0 && e_mouse.y > ya && e_mouse.y < ye && e_mouse.x > xa &&
     e_mouse.x < xe)
    c = MBKEY;
#endif

  while(c != WPE_ESC)
  {
    if(nold != n)
    {
      /* check whether nold is in the range of the available items and unselect it */
      if(nold < ye - ya - 1 && nold >= 0)
        e_pr_str_scan(xa + 3, nold + ya + 1, fopt[nold].t, f->fb->mt.fb, fopt[nold].x,
                      1, f->fb->ms.fb, xa + 2, xe - 2);
      /* draw the newly selected item */
      e_pr_str_scan(xa + 3, n + ya + 1, fopt[n].t, f->fb->mz.fb, fopt[n].x, 1,
                    f->fb->mz.fb, xa + 2, xe - 2);
      /* save the selection */
      nold = n;
    }
#if MOUSE
    if(c != MBKEY)
    {
      if((c = e_toupper(e_getch())) == -1)
        c = e_m2_mouse(xa, ya, xe, ye, fopt);
    }
    else
      c = WPE_CR;  /* mouse released at a proper place, submenu item accepted */
#else
    c = e_toupper(e_getch());
#endif

    /* check main menu shortcut keys */
    for(i = 0; i < MENOPT; i++)
      if(c == opt[i].as)
      {
        e_close_view(pic, 1);
        return(i);
      }

    /* check submenu items' shortcut keys */
    for(i = 0; i < ye - ya - 1; i++)
      if(c == fopt[i].o)
      {
        e_close_view(pic, 1);
        fopt[i].fkt(f);
        return(WPE_ESC);
      }

    if(c == Alt0)
      c = WPE_ESC;

    if(i > ye - ya)
      c = WPE_ESC;
    else if(c == WPE_CR)     /* submenu item accepted */
    {
      e_close_view(pic, 1);
      fopt[n].fkt(f);
      return(WPE_ESC);
    }
    else if(c == CUP || c == CtrlP)     /* going up in the submenu */
      n = n > 0 ? n - 1 : ye - ya - 2;
    else if(c == CDO || c == CtrlN)     /* going down in the submenu */
      n = n < ye - ya - 2 ? n + 1 : 0;
    else if(c == CLE || c == CtrlB)     /* going left in the main menu */
    {
      c = nm > 0 ? nm - 1 : MENOPT - 1;
      break;
    }
    else if(c == CRI || c == CtrlF)     /* going right in the main menu */
    {
      c = nm < MENOPT - 1 ? nm + 1 : 0;
      break;
    }
    else if(c == POS1 || c == CtrlA)    /* to the top in the submenu */
      n = 0;
    else if(c == ENDE || c == CtrlE)    /* to the bottom in the submenu */
      n = ye - ya - 2;
    else
    {
      /* this is the anything else case, ESC, keys which are not listed in
         the submenu */
      e_close_view(pic, 1);
      if(c != WPE_ESC && e_tst_dfkt(f, c) == 0)
        return(WPE_ESC);
#ifdef NEWSTYLE
      pic = e_open_view(xa + 1, ya, xe - 1, ye, f->fb->mt.fb, 1);
#else
      pic = e_open_view(xa, ya, xe, ye, f->fb->mt.fb, 1);
#endif
      /* draw the frame for the submenu */
      e_std_rahmen(xa + 1, ya, xe - 1, ye, NULL, 0, f->fb->mr.fb, 0);
      /* draw every item in the submenu, unselected */
      for(i = ya + 1; i < ye; i++)
        e_pr_str_scan(xa + 3, i, fopt[i - ya - 1].t, f->fb->mt.fb, fopt[i - ya - 1].x, 1,
                      f->fb->ms.fb, xa + 2, xe - 2);
      /* draw the selected item */
      e_pr_str_scan(xa + 3, n + ya + 1, fopt[n].t, f->fb->mz.fb, fopt[n].x, 1,
                    f->fb->mz.fb, xa + 2, xe - 2);
    }
  }
  e_close_view(pic, 1);
  return(c == WPE_ESC ? 255 : c);
}

/*      fill "options" struct */
OPTK WpeFillSubmenuItem(char *t, int x, char o, int(*fkt) ())
{
  OPTK            opt;

  opt.t = t;
  opt.x = x;
  opt.o = o;
  opt.fkt = fkt;
  return(opt);
}



syntax highlighted by Code2HTML, v. 0.9.1