/usr/local/CPAN/NetworkInfo-Discovery/NetworkInfo/Discovery/Tk.pm


package NetworkInfo::Discovery::Tk;

use Tk;
use Tk::Canvas;
use NetworkInfo::Discovery::Register;
use base "NetworkInfo::Discovery::Register";

use strict;
use warnings;

use vars qw($AUTOLOAD %ok_field);

# Authorized attribute fields
for my $attr ( qw(id canvas balloon  color size center velocityx velocityy x y dx dy) ) { $ok_field{$attr}++; } 

sub new {
    my $proto = shift;
    my %args = @_;

    my $class = ref($proto) || $proto;

    my $self  = {
    };

    bless ($self, $class);

    $self->{'canvas'} = $args{canvas} if (exists $args{canvas});
    $self->{'file'} = $args{file} if (exists $args{file});
    $self->{'autosave'} = $args{autosave} if (exists $args{autosave});

    if ($self->file && -r $self->file) {
	$self = $self->read_register( );
	bless ($self, $class);
    }


    return $self;
}

sub show_verts {
    my $self = shift;

#    my @e = $self->edges;
#    while (@e) {
#	my ($u, $v) =  (shift @e, shift @e);
    #
#	my $id = $self->get_attribute("id", $u, $v);
    #
#	my $x1 = $self->get_attribute("x", $u);
#	my $y1 = $self->get_attribute("y", $u);
    #
#	my $x2 = $self->get_attribute("x", $v);
#	my $y2 = $self->get_attribute("y", $v);
    #
#	$self->canvas->coords($id,
#	    $x1, $y1, 
#	    $x2, $y2,
#	    );
#    }

    for (my $i = 0 ; $i < @{$self->{interfaces}} ; $i++) {
	$self->make_tk_node($i);

	my $id = $self->{interfaces}->[$i]->{"id"};
	my $nx = $self->{interfaces}->[$i]->{"x"};
	my $ny = $self->{interfaces}->[$i]->{"y"};
	my $size=$self->{interfaces}->[$i]->{"size"};

	$self->canvas->coords($id,
	    $nx-($size/2), $ny-($size/2),
	    $nx+($size/2), $ny+($size/2),
	    );
    }


}

sub circular_map {
    my $self = shift;
    $self->circular_map_verts;
    $self->dump_us();
#    $self->map_edges;
}
sub random_map {
    my $self = shift;
    $self->random_map_verts;
#    $self->map_edges;
}

sub circular_map_verts {
    my $self = shift;

    my $gamma= 2* 3.14159 / (@{$self->{interfaces}});
    my $rayon = 100; 

    for (my $i = 0 ; $i < @{$self->{interfaces}} ; $i++) {
	$self->make_tk_node($i);
	
	my $x = $rayon *cos($gamma * $i) + $rayon*2;
	my $y = $rayon *sin($gamma * $i) + $rayon*2;

	$self->{interfaces}->[$i]->{"x"} = $x;
	$self->{interfaces}->[$i]->{"y"} = $y;
    }
}

sub random_map_verts {
    my $self = shift;

    my $x;
    my $y;

    my $height = $self->canvas->cget(-height) ;
    my $width = $self->canvas->cget(-width) ;
    for (my $i = 0 ; $i < @{$self->{interfaces}} ; $i++) {
	$self->make_tk_node($i);

	my $minx = $self->{interfaces}->[$i]->{"size"} / 2;
	my $miny = $self->{interfaces}->[$i]->{"size"} / 2;
	my $maxx = $width -$minx;
	my $maxy = $height -$miny;

	$x = rand ($maxx-$minx) + $minx;
	$y = rand ($maxy-$miny) + $miny;

	$self->{interfaces}->[$i]->{"x"} = $x;
	$self->{interfaces}->[$i]->{"y"} = $y;
    }
    
    
}
sub map_edges {
    my $self = shift;

    #print " " . join("," , caller()) . "\n";
    my @e = $self->edges;
    while (@e) {
	my ($u, $v) =  (shift @e, shift @e);
	$self->make_tk_edge($u, $v);

	my $x1 = $self->get_attribute("x", $u);
	my $x2 = $self->get_attribute("x", $v);
	my $y1 = $self->get_attribute("y", $u);
	my $y2 = $self->get_attribute("y", $v);

	$self->set_attribute("x1", $u, $v, $x1);
	$self->set_attribute("x2", $u, $v, $x2);
	$self->set_attribute("y1", $u, $v, $y1);
	$self->set_attribute("y2", $u, $v, $y2);

    }

}


sub make_tk_edge {
    my $self = shift;
    my $u = shift;
    my $v = shift;

    return 1 if ($self->has_attribute("id", $u, $v));

    my $x1 = 50;
    my $y1 = 40;
    my $x2 = 250;
    my $y2 = 240;
    my $color = "white";

    my $id = $self->canvas->createLine(
	$x1, $y1,
	$x2, $y2,
	-fill => $color,
    );

    $self->set_attribute("id",	   $u, $v, $id);
    $self->set_attribute("color",  $u, $v, $color);
}

sub make_tk_node {
    my $self = shift;
    my $index = shift;

    return 1 if (exists $self->{interfaces}->[$index]->{id});

    my $x = 250;
    my $y = 40;
    my $size = 20;
    my $center = $size/2;
    my $color = "green";

    my $id = $self->canvas->createOval(
	$x - $center, $y - $center,
	$x + $center, $y + $center,
	-fill => $color,
    );


    $self->{interfaces}->[$index]->{"id"} =$id;
    $self->{interfaces}->[$index]->{"balloonid"} = $b;
    $self->{interfaces}->[$index]->{"x"} = $x;
    $self->{interfaces}->[$index]->{"y"} = $y;
    $self->{interfaces}->[$index]->{"size"} = $size;
    $self->{interfaces}->[$index]->{"center"} = $center;
    $self->{interfaces}->[$index]->{"color"} =$color;
}


 sub AUTOLOAD {
     my $self = shift;
     my $attr = $AUTOLOAD;
     $attr =~ s/.*:://;
     return unless $attr =~ /[^A-Z]/;  # skip DESTROY and all-cap methods
     warn "invalid attribute method: ->$attr()" unless $ok_field{$attr};
     $self->{lc $attr} = shift if @_;
     return $self->{lc $attr};
}
1;