/******************************************************************************* * Copyright (c) 2004, 2006 Sybase, Inc. 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: *     Sybase, Inc. - initial API and implementation *******************************************************************************/package org.eclipse.jst.jsf.facesconfig.ui.preference;import org.eclipse.draw2d.Label;import org.eclipse.draw2d.PositionConstants;import org.eclipse.draw2d.RotatableDecoration;import org.eclipse.draw2d.geometry.Point;import org.eclipse.draw2d.geometry.Rectangle;import org.eclipse.draw2d.geometry.Transform;import org.eclipse.jface.resource.JFaceResources;import org.eclipse.swt.graphics.Font;import org.eclipse.swt.graphics.Image;public class BaseFigureDecorator extends Label implements RotatableDecoration{	public static int DEFAULT_DECORATOR_POSITION = PositionConstants.SOUTH_WEST;	private Point location = new Point();	private Transform transform = new Transform();	private int position;	public BaseFigureDecorator(Image image)	{		this.position = DEFAULT_DECORATOR_POSITION;		setIcon(image);		setSize(getPreferredSize());	}	public BaseFigureDecorator(Image image, String tooltip)	{		this.position = DEFAULT_DECORATOR_POSITION;		setIcon(image);		setSize(getPreferredSize());		setToolTip(new Label(tooltip));	}	public BaseFigureDecorator(Image image, String tooltip, int position)	{		this.position = position;		setIcon(image);		setSize(getPreferredSize());		setToolTip(new Label(tooltip));	}	public Font getFont()	{        Font localFont = getLocalFont();		if (localFont == null)        {			localFont = JFaceResources.getFontRegistry().get(					JFaceResources.DEFAULT_FONT);            // TODO: it's not clear that setFont is correct to call            // here since this does a revalidate if the font changes            // whereas the deprecated assignment to font that it replaces            // does not            setFont(localFont);        }		return localFont;	}	/**	 * 	 * @return Returns the position.	 * 	 */	public int getPosition()	{		return position;	}	/**	 * 	 * @param position	 * 	 * The position to set.	 * 	 */	public void setPosition(int position)	{		this.position = position;	}	public void setToolTipText(String tooltip)	{		super.setToolTip(new Label(tooltip));	}	public String getToolTipText()	{		Label label = (Label) super.getToolTip();		return label.getText();	}	/**	 * 	 * Sets the location of this PolygonDecoration.	 * 	 * 	 * 	 * @param p	 * 	 * the new location	 * 	 */	public void setLocation(Point p)	{		bounds = null;		location.setLocation(p);		transform.setTranslation(p.x, p.y);	}	public Rectangle getBounds()	{		if (bounds == null)		{			if (prefSize == null)			{				getPreferredSize();			}			int w = prefSize.width;			int h = prefSize.height;			Point p = location; // transform.getTransformed(new Point(w/2,h/2));			bounds = new Rectangle(p.x - w / 2, p.y - h / 2, w, h).getExpanded(					w, h);		}		return bounds;	}	/**	 * 	 * @see org.eclipse.draw2d.Figure#useLocalCoordinates()	 * 	 */	protected boolean useLocalCoordinates()	{		return false;	}	public void setScale(double x, double y)	{		// TODO: figure out how to scale images		bounds = null;		transform.setScale(x, y);	}	/**	 * 	 * Sets the rotation of this decoration so that the decoration points toward	 * the	 * 	 * given reference point.	 * 	 * @param ref	 *            the reference point	 * 	 * @see org.eclipse.draw2d.RotatableDecoration#setReferencePoint(org.eclipse.draw2d.geometry.Point)	 * 	 */	public void setReferencePoint(Point ref)	{		// TODO: figure out how to rotate images		bounds = null;		Point pt = Point.SINGLETON;		pt.setLocation(ref);		pt.negate().translate(location);		setRotation(Math.atan2(pt.y, pt.x));	}	/**	 * 	 * Sets the angle by which rotation is to be done on the PolygonDecoration.	 * 	 * 	 * 	 * @param angle	 *            Angle of rotation	 * 	 * @since 2.0	 * 	 */	public void setRotation(double angle)	{		bounds = null;		// transform.setRotation(angle);	}}