Code: Select all
/**
* User: zanel
* Date: 2004.6.2
* Time: 15:44:16
*/
package com.generalynx.gema.chart.axis;
import org.jfree.chart.axis.DateAxis;
import org.jfree.chart.axis.DateTick;
import org.jfree.chart.axis.DateTickUnit;
import org.jfree.chart.axis.Tick;
import org.jfree.ui.RectangleEdge;
import org.jfree.ui.TextAnchor;
import java.awt.*;
import java.awt.geom.Rectangle2D;
import java.text.DateFormat;
import java.util.Date;
import java.util.List;
/**
* Added posibility to rotate ticks <br/>
* Adobe's SVG viewer 3.01 doesn't support this feature so you have to look {@link de.laures.cewolf.util.RenderingUtils#transformXML(org.w3c.dom.Element)}
*/
public class GemaDateAxis extends DateAxis{
TextAnchor m_anchor;
TextAnchor m_rotationAnchor;
double m_angle;
/**
* default values are </br>
* text anchor = TextAnchor.CENTER_LEFT </br>
* rotation anchor = TextAnchor.BOTTOM_LEFT </br>
* angle = 0.0
*/
public GemaDateAxis() {
m_anchor = TextAnchor.CENTER_LEFT;
m_rotationAnchor = TextAnchor.BOTTOM_LEFT;
m_angle = 0.0;
}
public GemaDateAxis(TextAnchor anchor, TextAnchor rotationAnchor, double angle) {
m_anchor = anchor;
m_rotationAnchor = rotationAnchor;
m_angle = angle;
}
/**
* overriden method, because there wasn't possible to choose tick label angle
*/
public List refreshTicksHorizontal(Graphics2D g2,
double cursor,
Rectangle2D plotArea,
Rectangle2D dataArea,
RectangleEdge edge) {
if (getAngle() == 0.0) {
return super.refreshTicksHorizontal(g2, cursor, plotArea, dataArea, edge);
} else {
setVerticalTickLabels(true);
List result = new java.util.ArrayList();
Font tickLabelFont = getTickLabelFont();
g2.setFont(tickLabelFont);
if (isAutoTickUnitSelection()) {
selectAutoTickUnit(g2, plotArea, dataArea, edge);
}
DateTickUnit unit = getTickUnit();
Date tickDate = calculateLowestVisibleTickValue(unit);
Date upperDate = getMaximumDate();
while (tickDate.before(upperDate)) {
if (!isHiddenValue(tickDate.getTime())) {
// work out the value, label and position
String tickLabel;
DateFormat formatter = getDateFormatOverride();
if (formatter != null) {
tickLabel = formatter.format(tickDate);
}
else {
tickLabel = getTickUnit().dateToString(tickDate);
}
Tick tick = new DateTick(tickDate, tickLabel, getAnchor(), getRotationAnchor(), getAngle());
result.add(tick);
tickDate = unit.addToDate(tickDate);
}
else {
tickDate = unit.rollDate(tickDate);
continue;
}
// correction missing (see DateAxis)
}
return result;
}
}
public TextAnchor getAnchor() {
return m_anchor;
}
public void setAnchor(TextAnchor anchor) {
m_anchor = anchor;
}
public TextAnchor getRotationAnchor() {
return m_rotationAnchor;
}
public void setRotationAnchor(TextAnchor rotationAnchor) {
m_rotationAnchor = rotationAnchor;
}
public double getAngle() {
return m_angle;
}
public void setAngle(double angle) {
m_angle = angle;
}
}
Code: Select all
/**
* because Adobe viewer 3.0 has problem with text that is rotated and has text-rendering="optimizeLegibility"
* we transform svg in text-rendering="auto"
*/
public static void transformXML(Element root) {
NodeList nodeList = root.getElementsByTagName(SVG_TEXT_TAG);
for (int i = 0; i < nodeList.getLength(); i++) {
Node node = nodeList.item(i);
if (node instanceof Element) {
Element element = (Element) node;
if (element.getAttribute(SVG_TRANSFORM_ATTRIBUTE).startsWith(SVG_MATRIX_VALUE)) {
element.setAttributeNS(null, SVG_TEXT_RENDERING_ATTRIBUTE, SVG_AUTO_VALUE);
}
Element parentEl = ((Element) element.getParentNode());
if (parentEl.getAttribute(SVG_TRANSFORM_ATTRIBUTE).startsWith(SVG_MATRIX_VALUE)) {
parentEl.setAttributeNS(null, SVG_TEXT_RENDERING_ATTRIBUTE, SVG_AUTO_VALUE);
}
}
}
}