package org.gephi.desktop.datalab.utils.componentproviders; import java.awt.Color; import java.awt.image.BufferedImage; import javax.swing.JLabel; import org.gephi.desktop.datalab.utils.GraphModelProvider; import org.gephi.utils.sparklines.SparklineGraph; import org.gephi.utils.sparklines.SparklineParameters; import org.jdesktop.swingx.JXTable; import org.jdesktop.swingx.painter.ImagePainter; import org.jdesktop.swingx.renderer.CellContext; import org.jdesktop.swingx.renderer.ComponentProvider; import org.jdesktop.swingx.renderer.JRendererLabel; /** * * @author Eduardo Ramos */ public abstract class AbstractSparklinesGraphicsComponentProvider extends ComponentProvider<JLabel> { protected static final Color SELECTED_BACKGROUND = new Color(225, 255, 255); protected static final Color UNSELECTED_BACKGROUND = Color.white; protected final GraphModelProvider graphModelProvider; protected final JXTable table; protected JRendererLabel rendererLabel; public AbstractSparklinesGraphicsComponentProvider(GraphModelProvider graphModelProvider, JXTable table) { super(null, JLabel.LEADING); this.graphModelProvider = graphModelProvider; this.table = table; } public abstract String getTextFromValue(Object value); @Override protected void format(CellContext context) { //Set image or text int witdth = table.getColumnModel().getColumn(context.getColumn()).getWidth(); int height = table.getRowHeight(context.getRow()); String text = getTextFromValue(context.getValue()); rendererLabel.setSize(witdth, height); rendererLabel.setToolTipText(text); rendererLabel.setBorder(null); setImagePainter(context.getValue(), context.isSelected()); } @Override protected void configureState(CellContext context) { } @Override protected JLabel createRendererComponent() { return rendererLabel = new JRendererLabel(); } public void setImagePainter(Object value, boolean isSelected) { if (value == null) { rendererLabel.setPainter(null); return; } Number[][] values = getSparklinesXAndYNumbers(value); Number[] xValues = values[0]; Number[] yValues = values[1]; //If there is less than 1 element, don't show anything. if (yValues.length < 1) { rendererLabel.setPainter(null); return; } if (yValues.length == 1) { //SparklineGraph needs at least 2 values, duplicate the only one we have to get a sparkline with a single line showing that the value does not change over time xValues = null; yValues = new Number[]{yValues[0], yValues[0]}; } Color background; if (isSelected) { background = SELECTED_BACKGROUND; } else { background = UNSELECTED_BACKGROUND; } //Note: Can't use interactive SparklineComponent because TableCellEditors don't receive mouse events. final SparklineParameters sparklineParameters = new SparklineParameters( rendererLabel.getWidth() - 1, rendererLabel.getHeight() - 1, Color.BLUE, background, Color.RED, Color.GREEN, null ); final BufferedImage image = SparklineGraph.draw(xValues, yValues, sparklineParameters); rendererLabel.setPainter(new ImagePainter(image)); } public abstract Number[][] getSparklinesXAndYNumbers(Object value); }