home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 5 / 05.iso / a / a009 / 6.ddi / RL.LIF / RLDIALG.PRG < prev    next >
Encoding:
Text File  |  1991-04-14  |  10.0 KB  |  626 lines

  1. ***
  2. *    multibox()
  3. *
  4. *    sysparam values:
  5. *        1    =    initialize and display
  6. *        2    =    hilite (become the current item)
  7. *        3    =    dehilite (become a non-current item)
  8. *        4    =    become a selected item and return a new state
  9. *
  10. *        note that the above values are interpreted
  11. *             differently by each function
  12. *
  13. *    states:
  14. *        0    =    abort the process
  15. *        1    =    initialization
  16. *        2    =    pointing (cursor)
  17. *        3    =    entry/selection
  18. *        4    =    complete the process
  19. ***
  20. FUNCTION multibox
  21.  
  22. PARAMETERS wt, wl, wh, beg_curs, boxarray
  23. PRIVATE funcn, sysparam, state, cursor, x
  24. PRIVATE asel, arel, frame, lframe
  25.  
  26. asel       = 1
  27. arel       = 0
  28. frame      = "╒═╕│╛═╘│"
  29. lframe     = "╤═╕│╛═╧│"
  30.  
  31. DECLARE box_row[LEN(boxarray)]
  32. DECLARE box_col[LEN(boxarray)]
  33.  
  34. SAVE SCREEN
  35.  
  36. @ wt, wl, wt + wh + 1, wl + 45 BOX frame + " "
  37.  
  38. * state 1 ... initialization
  39. sysparam = 1
  40.  
  41. FOR cursor = 1 TO LEN(boxarray)
  42.     funcn = boxarray[cursor]
  43.     x = &funcn
  44.  
  45.     * each function leaves the cursor at its top left corner
  46.     box_row[cursor] = ROW()
  47.     box_col[cursor] = COL()
  48.  
  49. NEXT
  50.  
  51. cursor = beg_curs
  52. state = 2
  53.  
  54. DO WHILE state <> 0 .AND. state <> 4
  55.     * till completed or aborted
  56.     funcn = boxarray[cursor]
  57.  
  58.     DO CASE
  59.  
  60.         CASE state = 2
  61.             * pointing state
  62.             sysparam = 2
  63.             x = &funcn
  64.  
  65.             k = INKEY(0)
  66.  
  67.             DO CASE
  68.  
  69.                 CASE k = 13 .OR. jisdata(k)
  70.                     * change to selection state
  71.                     state = 3
  72.  
  73.                 CASE k = 27
  74.                     * abort
  75.                     state = 0
  76.  
  77.                 OTHERWISE
  78.                     * current item becomes uncurrent
  79.                     sysparam = 3
  80.                     x = &funcn
  81.  
  82.                     * get a new cursor
  83.                     cursor = matrix(cursor, k)
  84.  
  85.             ENDCASE
  86.  
  87.         CASE state = 3
  88.             * be selected and return a new state
  89.             sysparam = 4
  90.             state = &funcn
  91.  
  92.     ENDCASE
  93. ENDDO
  94.  
  95. RESTORE SCREEN
  96.  
  97. RETURN state
  98.  
  99.  
  100. ***
  101. *    title
  102. ***
  103. FUNCTION enter_title
  104. PARAMETERS sysparam
  105.  
  106. IF sysparam = 1
  107.     @ wt + 1, wl + 2 SAY "Enter a filename "
  108.  
  109.     * set cursor for initialization
  110.     @ wt + 1, wl + 2 SAY ""
  111.  
  112. ENDIF
  113.  
  114. RETURN 2
  115.  
  116.  
  117. FUNCTION save_title
  118. PARAMETERS sysparam
  119.  
  120. IF sysparam = 1
  121.     * watch out for the length of file, it may exceed the box width (path)
  122.     @ wt + 3, wl + 4 SAY "Save Changes To File " + TRIM(filename) + "?"
  123.  
  124.     * set cursor for initialization
  125.     @ wt + 3, wl + 4 SAY ""
  126.  
  127. ENDIF
  128.  
  129. RETURN 2
  130.  
  131. ***
  132. *    get filename
  133. ***
  134. FUNCTION rl_getfil
  135. PARAMETERS sysparam
  136.  
  137. DO CASE
  138.  
  139.     CASE sysparam = 1 .OR. sysparam = 3
  140.         @ wt + 3, wl + 2 SAY "File " + SUBSTR(filename, 1, 20)
  141.  
  142.         IF sysparam = 1
  143.             * set cursor for initialization
  144.             @ wt + 3, wl + 9 SAY ""
  145.         ENDIF
  146.  
  147.     CASE sysparam = 2
  148.         * be current...hilite
  149.         SET COLOR TO I
  150.         @ wt + 3, wl + 7 SAY SUBSTR(filename, 1, 20)
  151.         SET COLOR TO BG+/B
  152.  
  153.     CASE sysparam = 4
  154.         * be selected...perform a GET on entry field
  155.         
  156.         Note: any other 'isdata' key will also execute selection
  157.         IF k <> 13
  158.             KEYBOARD CHR(k)
  159.         ENDIF
  160.         
  161.         filename = jenter_rc(filename, wt + 3, wl + 7, 64, "@K!S20")
  162.  
  163.         SET CURSOR ON
  164.         READ
  165.         SET CURSOR OFF
  166.  
  167.         IF LASTKEY() = 13 .AND. .NOT. EMPTY(filename)
  168.             * filename has been selected...go to the ok button
  169.             filename = JPAD(filename,20)
  170.             @ wt + 3, wl + 7 SAY filename
  171.             to_ok()
  172.         ENDIF
  173. ENDCASE
  174.  
  175. RETURN 2
  176.  
  177. ***
  178. *    file list
  179. ***
  180. FUNCTION filelist
  181. PARAMETERS sysparam
  182. PRIVATE c
  183.  
  184. DO CASE
  185.  
  186.     CASE sysparam = 1
  187.         * clear the window
  188.         scroll(wt + 1, wl + 31, wt + wh, wl + 44, 0)
  189.         @ wt, wl + 30, wt + wh + 1, wl + 45 BOX lframe
  190.  
  191.         IF .NOT. EMPTY(files[1])
  192.             * display the files list
  193.             KEYBOARD CHR(27)
  194.             achoice(wt+1,wl+32,wt+wh,wl+43,files,"ch_func",0,asel,arel)
  195.  
  196.         ENDIF
  197.  
  198.         * set cursor for initialization
  199.         @ wt + 1, wl + 32 SAY ""
  200.  
  201.     CASE sysparam = 2
  202.  
  203.         IF EMPTY(files[1])
  204.             * cannot cursor onto an empty list
  205.             KEYBOARD CHR(219)
  206.  
  207.         ELSE
  208.             * set initial relative row and array element
  209.             asel = asel - arel + ROW() - wt - 1
  210.             arel = ROW() - wt - 1
  211.  
  212.             * do the list selection
  213.             c = achoice(wt+1,wl+32,wt+wh,wl+43,files,"ch_func",0,asel,arel)
  214.  
  215.             IF LASTKEY() = 13
  216.                 * filename selected from list...set memvar
  217.                 filename = SUBSTR(files[c] + SPACE(64), 1, 64)
  218.  
  219.                 * display filename in entry blank
  220.                 rl_getfil(3)
  221.  
  222.                 * go directly to ok button
  223.                 to_ok()
  224.  
  225.             ELSE
  226.  
  227.                 IF LASTKEY() = 19
  228.                     * the system responds to CHR(19) as ^S
  229.                     KEYBOARD CHR(219)
  230.  
  231.                 ELSE
  232.                     * send character to multibox
  233.                     KEYBOARD CHR(LASTKEY())
  234.  
  235.                 ENDIF
  236.             ENDIF
  237.         ENDIF
  238. ENDCASE
  239.  
  240. RETURN 2
  241.  
  242.  
  243. ***
  244. *    ok button
  245. ***
  246. FUNCTION ok_button
  247.  
  248. PARAMETERS sysparam
  249. PRIVATE ok, reply
  250.  
  251. ok = " Ok "
  252. reply = 2
  253.  
  254. DO CASE
  255.  
  256.     CASE sysparam = 1 .OR. sysparam = 3
  257.         @ wt + wh, wl + 9 SAY ok
  258.  
  259.         IF sysparam = 1
  260.             * set cursor for initialization
  261.             @ wt + wh, wl + 9 SAY ""
  262.  
  263.         ENDIF
  264.  
  265.     CASE sysparam = 2
  266.         * be current...hilite
  267.         SET COLOR TO I
  268.         @ wt + wh, wl + 9 SAY ok
  269.         SET COLOR TO BG+/B
  270.  
  271.     CASE sysparam = 4
  272.  
  273.         IF &okee_dokee
  274.             * a job well done...complete the process
  275.             reply = 4
  276.         ENDIF
  277.  
  278. ENDCASE
  279.  
  280. RETURN reply
  281.  
  282.  
  283. ***
  284. *    cancel button
  285. ***
  286. FUNCTION cancel_button
  287.  
  288. PARAMETERS sysparam
  289. PRIVATE can, reply
  290.  
  291. can = " Cancel "
  292. reply = 2
  293.  
  294. DO CASE
  295.  
  296.     CASE sysparam = 1 .OR. sysparam = 3
  297.         @ wt + wh, wl + 17 SAY can
  298.  
  299.         IF sysparam = 1
  300.             * set cursor for initialization
  301.             @ wt + wh, wl + 17 SAY ""
  302.  
  303.         ENDIF
  304.  
  305.     CASE sysparam = 2
  306.         * be current...hilite
  307.         SET COLOR TO I
  308.         @ wt + wh, wl + 17 SAY can
  309.         SET COLOR TO BG+/B
  310.  
  311.     CASE sysparam = 4
  312.         * cancel selected...abort the process
  313.         reply = 0
  314.  
  315. ENDCASE
  316.  
  317. RETURN reply
  318.  
  319. ***
  320. *    cancel button for save file box
  321. ***
  322. FUNCTION can_button
  323.  
  324. PARAMETERS sysparam
  325. PRIVATE can, reply
  326.  
  327. can = " Cancel "
  328. reply = 2
  329.  
  330. DO CASE
  331.  
  332.     CASE sysparam = 1 .OR. sysparam = 3
  333.         @ wt + wh, wl + 25 SAY can
  334.  
  335.         IF sysparam = 1
  336.             * set cursor for initialization
  337.             @ wt + wh, wl + 25 SAY ""
  338.  
  339.         ENDIF
  340.  
  341.     CASE sysparam = 2
  342.         * be current...hilite
  343.         SET COLOR TO I
  344.         @ wt + wh, wl + 25 SAY can
  345.         SET COLOR TO BG+/B
  346.  
  347.     CASE sysparam = 4
  348.         * cancel selected...abort the process
  349.         reply = 0
  350.  
  351. ENDCASE
  352.  
  353. RETURN reply
  354.  
  355. ***
  356. *    no button
  357. ***
  358. FUNCTION no_button
  359.  
  360. PARAMETERS sysparam
  361. PRIVATE no, reply
  362.  
  363. no = " No "
  364. reply = 2
  365.  
  366. DO CASE
  367.  
  368.     CASE sysparam = 1 .OR. sysparam = 3
  369.         @ wt + wh, wl + 13 SAY no
  370.  
  371.         IF sysparam = 1
  372.             * set cursor for initialization
  373.             @ wt + wh, wl + 13 SAY ""
  374.  
  375.         ENDIF
  376.  
  377.     CASE sysparam = 2
  378.         * be current...hilite
  379.         SET COLOR TO I
  380.         @ wt + wh, wl + 13 SAY no
  381.         SET COLOR TO BG+/B
  382.  
  383.     CASE sysparam = 4
  384.         * 'No' selected...abort the process
  385.         reply = 0
  386.         no_save_flag = .T.
  387. ENDCASE
  388.  
  389. RETURN reply
  390.  
  391.  
  392. ***
  393. *    achoice user function
  394. ***
  395. FUNCTION ch_func
  396.  
  397. PARAMETERS amod, sel, rel
  398. PRIVATE k, r, srow, scol
  399.  
  400. srow = ROW()
  401. scol = COL()
  402.  
  403. asel = sel
  404. arel = rel
  405. r = 2
  406.  
  407. IF asel > arel + 1
  408.     * more files off screen up
  409.     @ wt + 1, wl + 44 SAY CHR(24)
  410.  
  411. ELSE
  412.     @ wt + 1, wl + 44 SAY " "
  413.  
  414. ENDIF
  415.  
  416. IF LEN(files) - asel > wh - 1 - arel
  417.     * more files off screen down
  418.     @ wt + wh, wl + 44 SAY CHR(25)
  419.  
  420. ELSE
  421.     @ wt + wh, wl + 44 SAY " "
  422.  
  423. ENDIF
  424.  
  425. IF amod = 3
  426.     k = LASTKEY()
  427.  
  428.     DO CASE
  429.  
  430.         CASE k = 27
  431.             * escape key
  432.             r = 0
  433.  
  434.         CASE k = 13 .OR. k = 19 .OR. k = 219
  435.             * return or left arrow
  436.             r = 1
  437.  
  438.         CASE k = 1
  439.             * home key..top of list
  440.             KEYBOARD CHR(31)
  441.  
  442.         CASE k = 6
  443.             * end key..end of list
  444.             KEYBOARD CHR(30)
  445.  
  446.     ENDCASE
  447. ENDIF
  448.  
  449. @ M->srow, M->scol SAY ""
  450. RETURN r
  451.  
  452.  
  453. ***
  454. *    do_it()
  455. *
  456. *    called from the "Ok" button as "&okee_dokee"
  457. *    this function normally completes the process
  458. ***
  459. FUNCTION do_it
  460.  
  461. PRIVATE done, error_str
  462.  
  463. DO CASE
  464.  
  465.     * error if empty filename
  466.     CASE EMPTY(filename)    && error, empty filename
  467.         KEYBOARD CHR(5)
  468.         done = .F.
  469.  
  470.     OTHERWISE
  471.         done = .T.
  472.  
  473. ENDCASE
  474.  
  475. RETURN done
  476.  
  477.  
  478. ***
  479. *    relocate cursor
  480. ***
  481. FUNCTION matrix
  482.  
  483. PARAMETERS old_curs, k
  484. PRIVATE old_row, old_col, test_curs, new_curs
  485.  
  486. old_row = ROW()
  487. old_col = box_col[old_curs]
  488. new_curs = old_curs
  489. test_curs = old_curs
  490.  
  491. DO CASE
  492.  
  493.     CASE k = 19 .OR. k = 219
  494.         * left arrow
  495.  
  496.         DO WHILE test_curs > 2
  497.             test_curs = test_curs - 1
  498.  
  499.             IF box_col[test_curs] < old_col .AND. box_row[test_curs] >= old_row
  500.  
  501.                 IF box_row[test_curs] < box_row[new_curs] .OR. new_curs = old_curs
  502.                     * best so far
  503.                     new_curs = test_curs
  504.  
  505.                 ENDIF
  506.             ENDIF
  507.         ENDDO
  508.  
  509.     CASE k = 4
  510.         * right arrow
  511.  
  512.         DO WHILE test_curs < LEN(box_col)
  513.             test_curs = test_curs + 1
  514.  
  515.             IF box_col[test_curs] > old_col .AND. box_row[test_curs] <= old_row
  516.  
  517.                 IF box_row[test_curs] > box_row[new_curs] .OR. new_curs = old_curs
  518.                     * best so far
  519.                     new_curs = test_curs
  520.  
  521.                 ENDIF
  522.             ENDIF
  523.         ENDDO
  524.  
  525.     CASE k = 5
  526.         * up arrow
  527.  
  528.         DO WHILE test_curs > 2
  529.             test_curs = test_curs - 1
  530.  
  531.             IF box_row[test_curs] < old_row .AND. box_col[test_curs] <= old_col
  532.  
  533.                 IF box_col[test_curs] > box_col[new_curs] .OR. new_curs = old_curs
  534.                     * best so far
  535.                     new_curs = test_curs
  536.  
  537.                 ENDIF
  538.             ENDIF
  539.         ENDDO
  540.  
  541.     CASE k = 24
  542.         * down arrow
  543.  
  544.         DO WHILE test_curs < LEN(box_row)
  545.             test_curs = test_curs + 1
  546.  
  547.             IF box_row[test_curs] > old_row .AND. box_col[test_curs] >= old_col
  548.  
  549.                 IF box_col[test_curs] < box_col[new_curs] .OR. new_curs = old_curs
  550.                     * best so far
  551.                     new_curs = test_curs
  552.  
  553.                 ENDIF
  554.             ENDIF
  555.         ENDDO
  556. ENDCASE
  557.  
  558. RETURN new_curs
  559.  
  560.  
  561. ***
  562. *    go directly to ok button
  563. ***
  564. FUNCTION to_ok
  565.  
  566. cursor = ascan(boxarray, "ok_button(sysparam)")
  567. KEYBOARD CHR(219)
  568. RETURN 0
  569.  
  570. ******
  571. *    jisdata()
  572. *
  573. *    determine if a key is data suitable for entry in place
  574. ******
  575. FUNCTION jisdata
  576.  
  577. PARAMETERS k
  578.  
  579. RETURN (M->k >= 32 .AND. M->k < 249 .AND. M->k <> 219 .AND. CHR(M->k) <> ";")
  580.  
  581.  
  582. ******
  583. *    jenter_rc(r,c,max_len,pfunc)
  584. *
  585. *    entry in place
  586. ******
  587. FUNCTION jenter_rc
  588.  
  589. PARAMETERS org_str,r,c,max_len,pfunc
  590. PRIVATE wk_str, keystroke
  591.  
  592. wk_str = JPAD(org_str, max_len)
  593. SET CURSOR ON
  594.  
  595. IF .NOT. EMPTY(pfunc)
  596.     @ r,c GET wk_str PICTURE pfunc
  597. ELSE
  598.     @ r,c GET wk_str
  599. ENDIF
  600.  
  601. READ
  602. SET CURSOR OFF
  603.  
  604. keystroke = LASTKEY()
  605.  
  606. IF keystroke = 27
  607.     wk_str = ""
  608. ENDIF
  609.  
  610. RETURN (TRIM(wk_str))
  611.  
  612.  
  613. ******
  614. *    jpad()
  615. *
  616. *    syntax: jpad( <expC>, <expN> )
  617. *
  618. *    return: <expC> padded with spaces so that len( <expC> ) = <expN>
  619. ******
  620. FUNCTION jpad
  621.  
  622. PARAMETERS s, n
  623.  
  624. RETURN(SUBSTR(s + SPACE(n), 1, n))
  625.  
  626.