package cnp.ew.list;

import java.util.*;
import java.awt.*;

import cnp.ew.util.*;
import cnp.ew.scrolling.*;

public class CpColumnarListboxLc extends CpListboxLc
{
    CpScroller columnHeaderHolder;
    CpColumnHeader columnHeader;

    public CpColumnarListboxLc()
    {
        this(false, true);
    }

    public CpColumnarListboxLc(boolean hScroll, boolean showColumnHeader)
    {
        super(hScroll);
        if (showColumnHeader) {
            columnHeader = new CpColumnHeader(listPane);
            columnHeader.quantize = false;
	        add(columnHeaderHolder = new CpScroller());
	        columnHeaderHolder.setScrollable(columnHeader);
            columnHeader.addObserver(listPane);
        }
    }

    public CpListPane createListPane()
    {
        return new CpColumnarListPane();
    }

    public void setCellSelect(boolean bool)
    {
        ((CpColumnarListPane)listPane).setCellSelect(bool);
    }

    public void setColumns(Vector newColumns)
    {
        ((CpColumnarListPane)listPane).setColumnModels(newColumns);
        if (columnHeader != null) {
            columnHeader.setColumns(newColumns);
        }

        // Kinda weird...   for column width change.  See update(...)
        for (int i = 0; i < newColumns.size(); i++) {
            ((CpColumnModel)newColumns.elementAt(i)).addObserver(this);
        }

    }
    public void update(CpObservable o, int facet, Object arg)
    {
        switch (facet) {
            case CpEvent.SCROLLER_PARAMETERS_CHANGED : {
                if (columnHeader != null) {
                    columnHeader.scrollTo(scroller.getScrollableLocationInCells().x, 0);
                }
            }
        }
        super.update(o, facet, arg);
    }

    public Insets scrollerInsets()
    {
        if (columnHeader == null) {
            return insets();
        } else {
            Insets insets = insets();
            return new Insets(insets.top + columnHeader.preferredSize().height, insets.left, insets.bottom, insets.right);
        }
    }

    public synchronized void layout()
    {
        super.layout();

        Insets insets = insets();

        if (columnHeader != null) {
            columnHeaderHolder.reshape(insets.left, insets.top, size().width - insets.left - insets.right, columnHeader.preferredSize().height);
            columnHeader.reshape(0, 0, 10000, columnHeaderHolder.size().height);
        }

    }
    void sortColumn(int columnId)
    {
        repaint();
    }
}

