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

import java.awt.BorderLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Calendar;

import javax.swing.ButtonGroup;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;

import com.dlsc.flexgantt.showcase.AbstractDemo;
import com.dlsc.flexgantt.model.dateline.DatelineModelException;
import com.dlsc.flexgantt.model.dateline.IDatelineModel;
import com.dlsc.flexgantt.policy.IPolicyProvider;
import com.dlsc.flexgantt.policy.gantt.IStatusBarPolicy;
import com.dlsc.flexgantt.policy.gantt.SimpleGranularityStatusBarPolicy;
import com.dlsc.flexgantt.policy.gantt.TimeGranularityStatusBarPolicy;
import com.dlsc.flexgantt.policy.layer.DefaultGridLinePolicy;
import com.dlsc.flexgantt.policy.layer.IGridLinePolicy;
import com.dlsc.flexgantt.policy.layer.IGridPolicy;
import com.dlsc.flexgantt.policy.layer.SimpleGranularityGridPolicy;
import com.dlsc.flexgantt.policy.layer.TimeGranularityGridLinePolicy;
import com.dlsc.flexgantt.policy.layer.TimeGranularityGridPolicy;
import com.dlsc.flexgantt.swing.GanttChart;
import com.dlsc.flexgantt.swing.GanttChartFrame;
import com.dlsc.flexgantt.swing.layer.LayerContainer;
import com.dlsc.flexgantt.swing.timeline.Dateline;
import com.dlsc.flexgantt.swing.timeline.SimpleGranularityDatelineModel;
import com.dlsc.flexgantt.swing.timeline.SimpleGranularityTimelineControlPanel;
import com.dlsc.flexgantt.swing.timeline.TimeGranularityDatelineModel;
import com.dlsc.flexgantt.swing.timeline.TimeGranularityTimelineControlPanel;
import com.dlsc.flexgantt.swing.timeline.Timeline;

public class TimelineDemo extends AbstractDemo {
    private TimeGranularityDatelineModel tgModel;

    private SimpleGranularityDatelineModel sgModel;

    public TimelineDemo() {
        super("Timeline");
    }

    @Override
    public String[] getSourceCodeFileNames() {
        return new String[] { "TimelineDemo" };
    }

    @Override
    public void run(boolean embedded) {
        final GanttChart gc = new GanttChart();
        gc.getKeyColumn().setWidth(120);
        gc.getTreeTable().setRootVisible(false);
        gc.resetToPreferredSizes();

        JPanel controls = new JPanel();
        controls.setLayout(new GridBagLayout());

        final LayerContainer lc = gc.getLayerContainer();
        final Timeline timeline = gc.getTimeline();
        final Dateline dateline = timeline.getDateline();
        try {
            tgModel = new TimeGranularityDatelineModel(dateline);
            sgModel = new SimpleGranularityDatelineModel(dateline);
        } catch (DatelineModelException e) {
            e.printStackTrace();
        }

        IDatelineModel model = dateline.getModel();
        boolean tg = model instanceof TimeGranularityDatelineModel;
        JCheckBox box1 = new JCheckBox("Use Time Granularity Model", tg);
        final TimeGranularityTimelineControlPanel panel1 = new TimeGranularityTimelineControlPanel(
                timeline);
        box1.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                lc.getPolicyProvider().setPolicy(IGridLinePolicy.class,
                        new TimeGranularityGridLinePolicy());
                dateline.setModel(tgModel);
                IPolicyProvider pp = gc.getPolicyProvider();
                pp.setPolicy(IStatusBarPolicy.class,
                        new TimeGranularityStatusBarPolicy());
                pp = lc.getPolicyProvider();
                pp
                        .setPolicy(IGridPolicy.class,
                                new TimeGranularityGridPolicy());
                pp.setPolicy(IGridLinePolicy.class,
                        new TimeGranularityGridLinePolicy());
                panel1.applySettings();
            }
        });

        JCheckBox box2 = new JCheckBox("Use Simple Granularity Model", !tg);
        final SimpleGranularityTimelineControlPanel panel2 = new SimpleGranularityTimelineControlPanel(
                timeline);
        panel2.setEnabled(false);
        box2.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                lc.getPolicyProvider().setPolicy(IGridLinePolicy.class,
                        new DefaultGridLinePolicy());
                dateline.setModel(sgModel);

                IPolicyProvider pp = gc.getPolicyProvider();
                pp.setPolicy(IStatusBarPolicy.class,
                        new SimpleGranularityStatusBarPolicy());
                pp = lc.getPolicyProvider();
                pp.setPolicy(IGridPolicy.class,
                        new SimpleGranularityGridPolicy());
                pp
                        .setPolicy(IGridLinePolicy.class,
                                new DefaultGridLinePolicy());

                panel2.applySettings();
            }
        });

        GridBagConstraints gbc = new GridBagConstraints();
        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.fill = GridBagConstraints.HORIZONTAL;
        gbc.weightx = 1;
        gbc.weighty = 0;
        controls.add(box1, gbc);
        gbc = new GridBagConstraints();
        gbc.gridx = 0;
        gbc.gridy = 1;
        gbc.fill = GridBagConstraints.HORIZONTAL;
        gbc.weightx = 1;
        gbc.weighty = 0;
        controls.add(panel1, gbc);
        gbc = new GridBagConstraints();
        gbc.gridx = 0;
        gbc.gridy = 2;
        gbc.fill = GridBagConstraints.HORIZONTAL;
        gbc.weightx = 1;
        gbc.weighty = 0;
        controls.add(box2, gbc);
        gbc = new GridBagConstraints();
        gbc.gridx = 0;
        gbc.gridy = 3;
        gbc.fill = GridBagConstraints.HORIZONTAL;
        gbc.weightx = 1;
        gbc.weighty = 0;
        controls.add(panel2, gbc);

        JPanel dummy = new JPanel();
        gbc = new GridBagConstraints();
        gbc.gridx = 0;
        gbc.gridy = 4;
        gbc.fill = GridBagConstraints.VERTICAL;
        gbc.weighty = 1;
        controls.add(dummy, gbc);

        ButtonGroup group = new ButtonGroup();
        group.add(box1);
        group.add(box2);
        GanttChartFrame<GanttChart> frame = new GanttChartFrame<GanttChart>(
                "Dateline", gc);
        setFrame(frame);
        frame.add(BorderLayout.EAST, controls);
        if (embedded) {
            frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        } else {
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }
        frame.setSize(1000, 800);
        frame.center();
        frame.setVisible(true);

        Calendar showTime = Calendar.getInstance();
        showTime.add(Calendar.WEEK_OF_YEAR, 4);
        gc.showTime(showTime.getTimeInMillis(), false);
    }

    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (Exception e) {
            e.printStackTrace();
        }
        TimelineDemo test = new TimelineDemo();
        test.run(false);
    }
}
