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

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JCheckBox;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

import net.miginfocom.swing.MigLayout;

import com.dlsc.flexgantt.showcase.AbstractDemo;
import com.dlsc.flexgantt.showcase.DemoControlsPanel;
import com.dlsc.flexgantt.model.gantt.DefaultGanttChartModel;
import com.dlsc.flexgantt.model.treetable.TreeTableColumn;
import com.dlsc.flexgantt.policy.IPolicyProvider;
import com.dlsc.flexgantt.policy.treetable.INodeEditPolicy;
import com.dlsc.flexgantt.swing.GanttChart;
import com.dlsc.flexgantt.swing.GanttChartFrame;
import com.dlsc.flexgantt.swing.layer.system.RowLayer;
import com.dlsc.flexgantt.swing.treetable.TreeTable;

public class EditingDemo extends AbstractDemo {

    public EditingDemo() {
        super("Editing");
    }

    @Override
    public String[] getSourceCodeFileNames() {
        return new String[] { "EditingDemo", "EditingDemoCreateNodeCommand",
                "EditingDemoInsertNodeCommand", "EditingDemoGanttChartModel",
                "EditingDemoGanttChartNode", "EditingDemoNodeEditPolicy" };
    }

    @Override
    public void run(boolean embedded) {
        final GanttChart gc = createGanttChart(new EditingDemoGanttChartModel());
        gc.getKeyColumn().setWidth(200);

        final TreeTable table = gc.getTreeTable();
        table.setCreationEnabled(true);

        gc.getLayerContainer().getSystemLayer(RowLayer.class);

        IPolicyProvider pp = table.getPolicyProvider();
        pp.setPolicy(INodeEditPolicy.class, new EditingDemoNodeEditPolicy());

        TreeTableColumn col0 = new TreeTableColumn("Allows Children",
                Boolean.class, 0);
        TreeTableColumn col1 = new TreeTableColumn("Number 1", Double.class, 1);
        TreeTableColumn col2 = new TreeTableColumn("Number 2", Double.class, 2);
        gc.getColumnModel().addColumn(col0);
        gc.getColumnModel().addColumn(col1);
        gc.getColumnModel().addColumn(col2);
        gc.resetToPreferredSizes();
        gc.getTreeTable().setRootVisible(false);

        JPanel box = new JPanel();
        box.setLayout(new MigLayout("insets 0 0 0 0, wrap 1", "[grow]", "[]"));

        final JCheckBox compEnabled = new JCheckBox("Enable Gantt Chart",
                gc.isEnabled());
        compEnabled.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                gc.setEnabled(compEnabled.isSelected());
            }
        });
        box.add(compEnabled);

        final JCheckBox editEnabled = new JCheckBox("Enable Cell Editing",
                table.isEditingEnabled());
        editEnabled.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                table.setEditingEnabled(editEnabled.isSelected());
            }
        });
        box.add(editEnabled);

        final JCheckBox createEnabled = new JCheckBox("Enable Row Creation",
                table.isCreationEnabled());
        createEnabled.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                table.setCreationEnabled(createEnabled.isSelected());
            }
        });
        box.add(createEnabled);

        final JCheckBox deleteEnabled = new JCheckBox("Enable Row Deletion",
                table.isDeletionEnabled());
        deleteEnabled.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                table.setDeletionEnabled(deleteEnabled.isSelected());
            }
        });
        box.add(deleteEnabled);

        final JCheckBox indentEnabled = new JCheckBox("Enable Row Indentation",
                table.isIndentEnabled());
        indentEnabled.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                table.setIndentEnabled(indentEnabled.isSelected());
            }
        });
        box.add(indentEnabled);

        final JCheckBox resizingEnabled = new JCheckBox("Enable Row Resizing",
                table.isResizingEnabled());
        resizingEnabled.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                table.setResizingEnabled(resizingEnabled.isSelected());
            }
        });
        box.add(resizingEnabled);

        final JCheckBox draggingEnabled = new JCheckBox(
                "Enable Tree Table Drag & Drop", table.isDraggingEnabled());
        draggingEnabled.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                table.setDraggingEnabled(draggingEnabled.isSelected());
            }
        });
        box.add(draggingEnabled);

        final DefaultGanttChartModel model = (DefaultGanttChartModel) gc
                .getModel();
        final JCheckBox asksAllowsChildren = new JCheckBox(
                "Asks 'Allows Children'", model.asksAllowsChildren());
        asksAllowsChildren.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                model.setAsksAllowsChildren(asksAllowsChildren.isSelected());
                gc.repaint();
            }
        });
        box.add(asksAllowsChildren);
        box.setBorder(createTitledBorder("Settings"));

        JPanel panel = new DemoControlsPanel(this);
        panel.setLayout(new BorderLayout());
        panel.add(BorderLayout.NORTH, box);

        GanttChartFrame frame = createFrame("Editing", gc, embedded);
        frame.add(BorderLayout.EAST, panel);
        frame.setSize(1000, 800);
        frame.center();
        frame.setVisible(true);
    }

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