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

  1. /****************************************************************
  2.  
  3.      Turbo Prolog Toolbox
  4.      (C) Copyright 1987 Borland International.
  5.  
  6.         PULL DOWN MENU
  7.  
  8.   This module implements a pulldown menu.
  9.   
  10.   The parameters are:
  11.     pulldown(ATTRIBUTE,MENULIST,CHOICE,SUBCHOICE)
  12.  
  13.   where 
  14.     Attribute is used in all the windows
  15.     Menulist is the text for the menus
  16.     CHOICE is the selection from the horizontal menu
  17.     SUBCHOICE is the selection from the vertical menu
  18.            (or zero if there is no vertical menu for
  19.             the CHOICE horizontal item)
  20. ****************************************************************/
  21.  
  22. /* ----- Include this database in your program ----
  23. DATABASE
  24.     pdwstate(ROW,COL,SYMBOL,ROW,COL)
  25.  
  26. include tooldom and toolpred
  27.  
  28. And give some clauses for the pdwaction predicate
  29.  
  30. */
  31.  
  32.  
  33. DOMAINS
  34.  MENUELEM=  curtain(COL,STRING,STRINGLIST)
  35.  MENULIST=  MENUELEM*
  36.  STOP     =  stop(); cont()
  37.  
  38.  
  39. PREDICATES
  40.   pulldown(ATTR,MENULIST,INTEGER,INTEGER)
  41.   pdwaction(INTEGER,INTEGER)
  42.   
  43.   pdwkeyact(KEY,ROW,COL,SYMBOL,ROW,COL,COL,ATTR,MENULIST,STOP)
  44.   pdwmovevert(COL,COL,ATTR,MENULIST)
  45.   pdwindex(COL,MENULIST,MENUELEM)
  46.   pdwindex(ROW,STRINGLIST,STRING)
  47.   makepdwwindow1(ROW,COL,ROW,COL,ATTR,STRINGLIST,ROW)
  48.   makepdwwindow(COL,ATTR,MENULIST,ROW,COL,ROW)
  49.   writelistp(ROW,COL,ATTR,STRINGLIST)
  50.   line_ver(ROW,ROW,COL)
  51.   line_hor(COL,COL,ROW)
  52.   lcorn(COL,CHAR)
  53.   rcorn(COL,CHAR)
  54.   pdwlistlen(MENULIST,COL)
  55.   writepdwlist(ATTR,MENULIST)
  56.   changepdwstate(DBASEDOM)
  57.   check_removewindow(ROW)
  58.   is_up(SYMBOL,ROW)
  59.   nextcol(COL,COL,COL,COL)
  60.   intense(ATTR,ATTR)
  61.   intensefirstupper(ROW,COL,ATTR,STRING)
  62.   intenseletter(ROW,COL,ATTR,STRING)
  63.   pdwlist_strlist(MENULIST,STRINGLIST)
  64.  
  65. CLAUSES
  66.  
  67. /* draw pulldown window */
  68.   line_ver(R1,R2,C):-
  69.     R2>R1,!, R=R1+1,
  70.     scr_char(R1,C,'│'),
  71.     line_ver(R,R2,C).
  72.   line_ver(_,_,_).
  73.  
  74.   line_hor(C1,C2,R):-
  75.     C2>C1,!, C=C1+1,
  76.     scr_char(R,C1,'─'),
  77.     line_hor(C,C2,R).
  78.   line_hor(_,_,_).
  79.  
  80. /* Make the pulldown window */
  81.   makepdwwindow(NO,ATTR,MENULIST,LISTLEN,MAXLEN,FIRSTROW):-
  82.     pdwindex(NO,MENULIST,curtain(CCOL,_,LIST)),COL=CCOL,
  83.     ROW=2,
  84.     listlen(LIST,LISTLEN1),LISTLEN=LISTLEN1,
  85.     maxlen(LIST,0,MAXLEN),
  86.     makepdwwindow1(ROW,COL,LISTLEN,MAXLEN,ATTR,LIST,FIRSTROW).
  87.  
  88. /*  makepdwwindow1(_,_,_,_,_,_,0):-keypressed,!. */
  89.   makepdwwindow1(_,_,0,_,_,_,0):-!.
  90.   makepdwwindow1(ROW,COL,LISTLEN,MAXLEN,ATTR,LIST,1):-
  91.     NOOFROWS=LISTLEN+2, NOOFCOLS=MAXLEN+2,
  92.     adjustwindow(ROW,COL,NOOFROWS,NOOFCOLS,AROW,ACOL),
  93.     makewindow(81,ATTR,0,"",AROW,ACOL,NOOFROWS,NOOFCOLS),
  94.     writelistp(1,MAXLEN,ATTR,LIST),
  95.     cursor(1,1),reverseattr(ATTR,REV), field_attr(1,1,MAXLEN,REV),
  96.     ENDROW=NOOFROWS-1,
  97.     ENDCOL=NOOFCOLS-1,
  98.     line_hor(1,ENDCOL,0),
  99.     line_hor(1,ENDCOL,ENDROW),
  100.     line_ver(1,ENDROW,0),
  101.     line_ver(1,ENDROW,ENDCOL),
  102.     scr_char(ENDROW,0,'└'),
  103.     scr_char(ENDROW,ENDCOL,'┘'),
  104.     lcorn(COL,LCORN), scr_char(0,0,LCORN),
  105.     RCOL=ACOL+ENDCOL,
  106.     rcorn(RCOL,RCORN), scr_char(0,ENDCOL,RCORN).
  107.  
  108. /* draw pulldown window corners */
  109.   lcorn(0,'├') :- !.
  110.   lcorn(_,'┬').
  111.  
  112.   rcorn(79,'┤') :- !.
  113.   rcorn(_,'┬').
  114.  
  115.   check_removewindow(0):-!.
  116.   check_removewindow(_):-removewindow.
  117.  
  118.   is_up(up,_):-!.
  119.   is_up(_,0).
  120.  
  121.   intense(ATTR,ATTR1):-
  122.     bitxor(ATTR,$08,ATTR1).
  123.  
  124.   intensefirstupper(ROW,COL,ATTR,WORD):-
  125.     frontchar(WORD,CH,_),
  126.     CH>='A', CH<='Z',!,scr_attr(ROW,COL,ATTR).
  127.   intensefirstupper(ROW,COL,ATTR,WORD):-
  128.     frontchar(WORD,_,REST),COL1=COL+1,
  129.     intensefirstupper(ROW,COL1,ATTR,REST).
  130.  
  131.   intenseletter(ROW,COL,ATTR,WORD):-
  132.     intense(ATTR,INTENS),
  133.     intensefirstupper(ROW,COL,INTENS,WORD),!.
  134.   intenseletter(ROW,COL,ATTR,_):-
  135.     intense(ATTR,INTENS),
  136.     scr_attr(ROW,COL,INTENS).
  137.  
  138.   pdwlist_strlist([],[]).
  139.   pdwlist_strlist([curtain(_,H,_)|RESTPDW],[H|RESTSTR]):-
  140.     pdwlist_strlist(RESTPDW,RESTSTR).
  141.  
  142.   pdwmovevert(COL1,COL2,ATTR,LIST):-
  143.     pdwindex(COL1,LIST,curtain(POS1,WORD1,_)),str_len(WORD1,LEN1),
  144.     pdwindex(COL2,LIST,curtain(POS2,WORD2,_)),str_len(WORD2,LEN2),
  145.     field_attr(0,POS1,LEN1,ATTR),
  146.     intenseletter(0,POS1,ATTR,WORD1),
  147.     reverseattr(ATTR,REV),
  148.     field_attr(0,POS2,LEN2,REV),
  149.     intenseletter(0,POS2,REV,WORD2),
  150.     cursor(0,POS2).
  151.  
  152.   pdwlistlen([],0).
  153.   pdwlistlen([_|T],N):-
  154.     pdwlistlen(T,X),
  155.     N=X+1.
  156.  
  157.   writepdwlist(_,[]).
  158.   writepdwlist(ATTR,[curtain(POS,WORD,_)|T]):-
  159.     str_len(WORD,LEN),
  160.     field_str(0,POS,LEN,WORD),
  161.     intenseletter(0,POS,ATTR,WORD),
  162.     writepdwlist(ATTR,T).
  163.  
  164.   writelistp(_,_,_,[]).
  165.   writelistp(ROW,LEN,ATTR,[H|T]):-
  166.     field_str(ROW,1,LEN,H),
  167.     intenseletter(ROW,1,ATTR,H),
  168.     ROW1=ROW+1,
  169.     writelistp(ROW1,LEN,ATTR,T).
  170.  
  171.   pdwindex(0,[H|_],H):-!.
  172.   pdwindex(N,[_|T],X):-N1=N-1,pdwindex(N1,T,X).
  173.  
  174.   changepdwstate(_):-retract(pdwstate(_,_,_,_,_)),fail.
  175.   changepdwstate(T):-assert(T).
  176.  
  177.   nextcol(0,-1,COL1,MAX):-COL1=MAX-1,!.
  178.   nextcol(COL,1,0,MAX):-COL=MAX-1,!.
  179.   nextcol(COL,DD,COL1,_):-COL1=COL+DD.
  180.  
  181.   pulldown(ATTR,LIST,CH1,CH2):-
  182.     makewindow(81,ATTR,ATTR,"",0,0,3,80),
  183.     pdwlistlen(LIST,MAXCOL),
  184.     writepdwlist(ATTR,LIST),
  185.     pdwmovevert(0,0,ATTR,LIST),
  186.     changepdwstate(pdwstate(0,0,up,0,0)),
  187.     repeat,
  188.     pdwstate(ROW,COL,DOWN,MAXROW,LEN),
  189.     readkey(KEY),
  190.     pdwkeyact(KEY,ROW,COL,DOWN,MAXROW,MAXCOL,LEN,ATTR,LIST,CONTINUE),
  191.     CONTINUE=stop,removewindow,
  192.     pdwstate(ROW1,COL1,_,_,_),!,
  193.     CH1=COL1+1,
  194.     CH2=ROW1.
  195.  
  196. /*  Pulldown window action corresponding to input key and Pulldown window
  197.     state */
  198.   pdwkeyact(right,ROW,COL,up,MAXROW,MAXCOL,LEN,ATTR,LIST,cont):-
  199.     nextcol(COL,1,COL1,MAXCOL),
  200.     pdwmovevert(COL,COL1,ATTR,LIST), 
  201.     changepdwstate(pdwstate(ROW,COL1,up,MAXROW,LEN)).
  202.  
  203.   pdwkeyact(right,ROW,COL,down,_,MAXCOL,_,ATTR,LIST,cont):-
  204.     nextcol(COL,1,COL1,MAXCOL),
  205.     check_removewindow(ROW),
  206.     pdwmovevert(COL,COL1,ATTR,LIST),
  207.     makepdwwindow(COL1,ATTR,LIST,MAXROW1,LEN1,FIRSTROW),
  208.     changepdwstate(pdwstate(FIRSTROW,COL1,down,MAXROW1,LEN1)).
  209.  
  210.   pdwkeyact(left,ROW,COL,up,MAXROW,MAXCOL,LEN,ATTR,LIST,cont):-
  211.     nextcol(COL,-1,COL1,MAXCOL),
  212.     pdwmovevert(COL,COL1,ATTR,LIST),
  213.     changepdwstate(pdwstate(ROW,COL1,up,MAXROW,LEN)).
  214.  
  215.   pdwkeyact(left,ROW,COL,down,_,MAXCOL,_,ATTR,LIST,cont):-
  216.     nextcol(COL,-1,COL1,MAXCOL),
  217.     check_removewindow(ROW),
  218.     pdwmovevert(COL,COL1,ATTR,LIST),
  219.     makepdwwindow(COL1,ATTR,LIST,MAXROW1,LEN1,FIRSTROW),
  220.     changepdwstate(pdwstate(FIRSTROW,COL1,down,MAXROW1,LEN1)).
  221.  
  222.   pdwkeyact(up,ROW,COL,down,MAXROW,_,LEN,ATTR,PDWLIST,cont):-
  223.     ROW>1,!,
  224.     ROW1=ROW-1,
  225.     field_attr(ROW,1,LEN,ATTR),
  226.     pdwindex(COL,PDWLIST,curtain(_,_,LIST)),
  227.     pdwindex(ROW1,LIST,WORD),
  228.     intenseletter(ROW,1,ATTR,WORD),
  229.     reverseattr(ATTR,REV),field_attr(ROW1,1,LEN,REV),
  230.     cursor(ROW1,1),
  231.     changepdwstate(pdwstate(ROW1,COL,down,MAXROW,LEN)).
  232.  
  233.   pdwkeyact(down,ROW,COL,down,MAXROW,_,LEN,ATTR,PDWLIST,cont):-
  234.     ROW<MAXROW,!,
  235.     ROW1=ROW+1,
  236.     field_attr(ROW,1,LEN,ATTR),
  237.     pdwindex(COL,PDWLIST,curtain(_,_,LIST)),
  238.     INDX=ROW-1,pdwindex(INDX,LIST,WORD),
  239.     intenseletter(ROW,1,ATTR,WORD),
  240.     reverseattr(ATTR,REV),field_attr(ROW1,1,LEN,REV),
  241.     cursor(ROW1,1),
  242.     changepdwstate(pdwstate(ROW1,COL,down,MAXROW,LEN)).
  243.  
  244.   pdwkeyact(down,_,COL,up,_,_,_,ATTR,LIST,cont):-
  245.     makepdwwindow(COL,ATTR,LIST,MAXROW1,LEN1,FIRSTROW),
  246.     changepdwstate(pdwstate(FIRSTROW,COL,down,MAXROW1,LEN1)).
  247.  
  248.   pdwkeyact(cr,_,COL,up,_,_,_,ATTR,LIST,stop):-
  249.     makepdwwindow(COL,ATTR,LIST,MAXROW1,LEN1,FIRSTROW),
  250.     changepdwstate(pdwstate(FIRSTROW,COL,down,MAXROW1,LEN1)),
  251.     FIRSTROW=0,
  252.     CH=COL+1, SUBCH=0,
  253.     not(pdwaction(CH,SUBCH)).
  254.  
  255.   pdwkeyact(cr,ROW,COL,down,_,_,_,_,_,stop):-
  256.     CH=COL+1, SUBCH=ROW,
  257.     not(pdwaction(CH,SUBCH)),
  258.     check_removewindow(ROW).
  259.  
  260.   pdwkeyact(char(CHAR),ROW,COL,UP,_,_,_,ATTR,PDWLIST,stop):-
  261.     is_up(UP,ROW),!,
  262.     pdwlist_strlist(PDWLIST,STRLIST),
  263.     tryletter(CHAR,STRLIST,SEL),NEWCOL=SEL,
  264.     pdwmovevert(COL,NEWCOL,ATTR,PDWLIST),
  265.     makepdwwindow(NEWCOL,ATTR,PDWLIST,MAXROW1,LEN1,FIRSTROW),
  266.     changepdwstate(pdwstate(FIRSTROW,NEWCOL,down,MAXROW1,LEN1)),
  267.     FIRSTROW=0,
  268.     CH=NEWCOL+1, SUBCH=0,
  269.     not(pdwaction(CH,SUBCH)).
  270.  
  271.   pdwkeyact(char(CHAR),ROW,COL,down,MAXROW,_,LEN,ATTR,PDWLIST,stop):-
  272.     ROW><0,
  273.     pdwindex(COL,PDWLIST,curtain(_,_,LIST)),
  274.     tryletter(CHAR,LIST,SEL),ROW1=SEL+1,
  275.     field_attr(ROW,1,LEN,ATTR),
  276.     R=ROW-1,
  277.     pdwindex(R,LIST,OLDWORD),
  278.     intenseletter(ROW,1,ATTR,OLDWORD),
  279.     reverseattr(ATTR,REV),field_attr(ROW1,1,LEN,REV),
  280.     cursor(ROW1,1),
  281.     CH=COL+1, SUBCH=ROW1,
  282.     changepdwstate(pdwstate(ROW1,COL,down,MAXROW,LEN)),
  283.     not(pdwaction(CH,SUBCH)),
  284.     removewindow.
  285.  
  286.   pdwkeyact(esc,ROW,COL,down,_,_,_,_,_,cont):-
  287.     check_removewindow(ROW),
  288.     changepdwstate(pdwstate(0,COL,up,0,0)).
  289.  
  290. /*pdwkeyact(fkey(1),_,_,_,_,_,_,_,_,cont):-help. If a help system is used*/
  291.