package cnp.ew.kdemo;

import java.awt.*;
import java.util.*;
import cnp.ew.displayer.*;
import cnp.ew.diagram.*;
import cnp.ew.util.*;
import cnp.ew.converter.*;
import cnp.ew.properties.*;

public class CpOrgChartEmployeeLc extends CpAbstractDiagrammableLc
{

    static final int standardImageWidth = 205;
    static final int standardImageHeight = 205;

    static final int margin = 10;

    static Font nameFont;
    static Font titleFont;

    CpGeneralStringDisplayer textDisplayer;
    CpImageDisplayer imageDisplayer;
    CpEmployee employee;

    public CpOrgChartEmployeeLc(CpEmployee employee)
    {
        super();
        this.employee = employee;
        imageDisplayer = new CpImageDisplayer();
        imageDisplayer.setDisplayScaled(true);
        textDisplayer = new CpGeneralStringDisplayer();
        setBorderStyle(BORDER_DROPSHADOW);
        //setKeepCachedImage(true);
    }

	public Vector getHandles()
	{
	    // Have to avoid copying this so much...
	    Vector v = new Vector();
		v.addElement(new CpSizingHandle(this, CpBasicLocator.rightBottomLocator, CpBasicLocator.leftTopLocator, getWantsXorSizing()));
		v.addElement(new CpSizingHandle(this, CpBasicLocator.leftTopLocator, CpBasicLocator.rightBottomLocator, getWantsXorSizing()));
		v.addElement(new CpSizingHandle(this, CpBasicLocator.leftBottomLocator, CpBasicLocator.rightTopLocator, getWantsXorSizing()));
		v.addElement(new CpSizingHandle(this, CpBasicLocator.rightTopLocator, CpBasicLocator.leftBottomLocator, getWantsXorSizing()));
	    CpDependentLineLc connectionLine = new CpDependentLineLc();
	    connectionLine.endDecoration = connectionLine.ARROW;
 		v.addElement(new CpConnectingHandle(this, CpBasicLocator.rightMiddleLocator, new CpDependentConnector(connectionLine, true, true), new CpConnectionPolicy()));
		return v;
	}

	public boolean getConnectionLinesFromCenterX()
	{
	    return true;
	}

	public void paint(Graphics g, Rectangle rect)
	{
	    int textLeft, textTop;
	    int imageWidth, imageHeight;
	    int scaledMargin = (int)(margin * getScale());
	    Dimension preferredSize;

	    imageWidth = employee.getImage().getWidth(CpToolkit.defaultComponent()) / 3;
	    imageHeight = employee.getImage().getHeight(CpToolkit.defaultComponent()) / 3;

	    int scaledImageWidth = (int)(imageWidth * getScale());
	    int scaledImageHeight = (int)(imageHeight * getScale());

	    Rectangle clientRect = getClientRect();
	    g.setColor(getBackground());
	    g.fillRect(0, 0, clientRect.width, clientRect.height);

	    imageDisplayer.setImage(employee.getImage());
	    imageDisplayer.paintIn(this, g,
	        clientRect.x + scaledMargin,
	        clientRect.y + scaledMargin,
	        scaledImageWidth,
	        scaledImageHeight);

        textDisplayer.setText(employee.getName());
        textDisplayer.setFont(getNameFont());
        textLeft = clientRect.x + scaledImageWidth + 2 * scaledMargin;
        textTop = clientRect.y + scaledMargin * 2;

        preferredSize = textDisplayer.preferredSize(this);
        textDisplayer.paintIn(this, g,
            textLeft,
            textTop,
            clientRect.width - (textLeft - clientRect.x) - scaledMargin,
            preferredSize.height);


        textTop += preferredSize.height + scaledMargin / 3;

        textDisplayer.setText(employee.getTitle());
        textDisplayer.setFont(getTitleFont());
        preferredSize = textDisplayer.preferredSize(this);
        textDisplayer.paintIn(this, g,
            textLeft,
            textTop,
            clientRect.width - (textLeft - clientRect.x) - scaledMargin,
            preferredSize.height);

	}

    public Dimension preferredSize()
    {
        return new Dimension(100, 200);
    }



	Font getNameFont()
	{
	    return new Font("Helvetica", Font.BOLD, (int)(12 * getScale()));
	}

	Font getTitleFont()
	{
	    return new Font("Helvetica", Font.ITALIC, (int)(12 * getScale()));
	}

	Font getTextFont()
	{
	    return new Font("Helvetica", Font.PLAIN, (int)(12 * getScale()));
	}


    public Object getProperty(CpProperty prop)
    {
        return employee.getProperty(prop);
    }

    public void setProperty(CpProperty prop, Object o)
    {
        employee.setProperty(prop, o);
        flushCachedImage();
        repaint();
    }

    public Vector getProperties()
    {
        return employee.getProperties();
    }

    public void scale(double newScale)
    {
        super.scale(newScale);
        flushCachedImage();
    }

    public String getName()
    {
        return employee.getName();
    }


}
