package cnp.ew.charts;

import java.awt.*;
import java.util.*;
import cnp.ew.diagram.*;

import cnp.ew.util.*;
import cnp.ew.grid.*;
import cnp.ew.properties.*;

public class CpChartGridAdapter implements CpObserver
{
    CpGridPane gridPane;
    CpChartDataModel model;

    public CpChartGridAdapter(CpGridPane newGridPane, CpChartDataModel newModel)
    {
        gridPane = newGridPane;
        model = newModel;
        model.addObserver(this);
        setDataSeriesInGrid();
        setDataSeriesLabelsInGrid();
        setCategoriesInGrid();
        gridPane.addObserver(this);
    }

    void dumpInfo(String state)
    {
        System.out.println(state);
        model.dumpDataModel();
    }

    void setDataSeriesInGrid()
    {
        Vector seriesList = model.getDataSeriesList();
        for (int c = 0; c < seriesList.size(); c++) {
            CpDataSeries series = (CpDataSeries)seriesList.elementAt(c);
            for (int r = 0; r < series.getValueCount(); r++) {
                // set cell expects a string, "" + int is an easy way to do int.toString()

                gridPane.setObjectAsString(new Point(c + 1, r + 1), "" + series.getValueForIndex(r));
            }
        }
    }

    void setDataSeriesInModel()
    {
        Point seriesAndCategory = new Point(0, 0);

        for (int i = 0; i < model.getDataSeriesCount(); i++) {
            seriesAndCategory.x = i;
            for (int d = 0; d < model.getCategoryCount(); d++) {
                String s = gridPane.getObjectAsString(new Point(i + 1, d + 1));
                double value = new Double(s).doubleValue();
                seriesAndCategory.y = d;
                model.setValue(seriesAndCategory, value);
            }
        }
    }

    void setDataSeriesLabelsInGrid()
    {
        Vector seriesList = model.getDataSeriesList();
        for (int i = 0; i < seriesList.size(); i++) {
            CpDataSeries series = (CpDataSeries)seriesList.elementAt(i);
            gridPane.setObjectAsString(new Point(i + 1, 0), series.getLabelObject());
        }
    }

    void setDataSeriesLabelsInModel()
    {

        Vector seriesList = model.getDataSeriesList();
        for (int i = 0; i < model.getDataSeriesCount(); i++) {
            CpDataSeries series = (CpDataSeries)seriesList.elementAt(i);
            series.setLabelObject(gridPane.getObjectAsString(new Point(i + 1, 0)));
        }
    }

    void setCategoriesInGrid()
    {
        Vector categories = model.getCategories();
        for (int i = 0; i < categories.size(); i++) {
            gridPane.setObjectAsString(new Point(0, i + 1), (String)categories.elementAt(i));
        }
    }

    void setCategoriesInModel()
    {
        Vector categories = new Vector();
        for (int i = 0; i < model.getCategoryCount(); i++) {
            categories.addElement(gridPane.getObjectAsString(new Point(0, i + 1)));
        }
        model.setCategories(categories);
    }


    public void update(CpObservable o, int facet, Object arg)
    {

        int index;
        if (o == model) {

            switch (facet) {
            case CpChartDataModel.CHANGED_DATA_SERIES:
                setDataSeriesInGrid();
                setDataSeriesLabelsInGrid();
                break;

            case CpChartDataModel.CHANGED_DATA_SERIES_VALUE:
                Point seriesAndCategory = (Point)arg;
                Double value = new Double(model.getValue(seriesAndCategory));
                seriesAndCategory.x++;
                seriesAndCategory.y++;
                gridPane.setObjectAndType(seriesAndCategory, value, CpBasicType.NUMBER);
                break;

            case CpChartDataModel.CHANGED_DATA_SERIES_LABEL:
                index = ((Integer)arg).intValue();
                gridPane.setObjectAndType(new Point(index + 1, 0), model.getDataSeriesLabel(index), CpBasicType.STRING);
                break;

            case CpChartDataModel.CHANGED_CATEGORIES:
                setCategoriesInGrid();
                break;

            case CpChartDataModel.CHANGED_CATEGORY:
                index = ((Integer)arg).intValue();
                gridPane.setObjectAsString(new Point(0, index + 1), (String)model.getCategories().elementAt(index));
                break;

            case CpChartDataModel.CHANGED_CHART_LABEL:
                break;

            case CpChartDataModel.CHANGED_SERIES_LABEL:
                break;

            case CpChartDataModel.CHANGED_CATEGORIES_LABEL:
                break;
            }
        } else if (o == gridPane) {
            if (facet == CpEvent.GRID_END_EDIT) {
                // x = columns
                Point point = (Point)arg;
                if (point.x == 0) {
                    String label = gridPane.getObjectAsString(point);
                    model.setCategory(point.y - 1, label);
                    return;
                }
                if (point.y == 0) {
                    String label = gridPane.getObjectAsString(point);
                    model.setDataSeriesLabel(point.x - 1, label);
                    return;
                }
                Double value = (Double)gridPane.getObject(point);
//                if (object instanceof Double) {
  //                  return (Double)object;
    //            } else {
      //              return new Double(0.0);
        //        }
           //     AsDouble(point);

                model.setValue(new Point(point.x - 1, point.y - 1), value.doubleValue());
            }
        } else {
            if (facet == CpEvent.CHART_DOUBLE_CLICK) {
                Point cellToSelect = (Point)arg;
                cellToSelect.x++;
                cellToSelect.y++;
                gridPane.selectCell(cellToSelect, true);
            }
        }
    }
}

