/**
* 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.Graphics2D;
import java.awt.Paint;
import java.awt.geom.Rectangle2D;
import java.util.List;
import org.jfree.chart.block.Arrangement;
import org.jfree.chart.block.Block;
import org.jfree.chart.block.BlockContainer;
import org.jfree.chart.block.BlockResult;
import org.jfree.chart.block.EntityBlockParams;
import org.jfree.chart.block.EntityBlockResult;
import org.jfree.chart.entity.EntityCollection;
import org.jfree.chart.entity.StandardEntityCollection;
/**
* A {@link BlockContainer} with a colored background. Additionally brutally enforces a vertically
* centered alignment of its contents, and thus probably only works as long as the contents is
* arranged in exactly one horizontal line.
*
* @author Marius Helf
*
*/
public class ColoredBlockContainer extends BlockContainer {
private static final long serialVersionUID = 1L;
private Paint fillPaint;
public ColoredBlockContainer(Paint fillPaint) {
super();
this.fillPaint = fillPaint;
}
public ColoredBlockContainer(Paint fillPaint, Arrangement arrangement) {
super(arrangement);
this.fillPaint = fillPaint;
}
public Paint getFillPaint() {
return fillPaint;
}
public void setFillPaint(Paint fillPaint) {
this.fillPaint = fillPaint;
}
@Override
public void draw(Graphics2D g2, Rectangle2D area) {
area = drawFill(g2, area);
super.draw(g2, area);
}
/**
* Draws a colored background. Returns the area wich has been filled.
*/
private Rectangle2D drawFill(Graphics2D g2, Rectangle2D area) {
Rectangle2D filledArea = (Rectangle2D) area.clone();
filledArea = trimMargin(filledArea);
filledArea = trimBorder(filledArea);
area = trimPadding(area);
g2.setPaint(this.fillPaint);
g2.fill(filledArea);
drawBorder(g2, filledArea);
return filledArea;
}
/**
* Disclaimer: this is a "works for me" implementation, and probably only works as long as the
* items are arranged horizontally in exactly one line, since it brutally enforces the items to
* be aligned vertically centered.
*/
@SuppressWarnings("unchecked")
@Override
public Object draw(Graphics2D g2, Rectangle2D area, Object params) {
area = drawFill(g2, area);
// check if we need to collect chart entities from the container
EntityBlockParams ebp = null;
StandardEntityCollection sec = null;
if (params instanceof EntityBlockParams) {
ebp = (EntityBlockParams) params;
if (ebp.getGenerateEntities()) {
sec = new StandardEntityCollection();
}
}
Rectangle2D contentArea = (Rectangle2D) area.clone();
contentArea = trimMargin(contentArea);
drawBorder(g2, contentArea);
contentArea = trimBorder(contentArea);
contentArea = trimPadding(contentArea);
for (Block block : (List<Block>) getBlocks()) {
Rectangle2D bounds = block.getBounds();
// enforce vertically centered alignment
double y = area.getY() + (area.getHeight() - bounds.getHeight()) / 2.0;
Rectangle2D drawArea = new Rectangle2D.Double(bounds.getX() + area.getX(), y, bounds.getWidth(),
bounds.getHeight());
Object r = block.draw(g2, drawArea, params);
if (sec != null) {
if (r instanceof EntityBlockResult) {
EntityBlockResult ebr = (EntityBlockResult) r;
EntityCollection ec = ebr.getEntityCollection();
sec.addAll(ec);
}
}
}
BlockResult result = null;
if (sec != null) {
result = new BlockResult();
result.setEntityCollection(sec);
}
return result;
}
}