source: tmcsimulator/trunk/src/atmsdriver/trafficeventseditor/TrafficEventsEditor.java @ 422

Revision 422, 58.0 KB checked in by jdalbey, 7 years ago (diff)

Remove ATMS functionality. Reworked and simplified the Highway model to use only VDS data from PeMS. Updated all unit tests.

Line 
1package atmsdriver.trafficeventseditor;
2
3import tmcsim.highwaymodel.Highway;
4import tmcsim.highwaymodel.LoopDetector;
5import tmcsim.highwaymodel.LoopDetector.DOTCOLOR;
6import tmcsim.highwaymodel.Station;
7import timeselector.*;
8import java.io.File;
9import java.util.ArrayList;
10import java.util.Enumeration;
11import java.util.Observable;
12import java.util.Observer;
13import javax.swing.AbstractButton;
14import javax.swing.AbstractListModel;
15import javax.swing.ButtonGroup;
16import javax.swing.DefaultListSelectionModel;
17import javax.swing.JComboBox;
18import javax.swing.JDialog;
19import javax.swing.JFileChooser;
20import javax.swing.JFrame;
21import javax.swing.JList;
22import javax.swing.JOptionPane;
23import javax.swing.JPanel;
24import javax.swing.JTable;
25import javax.swing.JTextField;
26import javax.swing.ListSelectionModel;
27import javax.swing.event.ListSelectionEvent;
28import javax.swing.event.ListSelectionListener;
29import javax.swing.table.AbstractTableModel;
30
31/**
32 *
33 * @author jtorres
34 */
35public class TrafficEventsEditor extends javax.swing.JFrame implements Observer
36{
37   
38    TimeFrames timeFrames;
39   
40    /**
41     * Creates new form BatchBuilderGUI
42     */
43    public TrafficEventsEditor(TimeFrames timeFrames)
44    {
45        initComponents();
46        this.timeFrames = timeFrames;
47       
48        HighwayList.setModel(new HighwaysListModel());
49        HighwayList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
50        HighwayList.addListSelectionListener(new HighwaysListSelectionListener());
51       
52        StationTable.setModel(new StationTableModel());
53        StationTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
54        StationTable.getSelectionModel().addListSelectionListener(
55                new StationTableListSelectionListener());
56       
57        TimeFrameList.setModel(new TimeFrameListModel());
58        TimeFrameList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
59        TimeFrameList.addListSelectionListener(new TimeFrameListSelectionListener());
60       
61        LoopDetectorTable.setModel(new LoopDetectorTableModel());
62        LoopDetectorTable.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
63        LoopDetectorTable.getSelectionModel().addListSelectionListener(
64                new LoopDetectorTableListSelectionListener());
65       
66        TrafficLaneEventsTable.setModel(new TrafficLaneEventsTableModel());
67        TrafficLaneEventsTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
68        TrafficLaneEventsTable.getSelectionModel().addListSelectionListener(
69                new TrafficLaneEventsTableSelectionListener());
70       
71        GreenButton.setSelected(true);
72    }
73   
74    private class TrafficLaneEventsTableModel extends AbstractTableModel
75    {
76        String[] columnNames = {"Route", "StationID", "Postmile", "LoopID", "LoopType", 
77            "LoopDesc", "Color"};
78        int rows;
79        int cols;
80        String[][] data;
81        TimeFrame currFrame;
82        public TrafficLaneEventsTableModel()
83        {           
84            currFrame = timeFrames.currentTimeFrame;
85            rows = currFrame != null ? currFrame.events.size() : 0;
86            cols = columnNames.length;
87            data = new String[rows][cols];
88            for(int i = 0; i < rows; i++)
89            {
90                TrafficLaneEvent currEvent = currFrame.events.get(i);
91                data[i][0] = Integer.toString(currEvent.routeNum);
92                data[i][1] = Integer.toString(currEvent.station.vdsID);
93                data[i][2] = Double.toString(currEvent.station.postmile);
94                data[i][3] = Integer.toString(currEvent.loopDetector.loopID);
95                data[i][4] = currEvent.loopDetector.loopLocationID;
96                data[i][5] = currEvent.loopDetector.loopLocation;
97                data[i][6] = currEvent.color.getLetter();
98            }
99        }
100       
101        @Override
102        public String getColumnName(int col)
103        {
104            return columnNames[col];
105        }
106       
107        @Override
108        public int getRowCount()
109        {
110            return rows;
111        }
112
113        @Override
114        public int getColumnCount()
115        {
116            return cols;
117        }
118
119        @Override
120        public Object getValueAt(int rowIndex, int columnIndex)
121        {
122            return data[rowIndex][columnIndex];
123        }
124       
125    }
126   
127    private class LoopDetectorTableModel extends AbstractTableModel
128    {
129        String[] columnnames = {"Loop_ID", "Loop_Type", "Loop_Desc"};
130        int rows;
131        int cols;
132        String[][] data;
133        Station currStn;
134       
135        public LoopDetectorTableModel()
136        {
137            currStn = timeFrames.currentStation;
138            rows = currStn != null ? currStn.loops.size() : 0;
139            cols = columnnames.length;
140            data = new String[rows][cols];
141            for(int i = 0; i < rows; i++)
142            {
143                data[i][0] = Integer.toString(currStn.loops.get(i).loopID);
144                data[i][1] = currStn.loops.get(i).loopLocationID;
145                data[i][2] = currStn.loops.get(i).loopLocation;
146            }
147        }
148       
149        @Override
150        public String getColumnName(int col)
151        {
152            return columnnames[col];
153        }
154       
155        @Override
156        public int getRowCount()
157        {
158            return rows;
159        }
160
161        @Override
162        public int getColumnCount()
163        {
164            return cols;
165        }
166
167        @Override
168        public Object getValueAt(int rowIndex, int columnIndex)
169        {
170            return data[rowIndex][columnIndex];
171        }
172       
173    }
174   
175    private class TimeFrameListModel extends AbstractListModel
176    {
177        ArrayList<TimeFrame> frames;
178       
179        public TimeFrameListModel()
180        {
181            frames = (ArrayList<TimeFrame>) timeFrames.frames;
182        }
183
184        @Override
185        public int getSize()
186        {
187            return frames.size();
188        }
189
190        @Override
191        public Object getElementAt(int index)
192        {
193            return frames.get(index);
194        }
195       
196    }
197
198    private class TrafficLaneEventsTableSelectionListener implements ListSelectionListener
199    {
200        @Override
201        public void valueChanged(ListSelectionEvent e)
202        {
203            if(e.getValueIsAdjusting())
204                return;
205            DefaultListSelectionModel mod = (DefaultListSelectionModel) e.getSource();
206            int index = mod.getMaxSelectionIndex();
207            if(index >= 0)
208                timeFrames.setCurrentTrafficLaneEvent(index);
209        }
210    }
211   
212    private class HighwaysListSelectionListener implements ListSelectionListener
213    {
214        @Override
215        public void valueChanged(ListSelectionEvent e)
216        {
217            if(e.getValueIsAdjusting())
218                return;
219            JList source = (JList) e.getSource();
220            timeFrames.setCurrentHighway(source.getSelectedIndex());
221        }
222    }
223   
224    private class TimeFrameListSelectionListener implements ListSelectionListener
225    {
226        @Override
227        public void valueChanged(ListSelectionEvent e)
228        {
229            if(e.getValueIsAdjusting())
230                return;
231            JList source = (JList) e.getSource();
232            int index = source.getSelectedIndex();
233            if(index >= 0)
234            {
235                timeFrames.setCurrentTimeFrame(index);
236            }
237        }
238    }
239   
240    private class StationTableListSelectionListener implements ListSelectionListener
241    {
242
243        @Override
244        public void valueChanged(ListSelectionEvent e)
245        {
246            if(e.getValueIsAdjusting())
247                return;
248            DefaultListSelectionModel mod = (DefaultListSelectionModel) e.getSource();
249            int index = mod.getMaxSelectionIndex();
250            if(index >= 0)
251                timeFrames.setCurrentStation(index);
252        }
253    }
254   
255    private class LoopDetectorTableListSelectionListener implements ListSelectionListener
256    {
257
258        @Override
259        public void valueChanged(ListSelectionEvent e)
260        {
261            if(e.getValueIsAdjusting())
262                return;
263            DefaultListSelectionModel mod = (DefaultListSelectionModel) e.getSource();
264            int index = mod.getMaxSelectionIndex();
265            if(index >= 0)
266                timeFrames.setCurrentLoopDetector(index);
267        }
268       
269    }
270   
271    private class StationTableModel extends AbstractTableModel
272    {
273        String[] columnNames = {"lds_id", "direction", "postmile", "location"};
274        String[][] data;
275        Highway hwy;
276        int rows;
277        int cols;
278       
279        public StationTableModel()
280        {
281            hwy = TrafficEventsEditor.this.timeFrames.currentHighway;
282            cols = columnNames.length;
283            rows = hwy != null ? hwy.stations.size() : 0;
284            data = new String[rows][cols];
285            for(int i = 0; i < rows; i++)
286            {
287                data[i][0] = Integer.toString(hwy.stations.get(i).vdsID);
288                data[i][1] = hwy.stations.get(i).direction.getLetter();
289                data[i][2] = Double.toString(hwy.stations.get(i).postmile);
290                data[i][3] = hwy.stations.get(i).location;
291            }
292        }
293       
294        @Override
295        public String getColumnName(int col)
296        {
297            return columnNames[col];
298        }
299
300        @Override
301        public int getRowCount()
302        {
303            return rows;
304        }
305
306        @Override
307        public int getColumnCount()
308        {
309            return cols;
310        }
311
312        @Override
313        public Object getValueAt(int rowIndex, int columnIndex)
314        {
315            return data[rowIndex][columnIndex];
316        }
317    }
318   
319    private class HighwaysListModel extends AbstractListModel
320    {
321       
322        @Override
323        public int getSize()
324        {
325            return TrafficEventsEditor.this.timeFrames.highways.highways.size();
326        }
327
328        @Override
329        public Object getElementAt(int index)
330        {
331            return TrafficEventsEditor.this.timeFrames.highways.highways.get(index);
332        }
333    }
334
335    /**
336     * This method is called from within the constructor to initialize the form.
337     * WARNING: Do NOT modify this code. The content of this method is always
338     * regenerated by the Form Editor.
339     */
340    @SuppressWarnings("unchecked")
341    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
342    private void initComponents()
343    {
344
345        colorRadioButtons = new javax.swing.ButtonGroup();
346        jPanel6 = new javax.swing.JPanel();
347        jPanel2 = new javax.swing.JPanel();
348        HighwayScrollPane = new javax.swing.JScrollPane();
349        HighwayList = new javax.swing.JList();
350        jPanel4 = new javax.swing.JPanel();
351        StationScrollPane = new javax.swing.JScrollPane();
352        StationTable = new javax.swing.JTable();
353        jPanel5 = new javax.swing.JPanel();
354        LoopDetectorScrollPane = new javax.swing.JScrollPane();
355        LoopDetectorTable = new javax.swing.JTable();
356        jPanel1 = new javax.swing.JPanel();
357        jPanel9 = new javax.swing.JPanel();
358        jLabel1 = new javax.swing.JLabel();
359        CurrentTimeFrameLabel = new javax.swing.JLabel();
360        CurrentHighwayLabel = new javax.swing.JLabel();
361        jLabel2 = new javax.swing.JLabel();
362        jLabel3 = new javax.swing.JLabel();
363        CurrentStationLabel = new javax.swing.JLabel();
364        CurrentStationPostmileLabel = new javax.swing.JLabel();
365        jLabel4 = new javax.swing.JLabel();
366        jLabel5 = new javax.swing.JLabel();
367        CurrentStationLocationLabel = new javax.swing.JLabel();
368        CurrentLoopDetectorLabel = new javax.swing.JLabel();
369        jLabel6 = new javax.swing.JLabel();
370        jLabel7 = new javax.swing.JLabel();
371        CurrentLoopDetectorTypeLabel = new javax.swing.JLabel();
372        CurrentLoopDetectorDescLabel = new javax.swing.JLabel();
373        jLabel8 = new javax.swing.JLabel();
374        jLabel9 = new javax.swing.JLabel();
375        CurrentStationDirectionLabel = new javax.swing.JLabel();
376        jPanel7 = new javax.swing.JPanel();
377        GreenButton = new javax.swing.JRadioButton();
378        YellowButton = new javax.swing.JRadioButton();
379        RedButton = new javax.swing.JRadioButton();
380        AddNewEventButton = new javax.swing.JButton();
381        DeleteEventButton = new javax.swing.JButton();
382        jPanel11 = new javax.swing.JPanel();
383        jPanel12 = new javax.swing.JPanel();
384        SinglePreviewStationButton = new javax.swing.JButton();
385        SinglePreviewHighwaysButton = new javax.swing.JButton();
386        jPanel13 = new javax.swing.JPanel();
387        CumulativePreviewStationButton = new javax.swing.JButton();
388        CumulativePreviewHighwaysButton = new javax.swing.JButton();
389        jPanel15 = new javax.swing.JPanel();
390        jPanel3 = new javax.swing.JPanel();
391        TimeFrameScrollPane = new javax.swing.JScrollPane();
392        TimeFrameList = new javax.swing.JList();
393        jPanel10 = new javax.swing.JPanel();
394        AddNewTimeFrameButton = new javax.swing.JButton();
395        DeleteTimeFrameButton = new javax.swing.JButton();
396        jPanel8 = new javax.swing.JPanel();
397        jScrollPane1 = new javax.swing.JScrollPane();
398        TrafficLaneEventsTable = new javax.swing.JTable();
399        jPanel14 = new javax.swing.JPanel();
400        jButton1 = new javax.swing.JButton();
401        btnSave = new javax.swing.JButton();
402        jButton3 = new javax.swing.JButton();
403
404        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
405        setTitle("Traffic Events Editor");
406
407        jPanel6.setBorder(javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)), "Lane Selection Panel"));
408
409        jPanel2.setBorder(javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createEmptyBorder(1, 1, 1, 1), "Highway"));
410
411        HighwayList.setModel(new javax.swing.AbstractListModel()
412        {
413            String[] strings = { "Item 1", "Item 2", "Item 3", "Item 4", "Item 5" };
414            public int getSize() { return strings.length; }
415            public Object getElementAt(int i) { return strings[i]; }
416        });
417        HighwayScrollPane.setViewportView(HighwayList);
418
419        javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);
420        jPanel2.setLayout(jPanel2Layout);
421        jPanel2Layout.setHorizontalGroup(
422            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
423            .addComponent(HighwayScrollPane, javax.swing.GroupLayout.Alignment.TRAILING)
424        );
425        jPanel2Layout.setVerticalGroup(
426            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
427            .addComponent(HighwayScrollPane)
428        );
429
430        jPanel4.setBorder(javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createEmptyBorder(1, 1, 1, 1), "Station"));
431
432        StationTable.setModel(new javax.swing.table.DefaultTableModel(
433            new Object [][]
434            {
435                {null, null, null, null},
436                {null, null, null, null},
437                {null, null, null, null},
438                {null, null, null, null}
439            },
440            new String []
441            {
442                "Title 1", "Title 2", "Title 3", "Title 4"
443            }
444        ));
445        StationScrollPane.setViewportView(StationTable);
446
447        javax.swing.GroupLayout jPanel4Layout = new javax.swing.GroupLayout(jPanel4);
448        jPanel4.setLayout(jPanel4Layout);
449        jPanel4Layout.setHorizontalGroup(
450            jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
451            .addComponent(StationScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 546, Short.MAX_VALUE)
452        );
453        jPanel4Layout.setVerticalGroup(
454            jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
455            .addComponent(StationScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)
456        );
457
458        jPanel5.setBorder(javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createEmptyBorder(1, 1, 1, 1), "Loop Detector"));
459
460        LoopDetectorTable.setModel(new javax.swing.table.DefaultTableModel(
461            new Object [][]
462            {
463                {null, null, null, null},
464                {null, null, null, null},
465                {null, null, null, null},
466                {null, null, null, null}
467            },
468            new String []
469            {
470                "Title 1", "Title 2", "Title 3", "Title 4"
471            }
472        ));
473        LoopDetectorScrollPane.setViewportView(LoopDetectorTable);
474
475        javax.swing.GroupLayout jPanel5Layout = new javax.swing.GroupLayout(jPanel5);
476        jPanel5.setLayout(jPanel5Layout);
477        jPanel5Layout.setHorizontalGroup(
478            jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
479            .addComponent(LoopDetectorScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 479, Short.MAX_VALUE)
480        );
481        jPanel5Layout.setVerticalGroup(
482            jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
483            .addComponent(LoopDetectorScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)
484        );
485
486        javax.swing.GroupLayout jPanel6Layout = new javax.swing.GroupLayout(jPanel6);
487        jPanel6.setLayout(jPanel6Layout);
488        jPanel6Layout.setHorizontalGroup(
489            jPanel6Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
490            .addGroup(jPanel6Layout.createSequentialGroup()
491                .addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
492                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
493                .addComponent(jPanel4, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
494                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
495                .addComponent(jPanel5, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
496        );
497        jPanel6Layout.setVerticalGroup(
498            jPanel6Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
499            .addGroup(jPanel6Layout.createSequentialGroup()
500                .addGap(6, 6, 6)
501                .addGroup(jPanel6Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
502                    .addComponent(jPanel4, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
503                    .addComponent(jPanel5, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
504                    .addComponent(jPanel2, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
505        );
506
507        jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)), "Current Selection"));
508        jPanel1.setLayout(new java.awt.GridLayout(1, 0));
509
510        jLabel1.setText("TimeFrame:");
511
512        CurrentTimeFrameLabel.setText("null");
513
514        CurrentHighwayLabel.setText("null");
515
516        jLabel2.setText("Highway:");
517
518        jLabel3.setText("Station:");
519
520        CurrentStationLabel.setText("null");
521
522        CurrentStationPostmileLabel.setText("null");
523
524        jLabel4.setText("Postmile:");
525
526        jLabel5.setText("Location:");
527
528        CurrentStationLocationLabel.setText("null");
529
530        CurrentLoopDetectorLabel.setText("null");
531
532        jLabel6.setText("Loop:");
533
534        jLabel7.setText("Type:");
535
536        CurrentLoopDetectorTypeLabel.setText("null");
537
538        CurrentLoopDetectorDescLabel.setText("null");
539
540        jLabel8.setText("Desc:");
541
542        jLabel9.setText("Direction:");
543
544        CurrentStationDirectionLabel.setText("null");
545
546        javax.swing.GroupLayout jPanel9Layout = new javax.swing.GroupLayout(jPanel9);
547        jPanel9.setLayout(jPanel9Layout);
548        jPanel9Layout.setHorizontalGroup(
549            jPanel9Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
550            .addGroup(jPanel9Layout.createSequentialGroup()
551                .addContainerGap()
552                .addGroup(jPanel9Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
553                    .addComponent(jLabel1)
554                    .addComponent(jLabel2)
555                    .addComponent(jLabel3)
556                    .addComponent(jLabel6)
557                    .addGroup(jPanel9Layout.createSequentialGroup()
558                        .addGap(6, 6, 6)
559                        .addGroup(jPanel9Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
560                            .addComponent(jLabel9)
561                            .addComponent(jLabel5)
562                            .addComponent(jLabel4)
563                            .addComponent(jLabel7)
564                            .addComponent(jLabel8))))
565                .addGap(18, 18, 18)
566                .addGroup(jPanel9Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
567                    .addComponent(CurrentLoopDetectorTypeLabel)
568                    .addComponent(CurrentLoopDetectorLabel)
569                    .addComponent(CurrentStationLocationLabel)
570                    .addComponent(CurrentStationDirectionLabel)
571                    .addComponent(CurrentStationLabel)
572                    .addComponent(CurrentHighwayLabel)
573                    .addComponent(CurrentTimeFrameLabel)
574                    .addComponent(CurrentStationPostmileLabel)
575                    .addComponent(CurrentLoopDetectorDescLabel))
576                .addContainerGap(239, Short.MAX_VALUE))
577        );
578        jPanel9Layout.setVerticalGroup(
579            jPanel9Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
580            .addGroup(jPanel9Layout.createSequentialGroup()
581                .addContainerGap()
582                .addGroup(jPanel9Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
583                    .addComponent(jLabel1)
584                    .addComponent(CurrentTimeFrameLabel))
585                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
586                .addGroup(jPanel9Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
587                    .addComponent(jLabel2)
588                    .addComponent(CurrentHighwayLabel))
589                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
590                .addGroup(jPanel9Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
591                    .addComponent(jLabel3)
592                    .addComponent(CurrentStationLabel))
593                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
594                .addGroup(jPanel9Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
595                    .addComponent(jLabel9)
596                    .addComponent(CurrentStationDirectionLabel))
597                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
598                .addGroup(jPanel9Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
599                    .addComponent(jLabel4)
600                    .addComponent(CurrentStationPostmileLabel))
601                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
602                .addGroup(jPanel9Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
603                    .addComponent(jLabel5)
604                    .addComponent(CurrentStationLocationLabel))
605                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
606                .addGroup(jPanel9Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
607                    .addComponent(jLabel6)
608                    .addComponent(CurrentLoopDetectorLabel))
609                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
610                .addGroup(jPanel9Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
611                    .addComponent(jLabel7)
612                    .addComponent(CurrentLoopDetectorTypeLabel))
613                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
614                .addGroup(jPanel9Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
615                    .addComponent(jLabel8)
616                    .addComponent(CurrentLoopDetectorDescLabel))
617                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
618        );
619
620        jPanel1.add(jPanel9);
621
622        jPanel7.setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.RAISED));
623
624        colorRadioButtons.add(GreenButton);
625        GreenButton.setText("Green");
626
627        colorRadioButtons.add(YellowButton);
628        YellowButton.setText("Yellow");
629
630        colorRadioButtons.add(RedButton);
631        RedButton.setText("Red");
632
633        AddNewEventButton.setText("Add New Event");
634        AddNewEventButton.addActionListener(new java.awt.event.ActionListener()
635        {
636            public void actionPerformed(java.awt.event.ActionEvent evt)
637            {
638                AddLaneEventButtonActionPerformed(evt);
639            }
640        });
641
642        DeleteEventButton.setText("Delete Selected Event");
643        DeleteEventButton.addActionListener(new java.awt.event.ActionListener()
644        {
645            public void actionPerformed(java.awt.event.ActionEvent evt)
646            {
647                DeleteEventButtonActonPerformed(evt);
648            }
649        });
650
651        javax.swing.GroupLayout jPanel7Layout = new javax.swing.GroupLayout(jPanel7);
652        jPanel7.setLayout(jPanel7Layout);
653        jPanel7Layout.setHorizontalGroup(
654            jPanel7Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
655            .addGroup(jPanel7Layout.createSequentialGroup()
656                .addContainerGap()
657                .addGroup(jPanel7Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
658                    .addComponent(DeleteEventButton, javax.swing.GroupLayout.DEFAULT_SIZE, 344, Short.MAX_VALUE)
659                    .addGroup(jPanel7Layout.createSequentialGroup()
660                        .addGroup(jPanel7Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
661                            .addComponent(RedButton)
662                            .addComponent(YellowButton)
663                            .addComponent(GreenButton))
664                        .addGap(0, 0, Short.MAX_VALUE))
665                    .addComponent(AddNewEventButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
666                .addContainerGap())
667        );
668        jPanel7Layout.setVerticalGroup(
669            jPanel7Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
670            .addGroup(jPanel7Layout.createSequentialGroup()
671                .addContainerGap()
672                .addComponent(GreenButton)
673                .addGap(12, 12, 12)
674                .addComponent(YellowButton)
675                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
676                .addComponent(RedButton)
677                .addGap(18, 18, 18)
678                .addComponent(AddNewEventButton)
679                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
680                .addComponent(DeleteEventButton)
681                .addContainerGap(25, Short.MAX_VALUE))
682        );
683
684        jPanel1.add(jPanel7);
685
686        jPanel11.setBorder(javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)), "Preview Lane Events on ATMS"));
687        jPanel11.setLayout(new java.awt.BorderLayout());
688
689        jPanel12.setBorder(javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.RAISED), "Selected Time Frame Preview"));
690
691        SinglePreviewStationButton.setText("Send Selected Station Events");
692        SinglePreviewStationButton.addActionListener(new java.awt.event.ActionListener()
693        {
694            public void actionPerformed(java.awt.event.ActionEvent evt)
695            {
696                SinglePreviewStationButtonActionPerformed(evt);
697            }
698        });
699
700        SinglePreviewHighwaysButton.setText("Send All Events");
701        SinglePreviewHighwaysButton.addActionListener(new java.awt.event.ActionListener()
702        {
703            public void actionPerformed(java.awt.event.ActionEvent evt)
704            {
705                SinglePreviewHighwaysButtonActionPerformed(evt);
706            }
707        });
708
709        javax.swing.GroupLayout jPanel12Layout = new javax.swing.GroupLayout(jPanel12);
710        jPanel12.setLayout(jPanel12Layout);
711        jPanel12Layout.setHorizontalGroup(
712            jPanel12Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
713            .addGroup(jPanel12Layout.createSequentialGroup()
714                .addContainerGap()
715                .addGroup(jPanel12Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
716                    .addComponent(SinglePreviewHighwaysButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
717                    .addComponent(SinglePreviewStationButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
718                .addContainerGap(10, Short.MAX_VALUE))
719        );
720        jPanel12Layout.setVerticalGroup(
721            jPanel12Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
722            .addGroup(jPanel12Layout.createSequentialGroup()
723                .addContainerGap()
724                .addComponent(SinglePreviewStationButton)
725                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
726                .addComponent(SinglePreviewHighwaysButton)
727                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
728        );
729
730        jPanel11.add(jPanel12, java.awt.BorderLayout.CENTER);
731
732        jPanel13.setBorder(javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.RAISED), "Cumulative Preview"));
733
734        CumulativePreviewStationButton.setText("Send Selected Station Events");
735        CumulativePreviewStationButton.addActionListener(new java.awt.event.ActionListener()
736        {
737            public void actionPerformed(java.awt.event.ActionEvent evt)
738            {
739                CumulativeStationPreviewButtonActionPerformed(evt);
740            }
741        });
742
743        CumulativePreviewHighwaysButton.setText("Send All Events");
744        CumulativePreviewHighwaysButton.addActionListener(new java.awt.event.ActionListener()
745        {
746            public void actionPerformed(java.awt.event.ActionEvent evt)
747            {
748                CumulativeHighwaysPreviewButtonActionPerformed(evt);
749            }
750        });
751
752        javax.swing.GroupLayout jPanel13Layout = new javax.swing.GroupLayout(jPanel13);
753        jPanel13.setLayout(jPanel13Layout);
754        jPanel13Layout.setHorizontalGroup(
755            jPanel13Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
756            .addGroup(jPanel13Layout.createSequentialGroup()
757                .addContainerGap()
758                .addGroup(jPanel13Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
759                    .addComponent(CumulativePreviewHighwaysButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
760                    .addComponent(CumulativePreviewStationButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
761                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
762        );
763        jPanel13Layout.setVerticalGroup(
764            jPanel13Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
765            .addGroup(jPanel13Layout.createSequentialGroup()
766                .addContainerGap()
767                .addComponent(CumulativePreviewStationButton)
768                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
769                .addComponent(CumulativePreviewHighwaysButton)
770                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
771        );
772
773        jPanel11.add(jPanel13, java.awt.BorderLayout.PAGE_START);
774
775        jPanel3.setBorder(javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)), "Time Frame"));
776
777        TimeFrameList.setModel(new javax.swing.AbstractListModel()
778        {
779            String[] strings = { "Item 1", "Item 2", "Item 3", "Item 4", "Item 5" };
780            public int getSize() { return strings.length; }
781            public Object getElementAt(int i) { return strings[i]; }
782        });
783        TimeFrameScrollPane.setViewportView(TimeFrameList);
784
785        jPanel10.setBorder(javax.swing.BorderFactory.createEtchedBorder());
786
787        AddNewTimeFrameButton.setText("New");
788        AddNewTimeFrameButton.setActionCommand("addTimeFrame");
789        AddNewTimeFrameButton.addActionListener(new java.awt.event.ActionListener()
790        {
791            public void actionPerformed(java.awt.event.ActionEvent evt)
792            {
793                addNewTimeFrameButtonClicked(evt);
794            }
795        });
796
797        DeleteTimeFrameButton.setText("Delete");
798        DeleteTimeFrameButton.addActionListener(new java.awt.event.ActionListener()
799        {
800            public void actionPerformed(java.awt.event.ActionEvent evt)
801            {
802                DeleteTimeFrameButtonActionPerformed(evt);
803            }
804        });
805
806        javax.swing.GroupLayout jPanel10Layout = new javax.swing.GroupLayout(jPanel10);
807        jPanel10.setLayout(jPanel10Layout);
808        jPanel10Layout.setHorizontalGroup(
809            jPanel10Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
810            .addGroup(jPanel10Layout.createSequentialGroup()
811                .addContainerGap()
812                .addComponent(AddNewTimeFrameButton, javax.swing.GroupLayout.PREFERRED_SIZE, 81, javax.swing.GroupLayout.PREFERRED_SIZE)
813                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 40, Short.MAX_VALUE)
814                .addComponent(DeleteTimeFrameButton, javax.swing.GroupLayout.PREFERRED_SIZE, 84, javax.swing.GroupLayout.PREFERRED_SIZE)
815                .addContainerGap())
816        );
817        jPanel10Layout.setVerticalGroup(
818            jPanel10Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
819            .addGroup(jPanel10Layout.createSequentialGroup()
820                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
821                .addGroup(jPanel10Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
822                    .addComponent(AddNewTimeFrameButton)
823                    .addComponent(DeleteTimeFrameButton))
824                .addContainerGap())
825        );
826
827        javax.swing.GroupLayout jPanel3Layout = new javax.swing.GroupLayout(jPanel3);
828        jPanel3.setLayout(jPanel3Layout);
829        jPanel3Layout.setHorizontalGroup(
830            jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
831            .addComponent(TimeFrameScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 215, javax.swing.GroupLayout.PREFERRED_SIZE)
832            .addComponent(jPanel10, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
833        );
834        jPanel3Layout.setVerticalGroup(
835            jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
836            .addGroup(jPanel3Layout.createSequentialGroup()
837                .addComponent(TimeFrameScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 170, javax.swing.GroupLayout.PREFERRED_SIZE)
838                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
839                .addComponent(jPanel10, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
840                .addGap(76, 76, 76))
841        );
842
843        jPanel8.setBorder(javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)), "Traffic Lane Events"));
844
845        TrafficLaneEventsTable.setModel(new javax.swing.table.DefaultTableModel(
846            new Object [][]
847            {
848                {null, null, null, null},
849                {null, null, null, null},
850                {null, null, null, null},
851                {null, null, null, null}
852            },
853            new String []
854            {
855                "Title 1", "Title 2", "Title 3", "Title 4"
856            }
857        ));
858        jScrollPane1.setViewportView(TrafficLaneEventsTable);
859
860        javax.swing.GroupLayout jPanel8Layout = new javax.swing.GroupLayout(jPanel8);
861        jPanel8.setLayout(jPanel8Layout);
862        jPanel8Layout.setHorizontalGroup(
863            jPanel8Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
864            .addComponent(jScrollPane1, javax.swing.GroupLayout.Alignment.TRAILING)
865        );
866        jPanel8Layout.setVerticalGroup(
867            jPanel8Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
868            .addGroup(jPanel8Layout.createSequentialGroup()
869                .addContainerGap()
870                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)
871                .addContainerGap())
872        );
873
874        javax.swing.GroupLayout jPanel15Layout = new javax.swing.GroupLayout(jPanel15);
875        jPanel15.setLayout(jPanel15Layout);
876        jPanel15Layout.setHorizontalGroup(
877            jPanel15Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
878            .addGroup(jPanel15Layout.createSequentialGroup()
879                .addComponent(jPanel3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
880                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
881                .addComponent(jPanel8, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
882                .addContainerGap())
883        );
884        jPanel15Layout.setVerticalGroup(
885            jPanel15Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
886            .addGroup(jPanel15Layout.createSequentialGroup()
887                .addContainerGap()
888                .addGroup(jPanel15Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
889                    .addComponent(jPanel3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
890                    .addComponent(jPanel8, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
891                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
892        );
893
894        jPanel14.setBorder(javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)), "Export/Import Scripts"));
895
896        jButton1.setText("Load Script");
897
898        btnSave.setText("Save Script");
899        btnSave.addActionListener(new java.awt.event.ActionListener()
900        {
901            public void actionPerformed(java.awt.event.ActionEvent evt)
902            {
903                btnSaveActionPerformed(evt);
904            }
905        });
906
907        jButton3.setText("Save Script As");
908
909        javax.swing.GroupLayout jPanel14Layout = new javax.swing.GroupLayout(jPanel14);
910        jPanel14.setLayout(jPanel14Layout);
911        jPanel14Layout.setHorizontalGroup(
912            jPanel14Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
913            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel14Layout.createSequentialGroup()
914                .addContainerGap(28, Short.MAX_VALUE)
915                .addGroup(jPanel14Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
916                    .addComponent(btnSave, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
917                    .addComponent(jButton1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
918                    .addComponent(jButton3, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
919                .addGap(27, 27, 27))
920        );
921        jPanel14Layout.setVerticalGroup(
922            jPanel14Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
923            .addGroup(jPanel14Layout.createSequentialGroup()
924                .addContainerGap()
925                .addComponent(jButton1)
926                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
927                .addComponent(btnSave)
928                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
929                .addComponent(jButton3)
930                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
931        );
932
933        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
934        getContentPane().setLayout(layout);
935        layout.setHorizontalGroup(
936            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
937            .addGroup(layout.createSequentialGroup()
938                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
939                    .addGroup(layout.createSequentialGroup()
940                        .addGap(12, 12, 12)
941                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
942                            .addComponent(jPanel15, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
943                            .addGroup(layout.createSequentialGroup()
944                                .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, 730, javax.swing.GroupLayout.PREFERRED_SIZE)
945                                .addGap(18, 18, 18)
946                                .addComponent(jPanel11, javax.swing.GroupLayout.PREFERRED_SIZE, 261, javax.swing.GroupLayout.PREFERRED_SIZE)
947                                .addGap(18, 18, 18)
948                                .addComponent(jPanel14, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))))
949                    .addGroup(layout.createSequentialGroup()
950                        .addContainerGap()
951                        .addComponent(jPanel6, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
952                .addContainerGap())
953        );
954        layout.setVerticalGroup(
955            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
956            .addGroup(layout.createSequentialGroup()
957                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
958                .addComponent(jPanel6, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
959                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
960                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
961                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
962                        .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
963                        .addComponent(jPanel11, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
964                    .addComponent(jPanel14, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
965                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
966                .addComponent(jPanel15, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
967        );
968
969        pack();
970    }// </editor-fold>//GEN-END:initComponents
971
972    private void AddLaneEventButtonActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_AddLaneEventButtonActionPerformed
973    {//GEN-HEADEREND:event_AddLaneEventButtonActionPerformed
974        int rows[] = LoopDetectorTable.getSelectedRows();
975        timeFrames.addEventsToTimeFrame(rows, getDotColorFromText(
976                getSelectedButtonText(colorRadioButtons)));
977    }//GEN-LAST:event_AddLaneEventButtonActionPerformed
978
979    private void DeleteTimeFrameButtonActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_DeleteTimeFrameButtonActionPerformed
980    {//GEN-HEADEREND:event_DeleteTimeFrameButtonActionPerformed
981        timeFrames.deleteTimeFrame(TimeFrameList.getSelectedIndex());
982    }//GEN-LAST:event_DeleteTimeFrameButtonActionPerformed
983
984    private String[] getTimeChoices()
985    {
986        String[] choices = new String[60];
987        for(int i = 0; i < 60; i++)
988        {
989            choices[i] = String.format("%02d", i);
990        }
991        return choices;
992    }
993   
994    private void addNewTimeFrameButtonClicked(java.awt.event.ActionEvent evt)//GEN-FIRST:event_addNewTimeFrameButtonClicked
995    {//GEN-HEADEREND:event_addNewTimeFrameButtonClicked
996        // Show a dialog for the user to select a time in HH:MM:SS
997        TimeSelectionDialog dialog;
998        // Obtain the time of the previous time frame
999        int size = timeFrames.frames.size();
1000        // if a previous frame exists, use its time for default dialog time
1001        if (timeFrames.frames.size() > 0)
1002        {
1003            String prevTime = timeFrames.frames.get(size-1).toString();
1004            dialog = new TimeSelectionDialog((JFrame)this, prevTime);
1005        }
1006        else  // start with no time default
1007        {
1008            dialog = new TimeSelectionDialog((JFrame)this);
1009        }
1010
1011        dialog.setLocation(200,400);
1012        dialog.setVisible(true);
1013        // Add the new time frame
1014        timeFrames.addTimeFrame(dialog.getSelectedTime());
1015        dialog.dispose();
1016           
1017    }//GEN-LAST:event_addNewTimeFrameButtonClicked
1018
1019    private void DeleteEventButtonActonPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_DeleteEventButtonActonPerformed
1020    {//GEN-HEADEREND:event_DeleteEventButtonActonPerformed
1021        timeFrames.deleteTrafficLaneEvent(TrafficLaneEventsTable
1022                .getSelectionModel().getMaxSelectionIndex());
1023    }//GEN-LAST:event_DeleteEventButtonActonPerformed
1024
1025    private void SinglePreviewStationButtonActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_SinglePreviewStationButtonActionPerformed
1026    {//GEN-HEADEREND:event_SinglePreviewStationButtonActionPerformed
1027        timeFrames.singlePreviewStation();
1028    }//GEN-LAST:event_SinglePreviewStationButtonActionPerformed
1029
1030    private void SinglePreviewHighwaysButtonActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_SinglePreviewHighwaysButtonActionPerformed
1031    {//GEN-HEADEREND:event_SinglePreviewHighwaysButtonActionPerformed
1032        timeFrames.singlePreviewHighways();
1033    }//GEN-LAST:event_SinglePreviewHighwaysButtonActionPerformed
1034
1035    private void CumulativeStationPreviewButtonActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_CumulativeStationPreviewButtonActionPerformed
1036    {//GEN-HEADEREND:event_CumulativeStationPreviewButtonActionPerformed
1037        timeFrames.cumulativePreviewStation();
1038    }//GEN-LAST:event_CumulativeStationPreviewButtonActionPerformed
1039
1040    private void CumulativeHighwaysPreviewButtonActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_CumulativeHighwaysPreviewButtonActionPerformed
1041    {//GEN-HEADEREND:event_CumulativeHighwaysPreviewButtonActionPerformed
1042        timeFrames.cumulativePreviewHighways();
1043    }//GEN-LAST:event_CumulativeHighwaysPreviewButtonActionPerformed
1044
1045     /**
1046     * Shows the dialog for choosing a file to save the script data to.
1047     * @author jdalbey
1048     */
1049    private void btnSaveActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_btnSaveActionPerformed
1050    {//GEN-HEADEREND:event_btnSaveActionPerformed
1051        boolean saved = false;
1052        JFileChooser chooser = new JFileChooser(".");
1053        int choice = chooser.showSaveDialog(chooser);
1054        if (choice == JFileChooser.APPROVE_OPTION)
1055        {
1056            File selectedFile = chooser.getSelectedFile();
1057            //TODO: Save the script to the selected file
1058            JOptionPane.showMessageDialog(null, "Saving Not Implemented Yet");
1059        }
1060//        return choice == JFileChooser.APPROVE_OPTION && saved;
1061    }//GEN-LAST:event_btnSaveActionPerformed
1062
1063    private DOTCOLOR getDotColorFromText(String text)
1064    {
1065        return DOTCOLOR.toDotColor(text);
1066    }
1067   
1068    private String getSelectedButtonText(ButtonGroup buttonGroup)
1069    {
1070        for(Enumeration<AbstractButton> buttons = buttonGroup.getElements(); buttons.hasMoreElements();)
1071        {
1072            AbstractButton button = buttons.nextElement();
1073            if(button.isSelected())
1074            {
1075                return button.getText();
1076            }
1077        }
1078        return null;
1079    }
1080   
1081    /**
1082     * @param args the command line arguments
1083     */
1084    public static void main(String args[])
1085    {
1086        /* Set the Nimbus look and feel */
1087        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
1088        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
1089         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
1090         */
1091        try
1092        {
1093            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels())
1094            {
1095                if ("Nimbus".equals(info.getName()))
1096                {
1097                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
1098                    break;
1099                }
1100            }
1101        } catch (ClassNotFoundException ex)
1102        {
1103            java.util.logging.Logger.getLogger(TrafficEventsEditor.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
1104        } catch (InstantiationException ex)
1105        {
1106            java.util.logging.Logger.getLogger(TrafficEventsEditor.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
1107        } catch (IllegalAccessException ex)
1108        {
1109            java.util.logging.Logger.getLogger(TrafficEventsEditor.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
1110        } catch (javax.swing.UnsupportedLookAndFeelException ex)
1111        {
1112            java.util.logging.Logger.getLogger(TrafficEventsEditor.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
1113        }
1114        //</editor-fold>
1115        //</editor-fold>
1116        //</editor-fold>
1117        //</editor-fold>
1118       
1119        TimeFrames timeFrames = new TimeFrames();
1120        final TrafficEventsEditor gui = new TrafficEventsEditor(timeFrames);
1121        timeFrames.addObserver(gui);
1122       
1123        /* Create and display the form */
1124        java.awt.EventQueue.invokeLater(new Runnable()
1125        {
1126            public void run()
1127            {
1128                gui.update(null, null);
1129                gui.setVisible(true);
1130            }
1131        });
1132    }
1133
1134    // Variables declaration - do not modify//GEN-BEGIN:variables
1135    private javax.swing.JButton AddNewEventButton;
1136    private javax.swing.JButton AddNewTimeFrameButton;
1137    private javax.swing.JButton CumulativePreviewHighwaysButton;
1138    private javax.swing.JButton CumulativePreviewStationButton;
1139    private javax.swing.JLabel CurrentHighwayLabel;
1140    private javax.swing.JLabel CurrentLoopDetectorDescLabel;
1141    private javax.swing.JLabel CurrentLoopDetectorLabel;
1142    private javax.swing.JLabel CurrentLoopDetectorTypeLabel;
1143    private javax.swing.JLabel CurrentStationDirectionLabel;
1144    private javax.swing.JLabel CurrentStationLabel;
1145    private javax.swing.JLabel CurrentStationLocationLabel;
1146    private javax.swing.JLabel CurrentStationPostmileLabel;
1147    private javax.swing.JLabel CurrentTimeFrameLabel;
1148    private javax.swing.JButton DeleteEventButton;
1149    private javax.swing.JButton DeleteTimeFrameButton;
1150    private javax.swing.JRadioButton GreenButton;
1151    private javax.swing.JList HighwayList;
1152    private javax.swing.JScrollPane HighwayScrollPane;
1153    private javax.swing.JScrollPane LoopDetectorScrollPane;
1154    private javax.swing.JTable LoopDetectorTable;
1155    private javax.swing.JRadioButton RedButton;
1156    private javax.swing.JButton SinglePreviewHighwaysButton;
1157    private javax.swing.JButton SinglePreviewStationButton;
1158    private javax.swing.JScrollPane StationScrollPane;
1159    private javax.swing.JTable StationTable;
1160    private javax.swing.JList TimeFrameList;
1161    private javax.swing.JScrollPane TimeFrameScrollPane;
1162    private javax.swing.JTable TrafficLaneEventsTable;
1163    private javax.swing.JRadioButton YellowButton;
1164    private javax.swing.JButton btnSave;
1165    private javax.swing.ButtonGroup colorRadioButtons;
1166    private javax.swing.JButton jButton1;
1167    private javax.swing.JButton jButton3;
1168    private javax.swing.JLabel jLabel1;
1169    private javax.swing.JLabel jLabel2;
1170    private javax.swing.JLabel jLabel3;
1171    private javax.swing.JLabel jLabel4;
1172    private javax.swing.JLabel jLabel5;
1173    private javax.swing.JLabel jLabel6;
1174    private javax.swing.JLabel jLabel7;
1175    private javax.swing.JLabel jLabel8;
1176    private javax.swing.JLabel jLabel9;
1177    private javax.swing.JPanel jPanel1;
1178    private javax.swing.JPanel jPanel10;
1179    private javax.swing.JPanel jPanel11;
1180    private javax.swing.JPanel jPanel12;
1181    private javax.swing.JPanel jPanel13;
1182    private javax.swing.JPanel jPanel14;
1183    private javax.swing.JPanel jPanel15;
1184    private javax.swing.JPanel jPanel2;
1185    private javax.swing.JPanel jPanel3;
1186    private javax.swing.JPanel jPanel4;
1187    private javax.swing.JPanel jPanel5;
1188    private javax.swing.JPanel jPanel6;
1189    private javax.swing.JPanel jPanel7;
1190    private javax.swing.JPanel jPanel8;
1191    private javax.swing.JPanel jPanel9;
1192    private javax.swing.JScrollPane jScrollPane1;
1193    // End of variables declaration//GEN-END:variables
1194   
1195    private void updateStatusLabels()
1196    {
1197        CurrentTimeFrameLabel.setText(timeFrames.currentTimeFrame != null
1198                ? timeFrames.currentTimeFrame.toString()
1199                : "");
1200       
1201        CurrentStationLabel.setText(timeFrames.currentStation != null
1202                ? timeFrames.currentStation.toString()
1203                : "");
1204       
1205        CurrentHighwayLabel.setText(timeFrames.currentHighway != null
1206                ? timeFrames.currentHighway.toString()
1207                : "");
1208        CurrentStationPostmileLabel.setText(timeFrames.currentStation != null
1209                ? Double.toString(timeFrames.currentStation.postmile)
1210                : "");
1211        CurrentStationDirectionLabel.setText(timeFrames.currentStation != null
1212                ? timeFrames.currentStation.direction.getLetter()
1213                : "");
1214        CurrentStationLocationLabel.setText(timeFrames.currentStation != null
1215                ? timeFrames.currentStation.location
1216                : "");
1217       
1218        CurrentLoopDetectorLabel.setText(timeFrames.currentLoopDetector != null
1219                ? Integer.toString(timeFrames.currentLoopDetector.loopID)
1220                : "");
1221        CurrentLoopDetectorTypeLabel.setText(timeFrames.currentLoopDetector != null
1222                ? timeFrames.currentLoopDetector.loopLocationID
1223                : "");
1224        CurrentLoopDetectorDescLabel.setText(timeFrames.currentLoopDetector != null
1225                ? timeFrames.currentLoopDetector.loopLocation
1226                : "");
1227    }
1228   
1229    private void updateButtonEnabled()
1230    {
1231        // add event button
1232        this.AddNewEventButton.setEnabled(
1233                timeFrames.currentTimeFrame != null 
1234                && timeFrames.currentHighway != null
1235                && timeFrames.currentStation != null 
1236                && timeFrames.currentLoopDetector != null
1237        );
1238       
1239        // delete event button
1240        DeleteEventButton.setEnabled(
1241                !TrafficLaneEventsTable.getSelectionModel().isSelectionEmpty());
1242       
1243        // delete time frame button
1244        DeleteTimeFrameButton.setEnabled(!TimeFrameList.isSelectionEmpty());
1245       
1246        // single preview buttons
1247        SinglePreviewStationButton.setEnabled(
1248                timeFrames.currentStation != null
1249                && timeFrames.currentTimeFrame != null
1250        );
1251       
1252        SinglePreviewHighwaysButton.setEnabled(
1253                timeFrames.currentTimeFrame != null
1254        );
1255       
1256        // cumulative preview buttons
1257        CumulativePreviewHighwaysButton.setEnabled(
1258                timeFrames.currentTimeFrame != null
1259        );
1260       
1261        CumulativePreviewStationButton.setEnabled(
1262                timeFrames.currentTimeFrame != null
1263                && timeFrames.currentStation != null
1264        );
1265    }
1266   
1267    @Override
1268    public void update(Observable o, Object arg)
1269    {
1270        String updateArg = (String) arg;
1271        updateStatusLabels();
1272        if(updateArg != null)
1273        {
1274            if(updateArg.equals("add frame") || updateArg.equals("delete frame"))
1275            {
1276                TimeFrameList.setModel(new TimeFrameListModel());
1277                TimeFrameList.setSelectedIndex(
1278                        timeFrames.getCurrentTimeFrameIndex());
1279                TrafficLaneEventsTable.setModel(new TrafficLaneEventsTableModel());
1280            }
1281            else if(updateArg.equals("select hwy"))
1282            {
1283                StationTable.setModel(new StationTableModel());
1284                LoopDetectorTable.setModel(new LoopDetectorTableModel());
1285            }
1286            else if(updateArg.equals("select station"))
1287            {
1288                LoopDetectorTable.setModel(new LoopDetectorTableModel());
1289            }
1290            else if(updateArg.equals("select frame"))
1291            {
1292                TrafficLaneEventsTable.setModel(
1293                        new TrafficLaneEventsTableModel());
1294            }
1295            else if(updateArg.equals("add event") 
1296                    || updateArg.equals("delete event"))
1297            {
1298                TrafficLaneEventsTable.setModel(
1299                        new TrafficLaneEventsTableModel());
1300                TrafficLaneEventsTable.getSelectionModel()
1301                        .setSelectionInterval(
1302                                timeFrames.getCurrentTrafficEventIndex(), 
1303                                timeFrames.getCurrentTrafficEventIndex());
1304            }
1305        }
1306        updateButtonEnabled();
1307    }
1308}
Note: See TracBrowser for help on using the repository browser.