home *** CD-ROM | disk | FTP | other *** search
/ Power Programming / powerprogramming1994.iso / progtool / pibterm / pibt41s1.arc / EDITALIN.MOD < prev    next >
Text File  |  1988-01-09  |  7KB  |  194 lines

  1. (*--------------------------------------------------------------------------*)
  2. (*       Edit_A_Line --- Edit line on screen and resend to host             *)
  3. (*--------------------------------------------------------------------------*)
  4.  
  5. PROCEDURE Edit_A_Line;
  6.  
  7. (*--------------------------------------------------------------------------*)
  8. (*                                                                          *)
  9. (*    Function: Edit_A_Line                                                 *)
  10. (*                                                                          *)
  11. (*    Purpose:  Edit line on screen and resend to host                      *)
  12. (*                                                                          *)
  13. (*    Calling Sequence:                                                     *)
  14. (*                                                                          *)
  15. (*       Edit_A_Line;                                                       *)
  16. (*                                                                          *)
  17. (*    Calls:  EditString                                                    *)
  18. (*            Async_Send                                                    *)
  19. (*            Get_Screen_Text_Line                                          *)
  20. (*                                                                          *)
  21. (*--------------------------------------------------------------------------*)
  22.  
  23. VAR
  24.    I           : INTEGER;
  25.    L1          : INTEGER;
  26.    L2          : INTEGER;
  27.    S           : AnyStr;
  28.    S2          : AnyStr;
  29.    S3          : AnyStr;
  30.    Ch          : CHAR;
  31.    X           : INTEGER;
  32.    Y           : INTEGER;
  33.    Saved_Line  : AnyStr;
  34.    Status_Line : INTEGER;
  35.    Old_Status  : INTEGER;
  36.    Saved_X     : BYTE;
  37.    Saved_Y     : BYTE;
  38.    Saved_X_2   : BYTE;
  39.    Saved_Y_2   : BYTE;
  40.    Max_Line    : INTEGER;
  41.    KTop        : INTEGER;
  42.    KBottom     : INTEGER;
  43.  
  44. (*--------------------------------------------------------------------------*)
  45.  
  46. PROCEDURE Set_Up_Status_Line;
  47.  
  48. BEGIN (* Set_Up_Status_Line *)
  49.  
  50.    IF Y <> 1 THEN
  51.       Status_Line := 1
  52.    ELSE
  53.       Status_Line := Max_Line;
  54.  
  55.    IF ( Status_Line <> Old_Status ) THEN
  56.       BEGIN
  57.  
  58.          Saved_X_2 := WhereX;
  59.          Saved_Y_2 := WhereY;
  60.  
  61.          GoToXY( 1 , Old_Status );
  62.          WRITE( TRIM( Saved_Line ) );
  63.          ClrEol;
  64.  
  65.          Old_Status := Status_Line;
  66.  
  67.          Get_Screen_Text_Line( Saved_Line, Status_Line, 1 );
  68.  
  69.          GoToXY( Saved_X_2, Saved_Y_2 );
  70.  
  71.       END;
  72.  
  73. END   (* Set_Up_Status_Line *);
  74.  
  75. (*--------------------------------------------------------------------------*)
  76.  
  77. BEGIN (* Edit_A_Line *)
  78.                                    (* Not available in graphics mode *)
  79.  
  80.    IF ( ( Current_Video_Mode = HiRes_GraphMode ) OR
  81.         ( Current_Video_Mode = EGA_GraphMode   ) ) THEN EXIT;
  82.  
  83.                                    (* Figure out and remember current *)
  84.                                    (* position                        *)
  85.    X       := 1;
  86.    Y       := WhereY;
  87.  
  88.    Saved_X := WhereX;
  89.    Saved_Y := Y;
  90.                                    (* Figure max line to edit *)
  91.    IF Do_Status_Line THEN
  92.       Max_Line := PRED( Max_Screen_Line )
  93.    ELSE
  94.       Max_Line := Max_Screen_Line;
  95.  
  96.                                    (* Figure out where status line goes *)
  97.    IF Y <> 1 THEN
  98.       Old_Status := 1
  99.    ELSE
  100.       Old_Status := Max_Line;
  101.                                    (* Get text line to be edited *)
  102.  
  103.    Get_Screen_Text_Line( Saved_Line, Old_Status, 1 );
  104.  
  105.                                    (* No range of lines yet selected. *)
  106.    KTop    := 0;
  107.    KBottom := 0;
  108.                                    (* Begin edit loop. *)
  109.    REPEAT
  110.                                    (* Display status line *)
  111.       Set_Up_Status_Line;
  112.                                    (* Get text of line to be edited *)
  113.  
  114.       Get_Screen_Text_Line( S, Y, 1 );
  115.  
  116.       S  := Trim( S );
  117.       S3 := S;
  118.                                    (* Edit the line *)
  119.  
  120.       X  := MAX( 1 , MIN( X , LENGTH( S ) ) );
  121.       Ch := Edit_String( S, 255, 1, X, Y, Max_Screen_Col, FALSE, Status_Line );
  122.       X  := WhereX;
  123.                                    (* If line changed, send revised text *)
  124.  
  125.       IF ( ( Ch <> CHR( ESC ) ) AND ( Ch <> ^K ) ) THEN
  126.          IF ( S <> S3 ) THEN
  127.             Async_Send_String( Trim( S ) + CHR( CR ) );
  128.  
  129.                                    (* Move to new line if needed *)
  130.       CASE Ch OF
  131.          ^E:  IF ( Y > 1        ) THEN DEC( Y );
  132.          ^X:  IF ( Y < Max_Line ) THEN INC( Y );
  133.          ^K:  IF ( KTop = 0 ) THEN
  134.                  KTop := Y
  135.               ELSE
  136.                  BEGIN
  137.  
  138.                     KBottom := Y;
  139.  
  140.                     IF ( KBottom < KTop ) THEN
  141.                        BEGIN
  142.                           I       := KTop;
  143.                           KTop    := KBottom;
  144.                           KBottom := I;
  145.                        END;
  146.  
  147.                     S  := '';
  148.                     Y  := KTop;
  149.  
  150.                     Set_Up_Status_Line;
  151.  
  152.                     FOR I := KTop TO KBottom DO
  153.                        BEGIN
  154.                           Get_Screen_Text_Line( S2, I, 1 );
  155.                           IF ( I = KBottom ) THEN
  156.                              S2 := TRIM( S2 );
  157.                           L1 := LENGTH( S ) + LENGTH( S2 );
  158.                           IF ( L1 <= 255 ) THEN
  159.                              S := S + S2
  160.                           ELSE
  161.                              S := S + COPY( S2, 1, 255 - LENGTH( S ) );
  162.                        END;
  163.  
  164.                     S3 := S;
  165.  
  166.                     X  := MAX( 1 , MIN( X , LENGTH( S ) ) );
  167.                     Ch := Edit_String( S, 255, 1, X, Y, Max_Screen_Col,
  168.                                        FALSE, Status_Line );
  169.                     X  := WhereX;
  170.  
  171.                                    (* If line changed, send revised text *)
  172.  
  173.                     IF ( Ch <> CHR( ESC ) ) THEN
  174.                        IF ( S <> S3 ) THEN
  175.                           Async_Send_String( Trim( S ) + CHR( CR ) );
  176.  
  177.                                    (* Reset to no line range selected *)
  178.                     KTop    := 0;
  179.                     KBottom := 0;
  180.  
  181.                  END;
  182.          ELSE ;
  183.       END (* CASE *);
  184.  
  185.    UNTIL ( Ch = CHR( CR ) );
  186.                                    (* Restore previous line *)
  187.    GoToXY( 1 , Status_Line );
  188.    WRITE( TRIM( Saved_Line ) );
  189.    ClrEol;
  190.                                    (* Restore previous position *)
  191.    GoToXY( Saved_X , Saved_Y );
  192.  
  193. END   (* Edit_A_Line *);
  194.