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

import java.awt.BorderLayout;
import java.util.Calendar;

import javax.swing.DefaultListModel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.ListSelectionModel;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

import com.dlsc.flexgantt.showcase.AbstractDemo;
import com.dlsc.flexgantt.showcase.DemoControlsPanel;
import com.dlsc.flexgantt.model.calendar.TimeGranularityCalendarModel;
import com.dlsc.flexgantt.swing.GanttChart;
import com.dlsc.flexgantt.swing.GanttChartFrame;

public class CalendarDemo extends AbstractDemo {

    public CalendarDemo() {
        super("Calendar");
    }

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

    @Override
    public void run(boolean embedded) {
        final GanttChart gc = createGanttChart();
        gc.getTreeTable().setRootVisible(false);
        
        GanttChartFrame frame = createFrame("Calendar", gc, embedded);

        DefaultListModel model = new DefaultListModel();
        model.addElement(new WeekendDay("Monday", Calendar.MONDAY));
        model.addElement(new WeekendDay("Tuesday", Calendar.TUESDAY));
        model.addElement(new WeekendDay("Wednesday", Calendar.WEDNESDAY));
        model.addElement(new WeekendDay("Thursday", Calendar.THURSDAY));
        model.addElement(new WeekendDay("Friday", Calendar.FRIDAY));
        model.addElement(new WeekendDay("Saturday", Calendar.SATURDAY));
        model.addElement(new WeekendDay("Sunday", Calendar.SUNDAY));

        final JList list = new JList(model);
        list.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
        list.setVisibleRowCount(7);
        
        JPanel controls = new DemoControlsPanel(this);
        controls.setLayout(new BorderLayout());
        controls.add(BorderLayout.NORTH, list);
        frame.add(BorderLayout.EAST, controls);

        list.addListSelectionListener(new ListSelectionListener() {
            @Override
            public void valueChanged(ListSelectionEvent e) {
                if (!e.getValueIsAdjusting()) {
                    Object[] selection = list.getSelectedValues();
                    TimeGranularityCalendarModel calModel = (TimeGranularityCalendarModel) gc
                            .getCalendarModel();
                    if (selection != null && selection.length > 0) {
                        int s = selection.length;
                        int[] days = new int[s];
                        for (int i = 0; i < s; i++) {
                            days[i] = ((WeekendDay) selection[i]).value;
                        }
                        calModel.setWeekendDays(days);
                    } else {
                        calModel.setWeekendDays(null);
                    }
                }
            }
        });

        frame.center();
        frame.setVisible(true);
    }

    class WeekendDay {
        String name;

        int value;

        public WeekendDay(String name, int value) {
            this.name = name;
            this.value = value;
        }

        @Override
        public String toString() {
            return name;
        }
    }

    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (Exception e) {
            e.printStackTrace();
        }
        SwingUtilities.invokeLater(new CalendarDemo());
    }
}
