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

import java.awt.BorderLayout;

import javax.swing.JCheckBox;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;

import net.miginfocom.swing.MigLayout;

import com.dlsc.flexgantt.command.IProgressMonitor;
import com.dlsc.flexgantt.showcase.AbstractDemo;
import com.dlsc.flexgantt.showcase.DemoControlsPanel;
import com.dlsc.flexgantt.model.paging.IPagingModel;
import com.dlsc.flexgantt.model.paging.IPagingModelListener;
import com.dlsc.flexgantt.model.paging.PagingEvent;
import com.dlsc.flexgantt.model.paging.PagingVetoException;
import com.dlsc.flexgantt.model.treetable.KeyColumn;
import com.dlsc.flexgantt.swing.GanttChart;
import com.dlsc.flexgantt.swing.GanttChartFrame;
import com.dlsc.flexgantt.swing.PagingControlPanel;
import com.dlsc.flexgantt.swing.util.AbstractSwingWorker;

public class PagingDemo extends AbstractDemo implements IPagingModelListener {

    private PagingDemoGanttChartModel model;
    private GanttChart gc;
    private JCheckBox confirmCheckBox;

    public PagingDemo() {
        super("Paging");
    }

    @Override
    public String[] getSourceCodeFileNames() {
        return new String[] { "PagingDemo", "PagingDemoGanttChartModel",
                "PagingDemoPagingModel" };
    }

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

        IPagingModel pagingModel = new PagingDemoPagingModel();
        gc.setPagingModel(pagingModel);
        pagingModel.addPagingModelListener(this);
        model = new PagingDemoGanttChartModel();
        model.loadPage(pagingModel.getPage(), null);
        gc.setModel(model);
        gc.expandAll();

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

        gc.resetToPreferredSizes();
        gc.getTreeTable().setRootVisible(false);

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

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

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

        PagingControlPanel pagingControlPanel = new PagingControlPanel(gc);
        pagingControlPanel.setBorder(createTitledBorder("Paging Controls"));
        controls.add(pagingControlPanel, "grow");

        confirmCheckBox = new JCheckBox("Confirm page changes", false);
        controls.add(confirmCheckBox, "grow");

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

    @Override
    public void pageChanged(final PagingEvent evt) {
        AbstractSwingWorker worker = new AbstractSwingWorker() {
            @Override
            public Object construct() {
                GanttChartFrame<?> frame = (GanttChartFrame<?>) getFrame();
                frame.showBusy();
                IProgressMonitor monitor = frame.getGanttChart()
                        .getProgressMonitorFactory().createProgressMonitor();
                model.loadPage(evt.getPage(), monitor);
                return null;
            }

            @Override
            public void finished() {
                GanttChartFrame<?> frame = (GanttChartFrame<?>) getFrame();
                frame.showReady();
            }
        };
        worker.start();
    }

    @Override
    public void pageWillChange(final PagingEvent evt)
            throws PagingVetoException {
        if (confirmCheckBox.isSelected()) {
            GanttChartFrame<?> frame = (GanttChartFrame<?>) getFrame();
            int result = JOptionPane.showConfirmDialog(frame,
                    "Are you sure you want to go to '"
                            + evt.getPage().getName() + "'?", "Page Change",
                    JOptionPane.YES_NO_OPTION);
            if (result == JOptionPane.NO_OPTION) {
                throw new PagingVetoException(evt, "User cancelled paging");
            }
        }
    }

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