home *** CD-ROM | disk | FTP | other *** search
/ Beijing Paradise BBS Backup / PARADISE.ISO / software / BBSDOORW / MFM_119C.ZIP / EDIT.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1993-06-03  |  12.2 KB  |  318 lines

  1. Unit Edit;
  2. {========================================================================}
  3. Interface
  4.   Function EditLine(LineToEdit : String; MaxLength, Row, Col : Byte) : String;
  5.   Procedure EditDescriptionLine;
  6.   Procedure EditDescription;
  7. {========================================================================}
  8. Implementation
  9.   Uses
  10.     Crt, MfmDefs, MfmStr, Screen;
  11. {========================================================================}
  12. Function EditLine(LineToEdit : String; MaxLength, Row, Col : Byte) : String;
  13.   Var
  14.     Elc : Char;
  15.     Elb : Byte;
  16.     OverWrite : Boolean;
  17.     CharacterPosition, OffSet : Byte;
  18.   Begin
  19.     CharacterPosition := 1; OverWrite := True; AnsiGotoXY(Row,1+Col);
  20.     OffSet := 0;
  21.     Repeat
  22.       Repeat
  23.         Elb := GetInput;
  24.         If Elb = 0 Then
  25.         Begin
  26.           Elb := GetInput;
  27.           Case Elb Of
  28.             71 : Elc := ^W;
  29.             75 : Elc := ^S;
  30.             77 : Elc := ^D;
  31.             79 : Elc := ^R;
  32.             82 : Elc := ^V;
  33.             83 : Elc := ^G;
  34.           Else
  35.             Elc := #0;
  36.           End;
  37.         End
  38.         Else
  39.         Begin
  40.           Elc := Char(Elb);
  41.         End;
  42.       Until Elc In [^A,^C,^D,^F,^G,^H,^L,^M,^Q,^R,^S,^U,^V,^W,' '..'~'];
  43.       Case Elc Of
  44.         ^A : Begin (* Move left to previous word *)
  45.                If CharacterPosition > 2 Then
  46.                Begin
  47.                  Dec(CharacterPosition);
  48.                  While (LineToEdit[CharacterPosition] = ' ') And (CharacterPosition > 1) Do Dec(CharacterPosition);
  49.                End;
  50.                While (LineToEdit[CharacterPosition] <> ' ') And (CharacterPosition > 1) Do Dec(CharacterPosition);
  51.                If LineToEdit[CharacterPosition] = ' ' Then Inc(CharacterPosition);
  52.                While (CharacterPosition-OffSet) < 1 Do Dec(OffSet);
  53.                AnsiGotoXY(Row,1+Col);
  54.                AnsiClearToEOL;
  55.                Write(Copy(LineToEdit,OffSet+1,79));
  56.                AnsiGotoXY(Row,(CharacterPosition+Col)-OffSet);
  57.              End;
  58.         ^C : Begin (* UpperCase first character *)
  59.                LineToEdit := CapFirst(LineToEdit);
  60.                AnsiGotoXY(Row,1+Col);
  61.                AnsiClearToEOL;
  62.                Write(Copy(LineToEdit,OffSet+1,79));
  63.                AnsiGotoXY(Row,(CharacterPosition+Col)-OffSet);
  64.              End;
  65.         ^D : Begin (* Move right one character *)
  66.                If CharacterPosition <= Length(LineToEdit) Then
  67.                Begin
  68.                  Inc(CharacterPosition);
  69.                  If (CharacterPosition-(OffSet+1)) > 79 Then
  70.                  Begin
  71.                    Inc(OffSet);
  72.                    AnsiGotoXY(Row,1+Col);
  73.                    Write(Copy(LineToEdit,OffSet+1,79));
  74.                  End;
  75.                  AnsiGotoXY(Row,(CharacterPosition+Col)-OffSet);
  76.                End;
  77.              End;
  78.         ^F : Begin (* Move right to next word *)
  79.                While (LineToEdit[CharacterPosition] <> ' ') And (CharacterPosition <= Length(LineToEdit)) Do
  80.                Begin
  81.                  Inc(CharacterPosition);
  82.                End;
  83.                While (LineToEdit[CharacterPosition] = ' ') And (CharacterPosition <= Length(LineToEdit)) Do
  84.                Begin
  85.                  Inc(CharacterPosition);
  86.                End;
  87.                AnsiGotoXY(Row,CharacterPosition+Col);
  88.                While (CharacterPosition-OffSet) > 79 Do Inc(OffSet);
  89.                AnsiGotoXY(Row,1+Col);
  90.                AnsiClearToEOL;
  91.                Write(Copy(LineToEdit,OffSet+1,79));
  92.                AnsiGotoXY(Row,(CharacterPosition+Col)-OffSet);
  93.              End;
  94.         ^G : Begin (* Delete character under cursor *)
  95.                If CharacterPosition <= Length(LineToEdit) Then
  96.                Begin
  97.                  Delete(LineToEdit,CharacterPosition,1);
  98.                  AnsiGotoXY(Row,1+Col);
  99.                  AnsiClearToEOL;
  100.                  Write(Copy(LineToEdit,OffSet+1,79));
  101.                  AnsiGotoXY(Row,(CharacterPosition+Col)-OffSet);
  102.                End;
  103.              End;
  104.         ^H : Begin (* Delete character to left of cursor *)
  105.                If CharacterPosition > 1 Then
  106.                Begin
  107.                  Dec(CharacterPosition);
  108.                  Delete(LineToEdit,CharacterPosition,1);
  109.                  AnsiGotoXY(Row,1+Col);
  110.                  AnsiClearToEOL;
  111.                  Write(Copy(LineToEdit,OffSet+1,79));
  112.                  AnsiGotoXY(Row,(CharacterPosition+Col)-OffSet);
  113.                End;
  114.              End;
  115.         ^L : Begin (* LowerCase entire line *)
  116.                LineToEdit := LowerString(LineToEdit);
  117.                AnsiGotoXY(Row,1+Col);
  118.                AnsiClearToEOL;
  119.                Write(Copy(LineToEdit,OffSet+1,79));
  120.                AnsiGotoXY(Row,(CharacterPosition+Col)-OffSet);
  121.              End;
  122.         ^R : Begin (* Move to end of line *)
  123.                CharacterPosition := Length(LineToEdit)+1;
  124.                While Copy(LineToEdit,CharacterPosition,1) = ' ' Do Delete(LineToEdit,CharacterPosition,1);
  125.                If CharacterPosition > 79 Then
  126.                Begin
  127.                  OffSet := CharacterPosition-79;
  128.                End
  129.                Else
  130.                Begin
  131.                  OffSet := 0;
  132.                End;
  133.                If OffSet > 0 Then
  134.                Begin
  135.                  AnsiGotoXY(Row,1);
  136.                  Write(Copy(LineToEdit,OffSet+1,79)+' ');
  137.                End;
  138.                AnsiGotoXY(Row,(CharacterPosition+Col)-OffSet);
  139.              End;
  140.         ^S : Begin (* Move left one character *)
  141.                If CharacterPosition > 1 Then
  142.                Begin
  143.                  Dec(CharacterPosition);
  144.                  If (CharacterPosition-OffSet) < 1 Then
  145.                  Begin
  146.                    Dec(OffSet);
  147.                    AnsiGotoXY(Row,1);
  148.                    Write(Copy(LineToEdit,OffSet+1,79));
  149.                  End;
  150.                  AnsiGotoXY(Row,(CharacterPosition+Col)-OffSet);
  151.                End;
  152.              End;
  153.         ^U : Begin (* UpperCase entire line *)
  154.                LineToEdit := UpperString(LineToEdit);
  155.                AnsiGotoXY(Row,1+Col);
  156.                AnsiClearToEOL;
  157.                Write(Copy(LineToEdit,OffSet,79));
  158.                AnsiGotoXY(Row,(CharacterPosition+Col)-OffSet);
  159.              End;
  160.         ^V : Begin (* Toggle insert and overwrite *)
  161.                If OverWrite Then
  162.                Begin
  163.                  OverWrite := False;
  164.                  AnsiGotoXY(24,1);
  165.                  NewTextColor(Black);
  166.                  NewTextBackground(Cyan);
  167.                  Write('Insert   ');
  168.                  AnsiGotoXY(Row,1+Col);
  169.                  NewTextColor(White);
  170.                  NewTextBackground(Black);
  171.                  If CurrentEntry^.TypeOfRecord = Comment Then NewTextColor(White) Else NewTextColor(Cyan);
  172.                  AnsiGotoXY(Row,(CharacterPosition+Col)-OffSet);
  173.                End
  174.                Else
  175.                Begin
  176.                  OverWrite := True;
  177.                  AnsiGotoXY(24,1);
  178.                  NewTextColor(Black);
  179.                  NewTextBackground(Cyan);
  180.                  Write('OverWrite');
  181.                  AnsiGotoXY(Row,1+Col);
  182.                  NewTextColor(White);
  183.                  NewTextBackground(Black);
  184.                  If CurrentEntry^.TypeOfRecord = Comment Then NewTextColor(White) Else NewTextColor(Cyan);
  185.                  AnsiGotoXY(Row,(CharacterPosition+Col)-OffSet);
  186.                End;
  187.              End;
  188.         ^W : Begin (* Move to begining of line *)
  189.                CharacterPosition := 1;
  190.                If OffSet > 0 Then
  191.                Begin
  192.                  OffSet := 0;
  193.                  AnsiGotoXY(Row,1);
  194.                  Write(Copy(LineToEdit,1,79));
  195.                End;
  196.                AnsiGotoXY(Row,CharacterPosition+Col);
  197.              End;
  198.       Else
  199.         If Elc <> ^M Then
  200.         Begin
  201.           If Elc = ^Q Then
  202.           Begin
  203.             AnsiGotoXY(24,1);
  204.             NewTextColor(Black);
  205.             NewTextBackground(Cyan);
  206.             Write('Quoting  ');
  207.             AnsiGotoXY(Row,1+Col);
  208.             NewTextColor(White);
  209.             NewTextBackground(Black);
  210.             If CurrentEntry^.TypeOfRecord = Comment Then NewTextColor(White) Else NewTextColor(Cyan);
  211.             Elb := GetInput;
  212.             Elc := Char(Elb);
  213.             AnsiGotoXY(24,1);
  214.             NewTextColor(Black);
  215.             NewTextBackground(Cyan);
  216.             If OverWrite Then Write('OverWrite') Else Write('Insert   ');
  217.             AnsiGotoXY(Row,1+Col);
  218.             NewTextColor(White);
  219.             NewTextBackground(Black);
  220.             If CurrentEntry^.TypeOfRecord = Comment Then NewTextColor(White) Else NewTextColor(Cyan);
  221.           End;
  222.           If OverWrite Then
  223.           Begin
  224.             If CharacterPosition <= Length(LineToEdit) Then
  225.             Begin
  226.               LineToEdit[CharacterPosition] := Elc;
  227.               AnsiGotoXY(Row,(CharacterPosition+Col)-OffSet);
  228.               If (CharacterPosition-(OffSet+1)) < 79 Then Write(Elc);
  229.               Inc(CharacterPosition);
  230.               If (CharacterPosition-(OffSet+1)) > 79 Then
  231.               Begin
  232.                 Inc(OffSet);
  233.                 AnsiGotoXY(Row,1);
  234.                 Write(Copy(LineToEdit,OffSet+1,79));
  235.               End;
  236.               AnsiGotoXY(Row,(CharacterPosition+Col)-OffSet);
  237.             End
  238.             Else
  239.             Begin
  240.               If Length(LineToEdit) < MaxLength Then
  241.               Begin
  242.                 LineToEdit := LineToEdit + Elc;
  243.                 AnsiGotoXY(Row,(CharacterPosition+Col)-OffSet);
  244.                 If (CharacterPosition-(OffSet+1)) < 79 Then Write(Elc);
  245.                 Inc(CharacterPosition);
  246.                 If (CharacterPosition-(OffSet+1)) > 79 Then
  247.                 Begin
  248.                   Inc(OffSet);
  249.                   AnsiGotoXY(Row,1);
  250.                   Write(Copy(LineToEdit,OffSet+1,79));
  251.                 End;
  252.                 AnsiGotoXY(Row,(CharacterPosition+Col)-OffSet);
  253.               End;
  254.             End;
  255.           End
  256.           Else
  257.           Begin
  258.             If Length(LineToEdit) < MaxLength Then
  259.             Begin
  260.               LineToEdit := Copy(LineToEdit,1,CharacterPosition-1)+Elc+Copy(LineToEdit,CharacterPosition,Length(LineToEdit));
  261.               AnsiGotoXY(Row,1+Col); Write(Copy(LineToEdit,OffSet+1,79)); Inc(CharacterPosition);
  262.               AnsiGotoXY(Row,(CharacterPosition+Col)-OffSet);
  263.             End;
  264.           End;
  265.         End;
  266.       End;
  267.     Until Elc = ^M;
  268.     EditLine := LineToEdit;
  269.   End;
  270. {========================================================================}
  271. Procedure EditDescriptionLine;
  272.   Var
  273.     MaxLength : Byte;
  274.   Begin
  275.     If CurrentEntry^.TypeOfRecord = Comment Then MaxLength := 79 Else MaxLength := MaxDescLength;
  276.     CurrentEntry^.Description := EditLine(CurrentEntry^.Description,MaxLength,25,0);
  277.   End;
  278. {========================================================================}
  279. Procedure EditDescription;
  280.   Var
  281.     edc : char;
  282.   Begin
  283.     If CurrentEntry^.TypeOfRecord <> Orphan Then
  284.     Begin
  285.       Altered := True;
  286.       AnsiGotoXY(24,1); NewTextColor(Black); NewTextBackground(Cyan);
  287.       Write('OverWrite  ^w/^a/^s Left  ^d/^f/^r Right  ^h/^g Del ^v Toggle Insert            ');
  288.       AnsiGotoXY(25,1); NewTextBackground(Black);
  289.       If CurrentEntry^.TypeOfRecord = Comment Then NewTextColor(White) Else NewTextColor(Cyan);
  290.       AnsiClearToEOL; Write(Copy(CurrentEntry^.Description,1,79));
  291.       EditDescriptionLine;
  292.       AnsiGotoXY(25,1); AnsiClearToEOL;
  293.       If CurrentEntry^.TypeOfRecord = Comment Then
  294.       Begin
  295.         NewTextColor(White);
  296.         AnsiGotoXY(Row,2); AnsiClearToEOL;
  297.         Write(CurrentEntry^.Description);
  298.       End
  299.       Else
  300.       Begin
  301.         NewTextColor(Cyan);
  302.         AnsiGotoXY(Row,33); AnsiClearToEOL;
  303.         Write(Copy(CurrentEntry^.Description,1,48));
  304.       End;
  305.       AnsiGotoXY(24,1);
  306.       NewTextColor(Black);
  307.       NewTextBackground(Cyan);
  308.       Write(Pgmid+'      ^Q=quit ?=help');
  309.       NewTextColor(White);
  310.       NewTextBackground(Black);
  311.       AnsiGotoXY(24,80);
  312.     End;
  313.   End;
  314. {========================================================================}
  315. Begin
  316. End.
  317. {========================================================================}
  318.