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