source: tmcsimulator-scriptbuilder/branches/ScriptBuilder4/src/event/editor/Editor.java @ 6

Revision 6, 27.1 KB checked in by jdalbey, 9 years ago (diff)

Add original prototype to branch

Line 
1
2package event.editor;
3
4import java.awt.BorderLayout;
5import java.awt.Color;
6import java.awt.FlowLayout;
7import javax.swing.*;
8import java.util.*;
9import java.awt.event.*;
10
11enum UpdateType
12{
13    Add, Remove, TitleChange
14}
15
16class PropertyUpdate
17{
18    private UpdateType type;
19    private PropertyPanel panel;
20    private int position = -1;
21
22    public PropertyUpdate(UpdateType theType, PropertyPanel thePanel)
23    {
24        type = theType;
25        panel = thePanel;
26    }
27
28    public PropertyUpdate(UpdateType theType, PropertyPanel thePanel, int thePosition)
29    {
30        this(theType, thePanel);
31        position = thePosition;
32    }
33
34    public int getPosition()
35    {
36        if (position == -1)
37        {
38            throw new RuntimeException("position unknown");
39        }
40
41        return position;
42    }
43
44    public UpdateType getType()
45    {
46        return type;
47    }
48   
49    public PropertyPanel getPanel()
50    {
51        return panel;
52    }
53}
54
55enum PropertyTypes
56{
57    Optional, Multiple;
58}
59
60class PropertyPanel
61{
62    private final JPanel panel;
63    private final Properties property;
64   
65    public PropertyPanel(JPanel thePanel,
66            Properties theProperty)
67    {
68        panel = thePanel;
69        property = theProperty;
70    }
71
72    public JPanel getPanel()
73    {
74        return panel;
75    }
76   
77    public Properties getProperty()
78    {
79        return property;
80    }
81
82    public String title()
83    {
84        return property.getTitle();
85    }
86}
87
88class MultPropertyPanel extends PropertyPanel
89{
90    private int index;
91
92    public MultPropertyPanel(JPanel thePanel,
93            Properties theProperty,
94            int theIndex)
95    {
96        super(thePanel, theProperty);
97        index = theIndex;
98    }
99
100    public int getIndex()
101    {
102        return index;
103    }
104
105    public void setIndex(int newIndex)
106    {
107        index = newIndex;
108    }
109
110    @Override
111    public String title()
112    {
113        return super.title() + " " + index;
114    }
115}
116
117class PropertyPanels extends Observable
118{
119    private Vector<PropertyPanel> properties = new Vector<PropertyPanel>();
120
121    private EnumMap<Properties, Integer> propertyCounter =
122            new EnumMap<Properties, Integer>(Properties.class);
123
124    public PropertyPanels()
125    {
126        for (Properties property : Properties.values())
127        {
128            propertyCounter.put(property, 0);
129        }
130    }
131
132    private int nextIndex(Properties property)
133    {
134        propertyCounter.put(property, propertyCounter.get(property) + 1);
135
136        return propertyCounter.get(property);
137    }
138
139    /**
140    public Vector<PropertyPanel> getProperties()
141    {
142        return (Vector<PropertyPanel>) properties.clone();
143    }
144    */
145
146    private int add(PropertyPanel panel)
147    {
148        int position = 0;
149       
150        for (int i = 0; i < properties.size(); i++)
151        {
152            if (properties.get(i).title().compareTo(panel.title()) < 0)
153            {
154                position = i + 1;
155            }
156        }
157       
158        properties.add(position, panel);
159       
160        return position;
161    }
162
163    public PropertyPanel addPropertyPanel(Properties property, JPanel panel)
164    {
165        PropertyPanel propertyPanel = null;
166
167        if (property.getType() == PropertyTypes.Multiple)
168        {
169            propertyPanel = new MultPropertyPanel(panel, property, nextIndex(property));
170            //propertyPanel.addObserver(this);
171            int position = add(propertyPanel);
172            setChanged();
173            notifyObservers(new PropertyUpdate(UpdateType.Add, propertyPanel, position));
174           
175        }
176        else if (property.getType() == PropertyTypes.Optional)
177        {
178            if (containsProperty(property))
179            {
180                throw new RuntimeException("Property \"" + property + "\" is already added");
181            }
182            else
183            {
184                propertyPanel = new PropertyPanel(panel, property);
185                int position = add(propertyPanel);
186                //propertyPanel.addObserver(this);
187                setChanged();
188                notifyObservers(new PropertyUpdate(UpdateType.Add, propertyPanel, position));
189            }
190        }
191        else
192        {
193            throw new RuntimeException("Property \"" + property + "\" not accounted for");
194        }
195
196        return propertyPanel;
197    }
198
199    private boolean remove(PropertyPanel panel)
200    {
201        boolean result = false;
202
203        if ((result = properties.remove(panel)))
204        {
205            setChanged();
206            notifyObservers(new PropertyUpdate(UpdateType.Remove, panel));
207        }
208        else
209        {
210            throw new RuntimeException("Attempted to remove panel that did not exist");
211        }
212
213
214        if (panel.getProperty().getType() == PropertyTypes.Multiple)
215        {
216            Vector<MultPropertyPanel> panelsOfSameType = new Vector<MultPropertyPanel>();
217            Vector<MultPropertyPanel> panelsOfGreaterIndex = new Vector<MultPropertyPanel>();
218
219            propertyCounter.put(panel.getProperty(), propertyCounter.get(panel.getProperty()) - 1);
220           
221            // extract panels of the same property type
222            for (PropertyPanel pan : properties)
223            {
224                if (pan.getProperty() == panel.getProperty())
225                {
226                    panelsOfSameType.add((MultPropertyPanel) pan);
227                }
228            }
229
230            // extract panels whose index is greater than the index of the panel
231            // being removed
232            for (MultPropertyPanel pan : panelsOfSameType)
233            {
234                if (pan.getIndex() > ((MultPropertyPanel) panel).getIndex())
235                {
236                    panelsOfGreaterIndex.add(pan);
237                }
238            }
239           
240            // decrement the index of each of the remaining panels by one
241            for (MultPropertyPanel pan : panelsOfGreaterIndex)
242            {
243                pan.setIndex(pan.getIndex() - 1);
244                setChanged();
245                notifyObservers(new PropertyUpdate(UpdateType.TitleChange, pan));
246            }
247        }
248        else if (panel.getProperty().getType() == PropertyTypes.Optional)
249        {
250            // do nothing
251        }
252        else
253        {
254            throw new RuntimeException("PropertyTypes not accounted for");
255        }
256
257        return result;
258    }
259
260    public PropertyPanel removeProperty(Properties property)
261    {
262        if (property.getType() == PropertyTypes.Multiple)
263        {
264            throw new RuntimeException("Attemping to remove a property of multiple type");
265        }
266
267        PropertyPanel removed = null;
268
269        for (PropertyPanel panel : properties)
270        {
271            if (panel.getProperty() == property)
272            {
273                removed = panel;
274            }
275        }
276
277        if (removed == null)
278        {
279            throw new RuntimeException("Could not find panel with property \"" + property + "\"");
280        }
281
282        remove(removed);
283       
284        return removed;
285    }
286
287    public PropertyPanel removeProperty(JPanel jPanel)
288    {
289        PropertyPanel removed = null;
290
291        for (PropertyPanel panel : properties)
292        {
293            if (panel.getPanel() == jPanel)
294            {
295                removed = panel;
296            }
297        }
298
299        if (removed == null)
300        {
301            throw new RuntimeException("Could not find jPanel");
302        }
303
304        remove(removed);
305
306        return removed;
307    }
308
309    public PropertyPanel removeProperty(String title)
310    {
311        PropertyPanel removed = null;
312
313        for (PropertyPanel panel : properties)
314        {
315            if (panel.title().equals(title))
316            {
317                if (removed == null)
318                {
319                    removed = panel;
320                }
321                else
322                {
323                    throw new RuntimeException("Attempted to remove a property by title but the title was not unique");
324                }
325            }
326        }
327
328        if (removed == null)
329        {
330            throw new RuntimeException("Did not find titel \"" + title + "\"");
331        }
332
333        remove(removed);
334
335        return removed;       
336    }
337
338    public boolean removeProperty(PropertyPanel panel)
339    {
340        return remove(panel);
341    }
342
343    public boolean containsProperty(Properties property)
344    {
345        boolean contains = false;
346
347        for (PropertyPanel panel : properties)
348        {
349            if (panel.getProperty() == property)
350            {
351                contains = true;
352            }
353        }
354
355        return contains;
356    }
357}
358
359class PropertyModel extends Observable implements Observer
360{
361
362    PropertyPanels properties = new PropertyPanels();
363   
364    private EnumMap<Properties, Class> classMap =
365            new EnumMap<Properties, Class>(Properties.class);
366
367    public PropertyModel()
368    {
369        classMap.put(Properties.ATMS, GenericEvaluationPanel.class);
370        classMap.put(Properties.ActivityLog, GenericEvaluationPanel.class);
371        classMap.put(Properties.CAD, GenericEvaluationPanel.class);
372        classMap.put(Properties.Facilitator, GenericEvaluationPanel.class);
373        classMap.put(Properties.Radio, GenericEvaluationPanel.class);
374
375        classMap.put(Properties.MaintenanceRadio, MaintenanceRadioPanel.class);
376        classMap.put(Properties.TMTRadio, TMTRadioPanel.class);
377        classMap.put(Properties.CHPRadio, CHPRadioPanel.class);
378        classMap.put(Properties.Telephone, TelephonePanel.class);
379
380        classMap.put(Properties.Audio, AudioPanel.class);
381        classMap.put(Properties.CADLog, CADLogPanel.class);
382        classMap.put(Properties.CCTV, CCTVPanel.class);
383        classMap.put(Properties.CMS, CMSEvaluationPanel.class);
384        classMap.put(Properties.Paramics, ParamicsPanel.class);
385        classMap.put(Properties.Tow, TowPanel.class);
386        classMap.put(Properties.Unit, UnitPanel.class);
387        classMap.put(Properties.Witness, WitnessPanel.class);
388
389        properties.addObserver(this);
390    }
391
392    public void addProperty(Properties property)
393    {
394        try
395        {
396            JPanel panel = (JPanel) classMap.get(property).newInstance();
397
398            final PropertyPanel propertyPanel = properties.addPropertyPanel(property, panel);
399           
400            if (property.getType() == PropertyTypes.Multiple)
401            {
402                if (panel instanceof RemoveablePanel)
403                {
404                    ((RemoveablePanel) panel).setRemoveListener(new ActionListener() {
405                        public void actionPerformed(ActionEvent evt)
406                        {
407                            properties.removeProperty(propertyPanel);
408                        }
409                    });
410                }
411                else
412                {
413                    throw new RuntimeException("Property was multiple but panel was not removeable");
414                }
415            }
416        }
417        catch(Exception e)
418        {
419            System.err.println("Could not create panel of type \"" + property + "\"");
420        }
421    }
422
423    public void removeProperty(Properties property)
424    {
425        properties.removeProperty(property);
426    }
427
428    public void update(Observable o, Object arg) {
429        setChanged();
430        notifyObservers(arg);
431    }
432
433    /*
434    public Vector<PropertyPanel> getPropertyPanels()
435    {
436        return properties.getProperties();
437    }
438    */
439}
440
441public class Editor extends javax.swing.JFrame implements Observer {
442
443    private PropertyModel model = new PropertyModel();
444
445    public PropertyModel getPropertyModel()
446    {
447        return model;
448    }
449
450    public void addProperty(Properties property)
451    {
452            model.addProperty(property);
453    }
454
455    private ActionListener optionalChangeListener = new ActionListener() {
456        public void actionPerformed(ActionEvent evt)
457        {
458            JCheckBoxMenuItem src = (JCheckBoxMenuItem) evt.getSource();
459            Properties property = Properties.valueOf(src.getText().replaceAll(" ", ""));
460           
461            if (src.isSelected())
462            {
463                model.addProperty(property);
464            }
465            else
466            {
467                model.removeProperty(property);
468            }
469        }
470    };
471
472    private ActionListener multipleChangeListener = new ActionListener() {
473        public void actionPerformed(ActionEvent evt)
474        {
475            JMenuItem src = (JMenuItem) evt.getSource();
476            model.addProperty(Properties.valueOf(src.getText().replaceAll(" ", "")));
477        }
478    };
479
480    public Editor() {
481        initComponents();
482
483        model.addObserver(this);
484       
485        // For each menu
486        for (int menuCtr = 0; menuCtr < jMenuBar1.getMenuCount(); menuCtr++)
487        {
488            // for each menu item
489            for (java.awt.Component comp : jMenuBar1.getMenu(menuCtr).getMenuComponents())
490            {
491                JMenuItem item = (JMenuItem) comp;
492
493                String itemName = item.getText().replaceAll(" ", "");
494
495                Properties property = Properties.valueOf(itemName);
496
497                if (property.getType() == PropertyTypes.Multiple)
498                {
499                    item.addActionListener(multipleChangeListener);
500                }
501                else if (property.getType() == PropertyTypes.Optional)
502                {
503                    item.addActionListener(optionalChangeListener);
504                }
505                else
506                {
507                    throw new RuntimeException("Property type not accounted for");
508                }
509            }
510        }
511    }
512
513    /** This method is called from within the constructor to
514     * initialize the form.
515     * WARNING: Do NOT modify this code. The content of this method is
516     * always regenerated by the Form Editor.
517     */
518    @SuppressWarnings("unchecked")
519    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
520    private void initComponents() {
521
522        jTabbedPane1 = new javax.swing.JTabbedPane();
523        jMenuBar1 = new javax.swing.JMenuBar();
524        jMenu1 = new javax.swing.JMenu();
525        ATMS = new javax.swing.JCheckBoxMenuItem();
526        ActivityLog = new javax.swing.JCheckBoxMenuItem();
527        CAD = new javax.swing.JCheckBoxMenuItem();
528        CMS = new javax.swing.JMenuItem();
529        Facilitator = new javax.swing.JCheckBoxMenuItem();
530        Radio = new javax.swing.JCheckBoxMenuItem();
531        JMenu2 = new javax.swing.JMenu();
532        MaintenanceRadio = new javax.swing.JCheckBoxMenuItem();
533        TMTRadio = new javax.swing.JCheckBoxMenuItem();
534        Telephone = new javax.swing.JCheckBoxMenuItem();
535        jMenu3 = new javax.swing.JMenu();
536        Audio = new javax.swing.JMenuItem();
537        CADLog = new javax.swing.JMenuItem();
538        CCTV = new javax.swing.JMenuItem();
539        CHPRadio = new javax.swing.JCheckBoxMenuItem();
540        Paramics = new javax.swing.JMenuItem();
541        Tow = new javax.swing.JMenuItem();
542        Unit = new javax.swing.JMenuItem();
543        Witness = new javax.swing.JMenuItem();
544
545        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
546        setTitle("Event Editor");
547
548        jMenu1.setText("Evaluations");
549
550        ATMS.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_A, java.awt.event.InputEvent.CTRL_MASK));
551        ATMS.setText("ATMS");
552        ATMS.setIcon(new javax.swing.ImageIcon(getClass().getResource("/images/ATMSEval.png"))); // NOI18N
553        ATMS.addActionListener(new java.awt.event.ActionListener() {
554            public void actionPerformed(java.awt.event.ActionEvent evt) {
555                multipleChange(evt);
556            }
557        });
558        jMenu1.add(ATMS);
559
560        ActivityLog.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_A, java.awt.event.InputEvent.ALT_MASK));
561        ActivityLog.setText("Activity Log");
562        ActivityLog.setIcon(new javax.swing.ImageIcon(getClass().getResource("/images/ActivityLogEval.png"))); // NOI18N
563        ActivityLog.addActionListener(new java.awt.event.ActionListener() {
564            public void actionPerformed(java.awt.event.ActionEvent evt) {
565                multipleChange(evt);
566            }
567        });
568        jMenu1.add(ActivityLog);
569
570        CAD.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_C, java.awt.event.InputEvent.ALT_MASK));
571        CAD.setText("CAD");
572        CAD.setIcon(new javax.swing.ImageIcon(getClass().getResource("/images/CADEval.png"))); // NOI18N
573        CAD.addActionListener(new java.awt.event.ActionListener() {
574            public void actionPerformed(java.awt.event.ActionEvent evt) {
575                multipleChange(evt);
576            }
577        });
578        jMenu1.add(CAD);
579
580        CMS.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_C, java.awt.event.InputEvent.ALT_MASK | java.awt.event.InputEvent.CTRL_MASK));
581        CMS.setIcon(new javax.swing.ImageIcon(getClass().getResource("/images/CMSEval.png"))); // NOI18N
582        CMS.setText("CMS");
583        CMS.addMouseListener(new java.awt.event.MouseAdapter() {
584            public void mouseClicked(java.awt.event.MouseEvent evt) {
585                multipleChangeListener(evt);
586            }
587        });
588        CMS.addActionListener(new java.awt.event.ActionListener() {
589            public void actionPerformed(java.awt.event.ActionEvent evt) {
590                multipleChange(evt);
591            }
592        });
593        jMenu1.add(CMS);
594
595        Facilitator.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F, java.awt.event.InputEvent.CTRL_MASK));
596        Facilitator.setText("Facilitator");
597        Facilitator.setIcon(new javax.swing.ImageIcon(getClass().getResource("/images/FacilitatorEval.png"))); // NOI18N
598        Facilitator.addActionListener(new java.awt.event.ActionListener() {
599            public void actionPerformed(java.awt.event.ActionEvent evt) {
600                optionalChange(evt);
601            }
602        });
603        jMenu1.add(Facilitator);
604
605        Radio.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_R, java.awt.event.InputEvent.CTRL_MASK));
606        Radio.setText("Radio");
607        Radio.setIcon(new javax.swing.ImageIcon(getClass().getResource("/images/RadioEval.png"))); // NOI18N
608        Radio.addActionListener(new java.awt.event.ActionListener() {
609            public void actionPerformed(java.awt.event.ActionEvent evt) {
610                optionalChange(evt);
611            }
612        });
613        jMenu1.add(Radio);
614
615        jMenuBar1.add(jMenu1);
616
617        JMenu2.setText("Instructor Actions");
618
619        MaintenanceRadio.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_M, java.awt.event.InputEvent.CTRL_MASK));
620        MaintenanceRadio.setText("Maintenance Radio");
621        MaintenanceRadio.setIcon(new javax.swing.ImageIcon(getClass().getResource("/images/MaintenanceRadio.png"))); // NOI18N
622        MaintenanceRadio.addActionListener(new java.awt.event.ActionListener() {
623            public void actionPerformed(java.awt.event.ActionEvent evt) {
624                optionalChange(evt);
625            }
626        });
627        JMenu2.add(MaintenanceRadio);
628
629        TMTRadio.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_T, java.awt.event.InputEvent.ALT_MASK | java.awt.event.InputEvent.CTRL_MASK));
630        TMTRadio.setText("TMT Radio");
631        TMTRadio.setIcon(new javax.swing.ImageIcon(getClass().getResource("/images/TMTRadio.png"))); // NOI18N
632        TMTRadio.addActionListener(new java.awt.event.ActionListener() {
633            public void actionPerformed(java.awt.event.ActionEvent evt) {
634                optionalChange(evt);
635            }
636        });
637        JMenu2.add(TMTRadio);
638
639        Telephone.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_T, java.awt.event.InputEvent.SHIFT_MASK | java.awt.event.InputEvent.CTRL_MASK));
640        Telephone.setText("Telephone");
641        Telephone.setIcon(new javax.swing.ImageIcon(getClass().getResource("/images/Telephone.png"))); // NOI18N
642        Telephone.addActionListener(new java.awt.event.ActionListener() {
643            public void actionPerformed(java.awt.event.ActionEvent evt) {
644                optionalChange(evt);
645            }
646        });
647        JMenu2.add(Telephone);
648
649        jMenuBar1.add(JMenu2);
650
651        jMenu3.setText("Automated Data");
652
653        Audio.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_A, java.awt.event.InputEvent.CTRL_MASK));
654        Audio.setIcon(new javax.swing.ImageIcon(getClass().getResource("/images/Audio.png"))); // NOI18N
655        Audio.setText("Audio");
656        jMenu3.add(Audio);
657
658        CADLog.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_C, java.awt.event.InputEvent.CTRL_MASK));
659        CADLog.setIcon(new javax.swing.ImageIcon(getClass().getResource("/images/CAD.png"))); // NOI18N
660        CADLog.setText("CAD Log");
661        jMenu3.add(CADLog);
662
663        CCTV.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_V, java.awt.event.InputEvent.CTRL_MASK));
664        CCTV.setIcon(new javax.swing.ImageIcon(getClass().getResource("/images/CCTV.png"))); // NOI18N
665        CCTV.setText("CCTV");
666        jMenu3.add(CCTV);
667
668        CHPRadio.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_C, java.awt.event.InputEvent.ALT_MASK));
669        CHPRadio.setText("CHP Radio");
670        CHPRadio.setIcon(new javax.swing.ImageIcon(getClass().getResource("/images/CHPRadio.png"))); // NOI18N
671        CHPRadio.addActionListener(new java.awt.event.ActionListener() {
672            public void actionPerformed(java.awt.event.ActionEvent evt) {
673                optionalChange(evt);
674            }
675        });
676        jMenu3.add(CHPRadio);
677
678        Paramics.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_P, java.awt.event.InputEvent.CTRL_MASK));
679        Paramics.setIcon(new javax.swing.ImageIcon(getClass().getResource("/images/Paramics.png"))); // NOI18N
680        Paramics.setText("Paramics");
681        jMenu3.add(Paramics);
682
683        Tow.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_T, java.awt.event.InputEvent.CTRL_MASK));
684        Tow.setIcon(new javax.swing.ImageIcon(getClass().getResource("/images/Tow.png"))); // NOI18N
685        Tow.setText("Tow");
686        jMenu3.add(Tow);
687
688        Unit.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_U, java.awt.event.InputEvent.CTRL_MASK));
689        Unit.setIcon(new javax.swing.ImageIcon(getClass().getResource("/images/Unit.png"))); // NOI18N
690        Unit.setText("Unit");
691        jMenu3.add(Unit);
692
693        Witness.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_W, java.awt.event.InputEvent.CTRL_MASK));
694        Witness.setIcon(new javax.swing.ImageIcon(getClass().getResource("/images/Witness.png"))); // NOI18N
695        Witness.setText("Witness");
696        jMenu3.add(Witness);
697
698        jMenuBar1.add(jMenu3);
699
700        setJMenuBar(jMenuBar1);
701
702        org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane());
703        getContentPane().setLayout(layout);
704        layout.setHorizontalGroup(
705            layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
706            .add(layout.createSequentialGroup()
707                .addContainerGap()
708                .add(jTabbedPane1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 921, Short.MAX_VALUE)
709                .addContainerGap())
710        );
711        layout.setVerticalGroup(
712            layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
713            .add(layout.createSequentialGroup()
714                .addContainerGap()
715                .add(jTabbedPane1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 580, Short.MAX_VALUE)
716                .addContainerGap())
717        );
718
719        pack();
720    }// </editor-fold>//GEN-END:initComponents
721
722    private void multipleChangeListener(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_multipleChangeListener
723
724    }//GEN-LAST:event_multipleChangeListener
725
726    private void multipleChange(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_multipleChange
727
728    }//GEN-LAST:event_multipleChange
729
730    private void optionalChange(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_optionalChange
731
732    }//GEN-LAST:event_optionalChange
733
734    /**
735    * @param args the command line arguments
736    */
737    public static void main(String args[]) {
738        java.awt.EventQueue.invokeLater(new Runnable() {
739            public void run() {
740                new Editor().setVisible(true);
741            }
742        });
743    }
744
745    // Variables declaration - do not modify//GEN-BEGIN:variables
746    private javax.swing.JCheckBoxMenuItem ATMS;
747    private javax.swing.JCheckBoxMenuItem ActivityLog;
748    private javax.swing.JMenuItem Audio;
749    private javax.swing.JCheckBoxMenuItem CAD;
750    private javax.swing.JMenuItem CADLog;
751    private javax.swing.JMenuItem CCTV;
752    private javax.swing.JCheckBoxMenuItem CHPRadio;
753    private javax.swing.JMenuItem CMS;
754    private javax.swing.JCheckBoxMenuItem Facilitator;
755    private javax.swing.JMenu JMenu2;
756    private javax.swing.JCheckBoxMenuItem MaintenanceRadio;
757    private javax.swing.JMenuItem Paramics;
758    private javax.swing.JCheckBoxMenuItem Radio;
759    private javax.swing.JCheckBoxMenuItem TMTRadio;
760    private javax.swing.JCheckBoxMenuItem Telephone;
761    private javax.swing.JMenuItem Tow;
762    private javax.swing.JMenuItem Unit;
763    private javax.swing.JMenuItem Witness;
764    private javax.swing.JMenu jMenu1;
765    private javax.swing.JMenu jMenu3;
766    private javax.swing.JMenuBar jMenuBar1;
767    private javax.swing.JTabbedPane jTabbedPane1;
768    // End of variables declaration//GEN-END:variables
769
770    public void update(Observable o, Object arg) {
771
772        final PropertyUpdate update = (PropertyUpdate) arg;
773        final ImageIcon image = update.getPanel().getProperty().getImage();
774        final String caption = update.getPanel().title();
775
776        final JLabel title = new JLabel(caption, image, JLabel.CENTER);
777
778        /*
779        final BorderLayout layout = new BorderLayout();
780        final JPanel title = new JPanel(layout);
781        title.setOpaque(false);
782        title.add(new JLabel(image), BorderLayout.WEST);
783        title.add(new JLabel(caption), BorderLayout.EAST);
784        */
785       
786        if (update.getType() == UpdateType.Add)
787        {
788            jTabbedPane1.insertTab(null, null,
789                    update.getPanel().getPanel(), null, update.getPosition());
790            jTabbedPane1.setTabComponentAt(update.getPosition(), title);
791            jTabbedPane1.setSelectedIndex(update.getPosition());
792        }
793        else if (update.getType() == UpdateType.Remove)
794        {
795            jTabbedPane1.remove(update.getPanel().getPanel());
796        }
797        else if (update.getType() == UpdateType.TitleChange)
798        {
799            final int index = jTabbedPane1.indexOfComponent(
800                    update.getPanel().getPanel());
801
802            new Thread(new Runnable() {
803                public void run() {
804                    Color c = jTabbedPane1.getForegroundAt(index);
805                    jTabbedPane1.setForegroundAt(index, Color.blue);
806                    try { Thread.sleep(350); } catch(Exception e) { }
807                    jTabbedPane1.setTabComponentAt(index, title);
808                    try { Thread.sleep(350); } catch(Exception e) { }
809                    jTabbedPane1.setForegroundAt(index, c);
810                }
811            }).start();
812        }
813        else
814        {
815            throw new RuntimeException("UpdateType not accounted for");
816        }
817    }
818
819}
Note: See TracBrowser for help on using the repository browser.