package com.ibm.nmon.gui.main;
import javax.swing.JLabel;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.SwingConstants;
import java.awt.Font;
import com.ibm.nmon.data.DataSetListener;
import com.ibm.nmon.data.DataSet;
import com.ibm.nmon.data.SystemDataSet;
import com.ibm.nmon.gui.Styles;
import com.ibm.nmon.gui.tree.TreePathParser;
import com.ibm.nmon.interval.IntervalManager;
import com.ibm.nmon.interval.IntervalListener;
import com.ibm.nmon.interval.Interval;
/**
* Optionally displayed status bar that displays the currently displayed chart's processed source
* filename(s). The filenames displayed can changed based on the current <code>Interval</code>.
*
* @see SystemDataSet#getSourceFiles()
*/
final class StatusBar extends JLabel implements PropertyChangeListener, TreeSelectionListener, IntervalListener,
DataSetListener {
private static final long serialVersionUID = -6249775876913359902L;
private static final String NO_SOURCE_FILE = "<NONE>";
private final IntervalManager intervalManager;
private SystemDataSet currentData = null;
public StatusBar(NMONVisualizerGui gui) {
super();
Font font = Styles.LABEL.deriveFont(Font.PLAIN);
setText(NO_SOURCE_FILE);
setFont(font);
setForeground(new java.awt.Color(0x333333));
setHorizontalAlignment(SwingConstants.CENTER);
setBackground(new java.awt.Color(248, 248, 248));
setOpaque(true);
setBorder(Styles.createTopLineBorder(this));
setVisible(gui.getBooleanProperty("showStatusBar"));
intervalManager = gui.getIntervalManager();
intervalManager.addListener(this);
gui.addPropertyChangeListener("showStatusBar", this);
gui.addDataSetListener(this);
}
private void updateStatus(Interval currentInterval) {
if (!isVisible()) {
return;
}
if (currentData == null) {
setText(NO_SOURCE_FILE);
setToolTipText(null);
return;
}
StringBuilder builder = new StringBuilder(128);
for (Interval interval : currentData.getSourceFileIntervals()) {
if ((interval.getStart() <= currentInterval.getEnd()) && (interval.getEnd() >= currentInterval.getStart())) {
builder.append(currentData.getSourceFile(interval));
// builder.append(new File(sourceFile).getName());
builder.append(" + ");
}
}
if (builder.length() > 3) {
String text = builder.substring(0, builder.length() - 3);
setText(text);
setToolTipText(text);
}
else {
setText(NO_SOURCE_FILE);
setToolTipText(null);
}
}
@Override
public void propertyChange(PropertyChangeEvent evt) {
setVisible((Boolean) evt.getNewValue());
updateStatus(intervalManager.getCurrentInterval());
}
@Override
public void valueChanged(TreeSelectionEvent e) {
pathParser.parse(e.getPath());
}
public void intervalAdded(Interval interval) {}
public void intervalRemoved(Interval interval) {}
public void intervalsCleared() {
currentIntervalChanged(intervalManager.getCurrentInterval());
}
public void currentIntervalChanged(Interval interval) {
updateStatus(interval);
}
public void intervalRenamed(Interval interval) {}
@Override
public void dataAdded(DataSet data) {
if (data.equals(currentData)) {
updateStatus(intervalManager.getCurrentInterval());
}
}
@Override
public void dataRemoved(DataSet data) {
dataAdded(data);
}
@Override
public void dataChanged(DataSet data) {
dataAdded(data);
}
@Override
public void dataCleared() {}
// continue to track current DataSet but do not update status if the status bar is not showing
private final TreePathParser pathParser = new TreePathParser() {
protected void onNullPath() {
onDataSetPath(null);
}
protected void onRootPath() {
onDataSetPath(null);
}
protected void onDataSetPath(DataSet data) {
if (((data == null) && (currentData != null)) || ((data != null) && !data.equals(currentData))) {
currentData = (SystemDataSet) data;
updateStatus(intervalManager.getCurrentInterval());
}
}
protected void onTypePath(DataSet data, com.ibm.nmon.data.DataType type) {
onDataSetPath(data);
}
protected void onFieldPath(DataSet data, com.ibm.nmon.data.DataType type, String field) {
onDataSetPath(data);
}
protected void onProcessPath(DataSet data) {
onDataSetPath(data);
}
};
}