    001    /* ===========================================================
    002     * JFreeChart : a free chart library for the Java(tm) platform
    003     * ===========================================================
    004     *
    005     * (C) Copyright 2000-2005, 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, 2005, 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.1 2005/10/25 20:42:39 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     *
    044     */
    045
    046    package org.jfree.chart.imagemap;
    047
    048    import java.io.IOException;
    049    import java.io.PrintWriter;
    050
    051    import org.jfree.chart.ChartRenderingInfo;
    052    import org.jfree.chart.entity.ChartEntity;
    053    import org.jfree.chart.entity.EntityCollection;
    054    import org.jfree.util.StringUtils;
    055
    056    /**
    057     * Collection of utility methods related to producing image maps.
    058     * Functionality was originally in {@link org.jfree.chart.ChartUtilities}.
    059     *
    060     * @author Richard Atkinson
    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(
    079                writer, name, info,
    080                new StandardToolTipTagFragmentGenerator(),
    081                new StandardURLTagFragmentGenerator()
    082            );
    083
    084        }
    085
    086        /**
    087         * Writes an image map to an output stream.
    088         *
    089         * @param writer  the writer (<code>null</code> not permitted).
    090         * @param name  the map name (<code>null</code> not permitted).
    091         * @param info  the chart rendering info (<code>null</code> not permitted).
    092         * @param useOverLibForToolTips  whether to use OverLIB for tooltips
    093         *                               (http://www.bosrup.com/web/overlib/).
    094         *
    095         * @throws java.io.IOException if there are any I/O errors.
    096         */
    097        public static void writeImageMap(PrintWriter writer,
    098                                         String name,
    099                                         ChartRenderingInfo info,
    100                                         boolean useOverLibForToolTips)
    101            throws IOException {
    102
    103            ToolTipTagFragmentGenerator toolTipTagFragmentGenerator = null;
    104            if (useOverLibForToolTips) {
    105                toolTipTagFragmentGenerator
    106                    = new OverLIBToolTipTagFragmentGenerator();
    107            }
    108            else {
    109                toolTipTagFragmentGenerator
    110                    = new StandardToolTipTagFragmentGenerator();
    111            }
    112            ImageMapUtilities.writeImageMap(
    113                writer, name, info, toolTipTagFragmentGenerator,
    114                new StandardURLTagFragmentGenerator()
    115            );
    116
    117        }
    118
    119        /**
    120         * Writes an image map to an output stream.
    121         *
    122         * @param writer  the writer (<code>null</code> not permitted).
    123         * @param name  the map name (<code>null</code> not permitted).
    124         * @param info  the chart rendering info (<code>null</code> not permitted).
    125         * @param toolTipTagFragmentGenerator  the tool tip generator.
    126         * @param urlTagFragmentGenerator  the url generator.
    127         *
    128         * @throws java.io.IOException if there are any I/O errors.
    129         */
    130        public static void writeImageMap(PrintWriter writer, String name,
    131                ChartRenderingInfo info,
    132                ToolTipTagFragmentGenerator toolTipTagFragmentGenerator,
    133                URLTagFragmentGenerator urlTagFragmentGenerator)
    134            throws IOException {
    135
    136            writer.println(
    137                ImageMapUtilities.getImageMap(
    138                    name, info, toolTipTagFragmentGenerator, urlTagFragmentGenerator
    139                )
    140            );
    141        }
    142
    143        /**
    144         * Creates an image map element that complies with the XHTML 1.0
    145         * specification.
    146         *
    147         * @param name  the map name (<code>null</code> not permitted).
    148         * @param info  the chart rendering info (<code>null</code> not permitted).
    149         *
    150         * @return The map element.
    151         */
    152        public static String getImageMap(String name, ChartRenderingInfo info) {
    153            return ImageMapUtilities.getImageMap(
    154                name,
    155                info,
    156                new StandardToolTipTagFragmentGenerator(),
    157                new StandardURLTagFragmentGenerator()
    158            );
    159        }
    160
    161        /**
    162         * Creates an image map element that complies with the XHTML 1.0
    163         * specification.
    164         *
    165         * @param name  the map name (<code>null</code> not permitted).
    166         * @param info  the chart rendering info (<code>null</code> not permitted).
    167         * @param toolTipTagFragmentGenerator  the tool tip generator.
    168         * @param urlTagFragmentGenerator  the url generator.
    169         *
    170         * @return The map tag.
    171         */
    172        public static String getImageMap(String name, ChartRenderingInfo info,
    173                ToolTipTagFragmentGenerator toolTipTagFragmentGenerator,
    174                URLTagFragmentGenerator urlTagFragmentGenerator) {
    175
    176            StringBuffer sb = new StringBuffer();
    177            sb.append("<map id=\"" + name + "\" name=\"" + name + "\">");
    178            sb.append(StringUtils.getLineSeparator());
    179            EntityCollection entities = info.getEntityCollection();
    180            if (entities != null) {
    181                int count = entities.getEntityCount();
    182                for (int i = count - 1; i >= 0; i--) {
    183                    ChartEntity entity = entities.getEntity(i);
    184                    if (entity.getToolTipText() != null
    185                            || entity.getURLText() != null) {
    186                        String area = entity.getImageMapAreaTag(
    187                            toolTipTagFragmentGenerator, urlTagFragmentGenerator
    188                        );
    189                        if (area.length() > 0) {
    190                            sb.append(area);
    191                            sb.append(StringUtils.getLineSeparator());
    192                        }
    193                    }
    194                }
    195            }
    196            sb.append("</map>");
    197            return sb.toString();
    198
    199        }
    200
    201    }