home *** CD-ROM | disk | FTP | other *** search
/ C!T ROM 2 / ctrom_ii_b.zip / ctrom_ii_b / PROGRAM / FOXPRO / VEDIT060 / SOURCE / VEDIT8.PRG < prev    next >
Text File  |  1992-04-01  |  15KB  |  490 lines

  1. *******************************************************************************
  2. *                                                                             *
  3. *                             VEdit_Text_Editor()                             *
  4. *                                                                             *
  5. *                        (c) 1992  -  Jayson R. Minard                        *
  6. *                                                                             *
  7. * This FUNCTION loads a VLIST with lines of text from a file, then calls      *
  8. * the internal editor routine.  The editor routine is also written in         *
  9. * FORCE.                                                                      *
  10. *                                                                             *
  11. *******************************************************************************
  12.  
  13. #INCLUDE KEYS.HDR
  14. #INCLUDE vlist.hdr
  15. #INCLUDE vmouse.hdr
  16. #INCLUDE vedit.hdr
  17. #INCLUDE STRING.HDR
  18. #INCLUDE FILEIO.HDR
  19. #INCLUDE SYSTEM.HDR
  20. #INCLUDE IO.HDR
  21.  
  22. VARDEF EXTERN
  23.   BYTE __color_std, __color_enhcd
  24. ENDDEF
  25.  
  26. *******************************************************************************
  27. * return codes                                                                *
  28. *   0 - no errors                                                             *
  29. *   2 - file doesn't exist                                                    *
  30. *   3 - error reading file                                                    *
  31. *   4 - error editting file                                                   *
  32. *   5 - error allocating memory                                               *
  33. *   6 - cannot open file to save                                              *
  34. *******************************************************************************
  35.  
  36. FUNCTION UINT VEdit_Text_Editor
  37.   PARAMETERS        CHAR filename,;
  38.               VALUE INT upper_row,;
  39.               VALUE INT upper_col,;
  40.               VALUE INT lower_row,;
  41.               VALUE INT lower_col,;
  42.              VALUE UINT start_line,;
  43.              VALUE UINT start_col,;
  44.              VALUE UINT right_margin,;
  45.              VALUE UINT hard_margin,;
  46.              VALUE BYTE m_text_color,;
  47.           VALUE LOGICAL word_wrap,;
  48.           VALUE LOGICAL disp_only,;
  49.           VALUE LOGICAL scroll_bar,;
  50.           VALUE LOGICAL stat_line,;
  51.              VALUE UINT stat_row,;
  52.              VALUE UINT stat_col,;
  53.           VALUE LOGICAL is_mouse,;
  54.           VALUE LOGICAL a_embedded,;
  55.              VALUE UINT tab_width,;
  56.              VALUE UINT undelete_lines,;
  57.                 UNTYPED key_handler
  58.  
  59.   VARDEF
  60.     LONG    handle,;
  61.             scrap,;
  62.             undelete
  63.     FILE    input_file
  64.     CHAR    temp_str
  65.     CHAR( 128 )  new_filename, temp_filename
  66.     UINT    ret_val
  67.     UINT    top_element,;
  68.             left_col,;
  69.             temp_loc
  70.     INT     open_type
  71.     LOGICAL going
  72.     LOGICAL need_wrap
  73.     LOGICAL go_ahead
  74.     UINT    dum
  75.     BYTE    old_std
  76.   ENDDEF
  77.  
  78.   need_wrap = .F.
  79.   go_ahead  = .F.
  80.   new_filename = filename
  81.  
  82.   *- initialize main text file list, use 200 width so that there is work
  83.   *  room for word wrap.  If word wrap is never used, or the right margin
  84.   *  is limited to a lower number, then this can be lowered.
  85.   *
  86.   dum = hard_margin + ( hard_margin/2 )
  87.   IF dum > 245
  88.     dum = 245
  89.   ENDIF
  90.  
  91.   handle = Vlist_Init( dum )
  92.   IF handle = 0
  93.     RETURN 5
  94.   ENDIF
  95.  
  96.   *- initialize scrap text buffers
  97.   scrap = Vlist_Init( dum )
  98.   IF scrap = 0
  99.     vlist_clear( handle )
  100.     RETURN 5
  101.   ENDIF
  102.  
  103.   *- initialize undelete text buffers
  104.   undelete = Vlist_Init( dum )
  105.   IF undelete = 0
  106.     vlist_clear( handle )
  107.     vlist_clear( scrap )
  108.     RETURN 5
  109.   ENDIF
  110.  
  111.   IF .NOT. EXIST( filename )
  112.   ELSE
  113.   *- open file
  114.     IF .NOT. F_OPEN( input_file, filename, &f_read )
  115.       Vlist_Clear( handle )
  116.       Vlist_Clear( scrap )
  117.       Vlist_Clear( undelete )
  118.       RETURN 3
  119.     ENDIF
  120.  
  121.     SAVE_AREA( upper_row, upper_col, upper_row+3, upper_col+14 )
  122.     FILL( upper_row, upper_col, upper_row+3, upper_col+14,;
  123.           &double_box, " ", __color_bar, __color_tab, 6 )
  124.     old_std     = __color_std
  125.     __color_std = __color_tab
  126.     CURSOR_ON()
  127.     @upper_row+1, upper_col+2 SAY "Reading..."
  128.  
  129.     *- read file
  130.     DO WHILE .NOT. F_EOF( input_file )
  131.       IF .NOT. F_GETLN( input_file, temp_str )
  132.         __color_std = old_std
  133.         RESTORE_AREA()
  134.         Vlist_Clear( handle )
  135.         Vlist_Clear( scrap )
  136.         VList_Clear( undelete )
  137.         F_CLOSE( input_file )
  138.         RETURN 3
  139.       ENDIF
  140.  
  141.       temp_str = LEFT( RTRIM( temp_str ), hard_margin )
  142.  
  143.       temp_loc = AT( CHR( 9 ), temp_str )
  144.       DO WHILE temp_loc > 0
  145.         temp_str = LEFT( temp_str, temp_loc - 1 ) + SPACE( tab_width ) +;
  146.                    SUBSTR( temp_str, temp_loc + 1, 250 )
  147.         temp_loc = AT( CHR( 9 ), temp_str )
  148.       ENDDO
  149.  
  150.       IF LEN( temp_str ) > right_margin
  151.         need_wrap = .T.
  152.       ENDIF
  153.  
  154.       *- pad the string out to the far right margin
  155.       temp_str = temp_str + SPACE( hard_margin - LEN( temp_str ) )
  156.  
  157.       *- add one line of text to VLIST
  158.       IF .NOT. Vlist_Add( handle, temp_str )
  159.         __color_std = old_std
  160.         RESTORE_AREA()
  161.         Vlist_Clear( handle )
  162.         Vlist_Clear( scrap )
  163.         VList_Clear( undelete )
  164.         F_CLOSE( input_file )
  165.         RETURN 5
  166.       ENDIF
  167.  
  168.     ENDDO
  169.  
  170.     *- close file
  171.     F_CLOSE( input_file )
  172.     __color_std = old_std
  173.     RESTORE_AREA()
  174.   ENDIF
  175.  
  176.   *- lets check the parameters to make sure they are valid
  177.   IF start_line > Vlist_Max( handle )
  178.     start_line = Vlist_Max( handle )
  179.   ENDIF
  180.  
  181.   IF start_col = 0
  182.     start_col = 1
  183.   ENDIF
  184.  
  185.   IF start_col > hard_margin
  186.     start_col = hard_margin
  187.   ENDIF
  188.  
  189.   IF start_line = 0
  190.     start_line = 1
  191.   ENDIF
  192.  
  193.   IF right_margin < 10
  194.     right_margin = 10
  195.   ENDIF
  196.  
  197.   IF right_margin > hard_margin
  198.     right_margin = hard_margin
  199.   ENDIF
  200.  
  201.   top_element = 0
  202.   left_col    = 0
  203.   going       = .T.
  204.  
  205.   *- if word wrap on, and at least one line in the file was longer than
  206.   *  the right margin, then word wrap the whole file.
  207.   IF need_wrap
  208.     IF word_wrap
  209.       SAVE_AREA( upper_row, upper_col, upper_row+3, upper_col+17 )
  210.       FILL( upper_row, upper_col, upper_row+3, upper_col+17,;
  211.             &double_box, " ", __color_bar, __color_tab, 6 )
  212.       old_std     = __color_std
  213.       __color_std = __color_tab
  214.       CURSOR_ON()
  215.       @upper_row+1, upper_col+2 SAY "Formatting..."
  216.  
  217.       VEdit_Word_Wrap( handle, 1, .F., right_margin, hard_margin,;
  218.          dum, dum )
  219.       __color_std = old_std
  220.       RESTORE_AREA()
  221.     ENDIF
  222.  
  223.   ENDIF
  224.  
  225.   DO WHILE going
  226.  
  227.     *- call internal editor, NOTE:  this is the same thing the MEMO editor
  228.     *  calls since it just edits text in a VLIST, it does not care where
  229.     *  it came from.
  230.  
  231.     ret_val = VEdit_Internal_Editor( handle, scrap, undelete,;
  232.                upper_row, upper_col,;
  233.                lower_row, lower_col,;
  234.                top_element, start_line, left_col, start_col,;
  235.                right_margin, hard_margin, m_text_color, word_wrap,;
  236.                disp_only, .F., scroll_bar, stat_line, stat_row, stat_col,;
  237.                is_mouse, a_embedded,;
  238.                tab_width, undelete_lines,;
  239.                key_handler )
  240.  
  241.     *- check our return cases
  242.     DO CASE
  243.       CASE ret_val = &edit_continue && continue with edit, I guess we must
  244.         && have resized or something!
  245.         LOOP
  246.       CASE ret_val = &edit_none     && exit after doing NOTHING
  247.         ret_val = 0
  248.         going = .F.
  249.       CASE ret_val = &edit_save_scrap .OR.;
  250.              ret_val = &edit_read_scrap
  251.         IF ret_val = &edit_save_scrap .AND. Vlist_Max( scrap ) = 0
  252.           LOOP
  253.         ENDIF
  254.  
  255.         temp_filename = new_filename
  256.         SAVE_AREA( upper_row, upper_col, upper_row+3, upper_col+38 )
  257.         FILL( upper_row, upper_col, upper_row+3, upper_col+38,;
  258.               &double_box, " ", __color_bar, __color_tab, 6 )
  259.         old_std = __color_std
  260.         __color_std = __color_tab
  261.         CURSOR_ON()
  262.         temp_filename = LEFT( TRIM( temp_filename ), 128 )
  263.         temp_filename = temp_filename + SPACE( 128 - LEN( temp_filename ) )
  264.         @upper_row+1, upper_col+2 SAY "Enter SCRAP filename:";
  265.                                   GET temp_filename PICTURE "@K@S12"
  266.         READ
  267.         __color_std = old_std
  268.         RESTORE_AREA()
  269.         IF LASTKEY() = 27
  270.           LOOP
  271.         ELSE
  272.           temp_filename = TRIM( temp_filename )
  273.           new_filename = temp_filename
  274.         ENDIF
  275.  
  276.         SAVE_AREA( upper_row, upper_col, upper_row+3, upper_col+14 )
  277.         FILL( upper_row, upper_col, upper_row+3, upper_col+14,;
  278.               &double_box, " ", __color_bar, __color_tab, 6 )
  279.         old_std = __color_std
  280.         __color_std = __color_tab
  281.         CURSOR_ON()
  282.         IF ret_val = &edit_save_scrap
  283.           @upper_row+1, upper_col+2 SAY "Saving..."
  284.           open_type = &f_create
  285.         ELSE
  286.           @upper_row+1, upper_col+2 SAY "Reading..."
  287.           open_type = &f_read
  288.         ENDIF
  289.  
  290.         IF .NOT. F_OPEN( input_file, temp_filename, open_type )
  291.           ret_val = 6
  292.           going = .F.
  293.         ELSE
  294.           IF ret_val = &edit_save_scrap
  295.             VLIST_Top( scrap )
  296.             DO WHILE .NOT. VLIST_BOL( scrap )
  297.               temp_str = RTRIM( Vlist_Cstr( scrap ) )
  298.               F_PUT( input_file, temp_str + CHR( 13 ) + CHR( 10 ) )
  299.               Vlist_Skip( scrap, &jl_forward )
  300.             ENDDO
  301.  
  302.           ELSE
  303.           * read scrap
  304.             DO WHILE .NOT. F_EOF( input_file )
  305.               IF .NOT. F_GETLN( input_file, temp_str )
  306.                 __color_std = old_std
  307.                 RESTORE_AREA()
  308.                 F_CLOSE( input_file )
  309.                 ret_val = 3
  310.                 going = .F.
  311.                 LOOP
  312.               ENDIF
  313.  
  314.               temp_str = LEFT( RTRIM( temp_str ), hard_margin )
  315.  
  316.               temp_loc = AT( CHR( 9 ), temp_str )
  317.               DO WHILE temp_loc > 0
  318.                 temp_str = LEFT( temp_str, temp_loc - 1 ) + SPACE( tab_width ) +;
  319.                            SUBSTR( temp_str, temp_loc + 1, 250 )
  320.                 temp_loc = AT( CHR( 9 ), temp_str )
  321.               ENDDO
  322.  
  323.               *- pad the string out to the far right margin
  324.               temp_str = temp_str + SPACE( hard_margin - LEN( temp_str ) )
  325.  
  326.               IF .NOT. Vlist_Add( scrap, temp_str )
  327.                 __color_std = old_std
  328.                 RESTORE_AREA()
  329.                 F_CLOSE( input_file )
  330.                 ret_val = 5
  331.                 going = .F.
  332.                 LOOP
  333.               ENDIF
  334.  
  335.             ENDDO
  336.  
  337.           ENDIF
  338.  
  339.           F_CLOSE( input_file )
  340.         ENDIF
  341.  
  342.         __color_std = old_std
  343.         RESTORE_AREA()
  344.  
  345.       CASE ret_val = &edit_save_exit .OR.;
  346.                    ret_val = &edit_save_continue .OR.;
  347.                    ret_val = &edit_error .OR.;
  348.                    ret_val = &edit_save_as_new .OR.;
  349.                    ret_val = &edit_save_rename              && save
  350.  
  351.         temp_filename = filename
  352.  
  353.         IF ret_val = &edit_save_exit .OR.;
  354.                  ret_val = &edit_error
  355.  
  356.           * do they really want to exit without saving?
  357.           SAVE_AREA( upper_row, upper_col, upper_row+3, upper_col+29 )
  358.           FILL( upper_row, upper_col, upper_row+3, upper_col+29,;
  359.                 &double_box, " ", __color_bar, __color_tab, 6 )
  360.           old_std = __color_std
  361.           __color_std = __color_tab
  362.           CURSOR_ON()
  363.           IF ret_val = &edit_error
  364.             @upper_row+1, upper_col+2 SAY "ERROR!  Save text (Y/N)?"
  365.           ELSE
  366.             @upper_row+1, upper_col+2 SAY "Save before exit (Y/N)?"
  367.           ENDIF
  368.  
  369.           DO WHILE INKEY() <> 0
  370.           ENDDO
  371.  
  372.           REPEAT
  373.             dum = GET_KEY()
  374.           UNTIL CHR( dum ) $ "YyNn" .OR. dum=27
  375.  
  376.           __color_std = old_std
  377.           RESTORE_AREA()
  378.           IF dum = 27
  379.             LOOP
  380.           ENDIF
  381.  
  382.           IF dum <> 'Y' .AND. dum <> 'y'
  383.             go_ahead = .F.
  384.           ELSE
  385.             go_ahead = .T.
  386.           ENDIF
  387.  
  388.         ELSE
  389.           go_ahead = .T.
  390.           IF ret_val = &edit_save_as_new .OR.;
  391.                ret_val = &edit_save_rename
  392.  
  393.             IF ret_val = &edit_save_as_new
  394.               temp_filename = new_filename
  395.             ELSE
  396.               temp_filename = filename
  397.             ENDIF
  398.  
  399.             SAVE_AREA( upper_row, upper_col, upper_row+3, upper_col+38 )
  400.             FILL( upper_row, upper_col, upper_row+3, upper_col+38,;
  401.                   &double_box, " ", __color_bar, __color_tab, 6 )
  402.             old_std = __color_std
  403.             __color_std = __color_tab
  404.             CURSOR_ON()
  405.             temp_filename = LEFT( TRIM( temp_filename ), 128 )
  406.             temp_filename = temp_filename + SPACE( 128 - LEN( temp_filename ) )
  407.             IF ret_val = &edit_save_as_new
  408.               @upper_row+1, upper_col+2 SAY "Enter NEW filename:";
  409.                                         GET temp_filename PICTURE "@K@S12"
  410.             ELSE
  411.               @upper_row+1, upper_col+2 SAY "Enter RENAME filename:";
  412.                                         GET temp_filename PICTURE "@K@S12"
  413.             ENDIF
  414.  
  415.             READ
  416.             __color_std = old_std
  417.             RESTORE_AREA()
  418.             IF LASTKEY() = 27
  419.               LOOP
  420.             ELSE
  421.               temp_filename = TRIM( temp_filename )
  422.               IF ret_val = &edit_save_as_new
  423.                 new_filename = temp_filename
  424.               ELSE
  425.                 filename = temp_filename
  426.               ENDIF
  427.  
  428.             ENDIF
  429.  
  430.           ENDIF
  431.  
  432.         ENDIF
  433.  
  434.         IF go_ahead
  435.           SAVE_AREA( upper_row, upper_col, upper_row+3, upper_col+13 )
  436.           FILL( upper_row, upper_col, upper_row+3, upper_col+13,;
  437.                 &double_box, " ", __color_bar, __color_tab, 6 )
  438.           old_std = __color_std
  439.           __color_std = __color_tab
  440.           CURSOR_ON()
  441.           @upper_row+1, upper_col+2 SAY "Saving..."
  442.  
  443.           * save the sucker!
  444.  
  445.           IF .NOT. F_OPEN( input_file, temp_filename, &f_create )
  446.             ret_val = 6
  447.             going = .F.
  448.             __color_std = old_std
  449.             RESTORE_AREA()
  450.             LOOP
  451.           ELSE
  452.             VLIST_Top( handle )
  453.             DO WHILE .NOT. VList_BOL( handle )
  454.               temp_str = RTRIM( Vlist_Cstr( handle ) )
  455.               F_PUT( input_file, temp_str + CHR( 13 ) + CHR( 10 ) )
  456.               Vlist_Skip( handle, &jl_forward )
  457.             ENDDO
  458.  
  459.             F_CLOSE( input_file )
  460.           ENDIF
  461.  
  462.           __color_std = old_std
  463.           RESTORE_AREA()
  464.         ENDIF
  465.  
  466.         IF ret_val = &edit_save_exit
  467.           going = .F.
  468.           ret_val = 0
  469.         ELSE
  470.           IF ret_val = &edit_error
  471.             ret_val = 4
  472.             going = .F.
  473.           ELSE
  474.             going = .T.
  475.           ENDIF
  476.  
  477.         ENDIF
  478.  
  479.     ENDCASE
  480.  
  481.   ENDDO
  482.  
  483.   *- clean up memory
  484.   Vlist_Clear( handle )
  485.   Vlist_Clear( scrap )
  486.   VList_Clear( undelete )
  487.  
  488.   RETURN ret_val
  489. ENDPRO
  490.