Skip to content
Snippets Groups Projects
Commit 9ccb883f authored by Tim Molter's avatar Tim Molter
Browse files

legend optimization/abstraction

parent b95de2f6
No related branches found
No related tags found
No related merge requests found
......@@ -21,6 +21,7 @@ import java.awt.Graphics2D;
import java.awt.Shape;
import java.awt.font.FontRenderContext;
import java.awt.font.TextLayout;
import java.awt.geom.AffineTransform;
import java.awt.geom.Rectangle2D;
import java.util.LinkedHashMap;
import java.util.Map;
......@@ -36,6 +37,8 @@ public abstract class Legend_<ST extends Styler, S extends Series> implements Ch
public abstract double getSeriesLegendRenderGraphicHeight(Series series);
public abstract void doPaint(Graphics2D g);
protected static final int LEGEND_MARGIN = 6;
protected static final int BOX_SIZE = 20;
protected static final int MULTI_LINE_SPACE = 3;
......@@ -60,6 +63,10 @@ public abstract class Legend_<ST extends Styler, S extends Series> implements Ch
@Override
public void paint(Graphics2D g) {
if (!chart.getStyler().isLegendVisible()) {
return;
}
if (chart.getSeriesMap().isEmpty()) {
return;
}
......@@ -114,6 +121,8 @@ public abstract class Legend_<ST extends Styler, S extends Series> implements Ch
g.setStroke(new BasicStroke(1, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL, 10.0f, new float[] { 3.0f, 0.0f }, 0.0f));
g.setColor(chart.getStyler().getLegendBorderColor());
g.draw(rect);
doPaint(g);
}
/**
......@@ -203,4 +212,45 @@ public abstract class Legend_<ST extends Styler, S extends Series> implements Ch
return seriesTextBounds;
}
float getLegendEntryHeight(Map<String, Rectangle2D> seriesTextBounds, int markerSize) {
float legendEntryHeight = 0;
for (Map.Entry<String, Rectangle2D> entry : seriesTextBounds.entrySet()) {
legendEntryHeight += entry.getValue().getHeight() + MULTI_LINE_SPACE;
}
legendEntryHeight -= MULTI_LINE_SPACE;
legendEntryHeight = Math.max(legendEntryHeight, markerSize);
return legendEntryHeight;
}
void paintSeriesText(Graphics2D g, Map<String, Rectangle2D> seriesTextBounds, int markerSize, double x, double starty) {
double multiLineOffset = 0.0;
for (Map.Entry<String, Rectangle2D> entry : seriesTextBounds.entrySet()) {
double height = entry.getValue().getHeight();
double centerOffsetY = (Math.max(markerSize, height) - height) / 2.0;
FontRenderContext frc = g.getFontRenderContext();
TextLayout tl = new TextLayout(entry.getKey(), chart.getStyler().getLegendFont(), frc);
Shape shape = tl.getOutline(null);
AffineTransform orig = g.getTransform();
AffineTransform at = new AffineTransform();
at.translate(x, starty + height + centerOffsetY + multiLineOffset);
g.transform(at);
g.fill(shape);
g.setTransform(orig);
// // debug box
// Rectangle2D boundsTemp = new Rectangle2D.Double(x, starty + centerOffsetY, entry.getValue().getWidth(), height);
// g.setColor(Color.blue);
// g.draw(boundsTemp);
multiLineOffset += height + MULTI_LINE_SPACE;
}
}
}
......@@ -16,12 +16,8 @@
*/
package org.knowm.xchart.internal.chartpart;
import java.awt.BasicStroke;
import java.awt.Graphics2D;
import java.awt.Shape;
import java.awt.font.FontRenderContext;
import java.awt.font.TextLayout;
import java.awt.geom.AffineTransform;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Rectangle2D;
import java.util.Map;
......@@ -51,15 +47,7 @@ public class Legend_Bubble<ST extends AxesChartStyler, S extends Series> extends
}
@Override
public void paint(Graphics2D g) {
if (!chart.getStyler().isLegendVisible()) {
return;
}
super.paint(g);
g.setStroke(new BasicStroke(1, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL, 10.0f, new float[] { 3.0f, 0.0f }, 0.0f));
public void doPaint(Graphics2D g) {
// Draw legend content inside legend box
double startx = xOffset + chart.getStyler().getLegendPadding();
......@@ -73,20 +61,9 @@ public class Legend_Bubble<ST extends AxesChartStyler, S extends Series> extends
}
Map<String, Rectangle2D> seriesTextBounds = getSeriesTextBounds(series);
float legendEntryHeight = getLegendEntryHeight(seriesTextBounds, BOX_SIZE);
float legendEntryHeight = 0;
double legendTextContentMaxWidth = 0; // TODO 3.0.0 don't need this
for (Map.Entry<String, Rectangle2D> entry : seriesTextBounds.entrySet()) {
legendEntryHeight += entry.getValue().getHeight() + MULTI_LINE_SPACE;
legendTextContentMaxWidth = Math.max(legendTextContentMaxWidth, entry.getValue().getWidth());
}
legendEntryHeight -= MULTI_LINE_SPACE;
legendEntryHeight = Math.max(legendEntryHeight, (series.getLegendRenderType() == LegendRenderType.Box ? BOX_SIZE : stylerAxesChart.getMarkerSize()));
// ////// paint series render graphic /////////
// paint little box
// paint little circle
Shape rectSmall = new Ellipse2D.Double(startx, starty, BOX_SIZE, BOX_SIZE);
g.setColor(series.getFillColor());
g.fill(rectSmall);
......@@ -98,38 +75,16 @@ public class Legend_Bubble<ST extends AxesChartStyler, S extends Series> extends
g.setColor(chart.getStyler().getChartFontColor());
double multiLineOffset = 0.0;
final double x = startx + BOX_SIZE + chart.getStyler().getLegendPadding();
for (Map.Entry<String, Rectangle2D> entry : seriesTextBounds.entrySet()) {
double height = entry.getValue().getHeight();
double centerOffsetY = (Math.max(BOX_SIZE, height) - height) / 2.0;
FontRenderContext frc = g.getFontRenderContext();
TextLayout tl = new TextLayout(entry.getKey(), chart.getStyler().getLegendFont(), frc);
Shape shape = tl.getOutline(null);
AffineTransform orig = g.getTransform();
AffineTransform at = new AffineTransform();
at.translate(x, starty + height + centerOffsetY + multiLineOffset);
g.transform(at);
g.fill(shape);
g.setTransform(orig);
// // debug box
// Rectangle2D boundsTemp = new Rectangle2D.Double(x, starty + centerOffsetY, entry.getValue().getWidth(), height);
// g.setColor(Color.blue);
// g.draw(boundsTemp);
multiLineOffset += height + MULTI_LINE_SPACE;
}
paintSeriesText(g, seriesTextBounds, BOX_SIZE, x, starty);
starty += legendEntryHeight + chart.getStyler().getLegendPadding();
}
// bounds
bounds = new Rectangle2D.Double(xOffset, yOffset, bounds.getWidth(), bounds.getHeight());
// g.setColor(Color.blue);
// g.draw(bounds);
......
......@@ -16,12 +16,8 @@
*/
package org.knowm.xchart.internal.chartpart;
import java.awt.BasicStroke;
import java.awt.Graphics2D;
import java.awt.Shape;
import java.awt.font.FontRenderContext;
import java.awt.font.TextLayout;
import java.awt.geom.AffineTransform;
import java.awt.geom.Line2D;
import java.awt.geom.Rectangle2D;
import java.util.Map;
......@@ -52,15 +48,7 @@ public class Legend_Marker<ST extends AxesChartStyler, S extends Series> extends
}
@Override
public void paint(Graphics2D g) {
if (!chart.getStyler().isLegendVisible()) {
return;
}
super.paint(g);
g.setStroke(new BasicStroke(1, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL, 10.0f, new float[] { 3.0f, 0.0f }, 0.0f));
public void doPaint(Graphics2D g) {
// Draw legend content inside legend box
double startx = xOffset + chart.getStyler().getLegendPadding();
......@@ -74,16 +62,7 @@ public class Legend_Marker<ST extends AxesChartStyler, S extends Series> extends
}
Map<String, Rectangle2D> seriesTextBounds = getSeriesTextBounds(series);
float legendEntryHeight = 0;
double legendTextContentMaxWidth = 0; // TODO 3.0.0 don't need this
for (Map.Entry<String, Rectangle2D> entry : seriesTextBounds.entrySet()) {
legendEntryHeight += entry.getValue().getHeight() + MULTI_LINE_SPACE;
legendTextContentMaxWidth = Math.max(legendTextContentMaxWidth, entry.getValue().getWidth());
}
legendEntryHeight -= MULTI_LINE_SPACE;
legendEntryHeight = Math.max(legendEntryHeight, (series.getLegendRenderType() == LegendRenderType.Box ? BOX_SIZE : stylerAxesChart.getMarkerSize()));
float legendEntryHeight = getLegendEntryHeight(seriesTextBounds, (series.getLegendRenderType() == LegendRenderType.Box ? BOX_SIZE : stylerAxesChart.getMarkerSize()));
// ////// paint series render graphic /////////
......@@ -137,55 +116,14 @@ public class Legend_Marker<ST extends AxesChartStyler, S extends Series> extends
if (series.getLegendRenderType() != LegendRenderType.Box) {
double x = startx + chart.getStyler().getLegendSeriesLineLength() + chart.getStyler().getLegendPadding();
for (Map.Entry<String, Rectangle2D> entry : seriesTextBounds.entrySet()) {
double height = entry.getValue().getHeight();
double centerOffsetY = (Math.max(stylerAxesChart.getMarkerSize(), height) - height) / 2.0;
FontRenderContext frc = g.getFontRenderContext();
TextLayout tl = new TextLayout(entry.getKey(), chart.getStyler().getLegendFont(), frc);
Shape shape = tl.getOutline(null);
AffineTransform orig = g.getTransform();
AffineTransform at = new AffineTransform();
at.translate(x, starty + height + centerOffsetY + multiLineOffset);
g.transform(at);
g.fill(shape);
g.setTransform(orig);
// // debug box
// Rectangle2D boundsTemp = new Rectangle2D.Double(x, starty + centerOffsetY + multiLineOffset, entry.getValue().getWidth(), height);
// g.setColor(Color.blue);
// g.draw(boundsTemp);
multiLineOffset += height + MULTI_LINE_SPACE;
}
paintSeriesText(g, seriesTextBounds, stylerAxesChart.getMarkerSize(), x, starty);
}
else { // bar/pie type series
final double x = startx + BOX_SIZE + chart.getStyler().getLegendPadding();
for (Map.Entry<String, Rectangle2D> entry : seriesTextBounds.entrySet()) {
double height = entry.getValue().getHeight();
double centerOffsetY = (Math.max(BOX_SIZE, height) - height) / 2.0;
FontRenderContext frc = g.getFontRenderContext();
TextLayout tl = new TextLayout(entry.getKey(), chart.getStyler().getLegendFont(), frc);
Shape shape = tl.getOutline(null);
AffineTransform orig = g.getTransform();
AffineTransform at = new AffineTransform();
at.translate(x, starty + height + centerOffsetY + multiLineOffset);
g.transform(at);
g.fill(shape);
g.setTransform(orig);
// // debug box
// Rectangle2D boundsTemp = new Rectangle2D.Double(x, starty + centerOffsetY, entry.getValue().getWidth(), height);
// g.setColor(Color.blue);
// g.draw(boundsTemp);
multiLineOffset += height + MULTI_LINE_SPACE;
paintSeriesText(g, seriesTextBounds, BOX_SIZE, x, starty);
}
}
starty += legendEntryHeight + chart.getStyler().getLegendPadding();
......
......@@ -16,12 +16,8 @@
*/
package org.knowm.xchart.internal.chartpart;
import java.awt.BasicStroke;
import java.awt.Graphics2D;
import java.awt.Shape;
import java.awt.font.FontRenderContext;
import java.awt.font.TextLayout;
import java.awt.geom.AffineTransform;
import java.awt.geom.Rectangle2D;
import java.util.Map;
......@@ -49,15 +45,7 @@ public class Legend_Pie<ST extends AxesChartStyler, S extends Series> extends Le
}
@Override
public void paint(Graphics2D g) {
if (!chart.getStyler().isLegendVisible()) {
return;
}
super.paint(g);
g.setStroke(new BasicStroke(1, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL, 10.0f, new float[] { 3.0f, 0.0f }, 0.0f));
public void doPaint(Graphics2D g) {
// Draw legend content inside legend box
double startx = xOffset + chart.getStyler().getLegendPadding();
......@@ -71,16 +59,7 @@ public class Legend_Pie<ST extends AxesChartStyler, S extends Series> extends Le
}
Map<String, Rectangle2D> seriesTextBounds = getSeriesTextBounds(series);
float legendEntryHeight = 0;
double legendTextContentMaxWidth = 0; // TODO 3.0.0 don't need this
for (Map.Entry<String, Rectangle2D> entry : seriesTextBounds.entrySet()) {
legendEntryHeight += entry.getValue().getHeight() + MULTI_LINE_SPACE;
legendTextContentMaxWidth = Math.max(legendTextContentMaxWidth, entry.getValue().getWidth());
}
legendEntryHeight -= MULTI_LINE_SPACE;
legendEntryHeight = Math.max(legendEntryHeight, BOX_SIZE);
float legendEntryHeight = getLegendEntryHeight(seriesTextBounds, BOX_SIZE);
// ////// paint series render graphic /////////
......@@ -108,28 +87,9 @@ public class Legend_Pie<ST extends AxesChartStyler, S extends Series> extends Le
// bar/pie type series
final double x = startx + BOX_SIZE + chart.getStyler().getLegendPadding();
for (Map.Entry<String, Rectangle2D> entry : seriesTextBounds.entrySet()) {
double height = entry.getValue().getHeight();
double centerOffsetY = (Math.max(BOX_SIZE, height) - height) / 2.0;
FontRenderContext frc = g.getFontRenderContext();
TextLayout tl = new TextLayout(entry.getKey(), chart.getStyler().getLegendFont(), frc);
Shape shape = tl.getOutline(null);
AffineTransform orig = g.getTransform();
AffineTransform at = new AffineTransform();
at.translate(x, starty + height + centerOffsetY + multiLineOffset);
g.transform(at);
g.fill(shape);
g.setTransform(orig);
// // debug box
// Rectangle2D boundsTemp = new Rectangle2D.Double(x, starty + centerOffsetY, entry.getValue().getWidth(), height);
// g.setColor(Color.blue);
// g.draw(boundsTemp);
multiLineOffset += height + MULTI_LINE_SPACE;
}
paintSeriesText(g, seriesTextBounds, BOX_SIZE, x, starty);
starty += legendEntryHeight + chart.getStyler().getLegendPadding();
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment