package cnp.ew.properties;

import java.awt.*;
import java.util.*;

import cnp.ew.util.*;
import cnp.ew.displayer.*;
import cnp.ew.lightweight.*;

public class CpGridPalette extends CpAbstractLc
{
    static CpBorderDisplayable cellBorderDisplayer = new Cp3DBorderDisplayer(false, true);
    CpModelDisplayable cellDisplayer;

	int numColumns;
	int cellSizeX;
	int cellSizeY;
	Vector items;
	int selectedIndex;

    public CpGridPalette()
    {
        this(4, 16, 16, null);
    }

    public CpGridPalette(int newNumColumns, int newCellSizeX, int newCellSizeY, CpModelDisplayable newDisplayer)
    {
        numColumns = newNumColumns;
        cellSizeX = newCellSizeX;
        cellSizeY = newCellSizeY;
        cellDisplayer = newDisplayer;
    }

    public void setItems(Vector newItems)
    {
        items = newItems;
    }

    public Dimension preferredSize()
    {
        return borderedPreferredSize(new Dimension(cellSizeX * numColumns + 5, (((items.size() - 1) / numColumns) + 1) * cellSizeY + 5));
    }

  	public void paint(Graphics g, Rectangle clip)
	{
	    Rectangle rect = getClientRect();
	    g.setColor(Color.lightGray);
	    g.fillRect(rect.x, rect.y, rect.width, rect.height);
	    g.setColor(Color.black);
	    g.drawRect(rect.x, rect.y, rect.width - 1, rect.height - 1);

        Insets insets = cellBorderDisplayer.insets(this);
	    int x, y;
	    for (int i = 0; i < items.size(); i++) {
	        x = (i % numColumns) * cellSizeX + 3;
	        y = (i / numColumns) * cellSizeY + 3;

	        cellDisplayer.setModel(items.elementAt(i));
	        cellDisplayer.paintIn(this, g, rect.x + x + insets.left, rect.y + y + insets.top, cellSizeX - 1 - insets.left - insets.right, cellSizeY - 1 - insets.left - insets.right);
	        cellBorderDisplayer.paintIn(this, g, rect.x + x, rect.y + y, cellSizeX - 1, cellSizeY - 1);
	    }
	}

    public boolean mouseDown(Event e, int x, int y)
    {
        selectedIndex = (y / cellSizeY) * numColumns + (x / cellSizeX);
        for (int i = 0; i < getObservers().size(); i++) {
            CpObserver observer = (CpObserver)getObservers().elementAt(i);
            observer.update(this, OBJECT_CHANGED, items.elementAt(selectedIndex));
        }
        notifyObservers(OBJECT_CHANGED, items.elementAt(selectedIndex));
        popDownPoppedUpLc();
		return false;
    }

    public int getSelectedIndex()
    {
        return selectedIndex;
    }
}

