home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 9 / 09.iso / l / l216 / 1.ddi / BOXMENU.PRO < prev    next >
Encoding:
Prolog Source  |  1987-03-23  |  9.6 KB  |  224 lines

  1. /****************************************************************
  2.  
  3.      Turbo Prolog Toolbox
  4.      (C) Copyright 1987 Borland International.
  5.  
  6.              boxmenu
  7.   boxmenu(ROW,COL,NOOFROWS,NOOFCOLS,WATTR,FATTR,STRINGLIST,HEADER,STCHOICE,CHOICE)
  8.     ROW and COL determine the position of the window
  9.     WATTR and FATTR determine the attributes for the window
  10.         and its frame - if FATTR is zero there
  11.         will be no frame around the window.
  12.     NOOFROWS determines the number of rows in the window
  13.     NOOFCOLS determines the number of columns in the window
  14.     STRINGLIST is a list of items on the menu
  15.     HEADER is the text to be displayed at the top of the menu window
  16.     STARTCHOICE determines where the bar should be placed.
  17.  
  18.   Ex:     boxmenu(5,5,7,40,7,5,[a,b,c,d,e,f,g,h,i,j,k,l,m,n],letters,0,CHOICE)
  19.  
  20. ****************************************************************/
  21.  
  22. DOMAINS
  23.   BASE = INTEGER
  24. PREDICATES
  25.   boxmenu(ROW,COL,ROW,COL,ATTR,ATTR,STRINGLIST,STRING,INTEGER,INTEGER)
  26.   boxmenuinit(ROW,COL,ROW,COL,ATTR,ATTR,STRINGLIST,STRING,COL,COL,BASE)
  27.   boxmenu1(SYMBOL,BASE,BASE,ROW,COL,ROW,COL,COL,BASE,ATTR,STRINGLIST,BASE,ROW,COL)
  28.   boxmenu2(KEY,BASE,ROW,COL,BASE,ROW,COL,BASE,ROW,COL,SYMBOL)
  29.   boxmenu3(BASE,ROW,COL,BASE,ROW,COL,BASE,ROW,COL)
  30.   wr_boxpart_if_changed(BASE,BASE,ROW,COL,COL,STRINGLIST)
  31.   write_boxpart_list(BASE,BASE,ROW,COL,COL,STRINGLIST)
  32.  
  33. CLAUSES
  34.   boxmenu(ROW,COL,DROW,DCOL,WATTR,FATTR,STRINGLIST,HEADER,STCHOICE,CHOICE) :-
  35.     boxmenuinit(ROW,COL,DROW,DCOL,WATTR,FATTR,STRINGLIST,HEADER,NOOFCOLS,STRLEN,LISTLEN),
  36.     MB=LISTLEN,ST1=STCHOICE-1,max(0,ST1,ST2),min(MB,ST2,ST3),
  37.     STBASE=ST3-ST3 mod(DROW*NOOFCOLS), STROW=(ST3-STBASE) div NOOFCOLS, STCOL=ST3-STBASE-STROW*NOOFCOLS,
  38.     boxmenu1(cont,-1,STBASE,STROW,STCOL,DROW,NOOFCOLS,STRLEN,LISTLEN,WATTR,STRINGLIST,BASE1,ROW1,COL1),
  39.     CHOICE = BASE1 + ROW1*NOOFCOLS + COL1 +1,
  40.     removewindow.
  41.  
  42.   boxmenuinit(ROW,COL,DROW,DCOL,WATTR,FATTR,STRINGLIST,HEADER,NOOFCOLS,MAXLEN,LISTLEN):-
  43.     listlen(STRINGLIST,N), N > 0, LISTLEN=N,
  44.     maxlen(STRINGLIST,0,STRLEN),MAXLEN=STRLEN+1,
  45.     NOOFCOLS=DCOL div MAXLEN,
  46.     adjframe(FATTR,DROW,DCOL,HH1,HH2),
  47.     adjustwindow(ROW,COL,HH1,HH2,AROW,ACOL),
  48.     makewindow(81,WATTR,FATTR,HEADER,AROW,ACOL,HH1,HH2).
  49.  
  50.   /* STOP,OLDBASE,BASE,ROW,COL,NOOFROWS,NOOFCOLS,STRLEN,LISTLEN,ATTR,STRINGLIST,BASE1,ROW1,COL1 */
  51.   boxmenu1(cont,OLDBASE,BASE,ROW,COL,DROW,DCOL,STRLEN,LISTLEN,ATTR,STRINGLIST,BASE2,ROW2,COL2):-!,
  52.     wr_boxpart_if_changed(OLDBASE,BASE,DROW,DCOL,STRLEN,STRINGLIST),
  53.     reverseattr(ATTR,REV),
  54.     CC=COL*STRLEN,
  55.     LEN=STRLEN-1,
  56.     field_attr(ROW,CC,LEN,REV),
  57.     cursor(ROW,CC),
  58.     readkey(KEY),
  59.     boxmenu2(KEY,LISTLEN,DROW,DCOL,BASE,ROW,COL,BASE1,ROW1,COL1,STOP),
  60.     field_attr(ROW,CC,LEN,ATTR),
  61.     boxmenu1(STOP,BASE,BASE1,ROW1,COL1,DROW,DCOL,STRLEN,LISTLEN,ATTR,STRINGLIST,BASE2,ROW2,COL2).
  62.   boxmenu1(esc,_,BASE,ROW,COL,_,_,_,_,_,_,BASE,ROW,COL):-!.
  63.   boxmenu1(_,_,BASE,ROW,COL,_,_,STRLEN,_,ATTR,_,BASE,ROW,COL):-
  64.     CC=COL*STRLEN,
  65.     reverseattr(ATTR,REV),
  66.     field_attr(ROW,CC,STRLEN,REV).
  67.  
  68. /* KEY,LISTLEN,DROW,DCOL,BASE,ROW,COL,BASE1,ROW1,COL1,STOP */
  69.   boxmenu2(esc,_,_,_,_,_,_,0,0,-1,esc):-!.
  70.   boxmenu2(fkey(10),_,_,_,B,R,C,B,R,C,stop):-!.
  71. /*boxmenu2(fkey(1),_,_,_,B,R,C,B,R,C,cont):-!,help. If helpsystem is used  */
  72.   boxmenu2(cr,_,_,_,B,R,C,B,R,C,boxselection):-!.
  73.   boxmenu2(home,_,_,_,B,R,_,B,R,0,cont):-!.
  74.   boxmenu2(end,LISTLEN,DROW,DCOL,B,R,_,B1,R1,C1,cont):-!,
  75.     CC=DCOL-1,boxmenu3(LISTLEN,DROW,DCOL,B,R,CC,B1,R1,C1).
  76.   boxmenu2(left,LISTLEN,DROW,DCOL,B,R,C,B1,R1,C1,cont):-!,
  77.     CC=C-1,boxmenu3(LISTLEN,DROW,DCOL,B,R,CC,B1,R1,C1).
  78.   boxmenu2(right,LISTLEN,DROW,DCOL,B,R,C,B1,R1,C1,cont):-!,
  79.     CC=C+1,boxmenu3(LISTLEN,DROW,DCOL,B,R,CC,B1,R1,C1).
  80.   boxmenu2(up,LISTLEN,DROW,DCOL,B,R,C,B1,R1,C1,cont):-!,
  81.     RR=R-1,boxmenu3(LISTLEN,DROW,DCOL,B,RR,C,B1,R1,C1).
  82.   boxmenu2(down,LISTLEN,DROW,DCOL,B,R,C,B1,R1,C1,cont):-!,
  83.     RR=R+1,boxmenu3(LISTLEN,DROW,DCOL,B,RR,C,B1,R1,C1).
  84.   boxmenu2(pgup,LISTLEN,DROW,DCOL,B,R,C,B1,R1,C1,cont):-!,
  85.     RR=R-DROW+1,boxmenu3(LISTLEN,DROW,DCOL,B,RR,C,B1,R1,C1).
  86.   boxmenu2(pgdn,LISTLEN,DROW,DCOL,B,R,C,B1,R1,C1,cont):-!,
  87.     RR=R+DROW-1,boxmenu3(LISTLEN,DROW,DCOL,B,RR,C,B1,R1,C1).
  88.   boxmenu2(_,_,_,_,B,R,C,B,R,C,cont).
  89.  
  90.   /* LISTLEN,NOOFROWS,NOOFCOLS,OLDBASE,OLDROW,OLDCOL,NEWBASE,NEWROW,NEWCOL */
  91.   boxmenu3(LISTLEN,DROW,DCOL,B,R,C,B1,R1,C1):-
  92.     B+R*DCOL+C>=LISTLEN,!,
  93.     LL=LISTLEN-1,
  94.     C1=LL mod DCOL,
  95.     MAXROW=LL div DCOL, DR=DROW-1,
  96.     min(MAXROW,DR,R1),
  97.     B1=LL-C1-R1*DCOL.
  98.   boxmenu3(LISTLEN,DROW,DCOL,B,R,C,B1,R1,C1):-
  99.     C>=DCOL, !, RR=R+1,
  100.     boxmenu3(LISTLEN,DROW,DCOL,B,RR,0,B1,R1,C1).
  101.   boxmenu3(LISTLEN,DROW,DCOL,B,R,C,B1,R1,C1):-
  102.     C<0, !, RR=R-1, CC=DCOL-1,
  103.     boxmenu3(LISTLEN,DROW,DCOL,B,RR,CC,B1,R1,C1).
  104.   boxmenu3(LISTLEN,DROW,DCOL,B,R,C,B1,R1,C1):-
  105.     R>=DROW,!,
  106.     RR=DROW-1,
  107.     BB=B+DCOL*(R-RR),
  108.     boxmenu3(LISTLEN,DROW,DCOL,BB,RR,C,B1,R1,C1).
  109.   boxmenu3(LISTLEN,DROW,DCOL,B,R,C,B1,R1,C1):-
  110.     R<0,!,
  111.     BB=B+DCOL*R,
  112.     boxmenu3(LISTLEN,DROW,DCOL,BB,0,C,B1,R1,C1).
  113.   boxmenu3(_,_,_,B,_,_,0,0,0):-
  114.     B<0,!.
  115.   boxmenu3(_,_,_,B,R,C,B,R,C).
  116.  
  117.  
  118.   /* OLDBASE,BASE,NOOFROWS,NOOFCOLS,WITH,LIST */  
  119.   wr_boxpart_if_changed(B,B,_,_,_,_)  :- !.
  120.   wr_boxpart_if_changed(OLDB,B,R,C,W,L) :-
  121.     RR=(B-OLDB) div C,scroll(RR,0),
  122.     write_boxpart_list(0,B,R,C,W,L).
  123.       
  124.  
  125.   /* INDEX,BASE,NOOFROWS,NOOFCOLS,WITH,LIST */  
  126.   write_boxpart_list(I,B,R,C,W,[_|T]) :- I<B,!, I1=I+1,
  127.         write_boxpart_list(I1,B,R,C,W,T).
  128.   write_boxpart_list(I,B,R,C,W,[STR|T]) :-
  129.         ROW=(I-B) div C, ROW<R, !,
  130.         COL= W*(I-B-ROW*C),
  131.         field_str(ROW,COL,W,STR),
  132.         I1=I+1,
  133.         write_boxpart_list(I1,B,R,C,W,T).
  134.   write_boxpart_list(I,B,R,C,W,[]) :-
  135.         ROW=(I-B) div C, ROW<R, !,
  136.         COL= W*(I-B-ROW*C),
  137.         field_str(ROW,COL,W,""),
  138.         I1=I+1,
  139.         write_boxpart_list(I1,B,R,C,W,[]).
  140.   write_boxpart_list(_,_,_,_,_,_) :- !.
  141.  
  142.  
  143.  
  144. /****************************************************************
  145.              boxmenu_leave
  146.     (as boxmenu but the window is not removed on return)
  147. ****************************************************************/
  148.  
  149.  
  150. PREDICATES
  151.   boxmenu_leave(ROW,COL,ROW,COL,ATTR,ATTR,STRINGLIST,STRING,INTEGER,INTEGER)
  152.  
  153. CLAUSES
  154.   boxmenu_leave(ROW,COL,DROW,DCOL,WATTR,FATTR,STRINGLIST,HEADER,STCHOICE,CHOICE) :-
  155.     boxmenuinit(ROW,COL,DROW,DCOL,WATTR,FATTR,STRINGLIST,HEADER,NOOFCOLS,STRLEN,LISTLEN),
  156.     MB=LISTLEN,ST1=STCHOICE-1,max(0,ST1,ST2),min(MB,ST2,ST3),
  157.     STBASE=ST3-ST3 mod(DROW*NOOFCOLS), STROW=(ST3-STBASE) div NOOFCOLS, STCOL=ST3-STBASE-STROW*NOOFCOLS,
  158.     boxmenu1(cont,-1,STBASE,STROW,STCOL,DROW,NOOFCOLS,STRLEN,LISTLEN,WATTR,STRINGLIST,BASE1,ROW1,COL1),
  159.     CHOICE = BASE1 + ROW1*NOOFCOLS + COL1 +1.
  160.  
  161.  
  162. /*******************************************************************/
  163. /*             boxmenu_mult                   */
  164. /* Allows a multiple number of boxselections.               */
  165. /*                                   */
  166. /* Each boxselection is made by pressing RETURN. All boxselections */
  167. /* are then activated by pressing F10.                               */
  168. /*******************************************************************/
  169.  
  170. PREDICATES
  171.   boxmenu_mult(ROW,COL,ROW,COL,ATTR,ATTR,STRINGLIST,STRING,INTEGERLIST,INTEGERLIST)
  172.   multboxmenu1(SYMBOL,BASE,BASE,ROW,COL,ROW,COL,COL,BASE,ATTR,STRINGLIST,INTEGERLIST,INTEGERLIST)
  173.   highlight_boxselected(INTEGERLIST,BASE,ROW,COL,COL,ATTR)
  174.   handle_boxselection(INTEGER,INTEGERLIST,INTEGERLIST,BASE,ROW,COL,COL,ATTR)
  175.   try_boxdel(INTEGER,INTEGERLIST,INTEGERLIST,BASE,ROW,COL,COL,ATTR)
  176.   w_attr(INTEGER,BASE,ROW,COL,COL,ATTR)
  177.  
  178. CLAUSES
  179.   boxmenu_mult(ROW,COL,DROW,DCOL,WATTR,FATTR,STRINGLIST,HEADER,STARTCH,CHOOSED) :-
  180.     boxmenuinit(ROW,COL,DROW,DCOL,WATTR,FATTR,STRINGLIST,HEADER,NOOFCOLS,STRLEN,LISTLEN),
  181.     multboxmenu1(cont,-1,0,0,0,DROW,NOOFCOLS,STRLEN,LISTLEN,WATTR,STRINGLIST,STARTCH,CHOOSED),
  182.     removewindow.
  183.  
  184.   /* STOP,OLDBASE,BASE,ROW,COL,NOOFROWS,NOOFCOLS,STRLEN,LISTLEN,ATTR,STRINGLIST,BASE1,ROW1,COL1 */
  185.   multboxmenu1(stop,_,_,_,_,_,_,_,_,_,_,CHOOSED,CHOOSED).
  186.   multboxmenu1(esc,_,_,_,_,_,_,_,_,_,_,_,[]).
  187.   multboxmenu1(boxselection,OLDBASE,BASE,ROW,COL,NOOFROWS,NOOFCOLS,STRLEN,LISTLEN,ATTR,STRINGLIST,CHIN,CHOUT):-
  188.     SELECTION = BASE + ROW*NOOFCOLS + COL +1,
  189.     handle_boxselection(SELECTION,CHIN,NEWCHIN,BASE,NOOFROWS,NOOFCOLS,STRLEN,ATTR),
  190.     multboxmenu1(cont,OLDBASE,BASE,ROW,COL,NOOFROWS,NOOFCOLS,STRLEN,LISTLEN,ATTR,STRINGLIST,NEWCHIN,CHOUT).
  191.   multboxmenu1(cont,OLDBASE,BASE,ROW,COL,NOOFROWS,NOOFCOLS,STRLEN,LISTLEN,ATTR,STRINGLIST,CHIN,CHOUT):-
  192.     wr_boxpart_if_changed(OLDBASE,BASE,NOOFROWS,NOOFCOLS,STRLEN,STRINGLIST),
  193.     reverseattr(ATTR,REV),
  194.     highlight_boxselected(CHIN,BASE,NOOFROWS,NOOFCOLS,STRLEN,REV),
  195.     CC=COL*STRLEN,
  196.     cursor(ROW,CC),
  197.     readkey(KEY),
  198.     boxmenu2(KEY,LISTLEN,NOOFROWS,NOOFCOLS,BASE,ROW,COL,BASE1,ROW1,COL1,STOP),
  199.     multboxmenu1(STOP,BASE,BASE1,ROW1,COL1,NOOFROWS,NOOFCOLS,STRLEN,LISTLEN,ATTR,STRINGLIST,CHIN,CHOUT).
  200.  
  201.  
  202.   /* SELECTED,BASE,NOOFROWS,NOOFCOLS,STRLEN,REVATTR */
  203.   highlight_boxselected([],_,_,_,_,_).
  204.   highlight_boxselected([H|T],BASE,NOOFROWS,NOOFCOLS,STRLEN,ATTR):-
  205.     w_attr(H,BASE,NOOFROWS,NOOFCOLS,STRLEN,ATTR),
  206.     highlight_boxselected(T,BASE,NOOFROWS,NOOFCOLS,STRLEN,ATTR).
  207.  
  208.   w_attr(CHOICE,BASE,NOOFROWS,NOOFCOLS,STRLEN,ATTR):-
  209.     CHOICE>BASE, CHOICE<=BASE+NOOFROWS*NOOFCOLS,!,
  210.     CH=CHOICE-1,
  211.     RR=(CH-BASE) div NOOFCOLS,
  212.     CC=STRLEN*(CH mod NOOFCOLS),
  213.     field_attr(RR,CC,STRLEN,ATTR).
  214.   w_attr(_,_,_,_,_,_).
  215.  
  216.   try_boxdel(SELECTION,[SELECTION|REST],REST,BASE,NOOFROWS,NOOFCOLS,STRLEN,ATTR):-!,
  217.     w_attr(SELECTION,BASE,NOOFROWS,NOOFCOLS,STRLEN,ATTR).
  218.   try_boxdel(SELECTION,[H|REST],[H|REST1],BASE,NOOFROWS,NOOFCOLS,STRLEN,ATTR):-
  219.     try_boxdel(SELECTION,REST,REST1,BASE,NOOFROWS,NOOFCOLS,STRLEN,ATTR).
  220.  
  221.   handle_boxselection(SELECTION,OLDCHIN,NEWCHIN,BASE,NOOFROWS,NOOFCOLS,STRLEN,ATTR):-
  222.     try_boxdel(SELECTION,OLDCHIN,NEWCHIN,BASE,NOOFROWS,NOOFCOLS,STRLEN,ATTR),!.
  223.   handle_boxselection(SELECTION,OLDCHIN,[SELECTION|OLDCHIN],_,_,_,_,_).
  224.