home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / magazine / nvdc87 / extrac / menu.pro < prev    next >
Text File  |  1987-07-28  |  6KB  |  186 lines

  1. /****************************************************************
  2.  
  3.      Turbo Prolog Toolbox
  4.      (C) Copyright 1987 Borland International.
  5.  
  6.              menu
  7.   Implements a popup menu with at most 23 possible choices.
  8.   For more than 23 possible choices use longmenu.
  9.  
  10.   The up and down arrow keys can be used to move the bar.
  11.   RETURN or F10  will select an indicated item.
  12.   Pressing Esc aborts menu selection and returns zero.
  13.  
  14.   The arguments to menu are:
  15.   
  16.   menu(ROW,COL,WINDOWATTR,FRAMEATTR,STRINGLIST,HEADER,STARTCHOICE,
  17.        SELECTION)
  18.  
  19.     ROW and COL determines the position of the window
  20.     WATTR and FATTR determine the attributes for the window
  21.         and its frame - if FATTR is zero there
  22.         will be no frame around the window.
  23.     STRINGLIST is the list of menu items
  24.     HEADER is the text to appear at the top of the menu window
  25.     STARTCHOICE determines where the bar should be placed.
  26.  
  27.   Ex:     menu(5,5,7,7,[this,is,a,test],"select word",0,CHOICE)
  28.  
  29. ****************************************************************/
  30.  
  31. PREDICATES
  32. /* START DELETION
  33.   menu(ROW,COL,ATTR,ATTR,STRINGLIST,STRING,INTEGER,INTEGER)
  34. END DELETION*/
  35.   menuinit(ROW,COL,ATTR,ATTR,STRINGLIST,STRING,ROW,COL)
  36. /* START DELETION
  37.   menu1(SYMBOL,ROW,ATTR,STRINGLIST,ROW,COl,INTEGER)
  38. END DELETION */
  39.   menu2(KEY,STRINGLIST,ROW,ROW,ROW,SYMBOL)
  40.  
  41. CLAUSES
  42. /* START DELETION
  43.   menu(ROW,COL,WATTR,FATTR,LIST,HEADER,STARTCHOICE,CHOICE) :-
  44.     menuinit(ROW,COL,WATTR,FATTR,LIST,HEADER,NOOFROW,LEN),
  45.     ST1=STARTCHOICE-1,max(0,ST1,ST2),MAX=NOOFROW-1,
  46.     min(ST2,MAX,STARTROW),
  47.     menu1(cont,STARTROW,WATTR,LIST,NOOFROW,LEN,CHOICE),
  48.     removewindow.
  49. END DELETION */
  50.  
  51.   menuinit(ROW,COL,WATTR,FATTR,LIST,HEADER,NOOFROW,NOOFCOL):-
  52.     maxlen(LIST,0,MAXNOOFCOL),
  53.     str_len(HEADER,HEADLEN),
  54.     HEADL1=HEADLEN+4,
  55.     max(HEADL1,MAXNOOFCOL,NOOFCOL),
  56.     listlen(LIST,LEN), LEN>0,
  57.     NOOFROW=LEN,
  58.     adjframe(FATTR,NOOFROW,NOOFCOL,HH1,HH2),
  59.     adjustwindow(ROW,COL,HH1,HH2,AROW,ACOL),
  60.     makewindow(81,WATTR,FATTR,HEADER,AROW,ACOL,HH1,HH2),
  61.     writelist(0,NOOFCOL,LIST).
  62.  
  63. /* START DELETION
  64.   menu1(cont,ROW,ATTR,LIST,MAXROW,NOOFCOL,CHOICE):-!,
  65.     reverseattr(ATTR,REV),
  66.     field_attr(ROW,0,NOOFCOL,REV),
  67.     cursor(ROW,0),
  68.     readkey(KEY),
  69.     field_attr(ROW,0,NOOFCOL,ATTR),
  70.     menu2(KEY,LIST,MAXROW,ROW,NEXTROW,CONT),
  71.     menu1(CONT,NEXTROW,ATTR,LIST,MAXROW,NOOFCOL,CHOICE).
  72.   menu1(esc,ROW,_,_,_,_,CHOICE):-!,CHOICE=ROW+1.
  73.   menu1(_,ROW,ATTR,_,_,NOOFCOL,CHOICE):-
  74.     CHOICE=ROW+1,
  75.     reverseattr(ATTR,REV),
  76.     field_attr(ROW,0,NOOFCOL,REV).
  77. END DELETION */    
  78.  
  79.   menu2(esc,_,_,_,-1,esc):-!.
  80.   menu2(fkey(10),_,_,ROW,ROW,stop):-!.
  81.   menu2(char(C),LIST,_,_,CH,selection):-tryletter(C,LIST,CH),!.
  82. /*menu2(fkey(1),_,_,ROW,ROW,cont):-!,help.  If a help system is 
  83.   used */
  84.   menu2(cr,_,_,ROW,CH,selection):-!,CH=ROW.
  85.   menu2(up,_,_,ROW,NEXTROW,cont):-ROW>0,!,NEXTROW=ROW-1.
  86.   menu2(down,_,MAXROW,ROW,NEXTROW,cont):-
  87.         NEXTROW=ROW+1,
  88.         NEXTROW<MAXROW,!.
  89.   menu2(end,_,MAXROW,_,NEXT,cont):-!,NEXT=MAXROW-1.
  90.   menu2(pgdn,_,MAXROW,_,NEXT,cont):-!,NEXT=MAXROW-1.
  91.   menu2(home,_,_,_,0,cont):-!.
  92.   menu2(pgup,_,_,_,0,cont):-!.
  93.   menu2(_,_,_,ROW,ROW,cont).
  94.  
  95.  
  96. /* START DELETION
  97. /****************************************************************/
  98. /*             menu_leave                */
  99. /* As menu but the window is not removed on return.        */
  100. /****************************************************************/
  101.  
  102. PREDICATES
  103.   menu_leave(ROW,COL,ATTR,ATTR,STRINGLIST,STRING,INTEGER,INTEGER)
  104.  
  105. CLAUSES
  106.   menu_leave(ROW,COL,WATTR,FATTR,LIST,HEADER,STARTCHOICE,CHOICE) :-
  107.     menuinit(ROW,COL,WATTR,FATTR,LIST,HEADER,NOOFROW,NOOFCOL),
  108.     ST1=STARTCHOICE-1,max(0,ST1,ST2),MAX=NOOFROW-1,
  109.     min(ST2,MAX,STARTROW),
  110.     menu1(cont,STARTROW,WATTR,LIST,NOOFROW,NOOFCOL,CHOICE).
  111.  
  112. END DELETION */
  113.  
  114. /****************************************************************
  115.              menu_mult
  116.  Implements a popup-menu which allows a multiple number of
  117.  selections.
  118.  
  119.  Each selection is made by pressing RETURN. All selections are
  120.  then activated by pressing F10.
  121.  
  122.   The arguments to menu_mult are:
  123.   
  124.   menu(ROW,COL,WINDOWATTR,FRAMEATTR,STRINGLIST,HEADER,STARTLIST,
  125.        NEWLIST)
  126.  
  127.     ROW and COL determine the position of the window
  128.     WATTR and FATTR determine the attributes for the window
  129.         and its frame - if FATTR is zero there
  130.         will be no frame around the window.
  131.     STRINGLIST is the list of menu items
  132.     HEADER is the text to appear at the top of the menu window
  133.     STARTLIST determines the items to be highlighted when
  134.           the menu is first displayed
  135.     NEWLIST   contains the list of selections
  136.  
  137.   Ex: menu_mult(5,5,7,7,[this,is,a,test],"select words",[1],NEWLIST)
  138.  
  139. ****************************************************************/
  140.  
  141. PREDICATES
  142.   menu_mult(ROW,COL,ATTR,ATTR,STRINGLIST,STRING,INTEGERLIST,
  143.             INTEGERLIST)
  144.   multmenu1(SYMBOL,ROW,ATTR,STRINGLIST,ROW,COL,INTEGERLIST,
  145.             INTEGERLIST)
  146.   highlight_selected(INTEGERLIST,COL,ATTR)
  147.   handle_selection(INTEGER,INTEGERLIST,INTEGERLIST,COL,ATTR)
  148.   try_del(INTEGER,INTEGERLIST,INTEGERLIST,COL,ATTR)
  149.  
  150. CLAUSES
  151.   menu_mult(ROW,COL,WATTR,FATTR,LIST,HEADER,STARTCHLIST,CHLIST) :-
  152.     menuinit(ROW,COL,WATTR,FATTR,LIST,HEADER,NOOFROW,NOOFCOL),
  153.     multmenu1(cont,0,WATTR,LIST,NOOFROW,NOOFCOL,STARTCHLIST,
  154.               CHLIST),
  155.     removewindow.
  156.  
  157.   multmenu1(stop,_,_,_,_,_,CHL,CHL):-!.
  158.   multmenu1(esc,_,_,_,_,_,_,[]):-!.
  159.   multmenu1(selection,ROW,ATTR,LIST,MAXROW,NOOFCOL,OLDCHLIN,CHLOUT):-
  160.     CHOICE=1+ROW,
  161.     handle_selection(CHOICE,OLDCHLIN,NEWCHLIN,NOOFCOL,ATTR),
  162.     multmenu1(cont,ROW,ATTR,LIST,MAXROW,NOOFCOL,NEWCHLIN,CHLOUT).
  163.   multmenu1(cont,ROW,ATTR,LIST,MAXROW,NOOFCOL,CHLIN,CHLOUT):-
  164.     reverseattr(ATTR,REV),
  165.     highlight_selected(CHLIN,NOOFCOL,REV),
  166.     cursor(ROW,0),
  167.     readkey(KEY),
  168.     menu2(KEY,LIST,MAXROW,ROW,NEXTROW,CONT),
  169.     multmenu1(CONT,NEXTROW,ATTR,LIST,MAXROW,NOOFCOL,CHLIN,CHLOUT).
  170.  
  171.   highlight_selected([],_,_).
  172.   highlight_selected([H|T],L,ATTR):-
  173.     ROW=H-1,
  174.     field_attr(ROW,0,L,ATTR),
  175.     highlight_selected(T,L,ATTR).
  176.  
  177.   try_del(SELECTION,[SELECTION|REST],REST,LEN,ATTR):-
  178.     ROW=SELECTION-1,
  179.     field_attr(ROW,0,LEN,ATTR),!.
  180.   try_del(SELECTION,[H|REST],[H|REST1],LEN,ATTR):-
  181.     try_del(SELECTION,REST,REST1,LEN,ATTR).
  182.  
  183.   handle_selection(SELECTION,OLDCHIN,NEWCHIN,LEN,ATTR):-
  184.     try_del(SELECTION,OLDCHIN,NEWCHIN,LEN,ATTR),!.
  185.   handle_selection(SELECTION,OLDCHIN,[SELECTION|OLDCHIN],_,_).
  186.