/*******************************************************************************
 * Copyright (c) 2001, 2007 Oracle Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors:
 *     Oracle Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.jst.pagedesigner.editpolicies;

import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.Locator;
import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.draw2d.geometry.Rectangle;

public class AbsolutePointLocator implements Locator 
{
    private static AbsolutePointLocator   INSTANCE;
    private final static Point    DEFAULT_POINT = new Point(0,0);
    
    private Point  _referencePoint = DEFAULT_POINT; 
    private int    _xOffset = 0;
    private int    _yOffset = 0;
    private IFigure _intersectFigure;
    
    public synchronized static AbsolutePointLocator getInstance()
    {
        if (INSTANCE == null)
        {
            INSTANCE = new AbsolutePointLocator();
        }
        return INSTANCE;
    }
    
    /** 
     * Relocates the target figure to the reference point with possible x and y
     * offsetting.  Uses the target's preferredSize as the new size.
     */
    public void relocate(IFigure target) 
    {
        Point leftTop = new Point(_referencePoint.x+_xOffset, _referencePoint.y+_yOffset);
        

        //figure.translateToAbsolute(leftTop);
        target.translateToRelative(leftTop);
        Dimension d = target.getPreferredSize();
        Rectangle rect = new Rectangle(leftTop, d);

        // to avoid enlargemeent
        if (_intersectFigure != null)
        {
            rect = rect.intersect(_intersectFigure.getBounds());
        }
        
        target.setBounds(rect);
    }

    /**
     * Sets the reference point used to calculate the location to which
     * relocate will relocate its target.  The x and y offset values are added
     * to the reference point before final re-location.  If point is null
     * then the reference is set to (0,0)
     * @param point
     */
    public void setReferencePoint(Point point, int xoffset, int yoffset)
    {
        if (point == null)
        {
            _referencePoint = DEFAULT_POINT;
        }
        else
        {
            _referencePoint = point;
        }
       
        _xOffset = xoffset;
        _yOffset = yoffset;
    }
    
    /**
     * Sets the figure used to calculate a rectangular intersect of the 
     * relocated target.  This normally set to the parent of the target
     * such as a layer to ensure that the relocate target does not enlarge
     * its parent by relocating outside it's rectangle.
     * 
     * If intersectFigure is set to null, then no intersect calculation will
     * be performed.
     * 
     * @param intersectFigure
     */
    public void setIntersectFigure(IFigure intersectFigure)
    {
        _intersectFigure = intersectFigure;
    }
    
    private AbsolutePointLocator() {/*no external instantiation*/}
}
