new menu.m improved (menu2.m)

<[email protected]> Thu, 25 Dec 2003 19:48:51 -0600
Newsgroups gmane.comp.gnu.octave.sources
Message-ID <[email protected]>
Hi I rewrote the menu.m again in order to make it compatible with menu.m
(now I think this function can substitute manu.m), and now it can have a
lot of shortcuts for every option.

you can get this combination:

Title
[1] [a] hello
[2] [b] [B] bye
[3] [f] [F] [g] [s] see you
[4] [q] [Q] quit

using:

menu2("Title",["a";"hello"],["b";"B";"bye"];["f";"F";"g";"s";"see
you"];["q";"Q";"quit"])

It is possible I don't explain correctly becouse my poor english, if
somebody think the help must be cahanged, please correct it.

see the code
-----------------------
## Copyright (C) 1996, 1997 John W. Eaton
##
## This file is part of Octave.
##
## Octave is free software; you can redistribute it and/or modify it
## under the terms of the GNU General Public License as published by
## the Free Software Foundation; either version 2, or (at your option)
## any later version.
##
## Octave is distributed in the hope that it will be useful, but
## WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
## General Public License for more details.
##
## You should have received a copy of the GNU General Public License
## along with Octave; see the file COPYING.  If not, write to the Free
## Software Foundation, 59 Temple Place - Suite 330, Boston, MA
## 02111-1307, USA.

## -*- texinfo -*-
## @deftypefn {Function File} {} menu (@var{title}, @var{opt1}, @dots{})
## Print a title string followed by a series of options.  Each option will
## be printed along with a number.  The return value is the number of the
## option selected by the user.  This function is useful for interactive
## programs.  There is no limit to the number of options that may be passed
## in, but it may be confusing to present more than will fit easily on one
## screen.
## @end deftypefn
## @seealso{disp, printf, and input}

## Author: pablo busto based on menu.m from jwe 

function num = menu2 (t, varargin)
if (nargin < 2)
    printf ("usage:");
    printf ("menu3 (title, opt1, opt2, ...)\n");
    printf ("where opt1 is [\"shorcut1\";\"shortcut2\",text]\n");
    printf ("example:  menu3 (tittle, [\"Aa..\";\"OptA\"],
[\"Bb..\";\"OptB\"]...)\n\n");
  endif
  

  ## Force pending output to appear before the menu.

  fflush (stdout);

  ## Don't send the menu through the pager since doing that can cause
  ## major confusion.

  save_page_screen_output = page_screen_output;

  unwind_protect

    page_screen_output = 0;

    if (! isempty (t))
      disp (t);
      printf ("\n");
    endif

    nopt = nargin - 1;

    while (1)
      for i = [1:nopt]
          printf ("  [%i] ",i);
          [m,n]=size(varargin{i});
          shortcuts(1,i)=num2str(i);
          for i2=[1:(m-1)]
            printf ("[%s] ",varargin{i}(i2,1));
            shortcuts(i2+1,i)=varargin{i}(i2,1);
          endfor
          printf(" %s\n",varargin{i}(m,:));
        #disp (varargin{i});
      endfor
      shortcuts;
      [m2,n2]=size(shortcuts);
      shortcuts=reshape(shortcuts,1,m2*n2);

      printf ("\n");

      s = input ("choose one : ", "s");

      k=findstr(s,shortcuts);        #k evals total coincidences
      if !(isempty(k))
        a=(k(1));    #Ichoose the 1st coincidence
        num=floor(((a-1)/m2)+1);
      else
        num=0;
      endif

      if num ==0
        printf ("\nerror: input invalid or out of range\n\n");
      else
        break;
      endif
    endwhile

  unwind_protect_cleanup

    page_screen_output = save_page_screen_output;

  end_unwind_protect

endfunction
------------------

Regards,

Pablo Busto González