
import java.awt.*;
import java.io.*;
import java.util.*;

class Line extends Figure {
    // Difference between x1-x0 and y1-y0
    int _dx;
    int _dy;

    Line( String color, int x0, int y0, int x1, int y1 ) {
	super( color, x0, y0 );
	_dx = x1 - x0;
	_dy = y1 - y0;
    }

    public void resize( int x0, int y0, int x1, int y1 ) {
	_x0 = x0;
	_y0 = y0;
	_dx = x1 - x0;
	_dy = y1 - y0;
    }

    public void paint( Graphics g ) {
	g.setColor( getColor() );      
	g.drawLine( _x0, _y0, _x0 + _dx, _y0 + _dy );
    }

    public String toString() {
	String s = "Line|";
	s += super.toString();
	s += _dx + "|" + _dy +"\n";
	return s;
    }

    Line( StringTokenizer t ) {
	super( t );

	Integer i = new Integer( t.nextToken() );
	_dx = i.intValue();
	
	i = new Integer( t.nextToken() );
	_dy = i.intValue();
    }

    public boolean isSelected( int x, int y ) {
	double dx0 = _dx;
	double dy0 = _dy;
	double dx = x - _x0;
	double dy = y - _y0;
	double d = dy0 * dx - dx0 * dy;
	double r = Math.sqrt( dx0*dx0 + dy0*dy0 );

	if ( Math.abs( r ) < .1 ) {
	    r = 1;
	}

	d = Math.abs( d/r );

	if ( d < 3 && 
	     x >= getMinX() && x < getMaxX() && 
	     y >= getMinY() && y < getMaxY() ) {
	    return true;
	}
	else {
	    return false;
	}
    }

    public void paintSelected( Graphics g ) {
	g.setColor( Color.blue.brighter() );
	g.drawRect( _x0-2, _y0-2, 4, 4 );
	g.drawRect( _x0+_dx-2, _y0+_dy-2, 4, 4 );
    }

    // Return true if figure is selected using these coordinates
    public boolean isInBox( int x0, int y0, int width, int height ) {
	if ( x0 <= getMinX() && x0 + width >= getMaxX() && 
	     y0 <= getMinY() && y0 + height >= getMaxY() ) {
	    return true;
	}
	else {
	    return false;
	}
    }

    public int getMinX() {
	int x1 = _x0 + _dx;
	if ( _x0 < x1 ) {
	    return _x0;
	}
	else {
	    return x1;
	}
    }

    public int getMaxX() {
	int x1 = _x0 + _dx;
	if ( _x0 > x1 ) {
	    return _x0;
	}
	else {
	    return x1;
	}
    }

    public int getMinY() {
	int y1 = _y0 + _dy;
	if ( _y0 < y1 ) {
	    return _y0;
	}
	else {
	    return y1;
	}
    }

    public int getMaxY() {
	int y1 = _y0 + _dy;
	if ( _y0 > y1 ) {
	    return _y0;
	}
	else {
	    return y1;
	}
    }
}


