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

  1.  /***********************************************************************/
  2.  /*                                                                     */
  3.  /*    Turbo Prolog Toolbox                                             */
  4.  /*    (C) Copyright 1987 Borland International.                        */
  5.  /*                                                                     */
  6.  /*        LINE INPUT DRIVER                       */
  7.  /***********************************************************************/
  8.  
  9. /*    These two database predicates must be declared somewhere
  10.     in the program.
  11.     
  12. DATABASE
  13.   insmode
  14.   lineinpstate(STRING,COL)
  15.   lineinpflag
  16. */
  17.  
  18. PREDICATES
  19.   lineinput(ROW,COL,LEN,ATTR,ATTR,STRING,STRING,STRING)
  20.   lineinput_leave(ROW,COL,LEN,ATTR,ATTR,STRING,STRING,STRING)
  21.   nondeterm lineinput_repeat(ROW,COL,LEN,ATTR,ATTR,STRING,STRING,STRING)
  22.   nondeterm lineinput_repeat1(ROW,COL,LEN,ATTR,ATTR,STRING,STRING,STRING,STRING)
  23.   lineinput1(ROW,COL,LEN,ATTR,ATTR,STRING,STRING,STRING,KEY)
  24.   inpkeyact(KEY,COL,LEN,COL,COL,STRING,STRING)
  25.   inpendkey(KEY)
  26.   changemode
  27.   inpstate(DBASEDOM)
  28.   setlineinpflag(KEY)
  29.   disp_str(COL,COL,LEN,STRING)
  30.   lineinpcursor(COL,LEN,COL,COL,STRING)
  31.   lin(KEY,COL,STRING,STRING)
  32.   myfrontstr(COL,STRING,STRING,STRING)
  33.   dropchar(STRING,STRING)
  34.  
  35. CLAUSES
  36. /* Lineinput creates an input line at ROW and COL of LENGTH with a prompt 
  37.    CONSTTXT and an starting value OLDTXT that will be returned as NEWTXT 
  38.    if no new text is entered   */
  39.   lineinput(ROW,COL,LEN,WATTR,FATTR,CONSTTXT,OLDTXT,NEWTXT):-
  40.     lineinput1(ROW,COL,LEN,WATTR,FATTR,CONSTTXT,OLDTXT,NEWTXT,KEY),
  41.     removewindow,        /* Removes window */
  42.     not(KEY=esc).
  43.  
  44.   lineinput_leave(ROW,COL,LEN,WATTR,FATTR,CONSTTXT,OLDTXT,NEWTXT):-
  45.     lineinput1(ROW,COL,LEN,WATTR,FATTR,CONSTTXT,OLDTXT,NEWTXT,KEY),
  46.     not(KEY=esc),!.
  47.   lineinput_leave(_,_,_,_,_,_,_,_):-removewindow,fail.
  48.  
  49. /* A fail will cause backtracking to lineinp_repeat and a new lineinput 
  50.    will be displayed */
  51.   lineinput_repeat(ROW,COL,LEN,WATTR,FATTR,CONSTTXT,OLDTXT,NEWTXT):-
  52.     lineinput1(ROW,COL,LEN,WATTR,FATTR,CONSTTXT,OLDTXT,NEWTXT1,KEY),
  53.     not(KEY=esc),!,
  54.     lineinput_repeat1(ROW,COL,LEN,WATTR,FATTR,CONSTTXT,OLDTXT,NEWTXT1,NEWTXT).
  55.   lineinput_repeat(_,_,_,_,_,_,_,_):-removewindow,fail.
  56.  
  57.   lineinput_repeat1(_,_,_,_,_,_,_,TXT,TXT).
  58.   lineinput_repeat1(ROW,COL,LEN,WATTR,FATTR,CONSTTXT,OLDTXT,_,NEWTXT):-
  59.     removewindow,
  60.     lineinput_repeat(ROW,COL,LEN,WATTR,FATTR,CONSTTXT,OLDTXT,NEWTXT).
  61.  
  62.  
  63.   lineinput1(_,_,_,_,_,_,_,_,_):-retract(lineinpflag),fail.
  64.   lineinput1(ROW,COL,LEN,WATTR,FATTR,CONSTTXT,OLDTXT,NEWTXT,KEY):-
  65.     MAXCOL=LEN,
  66.     adjframe(FATTR,1,MAXCOL,DR,DC),
  67.     adjustwindow(ROW,COL,DR,DC,ROW1,COL1),
  68.     makewindow(81,WATTR,FATTR,"",ROW1,COL1,DR,DC),
  69.     str_len(CONSTTXT,MINCOL),
  70.     write(CONSTTXT),
  71.     inpstate(lineinpstate(OLDTXT,0)),
  72.     REST=LEN-MINCOL,
  73.     repeat,
  74.     lineinpstate(CURTEXT,OFFSET),
  75.     disp_str(OFFSET,MINCOL,REST,CURTEXT),
  76.     cursor(_,CC),
  77.     readkey(KEY),          /* In TPREDS.PRO returns the tokenized input */
  78.     setlineinpflag(KEY),
  79.     inpkeyact(KEY,CC,MAXCOL,MINCOL,OFFSET,CURTEXT,OLDTXT),
  80.     inpendkey(KEY),
  81.     lineinpstate(NEWTXT,_),!.
  82.  
  83.   inpendkey(fkey(10)):-!.
  84.   inpendkey(cr):-!.
  85.   inpendkey(esc).
  86.  
  87. /* assert lineinpflag when control character is entered */
  88.   setlineinpflag(char(_)):-!.
  89.   setlineinpflag(_):-lineinpflag,!.
  90.   setlineinpflag(_):-assert(lineinpflag).
  91.  
  92.   disp_str(_,_,_,_):-keypressed,!.
  93.   disp_str(0,MINCOL,LEN,TEXT):-!,
  94.     field_str(0,MINCOL,LEN,TEXT).
  95.   disp_str(OFFSET,MINCOL,LEN,TEXT):-
  96.     frontstr(OFFSET,TEXT,_,TXT2),!,
  97.     field_str(0,MINCOL,LEN,TXT2).
  98.   disp_str(_,MINCOL,LEN,_):-
  99.     field_str(0,MINCOL,LEN,"").
  100.  
  101.   inpstate(_):-retract(lineinpstate(_,_)),fail.
  102.   inpstate(T):-assert(T).
  103.  
  104.   lineinpcursor(COL,MAXCOL,MINCOL,_,_):-
  105.     COL<MAXCOL,COL>=MINCOL,!,cursor(0,COL).
  106.   lineinpcursor(COL,MAXCOL,_,OFFSET,TXT):-
  107.     COL>=MAXCOL,!,
  108.     OFFSET1=1+OFFSET+COL-MAXCOL,
  109.     inpstate(lineinpstate(TXT,OFFSET1)),
  110.     COL1=MAXCOL-1,
  111.     cursor(0,COL1).
  112.   lineinpcursor(COL,_,MINCOL,OFFSET,TXT):-
  113.     COL<MINCOL,
  114.     OFFSET1=OFFSET-(1+MINCOL-COL),
  115.     max(0,OFFSET1,OFFSET2),
  116.     inpstate(lineinpstate(TXT,OFFSET2)),
  117.     cursor(0,MINCOL).
  118.  
  119.   myfrontstr(N,STR,S1,S2):-frontstr(N,STR,S1,S2),!.
  120.   myfrontstr(N,STR,S1,""):-
  121.     str_len(STR,NN),
  122.     LEN=N-NN,
  123.     str_len(SS,LEN),
  124.     concat(STR,SS,S1).
  125.  
  126.   changemode:-retract(insmode),!.
  127.   changemode:-assert(insmode).
  128.  
  129.   lin(char(T),POS,STR,STR1):-
  130.     insmode,!,
  131.     myfrontstr(POS,STR,S1,S2),
  132.     frontchar(S22,T,S2),
  133.     concat(S1,S22,STR1).
  134.  
  135.   lin(char(T),POS,STR,STR1):-
  136.     myfrontstr(POS,STR,S1,S2),
  137.     dropchar(S2,S21),
  138.     frontchar(S22,T,S21),
  139.     concat(S1,S22,STR1).
  140.  
  141.   lin(del,POS,STR,STR1):-
  142.     frontstr(POS,STR,S1,S2),
  143.     frontchar(S2,_,S22),!,
  144.     concat(S1,S22,STR1).
  145.   lin(del,_,S,S).
  146.  
  147.   dropchar(S,S1):-frontchar(S,_,S1),!.
  148.   dropchar(S,S).
  149.  
  150.  
  151.  /**********************************************************************
  152.  inpkeyact carries out associated action for user input. Handles all
  153.  standard input keys: arrow keys, insert, delete, etc.
  154.  ***********************************************************************/
  155.  
  156.   inpkeyact(char(T),COL,MAXCOL,MINCOL,OFFSET,TXT,OLDTXT):-
  157.     lineinpflag,!,
  158.     POS=OFFSET+COL-MINCOL,
  159.     lin(char(T),POS,TXT,TXT1),
  160.     inpstate(lineinpstate(TXT1,OFFSET)),
  161.     inpkeyact(right,COL,MAXCOL,MINCOL,OFFSET,TXT1,OLDTXT).
  162.  
  163.   inpkeyact(char(T),_,MAXCOL,MINCOL,_,_,OLDTXT):-
  164.     assert(lineinpflag),
  165.     str_char(TXT1,T),
  166.     inpstate(lineinpstate(TXT1,0)),
  167.     inpkeyact(right,MINCOL,MAXCOL,MINCOL,0,TXT1,OLDTXT).
  168.  
  169.   inpkeyact(del,COL,_,MINCOL,OFFSET,TXT,_):-
  170.     POS=OFFSET+COL-MINCOL,
  171.     lin(del,POS,TXT,TXT1),
  172.     inpstate(lineinpstate(TXT1,OFFSET)).
  173.  
  174.   inpkeyact(bdel,COL,MAXCOL,MINCOL,OFFSET,TXT,OLDTXT):-
  175.     COL>MINCOL,
  176.     POS=OFFSET+COL-1-MINCOL,
  177.     lin(del,POS,TXT,TXT1),
  178.     inpstate(lineinpstate(TXT1,OFFSET)),
  179.     inpkeyact(left,COL,MAXCOL,MINCOL,OFFSET,TXT1,OLDTXT).
  180.  
  181.   inpkeyact(cr,_,_,_,_,_,_).
  182.  
  183.   inpkeyact(fkey(10),_,_,_,_,_,_).
  184.  
  185. /*inpkeyact(fkey(1),_,_,_,_,_,_):-help.  If a help system is used  */
  186.  
  187.   inpkeyact(esc,_,_,_,_,_,_).
  188.  
  189.   inpkeyact(ins,_,_,_,_,_,_):-changemode.
  190.  
  191.   inpkeyact(home,_,_,MINCOL,_,TXT,_):-
  192.     inpstate(lineinpstate(TXT,0)),
  193.     cursor(0,MINCOL).
  194.  
  195.   inpkeyact(end,_,MAXCOL,MINCOL,_,TXT,_):-
  196.     str_len(TXT,STRLEN),
  197.     COL=MINCOL+STRLEN,
  198.     COL<MAXCOL,!,
  199.     inpstate(lineinpstate(TXT,0)),
  200.     cursor(0,COL).
  201.  
  202.   inpkeyact(end,_,MAXCOL,MINCOL,_,TXT,_):-
  203.     str_len(TXT,STRLEN),
  204.     OFFSET=(MINCOL+STRLEN+1)-MAXCOL,
  205.     inpstate(lineinpstate(TXT,OFFSET)),
  206.     COL=MAXCOL-1,
  207.     cursor(0,COL).
  208.  
  209.   inpkeyact(right,COL,MAXCOL,MINCOL,OFFSET,TXT,_):-
  210.     COL1=COL+1,
  211.     lineinpcursor(COL1,MAXCOL,MINCOL,OFFSET,TXT).
  212.  
  213.   inpkeyact(ctrlright,COL,MAXCOL,MINCOL,OFFSET,TXT,_):-
  214.     COL1=COL+5,
  215.     lineinpcursor(COL1,MAXCOL,MINCOL,OFFSET,TXT).
  216.  
  217.   inpkeyact(left,COL,MAXCOL,MINCOL,OFFSET,TXT,_):-
  218.     COL1=COL-1,
  219.     lineinpcursor(COL1,MAXCOL,MINCOL,OFFSET,TXT).
  220.  
  221.   inpkeyact(ctrlleft,COL,MAXCOL,MINCOL,OFFSET,TXT,_):-
  222.     COL1=COL-5,
  223.     lineinpcursor(COL1,MAXCOL,MINCOL,OFFSET,TXT).
  224.  
  225.   inpkeyact(ctrlbdel,_,_,MINCOL,_,_,_):-
  226.     inpstate(lineinpstate("",0)),
  227.     cursor(0,MINCOL).
  228.  
  229.   inpkeyact(fkey(8),_,_,MINCOL,_,_,OLDTXT):-
  230.     OLDTXT><"",
  231.     inpstate(lineinpstate(OLDTXT,0)),
  232.     cursor(0,MINCOL).
  233.