149 lines
2.8 KiB
ObjectPascal
149 lines
2.8 KiB
ObjectPascal
(* The Turbo Vision Stack Component. Part of the FreeType Debugger *)
|
|
|
|
unit StackTV;
|
|
|
|
interface
|
|
|
|
uses Objects, Views, Drivers, TTTypes, TTObjs, TTDebug;
|
|
|
|
type
|
|
|
|
{ TStackView }
|
|
|
|
{ A Simple stack display }
|
|
|
|
PStackView = ^TStackView;
|
|
TStackView = object( TListViewer )
|
|
constructor Init( var Bounds : TRect;
|
|
aexec : PExec_Context;
|
|
AVScrollBar : PScrollBar );
|
|
|
|
procedure HandleEvent( var Event : TEvent ); virtual;
|
|
procedure Draw; virtual;
|
|
procedure Update;
|
|
|
|
private
|
|
exec : PExec_Context;
|
|
end;
|
|
|
|
{ TStackWindow }
|
|
|
|
PStackWindow = ^TStackWindow;
|
|
TStackWindow = object( TWindow )
|
|
V : PScrollBar;
|
|
S : PStackView;
|
|
constructor Init( var Bounds : TRect;
|
|
exec : PExec_Context );
|
|
end;
|
|
|
|
implementation
|
|
|
|
{$I DEBUGGER.INC}
|
|
|
|
{ TStackView }
|
|
|
|
constructor TStackView.Init;
|
|
begin
|
|
inherited Init( Bounds, 1, nil, AVScrollBar );
|
|
exec := aexec;
|
|
|
|
GrowMode := gfGrowHiX or gfGrowHiY;
|
|
DragMode := dmDragGrow or dmLimitLoX or dmLimitLoY;
|
|
EventMask := EventMask or evWave;
|
|
|
|
SetRange( exec^.stackSize );
|
|
end;
|
|
|
|
procedure TStackView.Draw;
|
|
const
|
|
Colors : array[0..1] of Byte = ($1E,$3E);
|
|
var
|
|
B : TDrawBuffer;
|
|
Color : Byte;
|
|
I, Item : Int;
|
|
S : String[16];
|
|
begin
|
|
Color := Colors[0];
|
|
|
|
if exec^.top <= Size.Y then Item := Size.Y-1
|
|
else Item := exec^.top-1-TopItem;
|
|
|
|
for I := 0 to Size.Y-1 do
|
|
begin
|
|
|
|
MoveChar( B, ' ', Color, Size.X );
|
|
|
|
if Item < exec^.top then
|
|
begin
|
|
S := ' ' + Hex16( Item ) + ': ' + Hex32( exec^.stack^[Item] );
|
|
MoveStr( B, S, Color );
|
|
end;
|
|
|
|
WriteLine( 0, I, Size.X, 1, B );
|
|
dec( Item );
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
procedure TStackView.Update;
|
|
begin
|
|
FocusItem( 0 );
|
|
DrawView;
|
|
end;
|
|
|
|
procedure TStackView.HandleEvent;
|
|
var
|
|
Limits : TRect;
|
|
Mini, Maxi : Objects.TPoint;
|
|
begin
|
|
case Event.What of
|
|
|
|
evWave : case Event.Command of
|
|
|
|
cmReFocus : Update;
|
|
|
|
end;
|
|
end;
|
|
|
|
inherited HandleEvent( Event );
|
|
|
|
case Event.Command of
|
|
|
|
cmResize: begin
|
|
Owner^.GetExtent(Limits);
|
|
SizeLimits( Mini, Maxi );
|
|
DragView(Event, DragMode, Limits, Mini, Maxi );
|
|
ClearEvent(Event);
|
|
end;
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
{ TStackWindow }
|
|
|
|
constructor TStackWindow.Init;
|
|
var
|
|
R : TRect;
|
|
begin
|
|
inherited Init( Bounds, 'Pile', wnNoNumber );
|
|
|
|
GetExtent( Bounds );
|
|
R := Bounds;
|
|
R.A.X := R.B.X-1;
|
|
inc( R.A.Y );
|
|
dec( R.B.Y );
|
|
New( V, Init(R) );
|
|
Insert( V );
|
|
|
|
R := Bounds;
|
|
R.Grow(-1,-1);
|
|
New( S, Init( R, exec, V ));
|
|
|
|
Insert( S );
|
|
end;
|
|
|
|
end.
|