package com.ibm.nmon.gui.chart.summary; import java.awt.Component; import java.awt.event.MouseEvent; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import javax.swing.JFrame; import javax.swing.JCheckBox; import javax.swing.JLabel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.ListSelectionModel; import javax.swing.table.JTableHeader; import javax.swing.table.DefaultTableColumnModel; import javax.swing.table.TableCellRenderer; import javax.swing.ToolTipManager; import com.ibm.nmon.gui.main.NMONVisualizerGui; import com.ibm.nmon.gui.GUITable; import com.ibm.nmon.gui.chart.BaseChartPanel; import com.ibm.nmon.gui.chart.data.DataTupleDataset; import com.ibm.nmon.gui.table.DoubleCellRenderer; import com.ibm.nmon.gui.table.IntegerCellRenderer; import com.ibm.nmon.gui.table.StringCellRenderer; import com.ibm.nmon.gui.table.TableColumnChooser; import com.ibm.nmon.gui.util.ScrollingTableFix; /** * Holder JPanel for the summary table displayed under charts. */ public final class ChartSummaryPanel extends JScrollPane implements PropertyChangeListener { private static final long serialVersionUID = -7959432908033304478L; private final NMONVisualizerGui gui; private final JFrame parent; private final GUITable summaryTable; private final ChartSummaryTableModel tableModel; public ChartSummaryPanel(NMONVisualizerGui gui, JFrame parent, String[] defaultColumns) { super(); this.gui = gui; this.parent = parent; tableModel = new ChartSummaryTableModel(gui, defaultColumns); tableModel.addPropertyChangeListener(this); summaryTable = createTable(); setViewportView(summaryTable); getViewport().setBackground(java.awt.Color.WHITE); addComponentListener(new ScrollingTableFix(summaryTable, this)); // make sure panel takes up entire parent setBorder(null); } @Override public void setEnabled(boolean enabled) { if (enabled != isEnabled()) { if (enabled) { gui.addPropertyChangeListener("granularity", tableModel); tableModel.updateGranularityMax(); } else { gui.removePropertyChangeListener("granularity", tableModel); } super.setEnabled(enabled); } } @Override public void propertyChange(PropertyChangeEvent evt) { if ("chart".equals(evt.getPropertyName())) { if (evt.getNewValue() != null) { BaseChartPanel chartPanel = ((BaseChartPanel) evt.getNewValue()); DataTupleDataset dataset = chartPanel.getDataset(); tableModel.setData(dataset); } else { tableModel.clear(); } } else if ("rowVisible".equals(evt.getPropertyName())) { firePropertyChange("rowVisible", null, evt.getNewValue()); } } private GUITable createTable() { GUITable table = new GUITable(gui, tableModel) { private static final long serialVersionUID = 2380417479703405189L; @Override protected JTableHeader createDefaultTableHeader() { return new JTableHeader(getColumnModel()) { private static final long serialVersionUID = -4028332367434358857L; @Override public String getToolTipText(MouseEvent event) { super.getToolTipText(event); int column = getTable() .convertColumnIndexToModel( ((DefaultTableColumnModel) getTable().getColumnModel()).getColumnIndexAtX(event .getX())); return getColumnName(column); } }; } }; table.addMouseListener(new ChartSummaryMenu(this)); table.getSelectionModel().addListSelectionListener(new ListSelectionListener() { @Override public void valueChanged(ListSelectionEvent e) { if (!e.getValueIsAdjusting()) { boolean[] selectedRows = new boolean[summaryTable.getRowCount()]; ListSelectionModel model = (ListSelectionModel) e.getSource(); for (int i = model.getMinSelectionIndex(); i <= model.getMaxSelectionIndex(); i++) { if (model.isSelectedIndex(i)) { selectedRows[summaryTable.convertRowIndexToModel(i)] = true; } } firePropertyChange("selectedRows", null, selectedRows); } } }); ToolTipManager.sharedInstance().registerComponent(table.getTableHeader()); // checkbox for enable / disable table.getColumnModel().getColumn(0).setMaxWidth(25); table.setDefaultRenderer(Boolean.class, new CheckBoxCellRenderer()); table.setDefaultRenderer(Double.class, new DoubleCellRenderer()); table.setDefaultRenderer(Integer.class, new IntegerCellRenderer()); table.setDefaultRenderer(String.class, new StringCellRenderer()); return table; } public void clearSelection() { summaryTable.clearSelection(); } /** * Select a row in the table based on a row from a chart dataset. This is meant to be used for * XYDatasets. */ public void selectRow(int datasetRow) { int row = summaryTable.convertRowIndexToView(datasetRow); summaryTable.getSelectionModel().setSelectionInterval(row, row); summaryTable.scrollRectToVisible(summaryTable.getCellRect(row, 0, false)); } /** * Select a row in the table based on a row and column from a chart dataset. This is meant to be * used for Category datasets. */ public void selectRow(int datasetRow, int datasetColumn) { int row = summaryTable.convertRowIndexToView(tableModel.getTableRow(datasetRow, datasetColumn)); summaryTable.getSelectionModel().setSelectionInterval(row, row); summaryTable.scrollRectToVisible(summaryTable.getCellRect(row, 0, false)); } public int getDatasetRow(int tableRow) { return tableModel.getDatasetRow(tableRow); } public int getDatasetColumn(int tableRow) { return tableModel.getDatasetColumn(tableRow); } public void displayTableColumnChooser() { new TableColumnChooser(gui, parent, tableModel); } GUITable getSummaryTable() { return summaryTable; } ChartSummaryTableModel getTableModel() { return tableModel; } private final class CheckBoxCellRenderer extends JCheckBox implements TableCellRenderer { private static final long serialVersionUID = 8963589765399665908L; @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { setSelected((Boolean) value); // the default check box renderer does not use the correct, alternating colors // this code is modified from http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6723524 Component other = (JLabel) table.getDefaultRenderer(String.class).getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); java.awt.Color bg = other.getBackground(); if (isSelected) { setForeground(table.getSelectionForeground()); setBackground(table.getSelectionBackground()); } else { setForeground(other.getForeground()); setBackground(new java.awt.Color(bg.getRed(), bg.getGreen(), bg.getBlue())); } setHorizontalAlignment(javax.swing.SwingConstants.CENTER); setOpaque(true); return this; } } }