package com.ibm.nmon.gui.info; import java.awt.BorderLayout; import java.awt.Toolkit; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.text.SimpleDateFormat; import java.util.Map; import com.ibm.nmon.gui.GUIDialog; import com.ibm.nmon.gui.GUITable; import com.ibm.nmon.gui.Styles; import javax.swing.JButton; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTabbedPane; import javax.swing.ToolTipManager; import javax.swing.TransferHandler; import com.ibm.nmon.data.SystemDataSet; import com.ibm.nmon.gui.main.NMONVisualizerGui; import com.ibm.nmon.gui.table.ReadOnlyTableModel; import com.ibm.nmon.gui.table.StringCellRenderer; import com.ibm.nmon.interval.Interval; /** * Display SystemDataSet metadata information in a table. Supports copying rows to the clipboard. */ public final class MetadataInfoDialog extends GUIDialog implements PropertyChangeListener { private static final long serialVersionUID = -482137072909463758L; private final SimpleDateFormat format = new SimpleDateFormat(Styles.DATE_FORMAT_STRING); private final JTabbedPane tabs; public MetadataInfoDialog(NMONVisualizerGui gui, SystemDataSet data) { super(gui, gui.getMainFrame(), "Parsed File Info - " + data.getHostname()); setIconImage(Styles.buildIcon("page.png").getImage()); format.setTimeZone(gui.getDisplayTimeZone()); if (data.getMetadataCount() > 1) { tabs = new JTabbedPane(); setContentPane(tabs); ToolTipManager.sharedInstance().registerComponent(tabs); } else { tabs = null; } JPanel tab = null; for (Interval interval : data.getSourceFileIntervals()) { tab = new JPanel(new BorderLayout()); ReadOnlyTableModel model = new ReadOnlyTableModel(); // each name value pair gets a row in the table model.addColumn("Name"); model.addColumn("Value"); Map<String, String> metadata = data.getMetadata(interval.getStart()); if (metadata.isEmpty()) { continue; } for (String name : metadata.keySet()) { model.addRow(new String[] { name, metadata.get(name) }); } final GUITable table = new GUITable(gui, model); javax.swing.table.TableColumnModel columnModel = table.getColumnModel(); columnModel.getColumn(0).setPreferredWidth(150); columnModel.getColumn(1).setPreferredWidth(350); columnModel.getColumn(0).setCellRenderer(new StringCellRenderer()); JScrollPane scrollPane = new JScrollPane(table); scrollPane.getViewport().setBackground(java.awt.Color.WHITE); scrollPane.setBorder(Styles.LOWER_LINE_BORDER); tab.add(scrollPane, BorderLayout.CENTER); JButton button = new JButton("Copy All"); button.setIcon(Styles.COPY_ICON); button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { table.selectAll(); table.getTransferHandler().exportToClipboard(table, Toolkit.getDefaultToolkit().getSystemClipboard(), TransferHandler.COPY); table.removeRowSelectionInterval(0, table.getRowCount() - 1); } }); JPanel panel = new JPanel(); panel.add(button); tab.add(panel, java.awt.BorderLayout.PAGE_END); if (data.getMetadataCount() > 1) { tabs.add(format.format(new java.util.Date(interval.getStart())), tab); tabs.setToolTipTextAt(tabs.getTabCount() - 1, data.getSourceFile(interval)); } } if (data.getMetadataCount() == 1) { setContentPane(tab); } gui.addPropertyChangeListener("timeZone", this); } @Override public void propertyChange(PropertyChangeEvent evt) { if (tabs != null) { java.util.Date[] dates = new java.util.Date[tabs.getTabCount()]; for (int i = 0; i < tabs.getTabCount(); i++) { try { dates[i] = format.parse(tabs.getTitleAt(i)); } catch (java.text.ParseException pe) { // should never happen since the titles were set using the same format } } format.setTimeZone((java.util.TimeZone) evt.getNewValue()); for (int i = 0; i < tabs.getTabCount(); i++) { tabs.setTitleAt(i, format.format(dates[i])); } } } @Override public void dispose() { super.dispose(); gui.removePropertyChangeListener("timeZone", this); } }