package com.dlsc.flexgantt.showcase.demo.spreadsheet;

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.Iterator;

import javax.swing.BorderFactory;
import javax.swing.DefaultListCellRenderer;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.SwingUtilities;

import com.dlsc.flexgantt.showcase.AbstractDemo;
import com.dlsc.flexgantt.showcase.DemoControlsPanel;
import com.dlsc.flexgantt.model.gantt.ISpreadsheet;
import com.dlsc.flexgantt.model.treetable.DefaultColumnModel;
import com.dlsc.flexgantt.model.treetable.KeyColumn;
import com.dlsc.flexgantt.model.treetable.TreeTableColumn;
import com.dlsc.flexgantt.swing.AbstractGanttChart;
import com.dlsc.flexgantt.swing.GanttChart;
import com.dlsc.flexgantt.swing.layer.system.SpreadsheetLayer;

public class SpreadsheetDemo extends AbstractDemo implements ActionListener,
        PropertyChangeListener {

    private SpreadsheetGanttChartModel model;
    private GanttChart gc;
    private JComboBox box;
    private String offLabel = "Off";

    public SpreadsheetDemo() {
        super("Spreadsheets");
    }

    @Override
    public String[] getSourceCodeFileNames() {
        return new String[] { "SpreadsheetDemo", "SpreadsheetGanttChartModel",
                "SpreadsheetValues", "SpreadsheetValuesCellRenderer",
                "SpreadsheetValuesEditor" };
    }

    @Override
    public void run(boolean embedded) {
        gc = createGanttChart();
        model = new SpreadsheetGanttChartModel();

        gc.setModel(model);
        gc.getTreeTable().setRootVisible(false);

        DefaultColumnModel columnModel = (DefaultColumnModel) gc
                .getColumnModel();
        TreeTableColumn<String> column = new TreeTableColumn<String>("Text",
                String.class);
        column.setWidth(50);
        columnModel.addColumn(column);

        gc.expandAll();
        gc.addPropertyChangeListener(this);

        SpreadsheetLayer layer = gc.getLayerContainer().getSystemLayer(
                SpreadsheetLayer.class);
        layer.setCellRenderer(SpreadsheetValues.class,
                new SpreadsheetValuesCellRenderer());
        layer.setCellEditor(SpreadsheetValues.class,
                new SpreadsheetValuesEditor(gc));

        KeyColumn key = gc.getColumnModel().getKeyColumn();
        key.setWidth(200);
        gc.resetToPreferredSizes();

        JFrame frame = createFrame("Spreadsheet", gc, embedded);

        DemoControlsPanel controls = new DemoControlsPanel(this);
        frame.add(BorderLayout.EAST, controls);

        box = new JComboBox();
        box.setRenderer(new DefaultListCellRenderer() {
            @Override
            public Component getListCellRendererComponent(JList list,
                    Object value, int index, boolean isSelected,
                    boolean cellHasFocus) {
                super.getListCellRendererComponent(list, value, index,
                        isSelected, cellHasFocus);

                if (value instanceof ISpreadsheet) {
                    ISpreadsheet spreadsheet = (ISpreadsheet) value;
                    setText(spreadsheet.getName());
                }

                return this;
            }
        });

        controls.setBorder(BorderFactory.createEmptyBorder(20, 0, 0, 0));
        controls.setLayout(new BorderLayout());
        controls.add(BorderLayout.NORTH, box);

        box.addItem(offLabel);
        box.addActionListener(this);

        Iterator<ISpreadsheet> spreadsheets = model.getSpreadsheets();
        while (spreadsheets.hasNext()) {
            box.addItem(spreadsheets.next());
        }

        gc.setActiveSpreadsheet(model.spreadsheet3);

        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new SpreadsheetDemo());
    }

    @Override
    public void actionPerformed(ActionEvent evt) {
        Object item = box.getSelectedItem();
        if (item instanceof ISpreadsheet) {
            gc.setActiveSpreadsheet((ISpreadsheet) item);
        } else {
            gc.setActiveSpreadsheet(null);
        }
    }

    @Override
    public void propertyChange(PropertyChangeEvent evt) {
        if (evt.getSource().equals(gc)) {
            if (evt.getPropertyName().equals(
                    AbstractGanttChart.PROPERTY_ACTIVE_SPREADSHEET)) {
                ISpreadsheet spreadsheet = gc.getActiveSpreadsheet();
                if (spreadsheet != null) {
                    box.setSelectedItem(spreadsheet);
                } else {
                    box.setSelectedItem(offLabel);
                }
            }
        }
    }
}
