package com.ibm.nmon.gui.time; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.awt.BorderLayout; import java.awt.Color; import java.awt.event.HierarchyListener; import java.awt.event.HierarchyEvent; import javax.swing.BorderFactory; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.ListSelectionModel; import com.ibm.nmon.gui.GUITable; import com.ibm.nmon.gui.Styles; import com.ibm.nmon.gui.main.NMONVisualizerGui; import com.ibm.nmon.interval.Interval; /** * <p> * JPanel containing a list of the current {@link DataSet DataSets} and their start and end times. * The number of records the data set contains for an interval is also shown. * <p> * * <p> * The given interval is set by adding this class as a {@link PropertyChangeListener} for * <code>interval</code> events. This interval can be null to indicate an invalid value. The UI will * change to indicate this by graying out the table. * </p> */ public final class SystemTimeList extends JPanel implements HierarchyListener, PropertyChangeListener { private static final long serialVersionUID = -7601601214911823159L; private final NMONVisualizerGui gui; private final GUITable systemTimes; private final SystemTimeTableCellRenderer renderer; private final Color defaultTableColor; public SystemTimeList(final NMONVisualizerGui gui) { super(new BorderLayout()); this.gui = gui; renderer = new SystemTimeTableCellRenderer(); renderer.setIntervalToCompare(gui.getIntervalManager().getCurrentInterval()); SystemTimeTableModel model = new SystemTimeTableModel(gui); systemTimes = new GUITable(gui, model); systemTimes.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); systemTimes.getColumnModel().getColumn(0).setPreferredWidth(200); systemTimes.getColumnModel().getColumn(1).setPreferredWidth(100); systemTimes.getColumnModel().getColumn(2).setPreferredWidth(100); systemTimes.getColumnModel().getColumn(3).setPreferredWidth(75); systemTimes.setDefaultRenderer(String.class, renderer); systemTimes.setDefaultRenderer(Long.class, renderer); systemTimes.setDefaultRenderer(Integer.class, renderer); JLabel label = new JLabel("System Times"); label.setFont(Styles.LABEL); label.setBorder(BorderFactory.createEmptyBorder(5, 5, 2, 0)); add(label, BorderLayout.PAGE_START); JScrollPane scrollPane = new JScrollPane(systemTimes); scrollPane.getViewport().setBackground(java.awt.Color.WHITE); scrollPane.setPreferredSize(new java.awt.Dimension(600, 250)); scrollPane.setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, java.awt.Color.LIGHT_GRAY)); add(scrollPane, BorderLayout.CENTER); // save the default color for property change events defaultTableColor = systemTimes.getBackground(); } // when the containing window is shown, start listening for events @Override public void hierarchyChanged(HierarchyEvent e) { if ((e.getChangeFlags() & HierarchyEvent.SHOWING_CHANGED) != 0) { if (e.getChanged().isVisible()) { gui.addPropertyChangeListener("timeZone", this); gui.addDataSetListener((SystemTimeTableModel) systemTimes.getModel()); } else { gui.removePropertyChangeListener("timeZone", this); gui.removeDataSetListener((SystemTimeTableModel) systemTimes.getModel()); } } } @Override public void propertyChange(PropertyChangeEvent evt) { if ("interval".equals(evt.getPropertyName())) { SystemTimeTableModel model = (SystemTimeTableModel) systemTimes.getModel(); Interval i = (Interval) evt.getNewValue(); if (i != null) { if (!systemTimes.isEnabled()) { // if the table color is not set to the default, the renderer will not render // alternate table rows in a different color systemTimes.setBackground(defaultTableColor); systemTimes.setEnabled(true); // chaging the model clears the row selection, so reapply it when done int row = systemTimes.getSelectedRow(); if (row != -1) { systemTimes.setRowSelectionInterval(row, row); } } if (!model.getCountInterval().equals(i)) { renderer.setIntervalToCompare(i); model.setCountInterval(i); } } else { if (systemTimes.isEnabled()) { // invalid interval, disable table + visual queue to user systemTimes.setEnabled(false); systemTimes.setBackground(java.awt.Color.LIGHT_GRAY); } } } } public GUITable getTable() { return systemTimes; } }