home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 5 Edit / 05-Edit.zip / ME22-OS2.ZIP / MACROS.ZIP / MENU.M < prev    next >
Text File  |  1988-01-06  |  5KB  |  241 lines

  1. /*
  2.   MENU menu-name r1, c1, r2, c2 [COLOR color]
  3.   {
  4.     text     [->function]
  5.     ......
  6.   }
  7. */
  8.  
  9. #define HORIZ 1
  10. #define VERT  2
  11. #define TOP_LEFT  3
  12. #define TOP_RIGHT 4
  13. #define BOT_LEFT  5
  14. #define BOT_RIGHT 6
  15.  
  16. #define DOWN    208
  17. #define UP      200
  18.  
  19. string BoxChars[10];
  20.  
  21. int MenuRow1, MenuCol1, MenuRow2, MenuCol2;
  22. int MenuColor;
  23. string MenuName;
  24. int debug;
  25.  
  26.  
  27. do_menu(menuname)
  28.   string menuname;
  29. {
  30.   debug = 0;
  31.  
  32.   old_buf = currbuf();
  33.  
  34.   /*
  35.      The format of a menu is :
  36.        MENU menu-name row1, col1, row2, col2 [COLOR colornum]
  37.        {
  38.          text1          [->function]
  39.          .....          ............
  40.        }
  41.   */
  42.  
  43.   if (!index(menuname, ".mnu"))
  44.     menuname = strcat(menuname, ".mnu");
  45.   new_buf = setcurrbuf(create_buffer(menuname));
  46.   setcol(1);
  47.  
  48.   if (MenuParse() < 0)
  49.   {
  50.     delete_buffer(new_buf);
  51.     show_buffer(old_buf);
  52.     return;
  53.   }
  54.   
  55.   win_id = create_window(MenuRow1+1, MenuCol1+1, MenuRow2-1, MenuCol2-1, MenuColor);
  56.   attach_window(win_id, new_buf);
  57.   gobof();
  58.   DrawBox(MenuRow1-1, MenuCol1, MenuRow2-1, MenuCol2, MenuColor);
  59.   
  60.   MenuProcess();
  61.  
  62.   delete_buffer(new_buf);
  63.   show_buffer(old_buf);
  64.   refresh();
  65. }
  66.  
  67.  
  68. MenuParse()
  69. {
  70.   if (get_token() != "MENU")
  71.   {
  72.     message("The file is not a menu deinition file");
  73.     get_tty_char();
  74.     return -1;
  75.   }
  76.   MenuName = get_token();
  77.   MenuRow1 = get_int_token();
  78.   MenuCol1 = get_int_token();
  79.   MenuRow2 = get_int_token();
  80.   MenuCol2 = get_int_token();
  81.   
  82.   if ((s = get_token()) == "COLOR")
  83.   {
  84.     MenuColor = get_int_token();
  85.     s = get_token();
  86.   }
  87.   else
  88.     MenuColor = 07;
  89.  
  90.   if (s != "{")
  91.   {
  92.     message("Missing '{' in menu definition");
  93. /*
  94.     get_tty_char();
  95.     return -1;
  96. */
  97.   }
  98.  
  99.   start_text_line = currlinenum();
  100.  
  101.   /* Get rid of the Menu Defn line and the opening brace */
  102.   gobof();
  103.   setcount(start_text_line-1);
  104.   delline();
  105.   
  106.   /* Get rid of the ending brace */
  107.   if (fsearch("}") > 0)
  108.     delline();
  109.   /* Get rid of any trailing blank lines */
  110.   while (strlen(currline()) == 0)
  111.     delline();
  112.     
  113.   return 1;
  114. }
  115.  
  116. get_token()
  117. {
  118.   string s;
  119.  
  120.   if (is_eol() || currchar() == " ")
  121.     nextword();
  122.  
  123.   if (is_eof())
  124.     return "";
  125.  
  126.   start = currcol();
  127.   while (!is_eol() && currchar() != ' ')
  128.     right();
  129.   s = substr(currline(), start, currcol() - start);
  130.   nextword();
  131.   if (debug)
  132.     get_tty_str(sprintf("GET_TOKEN - s is [%s]", s));
  133.   return s;
  134. }
  135.  
  136. get_int_token()
  137. {
  138.   n = atoi(get_token());
  139.   if (debug)
  140.     get_tty_str(sprintf("GET_INT_TOKEN - n is %d", n));
  141.   return n;
  142. }
  143.  
  144. /* ------------------------- MENU PROCESSING ------------------------- */
  145.  
  146. #define ESC   27
  147. #define UP    200
  148. #define DOWN  208
  149.  
  150. MenuProcess()
  151. {
  152.   markline();
  153.  
  154. do_it:
  155.   while ((c = get_tty_char()) != '\n' && c != ESC)
  156.   {
  157.     switch (c)
  158.     {
  159.       case UP   :
  160.         MenuUp();
  161.         break;
  162.       case DOWN :
  163.         MenuDown();
  164.         break;
  165.       default   :
  166.         bell();
  167.         break;
  168.     }
  169.   }
  170.   
  171.   if (c == '\n')
  172.   {
  173.     cln = currlinenum();
  174.  
  175.     if ((i = index(currline(), "->")) > 0)
  176.     {
  177.       macname = substr(currline(), i+2, 100);
  178.       domacro(macname);
  179.     }
  180.  
  181.     DrawBox(MenuRow1-1, MenuCol1, MenuRow2-1, MenuCol2, MenuColor);
  182.     goline(cln);
  183.     goto do_it;
  184.   }
  185. }
  186.  
  187.  
  188. MenuUp()
  189. {
  190.   if (currlinenum() > 1)
  191.   {
  192.     clear_mark();
  193.     up();
  194.     markline();
  195.   }
  196. }
  197.  
  198. MenuDown()
  199. {
  200.   if (currlinenum() < lastlinenum())
  201.   {
  202.     clear_mark();
  203.     down();
  204.     markline();
  205.   }
  206. }
  207.  
  208. DrawBox(row1, col1, row2, col2, color)
  209. {
  210.   BoxChars[HORIZ]     = "═";
  211.   BoxChars[VERT]      = "║";
  212.   BoxChars[TOP_LEFT]  = "╔";
  213.   BoxChars[TOP_RIGHT] = "╗";
  214.   BoxChars[BOT_LEFT]  = "╚";
  215.   BoxChars[BOT_RIGHT] = "╝";
  216.   
  217.   start_row = row1;
  218.   start_col = col1;
  219.   end_row   = row2;
  220.   end_col   = col2;
  221.  
  222.   width = col2 - col1 + 1;
  223.   horiz_line = repstr(BoxChars[HORIZ], width - 2);
  224.   blank_line = repstr(" ", width - 2);
  225.  
  226.   display(row1, col1 + 1, col1 + width - 1,  color, horiz_line);
  227.   display(row2, col1 + 1, col1 + width - 1,  color, horiz_line);
  228.   for (r = row1+1;  r < row2;  r++)
  229.   {
  230.     display(r, col1, col1, color, BoxChars[VERT]);
  231. /*  display(r, col1+1, col2-1, color, blank_line); */
  232.     display(r, col2, col2, color, BoxChars[VERT]);
  233.   }
  234.   display(row1, col1, col1,  color, BoxChars[TOP_LEFT]);
  235.   display(row1, col2, col2,  color, BoxChars[TOP_RIGHT]);
  236.   display(row2, col1, col1,  color, BoxChars[BOT_LEFT]);
  237.   display(row2, col2, col2,  color, BoxChars[BOT_RIGHT]);
  238. }
  239.  
  240.  
  241.