home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / magazine / nvdc87 / extrac / menu1.pro < prev    next >
Text File  |  1987-07-28  |  6KB  |  176 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.   menu(ROW,COL,ATTR,ATTR,STRINGLIST,STRING,INTEGER,INTEGER)
  33.   menuinit(ROW,COL,ATTR,ATTR,STRINGLIST,STRING,ROW,COL)
  34.   menu1(SYMBOL,ROW,ATTR,STRINGLIST,ROW,COl,INTEGER)
  35.   menu2(KEY,STRINGLIST,ROW,ROW,ROW,SYMBOL)
  36.  
  37. CLAUSES
  38.   menu(ROW,COL,WATTR,FATTR,LIST,HEADER,STARTCHOICE,CHOICE) :-
  39.     menuinit(ROW,COL,WATTR,FATTR,LIST,HEADER,NOOFROW,LEN),
  40.     ST1=STARTCHOICE-1,max(0,ST1,ST2),MAX=NOOFROW-1,
  41.     min(ST2,MAX,STARTROW),
  42.     menu1(cont,STARTROW,WATTR,LIST,NOOFROW,LEN,CHOICE),
  43.     removewindow.
  44.  
  45.   menuinit(ROW,COL,WATTR,FATTR,LIST,HEADER,NOOFROW,NOOFCOL):-
  46.     maxlen(LIST,0,MAXNOOFCOL),
  47.     str_len(HEADER,HEADLEN),
  48.     HEADL1=HEADLEN+4,
  49.     max(HEADL1,MAXNOOFCOL,NOOFCOL),
  50.     listlen(LIST,LEN), LEN>0,
  51.     NOOFROW=LEN,
  52.     adjframe(FATTR,NOOFROW,NOOFCOL,HH1,HH2),
  53.     adjustwindow(ROW,COL,HH1,HH2,AROW,ACOL),
  54.     makewindow(81,WATTR,FATTR,HEADER,AROW,ACOL,HH1,HH2),
  55.     writelist(0,NOOFCOL,LIST).
  56.  
  57.   menu1(cont,ROW,ATTR,LIST,MAXROW,NOOFCOL,CHOICE):-!,
  58.     reverseattr(ATTR,REV),
  59.     field_attr(ROW,0,NOOFCOL,REV),
  60.     cursor(ROW,0),
  61.     readkey(KEY),
  62.     field_attr(ROW,0,NOOFCOL,ATTR),
  63.     menu2(KEY,LIST,MAXROW,ROW,NEXTROW,CONT),
  64.     menu1(CONT,NEXTROW,ATTR,LIST,MAXROW,NOOFCOL,CHOICE).
  65.   menu1(esc,ROW,_,_,_,_,CHOICE):-!,CHOICE=ROW+1.
  66.   menu1(_,ROW,ATTR,_,_,NOOFCOL,CHOICE):-
  67.     CHOICE=ROW+1,
  68.     reverseattr(ATTR,REV),
  69.     field_attr(ROW,0,NOOFCOL,REV).
  70.  
  71.   menu2(esc,_,_,_,-1,esc):-!.
  72.   menu2(fkey(10),_,_,ROW,ROW,stop):-!.
  73.   menu2(char(C),LIST,_,_,CH,selection):-tryletter(C,LIST,CH),!.
  74. /*menu2(fkey(1),_,_,ROW,ROW,cont):-!,help.  If a help system is 
  75.   used */
  76.   menu2(cr,_,_,ROW,CH,selection):-!,CH=ROW.
  77.   menu2(up,_,_,ROW,NEXTROW,cont):-ROW>0,!,NEXTROW=ROW-1.
  78.   menu2(down,_,MAXROW,ROW,NEXTROW,cont):-
  79.         NEXTROW=ROW+1,
  80.         NEXTROW<MAXROW,!.
  81.   menu2(end,_,MAXROW,_,NEXT,cont):-!,NEXT=MAXROW-1.
  82.   menu2(pgdn,_,MAXROW,_,NEXT,cont):-!,NEXT=MAXROW-1.
  83.   menu2(home,_,_,_,0,cont):-!.
  84.   menu2(pgup,_,_,_,0,cont):-!.
  85.   menu2(_,_,_,ROW,ROW,cont).
  86.  
  87.  
  88. /****************************************************************/
  89. /*             menu_leave                */
  90. /* As menu but the window is not removed on return.        */
  91. /****************************************************************/
  92.  
  93. PREDICATES
  94.   menu_leave(ROW,COL,ATTR,ATTR,STRINGLIST,STRING,INTEGER,INTEGER)
  95.  
  96. CLAUSES
  97.   menu_leave(ROW,COL,WATTR,FATTR,LIST,HEADER,STARTCHOICE,CHOICE) :-
  98.     menuinit(ROW,COL,WATTR,FATTR,LIST,HEADER,NOOFROW,NOOFCOL),
  99.     ST1=STARTCHOICE-1,max(0,ST1,ST2),MAX=NOOFROW-1,
  100.     min(ST2,MAX,STARTROW),
  101.     menu1(cont,STARTROW,WATTR,LIST,NOOFROW,NOOFCOL,CHOICE).
  102.  
  103.  
  104. /****************************************************************
  105.              menu_mult
  106.  Implements a popup-menu which allows a multiple number of
  107.  selections.
  108.  
  109.  Each selection is made by pressing RETURN. All selections are
  110.  then activated by pressing F10.
  111.  
  112.   The arguments to menu_mult are:
  113.   
  114.   menu(ROW,COL,WINDOWATTR,FRAMEATTR,STRINGLIST,HEADER,STARTLIST,
  115.        NEWLIST)
  116.  
  117.     ROW and COL determine the position of the window
  118.     WATTR and FATTR determine the attributes for the window
  119.         and its frame - if FATTR is zero there
  120.         will be no frame around the window.
  121.     STRINGLIST is the list of menu items
  122.     HEADER is the text to appear at the top of the menu window
  123.     STARTLIST determines the items to be highlighted when
  124.           the menu is first displayed
  125.     NEWLIST   contains the list of selections
  126.  
  127.   Ex: menu_mult(5,5,7,7,[this,is,a,test],"select words",[1],NEWLIST)
  128.  
  129. ****************************************************************/
  130.  
  131. PREDICATES
  132.   menu_mult(ROW,COL,ATTR,ATTR,STRINGLIST,STRING,INTEGERLIST,
  133.             INTEGERLIST)
  134.   multmenu1(SYMBOL,ROW,ATTR,STRINGLIST,ROW,COL,INTEGERLIST,
  135.             INTEGERLIST)
  136.   highlight_selected(INTEGERLIST,COL,ATTR)
  137.   handle_selection(INTEGER,INTEGERLIST,INTEGERLIST,COL,ATTR)
  138.   try_del(INTEGER,INTEGERLIST,INTEGERLIST,COL,ATTR)
  139.  
  140. CLAUSES
  141.   menu_mult(ROW,COL,WATTR,FATTR,LIST,HEADER,STARTCHLIST,CHLIST) :-
  142.     menuinit(ROW,COL,WATTR,FATTR,LIST,HEADER,NOOFROW,NOOFCOL),
  143.     multmenu1(cont,0,WATTR,LIST,NOOFROW,NOOFCOL,STARTCHLIST,
  144.               CHLIST),
  145.     removewindow.
  146.  
  147.   multmenu1(stop,_,_,_,_,_,CHL,CHL):-!.
  148.   multmenu1(esc,_,_,_,_,_,_,[]):-!.
  149.   multmenu1(selection,ROW,ATTR,LIST,MAXROW,NOOFCOL,OLDCHLIN,CHLOUT):-
  150.     CHOICE=1+ROW,
  151.     handle_selection(CHOICE,OLDCHLIN,NEWCHLIN,NOOFCOL,ATTR),
  152.     multmenu1(cont,ROW,ATTR,LIST,MAXROW,NOOFCOL,NEWCHLIN,CHLOUT).
  153.   multmenu1(cont,ROW,ATTR,LIST,MAXROW,NOOFCOL,CHLIN,CHLOUT):-
  154.     reverseattr(ATTR,REV),
  155.     highlight_selected(CHLIN,NOOFCOL,REV),
  156.     cursor(ROW,0),
  157.     readkey(KEY),
  158.     menu2(KEY,LIST,MAXROW,ROW,NEXTROW,CONT),
  159.     multmenu1(CONT,NEXTROW,ATTR,LIST,MAXROW,NOOFCOL,CHLIN,CHLOUT).
  160.  
  161.   highlight_selected([],_,_).
  162.   highlight_selected([H|T],L,ATTR):-
  163.     ROW=H-1,
  164.     field_attr(ROW,0,L,ATTR),
  165.     highlight_selected(T,L,ATTR).
  166.  
  167.   try_del(SELECTION,[SELECTION|REST],REST,LEN,ATTR):-
  168.     ROW=SELECTION-1,
  169.     field_attr(ROW,0,LEN,ATTR),!.
  170.   try_del(SELECTION,[H|REST],[H|REST1],LEN,ATTR):-
  171.     try_del(SELECTION,REST,REST1,LEN,ATTR).
  172.  
  173.   handle_selection(SELECTION,OLDCHIN,NEWCHIN,LEN,ATTR):-
  174.     try_del(SELECTION,OLDCHIN,NEWCHIN,LEN,ATTR),!.
  175.   handle_selection(SELECTION,OLDCHIN,[SELECTION|OLDCHIN],_,_).
  176.