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

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.util.List;

import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.border.LineBorder;

import net.miginfocom.swing.MigLayout;

import com.dlsc.flexgantt.showcase.AbstractDemo;
import com.dlsc.flexgantt.showcase.DemoControlsPanel;
import com.dlsc.flexgantt.model.gantt.DefaultActivityObject;
import com.dlsc.flexgantt.swing.GanttChart;
import com.dlsc.flexgantt.swing.GanttChartFrame;
import com.dlsc.flexgantt.swing.IMessage;
import com.dlsc.flexgantt.swing.MessageTable;
import com.dlsc.flexgantt.swing.MessageTableModel;
import com.dlsc.flexgantt.swing.layer.LayerContainer;
import com.dlsc.flexgantt.swing.layer.OverviewPalette;
import com.dlsc.flexgantt.swing.layer.timeline.DefaultTimelineObjectRenderer;

public class NavigationDemo extends AbstractDemo {

    public NavigationDemo() {
        super("Navigation");
    }

    @Override
    public String[] getSourceCodeFileNames() {
        return new String[] { "NavigationDemo",
                "NavigationDemoTimelineObjectRenderer",
                "NavigationGanttChartModel" };
    }

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

        GanttChart gc = createGanttChart(model);
        gc.expandAll();

        LayerContainer lc = gc.getLayerContainer();
        lc.setTimelineObjectRenderer(Object.class,
                new NavigationDemoTimelineObjectRenderer());

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

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

        MessageTable table = new MessageTable(gc, new MessageTableModel(gc));
        table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
        List<IMessage> messages = model.getMessages();
        for (IMessage msg : messages) {
            gc.addMessage(msg);
        }

        lc.setTimelineObjectRenderer(Object.class,
                new DefaultTimelineObjectRenderer());
        lc.setTimelineObjectRenderer(DefaultActivityObject.class,
                new NavigationDemoTimelineObjectRenderer());

        JScrollPane scroll = new JScrollPane(table);
        scroll.setBorder(new LineBorder(Color.BLACK));
        scroll.setPreferredSize(new Dimension(10, 200));

        JPanel scrollPanel = new JPanel();
        scrollPanel.setLayout(new BorderLayout());
        scrollPanel.add(BorderLayout.CENTER, scroll);
        scrollPanel.setBorder(createTitledBorder("Messages"));

        OverviewPalette overview = new OverviewPalette(lc);

        lc.setTimelineObjectStatusIcon(NavigationGanttChartModel.WARNING,
                NavigationDemoTimelineObjectRenderer.warningIcon);
        lc.setTimelineObjectStatusIcon(NavigationGanttChartModel.ERROR,
                NavigationDemoTimelineObjectRenderer.errorIcon);
        lc.setTimelineObjectStatusIcon(NavigationGanttChartModel.INFO,
                NavigationDemoTimelineObjectRenderer.infoIcon);

        lc.setTimelineObjectStatusIcon(NavigationGanttChartModel.WARNING,
                NavigationDemoTimelineObjectRenderer.warningIcon);
        lc.setTimelineObjectStatusIcon(NavigationGanttChartModel.ERROR,
                NavigationDemoTimelineObjectRenderer.errorIcon);
        lc.setTimelineObjectStatusIcon(NavigationGanttChartModel.INFO,
                NavigationDemoTimelineObjectRenderer.infoIcon);

        JPanel overviewPanel = new JPanel();
        overviewPanel.setLayout(new BorderLayout(10, 10));
        overviewPanel.add(BorderLayout.CENTER, overview);
        overviewPanel.setBorder(createTitledBorder("Overview / Radar"));

        JPanel content = new DemoControlsPanel(this);
        content.setLayout(new MigLayout("insets 0 0 0 0, wrap 1", "[grow]",
                "[]"));
        content.add(overviewPanel, "grow");
        content.add(scrollPanel, "grow");

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

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