package com.ibm.nmon.gui.chart; import java.awt.Stroke; import java.awt.BasicStroke; import javax.swing.JFrame; import org.jfree.chart.ChartMouseListener; import org.jfree.chart.ChartMouseEvent; import org.jfree.chart.entity.CategoryItemEntity; import org.jfree.chart.entity.ChartEntity; import org.jfree.chart.entity.LegendItemEntity; import org.jfree.chart.plot.CategoryPlot; import org.jfree.data.category.CategoryDataset; import org.jfree.chart.renderer.category.LineAndShapeRenderer; import com.ibm.nmon.gui.main.NMONVisualizerGui; public final class IntervalChartPanel extends BaseChartPanel implements ChartMouseListener { private static final long serialVersionUID = 1129587265457206809L; private final BasicStroke SELECTED_STROKE = new BasicStroke(5); public IntervalChartPanel(NMONVisualizerGui gui, JFrame parent) { super(gui, parent); addChartMouseListener(this); } // note that these methods assume the chart contains a CategoryPlot rendered by a // LineAndShapeRenderer // these are the expected values for all charts created by IntervalChartBuilder public void highlightElement(int row, int column) { if (getChart() != null) { CategoryDataset dataset = ((CategoryPlot) getChart().getPlot()).getDataset(); if ((row >= 0) && (row < dataset.getRowCount())) { LineAndShapeRenderer renderer = (LineAndShapeRenderer) ((CategoryPlot) getChart().getPlot()) .getRenderer(); renderer.setSeriesStroke(row, SELECTED_STROKE); } } } @Override public final void clearHighlightedElements() { if (getChart() != null) { ((LineAndShapeRenderer) ((CategoryPlot) getChart().getPlot()).getRenderer()).clearSeriesStrokes(false); } } @Override public void setElementVisible(int row, int column, boolean visible) { if (getChart() != null) { CategoryPlot plot = (CategoryPlot) getChart().getPlot(); if ((row >= 0) && (row < plot.getDataset().getRowCount())) { plot.getRenderer().setSeriesVisible(row, visible); } } } @Override public final void chartMouseClicked(ChartMouseEvent event) { CategoryItemEntity entity = null; int series = -1; // users can click on either the line or the legend // regardless, figure out the series index and the associated category if (event.getEntity().getClass() == CategoryItemEntity.class) { entity = (CategoryItemEntity) event.getEntity(); series = entity.getDataset().getRowIndex(entity.getRowKey()); } else if (event.getEntity().getClass() == LegendItemEntity.class) { LegendItemEntity legendEntity = (LegendItemEntity) event.getEntity(); CategoryDataset dataset = (CategoryDataset) legendEntity.getDataset(); series = dataset.getRowIndex(legendEntity.getSeriesKey()); // find the CategoryItemEntity that matches the given legend's series // assume there are not that many entities in the chart and this will be relatively fast @SuppressWarnings("rawtypes") java.util.Iterator i = getChartRenderingInfo().getEntityCollection().iterator(); while (i.hasNext()) { ChartEntity e = (ChartEntity) i.next(); if (e.getClass() == CategoryItemEntity.class) { CategoryItemEntity categoryEntity = (CategoryItemEntity) e; if (categoryEntity.getRowKey().equals(legendEntity.getSeriesKey())) { entity = categoryEntity; break; } } } } if (entity != null) { LineAndShapeRenderer renderer = (LineAndShapeRenderer) ((CategoryPlot) getChart().getPlot()).getRenderer(); Stroke oldHighlight = renderer.getSeriesStroke(series); // clear existing highlights renderer.clearSeriesStrokes(false); // toggle series stroke if (oldHighlight != SELECTED_STROKE) { renderer.setSeriesStroke(series, SELECTED_STROKE); firePropertyChange("highlightedIntervalLine", null, series); } else { renderer.setSeriesStroke(series, null); firePropertyChange("highlightedIntervalLine", series, null); } // assume whatever fired the event will repaint the chart } } @Override public final void chartMouseMoved(ChartMouseEvent event) {} }