    001    /* ===========================================================
    002     * JFreeChart : a free chart library for the Java(tm) platform
    003     * ===========================================================
    004     *
    005     * (C) Copyright 2000-2007, by Object Refinery Limited and Contributors.
    006     *
    007     * Project Info:  http://www.jfree.org/jfreechart/index.html
    008     *
    009     * This library is free software; you can redistribute it and/or modify it
    010     * under the terms of the GNU Lesser General Public License as published by
    011     * the Free Software Foundation; either version 2.1 of the License, or
    012     * (at your option) any later version.
    013     *
    014     * This library is distributed in the hope that it will be useful, but
    015     * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
    016     * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
    017     * License for more details.
    018     *
    019     * You should have received a copy of the GNU Lesser General Public
    020     * License along with this library; if not, write to the Free Software
    021     * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,
    022     * USA.
    023     *
    024     * [Java is a trademark or registered trademark of Sun Microsystems, Inc.
    025     * in the United States and other countries.]
    026     *
    027     * ----------------------
    028     * ImageMapUtilities.java
    029     * ----------------------
    030     * (C) Copyright 2004-2007, by Richard Atkinson and Contributors.
    031     *
    032     * Original Author:  Richard Atkinson;
    033     * Contributor(s):   David Gilbert (for Object Refinery Limited);
    034     *
    035     * $Id: ImageMapUtilities.java,v 1.3.2.3 2007/02/06 11:28:53 mungady Exp $
    036     *
    037     * Changes
    038     * -------
    039     * 02-Aug-2004 : Initial version (RA);
    040     * 13-Jan-2005 : Renamed ImageMapUtilities (DG);
    041     * 19-Jan-2005 : Reversed order of tags for chart entities to get correct
    042     *               layering (DG);
    043     * ------------- JFREECHART 1.0.x ---------------------------------------------
    044     * 06-Feb-2006 : API doc updates (DG);
    045     *
    046     */
    047
    048    package org.jfree.chart.imagemap;
    049
    050    import java.io.IOException;
    051    import java.io.PrintWriter;
    052
    053    import org.jfree.chart.ChartRenderingInfo;
    054    import org.jfree.chart.entity.ChartEntity;
    055    import org.jfree.chart.entity.EntityCollection;
    056    import org.jfree.util.StringUtils;
    057
    058    /**
    059     * Collection of utility methods related to producing image maps.
    060     * Functionality was originally in {@link org.jfree.chart.ChartUtilities}.
    061     */
    062    public class ImageMapUtilities {
    063
    064        /**
    065         * Writes an image map to an output stream.
    066         *
    067         * @param writer  the writer (<code>null</code> not permitted).
    068         * @param name  the map name (<code>null</code> not permitted).
    069         * @param info  the chart rendering info (<code>null</code> not permitted).
    070         *
    071         * @throws java.io.IOException if there are any I/O errors.
    072         */
    073        public static void writeImageMap(PrintWriter writer, String name,
    074                                         ChartRenderingInfo info)
    075            throws IOException {
    076
    077            // defer argument checking...
    078            ImageMapUtilities.writeImageMap(writer, name, info,
    079                    new StandardToolTipTagFragmentGenerator(),
    080                    new StandardURLTagFragmentGenerator());
    081
    082        }
    083
    084        /**
    085         * Writes an image map to an output stream.
    086         *
    087         * @param writer  the writer (<code>null</code> not permitted).
    088         * @param name  the map name (<code>null</code> not permitted).
    089         * @param info  the chart rendering info (<code>null</code> not permitted).
    090         * @param useOverLibForToolTips  whether to use OverLIB for tooltips
    091         *                               (http://www.bosrup.com/web/overlib/).
    092         *
    093         * @throws java.io.IOException if there are any I/O errors.
    094         */
    095        public static void writeImageMap(PrintWriter writer,
    096                                         String name,
    097                                         ChartRenderingInfo info,
    098                                         boolean useOverLibForToolTips)
    099            throws IOException {
    100
    101            ToolTipTagFragmentGenerator toolTipTagFragmentGenerator = null;
    102            if (useOverLibForToolTips) {
    103                toolTipTagFragmentGenerator
    104                        = new OverLIBToolTipTagFragmentGenerator();
    105            }
    106            else {
    107                toolTipTagFragmentGenerator
    108                        = new StandardToolTipTagFragmentGenerator();
    109            }
    110            ImageMapUtilities.writeImageMap(writer, name, info,
    111                    toolTipTagFragmentGenerator,
    112                    new StandardURLTagFragmentGenerator());
    113
    114        }
    115
    116        /**
    117         * Writes an image map to an output stream.
    118         *
    119         * @param writer  the writer (<code>null</code> not permitted).
    120         * @param name  the map name (<code>null</code> not permitted).
    121         * @param info  the chart rendering info (<code>null</code> not permitted).
    122         * @param toolTipTagFragmentGenerator  a generator for the HTML fragment
    123         *     that will contain the tooltip text (<code>null</code> not permitted
    124         *     if <code>info</code> contains tooltip information).
    125         * @param urlTagFragmentGenerator  a generator for the HTML fragment that
    126         *     will contain the URL reference (<code>null</code> not permitted if
    127         *     <code>info</code> contains URLs).
    128         *
    129         * @throws java.io.IOException if there are any I/O errors.
    130         */
    131        public static void writeImageMap(PrintWriter writer, String name,
    132                ChartRenderingInfo info,
    133                ToolTipTagFragmentGenerator toolTipTagFragmentGenerator,
    134                URLTagFragmentGenerator urlTagFragmentGenerator)
    135            throws IOException {
    136
    137            writer.println(ImageMapUtilities.getImageMap(name, info,
    138                    toolTipTagFragmentGenerator, urlTagFragmentGenerator));
    139        }
    140
    141        /**
    142         * Creates an image map element that complies with the XHTML 1.0
    143         * specification.
    144         *
    145         * @param name  the map name (<code>null</code> not permitted).
    146         * @param info  the chart rendering info (<code>null</code> not permitted).
    147         *
    148         * @return The map element.
    149         */
    150        public static String getImageMap(String name, ChartRenderingInfo info) {
    151            return ImageMapUtilities.getImageMap(name, info,
    152                    new StandardToolTipTagFragmentGenerator(),
    153                    new StandardURLTagFragmentGenerator());
    154        }
    155
    156        /**
    157         * Creates an image map element that complies with the XHTML 1.0
    158         * specification.
    159         *
    160         * @param name  the map name (<code>null</code> not permitted).
    161         * @param info  the chart rendering info (<code>null</code> not permitted).
    162         * @param toolTipTagFragmentGenerator  a generator for the HTML fragment
    163         *     that will contain the tooltip text (<code>null</code> not permitted
    164         *     if <code>info</code> contains tooltip information).
    165         * @param urlTagFragmentGenerator  a generator for the HTML fragment that
    166         *     will contain the URL reference (<code>null</code> not permitted if
    167         *     <code>info</code> contains URLs).
    168         *
    169         * @return The map tag.
    170         */
    171        public static String getImageMap(String name, ChartRenderingInfo info,
    172                ToolTipTagFragmentGenerator toolTipTagFragmentGenerator,
    173                URLTagFragmentGenerator urlTagFragmentGenerator) {
    174
    175            StringBuffer sb = new StringBuffer();
    176            sb.append("<map id=\"" + name + "\" name=\"" + name + "\">");
    177            sb.append(StringUtils.getLineSeparator());
    178            EntityCollection entities = info.getEntityCollection();
    179            if (entities != null) {
    180                int count = entities.getEntityCount();
    181                for (int i = count - 1; i >= 0; i--) {
    182                    ChartEntity entity = entities.getEntity(i);
    183                    if (entity.getToolTipText() != null
    184                            || entity.getURLText() != null) {
    185                        String area = entity.getImageMapAreaTag(
    186                                toolTipTagFragmentGenerator,
    187                                urlTagFragmentGenerator);
    188                        if (area.length() > 0) {
    189                            sb.append(area);
    190                            sb.append(StringUtils.getLineSeparator());
    191                        }
    192                    }
    193                }
    194            }
    195            sb.append("</map>");
    196            return sb.toString();
    197
    198        }
    199
    200    }