package com.ibm.nmon.gui.main;
import java.util.Map;
import com.ibm.nmon.gui.report.ReportPanel;
import com.ibm.nmon.data.DataSet;
import com.ibm.nmon.gui.chart.BaseChartPanel;
import com.ibm.nmon.report.ReportCache;
/**
* View a set of summary charts for a specific {@link DataSet}.
*
* @see ReportPanel
*/
final class DataSetView extends ChartSplitPane {
private static final long serialVersionUID = 6066688638520302421L;
private final Map<String, ReportPanel> reportPanels;
private ReportPanel currentReport;
private String lastCommonTabName;
DataSetView(NMONVisualizerGui gui) {
super(gui, gui.getMainFrame());
reportPanels = new java.util.HashMap<String, ReportPanel>();
for (DataSet data : gui.getDataSets()) {
dataAdded(data);
}
gui.addDataSetListener(this);
}
@Override
public void setEnabled(boolean enabled) {
if (enabled != isEnabled()) {
super.setEnabled(enabled);
if (currentReport != null) {
currentReport.setEnabled(enabled);
}
}
}
@Override
protected BaseChartPanel getChartPanel() {
return currentReport == null ? null : currentReport.getChartPanel();
}
void setData(DataSet data) {
ReportPanel forData = reportPanels.get(data.getHostname());
String lastTabName = null;
if (forData != currentReport) {
if (currentReport != null) {
currentReport.setEnabled(false);
lastTabName = currentReport.getTitleAt(currentReport.getSelectedIndex());
}
// sync all report panel's divider locations
int location = getDividerLocation();
currentReport = forData;
boolean found = false;
// attempt to select the same tab that was selected on the previous report
if (lastTabName != null) {
for (int i = 0; i < currentReport.getTabCount(); i++) {
if (currentReport.getTitleAt(i).equals(lastTabName)) {
if (currentReport.getSelectedIndex() != i) {
currentReport.setSelectedIndex(i);
}
lastCommonTabName = lastTabName;
found = true;
break;
}
}
}
// tab with same name not found, attempt to find the last common name
if (!found && (lastCommonTabName != null)) {
for (int i = 0; i < currentReport.getTabCount(); i++) {
if (currentReport.getTitleAt(i).equals(lastCommonTabName)) {
if (currentReport.getSelectedIndex() != i) {
currentReport.setSelectedIndex(i);
}
break;
}
}
}
// otherwise, the currently selected tab (which starts at 0 for new report panels) will
// not change
setTopComponent(currentReport);
setDividerLocation(location);
if (isEnabled()) {
currentReport.setEnabled(true);
}
}
// else correct report panel and tab already selected
}
@Override
protected void saveCharts(String directory) {
if (currentReport != null) {
currentReport.saveAllCharts(directory);
}
}
@Override
public void dataAdded(DataSet data) {
if (!reportPanels.containsKey(data.getHostname())) {
// create the report panel for the DataSet and make sure it sends events to the table
ReportPanel reportPanel = new ReportPanel(gui, ReportCache.DEFAULT_DATASET_CHARTS_KEY, data);
reportPanel.addPropertyChangeListener("chart", summaryTable);
reportPanel.addPropertyChangeListener("highlightedLine", this);
reportPanel.addPropertyChangeListener("highlightedBar", this);
// ensure ChartSplitPane forwards these events
reportPanel.addPropertyChangeListener("chart", this);
reportPanel.addPropertyChangeListener("annotation", this);
reportPanel.setEnabled(false);
reportPanels.put(data.getHostname(), reportPanel);
}
// assume existing report panel will handle updates to an existing DataSet
}
@Override
public void dataRemoved(DataSet data) {
ReportPanel forData = reportPanels.remove(data.getHostname());
if (forData != null) {
forData.dispose();
if (forData == currentReport) {
currentReport = null;
}
}
}
@Override
public void dataChanged(DataSet data) {
ReportPanel forData = reportPanels.get(data.getHostname());
if (forData != null) {
forData.resetReport();
}
}
@Override
public void dataCleared() {
for (ReportPanel report : reportPanels.values()) {
report.dispose();
}
reportPanels.clear();
currentReport = null;
setTopComponent(null);
}
@Override
protected String[] getDefaultColumns() {
return new String[] { "Series Name", "Minimum", "Average", "Maximum", "Std Dev" };
}
}