/*******************************************************************************
* Copyright (c)                                                                *
*           2005   Tristan Allwood,                                            *
*           2005   Daniel Burke,                                               *
*           2005   Marc Hull,                                                  *
*           2005   Ekaterina Itskova,                                          *
*           2005   Steve Zymler                                                *
*                                                                              *
* Permission is hereby granted, free of charge, to any person obtaining a      *
* copy of this software and associated documentation files (the                *
* "Software"), to deal in the Software without restriction, including          *
* without limitation the rights to use, copy, modify, merge, publish,          *
* distribute, sublicense, and/or sell copies of the Software, and to           *
* permit persons to whom the Software is furnished to do so, subject to        *
* the following conditions:                                                    *
*                                                                              *
* The above copyright notice and this permission notice shall be included      *
* in all copies or substantial portions of the Software.                       *
*                                                                              *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS      *
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF                   *
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.       *
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY         *
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,         *
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE            *
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                       *
*******************************************************************************/
/*
 * Created on 08-Nov-2004
 */
package uk.ac.ic.doc.kevlar.gui.internal.layout;

import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;

/**
 * @author Marc
 **/
public class LayoutData implements ILayoutData {

    public Point position = new Point(0, 0);
    public Rectangle bounds = new Rectangle(0,0,0,0);
    
    private final Point defPos = new Point( 40, 40 );
    
    
    public LayoutData( Point size )
    {
        position.x = defPos.x ;
        position.y = defPos.y ;
        bounds.width = size.x;
        bounds.height = size.y;
    }
    
    public LayoutData( Point pos, Point size )
    {
        position = pos ;
        bounds.x = pos.x;
        bounds.y = pos.y;
        bounds.width = size.x;
        bounds.height = size.y;
    }
    
    public void setPosition( Point pos )
    {
        position = pos ;
        bounds.x = pos.x ;
        bounds.y = pos.y ;
    }
    
    public void setSize( Point size )
    {
        bounds.width = size.x ;
        bounds.height = size.y ; 
    }
    
    public boolean intersects( ILayoutData data )
    {
        LayoutData data2 = (LayoutData) data;
        
        if( data2 != null )
        {
        	Rectangle test = new Rectangle( bounds.x - LayoutGrid.PIPESPACING , bounds.y - LayoutGrid.PIPESPACING, 
        								    bounds.width + 2*LayoutGrid.PIPESPACING, bounds.height + 2*LayoutGrid.PIPESPACING );
            return test.intersects( data2.bounds );
        }
        
        return false ;
    }
    
    public boolean contains( Point p )
    {
    	return bounds.contains( p );
    }

	private boolean lineSpansHorz(Point p1, Point p2) {
		
		if( p1.x <= bounds.x && p2.x >= bounds.x + bounds.width ) return true ;
		if( p2.x <= bounds.x && p1.x >= bounds.x + bounds.width ) return true ;
		
		return false;
	}

	private boolean lineSpansVert(Point p1, Point p2) {
		
		if( p1.y <= bounds.y && p2.y >= bounds.y + bounds.height ) return true ;
		if( p2.y <= bounds.y && p1.y >= bounds.y + bounds.height ) return true ;
		
		return false;
	}
	
	public boolean intersects( Point p1, Point p2 )
	{
		if( lineSpansHorz( p1, p2 ) )
		{
			if( p1.y >= bounds.y && p1.y <= bounds.y + bounds.height )
			{
				return true ;
			}
		}
		else if( lineSpansVert( p1, p2 ) )
		{
			if( lineSpansVert( p1, p2 ) )
			{
				if( p1.x >= bounds.x && p1.x <= bounds.x + bounds.width )
				{
					return true ;
				}
			}
		}	
		return false ;
	}
}
