home *** CD-ROM | disk | FTP | other *** search
/ C!T ROM 2 / ctrom_ii_b.zip / ctrom_ii_b / PROGRAM / FOXPRO / VEDIT060 / SOURCE / VEDIT1.PRG < prev    next >
Text File  |  1992-04-16  |  48KB  |  1,572 lines

  1. *******************************************************************************
  2. *                                                                             *
  3. *                         (c) 1992, Jayson R. Minard                          *
  4. *                                                                             *
  5. *******************************************************************************
  6. *DEFINE demo
  7.  
  8. VARDEF EXTERN
  9.   BYTE __color_std, __color_enhcd
  10. ENDDEF
  11.  
  12. #INCLUDE WARN.HDR
  13. #INCLUDE vlist.hdr
  14. #INCLUDE vedit.hdr
  15. #INCLUDE vmouse.hdr
  16. #INCLUDE STRING.HDR
  17. #INCLUDE IO.HDR
  18. #INCLUDE KEYS.HDR
  19. #INCLUDE MATH.HDR
  20.  
  21. FUNCTION INT VEdit_Call_Handler PROTOTYPE
  22.   PARAMETERS    UNTYPED    handler,;
  23.              VALUE LONG    list_handle,;
  24.                    UINT    list_element,;
  25.                    UINT    list_column,;
  26.                    UINT    mouse_stat,;
  27.              VALUE UINT    mrow,;
  28.              VALUE UINT    mcol,;
  29.                     INT    pick_key,;
  30.                    UINT    top_element,;
  31.              VALUE UINT    last_element,;
  32.                    UINT    ur,;
  33.                    UINT    uc,;
  34.                    UINT    lr,;
  35.                    UINT    lc,;
  36.                    UINT    stat_row,;
  37.                    UINT    stat_col,;
  38.              VALUE LOGICAL display_only,;
  39.                    LOGICAL refresh
  40.  
  41.  
  42. ** returns a code to inform VEdit_Text_Editor what to do
  43. **
  44. **  0 - error
  45. *   1 - do nothing (quit)
  46. **  2 - save and exit
  47. **  3 - save and continue
  48. **  4 - just continue
  49. **  5 - save as new filename
  50. **  6 - save and rename
  51. **
  52.  
  53. FUNCTION UINT VEdit_Internal_Editor
  54.   PARAMETERS VALUE LONG    handle,;
  55.              VALUE LONG    scrap,;
  56.              VALUE LONG    undelete,;
  57.              VALUE INT     upper_row,;
  58.              VALUE INT     upper_col,;
  59.              VALUE INT     lower_row,;
  60.              VALUE INT     lower_col,;
  61.                    UINT    top_element,;
  62.                    UINT    initial_element,;
  63.                    UINT    left_col,;
  64.                    UINT    initial_col,;
  65.                    UINT    right_margin,;   && max 132
  66.              VALUE UINT    hard_margin,;
  67.              VALUE BYTE    marked_text_color,;
  68.                    LOGICAL word_wrap,;
  69.              VALUE LOGICAL display_only,;
  70.              VALUE LOGICAL flash,;
  71.              VALUE LOGICAL scroll_bar,;
  72.              VALUE LOGICAL stat_line,;
  73.              VALUE UINT    stat_row,;
  74.              VALUE UINT    stat_col,;
  75.              VALUE LOGICAL is_mouse,;
  76.              VALUE LOGICAL allow_embedded,;
  77.              VALUE UINT    tab_stop,;
  78.              VALUE UINT    undelete_lines,;
  79.                 UNTYPED    key_handler
  80.  
  81.   VARDEF
  82.     UINT  ret_val
  83.  
  84.     UINT  last_element                 && last total element
  85.     UINT  height                       && height of pick window
  86.     UINT  temp_mark
  87.  
  88.     LOGICAL refresh
  89.     LOGICAL mini_refresh
  90.     LOGICAL list_loop
  91.     LOGICAL resize
  92.  
  93.     BYTE   old_std, old_enhcd, o_std
  94.  
  95.     UINT    scroll_col, scroll_top, scroll_bottom, scroll_row
  96.     LOGICAL scroll_refresh
  97.     LOGICAL abort
  98.  
  99.     UINT    current_x
  100.     UINT    current_y
  101.     UINT    old_y, old_x
  102.     UINT    current_wide
  103.     UINT    current_over
  104.  
  105.     LOGICAL check_wrap, do_it
  106.  
  107.     INT     pick_key
  108.  
  109.     UINT    temp_row
  110.     CHAR    temp_str, full_str, temp_str2
  111.  
  112.     UINT    mouse_stat
  113.     LOGICAL mouse_search
  114.     UINT    mouse_found
  115.     UINT    mouse_last
  116.  
  117.     INT     user_proc
  118.     UINT    last_displayed
  119.  
  120.     UINT    old_element, old_ele
  121.  
  122.     UINT    mrow, mcol
  123.     LOGICAL mouse_set
  124.  
  125.     LOGICAL ml, mr
  126.     UINT    temp_number
  127.  
  128.     INT     temp_int1, temp_int4, temp_int5
  129.     DBL     temp_dbl1, temp_dbl2, temp_dbl3, temp_dbl
  130.  
  131.     UINT    counter
  132.     LOGICAL inner
  133.     LOGICAL changed
  134.     LOGICAL insert
  135.  
  136.     UINT    saved_stat
  137.     UINT    saved_scroll
  138.   ENDDEF
  139.  
  140.   IF flash
  141.     scroll_bar   = .F.
  142.     stat_line    = .F.
  143.     display_only = .T.
  144.   ENDIF
  145.  
  146.   insert = insert_key()
  147.   mouse_set = .T.
  148.  
  149.   old_std   = __color_std
  150.   old_enhcd = __color_enhcd
  151.  
  152.   IF initial_element = 0
  153.     initial_element = 1
  154.     top_element = 1
  155.   ENDIF
  156.  
  157.   IF top_element = 0
  158.     top_element = 1
  159.   ENDIF
  160.  
  161.   *- Check for valid picklist
  162.  
  163.   IF .NOT. Vlist_Is_Init( handle )
  164.     RETURN &edit_error
  165.   ENDIF
  166.  
  167.   last_element = Vlist_Max( handle )
  168.   IF last_element = 0
  169.     IF .NOT. Vlist_Add( handle, SPACE( hard_margin ) )
  170.       RETURN &edit_error
  171.     ENDIF
  172.  
  173.     last_element = 1
  174.     top_element  = 1
  175.     initial_col  = 1
  176.     left_col     = 1
  177.   ENDIF
  178.  
  179.   #ifdef demo
  180.   IF last_element > 85
  181.     display_only = .T.
  182.   ENDIF
  183.  
  184.   #ENDIF
  185.  
  186.   *- check starting conditions
  187.  
  188.   height = lower_row - upper_row + 1
  189.  
  190.   IF top_element > initial_element
  191.     top_element = initial_element
  192.   ENDIF
  193.  
  194.   IF ( ( initial_element - top_element ) + 1 ) > height
  195.     top_element = initial_element - height + 1
  196.   ENDIF
  197.  
  198.   current_y = upper_row + ( initial_element - top_element )
  199.  
  200.   * HEY, if we are using a scroll bar, set up its info
  201.   IF scroll_bar
  202.     scroll_refresh = .T.
  203.     scroll_col     = lower_col + __scroll_offset
  204.     scroll_top     = upper_row + 1
  205.     scroll_row     = 0
  206.     scroll_bottom  = lower_row - 1
  207.  
  208.     __color_std = __color_bar
  209.  
  210.     saved_scroll = SAVESCRN( scroll_top-1, scroll_col,;
  211.                                scroll_bottom+1, scroll_col )
  212.  
  213.     FOR temp_int1 = scroll_top TO scroll_bottom
  214.       @temp_int1, scroll_col SAY "░"
  215.     NEXT
  216.  
  217.     __color_std = __color_tab
  218.     @scroll_top-1, scroll_col SAY CHR( 24 )
  219.     @scroll_bottom+1, scroll_col SAY CHR( 25 )
  220.  
  221.     __color_std = old_std
  222.  
  223.   ENDIF
  224.  
  225.   current_x       = upper_col
  226.   current_wide    = lower_col - upper_col + 1
  227.  
  228.   IF initial_col = 0
  229.     initial_col = 1
  230.   ENDIF
  231.  
  232.   IF initial_col > hard_margin
  233.     initial_col = hard_margin
  234.   ENDIF
  235.  
  236.   IF left_col = 0
  237.     left_col = 1
  238.   ENDIF
  239.  
  240.   IF ( ( initial_col - left_col ) + 1 ) > current_wide
  241.     left_col = initial_col - current_wide + 1
  242.   ENDIF
  243.  
  244.   IF is_mouse
  245.     ml = Vmouse_Left_Button()
  246.     mr = Vmouse_Right_Button()
  247.     Vmouse_Cursor( .T. )
  248.   ENDIF
  249.  
  250.   *** start the stupid thing!
  251.   refresh   = .T.                      && start by drawing the screen
  252.   list_loop = .T.
  253.   abort     = .F.
  254.   check_wrap = .F.
  255.  
  256.   mouse_search = .F.
  257.   mouse_last   = initial_element
  258.  
  259.   user_proc = 999
  260.  
  261.   IF stat_line
  262.     saved_stat = SAVESCRN( stat_row, stat_col, stat_row, stat_col + 41 )
  263.     o_std = __color_std
  264.     __color_std = __color_tab
  265.     IF .NOT. display_only
  266.       @stat_row, stat_col SAY " Line:        Col:                       "
  267.     ELSE
  268.       @stat_row, stat_col SAY " Line:        Col:         DISPLAY ONLY! "
  269.     ENDIF
  270.  
  271.     __color_std = o_std
  272.   ENDIF
  273.  
  274.   DO WHILE list_loop
  275.     IF is_mouse
  276.       Vmouse_Cursor( .F. )
  277.     ENDIF
  278.  
  279.     IF refresh
  280.       last_element = Vlist_Max( handle )
  281.       IF last_element <= height
  282.         top_element = 1
  283.       ENDIF
  284.  
  285.       IF .NOT. Vlist_Goto( handle, top_element )
  286.         list_loop = .F.
  287.         abort     = .T.
  288.         ret_val   = &edit_error
  289.         LOOP
  290.       ENDIF
  291.  
  292.       mouse_found = 0
  293.  
  294.       temp_row  = upper_row
  295.  
  296.       temp_number = Vlist_Number( handle )
  297.       DO WHILE ( temp_row <= lower_row ) .AND.;
  298.                        ( temp_number <= last_element ) .AND.;
  299.                        ( .NOT. Vlist_Bol( handle ) )
  300.  
  301.         IF temp_number = initial_element
  302.           current_y    = temp_row
  303.         ENDIF
  304.  
  305.         IF mouse_search .AND. is_mouse
  306.           IF ( temp_row = mrow ) .AND.;
  307.                      ( ( mcol>= current_x ) .AND.;
  308.                      ( mcol<=( current_x+current_wide-1 ) ) )
  309.             initial_element = temp_number
  310.             current_y       = temp_row
  311.             mouse_found     = initial_element
  312.             initial_col     = mcol - upper_col + 1
  313.           ENDIF
  314.  
  315.         ELSE
  316.           full_str = Vlist_Cstr( handle )
  317.           temp_str = full_str
  318.           Vlist_What_Color( handle, old_std )
  319.  
  320.           IF left_col > 0
  321.             temp_str = SUBSTR( temp_str, left_col, current_wide )
  322.           ELSE
  323.             temp_str = LEFT( temp_str, current_wide )
  324.           ENDIF
  325.  
  326.           IF allow_embedded
  327.             Vlist_Say( temp_row, current_x, current_wide, temp_str, .F. )
  328.           ELSE
  329.             @temp_row, current_x SAY temp_str:current_wide
  330.           ENDIF
  331.  
  332.         ENDIF
  333.  
  334.         last_displayed = temp_number
  335.  
  336.         Vlist_Skip( handle, &jl_forward )
  337.         temp_row = temp_row + 1
  338.         temp_number = Vlist_Number( handle )
  339.       ENDDO
  340.  
  341.       IF .NOT. mouse_search
  342.         IF temp_row <= lower_row
  343.           @temp_row, upper_col CLEAR TO lower_row, lower_col
  344.         ENDIF
  345.  
  346.       ENDIF
  347.  
  348.  
  349.       scroll_refresh = .T.
  350.       refresh = .F.
  351.  
  352.     ENDIF
  353.  
  354.     IF flash
  355.       IF is_mouse
  356.         vmouse_cursor(.T.)
  357.       ENDIF
  358.       list_loop = .F.
  359.       LOOP
  360.     ENDIF
  361.  
  362.     IF Vlist_Number( handle ) <> initial_element
  363.       Vlist_Goto( handle, initial_element )
  364.     ENDIF
  365.  
  366.     IF scroll_refresh .AND. scroll_bar
  367.  
  368.       *- length of scroll bar
  369.       temp_int4 = scroll_bottom - scroll_top + 1
  370.  
  371.       *- percentage
  372.       temp_dbl1 = last_element
  373.       temp_dbl2 = initial_element
  374.  
  375.       IF initial_element >= last_element
  376.         temp_int5 = scroll_bottom
  377.       ELSE
  378.         IF initial_element = 1
  379.           temp_int5 = scroll_top
  380.         ELSE
  381.  
  382.           temp_dbl3 = temp_int4
  383.           temp_dbl = ( temp_dbl2 / temp_dbl1 ) * temp_dbl3
  384.  
  385.           *- now figure row offset
  386.           temp_int5 = ROUND( temp_dbl, 0 )
  387.  
  388.           IF temp_int5 > temp_int4
  389.             temp_int5 = temp_int4
  390.           ENDIF
  391.  
  392.           temp_int5 = temp_int5 + scroll_top - 1
  393.  
  394.           IF temp_int5 < scroll_top
  395.             temp_int5 = scroll_top
  396.           ENDIF
  397.  
  398.         ENDIF
  399.  
  400.       ENDIF
  401.  
  402.       IF scroll_row <> temp_int5
  403.  
  404.         __color_std = __color_bar
  405.         IF scroll_row <> 0
  406.           @scroll_row, scroll_col SAY "░"
  407.         ENDIF
  408.  
  409.         scroll_row = temp_int5
  410.         @scroll_row, scroll_col SAY "▒"
  411.         __color_std = old_std
  412.  
  413.       ENDIF
  414.  
  415.       scroll_refresh = .F.
  416.     ENDIF
  417.  
  418.     full_str = Vlist_Cstr( handle )
  419.     temp_str = full_str
  420.     IF left_col > 0
  421.       temp_str = SUBSTR( temp_str, left_col, current_wide )
  422.     ELSE
  423.       temp_str = LEFT( temp_str, current_wide )
  424.     ENDIF
  425.  
  426.     __color_std = old_enhcd
  427.     current_over = current_x + ( initial_col - left_col )
  428.  
  429.     IF user_proc <> &jl_ignore
  430.       IF allow_embedded
  431.         Vlist_Say( current_y, current_x, current_wide, temp_str, .T. )
  432.       ELSE
  433.         @current_y, current_x SAY temp_str:current_wide
  434.       ENDIF
  435.  
  436.     ENDIF
  437.  
  438.     * turn cursor on to current location...
  439.  
  440.     IF mouse_search .AND. is_mouse
  441.       mouse_search = .F.
  442.       mouse_last = mouse_found
  443.     ENDIF
  444.  
  445.     inner = .T.
  446.     changed = .F.
  447.     scroll_refresh = .T.
  448.     DO WHILE inner
  449.       IF stat_line
  450.         CURSOR_OFF()
  451.         o_std = __color_std
  452.         __color_std = __color_bar
  453.         @stat_row, stat_col+7 SAY initial_element PICTURE "99999"
  454.         @stat_row, stat_col+19 SAY initial_col PICTURE "999"
  455.         insert = insert_key()
  456.         IF .NOT. display_only
  457.           IF insert
  458.             __color_std = __color_tab
  459.             @stat_row, stat_col+23 SAY "INSERT"
  460.             __color_std = __color_bar
  461.           ELSE
  462.             @stat_row, stat_col+23 SAY "insert"
  463.           ENDIF
  464.  
  465.           IF Vlist_Max( scrap ) > 0
  466.             __color_std = __color_tab
  467.             @stat_row, stat_col+30 SAY "SCRAP"
  468.             __color_std = __color_bar
  469.           ELSE
  470.             @stat_row, stat_col+30 SAY "scrap"
  471.           ENDIF
  472.  
  473.           IF word_wrap
  474.             __color_std = __color_tab
  475.             @stat_row, stat_col+36 SAY "WRAP"
  476.           ELSE
  477.             @stat_row, stat_col+36 SAY "wrap"
  478.           ENDIF
  479.  
  480.         ENDIF
  481.  
  482.         __color_std = o_std
  483.         #ifdef fuck
  484.         @22, 0 SAY "   ignore the following, it is for my debugging..."
  485.         @23, 0  SAY "top:  " + I_STR( top_element ) + "  "
  486.         @23, 20 SAY "current: " + I_STR( initial_element ) + "  "
  487.         @23, 40 SAY "left: " + I_STR( left_col ) + "  "
  488.         @23, 60 SAY "current: " + I_STR( initial_col ) + "  "
  489.         @24, 0  SAY "last: " + I_STR( last_element ) + "  "
  490.         @24, 20 SAY "Cur_Y: " + I_STR( current_y ) + "  "
  491.         #ENDIF
  492.       ENDIF
  493.  
  494.       mouse_stat = 0
  495.       mouse_set  = .F.
  496.       IF is_mouse
  497.         Vmouse_Cursor( .T. )
  498.       ENDIF
  499.  
  500.       current_over = current_x + ( initial_col - left_col )
  501.       @ current_y, current_over
  502.       CURSOR_ON()
  503.  
  504.       DO WHILE IS_KEY() = 0 .AND. mouse_stat = &jl_mouse_ignore
  505.         IF insert_key() <> insert
  506.           insert = insert_key()
  507.           IF stat_line
  508.             o_std = __color_std
  509.             IF insert .AND. ( .NOT. display_only )
  510.               __color_std = __color_tab
  511.               @stat_row, stat_col+23 SAY "INSERT"
  512.             ELSE
  513.               __color_std = __color_bar
  514.               @stat_row, stat_col+23 SAY "insert"
  515.             ENDIF
  516.  
  517.             __color_std = o_std
  518.           ENDIF
  519.  
  520.         ENDIF
  521.  
  522.         IF is_mouse
  523.           IF Vmouse_Left_Button() .AND. Vmouse_Right_Button()
  524.             mrow = Vmouse_Row()
  525.             mcol = Vmouse_Col()
  526.             mouse_stat = &jl_mouse_both
  527.           ELSE
  528.             IF ml
  529.               IF .NOT. Vmouse_Left_Button()   && find release point
  530.                 ml = .F.
  531.                 mrow = Vmouse_Row()
  532.                 mcol = Vmouse_Col()
  533.                 IF mcol = scroll_col .AND. scroll_bar
  534.                   DO CASE
  535.                     CASE mrow = scroll_top - 1
  536.                       mouse_stat = &jl_mouse_xup
  537.                       mouse_set = .T.
  538.                     CASE mrow = scroll_bottom + 1
  539.                       mouse_stat = &jl_mouse_xdown
  540.                       mouse_set = .T.
  541.                     CASE mrow >= scroll_top .AND. mrow <= scroll_bottom
  542.                       mouse_stat = &jl_mouse_xscroll
  543.                       mouse_set = .T.
  544.                     OTHERWISE              && other location
  545.                       mouse_stat = &jl_mouse_xleft
  546.                   ENDCASE
  547.  
  548.                 ELSE
  549.                   IF ( mrow >= upper_row ) .AND. ( mrow <= lower_row ) .AND.;
  550.                                ( mcol >= upper_col ) .AND. ( mcol <= lower_col )
  551.                     IF ( mrow = current_y ) .AND.;
  552.                                  ( mcol >= current_x ) .AND.;
  553.                                  ( mcol <= current_x + current_wide - 1 )
  554.                       mouse_stat = &jl_mouse_xselect
  555.                     ELSE
  556.                       mouse_stat = &jl_mouse_xnew
  557.                     ENDIF
  558.  
  559.                   ELSE
  560.                     mouse_stat = &jl_mouse_xleft
  561.                   ENDIF
  562.  
  563.                 ENDIF
  564.  
  565.               ENDIF
  566.  
  567.             ENDIF
  568.  
  569.             IF Vmouse_Left_Button()
  570.               ml = .T.
  571.               mrow = Vmouse_Row()
  572.               mcol = Vmouse_Col()
  573.               IF mcol = scroll_col .AND. scroll_bar
  574.                 DO CASE
  575.                   CASE mrow = scroll_top - 1
  576.                     mouse_stat = &jl_mouse_up       && scroll up
  577.                     mouse_set = .T.
  578.                   CASE mrow = scroll_bottom + 1
  579.                     mouse_stat = &jl_mouse_down       && scroll down
  580.                     mouse_set = .T.
  581.                   CASE mrow >= scroll_top .AND. mrow <= scroll_bottom
  582.                     mouse_stat = &jl_mouse_scroll
  583.                     mouse_set = .T.
  584.                   OTHERWISE              && other location
  585.                     mouse_stat = &jl_mouse_left
  586.                 ENDCASE
  587.  
  588.               ELSE
  589.                 IF ( mrow >= upper_row ) .AND. ( mrow <= lower_row ) .AND.;
  590.                                  ( mcol >= upper_col ) .AND. ( mcol <= lower_col )
  591.                   IF ( mrow = current_y ) .AND.;
  592.                                ( mcol >= current_x ) .AND.;
  593.                                ( mcol <= current_x + current_wide - 1 )
  594.                     mouse_stat = &jl_mouse_select
  595.                   ELSE
  596.                     mouse_stat = &jl_mouse_new
  597.                   ENDIF
  598.  
  599.                 ELSE
  600.                   mouse_stat = &jl_mouse_left
  601.                 ENDIF
  602.  
  603.               ENDIF
  604.  
  605.             ENDIF
  606.  
  607.             IF mr
  608.               IF .NOT. Vmouse_Right_Button()
  609.                 mr = .F.
  610.                 mrow = Vmouse_Row()
  611.                 mcol = Vmouse_Col()
  612.                 mouse_stat = &jl_mouse_xright
  613.               ENDIF
  614.  
  615.             ELSE
  616.               IF Vmouse_Right_Button()
  617.                 mr = .T.
  618.                 mrow = Vmouse_Row()
  619.                 mcol = Vmouse_Col()
  620.                 mouse_stat = &jl_mouse_right
  621.               ENDIF
  622.  
  623.             ENDIF
  624.  
  625.           ENDIF
  626.  
  627.         ENDIF
  628.  
  629.       ENDDO
  630.  
  631.       IF mouse_stat = &jl_mouse_ignore
  632.         pick_key = GET_KEY()
  633.         mouse_last = 0
  634.       ELSE
  635.         IF mouse_stat = &jl_mouse_scroll .OR. mouse_stat = &jl_mouse_xscroll
  636.           DO CASE
  637.             CASE mrow = scroll_bottom
  638.               pick_key = &k_pg_down
  639.             CASE mrow = scroll_top
  640.               pick_key = &k_pg_up
  641.             CASE mrow > scroll_row
  642.               pick_key = &k_pg_down
  643.             CASE mrow < scroll_row
  644.               pick_key = &k_pg_up
  645.             OTHERWISE
  646.               pick_key = 0
  647.           ENDCASE
  648.  
  649.         ELSE
  650.           pick_key = 0
  651.         ENDIF
  652.  
  653.       ENDIF
  654.  
  655.       IF is_mouse
  656.         Vmouse_Cursor( .F. )
  657.       ENDIF
  658.  
  659.       resize = .F.
  660.       old_element = initial_element
  661.  
  662.       user_proc = VEdit_Call_Handler( key_handler,;
  663.                      handle, initial_element, initial_col,;
  664.                      mouse_stat, mrow, mcol, pick_key,;
  665.                      top_element, last_displayed,;
  666.                      upper_row, upper_col, lower_row, lower_col,;
  667.                      stat_row, stat_col,;
  668.                      display_only, resize )
  669.  
  670.       old_y = current_y
  671.       old_x = current_x
  672.       mini_refresh = .F.
  673.       Vlist_Goto( handle, old_element )
  674.  
  675.       IF resize
  676.         IF changed .AND. ( .NOT. display_only )
  677.         ** comit line
  678.           Vlist_Cedit( handle, full_str )
  679.         ENDIF
  680.  
  681.         inner = .F.
  682.         refresh = .F.
  683.         list_loop = .F.
  684.         ret_val = &edit_continue
  685.         LOOP
  686.       ENDIF
  687.  
  688.       IF is_mouse
  689.         Vmouse_Cursor( .T. )
  690.         IF user_proc = &jl_goto_mouse
  691.           mouse_search = .T.
  692.           refresh = .T.
  693.           inner = .F.
  694.  
  695.           IF changed .AND. ( .NOT. display_only )
  696.           ** comit line
  697.             Vlist_Cedit( handle, full_str )
  698.           ENDIF
  699.  
  700.           LOOP
  701.         ENDIF
  702.  
  703.       ENDIF
  704.  
  705.       IF user_proc = &jl_paint_key
  706.         refresh = .T.
  707.         inner = .F.
  708.         user_proc = &jl_continue
  709.       ENDIF
  710.  
  711.       DO CASE
  712.         CASE user_proc = &jl_continue    && evaluate keystroke
  713.           DO CASE
  714.             CASE pick_key = &k_c_right
  715.               old_ele  = initial_element
  716.               temp_str = RTRIM( full_str )
  717.               do_it    = .T.
  718.               DO WHILE do_it
  719.                 IF initial_col >= LEN( temp_str )
  720.                 * move to next line
  721.                   IF initial_element = last_element
  722.                   * we are done
  723.                     do_it = .F.
  724.                     LOOP
  725.                   ELSE
  726.                     IF initial_element = top_element + height - 1
  727.                       top_element = top_element + 1
  728.                     ENDIF
  729.  
  730.                     initial_element = initial_element + 1
  731.                     Vlist_Skip( handle, &jl_forward )
  732.                     temp_str = RTRIM( Vlist_Cstr( handle ) )
  733.                     initial_col = 1
  734.                     left_col = 1
  735.                     * now we are on the next line
  736.                     IF LEN( temp_str ) > 0 .AND. LEFT( temp_str, 1 ) <> " "
  737.                     * we are done.
  738.                       do_it = .F.
  739.                       LOOP
  740.                     ENDIF
  741.  
  742.                   ENDIF
  743.  
  744.                 ELSE
  745.                 * move to next word on this line
  746.                   IF VEdit_Forward_Space( temp_str, initial_col ) <> 0
  747.                     do_it = .F.
  748.                     LOOP
  749.                   ENDIF
  750.  
  751.                 ENDIF
  752.  
  753.               ENDDO
  754.  
  755.               Vlist_Goto( handle, old_ele )
  756.               IF initial_element = old_ele
  757.                 mini_refresh = .T.
  758.               ELSE
  759.                 Vlist_Cedit( handle, full_str )
  760.                 changed = .F.
  761.                 Vlist_Goto( handle, initial_element )
  762.                 refresh = .T.
  763.                 inner   = .F.
  764.               ENDIF
  765.  
  766.             CASE pick_key = &k_c_left
  767.               old_ele  = initial_element
  768.               temp_str = RTRIM( full_str )
  769.               do_it    = .T.
  770.               DO WHILE do_it
  771.                 IF initial_col = 1 .OR. LEN( temp_str ) = 0
  772.                 * move to previous line
  773.                   IF initial_element = 1
  774.                   * we are done
  775.                     do_it = .F.
  776.                     LOOP
  777.                   ELSE
  778.                     IF initial_element = top_element
  779.                       top_element = top_element - 1
  780.                     ENDIF
  781.  
  782.                     initial_element = initial_element - 1
  783.                     Vlist_Skip( handle, &jl_backward )
  784.                     temp_str = RTRIM( Vlist_Cstr( handle ) )
  785.                     initial_col = LEN( temp_str ) + 1
  786.                     IF initial_col > current_wide
  787.                       left_col = initial_col - current_wide + 1
  788.                     ELSE
  789.                       left_col = 1
  790.                     ENDIF
  791.  
  792.                     * now we are on the previous line
  793.                     * we are done.
  794.                     do_it = .F.
  795.                     LOOP
  796.                   ENDIF
  797.  
  798.                 ELSE
  799.                 * move to previous word on this line
  800.                   IF VEdit_Backward_Space( temp_str, initial_col ) <> 0
  801.                     do_it = .F.
  802.                     LOOP
  803.                   ENDIF
  804.  
  805.                 ENDIF
  806.  
  807.               ENDDO
  808.  
  809.               Vlist_Goto( handle, old_ele )
  810.               IF initial_element = old_ele
  811.                 mini_refresh = .T.
  812.               ELSE
  813.                 Vlist_Cedit( handle, full_str )
  814.                 changed = .F.
  815.                 Vlist_Goto( handle, initial_element )
  816.                 refresh = .T.
  817.                 inner   = .F.
  818.               ENDIF
  819.  
  820.             CASE pick_key = &k_esc
  821.               list_loop = .F.
  822.               inner     = .F.
  823.               ret_val   = &edit_none
  824.               LOOP
  825.             CASE pick_key = &k_c_end
  826.               initial_col = hard_margin
  827.               IF initial_col > current_wide
  828.                 left_col = initial_col - current_wide + 1
  829.               ELSE
  830.                 left_col = 1
  831.               ENDIF
  832.  
  833.               refresh  = .T.
  834.               inner    = .F.
  835.             CASE pick_key = 32913 && k_c_down
  836.               IF last_displayed < last_element
  837.                 top_element = top_element + 1
  838.                 initial_element = initial_element + 1
  839.                 refresh = .T.
  840.               ENDIF
  841.  
  842.               inner = .F.
  843.             CASE pick_key = 32909 && k_c_up
  844.               IF top_element > 1
  845.                 top_element     = top_element - 1
  846.                 initial_element = initial_element - 1
  847.                 refresh = .T.
  848.               ENDIF
  849.  
  850.               inner = .F.
  851.             CASE pick_key = &k_down
  852.               IF initial_element < last_element
  853.                 initial_element = initial_element + 1
  854.                 IF initial_element > last_displayed
  855.                   top_element = top_element + 1
  856.                   refresh = .T.
  857.                 ELSE
  858.                   current_y = current_y + 1
  859.                 ENDIF
  860.  
  861.               ENDIF
  862.  
  863.               inner = .F.
  864.             CASE pick_key = &k_pg_down
  865.               counter = initial_element - top_element
  866.  
  867.               IF ( initial_element + height ) <= last_element
  868.                 initial_element = initial_element + height
  869.                 IF initial_element > counter
  870.                   top_element     = initial_element - counter
  871.                 ELSE
  872.                   top_element = 1
  873.                 ENDIF
  874.  
  875.               ELSE
  876.                 initial_element = last_element
  877.                 IF initial_element <= height
  878.                   top_element = 1
  879.                 ELSE
  880.                   top_element = initial_element - height + 1
  881.                 ENDIF
  882.  
  883.               ENDIF
  884.  
  885.               refresh = .T.
  886.               inner = .F.
  887.             CASE pick_key = &k_end
  888.               initial_col = LEN( RTRIM( full_str ) ) + 1
  889.               IF initial_col = 0
  890.                 initial_col = 1
  891.               ENDIF
  892.  
  893.               IF initial_col > current_wide
  894.                 left_col = initial_col - current_wide + 1
  895.               ELSE
  896.                 left_col = 1
  897.               ENDIF
  898.  
  899.               refresh = .T.
  900.               inner   = .F.
  901.  
  902.             CASE pick_key = &k_c_pg_down
  903.               initial_element = last_element
  904.               IF initial_element > height
  905.                 top_element = initial_element - height + 1
  906.               ELSE
  907.                 top_element = 1
  908.               ENDIF
  909.  
  910.               refresh = .T.
  911.               inner   = .F.
  912.             CASE pick_key = &k_right
  913.               IF initial_col < hard_margin
  914.                 initial_col = initial_col + 1
  915.                 IF ( initial_col - left_col + 1 ) >= current_wide
  916.                   left_col = initial_col - current_wide + 1
  917.                   refresh = .T.
  918.                   inner = .F.
  919.                 ENDIF
  920.  
  921.               ENDIF
  922.  
  923.             CASE pick_key = &k_up
  924.               IF initial_element > 1
  925.                 IF initial_element = top_element
  926.                   top_element = top_element - 1
  927.                   refresh = .T.
  928.                 ELSE
  929.                   current_y = current_y - 1
  930.                 ENDIF
  931.  
  932.                 initial_element = initial_element - 1
  933.               ENDIF
  934.  
  935.               inner = .F.
  936.             CASE pick_key = &k_pg_up
  937.               counter = initial_element - top_element
  938.  
  939.               IF initial_element > height
  940.                 initial_element = initial_element - height
  941.                 IF initial_element > counter
  942.                   top_element     = initial_element - counter
  943.                 ELSE
  944.                   top_element = 1
  945.                 ENDIF
  946.  
  947.               ELSE
  948.                 initial_element = 1
  949.                 top_element = 1
  950.               ENDIF
  951.  
  952.               refresh = .T.
  953.               inner = .F.
  954.             CASE pick_key = &k_home
  955.               IF left_col > 1
  956.                 refresh = .T.
  957.                 inner = .F.
  958.               ELSE
  959.                 refresh = .F.
  960.               ENDIF
  961.  
  962.               left_col = 1
  963.               initial_col = 1
  964.             CASE pick_key = &k_c_pg_up
  965.               top_element = 1
  966.               initial_element = 1
  967.               refresh = .T.
  968.               inner = .F.
  969.             CASE pick_key = &k_left
  970.               IF initial_col > 1
  971.                 IF initial_col = left_col
  972.                   left_col = left_col - 1
  973.                   refresh = .T.
  974.                   inner   = .F.
  975.                 ENDIF
  976.  
  977.                 initial_col = initial_col - 1
  978.               ENDIF
  979.  
  980.             OTHERWISE
  981.               IF .NOT. display_only
  982.                 changed = .T.
  983.                 DO CASE
  984.                   CASE pick_key = &k_enter
  985.                     IF insert
  986.                       IF initial_col > LEN( RTRIM( full_str ) )
  987.                         temp_str = SPACE( hard_margin )
  988.                       ELSE
  989.                         temp_str = SUBSTR( full_str, initial_col, 250 )
  990.                         temp_str = LEFT( temp_str, hard_margin )
  991.                         temp_str = temp_str + SPACE( hard_margin -;
  992.                                                   LEN( temp_str ) )
  993.                         full_str = LEFT( full_str, initial_col - 1 )
  994.                       ENDIF
  995.  
  996.                       **** full_str = old line to commit
  997.                       **** temp_str = new line to create
  998.                       IF initial_element = last_element
  999.                         IF .NOT. Vlist_Add( handle, temp_str )
  1000.                           list_loop = .F.
  1001.                           inner     = .F.
  1002.                           ret_val   = &edit_error
  1003.                           LOOP
  1004.                         ENDIF
  1005.  
  1006.                       ELSE
  1007.                         IF .NOT. Vlist_Insert( handle, initial_element + 1,;
  1008.                                             &jl_normal, &jl_default, temp_str )
  1009.                           list_loop = .F.
  1010.                           inner     = .F.
  1011.                           ret_val   = &edit_error
  1012.                           LOOP
  1013.                         ENDIF
  1014.  
  1015.                       ENDIF
  1016.  
  1017.                       last_element = Vlist_Max( handle )
  1018.                       Vlist_Goto( handle, initial_element )
  1019.                       * now move down to the beginning of the new line
  1020.                       IF initial_element < last_element
  1021.                         initial_element = initial_element + 1
  1022.                         IF initial_element > last_displayed
  1023.                           top_element = top_element + 1
  1024.                         ELSE
  1025.                           current_y = current_y + 1
  1026.                         ENDIF
  1027.  
  1028.                       ENDIF
  1029.  
  1030.                       left_col = 1
  1031.                       initial_col = 1
  1032.                       inner = .F.
  1033.                       refresh = .T.
  1034.  
  1035.                     ELSE
  1036.                       refresh = .F.
  1037.                       IF initial_element < last_element
  1038.                         initial_element = initial_element + 1
  1039.                         IF initial_element > last_displayed
  1040.                           top_element = top_element + 1
  1041.                           refresh = .T.
  1042.                         ELSE
  1043.                           current_y = current_y + 1
  1044.                         ENDIF
  1045.  
  1046.                       ENDIF
  1047.  
  1048.                       IF left_col > 1
  1049.                         refresh = .T.
  1050.                       ENDIF
  1051.  
  1052.                       left_col = 1
  1053.                       initial_col = 1
  1054.                       inner = .F.
  1055.                     ENDIF
  1056.  
  1057.                   CASE pick_key = 32851 && del
  1058.                     IF initial_col = hard_margin
  1059.                     ELSE
  1060.                       IF initial_col > LEN( RTRIM( full_str ) )
  1061.                         IF initial_element < last_element
  1062.                         * bring the next line up
  1063.                           temp_str = full_str
  1064.                           Vlist_Skip( handle, &jl_forward )
  1065.                           temp_str2 = RTRIM( Vlist_Cstr( handle ) )
  1066.                           IF initial_col + LEN( temp_str2 ) > hard_margin
  1067.                             temp_str = LEFT( temp_str, initial_col ) +;
  1068.                                        LEFT( temp_str2,;
  1069.                                        hard_margin-initial_col )
  1070.                             temp_str2 = SUBSTR( temp_str2,;
  1071.                                        hard_margin-initial_col+1,;
  1072.                                        hard_margin )
  1073.                             temp_str2 = temp_str2 + SPACE( hard_margin-;
  1074.                                        LEN( temp_str2 ) )
  1075.                             Vlist_Cedit( handle, temp_str2 )
  1076.                           ELSE
  1077.                             temp_str = LEFT( temp_str, initial_col ) +;
  1078.                                        temp_str2
  1079.                             Vlist_Cdelete( handle )
  1080.                           ENDIF
  1081.  
  1082.                           Vlist_Goto( handle, initial_element )
  1083.                           full_str = temp_str
  1084.                           * check word wrap
  1085.                           last_element = Vlist_Max( handle )
  1086.                           IF word_wrap
  1087.                             check_wrap = .T.
  1088.                           ENDIF
  1089.  
  1090.                           refresh    = .T.
  1091.                           changed    = .T.
  1092.                           inner      = .F.
  1093.                         ENDIF
  1094.  
  1095.                       ELSE
  1096.                       * delete a normal character
  1097.                         temp_str = LEFT( full_str, initial_col - 1 )
  1098.                         temp_str = temp_str + SUBSTR( full_str, initial_col +;
  1099.                                                       1, 250 )
  1100.                         full_str = temp_str
  1101.                         mini_refresh = .T.
  1102.                       ENDIF
  1103.  
  1104.                     ENDIF
  1105.  
  1106.                   CASE pick_key = 8
  1107.                     IF initial_col = 1
  1108.                       IF initial_element > 1
  1109.                       * bring this line up to the end of the previous
  1110.                         temp_str2 = RTRIM( full_str )
  1111.                         Vlist_Skip( handle, &jl_backward )
  1112.                         temp_str  = RTRIM( Vlist_Cstr( handle ) )
  1113.                         initial_element = VList_Number( handle )
  1114.                         Vlist_Skip( handle, &jl_forward )
  1115.                         initial_col = LEN( temp_str ) + 1
  1116.                         IF initial_col > current_wide
  1117.                           left_col = initial_col - current_wide + 1
  1118.                         ELSE
  1119.                           left_col = 1
  1120.                         ENDIF
  1121.  
  1122.                         IF LEN( temp_str ) + LEN( temp_str2 ) > hard_margin
  1123.                           temp_int1 = LEN( temp_str )
  1124.                           temp_str = temp_str +;
  1125.                                      LEFT( temp_str2,;
  1126.                                      hard_margin-temp_int1 )
  1127.                           temp_str2 = SUBSTR( temp_str2,;
  1128.                                       hard_margin-temp_int1+1,;
  1129.                                       hard_margin )
  1130.                           temp_str2 = temp_str2 + SPACE( hard_margin-;
  1131.                                       LEN( temp_str2 ) )
  1132.                           Vlist_Cedit( handle, temp_str2 )
  1133.                         ELSE
  1134.                           temp_str = temp_str + temp_str2
  1135.                           Vlist_Cdelete( handle )
  1136.                         ENDIF
  1137.  
  1138.                         VList_Goto( handle, initial_element )
  1139.                         temp_str = temp_str + SPACE( hard_margin -;
  1140.                                    LEN( temp_str ) )
  1141.                         Vlist_Cedit( handle, temp_str )
  1142.  
  1143.                         IF initial_element < top_element
  1144.                           top_element = initial_element
  1145.                         ENDIF
  1146.  
  1147.                         full_str = temp_str
  1148.                         * check word wrap
  1149.                         last_element = Vlist_Max( handle )
  1150.                         IF word_wrap
  1151.                           check_wrap = .T.
  1152.                         ENDIF
  1153.  
  1154.                         refresh    = .T.
  1155.                         changed    = .F.
  1156.                         inner      = .F.
  1157.                       ENDIF
  1158.  
  1159.                     ELSE
  1160.                       IF initial_col = 2
  1161.                         temp_str = SUBSTR( full_str, initial_col, 250 )
  1162.                       ELSE
  1163.                         temp_str = LEFT( full_str, initial_col - 2 )
  1164.                         temp_str = temp_str + SUBSTR( full_str, initial_col,;
  1165.                                                       250 )
  1166.                       ENDIF
  1167.  
  1168.                       full_str = temp_str
  1169.                       mini_refresh = .T.
  1170.                       * now move left one
  1171.                       IF initial_col > 1
  1172.                         IF initial_col = left_col
  1173.                           left_col = left_col - 1
  1174.                           refresh = .T.
  1175.                           inner   = .F.
  1176.                         ENDIF
  1177.  
  1178.                         initial_col = initial_col - 1
  1179.                       ENDIF
  1180.  
  1181.                     ENDIF
  1182.  
  1183.                   CASE ( pick_key >= 32 .AND. pick_key <= 255 ) .OR.;
  1184.                            ( pick_key = 9 )
  1185.  
  1186.                     mini_refresh = .T.
  1187.                     changed = .T.
  1188.                     IF pick_key = 9
  1189.                       temp_int1 = tab_stop
  1190.                       IF insert
  1191.                         pick_key = 32
  1192.                       ENDIF
  1193.  
  1194.                     ELSE
  1195.                       temp_int1 = 1
  1196.                     ENDIF
  1197.  
  1198.                     FOR temp_int4 = 1 TO temp_int1
  1199.                       IF insert
  1200.                       * insert character here
  1201.                         temp_str = LEFT( full_str, initial_col - 1 ) +;
  1202.                                          CHR( pick_key )
  1203.                         temp_str = temp_str + SUBSTR( full_str, initial_col,;
  1204.                                          250 )
  1205.                         full_str = temp_str
  1206.                       ELSE
  1207.                         IF pick_key <> 9
  1208.                           VEdit_Change_Byte( initial_col, pick_key, full_str )
  1209.                         ENDIF
  1210.  
  1211.                       ENDIF
  1212.  
  1213. *                      IF LEN( full_str ) < hard_margin
  1214. *                         @23,0 say "length is screwed!"
  1215. *                      ENDIF
  1216.  
  1217.                       * now move right one
  1218.                       IF initial_col < hard_margin
  1219.                         initial_col = initial_col + 1
  1220.                         IF ( initial_col - left_col + 1 ) >= current_wide
  1221.                           left_col = initial_col - current_wide + 1
  1222.                           refresh = .T.
  1223.                           inner   = .F.
  1224.                         ENDIF
  1225.  
  1226.                       ELSE
  1227.                         EXIT
  1228.                       ENDIF
  1229.  
  1230.                     NEXT
  1231.  
  1232.                     IF word_wrap
  1233.                       IF LEN( RTRIM( full_str ) ) >= right_margin
  1234.                         check_wrap = .T.
  1235.                       ENDIF
  1236.  
  1237.                     ENDIF
  1238.  
  1239.                 ENDCASE
  1240.  
  1241.               ENDIF
  1242.  
  1243.           ENDCASE
  1244.  
  1245.         CASE user_proc = &jl_ignore
  1246.         CASE user_proc = &jl_repaint
  1247.           refresh = .T.
  1248.         CASE user_proc = &jl_delete_line .OR.;
  1249.              user_proc = &jl_delete_to_scrap
  1250.           IF .NOT. display_only
  1251.             temp_str = full_str
  1252.             IF initial_element = 1 .AND. last_element = 1
  1253.               Vlist_Cedit( handle, SPACE( hard_margin ) )
  1254.             ELSE
  1255.               Vlist_Cdelete( handle )
  1256.               last_element = Vlist_Max( handle )
  1257.               IF initial_element > last_element
  1258.                 initial_element = last_element
  1259.               ENDIF
  1260.  
  1261.               Vlist_Goto( handle, initial_element )
  1262.             ENDIF
  1263.  
  1264.             refresh = .T.
  1265.             inner   = .F.
  1266.             changed = .F.
  1267.  
  1268.             IF (user_proc = &jl_delete_to_scrap) 
  1269.               temp_str = left( temp_str, hard_margin )
  1270.               temp_str = temp_str + SPACE( hard_margin - LEN( temp_str ) )
  1271.               IF .NOT. Vlist_Add( scrap, temp_str )
  1272.                 list_loop = .F.
  1273.                 inner     = .F.
  1274.                 ret_val   = &edit_error
  1275.                 LOOP
  1276.               ENDIF
  1277.             ELSE
  1278.               IF undelete_lines > 0
  1279.                 temp_str = left( temp_str, hard_margin )
  1280.                 temp_str = temp_str + SPACE( hard_margin - LEN( temp_str ) )
  1281.                 IF vlist_max( undelete ) >= undelete_lines
  1282.                   vlist_top( undelete )
  1283.                   vlist_cdelete( undelete )
  1284.                 ENDIF
  1285.                 IF .NOT. VList_Add( undelete, temp_str )
  1286.                   list_loop = .F.
  1287.                   inner     = .F.
  1288.                   ret_val   = &edit_error
  1289.                   LOOP
  1290.                 ENDIF
  1291.  
  1292.               ENDIF
  1293.             ENDIF
  1294.  
  1295.           ENDIF
  1296.  
  1297.         CASE user_proc = &jl_toggle_wrap
  1298.           word_wrap = .NOT. word_wrap
  1299.         CASE user_proc = &jl_delete_scrap
  1300.           IF .NOT. display_only
  1301.             DO WHILE Vlist_Max( scrap ) > 0
  1302.               Vlist_Top( scrap )
  1303.               Vlist_Cdelete( scrap )
  1304.             ENDDO
  1305.  
  1306.           ENDIF
  1307.  
  1308.         CASE user_proc = &jl_copy_bottom_scrap .OR.;
  1309.              user_proc = &jl_copy_all_scrap .OR.;
  1310.              user_proc = &jl_copy_all_scrap_delete .OR.;
  1311.              user_proc = &jl_copy_top_scrap
  1312.           IF .NOT. display_only
  1313.             IF Vlist_Max( scrap ) > 0
  1314.             * commit current line
  1315.               Vlist_Cedit( handle, full_str )
  1316.               changed = .F.
  1317.               refresh = .T.
  1318.               inner   = .F.
  1319.               IF user_proc = &jl_copy_all_scrap .OR.;
  1320.                        user_proc = &jl_copy_all_scrap_delete
  1321.                 Vlist_Bottom( scrap )
  1322.                 do_it = .T.
  1323.                 DO WHILE do_it
  1324.                   IF .NOT. Vlist_Cinsert( handle, &jl_normal, &jl_default,;
  1325.                                        Vlist_Cstr( scrap ) )
  1326.                     list_loop = .F.
  1327.                     inner     = .F.
  1328.                     ret_val   = &edit_error
  1329.                     LOOP
  1330.                   ENDIF
  1331.  
  1332.                   IF user_proc = &jl_copy_all_scrap
  1333.                     IF Vlist_Number( scrap ) = 1
  1334.                       do_it = .F.
  1335.                       LOOP
  1336.                     ELSE
  1337.                       Vlist_Skip( scrap, &jl_backward )
  1338.                     ENDIF
  1339.  
  1340.                   ELSE
  1341.                     Vlist_Cdelete( scrap )
  1342.                     IF Vlist_Max( scrap ) = 0
  1343.                       do_it = .F.
  1344.                       LOOP
  1345.                     ELSE
  1346.                       Vlist_Bottom( scrap )
  1347.                     ENDIF
  1348.  
  1349.                   ENDIF
  1350.  
  1351.                 ENDDO
  1352.  
  1353.               ELSE
  1354.                 IF user_proc = &jl_copy_top_scrap
  1355.                   Vlist_Top( scrap )
  1356.                 ELSE
  1357.                   Vlist_Bottom( scrap )
  1358.                 ENDIF
  1359.                 temp_str = VList_CStr( scrap )
  1360.  
  1361.                 IF .NOT. Vlist_Cinsert( handle, &jl_normal, &jl_default,;
  1362.                                      temp_str )
  1363.                   list_loop = .F.
  1364.                   inner     = .F.
  1365.                   ret_val   = &edit_error
  1366.                   LOOP
  1367.                 ENDIF
  1368.  
  1369.                 Vlist_Cdelete( scrap )
  1370.               ENDIF
  1371.  
  1372.               initial_element = Vlist_Number( handle )
  1373.               last_element = Vlist_Max( handle )
  1374.               IF initial_element > ( top_element + height - 1 )
  1375.                 top_element = initial_element - height + 1
  1376.               ENDIF
  1377.  
  1378.             ENDIF
  1379.  
  1380.           ENDIF
  1381.         CASE user_proc = &jl_undelete_line .and.;
  1382.              ( .not. display_only ) .and.;
  1383.              ( undelete_lines > 0 )
  1384.             IF vlist_max( undelete ) > 0
  1385.               *- commit line
  1386.               Vlist_Cedit( handle, full_str )
  1387.               changed = .F.
  1388.  
  1389.               Vlist_Bottom( undelete )
  1390.               temp_str = VList_Cstr( undelete )
  1391.               VList_Cdelete( undelete )
  1392.  
  1393.               IF .NOT. Vlist_Cinsert( handle, &jl_normal, &jl_default,;
  1394.                                       temp_str )
  1395.                 list_loop = .F.
  1396.                 inner     = .F.
  1397.                 ret_val   = &edit_error
  1398.                 LOOP
  1399.               ENDIF
  1400.  
  1401.               initial_element = Vlist_Number( handle )
  1402.               last_element = Vlist_Max( handle )
  1403.               IF initial_element > ( top_element + height - 1 )
  1404.                 top_element = initial_element - height + 1
  1405.               ENDIF
  1406.               refresh = .T.
  1407.               inner = .F.
  1408.  
  1409.             ENDIF
  1410.  
  1411.         CASE user_proc = &jl_save_continue .OR.;
  1412.                user_proc = &jl_save_as_new .OR.;
  1413.                user_proc = &jl_save_rename .OR.;
  1414.                user_proc = &jl_save_scrap .OR.;
  1415.                user_proc = &jl_read_scrap
  1416.  
  1417.           IF .NOT. display_only
  1418.           * commit line
  1419.             Vlist_Cedit( handle, full_str )
  1420.  
  1421.             list_loop = .F.
  1422.             inner     = .F.
  1423.             ret_val = user_proc
  1424.             LOOP
  1425.           ENDIF
  1426.  
  1427.         CASE user_proc = &jl_save_exit
  1428.  
  1429.           * commit line
  1430.           Vlist_Cedit( handle, full_str )
  1431.  
  1432.           list_loop = .F.
  1433.           inner     = .F.
  1434.           IF display_only
  1435.             ret_val = &edit_none
  1436.           ELSE
  1437.             ret_val = &edit_save_exit
  1438.           ENDIF
  1439.  
  1440.           LOOP
  1441.         CASE user_proc = &jl_abort
  1442.           IF .not. display_only
  1443.             vlist_cedit( handle, full_str )
  1444.           ENDIF
  1445.           list_loop = .F.
  1446.           inner     = .F.
  1447.           ret_val   = &edit_none
  1448.           LOOP
  1449.       ENDCASE
  1450.  
  1451.       IF ( .NOT. inner ) .OR. ( check_wrap )
  1452.         IF ( changed .AND. ( .NOT. display_only ) ) .OR. check_wrap
  1453.           Vlist_Cedit( handle, full_str )
  1454.         ENDIF
  1455.  
  1456.         IF check_wrap
  1457.           check_wrap = .F.
  1458.           inner = .F.
  1459.           old_ele = initial_element
  1460.           VEdit_Word_Wrap( handle, initial_element,;
  1461.                            .T., right_margin, hard_margin,;
  1462.                            initial_element, initial_col )
  1463.           IF initial_element <> old_ele
  1464.             left_col = 1
  1465.           ENDIF
  1466.  
  1467.           IF initial_col > current_wide
  1468.             left_col = initial_col - current_wide + 1
  1469.           ENDIF
  1470.  
  1471.           IF ( initial_element - top_element + 1 ) > height
  1472.             top_element = initial_element - height + 1
  1473.           ENDIF
  1474.  
  1475.           Vlist_Goto( handle, initial_element )
  1476.           last_element = Vlist_Max( handle )
  1477.  
  1478.           refresh = .T.
  1479.         ENDIF
  1480.  
  1481.       ELSE
  1482.         IF mini_refresh
  1483.           temp_str = full_str
  1484.           IF left_col > 0
  1485.             temp_str = SUBSTR( temp_str, left_col, current_wide )
  1486.           ELSE
  1487.             temp_str = LEFT( temp_str, current_wide )
  1488.           ENDIF
  1489.  
  1490.           IF is_mouse
  1491.             Vmouse_Cursor( .F. )
  1492.           ENDIF
  1493.  
  1494.           CURSOR_OFF()
  1495.  
  1496.           IF allow_embedded
  1497.             Vlist_Say( current_y, current_x, current_wide, temp_str, .F. )
  1498.           ELSE
  1499.             @current_y, current_x SAY temp_str:current_wide
  1500.           ENDIF
  1501.  
  1502.           mini_refresh = .F.
  1503.  
  1504.           IF is_mouse
  1505.             Vmouse_Cursor( .T. )
  1506.           ENDIF
  1507.  
  1508.         ENDIF
  1509.  
  1510.       ENDIF
  1511.  
  1512.     ENDDO     && innner loop
  1513.  
  1514.     CURSOR_OFF()
  1515.  
  1516.     ** leave element
  1517.     IF ( .NOT. refresh ) .OR. ( mouse_search )
  1518.       Vlist_What_Color( handle, old_std )
  1519.  
  1520.       temp_str = full_str
  1521.       IF left_col > 0
  1522.         temp_str = SUBSTR( temp_str, left_col, current_wide )
  1523.       ELSE
  1524.         temp_str = LEFT( temp_str, current_wide )
  1525.       ENDIF
  1526.  
  1527.       IF user_proc <> &jl_ignore
  1528.  
  1529.         IF is_mouse
  1530.           Vmouse_Cursor( .F. )
  1531.         ENDIF
  1532.  
  1533.         IF allow_embedded
  1534.           Vlist_Say( old_y, old_x, current_wide, temp_str, .F. )
  1535.         ELSE
  1536.           @old_y, old_x SAY temp_str:current_wide
  1537.         ENDIF
  1538.  
  1539.         IF is_mouse
  1540.           Vmouse_Cursor( .T. )
  1541.         ENDIF
  1542.  
  1543.       ENDIF
  1544.  
  1545.     ENDIF
  1546.  
  1547.     IF mouse_set .AND. is_mouse
  1548.       mouse_set = .F.
  1549.       mouse_last = initial_element
  1550.     ENDIF
  1551.  
  1552.   ENDDO
  1553.  
  1554.   IF is_mouse
  1555.     Vmouse_Cursor( .F. )
  1556.     *    Vmouse_restore( Vmouse_buffer[] )
  1557.   ENDIF
  1558.  
  1559.   IF stat_line
  1560.     RESTORESCRN( saved_stat )
  1561.   ENDIF
  1562.  
  1563.   IF scroll_bar
  1564.     RESTORESCRN( saved_scroll )
  1565.   ENDIF
  1566.  
  1567.   __color_std   = old_std
  1568.   __color_enhcd = old_enhcd
  1569.  
  1570.   RETURN ret_val
  1571. ENDPRO
  1572.