/*
 * ScriptBuilderFrame.java
 *
 * Created on May 8, 2010, 12:01:46 PM
 */
package scriptbuilder.gui;

import java.awt.Adjustable;
import java.awt.Color;
import java.awt.event.AdjustmentEvent;
import java.awt.event.AdjustmentListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.File;
import java.io.IOException;
import java.util.Observable;
import java.util.Observer;
import java.util.Properties;
import java.util.Random;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.DefaultListModel;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import scriptbuilder.structures.ScriptEvent;
import scriptbuilder.structures.ScriptEvent.ScriptEventType;
import scriptbuilder.structures.ScriptIncident;
import scriptbuilder.structures.ScriptIncident.IncidentFocusedEvent;
import scriptbuilder.structures.ScriptIncident.SliceChangedEvent;
import scriptbuilder.structures.SimulationScript;
import scriptbuilder.structures.TimeSlice;
import scriptbuilder.structures.events.I_ScriptEvent;

/**
 * GUI for the script builder. Contains all panels and editor elements. Performs
 * updates to reflect script model, which it observes.
 *
 * @author Greg Eddington
 * @author Bryan McGuffin
 */
public class ScriptBuilderFrame extends javax.swing.JFrame implements Observer
{

    /**
     * The script model.
     */
    private SimulationScript script;
    /**
     * The current type of selected event.
     */
    public ScriptEventType currentEventType;
    /**
     * True if we are currently editing an incident.
     */
    private boolean editingIncident;
    /**
     * Index of the previous incident.
     */
    private int oldIncidentIndex;

    /**
     * Get the script currently in use.
     *
     * @return the script model object
     */
    public SimulationScript getScript()
    {
        return script;
    }

    /**
     * Listener for the scroll pane.
     */
    class MyAdjustmentListener implements AdjustmentListener
    {

        /**
         * If the incident timeline is scrolled horizontally, the timestamp
         * panel is updated to reflect it.
         *
         * @param evt the adjustment event
         */
        @Override
        public void adjustmentValueChanged(AdjustmentEvent evt)
        {
            if (evt.getAdjustable().getOrientation() == Adjustable.HORIZONTAL)
            {
                timeStampScrollPane.getHorizontalScrollBar()
                        .setValue(timelinesScrollPane.getHorizontalScrollBar().getValue());
            }
            else
            {
                // Event from vertical scrollbar
            }

            repaint();
        }
    }

    /**
     * Listener for key presses. Used for hotkeys for different event types.
     */
    private class TimelineKeyListener implements KeyListener
    {

        /**
         * If a hotkey is pressed, select that type of event.
         *
         * @param e the key event
         */
        @Override
        public void keyPressed(KeyEvent e)
        {
            repaint();
        }

        /**
         * Take no action upon key release.
         *
         * @param e the key event
         */
        @Override
        public void keyReleased(KeyEvent e)
        {
        }

        /**
         * Take no action upon key release.
         *
         * @param e the key event
         */
        @Override
        public void keyTyped(KeyEvent e)
        {
        }
    }

    /**
     * Constructor. Prep new script model, initialize the GUI, and add listeners
     * for all buttons.
     */
    public ScriptBuilderFrame()
    {
        script = new SimulationScript();
        script.addObserver(this);
        initComponents();
        this.update(null, script);

        // Hack to refresh the zoom
        /*
         zoomSlider.setValue(zoomSlider.getValue() - 1);
         zoomSlider.setValue(zoomSlider.getValue() + 1);
         */
        // Set listener for scroll pane
        AdjustmentListener listener = new MyAdjustmentListener();
        timelinesScrollPane.getHorizontalScrollBar().addAdjustmentListener(listener);
        timelinesScrollPane.getVerticalScrollBar().addAdjustmentListener(listener);
    }

