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

Revision 247, 57.3 KB checked in by jdalbey, 7 years ago (diff)

TrafficEventsEditor?: Adjust GUI so time frame buttons fit on screen.

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