source: tmcsimulator-scriptbuilder/trunk/src/scriptbuilder/gui/IncidentEditorFrame.java @ 61

Revision 61, 86.9 KB checked in by bmcguffin, 9 years ago (diff)

Made a few cosmetic changes to the code. Added a statement in the update method of IncidentEditorFrame? which tries to set the maximum scale of the zoom slider at an appropriate level.

Line 
1/**
2 * Frame for the Individual Incident Editor.
3 *
4 * @author Bryan McGuffin
5 * @version 2017/08/08
6 */
7package scriptbuilder.gui;
8
9import java.awt.Adjustable;
10import java.awt.Color;
11import java.awt.event.AdjustmentEvent;
12import java.awt.event.AdjustmentListener;
13import java.awt.event.KeyEvent;
14import java.awt.event.KeyListener;
15import java.io.IOException;
16import java.util.ArrayList;
17import java.util.Observable;
18import java.util.Observer;
19import java.util.Properties;
20import java.util.Random;
21import java.util.logging.Level;
22import java.util.logging.Logger;
23import javax.swing.DefaultListModel;
24import javax.swing.JButton;
25import scriptbuilder.structures.ScriptEvent;
26import scriptbuilder.structures.ScriptEvent.ScriptEventType;
27import scriptbuilder.structures.ScriptIncident;
28import scriptbuilder.structures.ScriptIncident.IncidentFocusedEvent;
29import scriptbuilder.structures.ScriptIncident.SliceChangedEvent;
30import scriptbuilder.structures.TimeSlice;
31import scriptbuilder.structures.events.I_ScriptEvent;
32
33/**
34 * GUI for the script builder. Contains all panels and editor elements. Performs
35 * updates to reflect script model, which it observes.
36 *
37 * @author Greg Eddington
38 * @author Bryan McGuffin
39 */
40public class IncidentEditorFrame extends javax.swing.JFrame implements Observer
41{
42   
43    /**
44     * The script incident currently being edited.
45     */
46    private ScriptIncident theIncident;
47   
48    /**
49     * The current type of selected event.
50     */
51    public ScriptEventType currentEventType;
52    /**
53     * A list of all the event type buttons.
54     */
55    private ArrayList<JButton> eventButtons = null;
56    /**
57     * True if we are currently editing an incident.
58     */
59    private boolean editingIncident;
60    /**
61     * Index of the previous incident.
62     */
63    int oldIncidentIndex;
64
65    /**
66     * Get the script currently in use.
67     *
68     * @return the script model object
69     */
70    public ScriptIncident getIncident()
71    {
72        return theIncident;
73    }
74
75    /**
76     * Listener for the scroll pane.
77     */
78    class MyAdjustmentListener implements AdjustmentListener
79    {
80
81        /**
82         * If the incident timeline is scrolled horizontally, the timestamp
83         * panel is updated to reflect it.
84         *
85         * @param evt the adjustment event
86         */
87        @Override
88        public void adjustmentValueChanged(AdjustmentEvent evt)
89        {
90            if (evt.getAdjustable().getOrientation() == Adjustable.HORIZONTAL)
91            {
92                timeStampScrollPane.getHorizontalScrollBar()
93                        .setValue(timelinesScrollPane.getHorizontalScrollBar().getValue());
94            }
95            else
96            {
97                // Event from vertical scrollbar
98            }
99
100            repaint();
101        }
102    }
103
104    /**
105     * Listener for key presses. Used for hotkeys for different event types.
106     */
107    private class TimelineKeyListener implements KeyListener
108    {
109
110        /**
111         * If a hotkey is pressed, select that type of event.
112         *
113         * @param e the key event
114         */
115        @Override
116        public void keyPressed(KeyEvent e)
117        {
118            JButton lastButton = null;
119            for (JButton eb : eventButtons)
120            {
121                eb.setFocusPainted(false);
122                if (eb.isSelected())
123                {
124                    lastButton = eb;
125                }
126                eb.setSelected(false);
127            }
128
129            JButton newButton = null;
130            switch (e.getKeyChar())
131            {
132                case 'u':
133                    currentEventType = ScriptEventType.AUDIO_EVENT;
134                    newButton = audioButton;
135                    break;
136                case 'c':
137                    currentEventType = ScriptEventType.CAD_EVENT;
138                    newButton = cadButton;
139                    break;
140                case 'v':
141                    currentEventType = ScriptEventType.CCTV_EVENT;
142                    newButton = cctvButton;
143                    break;
144                case 'h':
145                    currentEventType = ScriptEventType.CHP_RADIO_EVENT;
146                    newButton = chpRadioButton;
147                    break;
148                case 'p':
149                    currentEventType = ScriptEventType.PARAMICS_EVENT;
150                    newButton = paramicsButton;
151                    break;
152                case 'o':
153                    currentEventType = ScriptEventType.TOW_EVENT;
154                    newButton = towButton;
155                    break;
156                case 'n':
157                    currentEventType = ScriptEventType.UNIT_EVENT;
158                    newButton = unitButton;
159                    break;
160                case 'w':
161                    currentEventType = ScriptEventType.WITNESS_EVENT;
162                    newButton = witnessButton;
163                    break;
164                case 'm':
165                    currentEventType = ScriptEventType.MAINTENANCE_RADIO_EVENT;
166                    newButton = maintenanceRadioButton;
167                    break;
168                case 't':
169                    currentEventType = ScriptEventType.TMT_RADIO_EVENT;
170                    newButton = tmtRadioButton;
171                    break;
172                case 'e':
173                    currentEventType = ScriptEventType.TELEPHONE_EVENT;
174                    newButton = telephoneButton;
175                    break;
176                case 'a':
177                    currentEventType = ScriptEventType.ATMS_EVAL_EVENT;
178                    newButton = atmsEvalButton;
179                    break;
180                case 'l':
181                    currentEventType = ScriptEventType.ACTIVITY_LOG_EVAL_EVENT;
182                    newButton = activityLogEvalButton;
183                    break;
184                case 'd':
185                    currentEventType = ScriptEventType.CAD_EVAL_EVENT;
186                    newButton = cadEvalButton;
187                    break;
188                case 's':
189                    currentEventType = ScriptEventType.CMS_EVAL_EVENT;
190                    newButton = cmsEvalButton;
191                    break;
192                case 'f':
193                    currentEventType = ScriptEventType.FACILITATOR_EVAL_EVENT;
194                    newButton = facilitatorEvalButton;
195                    break;
196                case 'r':
197                    currentEventType = ScriptEventType.RADIO_EVAL_EVENT;
198                    newButton = radioEvalButton;
199                    break;
200                default:
201                    newButton = lastButton;
202            }
203
204            if (e.getKeyCode() == KeyEvent.VK_ESCAPE)
205            {
206                currentEventType = null;
207                newButton = selectButton;
208            }
209
210            if (newButton != null)
211            {
212                newButton.setSelected(true);
213            }
214
215            repaint();
216        }
217
218        /**
219         * Take no action upon key release.
220         *
221         * @param e the key event
222         */
223        @Override
224        public void keyReleased(KeyEvent e)
225        {
226        }
227
228        /**
229         * Take no action upon key release.
230         *
231         * @param e the key event
232         */
233        @Override
234        public void keyTyped(KeyEvent e)
235        {
236        }
237    }
238
239    /**
240     * Constructor. Prep new script model, initialize the GUI, and add listeners
241     * for all buttons.
242     */
243    public IncidentEditorFrame(ScriptIncident theIncident)
244    {
245        this.theIncident = theIncident;
246        initComponents();
247        this.update(null, theIncident);
248        selectButton.addKeyListener(new TimelineKeyListener());
249        cadButton.addKeyListener(new TimelineKeyListener());
250        cctvButton.addKeyListener(new TimelineKeyListener());
251        chpRadioButton.addKeyListener(new TimelineKeyListener());
252        paramicsButton.addKeyListener(new TimelineKeyListener());
253        towButton.addKeyListener(new TimelineKeyListener());
254        unitButton.addKeyListener(new TimelineKeyListener());
255        witnessButton.addKeyListener(new TimelineKeyListener());
256        maintenanceRadioButton.addKeyListener(new TimelineKeyListener());
257        tmtRadioButton.addKeyListener(new TimelineKeyListener());
258        telephoneButton.addKeyListener(new TimelineKeyListener());
259        atmsEvalButton.addKeyListener(new TimelineKeyListener());
260        activityLogEvalButton.addKeyListener(new TimelineKeyListener());
261        cadEvalButton.addKeyListener(new TimelineKeyListener());
262        cmsEvalButton.addKeyListener(new TimelineKeyListener());
263        facilitatorEvalButton.addKeyListener(new TimelineKeyListener());
264        radioEvalButton.addKeyListener(new TimelineKeyListener());
265
266        // Hack to refresh the zoom
267        zoomSlider.setValue(zoomSlider.getValue() - 1);
268        zoomSlider.setValue(zoomSlider.getValue() + 1);
269
270        // Set listener for scroll pane
271        AdjustmentListener listener = new MyAdjustmentListener();
272        timelinesScrollPane.getHorizontalScrollBar().addAdjustmentListener(listener);
273        timelinesScrollPane.getVerticalScrollBar().addAdjustmentListener(listener);
274
275        // Button list
276        eventButtons = new ArrayList<JButton>();
277        eventButtons.add(maintenanceRadioButton);
278        eventButtons.add(tmtRadioButton);
279        eventButtons.add(telephoneButton);
280        eventButtons.add(paramicsButton);
281        eventButtons.add(towButton);
282        eventButtons.add(witnessButton);
283        eventButtons.add(unitButton);
284        eventButtons.add(audioButton);
285        eventButtons.add(cadButton);
286        eventButtons.add(cctvButton);
287        eventButtons.add(chpRadioButton);
288        eventButtons.add(selectButton);
289        eventButtons.add(cmsEvalButton);
290        eventButtons.add(atmsEvalButton);
291        eventButtons.add(cadEvalButton);
292        eventButtons.add(activityLogEvalButton);
293        eventButtons.add(facilitatorEvalButton);
294        eventButtons.add(radioEvalButton);
295    }
296
297    /**
298     * Update the GUI to reflect the model. If the script changed, update all
299     * the incident panels. If a timeslice changed, add any new events to the
300     * model. If an incident gained focus, update the incident info screen to
301     * display its details.
302     *
303     * @param o The observed object
304     * @param arg Either the script model or an incident event, depending on who
305     * called this update
306     */
307    @Override
308    public void update(Observable o, Object arg)
309    {
310        if (arg instanceof ScriptIncident)
311        {
312            theIncident = (ScriptIncident) arg;
313           
314            timelineTickPanel.update(theIncident);
315            timeStampPanel.update(theIncident);
316
317            incidentTimelinePanel1.timelinePanelUpdate(theIncident);
318
319            incidentNumberPanel1.update(theIncident);
320
321            /**
322             * DefaultComboBoxModel model = new DefaultComboBoxModel(); for
323             * (ScriptIncident i : script.incidents) { if (i != null)
324             * model.addElement(i); } gotoIncident.setModel(model);*
325             */
326            this.setPreferredSize(this.getSize());
327            pack();
328        }
329        else if (arg instanceof SliceChangedEvent)
330        {
331            TimeSlice slice = ((SliceChangedEvent) arg).slice;
332
333            DefaultListModel model = new DefaultListModel();
334            for (I_ScriptEvent e : slice.events)
335            {
336                model.addElement(e);
337            }
338            scriptEventsList.setModel(model);
339        }
340        else if (arg instanceof IncidentFocusedEvent)
341        {
342            ScriptIncident i = ((IncidentFocusedEvent) arg).incident;
343
344            incidentNumber.setText(Integer.toString(i.number));
345            incidentName.setText(i.name);
346            incidentDescription.setText(i.description);
347
348            //gotoIncident.setSelectedItem(i);
349        }
350        zoomSlider.setMinimum(((timelineTickPanel.getVisibleRect().width - 20)
351                * ScriptBuilderGuiConstants.HORIZONTAL_TICK_RESOLUTION)
352                / Math.max(theIncident.length, 1));
353        zoomSlider.setMaximum(zoomSlider.getMinimum() + 20);
354    }
355
356    /**
357     * This method is called from within the constructor to initialize the form.
358     * WARNING: Do NOT modify this code. The content of this method is always
359     * regenerated by the Form Editor.
360     */
361    @SuppressWarnings("unchecked")
362    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
363    private void initComponents()
364    {
365
366        eventPopupMenu = new javax.swing.JPopupMenu();
367        cadEvent = new javax.swing.JMenuItem();
368        jMenuItem2 = new javax.swing.JMenuItem();
369        radioEvent = new javax.swing.JMenuItem();
370        jMenuItem4 = new javax.swing.JMenuItem();
371        jMenuItem5 = new javax.swing.JMenuItem();
372        jMenuItem6 = new javax.swing.JMenuItem();
373        cadEventFrame = new javax.swing.JFrame();
374        jLabel5 = new javax.swing.JLabel();
375        radioEventFrame = new javax.swing.JFrame();
376        radioTypeLabel = new javax.swing.JLabel();
377        jLabel7 = new javax.swing.JLabel();
378        radioTypeComboBox = new javax.swing.JComboBox();
379        radioMessageScrollPane = new javax.swing.JScrollPane();
380        radioMessage = new javax.swing.JTextArea();
381        okButton = new javax.swing.JButton();
382        cancelButton = new javax.swing.JButton();
383        eventListPopupMenu = new javax.swing.JPopupMenu();
384        editEventList = new javax.swing.JMenuItem();
385        deleteEventList = new javax.swing.JMenuItem();
386        addNoiseFrame = new javax.swing.JFrame();
387        jLabel13 = new javax.swing.JLabel();
388        jSlider1 = new javax.swing.JSlider();
389        jSlider2 = new javax.swing.JSlider();
390        jLabel14 = new javax.swing.JLabel();
391        jSlider3 = new javax.swing.JSlider();
392        jLabel15 = new javax.swing.JLabel();
393        jTextArea1 = new javax.swing.JTextArea();
394        jSlider4 = new javax.swing.JSlider();
395        jLabel16 = new javax.swing.JLabel();
396        jSlider5 = new javax.swing.JSlider();
397        jLabel17 = new javax.swing.JLabel();
398        jButton1 = new javax.swing.JButton();
399        jButton2 = new javax.swing.JButton();
400        jLabel20 = new javax.swing.JLabel();
401        jLabel21 = new javax.swing.JLabel();
402        timelinesScrollPane = new javax.swing.JScrollPane();
403        timelineTickPanel = new scriptbuilder.gui.panels.TimelineTickPanel();
404        incidentTimelinePanel1 = new scriptbuilder.gui.panels.ScriptBuilderTimelinePanel();
405        incidentNumberPanel1 = new scriptbuilder.gui.panels.ScriptBuilderNumberPanel();
406        scriptEventsPanel = new javax.swing.JPanel();
407        scriptEventsPane = new javax.swing.JScrollPane();
408        scriptEventsList = new javax.swing.JList();
409        zoomSlider = new javax.swing.JSlider();
410        scriptEventsPanel1 = new javax.swing.JPanel();
411        jLabel2 = new javax.swing.JLabel();
412        jLabel3 = new javax.swing.JLabel();
413        jLabel4 = new javax.swing.JLabel();
414        incidentName = new javax.swing.JTextField();
415        incidentDescriptionPane = new javax.swing.JScrollPane();
416        incidentDescription = new javax.swing.JTextArea();
417        incidentNumber = new javax.swing.JTextField();
418        selectButton = new javax.swing.JButton();
419        incidentEventsPanel = new javax.swing.JPanel();
420        maintenanceRadioButton = new javax.swing.JButton();
421        tmtRadioButton = new javax.swing.JButton();
422        telephoneButton = new javax.swing.JButton();
423        unitButton = new javax.swing.JButton();
424        witnessButton = new javax.swing.JButton();
425        paramicsButton = new javax.swing.JButton();
426        towButton = new javax.swing.JButton();
427        audioButton = new javax.swing.JButton();
428        cctvButton = new javax.swing.JButton();
429        cadButton = new javax.swing.JButton();
430        chpRadioButton = new javax.swing.JButton();
431        evaluationEventsPanel = new javax.swing.JPanel();
432        atmsEvalButton = new javax.swing.JButton();
433        cmsEvalButton = new javax.swing.JButton();
434        cadEvalButton = new javax.swing.JButton();
435        facilitatorEvalButton = new javax.swing.JButton();
436        activityLogEvalButton = new javax.swing.JButton();
437        radioEvalButton = new javax.swing.JButton();
438        zoomInIcon = new javax.swing.JLabel();
439        zoomOutIcon = new javax.swing.JLabel();
440        timeStampScrollPane = new javax.swing.JScrollPane();
441        timeStampPanel = new scriptbuilder.gui.panels.TimeStampPanel();
442
443        cadEvent.setText("CAD Event");
444        cadEvent.addMouseListener(new java.awt.event.MouseAdapter()
445        {
446            public void mousePressed(java.awt.event.MouseEvent evt)
447            {
448                cadEventMousePressed(evt);
449            }
450            public void mouseReleased(java.awt.event.MouseEvent evt)
451            {
452                cadEventMouseReleased(evt);
453            }
454        });
455        eventPopupMenu.add(cadEvent);
456
457        jMenuItem2.setText("Paramics Event");
458        eventPopupMenu.add(jMenuItem2);
459
460        radioEvent.setText("Radio Event");
461        radioEvent.addMouseListener(new java.awt.event.MouseAdapter()
462        {
463            public void mousePressed(java.awt.event.MouseEvent evt)
464            {
465                radioEventMousePressed(evt);
466            }
467        });
468        eventPopupMenu.add(radioEvent);
469
470        jMenuItem4.setText("Telephone Event");
471        eventPopupMenu.add(jMenuItem4);
472
473        jMenuItem5.setText("Video Event");
474        eventPopupMenu.add(jMenuItem5);
475
476        jMenuItem6.setText("Evaluation Event");
477        eventPopupMenu.add(jMenuItem6);
478
479        cadEventFrame.setMinimumSize(new java.awt.Dimension(400, 300));
480
481        jLabel5.setText("CAD Entry");
482
483        javax.swing.GroupLayout cadEventFrameLayout = new javax.swing.GroupLayout(cadEventFrame.getContentPane());
484        cadEventFrame.getContentPane().setLayout(cadEventFrameLayout);
485        cadEventFrameLayout.setHorizontalGroup(
486            cadEventFrameLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
487            .addGroup(cadEventFrameLayout.createSequentialGroup()
488                .addContainerGap()
489                .addComponent(jLabel5, javax.swing.GroupLayout.PREFERRED_SIZE, 68, javax.swing.GroupLayout.PREFERRED_SIZE)
490                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
491        );
492        cadEventFrameLayout.setVerticalGroup(
493            cadEventFrameLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
494            .addGroup(cadEventFrameLayout.createSequentialGroup()
495                .addContainerGap()
496                .addComponent(jLabel5)
497                .addContainerGap(1357, Short.MAX_VALUE))
498        );
499
500        radioEventFrame.setTitle("Add Radio Event");
501        radioEventFrame.setMinimumSize(new java.awt.Dimension(400, 300));
502
503        radioTypeLabel.setText("Radio Type:");
504
505        jLabel7.setText("Radio Message:");
506
507        radioTypeComboBox.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "TMT", "Maintanence" }));
508
509        radioMessageScrollPane.setVerticalScrollBarPolicy(javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
510
511        radioMessage.setColumns(20);
512        radioMessage.setLineWrap(true);
513        radioMessage.setRows(5);
514        radioMessage.setWrapStyleWord(true);
515        radioMessageScrollPane.setViewportView(radioMessage);
516
517        okButton.setText("OK");
518        okButton.addActionListener(new java.awt.event.ActionListener()
519        {
520            public void actionPerformed(java.awt.event.ActionEvent evt)
521            {
522                okButtonActionPerformed(evt);
523            }
524        });
525
526        cancelButton.setText("Cancel");
527        cancelButton.addActionListener(new java.awt.event.ActionListener()
528        {
529            public void actionPerformed(java.awt.event.ActionEvent evt)
530            {
531                cancelButtonActionPerformed(evt);
532            }
533        });
534
535        javax.swing.GroupLayout radioEventFrameLayout = new javax.swing.GroupLayout(radioEventFrame.getContentPane());
536        radioEventFrame.getContentPane().setLayout(radioEventFrameLayout);
537        radioEventFrameLayout.setHorizontalGroup(
538            radioEventFrameLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
539            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, radioEventFrameLayout.createSequentialGroup()
540                .addContainerGap()
541                .addGroup(radioEventFrameLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
542                    .addComponent(radioMessageScrollPane, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 380, Short.MAX_VALUE)
543                    .addGroup(javax.swing.GroupLayout.Alignment.LEADING, radioEventFrameLayout.createSequentialGroup()
544                        .addComponent(radioTypeLabel)
545                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
546                        .addComponent(radioTypeComboBox, 0, 312, Short.MAX_VALUE))
547                    .addComponent(jLabel7, javax.swing.GroupLayout.Alignment.LEADING)
548                    .addGroup(javax.swing.GroupLayout.Alignment.LEADING, radioEventFrameLayout.createSequentialGroup()
549                        .addComponent(cancelButton)
550                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 246, Short.MAX_VALUE)
551                        .addComponent(okButton, javax.swing.GroupLayout.PREFERRED_SIZE, 69, javax.swing.GroupLayout.PREFERRED_SIZE)))
552                .addContainerGap())
553        );
554        radioEventFrameLayout.setVerticalGroup(
555            radioEventFrameLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
556            .addGroup(radioEventFrameLayout.createSequentialGroup()
557                .addContainerGap()
558                .addGroup(radioEventFrameLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
559                    .addComponent(radioTypeLabel)
560                    .addComponent(radioTypeComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
561                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
562                .addComponent(jLabel7)
563                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
564                .addComponent(radioMessageScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 198, Short.MAX_VALUE)
565                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
566                .addGroup(radioEventFrameLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
567                    .addComponent(okButton)
568                    .addComponent(cancelButton))
569                .addContainerGap())
570        );
571
572        editEventList.setText("Edit...");
573        editEventList.addActionListener(new java.awt.event.ActionListener()
574        {
575            public void actionPerformed(java.awt.event.ActionEvent evt)
576            {
577                editEventListActionPerformed(evt);
578            }
579        });
580        eventListPopupMenu.add(editEventList);
581
582        deleteEventList.setText("Delete...");
583        eventListPopupMenu.add(deleteEventList);
584
585        addNoiseFrame.setTitle("Generate Noise");
586        addNoiseFrame.setMinimumSize(new java.awt.Dimension(395, 315));
587        addNoiseFrame.setResizable(false);
588
589        jLabel13.setFont(new java.awt.Font("Tahoma", 0, 12)); // NOI18N
590        jLabel13.setText("Radio Chatter: ");
591
592        jLabel14.setFont(new java.awt.Font("Tahoma", 0, 12)); // NOI18N
593        jLabel14.setText("Lane Closures:");
594
595        jLabel15.setFont(new java.awt.Font("Tahoma", 0, 12)); // NOI18N
596        jLabel15.setText("TMCAL Logs:");
597
598        jTextArea1.setEditable(false);
599        jTextArea1.setColumns(20);
600        jTextArea1.setFont(new java.awt.Font("Tahoma", 0, 12)); // NOI18N
601        jTextArea1.setLineWrap(true);
602        jTextArea1.setRows(5);
603        jTextArea1.setText("Noise events will be randomly generated for the simulation with frequencies based on the control selections made below");
604        jTextArea1.setWrapStyleWord(true);
605        jTextArea1.setAutoscrolls(false);
606        jTextArea1.setBorder(null);
607        jTextArea1.setDisabledTextColor(new java.awt.Color(0, 0, 0));
608        jTextArea1.setFocusable(false);
609        jTextArea1.setOpaque(false);
610
611        jLabel16.setFont(new java.awt.Font("Tahoma", 0, 12)); // NOI18N
612        jLabel16.setText("Background Noise: ");
613
614        jLabel17.setFont(new java.awt.Font("Tahoma", 0, 12)); // NOI18N
615        jLabel17.setText("Minor Events:");
616
617        jButton1.setText("Cancel");
618        jButton1.addActionListener(new java.awt.event.ActionListener()
619        {
620            public void actionPerformed(java.awt.event.ActionEvent evt)
621            {
622                jButton1ActionPerformed(evt);
623            }
624        });
625
626        jButton2.setText("Generate");
627        jButton2.addActionListener(new java.awt.event.ActionListener()
628        {
629            public void actionPerformed(java.awt.event.ActionEvent evt)
630            {
631                jButton2ActionPerformed(evt);
632            }
633        });
634
635        jLabel20.setText("Least Frequent");
636
637        jLabel21.setText("Most Frequent");
638
639        javax.swing.GroupLayout addNoiseFrameLayout = new javax.swing.GroupLayout(addNoiseFrame.getContentPane());
640        addNoiseFrame.getContentPane().setLayout(addNoiseFrameLayout);
641        addNoiseFrameLayout.setHorizontalGroup(
642            addNoiseFrameLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
643            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, addNoiseFrameLayout.createSequentialGroup()
644                .addContainerGap(21, Short.MAX_VALUE)
645                .addGroup(addNoiseFrameLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
646                    .addComponent(jTextArea1, javax.swing.GroupLayout.Alignment.LEADING)
647                    .addGroup(addNoiseFrameLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
648                        .addGroup(javax.swing.GroupLayout.Alignment.LEADING, addNoiseFrameLayout.createSequentialGroup()
649                            .addComponent(jButton1)
650                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
651                            .addComponent(jButton2))
652                        .addGroup(javax.swing.GroupLayout.Alignment.LEADING, addNoiseFrameLayout.createSequentialGroup()
653                            .addGroup(addNoiseFrameLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
654                                .addGroup(addNoiseFrameLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
655                                    .addComponent(jLabel16)
656                                    .addComponent(jLabel14, javax.swing.GroupLayout.PREFERRED_SIZE, 105, javax.swing.GroupLayout.PREFERRED_SIZE)
657                                    .addComponent(jLabel15, javax.swing.GroupLayout.PREFERRED_SIZE, 105, javax.swing.GroupLayout.PREFERRED_SIZE)
658                                    .addComponent(jLabel13, javax.swing.GroupLayout.PREFERRED_SIZE, 105, javax.swing.GroupLayout.PREFERRED_SIZE))
659                                .addComponent(jLabel17, javax.swing.GroupLayout.PREFERRED_SIZE, 81, javax.swing.GroupLayout.PREFERRED_SIZE))
660                            .addGap(4, 4, 4)
661                            .addGroup(addNoiseFrameLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
662                                .addComponent(jSlider1, javax.swing.GroupLayout.PREFERRED_SIZE, 245, javax.swing.GroupLayout.PREFERRED_SIZE)
663                                .addComponent(jSlider2, javax.swing.GroupLayout.PREFERRED_SIZE, 245, javax.swing.GroupLayout.PREFERRED_SIZE)
664                                .addComponent(jSlider3, javax.swing.GroupLayout.PREFERRED_SIZE, 245, javax.swing.GroupLayout.PREFERRED_SIZE)
665                                .addComponent(jSlider5, javax.swing.GroupLayout.PREFERRED_SIZE, 245, javax.swing.GroupLayout.PREFERRED_SIZE)
666                                .addComponent(jSlider4, javax.swing.GroupLayout.PREFERRED_SIZE, 245, javax.swing.GroupLayout.PREFERRED_SIZE)
667                                .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, addNoiseFrameLayout.createSequentialGroup()
668                                    .addComponent(jLabel20)
669                                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
670                                    .addComponent(jLabel21))))))
671                .addGap(20, 20, 20))
672        );
673        addNoiseFrameLayout.setVerticalGroup(
674            addNoiseFrameLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
675            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, addNoiseFrameLayout.createSequentialGroup()
676                .addContainerGap()
677                .addComponent(jTextArea1, javax.swing.GroupLayout.DEFAULT_SIZE, 39, Short.MAX_VALUE)
678                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
679                .addGroup(addNoiseFrameLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
680                    .addComponent(jLabel21)
681                    .addComponent(jLabel20))
682                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
683                .addGroup(addNoiseFrameLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
684                    .addComponent(jLabel13, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE)
685                    .addComponent(jSlider1, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE))
686                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
687                .addGroup(addNoiseFrameLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
688                    .addComponent(jLabel14, javax.swing.GroupLayout.PREFERRED_SIZE, 28, javax.swing.GroupLayout.PREFERRED_SIZE)
689                    .addComponent(jSlider2, javax.swing.GroupLayout.PREFERRED_SIZE, 28, javax.swing.GroupLayout.PREFERRED_SIZE))
690                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
691                .addGroup(addNoiseFrameLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
692                    .addComponent(jLabel15)
693                    .addComponent(jSlider3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
694                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
695                .addGroup(addNoiseFrameLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
696                    .addComponent(jSlider4, javax.swing.GroupLayout.PREFERRED_SIZE, 29, javax.swing.GroupLayout.PREFERRED_SIZE)
697                    .addComponent(jLabel16, javax.swing.GroupLayout.PREFERRED_SIZE, 29, javax.swing.GroupLayout.PREFERRED_SIZE))
698                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
699                .addGroup(addNoiseFrameLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
700                    .addComponent(jSlider5, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
701                    .addComponent(jLabel17))
702                .addGap(18, 18, 18)
703                .addGroup(addNoiseFrameLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
704                    .addComponent(jButton1)
705                    .addComponent(jButton2))
706                .addContainerGap())
707        );
708
709        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
710        setTitle("Script Builder");
711        setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
712        setMinimumSize(new java.awt.Dimension(800, 700));
713        setPreferredSize(new java.awt.Dimension(945, 1545));
714        setSize(new java.awt.Dimension(800, 700));
715
716        timelinesScrollPane.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
717        timelinesScrollPane.setVerticalScrollBarPolicy(javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
718        timelinesScrollPane.setFocusCycleRoot(true);
719        timelinesScrollPane.setFocusTraversalPolicyProvider(true);
720        timelinesScrollPane.setPreferredSize(new java.awt.Dimension(72000, 1341));
721
722        timelineTickPanel.setMaximumSize(new java.awt.Dimension(7200, 32767));
723        timelineTickPanel.setMinimumSize(new java.awt.Dimension(7200, 0));
724        timelineTickPanel.setPreferredSize(new java.awt.Dimension(7200, 1317));
725
726        incidentTimelinePanel1.setMaximumSize(new java.awt.Dimension(32767, 100));
727        incidentTimelinePanel1.setOpaque(false);
728        incidentTimelinePanel1.setPreferredSize(new java.awt.Dimension(691, 100));
729
730        javax.swing.GroupLayout incidentTimelinePanel1Layout = new javax.swing.GroupLayout(incidentTimelinePanel1);
731        incidentTimelinePanel1.setLayout(incidentTimelinePanel1Layout);
732        incidentTimelinePanel1Layout.setHorizontalGroup(
733            incidentTimelinePanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
734            .addGap(0, 6776, Short.MAX_VALUE)
735        );
736        incidentTimelinePanel1Layout.setVerticalGroup(
737            incidentTimelinePanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
738            .addGap(0, 334, Short.MAX_VALUE)
739        );
740
741        incidentNumberPanel1.setOpaque(false);
742
743        javax.swing.GroupLayout incidentNumberPanel1Layout = new javax.swing.GroupLayout(incidentNumberPanel1);
744        incidentNumberPanel1.setLayout(incidentNumberPanel1Layout);
745        incidentNumberPanel1Layout.setHorizontalGroup(
746            incidentNumberPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
747            .addGap(0, 106, Short.MAX_VALUE)
748        );
749        incidentNumberPanel1Layout.setVerticalGroup(
750            incidentNumberPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
751            .addGap(0, 0, Short.MAX_VALUE)
752        );
753
754        javax.swing.GroupLayout timelineTickPanelLayout = new javax.swing.GroupLayout(timelineTickPanel);
755        timelineTickPanel.setLayout(timelineTickPanelLayout);
756        timelineTickPanelLayout.setHorizontalGroup(
757            timelineTickPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
758            .addGroup(timelineTickPanelLayout.createSequentialGroup()
759                .addContainerGap()
760                .addComponent(incidentNumberPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
761                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
762                .addComponent(incidentTimelinePanel1, javax.swing.GroupLayout.PREFERRED_SIZE, 6776, javax.swing.GroupLayout.PREFERRED_SIZE)
763                .addContainerGap(300, Short.MAX_VALUE))
764        );
765        timelineTickPanelLayout.setVerticalGroup(
766            timelineTickPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
767            .addGroup(timelineTickPanelLayout.createSequentialGroup()
768                .addContainerGap()
769                .addGroup(timelineTickPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
770                    .addComponent(incidentTimelinePanel1, javax.swing.GroupLayout.DEFAULT_SIZE, 334, Short.MAX_VALUE)
771                    .addComponent(incidentNumberPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
772                .addContainerGap(977, Short.MAX_VALUE))
773        );
774
775        timelinesScrollPane.setViewportView(timelineTickPanel);
776
777        scriptEventsPanel.setBorder(javax.swing.BorderFactory.createTitledBorder("Script Events"));
778
779        scriptEventsPane.setVerticalScrollBarPolicy(javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
780
781        scriptEventsList.setModel(new DefaultListModel());
782        scriptEventsList.setComponentPopupMenu(eventListPopupMenu);
783        scriptEventsPane.setViewportView(scriptEventsList);
784
785        javax.swing.GroupLayout scriptEventsPanelLayout = new javax.swing.GroupLayout(scriptEventsPanel);
786        scriptEventsPanel.setLayout(scriptEventsPanelLayout);
787        scriptEventsPanelLayout.setHorizontalGroup(
788            scriptEventsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
789            .addGroup(scriptEventsPanelLayout.createSequentialGroup()
790                .addContainerGap()
791                .addComponent(scriptEventsPane)
792                .addContainerGap())
793        );
794        scriptEventsPanelLayout.setVerticalGroup(
795            scriptEventsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
796            .addGroup(scriptEventsPanelLayout.createSequentialGroup()
797                .addComponent(scriptEventsPane, javax.swing.GroupLayout.DEFAULT_SIZE, 215, Short.MAX_VALUE)
798                .addContainerGap())
799        );
800
801        zoomSlider.setMaximum(21);
802        zoomSlider.setMinimum(5);
803        zoomSlider.setOrientation(javax.swing.JSlider.VERTICAL);
804        zoomSlider.setValue(13);
805        zoomSlider.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
806        zoomSlider.setFocusable(false);
807        zoomSlider.addChangeListener(new javax.swing.event.ChangeListener()
808        {
809            public void stateChanged(javax.swing.event.ChangeEvent evt)
810            {
811                zoomSliderStateChanged(evt);
812            }
813        });
814
815        scriptEventsPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder("Incident Information"));
816
817        jLabel2.setText("Incident Number:");
818
819        jLabel3.setText("Incident Name:");
820
821        jLabel4.setText("Incident Description:");
822
823        incidentName.setEditable(false);
824        incidentName.setText("Media");
825
826        incidentDescriptionPane.setVerticalScrollBarPolicy(javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
827
828        incidentDescription.setColumns(20);
829        incidentDescription.setEditable(false);
830        incidentDescription.setLineWrap(true);
831        incidentDescription.setRows(5);
832        incidentDescription.setText("All media message events are found in this incident.");
833        incidentDescription.setWrapStyleWord(true);
834        incidentDescriptionPane.setViewportView(incidentDescription);
835
836        incidentNumber.setEditable(false);
837        incidentNumber.setText("100");
838
839        javax.swing.GroupLayout scriptEventsPanel1Layout = new javax.swing.GroupLayout(scriptEventsPanel1);
840        scriptEventsPanel1.setLayout(scriptEventsPanel1Layout);
841        scriptEventsPanel1Layout.setHorizontalGroup(
842            scriptEventsPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
843            .addGroup(scriptEventsPanel1Layout.createSequentialGroup()
844                .addContainerGap()
845                .addGroup(scriptEventsPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
846                    .addComponent(incidentDescriptionPane, javax.swing.GroupLayout.Alignment.TRAILING)
847                    .addComponent(jLabel4)
848                    .addGroup(scriptEventsPanel1Layout.createSequentialGroup()
849                        .addGroup(scriptEventsPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
850                            .addComponent(jLabel2)
851                            .addComponent(jLabel3))
852                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
853                        .addGroup(scriptEventsPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
854                            .addComponent(incidentName)
855                            .addComponent(incidentNumber))))
856                .addContainerGap())
857        );
858        scriptEventsPanel1Layout.setVerticalGroup(
859            scriptEventsPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
860            .addGroup(scriptEventsPanel1Layout.createSequentialGroup()
861                .addGroup(scriptEventsPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
862                    .addComponent(jLabel2)
863                    .addComponent(incidentNumber, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
864                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
865                .addGroup(scriptEventsPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
866                    .addComponent(incidentName, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
867                    .addComponent(jLabel3))
868                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
869                .addComponent(jLabel4)
870                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
871                .addComponent(incidentDescriptionPane, javax.swing.GroupLayout.DEFAULT_SIZE, 125, Short.MAX_VALUE)
872                .addContainerGap())
873        );
874
875        selectButton.setToolTipText("Select");
876        selectButton.setFocusPainted(false);
877        selectButton.setIconTextGap(0);
878        selectButton.setMargin(new java.awt.Insets(2, 10, 2, 10));
879        selectButton.setPreferredSize(new java.awt.Dimension(30, 25));
880        selectButton.addActionListener(new java.awt.event.ActionListener()
881        {
882            public void actionPerformed(java.awt.event.ActionEvent evt)
883            {
884                selectButtonActionPerformed(evt);
885            }
886        });
887
888        incidentEventsPanel.setBorder(javax.swing.BorderFactory.createTitledBorder("Incident Events"));
889
890        maintenanceRadioButton.setText("Maintenance Radio");
891        maintenanceRadioButton.setToolTipText("");
892        maintenanceRadioButton.setFocusPainted(false);
893        maintenanceRadioButton.setIconTextGap(0);
894        maintenanceRadioButton.setMargin(new java.awt.Insets(2, 10, 2, 10));
895        maintenanceRadioButton.setPreferredSize(new java.awt.Dimension(30, 25));
896        maintenanceRadioButton.addActionListener(new java.awt.event.ActionListener()
897        {
898            public void actionPerformed(java.awt.event.ActionEvent evt)
899            {
900                maintenanceRadioButtonActionPerformed(evt);
901            }
902        });
903
904        tmtRadioButton.setText("TMT Radio");
905        tmtRadioButton.setToolTipText("");
906        tmtRadioButton.setFocusPainted(false);
907        tmtRadioButton.setIconTextGap(0);
908        tmtRadioButton.setMargin(new java.awt.Insets(2, 10, 2, 10));
909        tmtRadioButton.setPreferredSize(new java.awt.Dimension(30, 25));
910        tmtRadioButton.addActionListener(new java.awt.event.ActionListener()
911        {
912            public void actionPerformed(java.awt.event.ActionEvent evt)
913            {
914                tmtRadioButtonActionPerformed(evt);
915            }
916        });
917
918        telephoneButton.setText("Telephone");
919        telephoneButton.setToolTipText("");
920        telephoneButton.setFocusPainted(false);
921        telephoneButton.setIconTextGap(0);
922        telephoneButton.setMargin(new java.awt.Insets(2, 10, 2, 10));
923        telephoneButton.setPreferredSize(new java.awt.Dimension(30, 25));
924        telephoneButton.addActionListener(new java.awt.event.ActionListener()
925        {
926            public void actionPerformed(java.awt.event.ActionEvent evt)
927            {
928                telephoneButtonActionPerformed(evt);
929            }
930        });
931
932        unitButton.setText("Unit");
933        unitButton.setToolTipText("");
934        unitButton.setFocusPainted(false);
935        unitButton.setIconTextGap(0);
936        unitButton.setMargin(new java.awt.Insets(2, 10, 2, 10));
937        unitButton.setPreferredSize(new java.awt.Dimension(30, 25));
938        unitButton.addActionListener(new java.awt.event.ActionListener()
939        {
940            public void actionPerformed(java.awt.event.ActionEvent evt)
941            {
942                unitButtonActionPerformed(evt);
943            }
944        });
945
946        witnessButton.setText("Witness");
947        witnessButton.setToolTipText("");
948        witnessButton.setFocusPainted(false);
949        witnessButton.setIconTextGap(0);
950        witnessButton.setMargin(new java.awt.Insets(2, 10, 2, 10));
951        witnessButton.setPreferredSize(new java.awt.Dimension(30, 25));
952        witnessButton.addActionListener(new java.awt.event.ActionListener()
953        {
954            public void actionPerformed(java.awt.event.ActionEvent evt)
955            {
956                witnessButtonActionPerformed(evt);
957            }
958        });
959
960        paramicsButton.setText("Paramics");
961        paramicsButton.setToolTipText("");
962        paramicsButton.setFocusPainted(false);
963        paramicsButton.setIconTextGap(0);
964        paramicsButton.setMargin(new java.awt.Insets(2, 10, 2, 10));
965        paramicsButton.setPreferredSize(new java.awt.Dimension(30, 25));
966        paramicsButton.addActionListener(new java.awt.event.ActionListener()
967        {
968            public void actionPerformed(java.awt.event.ActionEvent evt)
969            {
970                paramicsButtonActionPerformed(evt);
971            }
972        });
973
974        towButton.setText("Tow");
975        towButton.setToolTipText("");
976        towButton.setFocusPainted(false);
977        towButton.setIconTextGap(0);
978        towButton.setMargin(new java.awt.Insets(2, 10, 2, 10));
979        towButton.setPreferredSize(new java.awt.Dimension(30, 25));
980        towButton.addActionListener(new java.awt.event.ActionListener()
981        {
982            public void actionPerformed(java.awt.event.ActionEvent evt)
983            {
984                towButtonActionPerformed(evt);
985            }
986        });
987
988        audioButton.setText("Audio");
989        audioButton.setToolTipText("");
990        audioButton.setFocusPainted(false);
991        audioButton.setIconTextGap(0);
992        audioButton.setMargin(new java.awt.Insets(2, 10, 2, 10));
993        audioButton.setPreferredSize(new java.awt.Dimension(30, 25));
994        audioButton.addActionListener(new java.awt.event.ActionListener()
995        {
996            public void actionPerformed(java.awt.event.ActionEvent evt)
997            {
998                audioButtonActionPerformed(evt);
999            }
1000        });
1001
1002        cctvButton.setText("CCTV");
1003        cctvButton.setToolTipText("");
1004        cctvButton.setFocusPainted(false);
1005        cctvButton.setIconTextGap(0);
1006        cctvButton.setMargin(new java.awt.Insets(2, 10, 2, 10));
1007        cctvButton.setPreferredSize(new java.awt.Dimension(30, 25));
1008        cctvButton.addActionListener(new java.awt.event.ActionListener()
1009        {
1010            public void actionPerformed(java.awt.event.ActionEvent evt)
1011            {
1012                cctvButtonActionPerformed(evt);
1013            }
1014        });
1015
1016        cadButton.setText("CAD");
1017        cadButton.setToolTipText("");
1018        cadButton.setFocusPainted(false);
1019        cadButton.setIconTextGap(0);
1020        cadButton.setMargin(new java.awt.Insets(2, 10, 2, 10));
1021        cadButton.setPreferredSize(new java.awt.Dimension(30, 25));
1022        cadButton.addActionListener(new java.awt.event.ActionListener()
1023        {
1024            public void actionPerformed(java.awt.event.ActionEvent evt)
1025            {
1026                cadButtonActionPerformed(evt);
1027            }
1028        });
1029
1030        chpRadioButton.setText("CHP Radio");
1031        chpRadioButton.setToolTipText("");
1032        chpRadioButton.setFocusPainted(false);
1033        chpRadioButton.setIconTextGap(0);
1034        chpRadioButton.setMargin(new java.awt.Insets(2, 10, 2, 10));
1035        chpRadioButton.setPreferredSize(new java.awt.Dimension(30, 25));
1036        chpRadioButton.addActionListener(new java.awt.event.ActionListener()
1037        {
1038            public void actionPerformed(java.awt.event.ActionEvent evt)
1039            {
1040                chpRadioButtonActionPerformed(evt);
1041            }
1042        });
1043
1044        javax.swing.GroupLayout incidentEventsPanelLayout = new javax.swing.GroupLayout(incidentEventsPanel);
1045        incidentEventsPanel.setLayout(incidentEventsPanelLayout);
1046        incidentEventsPanelLayout.setHorizontalGroup(
1047            incidentEventsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
1048            .addGroup(incidentEventsPanelLayout.createSequentialGroup()
1049                .addContainerGap()
1050                .addGroup(incidentEventsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
1051                    .addGroup(incidentEventsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
1052                        .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, incidentEventsPanelLayout.createSequentialGroup()
1053                            .addComponent(maintenanceRadioButton, javax.swing.GroupLayout.PREFERRED_SIZE, 120, javax.swing.GroupLayout.PREFERRED_SIZE)
1054                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
1055                            .addComponent(tmtRadioButton, javax.swing.GroupLayout.PREFERRED_SIZE, 120, javax.swing.GroupLayout.PREFERRED_SIZE)
1056                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
1057                            .addComponent(telephoneButton, javax.swing.GroupLayout.PREFERRED_SIZE, 120, javax.swing.GroupLayout.PREFERRED_SIZE)
1058                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
1059                            .addComponent(paramicsButton, javax.swing.GroupLayout.PREFERRED_SIZE, 120, javax.swing.GroupLayout.PREFERRED_SIZE))
1060                        .addGroup(incidentEventsPanelLayout.createSequentialGroup()
1061                            .addComponent(towButton, javax.swing.GroupLayout.PREFERRED_SIZE, 120, javax.swing.GroupLayout.PREFERRED_SIZE)
1062                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
1063                            .addComponent(unitButton, javax.swing.GroupLayout.PREFERRED_SIZE, 120, javax.swing.GroupLayout.PREFERRED_SIZE)
1064                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
1065                            .addComponent(witnessButton, javax.swing.GroupLayout.PREFERRED_SIZE, 120, javax.swing.GroupLayout.PREFERRED_SIZE)
1066                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
1067                            .addComponent(audioButton, javax.swing.GroupLayout.PREFERRED_SIZE, 120, javax.swing.GroupLayout.PREFERRED_SIZE)))
1068                    .addGroup(incidentEventsPanelLayout.createSequentialGroup()
1069                        .addComponent(cadButton, javax.swing.GroupLayout.PREFERRED_SIZE, 120, javax.swing.GroupLayout.PREFERRED_SIZE)
1070                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
1071                        .addComponent(cctvButton, javax.swing.GroupLayout.PREFERRED_SIZE, 120, javax.swing.GroupLayout.PREFERRED_SIZE)
1072                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
1073                        .addComponent(chpRadioButton, javax.swing.GroupLayout.PREFERRED_SIZE, 120, javax.swing.GroupLayout.PREFERRED_SIZE)))
1074                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
1075        );
1076        incidentEventsPanelLayout.setVerticalGroup(
1077            incidentEventsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
1078            .addGroup(incidentEventsPanelLayout.createSequentialGroup()
1079                .addGroup(incidentEventsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
1080                    .addGroup(incidentEventsPanelLayout.createSequentialGroup()
1081                        .addGroup(incidentEventsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
1082                            .addComponent(maintenanceRadioButton, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE)
1083                            .addComponent(tmtRadioButton, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE)
1084                            .addComponent(telephoneButton, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE))
1085                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
1086                        .addGroup(incidentEventsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
1087                            .addComponent(towButton, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE)
1088                            .addComponent(unitButton, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE)
1089                            .addComponent(witnessButton, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE)
1090                            .addComponent(audioButton, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE)))
1091                    .addComponent(paramicsButton, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE))
1092                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
1093                .addGroup(incidentEventsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
1094                    .addGroup(incidentEventsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
1095                        .addComponent(cctvButton, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE)
1096                        .addComponent(chpRadioButton, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE))
1097                    .addComponent(cadButton, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE)))
1098        );
1099
1100        evaluationEventsPanel.setBorder(javax.swing.BorderFactory.createTitledBorder("Evaluation Events"));
1101
1102        atmsEvalButton.setText("ATMS Evaluation");
1103        atmsEvalButton.setToolTipText("");
1104        atmsEvalButton.setFocusPainted(false);
1105        atmsEvalButton.setIconTextGap(0);
1106        atmsEvalButton.setMargin(new java.awt.Insets(2, 10, 2, 10));
1107        atmsEvalButton.setPreferredSize(new java.awt.Dimension(30, 25));
1108        atmsEvalButton.addActionListener(new java.awt.event.ActionListener()
1109        {
1110            public void actionPerformed(java.awt.event.ActionEvent evt)
1111            {
1112                atmsEvalButtonActionPerformed(evt);
1113            }
1114        });
1115
1116        cmsEvalButton.setText("CMS Evaluation");
1117        cmsEvalButton.setToolTipText("");
1118        cmsEvalButton.setFocusPainted(false);
1119        cmsEvalButton.setIconTextGap(0);
1120        cmsEvalButton.setMargin(new java.awt.Insets(2, 10, 2, 10));
1121        cmsEvalButton.setPreferredSize(new java.awt.Dimension(30, 25));
1122        cmsEvalButton.addActionListener(new java.awt.event.ActionListener()
1123        {
1124            public void actionPerformed(java.awt.event.ActionEvent evt)
1125            {
1126                cmsEvalButtonActionPerformed(evt);
1127            }
1128        });
1129
1130        cadEvalButton.setText("CAD Evaluation");
1131        cadEvalButton.setToolTipText("");
1132        cadEvalButton.setFocusPainted(false);
1133        cadEvalButton.setIconTextGap(0);
1134        cadEvalButton.setMargin(new java.awt.Insets(2, 10, 2, 10));
1135        cadEvalButton.setPreferredSize(new java.awt.Dimension(30, 25));
1136        cadEvalButton.addActionListener(new java.awt.event.ActionListener()
1137        {
1138            public void actionPerformed(java.awt.event.ActionEvent evt)
1139            {
1140                cadEvalButtonActionPerformed(evt);
1141            }
1142        });
1143
1144        facilitatorEvalButton.setText("Facilitator Evaluation");
1145        facilitatorEvalButton.setToolTipText("");
1146        facilitatorEvalButton.setFocusPainted(false);
1147        facilitatorEvalButton.setIconTextGap(0);
1148        facilitatorEvalButton.setMargin(new java.awt.Insets(2, 10, 2, 10));
1149        facilitatorEvalButton.setPreferredSize(new java.awt.Dimension(30, 25));
1150        facilitatorEvalButton.addActionListener(new java.awt.event.ActionListener()
1151        {
1152            public void actionPerformed(java.awt.event.ActionEvent evt)
1153            {
1154                facilitatorEvalButtonActionPerformed(evt);
1155            }
1156        });
1157
1158        activityLogEvalButton.setText("Activity Log Evaluation");
1159        activityLogEvalButton.setToolTipText("");
1160        activityLogEvalButton.setFocusPainted(false);
1161        activityLogEvalButton.setIconTextGap(0);
1162        activityLogEvalButton.setMargin(new java.awt.Insets(2, 10, 2, 10));
1163        activityLogEvalButton.setPreferredSize(new java.awt.Dimension(30, 25));
1164        activityLogEvalButton.addActionListener(new java.awt.event.ActionListener()
1165        {
1166            public void actionPerformed(java.awt.event.ActionEvent evt)
1167            {
1168                activityLogEvalButtonActionPerformed(evt);
1169            }
1170        });
1171
1172        radioEvalButton.setText("Radio Evaluation");
1173        radioEvalButton.setToolTipText("");
1174        radioEvalButton.setFocusPainted(false);
1175        radioEvalButton.setIconTextGap(0);
1176        radioEvalButton.setMargin(new java.awt.Insets(2, 10, 2, 10));
1177        radioEvalButton.setPreferredSize(new java.awt.Dimension(30, 25));
1178        radioEvalButton.addActionListener(new java.awt.event.ActionListener()
1179        {
1180            public void actionPerformed(java.awt.event.ActionEvent evt)
1181            {
1182                radioEvalButtonActionPerformed(evt);
1183            }
1184        });
1185
1186        javax.swing.GroupLayout evaluationEventsPanelLayout = new javax.swing.GroupLayout(evaluationEventsPanel);
1187        evaluationEventsPanel.setLayout(evaluationEventsPanelLayout);
1188        evaluationEventsPanelLayout.setHorizontalGroup(
1189            evaluationEventsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
1190            .addGroup(evaluationEventsPanelLayout.createSequentialGroup()
1191                .addContainerGap()
1192                .addGroup(evaluationEventsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
1193                    .addGroup(evaluationEventsPanelLayout.createSequentialGroup()
1194                        .addComponent(atmsEvalButton, javax.swing.GroupLayout.PREFERRED_SIZE, 140, javax.swing.GroupLayout.PREFERRED_SIZE)
1195                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
1196                        .addComponent(activityLogEvalButton, javax.swing.GroupLayout.PREFERRED_SIZE, 140, javax.swing.GroupLayout.PREFERRED_SIZE))
1197                    .addGroup(evaluationEventsPanelLayout.createSequentialGroup()
1198                        .addComponent(cmsEvalButton, javax.swing.GroupLayout.PREFERRED_SIZE, 140, javax.swing.GroupLayout.PREFERRED_SIZE)
1199                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
1200                        .addComponent(facilitatorEvalButton, javax.swing.GroupLayout.PREFERRED_SIZE, 140, javax.swing.GroupLayout.PREFERRED_SIZE))
1201                    .addGroup(evaluationEventsPanelLayout.createSequentialGroup()
1202                        .addComponent(cadEvalButton, javax.swing.GroupLayout.PREFERRED_SIZE, 140, javax.swing.GroupLayout.PREFERRED_SIZE)
1203                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
1204                        .addComponent(radioEvalButton, javax.swing.GroupLayout.PREFERRED_SIZE, 140, javax.swing.GroupLayout.PREFERRED_SIZE)))
1205                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
1206        );
1207        evaluationEventsPanelLayout.setVerticalGroup(
1208            evaluationEventsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
1209            .addGroup(evaluationEventsPanelLayout.createSequentialGroup()
1210                .addGroup(evaluationEventsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
1211                    .addComponent(cmsEvalButton, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE)
1212                    .addComponent(facilitatorEvalButton, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE))
1213                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
1214                .addGroup(evaluationEventsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
1215                    .addComponent(atmsEvalButton, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE)
1216                    .addComponent(activityLogEvalButton, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE))
1217                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
1218                .addGroup(evaluationEventsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
1219                    .addComponent(cadEvalButton, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE)
1220                    .addComponent(radioEvalButton, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE)))
1221        );
1222
1223        zoomInIcon.setIcon(new javax.swing.ImageIcon(getClass().getResource("/images/ZoomIn.png"))); // NOI18N
1224        zoomInIcon.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
1225        zoomInIcon.addMouseListener(new java.awt.event.MouseAdapter()
1226        {
1227            public void mouseClicked(java.awt.event.MouseEvent evt)
1228            {
1229                zoomInIconMouseClicked(evt);
1230            }
1231        });
1232
1233        zoomOutIcon.setIcon(new javax.swing.ImageIcon(getClass().getResource("/images/ZoomOut.png"))); // NOI18N
1234        zoomOutIcon.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
1235        zoomOutIcon.addMouseListener(new java.awt.event.MouseAdapter()
1236        {
1237            public void mouseClicked(java.awt.event.MouseEvent evt)
1238            {
1239                zoomOutIconMouseClicked(evt);
1240            }
1241        });
1242
1243        timeStampScrollPane.setBorder(null);
1244        timeStampScrollPane.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
1245        timeStampScrollPane.setVerticalScrollBarPolicy(javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER);
1246
1247        javax.swing.GroupLayout timeStampPanelLayout = new javax.swing.GroupLayout(timeStampPanel);
1248        timeStampPanel.setLayout(timeStampPanelLayout);
1249        timeStampPanelLayout.setHorizontalGroup(
1250            timeStampPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
1251            .addGap(0, 1032, Short.MAX_VALUE)
1252        );
1253        timeStampPanelLayout.setVerticalGroup(
1254            timeStampPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
1255            .addGap(0, 100, Short.MAX_VALUE)
1256        );
1257
1258        timeStampScrollPane.setViewportView(timeStampPanel);
1259
1260        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
1261        getContentPane().setLayout(layout);
1262        layout.setHorizontalGroup(
1263            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
1264            .addGroup(layout.createSequentialGroup()
1265                .addContainerGap()
1266                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
1267                    .addComponent(timelinesScrollPane, 0, 0, Short.MAX_VALUE)
1268                    .addComponent(timeStampScrollPane)
1269                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
1270                        .addComponent(scriptEventsPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
1271                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
1272                        .addComponent(scriptEventsPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
1273                    .addGroup(layout.createSequentialGroup()
1274                        .addComponent(selectButton, javax.swing.GroupLayout.PREFERRED_SIZE, 40, javax.swing.GroupLayout.PREFERRED_SIZE)
1275                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
1276                        .addComponent(incidentEventsPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
1277                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
1278                        .addComponent(evaluationEventsPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
1279                        .addGap(18, 18, 18)
1280                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
1281                            .addComponent(zoomInIcon)
1282                            .addComponent(zoomSlider, javax.swing.GroupLayout.PREFERRED_SIZE, 31, javax.swing.GroupLayout.PREFERRED_SIZE)
1283                            .addComponent(zoomOutIcon))))
1284                .addContainerGap())
1285        );
1286        layout.setVerticalGroup(
1287            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
1288            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
1289                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
1290                    .addGroup(layout.createSequentialGroup()
1291                        .addContainerGap()
1292                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
1293                            .addComponent(evaluationEventsPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
1294                            .addComponent(incidentEventsPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
1295                            .addGroup(layout.createSequentialGroup()
1296                                .addGap(47, 47, 47)
1297                                .addComponent(selectButton, javax.swing.GroupLayout.PREFERRED_SIZE, 55, javax.swing.GroupLayout.PREFERRED_SIZE))))
1298                    .addGroup(layout.createSequentialGroup()
1299                        .addGap(20, 20, 20)
1300                        .addComponent(zoomInIcon)
1301                        .addGap(1, 1, 1)
1302                        .addComponent(zoomSlider, javax.swing.GroupLayout.PREFERRED_SIZE, 69, javax.swing.GroupLayout.PREFERRED_SIZE)
1303                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
1304                        .addComponent(zoomOutIcon)))
1305                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
1306                .addComponent(timeStampScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE)
1307                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
1308                .addComponent(timelinesScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 324, javax.swing.GroupLayout.PREFERRED_SIZE)
1309                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
1310                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
1311                    .addComponent(scriptEventsPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
1312                    .addComponent(scriptEventsPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
1313                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
1314        );
1315
1316        pack();
1317    }// </editor-fold>//GEN-END:initComponents
1318
1319    /**
1320     * Scale the timeline width based on zoom slider position.
1321     *
1322     * @param evt the state change event
1323     */
1324    private void zoomSliderStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_zoomSliderStateChanged
1325        ScriptBuilderGuiConstants.PIXEL_WIDTH_PER_HORIZONTAL_TICK = zoomSlider.getValue() * 2;
1326        this.update(null, theIncident);
1327        pack();
1328        repaint();
1329    }//GEN-LAST:event_zoomSliderStateChanged
1330
1331    private void cadEventMousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_cadEventMousePressed
1332    }//GEN-LAST:event_cadEventMousePressed
1333
1334    private void radioEventMousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_radioEventMousePressed
1335    }//GEN-LAST:event_radioEventMousePressed
1336
1337    private void cadEventMouseReleased(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_cadEventMouseReleased
1338    }//GEN-LAST:event_cadEventMouseReleased
1339
1340    private void okButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_okButtonActionPerformed
1341    }//GEN-LAST:event_okButtonActionPerformed
1342
1343    /**
1344     * If cancel button is pressed, close radio event editor
1345     *
1346     * @param evt the button press event
1347     */
1348    private void cancelButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cancelButtonActionPerformed
1349        radioMessage.setText("");
1350        radioTypeComboBox.setSelectedIndex(0);
1351        radioEventFrame.setVisible(false);
1352    }//GEN-LAST:event_cancelButtonActionPerformed
1353
1354    private void editEventListActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_editEventListActionPerformed
1355    }//GEN-LAST:event_editEventListActionPerformed
1356
1357    /**
1358     * Deselects new event type upon click of blank "select" button.
1359     *
1360     * @param evt the button press event
1361     */
1362    private void selectButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_selectButtonActionPerformed
1363        currentEventType = null;
1364        for (JButton eb : eventButtons)
1365        {
1366            eb.setSelected(false);
1367        }
1368        selectButton.setSelected(true);
1369    }//GEN-LAST:event_selectButtonActionPerformed
1370
1371    /**
1372     * Selects CAD_EVENT as the current type of new event, upon click of "CAD
1373     * Event" button.
1374     *
1375     * @param evt the button press event
1376     */
1377    private void cadButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cadButtonActionPerformed
1378        currentEventType = ScriptEventType.CAD_EVENT;
1379        for (JButton eb : eventButtons)
1380        {
1381            eb.setSelected(false);
1382        }
1383        cadButton.setSelected(true);
1384    }//GEN-LAST:event_cadButtonActionPerformed
1385
1386    /**
1387     * Selects CCTV_EVENT as the current type of new event, upon click of "CCTV
1388     * Event" button.
1389     *
1390     * @param evt the button press event
1391     */
1392    private void cctvButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cctvButtonActionPerformed
1393        currentEventType = ScriptEventType.CCTV_EVENT;
1394        for (JButton eb : eventButtons)
1395        {
1396            eb.setSelected(false);
1397        }
1398        cctvButton.setSelected(true);
1399    }//GEN-LAST:event_cctvButtonActionPerformed
1400
1401    /**
1402     * Selects CHP_RADIO_EVENT as the current type of new event, upon click of
1403     * "CHP Radio Event" button.
1404     *
1405     * @param evt the button press event
1406     */
1407    private void chpRadioButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_chpRadioButtonActionPerformed
1408        currentEventType = ScriptEventType.CHP_RADIO_EVENT;
1409        for (JButton eb : eventButtons)
1410        {
1411            eb.setSelected(false);
1412        }
1413        chpRadioButton.setSelected(true);
1414    }//GEN-LAST:event_chpRadioButtonActionPerformed
1415
1416    /**
1417     * Hides the noise generation screen upon click of the "Cancel" button.
1418     *
1419     * @param evt the button press event
1420     */
1421    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed
1422        addNoiseFrame.setVisible(false);
1423    }//GEN-LAST:event_jButton1ActionPerformed
1424
1425    /**
1426     * Generates random noise upon click of the "OK" button, then hides the
1427     * noise generation screen.
1428     *
1429     * @param evt the button press event
1430     */
1431    private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton2ActionPerformed
1432        Random rng = new Random();
1433        ScriptEventType[] eventTypes = ScriptEventType.values();
1434
1435        /* For prototyping purpose, ignore the sliders and average their values */
1436        int total = jSlider1.getValue() + jSlider2.getValue() + jSlider3.getValue() + jSlider5.getValue() + jSlider4.getValue();
1437        total /= 5;
1438
1439        for (int i = 0; i < theIncident.slices.size(); i++)
1440        {
1441            theIncident.slices.get(i).events.clear();
1442        }
1443
1444        for (int i = 0; i < total; i++)
1445        {
1446            int n = rng.nextInt();
1447            int s = rng.nextInt();
1448            int e = rng.nextInt();
1449            if (n < 0)
1450            {
1451                n *= -1;
1452            }
1453            if (s < 0)
1454            {
1455                s *= -1;
1456            }
1457            if (e < 0)
1458            {
1459                e *= -1;
1460            }
1461
1462            theIncident.slices.get(s % (theIncident.slices.size())).addEvent(ScriptEvent.factoryByType(eventTypes[e % eventTypes.length]));
1463        }
1464
1465        addNoiseFrame.setVisible(false);
1466
1467        update(null, theIncident);
1468}//GEN-LAST:event_jButton2ActionPerformed
1469
1470    /**
1471     * Selects WITNESS_EVENT as the current type of new event, upon click of
1472     * "Witness Event" button.
1473     *
1474     * @param evt the button press event
1475     */
1476    private void witnessButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_witnessButtonActionPerformed
1477        currentEventType = ScriptEventType.WITNESS_EVENT;
1478        for (JButton eb : eventButtons)
1479        {
1480            eb.setSelected(false);
1481        }
1482        witnessButton.setSelected(true);
1483    }//GEN-LAST:event_witnessButtonActionPerformed
1484
1485    /**
1486     * Selects UNIT_EVENT as the current type of new event, upon click of "Unit
1487     * Event" button.
1488     *
1489     * @param evt the button press event
1490     */
1491    private void unitButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_unitButtonActionPerformed
1492        currentEventType = ScriptEventType.UNIT_EVENT;
1493        for (JButton eb : eventButtons)
1494        {
1495            eb.setSelected(false);
1496        }
1497        unitButton.setSelected(true);
1498    }//GEN-LAST:event_unitButtonActionPerformed
1499
1500    /**
1501     * Selects TOW_EVENT as the current type of new event, upon click of "TOW
1502     * Event" button.
1503     *
1504     * @param evt the button press event
1505     */
1506    private void towButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_towButtonActionPerformed
1507        currentEventType = ScriptEventType.TOW_EVENT;
1508        for (JButton eb : eventButtons)
1509        {
1510            eb.setSelected(false);
1511        }
1512        towButton.setSelected(true);
1513    }//GEN-LAST:event_towButtonActionPerformed
1514
1515    /**
1516     * Selects PARAMICS_EVENT as the current type of new event, upon click of
1517     * "Paramics Event" button.
1518     *
1519     * @param evt the button press event
1520     */
1521    private void paramicsButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_paramicsButtonActionPerformed
1522        currentEventType = ScriptEventType.PARAMICS_EVENT;
1523        for (JButton eb : eventButtons)
1524        {
1525            eb.setSelected(false);
1526        }
1527        paramicsButton.setSelected(true);
1528    }//GEN-LAST:event_paramicsButtonActionPerformed
1529
1530    /**
1531     * Selects MAINTENANCE_RADIO_EVENT as the current type of new event, upon
1532     * click of "Maintenance Radio Event" button.
1533     *
1534     * @param evt the button press event
1535     */
1536    private void maintenanceRadioButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_maintenanceRadioButtonActionPerformed
1537        currentEventType = ScriptEventType.MAINTENANCE_RADIO_EVENT;
1538        for (JButton eb : eventButtons)
1539        {
1540            eb.setSelected(false);
1541        }
1542        maintenanceRadioButton.setSelected(true);
1543    }//GEN-LAST:event_maintenanceRadioButtonActionPerformed
1544
1545    /**
1546     * Selects ATMS_EVAL_EVENT as the current type of new event, upon click of
1547     * "ATMS Evaluation Event" button.
1548     *
1549     * @param evt the button press event
1550     */
1551    private void atmsEvalButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_atmsEvalButtonActionPerformed
1552        currentEventType = ScriptEventType.ATMS_EVAL_EVENT;
1553        for (JButton eb : eventButtons)
1554        {
1555            eb.setSelected(false);
1556        }
1557        atmsEvalButton.setSelected(true);
1558    }//GEN-LAST:event_atmsEvalButtonActionPerformed
1559
1560    /**
1561     * Selects TELEPHONE_EVENT as the current type of new event, upon click of
1562     * "Telephone Event" button.
1563     *
1564     * @param evt the button press event
1565     */
1566    private void telephoneButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_telephoneButtonActionPerformed
1567        currentEventType = ScriptEventType.TELEPHONE_EVENT;
1568        for (JButton eb : eventButtons)
1569        {
1570            eb.setSelected(false);
1571        }
1572        telephoneButton.setSelected(true);
1573    }//GEN-LAST:event_telephoneButtonActionPerformed
1574
1575    /**
1576     * Selects TMT_RADIO_EVENT as the current type of new event, upon click of
1577     * "TMT Radio Event" button.
1578     *
1579     * @param evt the button press event
1580     */
1581    private void tmtRadioButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_tmtRadioButtonActionPerformed
1582        currentEventType = ScriptEventType.TMT_RADIO_EVENT;
1583        for (JButton eb : eventButtons)
1584        {
1585            eb.setSelected(false);
1586        }
1587        tmtRadioButton.setSelected(true);
1588    }//GEN-LAST:event_tmtRadioButtonActionPerformed
1589
1590    /**
1591     * Selects CMS_EVAL_EVENT as the current type of new event, upon click of
1592     * "CMS Evaluation Event" button.
1593     *
1594     * @param evt the button press event
1595     */
1596    private void cmsEvalButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cmsEvalButtonActionPerformed
1597        currentEventType = ScriptEventType.CMS_EVAL_EVENT;
1598        for (JButton eb : eventButtons)
1599        {
1600            eb.setSelected(false);
1601        }
1602        cmsEvalButton.setSelected(true);
1603    }//GEN-LAST:event_cmsEvalButtonActionPerformed
1604
1605    /**
1606     * Selects CAD_EVAL_EVENT as the current type of new event, upon click of
1607     * "CAD Evaluation Event" button.
1608     *
1609     * @param evt the button press event
1610     */
1611    private void cadEvalButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cadEvalButtonActionPerformed
1612        currentEventType = ScriptEventType.CAD_EVAL_EVENT;
1613        for (JButton eb : eventButtons)
1614        {
1615            eb.setSelected(false);
1616        }
1617        cadEvalButton.setSelected(true);
1618    }//GEN-LAST:event_cadEvalButtonActionPerformed
1619
1620    /**
1621     * Selects ACTIVITY_LOG_EVAL_EVENT as the current type of new event, upon
1622     * click of "Activity Log Evaluation Event" button.
1623     *
1624     * @param evt the button press event
1625     */
1626    private void activityLogEvalButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_activityLogEvalButtonActionPerformed
1627        currentEventType = ScriptEventType.ACTIVITY_LOG_EVAL_EVENT;
1628        for (JButton eb : eventButtons)
1629        {
1630            eb.setSelected(false);
1631        }
1632        activityLogEvalButton.setSelected(true);
1633    }//GEN-LAST:event_activityLogEvalButtonActionPerformed
1634
1635    /**
1636     * Selects RADIO_EVAL_EVENT as the current type of new event, upon click of
1637     * "Radio Evaluation Event" button.
1638     *
1639     * @param evt the button press event
1640     */
1641    private void radioEvalButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_radioEvalButtonActionPerformed
1642        currentEventType = ScriptEventType.RADIO_EVAL_EVENT;
1643        for (JButton eb : eventButtons)
1644        {
1645            eb.setSelected(false);
1646        }
1647        radioEvalButton.setSelected(true);
1648    }//GEN-LAST:event_radioEvalButtonActionPerformed
1649
1650    /**
1651     * Selects FACILITATOR_EVAL_EVENT as the current type of new event, upon
1652     * click of "Facilitator Evaluation Event" button.
1653     *
1654     * @param evt the button press event
1655     */
1656    private void facilitatorEvalButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_facilitatorEvalButtonActionPerformed
1657        currentEventType = ScriptEventType.FACILITATOR_EVAL_EVENT;
1658        for (JButton eb : eventButtons)
1659        {
1660            eb.setSelected(false);
1661        }
1662        facilitatorEvalButton.setSelected(true);
1663    }//GEN-LAST:event_facilitatorEvalButtonActionPerformed
1664
1665    /**
1666     * Selects AUDIO_EVENT as the current type of new event, upon click of
1667     * "Audio Event" button.
1668     *
1669     * @param evt the button press event
1670     */
1671    private void audioButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_audioButtonActionPerformed
1672        currentEventType = ScriptEventType.AUDIO_EVENT;
1673        for (JButton eb : eventButtons)
1674        {
1675            eb.setSelected(false);
1676        }
1677        audioButton.setSelected(true);
1678    }//GEN-LAST:event_audioButtonActionPerformed
1679
1680    /**
1681     * Increases zoom level upon click of the "Zoom in" icon.
1682     *
1683     * @param evt the mouse event
1684     */
1685    private void zoomInIconMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_zoomInIconMouseClicked
1686        zoomSlider.setValue(zoomSlider.getValue() >= 21 ? 21 : zoomSlider.getValue() + 1);
1687    }//GEN-LAST:event_zoomInIconMouseClicked
1688
1689    /**
1690     * Decreases zoom level upon click of the "Zoom out" icon.
1691     *
1692     * @param evt the mouse event
1693     */
1694    private void zoomOutIconMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_zoomOutIconMouseClicked
1695        zoomSlider.setValue(zoomSlider.getValue() <= 5 ? 5 : zoomSlider.getValue() - 1);
1696    }//GEN-LAST:event_zoomOutIconMouseClicked
1697    private Color selectedColor = Color.BLACK;
1698
1699    /**
1700     * Read the version number from the application properties. The file
1701     * 'application.properties' is generated by build.xml.
1702     *
1703     * @return a version string obtained from application.properties file, or
1704     * "Version: unknown" if an IOerror prevents us from reading the file.
1705     */
1706    private String getAppVersion()
1707    {
1708        String propfilename = "/scriptbuilder/gui/application.properties";
1709        String propKey = "Application.revision";
1710        String version = "unknown";
1711        // Load the application properties (created by build.xml)
1712        try
1713        {
1714            Properties props = new Properties();
1715            props.load(this.getClass().getResourceAsStream(propfilename));
1716            version = (String) props.get(propKey);
1717        }
1718        catch (IOException ex)
1719        {
1720            Logger.getLogger("scriptbuilder.gui").log(Level.SEVERE,
1721                    "ScriptBuilderFrame.getAppVersion()."
1722                    + " IOError reading " + propfilename);
1723        }
1724        catch (NullPointerException npe)
1725        {
1726            Logger.getLogger("scriptbuilder.gui").log(Level.SEVERE,
1727                    "ScriptBuilderFrame.getAppVersion().load."
1728                    + " Missing file: " + propfilename);
1729        }
1730        return version;
1731    }
1732
1733//    /**
1734//     * Runs the script builder.
1735//     *
1736//     * @param args the command line arguments
1737//     */
1738//    public static void main(String args[])
1739//    {
1740//        try
1741//        {
1742//            UIManager.setLookAndFeel("com.sun.java.swing.plaf.gtk.GTKLookAndFeel");
1743//        }
1744//        catch (ClassNotFoundException ex)
1745//        {
1746//        }
1747//        catch (InstantiationException ex)
1748//        {
1749//        }
1750//        catch (IllegalAccessException ex)
1751//        {
1752//        }
1753//        catch (UnsupportedLookAndFeelException ex)
1754//        {
1755//        }
1756//
1757//        try
1758//        {
1759//            UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
1760//        }
1761//        catch (ClassNotFoundException ex)
1762//        {
1763//        }
1764//        catch (InstantiationException ex)
1765//        {
1766//        }
1767//        catch (IllegalAccessException ex)
1768//        {
1769//        }
1770//        catch (UnsupportedLookAndFeelException ex)
1771//        {
1772//        }
1773//
1774//        java.awt.EventQueue.invokeLater(
1775//                new Runnable()
1776//                {
1777//                    public void run()
1778//                    {
1779//                        new IncidentEditorFrame().setVisible(true);
1780//                    }
1781//                });
1782//    }
1783    // Variables declaration - do not modify//GEN-BEGIN:variables
1784    private javax.swing.JButton activityLogEvalButton;
1785    private javax.swing.JFrame addNoiseFrame;
1786    private javax.swing.JButton atmsEvalButton;
1787    private javax.swing.JButton audioButton;
1788    private javax.swing.JButton cadButton;
1789    private javax.swing.JButton cadEvalButton;
1790    private javax.swing.JMenuItem cadEvent;
1791    private javax.swing.JFrame cadEventFrame;
1792    private javax.swing.JButton cancelButton;
1793    private javax.swing.JButton cctvButton;
1794    private javax.swing.JButton chpRadioButton;
1795    private javax.swing.JButton cmsEvalButton;
1796    private javax.swing.JMenuItem deleteEventList;
1797    private javax.swing.JMenuItem editEventList;
1798    private javax.swing.JPanel evaluationEventsPanel;
1799    private javax.swing.JPopupMenu eventListPopupMenu;
1800    private javax.swing.JPopupMenu eventPopupMenu;
1801    private javax.swing.JButton facilitatorEvalButton;
1802    private javax.swing.JTextArea incidentDescription;
1803    private javax.swing.JScrollPane incidentDescriptionPane;
1804    private javax.swing.JPanel incidentEventsPanel;
1805    private javax.swing.JTextField incidentName;
1806    private javax.swing.JTextField incidentNumber;
1807    private scriptbuilder.gui.panels.ScriptBuilderNumberPanel incidentNumberPanel1;
1808    private scriptbuilder.gui.panels.ScriptBuilderTimelinePanel incidentTimelinePanel1;
1809    private javax.swing.JButton jButton1;
1810    private javax.swing.JButton jButton2;
1811    private javax.swing.JLabel jLabel13;
1812    private javax.swing.JLabel jLabel14;
1813    private javax.swing.JLabel jLabel15;
1814    private javax.swing.JLabel jLabel16;
1815    private javax.swing.JLabel jLabel17;
1816    private javax.swing.JLabel jLabel2;
1817    private javax.swing.JLabel jLabel20;
1818    private javax.swing.JLabel jLabel21;
1819    private javax.swing.JLabel jLabel3;
1820    private javax.swing.JLabel jLabel4;
1821    private javax.swing.JLabel jLabel5;
1822    private javax.swing.JLabel jLabel7;
1823    private javax.swing.JMenuItem jMenuItem2;
1824    private javax.swing.JMenuItem jMenuItem4;
1825    private javax.swing.JMenuItem jMenuItem5;
1826    private javax.swing.JMenuItem jMenuItem6;
1827    private javax.swing.JSlider jSlider1;
1828    private javax.swing.JSlider jSlider2;
1829    private javax.swing.JSlider jSlider3;
1830    private javax.swing.JSlider jSlider4;
1831    private javax.swing.JSlider jSlider5;
1832    private javax.swing.JTextArea jTextArea1;
1833    private javax.swing.JButton maintenanceRadioButton;
1834    private javax.swing.JButton okButton;
1835    private javax.swing.JButton paramicsButton;
1836    private javax.swing.JButton radioEvalButton;
1837    private javax.swing.JMenuItem radioEvent;
1838    private javax.swing.JFrame radioEventFrame;
1839    private javax.swing.JTextArea radioMessage;
1840    private javax.swing.JScrollPane radioMessageScrollPane;
1841    private javax.swing.JComboBox radioTypeComboBox;
1842    private javax.swing.JLabel radioTypeLabel;
1843    private javax.swing.JList scriptEventsList;
1844    private javax.swing.JScrollPane scriptEventsPane;
1845    private javax.swing.JPanel scriptEventsPanel;
1846    private javax.swing.JPanel scriptEventsPanel1;
1847    private javax.swing.JButton selectButton;
1848    private javax.swing.JButton telephoneButton;
1849    private scriptbuilder.gui.panels.TimeStampPanel timeStampPanel;
1850    private javax.swing.JScrollPane timeStampScrollPane;
1851    private scriptbuilder.gui.panels.TimelineTickPanel timelineTickPanel;
1852    private javax.swing.JScrollPane timelinesScrollPane;
1853    private javax.swing.JButton tmtRadioButton;
1854    private javax.swing.JButton towButton;
1855    private javax.swing.JButton unitButton;
1856    private javax.swing.JButton witnessButton;
1857    private javax.swing.JLabel zoomInIcon;
1858    private javax.swing.JLabel zoomOutIcon;
1859    private javax.swing.JSlider zoomSlider;
1860    // End of variables declaration//GEN-END:variables
1861}
Note: See TracBrowser for help on using the repository browser.