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

  1. /****************************************************************
  2.  
  3.      Turbo Prolog Toolbox
  4.      (C) Copyright 1987 Borland International.
  5.  
  6.              longmenu
  7.  Implements a popup-menu with more than 23 possible choices
  8.  
  9.   The up and down arrow keys and pgup, pgdn, home, and end  can be used to
  10.   move the bar.
  11.   RETURN or F10 will select an indicated item.
  12.   Pressing Esc aborts menu selection and returns a zero.
  13.  
  14.   The arguments to longmenu are:
  15.   menu(ROW,COL,MAXROWS,WINDOWATTR,FRAMEATTR,STRINGLIST,HEADER,STARTCHOICE,SELECTION)
  16.  
  17.     ROW and COL determine the position of the window
  18.     WATTR and FATTR determine the attributes for the window
  19.         and its frame - if FATTR is zero there
  20.         will be no frame around the window.
  21.     MAXROWS determines how many rows should be displayed on the screen
  22.     STRINGLIST is the list of items on the menu
  23.     HEADER is the text to appear in the top of the menu window
  24.     STARTCHOICE determines where the bar should be placed.
  25.  
  26.   Ex:     longmenu(5,5,7,7,5,[a,b,c,d,e,f,g,h,i,j,k,l,m,n],letters,0,CHOICE)
  27. ****************************************************************/
  28.  
  29. PREDICATES
  30.   longmenu(ROW,COL,ROW,ATTR,ATTR,STRINGLIST,STRING,INTEGER,INTEGER)
  31.   longmenuinit(ROW,COL,ROW,ATTR,ATTR,STRINGLIST,STRING,ROW,COL,ROW,COL,ROW)
  32.   longmenu1(SYMBOL,ROW,COL,ROW,COL,ATTR,STRINGLIST,ROW,ROW,ROW,ROW,ROW,ROW)
  33.   longmenu2(SYMBOL,ROW,ROW,ROW,ROW,ROW,ROW,KEY) 
  34.   longmenu3(ROW,ROW,ROW,ROW,ROW,ROW) 
  35.   wr_part_if_changed(ROW,ROW,ROW,COL,STRINGLIST)
  36.   write_part_list(ROW,ROW,ROW,ROW,COL,STRINGLIST)
  37.  
  38. CLAUSES
  39.   longmenu(ROW,COL,MAXH,WATTR,FATTR,STRINGLIST,HEADER,STCHOICE,CHOICE) :-
  40.     longmenuinit(ROW,COL,MAXH,WATTR,FATTR,STRINGLIST,HEADER,AROW,ACOL,HEIGHT,LEN,NOOFROW),
  41.     STOFFSET=STCHOICE-1,
  42.     longmenu3(NOOFROW,HEIGHT,0,STOFFSET,BASE,OFFSET),
  43.     longmenu1(cont,AROW,ACOL,HEIGHT,LEN,WATTR,STRINGLIST,NOOFROW,-1,BASE,OFFSET,BASE1,OFFS1),
  44.     CHOICE = BASE1 + OFFS1+1,
  45.     removewindow.
  46.  
  47.   longmenuinit(ROW,COL,MAXH,WATTR,FATTR,STRINGLIST,HEADER,AROW,ACOL,HEIGHT,NOOFCOL,NOOFROW):-
  48.     maxlen(STRINGLIST,0,MAXNOOFCOL),
  49.     str_len(HEADER,HEADLEN),
  50.     HEADL1=HEADLEN+4,
  51.     max(HEADL1,MAXNOOFCOL,NOOFCOL),
  52.     listlen(STRINGLIST,N), N > 0 , NOOFROW=N,
  53.     min(NOOFROW,MAXH,HEIGHT),
  54.     adjframe(FATTR,HEIGHT,NOOFCOL,HH1,HH2),
  55.     adjustwindow(ROW,COL,HH1,HH2,AROW,ACOL),
  56.     makewindow(81,WATTR,FATTR,HEADER,AROW,ACOL,HH1,HH2).
  57.  
  58.   longmenu1(cont,ROW,COL,H,W,ATTR,STRINGLIST,NOOFROW,OLDBASE,BASE,OFFS,BASE2,OFFS2) :-!,
  59.     wr_part_if_changed(OLDBASE,BASE,H,W,STRINGLIST),
  60.     reverseattr(ATTR,REV),
  61.     field_attr(OFFS,0,W,REV),
  62.     cursor(OFFS,0),
  63.     readkey(KEY),
  64.     longmenu2(STOP,H,NOOFROW,BASE,OFFS,BASE1,OFFS1,KEY),
  65.     field_attr(OFFS,0,W,ATTR),
  66.     longmenu1(STOP,ROW,COL,H,W,ATTR,STRINGLIST,NOOFROW,BASE,BASE1,OFFS1,BASE2,OFFS2). 
  67.   longmenu1(esc,_,_,_,_,_,_,_,_,OB,OF,OB,OF):-!.
  68.   longmenu1(_,_,_,_,W,ATTR,_,_,_,OB,OF,OB,OF):-
  69.     reverseattr(ATTR,REV),
  70.     field_attr(OF,0,W,REV).
  71.  
  72.  
  73.   longmenu2(esc,_,_,_,_,0,-1,esc)        :-!.
  74.   longmenu2(stop,_,_,B,O,B,O,fkey(10))     :-!.
  75. /*longmenu2(cont,_,_,B,O,B,O,fkey(1))    :-!,help. If a help system is used */
  76.   longmenu2(selection,_,_,B,O,B,O,cr)    :-!.
  77.   longmenu2(cont,_,_,_,_,0,0,home)        :-!.
  78.   longmenu2(cont,H,LEN,_,_,B1,O1,end)    :-!, O1=H-1, B1 = LEN-H. 
  79.   longmenu2(cont,H,LEN,B,O,B1,O1,up)    :-!, OO=O-1,longmenu3(LEN,H,B,OO,B1,O1).
  80.   longmenu2(cont,H,LEN,B,O,B1,O1,down)    :-!, OO=O+1,longmenu3(LEN,H,B,OO,B1,O1).
  81.   longmenu2(cont,H,LEN,B,O,B1,O1,pgup)    :-!, OO=O-H+1,longmenu3(LEN,H,B,OO,B1,O1).
  82.   longmenu2(cont,H,LEN,B,O,B1,O1,pgdn)    :-!, OO=O+H-1,longmenu3(LEN,H,B,OO,B1,O1).
  83.   longmenu2(cont,_,_,B,O,B,O,_).
  84.  
  85.   longmenu3(_,H,B,O,B,O)        :-O>=0, O<H, !.
  86.   longmenu3(LEN,H,B1,O1,B2,O2)    :-O1+B1>=LEN,!, O2=H-1, B2=LEN-H.
  87.   longmenu3(_,_,B1,O1,0,0)        :-O1+B1<0,!.
  88.   longmenu3(_,_,B1,O1,B2,0)    :-O1<0, !, B2=B1+O1.
  89.   longmenu3(_,H,B1,O1,B2,O2)    :-O1>=H, O2=H-1, B2=B1+O1-O2.
  90.  
  91.   wr_part_if_changed(B,B,_,_,_)  :- !.
  92.   wr_part_if_changed(OLDB,B,H,W,CL) :-
  93.     SCROLL=B-OLDB, scroll(SCROLL,0),
  94.     write_part_list(0,B,0,H,W,CL).
  95.       
  96.   write_part_list(_,_,H,H,_,_) :- !.
  97.   write_part_list(I,B,R,H,W,[_|T]) :- I<B,!, I1=I+1,
  98.         write_part_list(I1,B,R,H,W,T).
  99.   write_part_list(I,B,R,H,W,[STR|T]) :-
  100.         field_str(R,0,W,STR),
  101.         R1=R+1,
  102.         write_part_list(I,B,R1,H,W,T).
  103.  
  104.  
  105. /****************************************************************/
  106. /*             longmenu_leave                */
  107. /* As longmenu but the window is not removed on return        */
  108. /****************************************************************/
  109.  
  110. PREDICATES
  111.   longmenu_leave(ROW,COL,ROW,ATTR,ATTR,STRINGLIST,STRING,INTEGER,INTEGER)
  112.  
  113. CLAUSES
  114.   longmenu_leave(ROW,COL,MAXH,WATTR,FATTR,STRINGLIST,HEADER,STCHOICE,CHOICE):-
  115.     longmenuinit(ROW,COL,MAXH,WATTR,FATTR,STRINGLIST,HEADER,AROW,ACOL,HEIGHT,LEN,NOOFROW),
  116.     STOFFSET=STCHOICE-1,
  117.     longmenu3(NOOFROW,HEIGHT,0,STOFFSET,BASE,OFFSET),
  118.     longmenu1(cont,AROW,ACOL,HEIGHT,LEN,WATTR,STRINGLIST,NOOFROW,-1,BASE,OFFSET,BASE1,OFFS1),
  119.     CHOICE = BASE1 + OFFS1+1.
  120.  
  121.  
  122. /****************************************************************/
  123. /*             longmenu_mult                */
  124. /* Allows a multiple number of selections.            */
  125. /*                                */
  126. /* Each selection is made by pressing RETURN. All selections    */
  127. /* then activated by pressing F10.                */
  128. /****************************************************************/
  129.  
  130. PREDICATES
  131.   longmenu_mult(ROW,COL,ROW,ATTR,ATTR,STRINGLIST,STRING,INTEGERLIST,INTEGERLIST)
  132.   multlongmenu1(SYMBOL,ROW,COL,ROW,COL,ATTR,STRINGLIST,ROW,ROW,ROW,ROW,INTEGERLIST,INTEGERLIST)
  133.   highlight_selected(ROW,ROW,COL,INTEGERLIST,ATTR)
  134.   handle_selection(INTEGER,INTEGERLIST,INTEGERLIST,ROW,ROW,COL,ATTR)
  135.   try_del(INTEGER,INTEGERLIST,INTEGERLIST,ROW,ROW,COL,ATTR)
  136.   row_attr(ROW,ROW,COL,ATTR)
  137.  
  138. CLAUSES
  139.   longmenu_mult(ROW,COL,MAXH,WATTR,FATTR,STRINGLIST,HEADER,STARTCH,CHOOSED) :-
  140.     longmenuinit(ROW,COL,MAXH,WATTR,FATTR,STRINGLIST,HEADER,AROW,ACOL,HEIGHT,LEN,NOOFROW),
  141.     multlongmenu1(cont,AROW,ACOL,HEIGHT,LEN,WATTR,STRINGLIST,NOOFROW,-1,0,0,STARTCH,CHOOSED),
  142.     removewindow.
  143.  
  144.   multlongmenu1(stop,_,_,_,_,_,_,_,_,_,_,CHOOSED,CHOOSED).
  145.   multlongmenu1(esc,_,_,_,_,_,_,_,_,_,_,_,[]).
  146.   multlongmenu1(selection,ROW,COL,H,W,ATTR,STRINGLIST,NOOFROW,OLDBASE,BASE,OFFS,CHIN,CHOUT) :-
  147.     SELECTION=BASE+OFFS+1,
  148.     handle_selection(SELECTION,CHIN,NEWCHIN,BASE,NOOFROW,W,ATTR),
  149.     multlongmenu1(cont,ROW,COL,H,W,ATTR,STRINGLIST,NOOFROW,OLDBASE,BASE,OFFS,NEWCHIN,CHOUT).
  150.   multlongmenu1(cont,ROW,COL,H,W,ATTR,STRINGLIST,NOOFROW,OLDBASE,BASE,OFFS,CHIN,CHOUT) :-
  151.     wr_part_if_changed(OLDBASE,BASE,H,W,STRINGLIST),
  152.     reverseattr(ATTR,REV),
  153.     highlight_selected(BASE,H,W,CHIN,REV),
  154.     cursor(OFFS,0),
  155.     readkey(KEY),
  156.     longmenu2(STOP,H,NOOFROW,BASE,OFFS,BASE1,OFFS1,KEY),
  157.     multlongmenu1(STOP,ROW,COL,H,W,ATTR,STRINGLIST,NOOFROW,BASE,BASE1,OFFS1,CHIN,CHOUT). 
  158.  
  159.  
  160.   highlight_selected(_,_,_,[],_).
  161.   highlight_selected(BASE,MAXROW,LEN,[H|T],ATTR):-
  162.     ROW=H-BASE-1,
  163.     row_attr(ROW,MAXROW,LEN,ATTR),
  164.     highlight_selected(BASE,MAXROW,LEN,T,ATTR).
  165.  
  166.   row_attr(ROW,MAXROW,LEN,ATTR):-
  167.     ROW>=0, ROW<MAXROW,!,
  168.     field_attr(ROW,0,LEN,ATTR).
  169.   row_attr(_,_,_,_).
  170.  
  171.   try_del(SELECTION,[SELECTION|REST],REST,BASE,MAXROW,LEN,ATTR):-!,
  172.     ROW=SELECTION-BASE-1,
  173.     row_attr(ROW,MAXROW,LEN,ATTR).
  174.   try_del(SELECTION,[H|REST],[H|REST1],BASE,MAXROW,LEN,ATTR):-
  175.     try_del(SELECTION,REST,REST1,BASE,MAXROW,LEN,ATTR).
  176.  
  177.   handle_selection(SELECTION,OLDCHIN,NEWCHIN,BASE,MAXROW,LEN,ATTR):-
  178.     try_del(SELECTION,OLDCHIN,NEWCHIN,BASE,MAXROW,LEN,ATTR),!.
  179.   handle_selection(SELECTION,OLDCHIN,[SELECTION|OLDCHIN],_,_,_,_).
  180.