
import java.awt.*;

/**
 * Bouton de texte à trois états.<BR>
 * Ce bouton ressemble aux boutons classiques de Windows, mais il réagit au passage
 * de la souris.<BR>
 * 
 * @author Denis Bredelet
 * @see FlyButton
 */
public class FlyTextButton extends FlyButton
{
    public FlyTextButton(String caption)
    {
        super();
        text = caption;
        setBorderStyle(BORDER_THINRAISED, NORMAL);
        setBorderStyle(BORDER_RAISED, BRUSHED);
    }
    
    public void paintNormal(Graphics g)
    {
        paintText(g, padx-1, pady-1);
    }

    public void paintBrushed(Graphics g)
    {
        paintText(g, padx-2, pady-2);
    }

    public void paintPressed(Graphics g)
    {
        paintText(g, padx, pady);
    }

    public void paintDisabled(Graphics g)
    {
        g.setColor(SystemColor.controlLtHighlight);
        paintText(g, padx, pady);
        g.setColor(SystemColor.controlDkShadow);
        paintText(g, padx-1, pady-1);
    }
    
    protected void paintText(Graphics g, int x, int y)
    {
        g.setFont(getFont());
		int baseline = g.getFontMetrics().getMaxAscent();
        g.drawString(text, x, y + baseline);
    }
    
    public Dimension getPreferredSize()
    {
        if (preferred == null)
        {
            Font f = getFont();
            if (f == null)
            {
                return super.getPreferredSize();
            }
            FontMetrics m = getFontMetrics(f);
            preferred = new Dimension(m.stringWidth(text)+2*padx, m.getHeight()+2*pady);
        }
        return preferred;
    }
    
    protected String text;
    protected Dimension preferred;
    
    private static final int padx = 7;
    private static final int pady = 5;
}