package cnp.ew.list;

import cnp.ew.util.*;
import cnp.ew.displayer.*;
import cnp.ew.converter.*;
import cnp.ew.properties.*;

public class CpColumnModel extends CpDefaultObservable implements CpSizableHeader
{
    public static final int COLUMN_SIZED = 60;

    Object title;
    static CpModelDisplayable defaultTitleDisplayer = new CpGeneralStringDisplayer();
    CpModelDisplayable titleDisplayer;
    public CpModelSelectableDisplayable displayer;
    CpToStringConverter converter;
    public CpEditor editor;
    boolean isKeyboardMatchText = false;
    boolean hitCausesSelect = true;
    int width;  // Should allow for autowidth and "take up rest of space" width
    CpProperty property;
	boolean     sortAscending = false;
	public boolean isEditable;

    public CpColumnModel(String newTitle, int newWidth, CpProperty newProperty, boolean isKeyboardMatchText, boolean newIsEditable)
    {
        title = newTitle;
        width = newWidth;
        property = newProperty;
        displayer = property.getType().getDefaultDisplayer();
        converter = property.getType().getDefaultConverter();
        this.isKeyboardMatchText = isKeyboardMatchText;
        isEditable = newIsEditable;
        if (isEditable) {
            editor = property.getType().getDefaultEditor();
        }
    }

    public Object getModel()
    {
        return title;
    }

    public int getExtent()
    {
        return width;
    }

    public void setExtent(int newWidth)
    {
        width = newWidth;
        notifyObservers(COLUMN_SIZED);
    }

    public CpProperty getProperty()
    {
        return property;
    }

    public boolean getIsKeyboardMatchText()
    {
        return isKeyboardMatchText;
    }

    public void setIsKeyboardMatchText(boolean isKeyboardMatchText)
    {
        this.isKeyboardMatchText = isKeyboardMatchText;
    }

    public void setConverter(CpToStringConverter newConverter)
    {
        converter = newConverter;
    }

    public void setDisplayer(CpModelSelectableDisplayable newDisplayer)
    {
        displayer = newDisplayer;
    }

    public void setEditor(CpEditor newEditor)
    {
        editor = newEditor;
    }

    public void setHitCausesSelect(boolean newHitCausesSelect)
    {
        hitCausesSelect = newHitCausesSelect;
    }

    public void itemHit(CpColumnarListPane listPane, int index, int modifiers, int x)
    {
        if (hitCausesSelect) {
            listPane.select(index, this, modifiers);
        }
    }

    public int getAlignment()
    {
        // Yuck
        if (displayer instanceof CpAlignable) {
            return ((CpAlignable)displayer).getHorizontalAlignment();
        }
        return CpAlignable.ALIGN_LEFT;
    }

}

