/**
* Copyright (C) 2001-2017 by RapidMiner and the contributors
*
* Complete list of developers available at our web site:
*
* http://rapidminer.com
*
* This program is free software: you can redistribute it and/or modify it under the terms of the
* GNU Affero General Public License as published by the Free Software Foundation, either version 3
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License along with this program.
* If not, see http://www.gnu.org/licenses/.
*/
package com.rapidminer.gui.new_plotter.engine.jfreechart.legend;
import java.awt.Color;
import java.awt.Font;
import java.awt.LinearGradientPaint;
import java.awt.Paint;
import java.awt.Rectangle;
import java.awt.Shape;
import java.awt.geom.Rectangle2D;
import org.jfree.chart.LegendItem;
import org.jfree.chart.LegendItemSource;
import org.jfree.chart.block.Arrangement;
import org.jfree.chart.block.Block;
import org.jfree.chart.block.BlockContainer;
import org.jfree.chart.block.BorderArrangement;
import org.jfree.chart.block.CenterArrangement;
import org.jfree.chart.block.LabelBlock;
import org.jfree.chart.title.LegendGraphic;
import org.jfree.chart.title.LegendItemBlockContainer;
import org.jfree.chart.title.LegendTitle;
import org.jfree.ui.RectangleEdge;
/**
* This class is the GUI container for all legend items.
*
* @author Marius Helf
*
*/
public class SmartLegendTitle extends LegendTitle {
private static final long serialVersionUID = 1L;
public SmartLegendTitle(LegendItemSource source, Arrangement hLayout, Arrangement vLayout) {
super(source, hLayout, vLayout);
}
public SmartLegendTitle(LegendItemSource source) {
super(source);
}
@Override
protected Block createLegendItemBlock(LegendItem item) {
if (item instanceof FlankedShapeLegendItem) {
return createFlankedShapeLegendItem((FlankedShapeLegendItem) item);
} else {
return createDefaultLegendItem(item);
}
}
private Block createDefaultLegendItem(LegendItem item) {
BlockContainer result = null;
Shape shape = item.getShape();
if (shape == null) {
shape = new Rectangle();
}
LegendGraphic lg = new LegendGraphic(shape, item.getFillPaint());
lg.setFillPaintTransformer(item.getFillPaintTransformer());
lg.setShapeFilled(item.isShapeFilled());
lg.setLine(item.getLine());
lg.setLineStroke(item.getLineStroke());
lg.setLinePaint(item.getLinePaint());
lg.setLineVisible(item.isLineVisible());
lg.setShapeVisible(item.isShapeVisible());
lg.setShapeOutlineVisible(item.isShapeOutlineVisible());
lg.setOutlinePaint(item.getOutlinePaint());
lg.setOutlineStroke(item.getOutlineStroke());
lg.setPadding(getLegendItemGraphicPadding());
LegendItemBlockContainer legendItem = new LegendItemBlockContainer(new BorderArrangement(), item.getDataset(),
item.getSeriesKey());
lg.setShapeAnchor(getLegendItemGraphicAnchor());
lg.setShapeLocation(getLegendItemGraphicLocation());
legendItem.add(lg, getLegendItemGraphicEdge());
Font textFont = item.getLabelFont();
if (textFont == null) {
textFont = getItemFont();
}
Paint textPaint = item.getLabelPaint();
if (textPaint == null) {
textPaint = getItemPaint();
}
LabelBlock labelBlock = new LabelBlock(item.getLabel(), textFont, textPaint);
labelBlock.setPadding(getItemLabelPadding());
legendItem.add(labelBlock);
legendItem.setToolTipText(item.getToolTipText());
legendItem.setURLText(item.getURLText());
result = new BlockContainer(new CenterArrangement());
result.add(legendItem);
return result;
}
private Block createFlankedShapeLegendItem(FlankedShapeLegendItem item) {
BlockContainer result = null;
LegendGraphic lg = new CustomLegendGraphic(item.getShape(), item.getFillPaint());
lg.setFillPaintTransformer(item.getFillPaintTransformer());
lg.setShapeFilled(item.isShapeFilled());
lg.setLine(item.getLine());
lg.setLineStroke(item.getLineStroke());
lg.setLinePaint(item.getLinePaint());
lg.setLineVisible(item.isLineVisible());
lg.setShapeVisible(item.isShapeVisible());
lg.setShapeOutlineVisible(item.isShapeOutlineVisible());
lg.setOutlinePaint(item.getOutlinePaint());
lg.setOutlineStroke(item.getOutlineStroke());
lg.setPadding(this.getLegendItemGraphicPadding());
LegendItemBlockContainer legendItem = new LegendItemBlockContainer(new BorderArrangement(), item.getDataset(),
item.getSeriesKey());
Font textFont = item.getLabelFont();
if (textFont == null) {
textFont = getItemFont();
}
Paint textPaint = item.getLabelPaint();
if (textPaint == null) {
textPaint = getItemPaint();
}
ColoredBlockContainer graphicsContainer = new ColoredBlockContainer(new Color(0, 0, 0, 0), new BorderArrangement());
LabelBlock labelBlock;
Font smallerTextFont = textFont.deriveFont(textFont.getSize() * .8f);
Font labelTextFont = textFont;
labelBlock = new LabelBlock(item.getLeftShapeLabel(), smallerTextFont, textPaint);
graphicsContainer.add(labelBlock, RectangleEdge.LEFT);
graphicsContainer.add(lg, null);
labelBlock = new LabelBlock(item.getRightShapeLabel(), smallerTextFont, textPaint);
graphicsContainer.add(labelBlock, RectangleEdge.RIGHT);
legendItem.add(graphicsContainer, getLegendItemGraphicEdge());
labelBlock = new LabelBlock(item.getLabel(), labelTextFont, textPaint);
labelBlock.setPadding(getItemLabelPadding());
legendItem.add(labelBlock);
legendItem.setToolTipText(item.getToolTipText());
legendItem.setURLText(item.getURLText());
result = new BlockContainer(new CenterArrangement());
result.add(legendItem);
return result;
}
public static Paint transformLinearGradient(LinearGradientPaint paint, Shape target) {
Rectangle2D bounds = target.getBounds2D();
float left = (float) bounds.getMinX();
float right = (float) bounds.getMaxX();
LinearGradientPaint newPaint = new LinearGradientPaint(left, 0, right, 0, paint.getFractions(), paint.getColors());
return newPaint;
}
}