source: trunk/EventBenchConsole/src/de/ugoe/cs/eventbench/swing/DlgSequenceDetails.java @ 176

Last change on this file since 176 was 174, checked in by jhall, 13 years ago

Code refactoring, some new methods and comments added

  • Property svn:mime-type set to text/plain
File size: 10.5 KB
Line 
1package de.ugoe.cs.eventbench.swing;
2
3import java.awt.EventQueue;
4import java.awt.Rectangle;
5
6import javax.swing.DefaultListModel;
7import javax.swing.JFrame;
8import javax.swing.JButton;
9import javax.swing.JScrollBar;
10
11import java.awt.event.MouseAdapter;
12import java.awt.event.MouseEvent;
13import javax.swing.JList;
14import java.util.List;
15import javax.swing.ListSelectionModel;
16import javax.swing.border.SoftBevelBorder;
17import javax.swing.border.BevelBorder;
18import javax.swing.event.ListSelectionListener;
19import javax.swing.event.ListSelectionEvent;
20
21import de.ugoe.cs.eventbench.data.Event;
22
23import javax.swing.JLabel;
24import java.awt.event.WindowAdapter;
25import java.awt.event.WindowEvent;
26import javax.swing.JScrollPane;
27import javax.swing.JPanel;
28import javax.swing.border.EtchedBorder;
29
30/**
31 * <p>
32 * This class provides a dialog to have a look on the events of the sequence,
33 * that was selected in {@link DlgSequences}. Furthermore, assertions can be
34 * added.
35 * </p>
36 *
37 * @author Jeffrey Hall
38 * @version 1.0
39 */
40public class DlgSequenceDetails {
41
42        private JFrame frmEvents;
43        private JFrame frmParent;
44
45        /**
46         * <p>
47         * Create the dialog.
48         * </p>
49         *
50         * @param parent
51         *            the parent window of type {@link DlgSequences}.
52         * @param events
53         *            list of events that is to be displayed.
54         */
55        public DlgSequenceDetails(JFrame parent, final List<Event<?>> events) {
56                frmParent = parent;
57                initialize(events);
58        }
59
60        /**
61         * <p>
62         * Launch the dialog.
63         * </p>
64         *
65         * @param parent
66         *            the parent window of type {@link DlgSequences}.
67         * @param events
68         *            list of events that is to be displayed.
69         */
70        public void showDialog(JFrame parent, final List<Event<?>> events) {
71                frmParent = parent;
72
73                EventQueue.invokeLater(new Runnable() {
74                        public void run() {
75                                try {
76                                        DlgSequenceDetails window = new DlgSequenceDetails(
77                                                        frmParent, events);
78                                        window.frmEvents.setVisible(true);
79                                } catch (Exception e) {
80                                        e.printStackTrace();
81                                }
82                        }
83                });
84        }
85
86        /**
87         * <p>
88         * Initialize the contents of the frame.
89         * </p>
90         *
91         * @param events
92         *            list of events that is to be displayed.
93         */
94        private void initialize(final List<Event<?>> events) {
95
96                final DefaultListModel modelListEvents = new DefaultListModel();
97                final DefaultListModel modelListTargets = new DefaultListModel();
98                final JList listEvents = new JList(modelListEvents);
99                final JList listTargets = new JList(modelListTargets);
100
101                frmEvents = new JFrame();
102                frmEvents.setTitle("Sequence details");
103                frmEvents.setBounds(100, 100, 731, 589);
104                frmEvents.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
105                frmEvents.getContentPane().setLayout(null);
106
107                // before closing the window, set parent to visible
108                frmEvents.addWindowListener(new WindowAdapter() {
109                        public void windowClosing(WindowEvent arg0) {
110                                frmParent.setVisible(true);
111                                frmEvents.dispose();
112                        }
113                });
114
115                JPanel panel = new JPanel();
116                panel.setBorder(new EtchedBorder(EtchedBorder.LOWERED, null, null));
117                panel.setBounds(10, 498, 705, 52);
118                frmEvents.getContentPane().add(panel);
119                panel.setLayout(null);
120
121                final JButton btnInsertBefore = new JButton("Insert before");
122                btnInsertBefore.setEnabled(false);
123                btnInsertBefore.setBounds(10, 11, 135, 31);
124                panel.add(btnInsertBefore);
125
126                final JButton btnInsertAfter = new JButton("Insert after");
127                btnInsertAfter.setEnabled(false);
128                btnInsertAfter.setBounds(155, 11, 135, 31);
129                panel.add(btnInsertAfter);
130
131                updateLists(events, modelListEvents, modelListTargets, listEvents,
132                                listTargets);
133
134                // listener for clicking the "Insert before" button
135                btnInsertBefore.addMouseListener(new MouseAdapter() {
136                        public void mouseClicked(MouseEvent arg0) {
137                                if (!btnInsertBefore.isEnabled())
138                                        return;
139
140                                addAssertion(events, modelListEvents, modelListTargets,
141                                                listEvents, listTargets, true);
142                        }
143                });
144
145                // listener for clicking the "Insert after" button
146                btnInsertAfter.addMouseListener(new MouseAdapter() {
147                        public void mouseClicked(MouseEvent arg0) {
148                                if (!btnInsertAfter.isEnabled())
149                                        return;
150
151                                addAssertion(events, modelListEvents, modelListTargets,
152                                                listEvents, listTargets, false);
153                        }
154                });
155
156                final JButton btnClose = new JButton("Back to sequences");
157                btnClose.setBounds(544, 11, 150, 31);
158                panel.add(btnClose);
159
160                JPanel panel_1 = new JPanel();
161                panel_1.setBorder(new EtchedBorder(EtchedBorder.LOWERED, null, null));
162                panel_1.setBounds(10, 11, 705, 476);
163                frmEvents.getContentPane().add(panel_1);
164                panel_1.setLayout(null);
165
166                final JScrollPane scrollPaneEvents = new JScrollPane();
167                scrollPaneEvents.setBounds(10, 29, 209, 436);
168                panel_1.add(scrollPaneEvents);
169                scrollPaneEvents.setViewportView(listEvents);
170
171                listEvents.setBorder(new SoftBevelBorder(BevelBorder.LOWERED, null,
172                                null, null, null));
173                listEvents.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
174
175                final JScrollPane scrollPaneTargets = new JScrollPane();
176                scrollPaneTargets.setBounds(229, 29, 466, 436);
177                panel_1.add(scrollPaneTargets);
178
179                // if there are more events than the list is able to display without
180                // vertical scrollbar, the event list has to be resized to fit to the
181                // target list
182                Rectangle r = scrollPaneEvents.getBounds();
183                r.height -= 18;
184                if (scrollPaneEvents.getVerticalScrollBar().isVisible()) {
185                        scrollPaneEvents.setBounds(r);
186                }
187
188                // listener for selecting a target: select the fitting event
189                listTargets.addListSelectionListener(new ListSelectionListener() {
190                        public void valueChanged(ListSelectionEvent arg0) {
191                                if (listTargets.getSelectedIndex() > -1) {
192
193                                        changeSelection(listEvents, listTargets, btnInsertBefore,
194                                                        btnInsertAfter, scrollPaneEvents, scrollPaneTargets);
195                                }
196                        }
197                });
198                scrollPaneTargets.setViewportView(listTargets);
199
200                listTargets.setBorder(new SoftBevelBorder(BevelBorder.LOWERED, null,
201                                null, null, null));
202                listTargets.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
203
204                JLabel lblEvents = new JLabel("Events:");
205                lblEvents.setBounds(10, 11, 46, 14);
206                panel_1.add(lblEvents);
207
208                JLabel lblTargets = new JLabel("Targets:");
209                lblTargets.setBounds(229, 11, 58, 14);
210                panel_1.add(lblTargets);
211
212                // listener for selecting an event: select the fitting target
213                listEvents.addListSelectionListener(new ListSelectionListener() {
214                        public void valueChanged(ListSelectionEvent arg0) {
215                                if (listEvents.getSelectedIndex() > -1) {
216
217                                        changeSelection(listTargets, listEvents, btnInsertBefore,
218                                                        btnInsertAfter, scrollPaneTargets, scrollPaneEvents);
219                                }
220                        }
221                });
222
223                // before closing the window, set parent to visible
224                btnClose.addMouseListener(new MouseAdapter() {
225                        public void mouseClicked(MouseEvent arg0) {
226                                frmParent.setVisible(true);
227                                frmEvents.dispose();
228                        }
229                });
230        }
231
232        /**
233         * <p>
234         * the value of one of the lists changed so the other has to be set to the
235         * fitting selection.
236         * </p>
237         *
238         * @param listValueHasToBeChanged
239         *            the selection of this list has to be corrected.
240         * @param listValueHasBeenChanged
241         *            the selection of this list is already correct.
242         * @param btnInsertBefore
243         *            to enable the "Insert before" button.
244         * @param btnInsertAfter
245         *            to enable the "Insert after" button.
246         * @param scrollPaneValueHasToBeChanged
247         *            the position of the scrollBar of this scrollPane has to be
248         *            corrected.
249         * @param scrollPaneValueHasBeenChanged
250         *            the position of the scrollBar of this scrollPane is already
251         *            correct.
252         */
253        private void changeSelection(final JList listValueHasToBeChanged,
254                        final JList listValueHasBeenChanged, final JButton btnInsertBefore,
255                        final JButton btnInsertAfter,
256                        final JScrollPane scrollPaneValueHasToBeChanged,
257                        final JScrollPane scrollPaneValueHasBeenChanged) {
258
259                JScrollBar bar1 = scrollPaneValueHasBeenChanged.getVerticalScrollBar();
260                JScrollBar bar2 = scrollPaneValueHasToBeChanged.getVerticalScrollBar();
261                bar2.setValue(bar1.getValue());
262
263                listValueHasToBeChanged.setSelectedIndex(listValueHasBeenChanged
264                                .getSelectedIndex());
265
266                btnInsertBefore.setEnabled(true);
267                btnInsertAfter.setEnabled(true);
268        }
269
270        /**
271         * <p>
272         * updates both lists, eventList and targetList to display the current
273         * status.
274         * </p>
275         *
276         * @param events
277         *            list of the current events that has to be displayed.
278         * @param modelListEvents
279         *            DefaultListModel to display the events.
280         * @param modelListTargets
281         *            DefaultListModel to display the targets.
282         * @param listEvents
283         *            the listEvents to store and reset the selection.
284         * @param listTargets
285         *            the listTargets to reset the selection after updating.
286         */
287        private void updateLists(final List<Event<?>> events,
288                        final javax.swing.DefaultListModel modelListEvents,
289                        final javax.swing.DefaultListModel modelListTargets,
290                        JList listEvents, JList listTargets) {
291
292                int selectedIndex = listEvents.getSelectedIndex();
293
294                modelListEvents.clear();
295                modelListTargets.clear();
296                for (int i = 0; i < events.size(); i++) {
297                        modelListEvents.addElement(events.get(i).getType());
298                        modelListTargets.addElement(events.get(i).getTarget());
299                }
300
301                if (selectedIndex > -1) {
302                        listEvents.setSelectedIndex(selectedIndex);
303                        listTargets.setSelectedIndex(selectedIndex);
304                }
305        }
306
307        /**
308         * <p>
309         * opens {@link DlgInsert} dialog to insert an assertion and updates the
310         * lists.
311         * </p>
312         *
313         * @param events
314         *            list of the current events.
315         * @param modelListEvents
316         *            needed to call updateList.
317         * @param modelListTargets
318         *            needed to call updateList.
319         * @param listEvents
320         *            needed to get the currently selected index and to update the
321         *            lists.
322         * @param listTargets
323         *            needed to update the lists.
324         * @param insertBefore
325         *            to decide if the assertions has to be inserted before or after
326         *            the current selection.
327         */
328        private void addAssertion(final List<Event<?>> events,
329                        final DefaultListModel modelListEvents,
330                        final DefaultListModel modelListTargets, final JList listEvents,
331                        final JList listTargets, boolean insertBefore) {
332
333                int selectedIndex = listEvents.getSelectedIndex();
334                DlgInsert.showDialog(events, selectedIndex, insertBefore);
335                updateLists(events, modelListEvents, modelListTargets, listEvents,
336                                listTargets);
337        }
338}
Note: See TracBrowser for help on using the repository browser.