package cnp.ew.charts;

import java.awt.*;
import cnp.ew.displayer.*;
import cnp.ew.diagram.*;
import cnp.ew.util.*;
import cnp.ew.converter.*;

abstract public class CpAbstractChartLc extends CpAbstractChartItemLc
implements CpObserver
{

    public static final int POPUP_VALUE=0;
    public static final int POPUP_PERCENTAGE=1;
    public static final int POPUP_VALUE_AND_PERCENTAGE=2;

    CpAbstractChartValuesDisplayer valuesDisplayer;
    CpChartDataModel chartDataModel;
    CpValueAxisModel valueAxisModel;
    CpNumberToStringConverter valueConverter;
    CpNumberToStringConverter percentageConverter;
    int popupStyle=POPUP_VALUE;

    public CpAbstractChartLc()
    {
        super();
        setKeepCachedImage(true);
        chartDataModel = new CpChartDataModel();
        valueAxisModel = new CpValueAxisModel();
    }

    public void setValuesDisplayer(CpAbstractChartValuesDisplayer newDisplayer)
    {
        valuesDisplayer = newDisplayer;
        valuesDisplayer.setChartDataModel(chartDataModel);
        valuesDisplayer.setValueAxisModel(valueAxisModel);
    }

    public void setChartDataModel(CpChartDataModel model)
    {
        chartDataModel = model;
        valuesDisplayer.setChartDataModel(model);
        model.addObserver(this);
    }

    public void remove()
    {
        super.remove();
        chartDataModel.removeObserver(this);
    }


    public void update(CpObservable o, int facet, Object arg)
    {
        flushCachedImage();
        damage();
    }

    public String getFlyingTipText()
    {
        return formattedValueAtPoint(mouseLocation());
    }

    String formattedValueAtPoint(Point mouseLocation)
    {
        Point seriesAndCategory = seriesAndCategoryForPoint(mouseLocation);
        if (seriesAndCategory == null) {
            return null;
        }
        switch (popupStyle) {
        case POPUP_VALUE:
            return getValueConverter().convert(new Double(chartDataModel.getValue(seriesAndCategory)));
        case POPUP_PERCENTAGE:
            return getPercentageConverter().convert(new Double(chartDataModel.getPercentageValue(seriesAndCategory)));
        case POPUP_VALUE_AND_PERCENTAGE:
            String text = getValueConverter().convert(new Double(chartDataModel.getValue(seriesAndCategory)));
            return text + " (" + getPercentageConverter().convert(new Double(chartDataModel.getPercentageValue(seriesAndCategory))) + ")";
        }
        return null;
    }

    public void setPopupStyle(int newStyle)
    {
        popupStyle = newStyle;
    }

    public void setValueConverter(CpNumberToStringConverter newValuesConverter)
    {
        valueConverter = newValuesConverter;
    }

    public CpNumberToStringConverter getValueConverter()
    {
        if (valueConverter == null) {
            valueConverter = new CpNumberToStringConverter("$#,###.00;($#,###.00)");
        }
        return valueConverter;
    }

    public void setPercentageConverter(CpNumberToStringConverter newPercentageConverter)
    {
        percentageConverter = newPercentageConverter;
    }

    public CpNumberToStringConverter getPercentageConverter()
    {
        if (percentageConverter == null) {
            percentageConverter = new CpNumberToStringConverter("#%");
        }
        return percentageConverter;
    }

    public boolean mouseDown(Event e, int x, int y)
    {
        if (e.clickCount == 2) {
            Point seriesAndCategory = seriesAndCategoryForPoint(new Point(x, y));
            if (seriesAndCategory != null) {
                notifyObservers(CHART_DOUBLE_CLICK, seriesAndCategory);
            }
        }
        return super.mouseDown(e, x, y);
    }


    abstract Point seriesAndCategoryForPoint(Point mouseLocation);
}
