Tick label angle (extended code)

A discussion forum for JFreeChart (a 2D chart library for the Java platform).
Locked
Zane
Posts: 6
Joined: Thu Jun 09, 2005 12:11 pm

Tick label angle (extended code)

Post by Zane » Thu Jun 09, 2005 1:42 pm

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;
    }
}
and RenderingUtils method transformXML(...)

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);
                }
            }
        }
    }
Zane

Locked