package com.ibm.nmon.gui.info; import com.ibm.nmon.gui.GUIDialog; import com.ibm.nmon.gui.Styles; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; import java.awt.BorderLayout; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.text.SimpleDateFormat; import java.util.Map; import javax.swing.JButton; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTabbedPane; import javax.swing.JTextArea; import javax.swing.ToolTipManager; import com.ibm.nmon.data.SystemDataSet; import com.ibm.nmon.gui.main.NMONVisualizerGui; import com.ibm.nmon.interval.Interval; /** * Display SystemDataSet system information for a given file. Supports copying data to the * clipboard. */ public final class SystemInfoDialog extends GUIDialog implements PropertyChangeListener { private static final long serialVersionUID = -5471229750755128948L; private final SimpleDateFormat format = new SimpleDateFormat(Styles.DATE_FORMAT_STRING); private final JTabbedPane tabs; public SystemInfoDialog(NMONVisualizerGui gui, SystemDataSet data) { super(gui, gui.getMainFrame(), "System Info - " + data.getHostname()); setIconImage(Styles.buildIcon("computer.png").getImage()); format.setTimeZone(gui.getDisplayTimeZone()); if (data.getSystemInfoCount() > 1) { tabs = new JTabbedPane(); tabs.setBorder(Styles.LOWER_LINE_BORDER); setContentPane(tabs); ToolTipManager.sharedInstance().registerComponent(tabs); } else { tabs = null; } JPanel tab = null; for (Interval interval : data.getSourceFileIntervals()) { tab = new JPanel(new BorderLayout()); tab.setBorder(Styles.LOWER_LINE_BORDER); // create a non-editable text area for each piece of information and put them into a set // of tabs final JTabbedPane subTabs = new JTabbedPane(); // subTabs.setBorder(null); Map<String, String> systemInfo = data.getSystemInfo(interval.getStart()); if (systemInfo.isEmpty()) { continue; } for (String name : systemInfo.keySet()) { JTextArea textArea = new JTextArea(systemInfo.get(name)); textArea.setColumns(50); textArea.setRows(25); textArea.setEditable(false); JScrollPane scrollPane = new JScrollPane(textArea); scrollPane.setBorder(null); subTabs.addTab(name, scrollPane); } tab.add(subTabs, BorderLayout.CENTER); JButton button = new JButton("Copy All"); button.setIcon(Styles.COPY_ICON); button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { JScrollPane scrollPane = (JScrollPane) subTabs.getSelectedComponent(); JTextArea textArea = (JTextArea) scrollPane.getViewport().getView(); // select all resets the cursor position, so save and restore it int n = textArea.getCaretPosition(); textArea.selectAll(); textArea.copy(); textArea.setCaretPosition(n); } }); JPanel panel = new JPanel(); panel.add(button); tab.add(panel, java.awt.BorderLayout.PAGE_END); if (data.getSystemInfoCount() > 1) { tabs.add(format.format(new java.util.Date(interval.getStart())), tab); tabs.setToolTipTextAt(tabs.getTabCount() - 1, data.getSourceFile(interval)); } } if (data.getSystemInfoCount() == 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); } }