package de.ugoe.cs.eventbench.swing;
import java.awt.EventQueue;
import java.awt.Rectangle;
import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.JScrollBar;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JList;
import java.util.List;
import javax.swing.ListSelectionModel;
import javax.swing.border.SoftBevelBorder;
import javax.swing.border.BevelBorder;
import javax.swing.event.ListSelectionListener;
import javax.swing.event.ListSelectionEvent;
import de.ugoe.cs.eventbench.data.Event;
import javax.swing.JLabel;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JScrollPane;
import javax.swing.JPanel;
import javax.swing.border.EtchedBorder;
/**
*
* This class provides a dialog to have a look on the events of the sequence,
* that was selected in {@link DlgSequences}. Furthermore, assertions can be
* added.
*
*
* @author Jeffrey Hall
* @version 1.0
*/
public class DlgSequenceDetails {
private JFrame frmEvents;
private JFrame frmParent;
/**
*
* Create the dialog.
*
*
* @param parent
* the parent window of type {@link DlgSequences}.
* @param events
* list of events that is to be displayed.
*/
public DlgSequenceDetails(JFrame parent, final List> events) {
frmParent = parent;
initialize(events);
}
/**
*
* Launch the dialog.
*
*
* @param parent
* the parent window of type {@link DlgSequences}.
* @param events
* list of events that is to be displayed.
*/
public void showDialog(JFrame parent, final List> events) {
frmParent = parent;
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
DlgSequenceDetails window = new DlgSequenceDetails(
frmParent, events);
window.frmEvents.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
*
* Initialize the contents of the frame.
*
*
* @param events
* list of events that is to be displayed.
*/
private void initialize(final List> events) {
final DefaultListModel modelListEvents = new DefaultListModel();
final DefaultListModel modelListTargets = new DefaultListModel();
final JList listEvents = new JList(modelListEvents);
final JList listTargets = new JList(modelListTargets);
frmEvents = new JFrame();
frmEvents.setTitle("Sequence details");
frmEvents.setBounds(100, 100, 731, 589);
frmEvents.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
frmEvents.getContentPane().setLayout(null);
// before closing the window, set parent to visible
frmEvents.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent arg0) {
frmParent.setVisible(true);
frmEvents.dispose();
}
});
JPanel panel = new JPanel();
panel.setBorder(new EtchedBorder(EtchedBorder.LOWERED, null, null));
panel.setBounds(10, 498, 705, 52);
frmEvents.getContentPane().add(panel);
panel.setLayout(null);
final JButton btnInsertBefore = new JButton("Insert before");
btnInsertBefore.setEnabled(false);
btnInsertBefore.setBounds(10, 11, 135, 31);
panel.add(btnInsertBefore);
final JButton btnInsertAfter = new JButton("Insert after");
btnInsertAfter.setEnabled(false);
btnInsertAfter.setBounds(155, 11, 135, 31);
panel.add(btnInsertAfter);
updateLists(events, modelListEvents, modelListTargets, listEvents,
listTargets);
// listener for clicking the "Insert before" button
btnInsertBefore.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent arg0) {
if (!btnInsertBefore.isEnabled())
return;
addAssertion(events, modelListEvents, modelListTargets,
listEvents, listTargets, true);
}
});
// listener for clicking the "Insert after" button
btnInsertAfter.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent arg0) {
if (!btnInsertAfter.isEnabled())
return;
addAssertion(events, modelListEvents, modelListTargets,
listEvents, listTargets, false);
}
});
final JButton btnClose = new JButton("Back to sequences");
btnClose.setBounds(544, 11, 150, 31);
panel.add(btnClose);
JPanel panel_1 = new JPanel();
panel_1.setBorder(new EtchedBorder(EtchedBorder.LOWERED, null, null));
panel_1.setBounds(10, 11, 705, 476);
frmEvents.getContentPane().add(panel_1);
panel_1.setLayout(null);
final JScrollPane scrollPaneEvents = new JScrollPane();
scrollPaneEvents.setBounds(10, 29, 209, 436);
panel_1.add(scrollPaneEvents);
scrollPaneEvents.setViewportView(listEvents);
listEvents.setBorder(new SoftBevelBorder(BevelBorder.LOWERED, null,
null, null, null));
listEvents.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
final JScrollPane scrollPaneTargets = new JScrollPane();
scrollPaneTargets.setBounds(229, 29, 466, 436);
panel_1.add(scrollPaneTargets);
// if there are more events than the list is able to display without
// vertical scrollbar, the event list has to be resized to fit to the
// target list
Rectangle r = scrollPaneEvents.getBounds();
r.height -= 18;
if (scrollPaneEvents.getVerticalScrollBar().isVisible()) {
scrollPaneEvents.setBounds(r);
}
// listener for selecting a target: select the fitting event
listTargets.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent arg0) {
if (listTargets.getSelectedIndex() > -1) {
changeSelection(listEvents, listTargets, btnInsertBefore,
btnInsertAfter, scrollPaneEvents, scrollPaneTargets);
}
}
});
scrollPaneTargets.setViewportView(listTargets);
listTargets.setBorder(new SoftBevelBorder(BevelBorder.LOWERED, null,
null, null, null));
listTargets.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
JLabel lblEvents = new JLabel("Events:");
lblEvents.setBounds(10, 11, 46, 14);
panel_1.add(lblEvents);
JLabel lblTargets = new JLabel("Targets:");
lblTargets.setBounds(229, 11, 58, 14);
panel_1.add(lblTargets);
// listener for selecting an event: select the fitting target
listEvents.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent arg0) {
if (listEvents.getSelectedIndex() > -1) {
changeSelection(listTargets, listEvents, btnInsertBefore,
btnInsertAfter, scrollPaneTargets, scrollPaneEvents);
}
}
});
// before closing the window, set parent to visible
btnClose.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent arg0) {
frmParent.setVisible(true);
frmEvents.dispose();
}
});
}
/**
*
* the value of one of the lists changed so the other has to be set to the
* fitting selection.
*
*
* @param listValueHasToBeChanged
* the selection of this list has to be corrected.
* @param listValueHasBeenChanged
* the selection of this list is already correct.
* @param btnInsertBefore
* to enable the "Insert before" button.
* @param btnInsertAfter
* to enable the "Insert after" button.
* @param scrollPaneValueHasToBeChanged
* the position of the scrollBar of this scrollPane has to be
* corrected.
* @param scrollPaneValueHasBeenChanged
* the position of the scrollBar of this scrollPane is already
* correct.
*/
private void changeSelection(final JList listValueHasToBeChanged,
final JList listValueHasBeenChanged, final JButton btnInsertBefore,
final JButton btnInsertAfter,
final JScrollPane scrollPaneValueHasToBeChanged,
final JScrollPane scrollPaneValueHasBeenChanged) {
JScrollBar bar1 = scrollPaneValueHasBeenChanged.getVerticalScrollBar();
JScrollBar bar2 = scrollPaneValueHasToBeChanged.getVerticalScrollBar();
bar2.setValue(bar1.getValue());
listValueHasToBeChanged.setSelectedIndex(listValueHasBeenChanged
.getSelectedIndex());
btnInsertBefore.setEnabled(true);
btnInsertAfter.setEnabled(true);
}
/**
*
* updates both lists, eventList and targetList to display the current
* status.
*
*
* @param events
* list of the current events that has to be displayed.
* @param modelListEvents
* DefaultListModel to display the events.
* @param modelListTargets
* DefaultListModel to display the targets.
* @param listEvents
* the listEvents to store and reset the selection.
* @param listTargets
* the listTargets to reset the selection after updating.
*/
private void updateLists(final List> events,
final javax.swing.DefaultListModel modelListEvents,
final javax.swing.DefaultListModel modelListTargets,
JList listEvents, JList listTargets) {
int selectedIndex = listEvents.getSelectedIndex();
modelListEvents.clear();
modelListTargets.clear();
for (int i = 0; i < events.size(); i++) {
modelListEvents.addElement(events.get(i).getType());
modelListTargets.addElement(events.get(i).getTarget());
}
if (selectedIndex > -1) {
listEvents.setSelectedIndex(selectedIndex);
listTargets.setSelectedIndex(selectedIndex);
}
}
/**
*
* opens {@link DlgInsert} dialog to insert an assertion and updates the
* lists.
*
*
* @param events
* list of the current events.
* @param modelListEvents
* needed to call updateList.
* @param modelListTargets
* needed to call updateList.
* @param listEvents
* needed to get the currently selected index and to update the
* lists.
* @param listTargets
* needed to update the lists.
* @param insertBefore
* to decide if the assertions has to be inserted before or after
* the current selection.
*/
private void addAssertion(final List> events,
final DefaultListModel modelListEvents,
final DefaultListModel modelListTargets, final JList listEvents,
final JList listTargets, boolean insertBefore) {
int selectedIndex = listEvents.getSelectedIndex();
DlgInsert.showDialog(events, selectedIndex, insertBefore);
updateLists(events, modelListEvents, modelListTargets, listEvents,
listTargets);
}
}