unit StackTV;
interface
uses Objects, Views, Drivers, TTTypes, TTObjs, TTDebug;
type
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;
PStackWindow = ^TStackWindow;
TStackWindow = object( TWindow )
V : PScrollBar;
S : PStackView;
constructor Init( var Bounds : TRect;
exec : PExec_Context );
end;
implementation
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;
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.