mysticbbs/mdl/m_output_scrollback.pas

120 lines
2.5 KiB
ObjectPascal

Unit m_Output_ScrollBack;
{$I M_OPS.PAS}
Interface
Uses
m_Types,
m_Output;
Const
MaxScrollBufferSize = 1000;
Type
TConsoleScrollback = Class(TOutput)
ScrollBuf : Array[1..MaxScrollBufferSize] of TConsoleLineRec;
ScrollPos : SmallInt;
Capture : Boolean;
Constructor Create (A: Boolean);
Destructor Destroy; Override;
Procedure ClearBuffer;
Procedure AddLine (Line: Word);
Function IsBlankLine (Line: Word) : Boolean;
Procedure ClearScreen; Override;
Procedure ScrollWindow; Override;
End;
Implementation
Constructor TConsoleScrollback.Create (A: Boolean);
Begin
Inherited Create(A);
ClearBuffer;
Capture := False;
End;
Destructor TConsoleScrollback.Destroy;
Begin
Inherited Destroy;
End;
Procedure TConsoleScrollback.ClearBuffer;
Var
Count1 : LongInt;
Count2 : LongInt;
Begin
ScrollPos := 0;
For Count1 := 1 to MaxScrollBufferSize Do
For Count2 := 1 to 80 Do Begin
ScrollBuf[Count1][Count2].Attributes := 7;
ScrollBuf[Count1][Count2].UnicodeChar := ' ';
End;
End;
Procedure TConsoleScrollback.AddLine (Line: Word);
Begin
If ScrollPos = MaxScrollBufferSize Then Begin
Move(ScrollBuf[2][1], ScrollBuf[1][1], SizeOf(TConsoleLineRec) * (MaxScrollBufferSize - 1));
Dec(ScrollPos);
End;
Inc (ScrollPos);
Move (Buffer[Line][1], ScrollBuf[ScrollPos][1], SizeOf(TConsoleLineRec));
End;
Function TConsoleScrollback.IsBlankLine (Line: Word) : Boolean;
Var
Count : LongInt;
Begin
Result := True;
For Count := 1 to 80 Do
// If (Buffer[Line][Count].UnicodeChar <> #0) and ((Buffer[Line][Count].UnicodeChar <> ' ') and (Buffer[Line][Count].Attributes <> 7)) Then Begin
If (Buffer[Line][Count].UnicodeChar <> #0) and ((Buffer[Line][Count].UnicodeChar <> ' ') or (Buffer[Line][Count].Attributes <> 7)) Then Begin
Result := False;
Exit;
End;
End;
Procedure TConsoleScrollback.ClearScreen;
Var
Line : LongInt;
Count : LongInt;
Begin
If Capture Then Begin
{$IFDEF WIN32}
Line := Window.Bottom + 1;
{$ELSE}
Line := FWinBot;
{$ENDIF}
While Line > 0 Do Begin
If Not IsBlankLine(Line) Then Break;
Dec(Line);
End;
If Line <> 0 Then
For Count := 1 to Line Do
AddLine(Count);
End;
Inherited ClearScreen;
End;
Procedure TConsoleScrollBack.ScrollWindow;
Begin
If Capture Then AddLine(1);
Inherited ScrollWindow;
End;
End.