Skip to content

Commit

Permalink
Implemented lines in LineChartRenderer + added glow to BarChart highl…
Browse files Browse the repository at this point in the history
…ight
  • Loading branch information
robinsmidsrod committed May 3, 2010
1 parent 8a81c5a commit f3b5a4e
Show file tree
Hide file tree
Showing 5 changed files with 152 additions and 15 deletions.
19 changes: 12 additions & 7 deletions src/no/smidsrod/robin/svg/library/BarChartRenderer.java
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,10 @@ void buildSVGDocument() {
Header.createElement(svg, chart);
Legend.createElement(svg, chart.getItemList());
// DataRegion.createBorderElement(svg, chart.getItemList());
Axis.createVerticalElement(svg, chart.getRange(0), chart.getItemList());
createHorizontalLine(svg, chart.getItemList());
createBarElements(svg, chart.getRange(0), chart.getItemList());
Range yRange = chart.getRange(0); // range 0 is Y axis
Axis.createVerticalElement(svg, yRange, chart.getItemList());
createHorizontalLine(svg, chart.getItemList()); // No X axis grid
createBarElements(svg, yRange, chart.getItemList());
}

private void createHorizontalLine(Element svg, List<Item> items) {
Expand All @@ -51,7 +52,8 @@ private void createBarElements(Element svg, Range range, List<Item> items) {
}

// Pattern used for highlighting
createDiagonalPatternElement(svg);
SVGBuilder.createHighlightFilterElement(svg);
createHighlightPatternElement(svg);

double widthPerItem = DataRegion.calcWidth(items) / (items.size() + 1);
double scaleFactor = DataRegion.calcHeight()
Expand Down Expand Up @@ -79,6 +81,9 @@ private void createBarElement(Element svg, Item item, Range range,
bar.setAttribute("height", height + "");
bar.setAttribute("stroke", "black");
bar.setAttribute("fill", SVGUtil.cssColor(item.getColor()));
if ( item.isHighlighted() ) {
bar.setAttribute("filter", "url(#highlight)");
}
svg.appendChild(bar);

if (item.isHighlighted()) {
Expand All @@ -88,7 +93,7 @@ private void createBarElement(Element svg, Item item, Range range,
highlight.setAttribute("width", width + "");
highlight.setAttribute("height", height + "");
highlight.setAttribute("stroke", "black");
highlight.setAttribute("fill", "url(#diagonalPattern)");
highlight.setAttribute("fill", "url(#highlightPattern)");
svg.appendChild(highlight);
}

Expand All @@ -111,12 +116,12 @@ private void createBarElement(Element svg, Item item, Range range,
svg.appendChild(label);
}

private void createDiagonalPatternElement(Element svg) {
private void createHighlightPatternElement(Element svg) {
Element defs = DOMBuilder.createElement(svg, "defs");
svg.appendChild(defs);

Element pattern = DOMBuilder.createElement(defs, "pattern");
pattern.setAttribute("id", "diagonalPattern");
pattern.setAttribute("id", "highlightPattern");
pattern.setAttribute("patternUnits", "userSpaceOnUse");
pattern.setAttribute("viewBox", "0 0 10 10");
pattern.setAttribute("x", "0");
Expand Down
17 changes: 17 additions & 0 deletions src/no/smidsrod/robin/svg/library/DataRegion.java
Original file line number Diff line number Diff line change
Expand Up @@ -84,4 +84,21 @@ static void createBorderElement(Element svg, List<Item> items) {
svg.appendChild(box);
}

/**
* @param value The value instance to fetch data from
* @param xRange The range object that identifies the X axis
* @param yRange The range object that identifies the Y axis
* @param xScaleFactor
* @param yScaleFactor
* @return
*/
static Point calcPoint(Value value, Range xRange, Range yRange,
double xScaleFactor, double yScaleFactor) {
double xOffset = value.get(xRange) * xScaleFactor;
double yOffset = value.get(yRange) * yScaleFactor;
int x = (int) (calcLeft() + xOffset);
int y = (int) (calcBottom() - yOffset);
return new Point(x, y);
}

}
49 changes: 45 additions & 4 deletions src/no/smidsrod/robin/svg/library/LineChartRenderer.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
package no.smidsrod.robin.svg.library;

import java.awt.Color;
import java.awt.Point;
import java.util.List;

import org.w3c.dom.Element;

public class LineChartRenderer extends AbstractSVGRenderer implements
Expand All @@ -24,11 +28,48 @@ void buildSVGDocument() {
Canvas.createBorderElement(svg);
Header.createElement(svg, chart);
Legend.createElement(svg, chart.getItemList());
//DataRegion.createBorderElement(svg, chart.getItemList());
Axis.createVerticalElement(svg, chart.getRange(0), chart.getItemList());
Axis.createHorizontalElement(svg, chart.getRange(1), chart.getItemList());
// DataRegion.createBorderElement(svg, chart.getItemList());
Range xRange = chart.getRange(0); // range 0 is X axis
Range yRange = chart.getRange(1); // range 1 is Y axis
Axis.createHorizontalElement(svg, xRange, chart.getItemList());
Axis.createVerticalElement(svg, yRange, chart.getItemList());
createLineElements(svg, xRange, yRange, chart.getItemList());
}

private void createLineElements(Element svg, Range xRange, Range yRange,
List<Item> items) {
double xScaleFactor = DataRegion.calcWidth(items)
/ xRange.calcTotalDistance();
double yScaleFactor = DataRegion.calcHeight()
/ yRange.calcTotalDistance();
SVGBuilder.createHighlightFilterElement(svg);
for (Item item : items) {
createPolyLineElement(svg, item.getColor(), item.isHighlighted(),
item.getValueList(), xRange, yRange, xScaleFactor,
yScaleFactor);
}
}

private void createPolyLineElement(Element svg, Color color,
boolean isHighlighted, List<Value> values, Range xRange,
Range yRange, double xScaleFactor, double yScaleFactor) {
Point start = null;
for (Value value : values) {
Point end = DataRegion.calcPoint(value, xRange, yRange,
xScaleFactor, yScaleFactor);
if (start == null) {
start = new Point(end);
}
String filter = isHighlighted ? "url(#highlight)" : "";
SVGBuilder.createDotElement(svg, start, SVGUtil.cssColor(color),
filter);
SVGBuilder.createLineElement(svg, start, end, SVGUtil
.cssColor(color), filter);
SVGBuilder.createDotElement(svg, end, SVGUtil.cssColor(color),
filter);
start = new Point(end);
}

// createLines();
}

}
64 changes: 64 additions & 0 deletions src/no/smidsrod/robin/svg/library/SVGBuilder.java
Original file line number Diff line number Diff line change
Expand Up @@ -74,12 +74,20 @@ static void createTextElement(Element svg, Point position, String label,

static void createLineElement(Element svg, Point start, Point end,
String color) {
createLineElement(svg, start, end, color, "");
}

static void createLineElement(Element svg, Point start, Point end,
String color, String filter) {
Element line = DOMBuilder.createElement(svg, "line");
line.setAttribute("x1", start.x + "");
line.setAttribute("y1", start.y + "");
line.setAttribute("x2", end.x + "");
line.setAttribute("y2", end.y + "");
line.setAttribute("stroke", color);
if (!(filter == null || filter.isEmpty())) {
line.setAttribute("filter", filter);
}
svg.appendChild(line);
}

Expand All @@ -95,4 +103,60 @@ static void createDottedLineElement(Element svg, Point start, Point end,
svg.appendChild(line);
}

public static void createDotElement(Element svg, Point center,
String color, String filter) {
Element circle = DOMBuilder.createElement(svg, "circle");
circle.setAttribute("cx", center.x + "");
circle.setAttribute("cy", center.y + "");
circle.setAttribute("r", "3");
circle.setAttribute("fill", color);
if (!(filter == null || filter.isEmpty())) {
circle.setAttribute("filter", filter);
}
svg.appendChild(circle);

}

static void createHighlightFilterElement(Element svg) {
Element defs = DOMBuilder.createElement(svg, "defs");
svg.appendChild(defs);

// Glow shadow taken from
// http://commons.oreilly.com/wiki/index.php/SVG_Essentials/Filters#Creating_a_Glowing_Shadow
// but modified further.

Element filter = DOMBuilder.createElement(defs, "filter");
filter.setAttribute("id", "highlight");
defs.appendChild(filter);

// Increase the radius of our graphic by 2 pixels
Element morph = DOMBuilder.createElement(filter, "feMorphology");
morph.setAttribute("operator", "dilate");
morph.setAttribute("radius", "2");
filter.appendChild(morph);

// Make the original color stronger
Element colorMatrix = DOMBuilder.createElement(filter, "feColorMatrix");
colorMatrix.setAttribute("type", "saturate");
colorMatrix.setAttribute("values", "1");
filter.appendChild(colorMatrix);

Element blur = DOMBuilder.createElement(filter, "feGaussianBlur");
blur.setAttribute("stdDeviation", "2.5");
blur.setAttribute("result", "coloredBlur");
filter.appendChild(blur);

Element merge = DOMBuilder.createElement(filter, "feMerge");
filter.appendChild(merge);

Element mergeNode1 = DOMBuilder.createElement(merge, "feMergeNode");
mergeNode1.setAttribute("in", "coloredBlur");
merge.appendChild(mergeNode1);

Element mergeNode2 = DOMBuilder.createElement(merge, "feMergeNode");
mergeNode2.setAttribute("in", "SourceGraphic");
merge.appendChild(mergeNode2);

}

}
18 changes: 14 additions & 4 deletions src/no/smidsrod/robin/svg/library/ScatterChartRenderer.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package no.smidsrod.robin.svg.library;

import java.util.List;

import org.w3c.dom.Element;

public class ScatterChartRenderer extends AbstractSVGRenderer implements
Expand All @@ -24,11 +26,19 @@ void buildSVGDocument() {
Canvas.createBorderElement(svg);
Header.createElement(svg, chart);
Legend.createElement(svg, chart.getItemList());
//DataRegion.createBorderElement(svg, chart.getItemList());
Axis.createVerticalElement(svg, chart.getRange(0), chart.getItemList());
Axis.createHorizontalElement(svg, chart.getRange(1), chart.getItemList());
// DataRegion.createBorderElement(svg, chart.getItemList());
Range xRange = chart.getRange(0); // range 0 is X axis
Range yRange = chart.getRange(1); // range 1 is Y axis
Range zRange = chart.getRange(2); // range 2 is circle radius
Axis.createHorizontalElement(svg, xRange, chart.getItemList());
Axis.createVerticalElement(svg, yRange, chart.getItemList());
createCircleElements(svg, xRange, yRange, zRange, chart.getItemList());
}

private void createCircleElements(Element svg, Range xRange, Range yRange,
Range zRange, List<Item> items) {
// TODO Auto-generated method stub

// createCircles();
}

}

0 comments on commit f3b5a4e

Please sign in to comment.