    /**
     * Update the GUI to reflect the model. If the script changed, update all
     * the incident panels. If a timeslice changed, add any new events to the
     * model. If an incident gained focus, update the incident info screen to
     * display its details.
     *
     * @param o The observed object
     * @param arg Either the script model or an incident event, depending on who
     * called this update
     */
    @Override
    public void update(Observable o, Object arg)
    {
        if (arg instanceof SimulationScript)
        {
            script = (SimulationScript) arg;

            if (script.incidents.size() != 10)
            {
                return;
            }

            timelineTickPanel.update(script);
            timeStampPanel.update(script);

            incidentTimelinePanel1.timelinePanelUpdate(script.incidents.get(0));
            incidentTimelinePanel2.timelinePanelUpdate(script.incidents.get(1));
            incidentTimelinePanel3.timelinePanelUpdate(script.incidents.get(2));
            incidentTimelinePanel4.timelinePanelUpdate(script.incidents.get(3));
            incidentTimelinePanel5.timelinePanelUpdate(script.incidents.get(4));
            incidentTimelinePanel6.timelinePanelUpdate(script.incidents.get(5));
            incidentTimelinePanel7.timelinePanelUpdate(script.incidents.get(6));
            incidentTimelinePanel8.timelinePanelUpdate(script.incidents.get(7));
            incidentTimelinePanel9.timelinePanelUpdate(script.incidents.get(8));
            incidentTimelinePanel10.timelinePanelUpdate(script.incidents.get(9));

            incidentNumberPanel1.update(script.incidents.get(0));
            incidentNumberPanel2.update(script.incidents.get(1));
            incidentNumberPanel3.update(script.incidents.get(2));
            incidentNumberPanel4.update(script.incidents.get(3));
            incidentNumberPanel5.update(script.incidents.get(4));
            incidentNumberPanel6.update(script.incidents.get(5));
            incidentNumberPanel7.update(script.incidents.get(6));
            incidentNumberPanel8.update(script.incidents.get(7));
            incidentNumberPanel9.update(script.incidents.get(8));
            incidentNumberPanel10.update(script.incidents.get(9));

            /**
             * DefaultComboBoxModel model = new DefaultComboBoxModel(); for
             * (ScriptIncident i : script.incidents) { if (i != null)
             * model.addElement(i); } gotoIncident.setModel(model);*
             */
            this.setPreferredSize(this.getSize());
            pack();
        }
        else if (arg instanceof SliceChangedEvent)
        {
            TimeSlice slice = ((SliceChangedEvent) arg).slice;

            DefaultListModel model = new DefaultListModel();
            for (I_ScriptEvent e : slice.events)
            {
                model.addElement(e);
            }
        }
        else if (arg instanceof IncidentFocusedEvent)
        {
            ScriptIncident i = ((IncidentFocusedEvent) arg).incident;

            //gotoIncident.setSelectedItem(i);
        }

        zoomSlider.setMinimum(((timelineTickPanel.getVisibleRect().width - 20)
                * ScriptBuilderGuiConstants.HORIZONTAL_TICK_RESOLUTION)
                / Math.max(script.absoluteLength(), ScriptBuilderGuiConstants.TICK_TIMELINE_SMALLEST_LENGTH));
        zoomSlider.setMaximum(zoomSlider.getMinimum() + 20);
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents()
    {

        incidentPopupMenu = new javax.swing.JPopupMenu();
        popupDeleteIncident = new javax.swing.JMenuItem();
        eventPopupMenu = new javax.swing.JPopupMenu();
        cadEvent = new javax.swing.JMenuItem();
        jMenuItem2 = new javax.swing.JMenuItem();
        radioEvent = new javax.swing.JMenuItem();
        jMenuItem4 = new javax.swing.JMenuItem();
        jMenuItem5 = new javax.swing.JMenuItem();
        jMenuItem6 = new javax.swing.JMenuItem();
        cadEventFrame = new javax.swing.JFrame();
        jLabel5 = new javax.swing.JLabel();
        radioEventFrame = new javax.swing.JFrame();
        radioTypeLabel = new javax.swing.JLabel();
        jLabel7 = new javax.swing.JLabel();
        radioTypeComboBox = new javax.swing.JComboBox();
        radioMessageScrollPane = new javax.swing.JScrollPane();
        radioMessage = new javax.swing.JTextArea();
        okButton = new javax.swing.JButton();
        cancelButton = new javax.swing.JButton();
        eventListPopupMenu = new javax.swing.JPopupMenu();
        editEventList = new javax.swing.JMenuItem();
        deleteEventList = new javax.swing.JMenuItem();
        incidentFrame = new javax.swing.JFrame();
        jLabel6 = new javax.swing.JLabel();
        jLabel8 = new javax.swing.JLabel();
        jLabel9 = new javax.swing.JLabel();
        jLabel10 = new javax.swing.JLabel();
        jScrollPane1 = new javax.swing.JScrollPane();
        addIncidentDescription = new javax.swing.JTextArea();
        incidentOkButton = new javax.swing.JButton();
        incidentCancelButton = new javax.swing.JButton();
        addIncidentNumber = new javax.swing.JSpinner();
        addIncidentName = new javax.swing.JTextField();
        jLabel11 = new javax.swing.JLabel();
        addIncidentLength = new javax.swing.JSpinner();
        jLabel12 = new javax.swing.JLabel();
        addIncidentStart = new javax.swing.JSpinner();
        jButton3 = new javax.swing.JButton();
        incidentColorField = new javax.swing.JTextField();
        addNoiseFrame = new javax.swing.JFrame();
        jLabel13 = new javax.swing.JLabel();
        jSlider1 = new javax.swing.JSlider();
        jSlider2 = new javax.swing.JSlider();
        jLabel14 = new javax.swing.JLabel();
        jSlider3 = new javax.swing.JSlider();
        jLabel15 = new javax.swing.JLabel();
        jTextArea1 = new javax.swing.JTextArea();
        jSlider4 = new javax.swing.JSlider();
        jLabel16 = new javax.swing.JLabel();
        jSlider5 = new javax.swing.JSlider();
        jLabel17 = new javax.swing.JLabel();
        jButton1 = new javax.swing.JButton();
        jButton2 = new javax.swing.JButton();
        jLabel20 = new javax.swing.JLabel();
        jLabel21 = new javax.swing.JLabel();
        incidentColorChooser = new javax.swing.JColorChooser();
        timelinesScrollPane = new javax.swing.JScrollPane();
        timelineTickPanel = new scriptbuilder.gui.panels.TimelineTickPanel();
        incidentTimelinePanel1 = new scriptbuilder.gui.panels.IncidentTimelinePanel();
        incidentTimelinePanel2 = new scriptbuilder.gui.panels.IncidentTimelinePanel();
        incidentTimelinePanel8 = new scriptbuilder.gui.panels.IncidentTimelinePanel();
        incidentTimelinePanel3 = new scriptbuilder.gui.panels.IncidentTimelinePanel();
        incidentTimelinePanel6 = new scriptbuilder.gui.panels.IncidentTimelinePanel();
        incidentTimelinePanel5 = new scriptbuilder.gui.panels.IncidentTimelinePanel();
        incidentTimelinePanel4 = new scriptbuilder.gui.panels.IncidentTimelinePanel();
        incidentTimelinePanel7 = new scriptbuilder.gui.panels.IncidentTimelinePanel();
        incidentTimelinePanel10 = new scriptbuilder.gui.panels.IncidentTimelinePanel();
        incidentTimelinePanel9 = new scriptbuilder.gui.panels.IncidentTimelinePanel();
        incidentNumberPanel1 = new scriptbuilder.gui.panels.IncidentNumberPanel();
        incidentNumberPanel2 = new scriptbuilder.gui.panels.IncidentNumberPanel();
        incidentNumberPanel3 = new scriptbuilder.gui.panels.IncidentNumberPanel();
        incidentNumberPanel4 = new scriptbuilder.gui.panels.IncidentNumberPanel();
        incidentNumberPanel5 = new scriptbuilder.gui.panels.IncidentNumberPanel();
        incidentNumberPanel6 = new scriptbuilder.gui.panels.IncidentNumberPanel();
        incidentNumberPanel7 = new scriptbuilder.gui.panels.IncidentNumberPanel();
        incidentNumberPanel8 = new scriptbuilder.gui.panels.IncidentNumberPanel();
        incidentNumberPanel9 = new scriptbuilder.gui.panels.IncidentNumberPanel();
        incidentNumberPanel10 = new scriptbuilder.gui.panels.IncidentNumberPanel();
        zoomSlider = new javax.swing.JSlider();
        zoomInIcon = new javax.swing.JLabel();
        zoomOutIcon = new javax.swing.JLabel();
        timeStampScrollPane = new javax.swing.JScrollPane();
        timeStampPanel = new scriptbuilder.gui.panels.TimeStampPanel();
        scriptBuilderMenuBar = new javax.swing.JMenuBar();
        fileMenu = new javax.swing.JMenu();
        fileNew = new javax.swing.JMenuItem();
        jSeparator1 = new javax.swing.JPopupMenu.Separator();
        fileOpen = new javax.swing.JMenuItem();
        jSeparator2 = new javax.swing.JPopupMenu.Separator();
        fileSave = new javax.swing.JMenuItem();
        fileSaveAs = new javax.swing.JMenuItem();
        generateMenu = new javax.swing.JMenu();
        generateNotebooks = new javax.swing.JMenuItem();
        jMenuItem3 = new javax.swing.JMenuItem();
        generateScorecards = new javax.swing.JMenuItem();
        generateOrganizationChart = new javax.swing.JMenuItem();
        jSeparator3 = new javax.swing.JPopupMenu.Separator();
        generateProjectRequirements = new javax.swing.JMenuItem();
        incidentMenu = new javax.swing.JMenu();
        newIncident = new javax.swing.JMenuItem();
        editIncident = new javax.swing.JMenuItem();
        incidentDetails = new javax.swing.JMenuItem();
        jSeparator4 = new javax.swing.JPopupMenu.Separator();
        saveIncident = new javax.swing.JMenuItem();
        loadIncident = new javax.swing.JMenuItem();
        generateNoiseMenu = new javax.swing.JMenu();
        generateNoiseOption = new javax.swing.JMenuItem();
        helpMenu = new javax.swing.JMenu();
        helpTutorial = new javax.swing.JMenuItem();
        helpAbout = new javax.swing.JMenuItem();

        popupDeleteIncident.setText("Delete Incident...");
        incidentPopupMenu.add(popupDeleteIncident);

        cadEvent.setText("CAD Event");
        cadEvent.addMouseListener(new java.awt.event.MouseAdapter()
        {
            public void mousePressed(java.awt.event.MouseEvent evt)
            {
                cadEventMousePressed(evt);
            }
            public void mouseReleased(java.awt.event.MouseEvent evt)
            {
                cadEventMouseReleased(evt);
            }
        });
        eventPopupMenu.add(cadEvent);

        jMenuItem2.setText("Paramics Event");
        eventPopupMenu.add(jMenuItem2);

        radioEvent.setText("Radio Event");
        radioEvent.addMouseListener(new java.awt.event.MouseAdapter()
        {
            public void mousePressed(java.awt.event.MouseEvent evt)
            {
                radioEventMousePressed(evt);
            }
        });
        eventPopupMenu.add(radioEvent);

        jMenuItem4.setText("Telephone Event");
        eventPopupMenu.add(jMenuItem4);

        jMenuItem5.setText("Video Event");
        eventPopupMenu.add(jMenuItem5);

        jMenuItem6.setText("Evaluation Event");
        eventPopupMenu.add(jMenuItem6);

        cadEventFrame.setMinimumSize(new java.awt.Dimension(400, 300));

        jLabel5.setText("CAD Entry");

        javax.swing.GroupLayout cadEventFrameLayout = new javax.swing.GroupLayout(cadEventFrame.getContentPane());
        cadEventFrame.getContentPane().setLayout(cadEventFrameLayout);
        cadEventFrameLayout.setHorizontalGroup(
            cadEventFrameLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(cadEventFrameLayout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jLabel5, javax.swing.GroupLayout.PREFERRED_SIZE, 68, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        cadEventFrameLayout.setVerticalGroup(
            cadEventFrameLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(cadEventFrameLayout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jLabel5)
                .addContainerGap(1357, Short.MAX_VALUE))
        );

        radioEventFrame.setTitle("Add Radio Event");
        radioEventFrame.setMinimumSize(new java.awt.Dimension(400, 300));

        radioTypeLabel.setText("Radio Type:");

        jLabel7.setText("Radio Message:");

        radioTypeComboBox.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "TMT", "Maintanence" }));

        radioMessageScrollPane.setVerticalScrollBarPolicy(javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);

        radioMessage.setColumns(20);
        radioMessage.setLineWrap(true);
        radioMessage.setRows(5);
        radioMessage.setWrapStyleWord(true);
        radioMessageScrollPane.setViewportView(radioMessage);

        okButton.setText("OK");
        okButton.addActionListener(new java.awt.event.ActionListener()
        {
            public void actionPerformed(java.awt.event.ActionEvent evt)
            {
                okButtonActionPerformed(evt);
            }
        });

        cancelButton.setText("Cancel");
        cancelButton.addActionListener(new java.awt.event.ActionListener()
        {
            public void actionPerformed(java.awt.event.ActionEvent evt)
            {
                cancelButtonActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout radioEventFrameLayout = new javax.swing.GroupLayout(radioEventFrame.getContentPane());
        radioEventFrame.getContentPane().setLayout(radioEventFrameLayout);
        radioEventFrameLayout.setHorizontalGroup(
            radioEventFrameLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, radioEventFrameLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(radioEventFrameLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(radioMessageScrollPane, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 380, Short.MAX_VALUE)
                    .addGroup(javax.swing.GroupLayout.Alignment.LEADING, radioEventFrameLayout.createSequentialGroup()
                        .addComponent(radioTypeLabel)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(radioTypeComboBox, 0, 312, Short.MAX_VALUE))
                    .addComponent(jLabel7, javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(javax.swing.GroupLayout.Alignment.LEADING, radioEventFrameLayout.createSequentialGroup()
                        .addComponent(cancelButton)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 246, Short.MAX_VALUE)
                        .addComponent(okButton, javax.swing.GroupLayout.PREFERRED_SIZE, 69, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap())
        );
        radioEventFrameLayout.setVerticalGroup(
            radioEventFrameLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(radioEventFrameLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(radioEventFrameLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(radioTypeLabel)
                    .addComponent(radioTypeComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(jLabel7)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(radioMessageScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 198, Short.MAX_VALUE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(radioEventFrameLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(okButton)
                    .addComponent(cancelButton))
                .addContainerGap())
        );

        editEventList.setText("Edit...");
        editEventList.addActionListener(new java.awt.event.ActionListener()
        {
            public void actionPerformed(java.awt.event.ActionEvent evt)
            {
                editEventListActionPerformed(evt);
            }
        });
        eventListPopupMenu.add(editEventList);

        deleteEventList.setText("Delete...");
        eventListPopupMenu.add(deleteEventList);

        incidentFrame.setTitle("Incident");
        incidentFrame.setMinimumSize(new java.awt.Dimension(400, 400));

        jLabel6.setText("Incident Number: ");

        jLabel8.setText("Incident Name:");

        jLabel9.setText("Incident Color: ");

        jLabel10.setText("Incident Description:");

        jScrollPane1.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
        jScrollPane1.setVerticalScrollBarPolicy(javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);

        addIncidentDescription.setColumns(20);
        addIncidentDescription.setLineWrap(true);
        addIncidentDescription.setRows(5);
        addIncidentDescription.setWrapStyleWord(true);
        jScrollPane1.setViewportView(addIncidentDescription);

        incidentOkButton.setText("OK");
        incidentOkButton.addActionListener(new java.awt.event.ActionListener()
        {
            public void actionPerformed(java.awt.event.ActionEvent evt)
            {
                incidentOkButtonActionPerformed(evt);
            }
        });

        incidentCancelButton.setText("Cancel");
        incidentCancelButton.addActionListener(new java.awt.event.ActionListener()
        {
            public void actionPerformed(java.awt.event.ActionEvent evt)
            {
                incidentCancelButtonActionPerformed(evt);
            }
        });

        addIncidentNumber.setModel(new javax.swing.SpinnerNumberModel(Integer.valueOf(101), Integer.valueOf(101), null, Integer.valueOf(1)));

        jLabel11.setText("Incident Length in Minutes: ");

        addIncidentLength.setModel(new javax.swing.SpinnerNumberModel(Integer.valueOf(0), Integer.valueOf(0), null, Integer.valueOf(1)));

        jLabel12.setText("Incident Start Time in Minutes:");

        addIncidentStart.setModel(new javax.swing.SpinnerNumberModel(Integer.valueOf(0), Integer.valueOf(0), null, Integer.valueOf(1)));

        jButton3.setText("Choose...");
        jButton3.addActionListener(new java.awt.event.ActionListener()
        {
            public void actionPerformed(java.awt.event.ActionEvent evt)
            {
                jButton3ActionPerformed(evt);
            }
        });

        incidentColorField.setEditable(false);
        incidentColorField.setBackground(new java.awt.Color(0, 0, 0));

        javax.swing.GroupLayout incidentFrameLayout = new javax.swing.GroupLayout(incidentFrame.getContentPane());
        incidentFrame.getContentPane().setLayout(incidentFrameLayout);
        incidentFrameLayout.setHorizontalGroup(
            incidentFrameLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, incidentFrameLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(incidentFrameLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(jScrollPane1, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 322, Short.MAX_VALUE)
                    .addComponent(jLabel10, javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(javax.swing.GroupLayout.Alignment.LEADING, incidentFrameLayout.createSequentialGroup()
                        .addGroup(incidentFrameLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jLabel6)
                            .addComponent(jLabel8)
                            .addComponent(jLabel9))
                        .addGap(18, 18, 18)
                        .addGroup(incidentFrameLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(addIncidentName, javax.swing.GroupLayout.DEFAULT_SIZE, 218, Short.MAX_VALUE)
                            .addComponent(addIncidentNumber, javax.swing.GroupLayout.DEFAULT_SIZE, 218, Short.MAX_VALUE)
                            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, incidentFrameLayout.createSequentialGroup()
                                .addComponent(incidentColorField, javax.swing.GroupLayout.DEFAULT_SIZE, 119, Short.MAX_VALUE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(jButton3, javax.swing.GroupLayout.PREFERRED_SIZE, 93, javax.swing.GroupLayout.PREFERRED_SIZE))))
                    .addGroup(javax.swing.GroupLayout.Alignment.LEADING, incidentFrameLayout.createSequentialGroup()
                        .addComponent(incidentCancelButton)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 188, Short.MAX_VALUE)
                        .addComponent(incidentOkButton, javax.swing.GroupLayout.PREFERRED_SIZE, 69, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(javax.swing.GroupLayout.Alignment.LEADING, incidentFrameLayout.createSequentialGroup()
                        .addGroup(incidentFrameLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jLabel12)
                            .addComponent(jLabel11))
                        .addGap(18, 18, 18)
                        .addGroup(incidentFrameLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(addIncidentStart, javax.swing.GroupLayout.DEFAULT_SIZE, 158, Short.MAX_VALUE)
                            .addComponent(addIncidentLength, javax.swing.GroupLayout.DEFAULT_SIZE, 158, Short.MAX_VALUE))))
                .addContainerGap())
        );
        incidentFrameLayout.setVerticalGroup(
            incidentFrameLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(incidentFrameLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(incidentFrameLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel6)
                    .addComponent(addIncidentNumber, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(incidentFrameLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel8)
                    .addComponent(addIncidentName, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(incidentFrameLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel9)
                    .addComponent(jButton3)
                    .addComponent(incidentColorField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jLabel10)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 106, Short.MAX_VALUE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(incidentFrameLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(addIncidentStart, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel12))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(incidentFrameLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(addIncidentLength, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel11))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(incidentFrameLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(incidentCancelButton)
                    .addComponent(incidentOkButton))
                .addContainerGap())
        );

        addNoiseFrame.setTitle("Generate Noise");
        addNoiseFrame.setMinimumSize(new java.awt.Dimension(395, 315));
        addNoiseFrame.setResizable(false);

        jLabel13.setFont(new java.awt.Font("Tahoma", 0, 12)); // NOI18N
        jLabel13.setText("Radio Chatter: ");

        jLabel14.setFont(new java.awt.Font("Tahoma", 0, 12)); // NOI18N
        jLabel14.setText("Lane Closures:");

        jLabel15.setFont(new java.awt.Font("Tahoma", 0, 12)); // NOI18N
        jLabel15.setText("TMCAL Logs:");

        jTextArea1.setEditable(false);
        jTextArea1.setColumns(20);
        jTextArea1.setFont(new java.awt.Font("Tahoma", 0, 12)); // NOI18N
        jTextArea1.setLineWrap(true);
        jTextArea1.setRows(5);
        jTextArea1.setText("Noise events will be randomly generated for the simulation with frequencies based on the control selections made below");
        jTextArea1.setWrapStyleWord(true);
        jTextArea1.setAutoscrolls(false);
        jTextArea1.setBorder(null);
        jTextArea1.setDisabledTextColor(new java.awt.Color(0, 0, 0));
        jTextArea1.setFocusable(false);
        jTextArea1.setOpaque(false);

        jLabel16.setFont(new java.awt.Font("Tahoma", 0, 12)); // NOI18N
        jLabel16.setText("Background Noise: ");

        jLabel17.setFont(new java.awt.Font("Tahoma", 0, 12)); // NOI18N
        jLabel17.setText("Minor Events:");

        jButton1.setText("Cancel");
        jButton1.addActionListener(new java.awt.event.ActionListener()
        {
            public void actionPerformed(java.awt.event.ActionEvent evt)
            {
                jButton1ActionPerformed(evt);
            }
        });

        jButton2.setText("Generate");
        jButton2.addActionListener(new java.awt.event.ActionListener()
        {
            public void actionPerformed(java.awt.event.ActionEvent evt)
            {
                jButton2ActionPerformed(evt);
            }
        });

        jLabel20.setText("Least Frequent");

        jLabel21.setText("Most Frequent");

        javax.swing.GroupLayout addNoiseFrameLayout = new javax.swing.GroupLayout(addNoiseFrame.getContentPane());
        addNoiseFrame.getContentPane().setLayout(addNoiseFrameLayout);
        addNoiseFrameLayout.setHorizontalGroup(
            addNoiseFrameLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, addNoiseFrameLayout.createSequentialGroup()
                .addContainerGap(21, Short.MAX_VALUE)
                .addGroup(addNoiseFrameLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(jTextArea1, javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(addNoiseFrameLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                        .addGroup(javax.swing.GroupLayout.Alignment.LEADING, addNoiseFrameLayout.createSequentialGroup()
                            .addComponent(jButton1)
                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(jButton2))
                        .addGroup(javax.swing.GroupLayout.Alignment.LEADING, addNoiseFrameLayout.createSequentialGroup()
                            .addGroup(addNoiseFrameLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                .addGroup(addNoiseFrameLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                                    .addComponent(jLabel16)
                                    .addComponent(jLabel14, javax.swing.GroupLayout.PREFERRED_SIZE, 105, javax.swing.GroupLayout.PREFERRED_SIZE)
                                    .addComponent(jLabel15, javax.swing.GroupLayout.PREFERRED_SIZE, 105, javax.swing.GroupLayout.PREFERRED_SIZE)
                                    .addComponent(jLabel13, javax.swing.GroupLayout.PREFERRED_SIZE, 105, javax.swing.GroupLayout.PREFERRED_SIZE))
                                .addComponent(jLabel17, javax.swing.GroupLayout.PREFERRED_SIZE, 81, javax.swing.GroupLayout.PREFERRED_SIZE))
                            .addGap(4, 4, 4)
                            .addGroup(addNoiseFrameLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                                .addComponent(jSlider1, javax.swing.GroupLayout.PREFERRED_SIZE, 245, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addComponent(jSlider2, javax.swing.GroupLayout.PREFERRED_SIZE, 245, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addComponent(jSlider3, javax.swing.GroupLayout.PREFERRED_SIZE, 245, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addComponent(jSlider5, javax.swing.GroupLayout.PREFERRED_SIZE, 245, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addComponent(jSlider4, javax.swing.GroupLayout.PREFERRED_SIZE, 245, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, addNoiseFrameLayout.createSequentialGroup()
                                    .addComponent(jLabel20)
                                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                    .addComponent(jLabel21))))))
                .addGap(20, 20, 20))
        );
        addNoiseFrameLayout.setVerticalGroup(
            addNoiseFrameLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, addNoiseFrameLayout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jTextArea1, javax.swing.GroupLayout.DEFAULT_SIZE, 39, Short.MAX_VALUE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(addNoiseFrameLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(jLabel21)
                    .addComponent(jLabel20))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(addNoiseFrameLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(jLabel13, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jSlider1, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(addNoiseFrameLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(jLabel14, javax.swing.GroupLayout.PREFERRED_SIZE, 28, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jSlider2, javax.swing.GroupLayout.PREFERRED_SIZE, 28, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(addNoiseFrameLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                    .addComponent(jLabel15)
                    .addComponent(jSlider3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(addNoiseFrameLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(jSlider4, javax.swing.GroupLayout.PREFERRED_SIZE, 29, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel16, javax.swing.GroupLayout.PREFERRED_SIZE, 29, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(addNoiseFrameLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jSlider5, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel17))
                .addGap(18, 18, 18)
                .addGroup(addNoiseFrameLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jButton1)
                    .addComponent(jButton2))
                .addContainerGap())
        );

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("Script Builder");
        setBounds(new java.awt.Rectangle(0, 23, 800, 700));
        setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
        setMinimumSize(new java.awt.Dimension(800, 700));

        timelinesScrollPane.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
        timelinesScrollPane.setVerticalScrollBarPolicy(javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
        timelinesScrollPane.setFocusCycleRoot(true);
        timelinesScrollPane.setFocusTraversalPolicyProvider(true);
        timelinesScrollPane.setPreferredSize(new java.awt.Dimension(72000, 1341));
        timelinesScrollPane.setWheelScrollingEnabled(false);

        timelineTickPanel.setMaximumSize(new java.awt.Dimension(7200, 32767));
        timelineTickPanel.setMinimumSize(new java.awt.Dimension(7200, 0));
        timelineTickPanel.setPreferredSize(new java.awt.Dimension(7200, 1317));

        incidentTimelinePanel1.setMaximumSize(new java.awt.Dimension(32767, 100));
        incidentTimelinePanel1.setOpaque(false);
        incidentTimelinePanel1.setPreferredSize(new java.awt.Dimension(691, 100));

        javax.swing.GroupLayout incidentTimelinePanel1Layout = new javax.swing.GroupLayout(incidentTimelinePanel1);
        incidentTimelinePanel1.setLayout(incidentTimelinePanel1Layout);
        incidentTimelinePanel1Layout.setHorizontalGroup(
            incidentTimelinePanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 691, Short.MAX_VALUE)
        );
        incidentTimelinePanel1Layout.setVerticalGroup(
            incidentTimelinePanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 100, Short.MAX_VALUE)
        );

        incidentTimelinePanel2.setOpaque(false);

        javax.swing.GroupLayout incidentTimelinePanel2Layout = new javax.swing.GroupLayout(incidentTimelinePanel2);
        incidentTimelinePanel2.setLayout(incidentTimelinePanel2Layout);
        incidentTimelinePanel2Layout.setHorizontalGroup(
            incidentTimelinePanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 0, Short.MAX_VALUE)
        );
        incidentTimelinePanel2Layout.setVerticalGroup(
            incidentTimelinePanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 0, Short.MAX_VALUE)
        );

        incidentTimelinePanel8.setOpaque(false);

        javax.swing.GroupLayout incidentTimelinePanel8Layout = new javax.swing.GroupLayout(incidentTimelinePanel8);
        incidentTimelinePanel8.setLayout(incidentTimelinePanel8Layout);
        incidentTimelinePanel8Layout.setHorizontalGroup(
            incidentTimelinePanel8Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 0, Short.MAX_VALUE)
        );
        incidentTimelinePanel8Layout.setVerticalGroup(
            incidentTimelinePanel8Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 0, Short.MAX_VALUE)
        );

        incidentTimelinePanel3.setOpaque(false);

        javax.swing.GroupLayout incidentTimelinePanel3Layout = new javax.swing.GroupLayout(incidentTimelinePanel3);
        incidentTimelinePanel3.setLayout(incidentTimelinePanel3Layout);
        incidentTimelinePanel3Layout.setHorizontalGroup(
            incidentTimelinePanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 0, Short.MAX_VALUE)
        );
        incidentTimelinePanel3Layout.setVerticalGroup(
            incidentTimelinePanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 0, Short.MAX_VALUE)
        );

        incidentTimelinePanel6.setOpaque(false);

        javax.swing.GroupLayout incidentTimelinePanel6Layout = new javax.swing.GroupLayout(incidentTimelinePanel6);
        incidentTimelinePanel6.setLayout(incidentTimelinePanel6Layout);
        incidentTimelinePanel6Layout.setHorizontalGroup(
            incidentTimelinePanel6Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 0, Short.MAX_VALUE)
        );
        incidentTimelinePanel6Layout.setVerticalGroup(
            incidentTimelinePanel6Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 0, Short.MAX_VALUE)
        );

        incidentTimelinePanel5.setOpaque(false);

        javax.swing.GroupLayout incidentTimelinePanel5Layout = new javax.swing.GroupLayout(incidentTimelinePanel5);
        incidentTimelinePanel5.setLayout(incidentTimelinePanel5Layout);
        incidentTimelinePanel5Layout.setHorizontalGroup(
            incidentTimelinePanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 0, Short.MAX_VALUE)
        );
        incidentTimelinePanel5Layout.setVerticalGroup(
            incidentTimelinePanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 0, Short.MAX_VALUE)
        );

        incidentTimelinePanel4.setOpaque(false);

        javax.swing.GroupLayout incidentTimelinePanel4Layout = new javax.swing.GroupLayout(incidentTimelinePanel4);
        incidentTimelinePanel4.setLayout(incidentTimelinePanel4Layout);
        incidentTimelinePanel4Layout.setHorizontalGroup(
            incidentTimelinePanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 0, Short.MAX_VALUE)
        );
        incidentTimelinePanel4Layout.setVerticalGroup(
            incidentTimelinePanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 0, Short.MAX_VALUE)
        );

        incidentTimelinePanel7.setOpaque(false);

        javax.swing.GroupLayout incidentTimelinePanel7Layout = new javax.swing.GroupLayout(incidentTimelinePanel7);
        incidentTimelinePanel7.setLayout(incidentTimelinePanel7Layout);
        incidentTimelinePanel7Layout.setHorizontalGroup(
            incidentTimelinePanel7Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 0, Short.MAX_VALUE)
        );
        incidentTimelinePanel7Layout.setVerticalGroup(
            incidentTimelinePanel7Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 0, Short.MAX_VALUE)
        );

        incidentTimelinePanel10.setOpaque(false);

        javax.swing.GroupLayout incidentTimelinePanel10Layout = new javax.swing.GroupLayout(incidentTimelinePanel10);
        incidentTimelinePanel10.setLayout(incidentTimelinePanel10Layout);
        incidentTimelinePanel10Layout.setHorizontalGroup(
            incidentTimelinePanel10Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 0, Short.MAX_VALUE)
        );
        incidentTimelinePanel10Layout.setVerticalGroup(
            incidentTimelinePanel10Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 0, Short.MAX_VALUE)
        );

        incidentTimelinePanel9.setOpaque(false);

        javax.swing.GroupLayout incidentTimelinePanel9Layout = new javax.swing.GroupLayout(incidentTimelinePanel9);
        incidentTimelinePanel9.setLayout(incidentTimelinePanel9Layout);
        incidentTimelinePanel9Layout.setHorizontalGroup(
            incidentTimelinePanel9Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 0, Short.MAX_VALUE)
        );
        incidentTimelinePanel9Layout.setVerticalGroup(
            incidentTimelinePanel9Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 0, Short.MAX_VALUE)
        );

        incidentNumberPanel1.setOpaque(false);

        javax.swing.GroupLayout incidentNumberPanel1Layout = new javax.swing.GroupLayout(incidentNumberPanel1);
        incidentNumberPanel1.setLayout(incidentNumberPanel1Layout);
        incidentNumberPanel1Layout.setHorizontalGroup(
            incidentNumberPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 0, Short.MAX_VALUE)
        );
        incidentNumberPanel1Layout.setVerticalGroup(
            incidentNumberPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 0, Short.MAX_VALUE)
        );

        incidentNumberPanel2.setOpaque(false);

        javax.swing.GroupLayout incidentNumberPanel2Layout = new javax.swing.GroupLayout(incidentNumberPanel2);
        incidentNumberPanel2.setLayout(incidentNumberPanel2Layout);
        incidentNumberPanel2Layout.setHorizontalGroup(
            incidentNumberPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 0, Short.MAX_VALUE)
        );
        incidentNumberPanel2Layout.setVerticalGroup(
            incidentNumberPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 0, Short.MAX_VALUE)
        );

        incidentNumberPanel3.setOpaque(false);

        javax.swing.GroupLayout incidentNumberPanel3Layout = new javax.swing.GroupLayout(incidentNumberPanel3);
        incidentNumberPanel3.setLayout(incidentNumberPanel3Layout);
        incidentNumberPanel3Layout.setHorizontalGroup(
            incidentNumberPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 0, Short.MAX_VALUE)
        );
        incidentNumberPanel3Layout.setVerticalGroup(
            incidentNumberPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 0, Short.MAX_VALUE)
        );

        incidentNumberPanel4.setOpaque(false);

        javax.swing.GroupLayout incidentNumberPanel4Layout = new javax.swing.GroupLayout(incidentNumberPanel4);
        incidentNumberPanel4.setLayout(incidentNumberPanel4Layout);
        incidentNumberPanel4Layout.setHorizontalGroup(
            incidentNumberPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 0, Short.MAX_VALUE)
        );
        incidentNumberPanel4Layout.setVerticalGroup(
            incidentNumberPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 0, Short.MAX_VALUE)
        );

        incidentNumberPanel5.setOpaque(false);

        javax.swing.GroupLayout incidentNumberPanel5Layout = new javax.swing.GroupLayout(incidentNumberPanel5);
        incidentNumberPanel5.setLayout(incidentNumberPanel5Layout);
        incidentNumberPanel5Layout.setHorizontalGroup(
            incidentNumberPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 0, Short.MAX_VALUE)
        );
        incidentNumberPanel5Layout.setVerticalGroup(
            incidentNumberPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 0, Short.MAX_VALUE)
        );

        incidentNumberPanel6.setOpaque(false);

        javax.swing.GroupLayout incidentNumberPanel6Layout = new javax.swing.GroupLayout(incidentNumberPanel6);
        incidentNumberPanel6.setLayout(incidentNumberPanel6Layout);
        incidentNumberPanel6Layout.setHorizontalGroup(
            incidentNumberPanel6Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 0, Short.MAX_VALUE)
        );
        incidentNumberPanel6Layout.setVerticalGroup(
            incidentNumberPanel6Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 0, Short.MAX_VALUE)
        );

        incidentNumberPanel7.setOpaque(false);

        javax.swing.GroupLayout incidentNumberPanel7Layout = new javax.swing.GroupLayout(incidentNumberPanel7);
        incidentNumberPanel7.setLayout(incidentNumberPanel7Layout);
        incidentNumberPanel7Layout.setHorizontalGroup(
            incidentNumberPanel7Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 0, Short.MAX_VALUE)
        );
        incidentNumberPanel7Layout.setVerticalGroup(
            incidentNumberPanel7Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 0, Short.MAX_VALUE)
        );

        incidentNumberPanel8.setOpaque(false);

        javax.swing.GroupLayout incidentNumberPanel8Layout = new javax.swing.GroupLayout(incidentNumberPanel8);
        incidentNumberPanel8.setLayout(incidentNumberPanel8Layout);
        incidentNumberPanel8Layout.setHorizontalGroup(
            incidentNumberPanel8Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 0, Short.MAX_VALUE)
        );
        incidentNumberPanel8Layout.setVerticalGroup(
            incidentNumberPanel8Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 0, Short.MAX_VALUE)
        );

        incidentNumberPanel9.setOpaque(false);

        javax.swing.GroupLayout incidentNumberPanel9Layout = new javax.swing.GroupLayout(incidentNumberPanel9);
        incidentNumberPanel9.setLayout(incidentNumberPanel9Layout);
        incidentNumberPanel9Layout.setHorizontalGroup(
            incidentNumberPanel9Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 0, Short.MAX_VALUE)
        );
        incidentNumberPanel9Layout.setVerticalGroup(
            incidentNumberPanel9Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 0, Short.MAX_VALUE)
        );

        incidentNumberPanel10.setOpaque(false);

        javax.swing.GroupLayout incidentNumberPanel10Layout = new javax.swing.GroupLayout(incidentNumberPanel10);
        incidentNumberPanel10.setLayout(incidentNumberPanel10Layout);
        incidentNumberPanel10Layout.setHorizontalGroup(
            incidentNumberPanel10Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 0, Short.MAX_VALUE)
        );
        incidentNumberPanel10Layout.setVerticalGroup(
            incidentNumberPanel10Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 0, Short.MAX_VALUE)
        );

        javax.swing.GroupLayout timelineTickPanelLayout = new javax.swing.GroupLayout(timelineTickPanel);
        timelineTickPanel.setLayout(timelineTickPanelLayout);
        timelineTickPanelLayout.setHorizontalGroup(
            timelineTickPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(timelineTickPanelLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(timelineTickPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addGroup(timelineTickPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addComponent(incidentNumberPanel8, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(incidentNumberPanel9, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(timelineTickPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addComponent(incidentNumberPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(incidentNumberPanel4, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(incidentNumberPanel5, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(incidentNumberPanel6, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(incidentNumberPanel3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(incidentNumberPanel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(incidentNumberPanel7, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addComponent(incidentNumberPanel10, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(10, 10, 10)
                .addGroup(timelineTickPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(incidentTimelinePanel7, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(incidentTimelinePanel6, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addGroup(timelineTickPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                        .addComponent(incidentTimelinePanel5, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addComponent(incidentTimelinePanel4, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addComponent(incidentTimelinePanel3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(incidentTimelinePanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(incidentTimelinePanel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(incidentTimelinePanel8, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(incidentTimelinePanel9, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(incidentTimelinePanel10, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(190, 190, 190))
        );
        timelineTickPanelLayout.setVerticalGroup(
            timelineTickPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(timelineTickPanelLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(timelineTickPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(incidentNumberPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(incidentTimelinePanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(timelineTickPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(timelineTickPanelLayout.createSequentialGroup()
                        .addComponent(incidentNumberPanel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(incidentNumberPanel3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(incidentNumberPanel4, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(incidentNumberPanel5, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(incidentNumberPanel6, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(timelineTickPanelLayout.createSequentialGroup()
                        .addComponent(incidentTimelinePanel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(incidentTimelinePanel3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(incidentTimelinePanel4, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(incidentTimelinePanel5, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(incidentTimelinePanel6, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(timelineTickPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(incidentTimelinePanel7, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(incidentNumberPanel7, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(timelineTickPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(timelineTickPanelLayout.createSequentialGroup()
                        .addComponent(incidentTimelinePanel8, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(incidentTimelinePanel9, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(timelineTickPanelLayout.createSequentialGroup()
                        .addComponent(incidentNumberPanel8, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(incidentNumberPanel9, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(timelineTickPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(incidentNumberPanel10, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(incidentTimelinePanel10, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        timelinesScrollPane.setViewportView(timelineTickPanel);

        zoomSlider.setMaximum(22);
        zoomSlider.setMinimum(4);
        zoomSlider.setValue(4);
        zoomSlider.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
        zoomSlider.setFocusable(false);
        zoomSlider.addChangeListener(new javax.swing.event.ChangeListener()
        {
            public void stateChanged(javax.swing.event.ChangeEvent evt)
            {
                zoomSliderStateChanged(evt);
            }
        });

        zoomInIcon.setIcon(new javax.swing.ImageIcon(getClass().getResource("/images/ZoomIn.png"))); // NOI18N
        zoomInIcon.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
        zoomInIcon.addMouseListener(new java.awt.event.MouseAdapter()
        {
            public void mouseClicked(java.awt.event.MouseEvent evt)
            {
                zoomInIconMouseClicked(evt);
            }
        });

        zoomOutIcon.setIcon(new javax.swing.ImageIcon(getClass().getResource("/images/ZoomOut.png"))); // NOI18N
        zoomOutIcon.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
        zoomOutIcon.addMouseListener(new java.awt.event.MouseAdapter()
        {
            public void mouseClicked(java.awt.event.MouseEvent evt)
            {
                zoomOutIconMouseClicked(evt);
            }
        });

        timeStampScrollPane.setBorder(null);
        timeStampScrollPane.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
        timeStampScrollPane.setVerticalScrollBarPolicy(javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER);

        javax.swing.GroupLayout timeStampPanelLayout = new javax.swing.GroupLayout(timeStampPanel);
        timeStampPanel.setLayout(timeStampPanelLayout);
        timeStampPanelLayout.setHorizontalGroup(
            timeStampPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 0, Short.MAX_VALUE)
        );
        timeStampPanelLayout.setVerticalGroup(
            timeStampPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 0, Short.MAX_VALUE)
        );

        timeStampScrollPane.setViewportView(timeStampPanel);

        fileMenu.setText("File");
        fileMenu.setMargin(new java.awt.Insets(0, 10, 0, 10));
        fileMenu.addActionListener(new java.awt.event.ActionListener()
        {
            public void actionPerformed(java.awt.event.ActionEvent evt)
            {
                fileMenuActionPerformed(evt);
            }
        });

        fileNew.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_N, java.awt.event.InputEvent.SHIFT_MASK | java.awt.event.InputEvent.CTRL_MASK));
        fileNew.setText("New");
        fileNew.addActionListener(new java.awt.event.ActionListener()
        {
            public void actionPerformed(java.awt.event.ActionEvent evt)
            {
                fileNewActionPerformed(evt);
            }
        });
        fileMenu.add(fileNew);
        fileMenu.add(jSeparator1);

        fileOpen.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_O, java.awt.event.InputEvent.SHIFT_MASK | java.awt.event.InputEvent.CTRL_MASK));
        fileOpen.setText("Open...");
        fileOpen.addActionListener(new java.awt.event.ActionListener()
        {
            public void actionPerformed(java.awt.event.ActionEvent evt)
            {
                fileOpenActionPerformed(evt);
            }
        });
        fileMenu.add(fileOpen);
        fileMenu.add(jSeparator2);

        fileSave.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_S, java.awt.event.InputEvent.CTRL_MASK));
        fileSave.setText("Save");
        fileSave.addActionListener(new java.awt.event.ActionListener()
        {
            public void actionPerformed(java.awt.event.ActionEvent evt)
            {
                fileSaveActionPerformed(evt);
            }
        });
        fileMenu.add(fileSave);

        fileSaveAs.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_S, java.awt.event.InputEvent.SHIFT_MASK | java.awt.event.InputEvent.CTRL_MASK));
        fileSaveAs.setText("Save as...");
        fileSaveAs.addActionListener(new java.awt.event.ActionListener()
        {
            public void actionPerformed(java.awt.event.ActionEvent evt)
            {
                fileSaveAsActionPerformed(evt);
            }
        });
        fileMenu.add(fileSaveAs);

        scriptBuilderMenuBar.add(fileMenu);

        generateMenu.setLabel("Generate");
        generateMenu.setMargin(new java.awt.Insets(0, 10, 0, 10));

        generateNotebooks.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_N, java.awt.event.InputEvent.ALT_MASK | java.awt.event.InputEvent.CTRL_MASK));
        generateNotebooks.setText("Generate Notebooks...");
        generateNotebooks.addActionListener(new java.awt.event.ActionListener()
        {
            public void actionPerformed(java.awt.event.ActionEvent evt)
            {
                generateNotebooksActionPerformed(evt);
            }
        });
        generateMenu.add(generateNotebooks);

        jMenuItem3.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_W, java.awt.event.InputEvent.ALT_MASK | java.awt.event.InputEvent.CTRL_MASK));
        jMenuItem3.setText("Generate Web Notebook...");
        generateMenu.add(jMenuItem3);

        generateScorecards.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_S, java.awt.event.InputEvent.ALT_MASK | java.awt.event.InputEvent.CTRL_MASK));
        generateScorecards.setText("Generate Scorecards...");
        generateScorecards.addActionListener(new java.awt.event.ActionListener()
        {
            public void actionPerformed(java.awt.event.ActionEvent evt)
            {
                generateScorecardsActionPerformed(evt);
            }
        });
        generateMenu.add(generateScorecards);

        generateOrganizationChart.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_O, java.awt.event.InputEvent.ALT_MASK | java.awt.event.InputEvent.CTRL_MASK));
        generateOrganizationChart.setText("Generate D14 TMC Org Chart...");
        generateOrganizationChart.addActionListener(new java.awt.event.ActionListener()
        {
            public void actionPerformed(java.awt.event.ActionEvent evt)
            {
                generateOrganizationChartActionPerformed(evt);
            }
        });
        generateMenu.add(generateOrganizationChart);
        generateMenu.add(jSeparator3);

        generateProjectRequirements.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_R, java.awt.event.InputEvent.ALT_MASK | java.awt.event.InputEvent.CTRL_MASK));
        generateProjectRequirements.setText("Generate Project Worklist...");
        generateProjectRequirements.addActionListener(new java.awt.event.ActionListener()
        {
            public void actionPerformed(java.awt.event.ActionEvent evt)
            {
                generateProjectRequirementsActionPerformed(evt);
            }
        });
        generateMenu.add(generateProjectRequirements);

        scriptBuilderMenuBar.add(generateMenu);

        incidentMenu.setText("Incidents");
        incidentMenu.setMargin(new java.awt.Insets(0, 10, 0, 10));

        newIncident.setText("New Incident...");
        newIncident.addActionListener(new java.awt.event.ActionListener()
        {
            public void actionPerformed(java.awt.event.ActionEvent evt)
            {
                newIncidentActionPerformed(evt);
            }
        });
        incidentMenu.add(newIncident);

        editIncident.setText("Edit Incident...");
        editIncident.addActionListener(new java.awt.event.ActionListener()
        {
            public void actionPerformed(java.awt.event.ActionEvent evt)
            {
                editIncidentActionPerformed(evt);
            }
        });
        incidentMenu.add(editIncident);

        incidentDetails.setText("Incident Details...");
        incidentDetails.addActionListener(new java.awt.event.ActionListener()
        {
            public void actionPerformed(java.awt.event.ActionEvent evt)
            {
                incidentDetailsActionPerformed(evt);
            }
        });
        incidentMenu.add(incidentDetails);
        incidentMenu.add(jSeparator4);

        saveIncident.setText("Save Incident...");
        saveIncident.addActionListener(new java.awt.event.ActionListener()
        {
            public void actionPerformed(java.awt.event.ActionEvent evt)
            {
                saveIncidentActionPerformed(evt);
            }
        });
        incidentMenu.add(saveIncident);

        loadIncident.setText("Load Incident...");
        loadIncident.addActionListener(new java.awt.event.ActionListener()
        {
            public void actionPerformed(java.awt.event.ActionEvent evt)
            {
                loadIncidentActionPerformed(evt);
            }
        });
        incidentMenu.add(loadIncident);

        scriptBuilderMenuBar.add(incidentMenu);

        generateNoiseMenu.setText("Noise");

        generateNoiseOption.setText("Generate Noise...");
        generateNoiseOption.addActionListener(new java.awt.event.ActionListener()
        {
            public void actionPerformed(java.awt.event.ActionEvent evt)
            {
                generateNoiseOptionActionPerformed(evt);
            }
        });
        generateNoiseMenu.add(generateNoiseOption);

        scriptBuilderMenuBar.add(generateNoiseMenu);

        helpMenu.setText("Help");
        helpMenu.setMargin(new java.awt.Insets(0, 10, 0, 10));

        helpTutorial.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F1, 0));
        helpTutorial.setText("Tutorial...");
        helpMenu.add(helpTutorial);

        helpAbout.setText("About...");
        helpAbout.addActionListener(new java.awt.event.ActionListener()
        {
            public void actionPerformed(java.awt.event.ActionEvent evt)
            {
                helpAboutActionPerformed(evt);
            }
        });
        helpMenu.add(helpAbout);

        scriptBuilderMenuBar.add(helpMenu);

        setJMenuBar(scriptBuilderMenuBar);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(timelinesScrollPane, 0, 0, Short.MAX_VALUE)
                    .addComponent(timeStampScrollPane)
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                        .addGap(0, 597, Short.MAX_VALUE)
                        .addComponent(zoomOutIcon)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(zoomSlider, javax.swing.GroupLayout.PREFERRED_SIZE, 140, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(zoomInIcon)
                        .addGap(136, 136, 136)))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(zoomOutIcon)
                    .addComponent(zoomSlider, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(zoomInIcon))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(timeStampScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(timelinesScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 1289, Short.MAX_VALUE)
                .addContainerGap())
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    /**
     * Scale the timeline width based on zoom slider position.
     *
     * @param evt the state change event
     */
    private void zoomSliderStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_zoomSliderStateChanged
        ScriptBuilderGuiConstants.PIXEL_WIDTH_PER_HORIZONTAL_TICK = zoomSlider.getValue();
        this.update(script, script);
        pack();
        repaint();
    }//GEN-LAST:event_zoomSliderStateChanged

    private void cadEventMousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_cadEventMousePressed
    }//GEN-LAST:event_cadEventMousePressed

    private void radioEventMousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_radioEventMousePressed
    }//GEN-LAST:event_radioEventMousePressed

    private void cadEventMouseReleased(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_cadEventMouseReleased
    }//GEN-LAST:event_cadEventMouseReleased

    private void okButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_okButtonActionPerformed
    }//GEN-LAST:event_okButtonActionPerformed

    /**
     * If cancel button is pressed, close radio event editor
     *
     * @param evt the button press event
     */
    private void cancelButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cancelButtonActionPerformed
        radioMessage.setText("");
        radioTypeComboBox.setSelectedIndex(0);
        radioEventFrame.setVisible(false);
    }//GEN-LAST:event_cancelButtonActionPerformed

    private void editEventListActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_editEventListActionPerformed
    }//GEN-LAST:event_editEventListActionPerformed

    /**
     * Executed when the "OK" button is pressed on the Incident editor. If
     * incident is new, and is valid, adds it to the model and updates. If
     * editing existing incident, verifies changes are valid and applies them.
     * Then closes editor window.
     *
     * @param evt the button press event
     */
    private void incidentOkButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_incidentOkButtonActionPerformed
        if (!editingIncident)
        {
            boolean found = false;
            int indx = 0;
            // ALERT: Wacky logic follows
            // Examine all the incidents contained in this script
            for (ScriptIncident inci : script.incidents)
            {
                // If this spot in the list of incidents hasn't been assigned yet
                if (inci == null)
                {
                    found = true;
                    break;
                }
                ++indx;
                // Does the new incident number match an existing one?
                if (inci.number == (Integer) addIncidentNumber.getValue())
                {
                    JOptionPane.showMessageDialog(this, "Incident number already in use.",
                            "Unable to Create Incident", JOptionPane.ERROR_MESSAGE);
                    incidentFrame.setVisible(true);
                    return;
                }
            }
            // We examined all incidents and there wasn't an empty slot
            if (!found)
            {
                JOptionPane.showMessageDialog(this, "Script already has the max number of incidents.",
                        "Unable to Create Incident", JOptionPane.ERROR_MESSAGE);
                incidentFrame.setVisible(true);
                // ALERT: exit from middle of method
                return;
            }

            // We found a spot for the new incident
            script.incidents.remove(indx); // remove the null incident placeholder
            SimulationScript.incidentColors[indx] = selectedColor;
            // Add the new incident to the list
            script.incidents.add(indx,
                    new ScriptIncident(SimulationScript.incidentColors[indx],
                            (Integer) addIncidentNumber.getValue(), addIncidentName.getText(), addIncidentDescription.getText(),
                            script));
            script.incidents.get(indx).length = (Integer) addIncidentLength.getValue() * 60;
            script.incidents.get(indx).setOffset((Integer) addIncidentStart.getValue() * 60);
            script.numberOfIncidents++;
        }
        else
        {
            ScriptIncident backup = script.incidents.get(oldIncidentIndex);
            script.incidents.remove(oldIncidentIndex);
            script.incidents.add(oldIncidentIndex, null);

            for (ScriptIncident i : script.incidents)
            {
                if (i != null && i.number == (Integer) addIncidentNumber.getValue())
                {
                    script.incidents.remove(oldIncidentIndex);
                    script.incidents.add(oldIncidentIndex, backup);
                    JOptionPane.showMessageDialog(this, "Incident number already in use.",
                            "Unable to Create Incident", JOptionPane.ERROR_MESSAGE);
                    incidentFrame.setVisible(true);
                    return;
                }
            }

            script.incidents.remove(oldIncidentIndex);
            SimulationScript.incidentColors[oldIncidentIndex] = selectedColor;
            script.incidents.add(oldIncidentIndex,
                    new ScriptIncident(SimulationScript.incidentColors[oldIncidentIndex],
                            (Integer) addIncidentNumber.getValue(), addIncidentName.getText(), addIncidentDescription.getText(),
                            script));
            script.incidents.get(oldIncidentIndex).length = (Integer) addIncidentLength.getValue() * 60;
            script.incidents.get(oldIncidentIndex).slices = backup.slices;
            script.incidents.get(oldIncidentIndex).offset = backup.offset;
            script.incidents.get(oldIncidentIndex).setOffset((Integer) addIncidentStart.getValue() * 60);
            script.numberOfIncidents++;
        }

        incidentFrame.setVisible(false);
        update(script, script);
        repaint();
    }//GEN-LAST:event_incidentOkButtonActionPerformed

    /**
     * Closes editor window upon click of cancel button.
     *
     * @param evt the button press event
     */
    private void incidentCancelButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_incidentCancelButtonActionPerformed
        incidentFrame.setVisible(false);
    }//GEN-LAST:event_incidentCancelButtonActionPerformed

    /**
     * Opens incident editor window and preps for addition of new incident, upon
     * click of "New Incident" menu option.
     *
     * @param evt the button press event
     */
    private void newIncidentActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_newIncidentActionPerformed
        editingIncident = false;

        addIncidentName.setText("");
        addIncidentNumber.setValue(101);
        addIncidentStart.setValue(0);
        addIncidentLength.setValue(0);
        incidentColorField.setBackground(Color.BLACK);
        selectedColor = Color.BLACK;
        addIncidentDescription.setText("");

        incidentFrame.setVisible(true);
    }//GEN-LAST:event_newIncidentActionPerformed

    private void fileMenuActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_fileMenuActionPerformed
    }//GEN-LAST:event_fileMenuActionPerformed

    /**
     * Upon click of "Open file" menu option, opens a window to load a new .sim
     * file.
     *
     * @param evt the button press event
     */
    private void fileOpenActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_fileOpenActionPerformed
        JFileChooser fc = new JFileChooser();

        fc.setFileFilter(new ExtensionFileFilter("Simulation Script XML (.xml)",
                new String[]
                {
                    "xml"
                }));
        if (fc.showOpenDialog(this) == JFileChooser.APPROVE_OPTION)
        {
            script = new SimulationScript();
            System.out.println(fc.getSelectedFile().getName());
            script.loadScriptFromFile(fc.getSelectedFile());
            script.saveFile = fc.getSelectedFile();
        }
        update(script, script);
        zoomSlider.setValue(zoomSlider.getMinimum());
        repaint();
    }//GEN-LAST:event_fileOpenActionPerformed

    /**
     * Upon click of "Save as" menu option, opens a window to choose a .sim file
     * to save this as.
     *
     * @param evt the button press event
     */
    private void fileSaveAsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_fileSaveAsActionPerformed
        JFileChooser fc = new JFileChooser();

        fc.setFileFilter(new ExtensionFileFilter("Simulation Script XML (.xml)",
                new String[]
                {
                    "xml"
                }));

        if (fc.showSaveDialog(this) == JFileChooser.APPROVE_OPTION)
        {
            script.saveScriptToFile(fc.getSelectedFile());
            script.saveFile = fc.getSelectedFile();
        }
    }//GEN-LAST:event_fileSaveAsActionPerformed

    /**
     * Upon click of "Save" menu option, opens a window to choose a .sim file to
     * save this as.
     *
     * @param evt the button press event
     */
    private void fileSaveActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_fileSaveActionPerformed
        if (script.saveFile == null)
        {
            fileSaveAsActionPerformed(evt);
        }
        else
        {
            script.saveScriptToFile(script.saveFile);
        }
    }//GEN-LAST:event_fileSaveActionPerformed

    /**
     * Upon click of "Edit incident" menu option, brings up a dropdown menu of
     * all existing incidents. Once an incident is selected, opens incident
     * editor window with that event's details loaded.
     *
     * @param evt the button press event
     */
    private void incidentDetailsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_incidentDetailsActionPerformed
        Object[] incidentList = script.incidents.toArray();
        ScriptIncident i = (ScriptIncident) JOptionPane.showInputDialog(
                this,
                "Select Incident:",
                "Edit Incident",
                JOptionPane.PLAIN_MESSAGE,
                null,
                incidentList,
                script.incidents.get(0));

        // If a valid incident was selected
        if (i != null)
        {
            editingIncident = true;
            oldIncidentIndex = script.incidents.indexOf(i);

            addIncidentName.setText(i.name);
            addIncidentNumber.setValue(i.number);
            addIncidentStart.setValue(i.offset / 60);
            addIncidentLength.setValue(i.length / 60);
            incidentColorField.setBackground(i.color);
            selectedColor = i.color;
            addIncidentDescription.setText(i.description);

            incidentFrame.setVisible(true);
        }
    }//GEN-LAST:event_incidentDetailsActionPerformed

    /**
     * Brings up the noise generation screen upon click of the "Generate Noise"
     * menu option.
     *
     * @param evt the button press event
     */
    private void generateNoiseOptionActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_generateNoiseOptionActionPerformed
        addNoiseFrame.setVisible(true);
    }//GEN-LAST:event_generateNoiseOptionActionPerformed

    /**
     * Hides the noise generation screen upon click of the "Cancel" button.
     *
     * @param evt the button press event
     */
    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed
        addNoiseFrame.setVisible(false);
    }//GEN-LAST:event_jButton1ActionPerformed

    /**
     * Generates random noise upon click of the "OK" button, then hides the
     * noise generation screen.
     *
     * @param evt the button press event
     */
    private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton2ActionPerformed
        Random rng = new Random();
        ScriptEventType[] eventTypes = ScriptEventType.values();

        /* For prototyping purpose, ignore the sliders and average their values */
        int total = jSlider1.getValue() + jSlider2.getValue() + jSlider3.getValue() + jSlider5.getValue() + jSlider4.getValue();
        total /= 5;

        for (int i = 0; i < script.incidents.get(9).slices.size(); i++)
        {
            script.incidents.get(9).slices.get(i).events.clear();
        }

        for (int i = 0; i < total; i++)
        {
            int n = rng.nextInt();
            int s = rng.nextInt();
            int e = rng.nextInt();
            if (n < 0)
            {
                n *= -1;
            }
            if (s < 0)
            {
                s *= -1;
            }
            if (e < 0)
            {
                e *= -1;
            }

            script.incidents.get(9).slices.get(s % (script.incidents.get(9).slices.size())).addEvent(ScriptEvent.factoryByType(eventTypes[e % eventTypes.length]));
        }

        addNoiseFrame.setVisible(false);

        update(script, script);
}//GEN-LAST:event_jButton2ActionPerformed

    /**
     * Allow the user to pick an incident from a dropdown, then save it to an
     * XML file.
     *
     * @param evt the button press event
     */
    private void saveIncidentActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_saveIncidentActionPerformed
        Object[] incidentList = script.incidents.toArray();
        String input = "";
        ScriptIncident inc = null;
        Object result = JOptionPane.showInputDialog(
                this,
                "Select Incident:",
                "Save Incident",
                JOptionPane.PLAIN_MESSAGE,
                null,
                incidentList,
                script.incidents.get(0));

        System.out.println("RESULT = " + result.toString());

        input = result.toString();

        System.out.println("INPUT = " + input);

        int i = 0;
        for (ScriptIncident incident : script.incidents)
        {
            if (incident == null)
            {
                continue;
            }
            System.out.println((++i) + ": " + incident.toString());
            if (incident.toString().equals(input))
            {
                inc = incident;
            }
        }

        if (inc == null)
        {
            System.out.println("DIDN'T FIND ANYTHING");
            return;
        }

        JFileChooser fc = new JFileChooser();
        fc.setFileFilter(new ExtensionFileFilter("Script Incident (.xml)", new String[]
        {
            "xml"
        }));
        if (fc.showSaveDialog(this) == JFileChooser.APPROVE_OPTION)
        {
            inc.saveIncidentToFile(fc.getSelectedFile());
        }
    }//GEN-LAST:event_saveIncidentActionPerformed

    private void loadIncidentActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_loadIncidentActionPerformed
        new IncidentPaletteFrame(script, this).setVisible(true);
        zoomSlider.setValue(zoomSlider.getMinimum());
    }//GEN-LAST:event_loadIncidentActionPerformed

    private void generateProjectRequirementsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_generateProjectRequirementsActionPerformed
        JFileChooser fc = new JFileChooser();
        fc.setFileFilter(new ExtensionFileFilter("Portable Document Format (.pdf)", new String[]
        {
            "pdf"
        }));
        fc.setSelectedFile(new File("Requirements.pdf"));
        fc.showSaveDialog(this);
    }//GEN-LAST:event_generateProjectRequirementsActionPerformed

    private void generateNotebooksActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_generateNotebooksActionPerformed
        JFileChooser fc = new JFileChooser();
        fc.setFileFilter(new ExtensionFileFilter("Portable Document Format (.pdf)", new String[]
        {
            "pdf"
        }));
        fc.setSelectedFile(new File("Notebooks.pdf"));
        fc.showSaveDialog(this);
    }//GEN-LAST:event_generateNotebooksActionPerformed

    private void generateScorecardsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_generateScorecardsActionPerformed
        JFileChooser fc = new JFileChooser();
        fc.setFileFilter(new ExtensionFileFilter("Portable Document Format (.pdf)", new String[]
        {
            "pdf"
        }));
        fc.setSelectedFile(new File("Scorecards.pdf"));
        fc.showSaveDialog(this);
    }//GEN-LAST:event_generateScorecardsActionPerformed

    private void generateOrganizationChartActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_generateOrganizationChartActionPerformed
        JFileChooser fc = new JFileChooser();
        fc.setFileFilter(new ExtensionFileFilter("Portable Document Format (.pdf)", new String[]
        {
            "pdf"
        }));
        fc.setSelectedFile(new File("OrganizationChart.pdf"));
        fc.showSaveDialog(this);
    }//GEN-LAST:event_generateOrganizationChartActionPerformed

    /**
     * Increases zoom level upon click of the "Zoom in" icon.
     *
     * @param evt the mouse event
     */
    private void zoomInIconMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_zoomInIconMouseClicked
        zoomSlider.setValue(zoomSlider.getValue() >= 21 ? 21 : zoomSlider.getValue() + 1);
    }//GEN-LAST:event_zoomInIconMouseClicked

    /**
     * Decreases zoom level upon click of the "Zoom out" icon.
     *
     * @param evt the mouse event
     */
    private void zoomOutIconMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_zoomOutIconMouseClicked
        zoomSlider.setValue(zoomSlider.getValue() <= 5 ? 5 : zoomSlider.getValue() - 1);
    }//GEN-LAST:event_zoomOutIconMouseClicked
    private Color selectedColor = Color.BLACK;

    private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton3ActionPerformed
        Color newColor = incidentColorChooser.showDialog(this, "Incident Color", incidentColorField.getBackground());
        if (newColor != null)
        {
            selectedColor = newColor;
            incidentColorField.setBackground(newColor);
        }
    }//GEN-LAST:event_jButton3ActionPerformed

    /* Help > About simply displays the current SVN revision number so
     * the user can determine which version of the source code was used to
     * build the executable she is running.
     */
    private void helpAboutActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_helpAboutActionPerformed
    {//GEN-HEADEREND:event_helpAboutActionPerformed
        JOptionPane.showMessageDialog(rootPane, "Revision: " + getAppVersion(), "About", JOptionPane.INFORMATION_MESSAGE);
    }//GEN-LAST:event_helpAboutActionPerformed

    private void fileNewActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_fileNewActionPerformed
    {//GEN-HEADEREND:event_fileNewActionPerformed
        script = new SimulationScript();
        script.update();
        update(null, script);
        repaint();
    }//GEN-LAST:event_fileNewActionPerformed

    private void editIncidentActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_editIncidentActionPerformed
    {//GEN-HEADEREND:event_editIncidentActionPerformed
        Object[] incidentList = script.incidents.toArray();
        String input = "";
        ScriptIncident inc = null;
        Object result = JOptionPane.showInputDialog(
                this,
                "Select Incident:",
                "Save Incident",
                JOptionPane.PLAIN_MESSAGE,
                null,
                incidentList,
                script.incidents.get(0));

        if (result != null)
        {
            System.out.println("RESULT = " + result.toString());

            input = result.toString();

            System.out.println("INPUT = " + input);

            int i = 0;
            for (ScriptIncident incident : script.incidents)
            {
                if (incident == null)
                {
                    continue;
                }
                System.out.println((++i) + ": " + incident.toString());
                if (incident.toString().equals(input))
                {
                    inc = incident;
                }
            }

            if (inc != null)
            {
                IncidentEditorFrame editor = new IncidentEditorFrame(inc);
                script.addObserver(editor);
                editor.setVisible(true);
            }
        }
        update(script, script);
    }//GEN-LAST:event_editIncidentActionPerformed

    /**
     * Read the version number from the application properties. The file
     * 'application.properties' is generated by build.xml.
     *
     * @return a version string obtained from application.properties file, or
     * "Version: unknown" if an IOerror prevents us from reading the file.
     */
    private String getAppVersion()
    {
        String propfilename = "/scriptbuilder/gui/application.properties";
        String propKey = "Application.revision";
        String version = "unknown";
        // Load the application properties (created by build.xml)
        try
        {
            Properties props = new Properties();
            props.load(this.getClass().getResourceAsStream(propfilename));
            version = (String) props.get(propKey);
        }
        catch (IOException ex)
        {
            Logger.getLogger("scriptbuilder.gui").log(Level.SEVERE,
                    "ScriptBuilderFrame.getAppVersion()."
                    + " IOError reading " + propfilename);
        }
        catch (NullPointerException npe)
        {
            Logger.getLogger("scriptbuilder.gui").log(Level.SEVERE,
                    "ScriptBuilderFrame.getAppVersion().load."
                    + " Missing file: " + propfilename);
        }
        return version;
    }

    /**
     * Runs the script builder.
     *
     * @param args the command line arguments
     */
    public static void main(String args[])
    {
        try
        {
            UIManager.setLookAndFeel("com.sun.java.swing.plaf.gtk.GTKLookAndFeel");
        }
        catch (ClassNotFoundException ex)
        {
        }
        catch (InstantiationException ex)
        {
        }
        catch (IllegalAccessException ex)
        {
        }
        catch (UnsupportedLookAndFeelException ex)
        {
        }

        try
        {
            UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
        }
        catch (ClassNotFoundException ex)
        {
        }
        catch (InstantiationException ex)
        {
        }
        catch (IllegalAccessException ex)
        {
        }
        catch (UnsupportedLookAndFeelException ex)
        {
        }

        java.awt.EventQueue.invokeLater(
                new Runnable()
                {
                    public void run()
                    {
                        new ScriptBuilderFrame().setVisible(true);
                    }
                });
    }
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JTextArea addIncidentDescription;
    private javax.swing.JSpinner addIncidentLength;
    private javax.swing.JTextField addIncidentName;
    private javax.swing.JSpinner addIncidentNumber;
    private javax.swing.JSpinner addIncidentStart;
    private javax.swing.JFrame addNoiseFrame;
    private javax.swing.JMenuItem cadEvent;
    private javax.swing.JFrame cadEventFrame;
    private javax.swing.JButton cancelButton;
    private javax.swing.JMenuItem deleteEventList;
    private javax.swing.JMenuItem editEventList;
    private javax.swing.JMenuItem editIncident;
    private javax.swing.JPopupMenu eventListPopupMenu;
    private javax.swing.JPopupMenu eventPopupMenu;
    private javax.swing.JMenu fileMenu;
    private javax.swing.JMenuItem fileNew;
    private javax.swing.JMenuItem fileOpen;
    private javax.swing.JMenuItem fileSave;
    private javax.swing.JMenuItem fileSaveAs;
    private javax.swing.JMenu generateMenu;
    private javax.swing.JMenu generateNoiseMenu;
    private javax.swing.JMenuItem generateNoiseOption;
    private javax.swing.JMenuItem generateNotebooks;
    private javax.swing.JMenuItem generateOrganizationChart;
    private javax.swing.JMenuItem generateProjectRequirements;
    private javax.swing.JMenuItem generateScorecards;
    private javax.swing.JMenuItem helpAbout;
    private javax.swing.JMenu helpMenu;
    private javax.swing.JMenuItem helpTutorial;
    private javax.swing.JButton incidentCancelButton;
    private javax.swing.JColorChooser incidentColorChooser;
    private javax.swing.JTextField incidentColorField;
    private javax.swing.JMenuItem incidentDetails;
    private javax.swing.JFrame incidentFrame;
    private javax.swing.JMenu incidentMenu;
    private scriptbuilder.gui.panels.IncidentNumberPanel incidentNumberPanel1;
    private scriptbuilder.gui.panels.IncidentNumberPanel incidentNumberPanel10;
    private scriptbuilder.gui.panels.IncidentNumberPanel incidentNumberPanel2;
    private scriptbuilder.gui.panels.IncidentNumberPanel incidentNumberPanel3;
    private scriptbuilder.gui.panels.IncidentNumberPanel incidentNumberPanel4;
    private scriptbuilder.gui.panels.IncidentNumberPanel incidentNumberPanel5;
    private scriptbuilder.gui.panels.IncidentNumberPanel incidentNumberPanel6;
    private scriptbuilder.gui.panels.IncidentNumberPanel incidentNumberPanel7;
    private scriptbuilder.gui.panels.IncidentNumberPanel incidentNumberPanel8;
    private scriptbuilder.gui.panels.IncidentNumberPanel incidentNumberPanel9;
    private javax.swing.JButton incidentOkButton;
    private javax.swing.JPopupMenu incidentPopupMenu;
    private scriptbuilder.gui.panels.IncidentTimelinePanel incidentTimelinePanel1;
    private scriptbuilder.gui.panels.IncidentTimelinePanel incidentTimelinePanel10;
    private scriptbuilder.gui.panels.IncidentTimelinePanel incidentTimelinePanel2;
    private scriptbuilder.gui.panels.IncidentTimelinePanel incidentTimelinePanel3;
    private scriptbuilder.gui.panels.IncidentTimelinePanel incidentTimelinePanel4;
    private scriptbuilder.gui.panels.IncidentTimelinePanel incidentTimelinePanel5;
    private scriptbuilder.gui.panels.IncidentTimelinePanel incidentTimelinePanel6;
    private scriptbuilder.gui.panels.IncidentTimelinePanel incidentTimelinePanel7;
    private scriptbuilder.gui.panels.IncidentTimelinePanel incidentTimelinePanel8;
    private scriptbuilder.gui.panels.IncidentTimelinePanel incidentTimelinePanel9;
    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButton2;
    private javax.swing.JButton jButton3;
    private javax.swing.JLabel jLabel10;
    private javax.swing.JLabel jLabel11;
    private javax.swing.JLabel jLabel12;
    private javax.swing.JLabel jLabel13;
    private javax.swing.JLabel jLabel14;
    private javax.swing.JLabel jLabel15;
    private javax.swing.JLabel jLabel16;
    private javax.swing.JLabel jLabel17;
    private javax.swing.JLabel jLabel20;
    private javax.swing.JLabel jLabel21;
    private javax.swing.JLabel jLabel5;
    private javax.swing.JLabel jLabel6;
    private javax.swing.JLabel jLabel7;
    private javax.swing.JLabel jLabel8;
    private javax.swing.JLabel jLabel9;
    private javax.swing.JMenuItem jMenuItem2;
    private javax.swing.JMenuItem jMenuItem3;
    private javax.swing.JMenuItem jMenuItem4;
    private javax.swing.JMenuItem jMenuItem5;
    private javax.swing.JMenuItem jMenuItem6;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JPopupMenu.Separator jSeparator1;
    private javax.swing.JPopupMenu.Separator jSeparator2;
    private javax.swing.JPopupMenu.Separator jSeparator3;
    private javax.swing.JPopupMenu.Separator jSeparator4;
    private javax.swing.JSlider jSlider1;
    private javax.swing.JSlider jSlider2;
    private javax.swing.JSlider jSlider3;
    private javax.swing.JSlider jSlider4;
    private javax.swing.JSlider jSlider5;
    private javax.swing.JTextArea jTextArea1;
    private javax.swing.JMenuItem loadIncident;
    private javax.swing.JMenuItem newIncident;
    private javax.swing.JButton okButton;
    private javax.swing.JMenuItem popupDeleteIncident;
    private javax.swing.JMenuItem radioEvent;
    private javax.swing.JFrame radioEventFrame;
    private javax.swing.JTextArea radioMessage;
    private javax.swing.JScrollPane radioMessageScrollPane;
    private javax.swing.JComboBox radioTypeComboBox;
    private javax.swing.JLabel radioTypeLabel;
    private javax.swing.JMenuItem saveIncident;
    private javax.swing.JMenuBar scriptBuilderMenuBar;
    private scriptbuilder.gui.panels.TimeStampPanel timeStampPanel;
    private javax.swing.JScrollPane timeStampScrollPane;
    private scriptbuilder.gui.panels.TimelineTickPanel timelineTickPanel;
    private javax.swing.JScrollPane timelinesScrollPane;
    private javax.swing.JLabel zoomInIcon;
    private javax.swing.JLabel zoomOutIcon;
    private javax.swing.JSlider zoomSlider;
    // End of variables declaration//GEN-END:variables
}
