Unit ZoneTV;
interface
uses Objects, Views, Drivers, FreeType, TTTypes, TTTables, TTObjs, TTDebug;
type
PZoneViewer = ^TZoneViewer;
TZoneViewer = object( TListViewer )
constructor Init( var Bounds : TRect;
AZone : PGlyph_Zone );
procedure Draw; virtual;
procedure HandleEvent( var Event : TEvent ); virtual;
private
Zone : PGlyph_Zone;
Save : TGlyph_Zone;
procedure Copy_Zone;
end;
PZoneWindow = ^TZoneWindow;
TZoneWindow = object( TWindow )
ZoneView : PZoneViewer;
constructor Init( var Bounds : TRect;
AZone : PGlyph_Zone );
end;
implementation
constructor TZoneViewer.Init;
var
n : Int;
begin
inherited Init( Bounds, 1, nil, nil );
GrowMode := gfGrowHiX or gfGrowHiY;
DragMode := dmDragGrow or dmLimitLoX or dmLimitLoY;
Options := Options or ofSelectable;
EventMask := EventMask or evWave;
Zone := AZone;
GetMem( Save.org, zone^.n_points*2*sizeof(Long) );
GetMem( Save.cur, zone^.n_points*2*sizeof(Long) );
GetMem( Save.flags, zone^.n_points*sizeof(Byte) );
Save.n_points := Zone^.n_points;
Save.n_contours := Zone^.n_contours;
Copy_Zone;
SetRange( Save.n_points );
end;
procedure TZoneViewer.Copy_Zone;
var
n : Int;
begin
n := 2*zone^.n_points * sizeof(Long);
move( Zone^.org^, Save.org^, n );
move( Zone^.cur^, Save.cur^, n );
move( Zone^.flags^, Save.flags^, zone^.n_points );
end;
procedure TZoneViewer.HandleEvent( var Event : TEvent );
var
Limits : TRect;
Mini, Maxi : Objects.TPoint;
begin
inherited HandleEvent(Event);
Case Event.What of
evWave : case Event.Command of
cmNewExecution : Copy_Zone;
cmRefocus : DrawView;
end;
evCommand : case Event.Command of
cmResize: begin
Owner^.GetExtent(Limits);
SizeLimits( Mini, Maxi );
DragView(Event, DragMode, Limits, Mini, Maxi );
ClearEvent(Event);
end;
end;
end;
end;
procedure TZoneViewer.Draw;
const
Colors : array[0..3] of byte
= ($30,$3F,$0B,$0E);
Touchs : array[0..3] of Char
= (' ','x','y','b');
OnOff : array[0..1] of Char
= (' ',':');
var
I, J, Item : Int;
B : TDrawBuffer;
S : String;
Indent : Int;
Ligne : Int;
Changed : Boolean;
Back_Color,
Color : word;
On_BP : boolean;
BP : PBreakPoint;
begin
if HScrollBar <> nil then Indent := HScrollBar^.Value
else Indent := 0;
with Save do
begin
for I := 0 to Self.Size.Y-1 do
begin
MoveChar( B, ' ', Colors[0], Self.Size.X );
Item := TopItem + I;
if (Range > 0) and
( Focused = Item ) then Back_Color := 2
else Back_Color := 0;
if Item < n_points then
begin
Color := Back_Color;
if ( flags^[item] <> Zone^.flags^[item] ) then inc( Color );
S := Hex16( Item ) + ': ';
S[1] := OnOff[Zone^.flags^[item] and 1];
S[7] := Touchs[(Zone^.flags^[item] and TT_Flag_Touched_Both) shr 1];
MoveStr( B, S, Colors[Color] );
Color := Back_Color;
if ( org^[item].x <> Zone^.org^[item].x ) then inc( Color );
MoveStr ( B[8], Hex32( Zone^.org^[item].x ), Colors[Color] );
MoveChar( B[16], ',', Colors[0], 1 );
Color := Back_Color;
if ( org^[item].y <> Zone^.org^[item].y ) then inc( Color );
MoveStr( B[17], Hex32( Zone^.org^[item].y ), Colors[Color] );
MoveStr( B[25], ' : ', Colors[0] );
Color := Back_Color;
if ( cur^[item].x <> Zone^.cur^[item].x ) then inc( Color );
MoveStr ( B[28], Hex32( Zone^.cur^[item].x ), Colors[Color] );
MoveChar( B[36], ',', Colors[0], 1 );
Color := Back_Color;
if ( cur^[item].y <> Zone^.cur^[item].y ) then inc( Color );
MoveStr( B[37], Hex32( Zone^.cur^[item].y ), Colors[Color] );
end;
WriteLine( 0, I, Self.Size.X, 1, B );
end;
end;
end;
constructor TZoneWindow.Init;
begin
inherited Init( Bounds,'Zone',wnNoNumber );
GetExtent( Bounds );
Bounds.Grow(-1,-1);
New( ZoneView, Init( Bounds, AZone ) );
Insert( ZoneView );
end;
end.