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

import java.awt.BorderLayout;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ContainerEvent;
import java.awt.event.ContainerListener;
import java.util.Iterator;

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.DefaultTimelineObject;
import com.dlsc.flexgantt.model.gantt.GanttChartModelEvent;
import com.dlsc.flexgantt.model.gantt.IGanttChartModelListener;
import com.dlsc.flexgantt.model.gantt.ILayer;
import com.dlsc.flexgantt.swing.GanttChart;
import com.dlsc.flexgantt.swing.GanttChartFrame;
import com.dlsc.flexgantt.swing.layer.ILayerContainerListener;
import com.dlsc.flexgantt.swing.layer.LayerContainerEvent;
import com.dlsc.flexgantt.swing.layer.LayerPalette;
import com.dlsc.flexgantt.swing.layer.timeline.TimelineObjectLayer;

public class LayerDemo extends AbstractDemo implements
        IGanttChartModelListener, ILayerContainerListener {

    protected ILayer[] layers;
    private DemoControlsPanel controlsPanel;

    public LayerDemo() {
        super("Layers");
    }

    @Override
    public String[] getSourceCodeFileNames() {
        return new String[] { "LayerDemo", "LayerDemoGanttChartModel",
                "LayerDemoLayer", "LayerDemoObjectRenderer", };
    }

    @Override
    public void run(boolean embedded) {
        LayerDemoGanttChartModel model = new LayerDemoGanttChartModel();

        final GanttChart gc = createGanttChart(model);

        Iterator iter = model.getLayers();
        while (iter.hasNext()) {
            LayerDemoLayer layer = (LayerDemoLayer) iter.next();
            gc.getLayerContainer().setLayerIcon(layer, layer);
        }

        gc.getTreeTable().setRootVisible(false);
        gc.getLayerContainer().setTimelineObjectRenderer(
                DefaultTimelineObject.class, new LayerDemoObjectRenderer());
        for (TimelineObjectLayer layer : gc.getLayerContainer()
                .getTimelineObjectLayers()) {
            layer.setAlpha((float) Math.max(0.3, Math.random()));
        }

        GanttChartFrame frame = createFrame("Layers", gc, embedded);

        LayerPalette palette = new LayerPalette(gc.getLayerContainer());
        palette.addContainerListener(new ContainerListener() {

            @Override
            public void componentRemoved(ContainerEvent evt) {
            }

            @Override
            public void componentAdded(ContainerEvent evt) {
                controlsPanel.initAgain();
            }
        });

        JPanel paletteWrapper = new JPanel();
        paletteWrapper.setLayout(new BorderLayout());
        paletteWrapper.add(BorderLayout.CENTER, palette);
        paletteWrapper.setBorder(createTitledBorder("Top Gantt Layers"));

        JPanel controls = new JPanel();
        controls.setLayout(new MigLayout("insets 0 0 0 0, wrap 1", "[]", "[][]"));
        controls.add(paletteWrapper);

        final String propName = "com.dlsc.flexgantt.debug.layernames";
        SecurityManager sm = System.getSecurityManager();
        try {
            if (sm != null) {
                sm.checkPropertyAccess(propName);
            }
            final JCheckBox showLayerNames = new JCheckBox("Show Layer Names",
                    Boolean.getBoolean(propName));
            showLayerNames.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    System.setProperty(propName,
                            Boolean.toString(showLayerNames.isSelected()));
                    gc.repaint();
                    if (showLayerNames.isSelected()) {
                        gc.getLayerContainer().scrollRectToVisible(
                                new Rectangle(0, 0, 1, 1));
                    }
                }
            });
            controls.add(showLayerNames);
        } catch (SecurityException ex) {
        }

        controlsPanel = new DemoControlsPanel(this);
        controlsPanel.setLayout(new BorderLayout());
        controlsPanel.add(BorderLayout.NORTH, controls);

        frame.add(BorderLayout.EAST, controlsPanel);
        frame.center();
        frame.setVisible(true);

        model.addGanttChartModelListener(this);

        gc.getLayerContainer().addLayerContainerListener(this);
    }

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

    @Override
    public void ganttChartChanged(GanttChartModelEvent evt) {
        controlsPanel.initAgain();
    }

    @Override
    public void layerContainerChanged(LayerContainerEvent evt) {
        controlsPanel.initAgain();
    }
}
