/* =========================================================== * JFreeChart : a free chart library for the Java(tm) platform * =========================================================== * * (C) Copyright 2000-2012, by Object Refinery Limited and Contributors. * * Project Info: http://www.jfree.org/jfreechart/index.html * * This library is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This library is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public * License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, * USA. * * [Oracle and Java are registered trademarks of Oracle and/or its affiliates. * Other names may be trademarks of their respective owners.] * * ---------------------- * ImageMapUtilities.java * ---------------------- * (C) Copyright 2004-2012, by Richard Atkinson and Contributors. * * Original Author: Richard Atkinson; * Contributor(s): David Gilbert (for Object Refinery Limited); * Fawad Halim - bug 2690293; * * Changes * ------- * 02-Aug-2004 : Initial version (RA); * 13-Jan-2005 : Renamed ImageMapUtilities (DG); * 19-Jan-2005 : Reversed order of tags for chart entities to get correct * layering (DG); * ------------- JFREECHART 1.0.x --------------------------------------------- * 06-Feb-2006 : API doc updates (DG); * 04-Dec-2007 : Added htmlEscape() method, and escape 'name' in * getImageMap() (DG); * 19-Mar-2009 : Added javascriptEscape() method - see bug 2690293 by FH (DG); * 25-Mar-2009 : Reimplemented javascriptEscape() (DG); * 17-Jun-2012 : Removed JCommon dependencies (DG); * */ package org.jfree.chart.imagemap; import java.io.IOException; import java.io.PrintWriter; import org.jfree.chart.ChartRenderingInfo; import org.jfree.chart.util.StringUtils; import org.jfree.chart.entity.ChartEntity; import org.jfree.chart.entity.EntityCollection; /** * Collection of utility methods related to producing image maps. * Functionality was originally in {@link org.jfree.chart.ChartUtilities}. */ public class ImageMapUtilities { /** * Writes an image map to an output stream. * * @param writer the writer (<code>null</code> not permitted). * @param name the map name (<code>null</code> not permitted). * @param info the chart rendering info (<code>null</code> not permitted). * * @throws java.io.IOException if there are any I/O errors. */ public static void writeImageMap(PrintWriter writer, String name, ChartRenderingInfo info) throws IOException { // defer argument checking... ImageMapUtilities.writeImageMap(writer, name, info, new StandardToolTipTagFragmentGenerator(), new StandardURLTagFragmentGenerator()); } /** * Writes an image map to an output stream. * * @param writer the writer (<code>null</code> not permitted). * @param name the map name (<code>null</code> not permitted). * @param info the chart rendering info (<code>null</code> not permitted). * @param useOverLibForToolTips whether to use OverLIB for tooltips * (http://www.bosrup.com/web/overlib/). * * @throws java.io.IOException if there are any I/O errors. */ public static void writeImageMap(PrintWriter writer, String name, ChartRenderingInfo info, boolean useOverLibForToolTips) throws IOException { ToolTipTagFragmentGenerator toolTipTagFragmentGenerator = null; if (useOverLibForToolTips) { toolTipTagFragmentGenerator = new OverLIBToolTipTagFragmentGenerator(); } else { toolTipTagFragmentGenerator = new StandardToolTipTagFragmentGenerator(); } ImageMapUtilities.writeImageMap(writer, name, info, toolTipTagFragmentGenerator, new StandardURLTagFragmentGenerator()); } /** * Writes an image map to an output stream. * * @param writer the writer (<code>null</code> not permitted). * @param name the map name (<code>null</code> not permitted). * @param info the chart rendering info (<code>null</code> not permitted). * @param toolTipTagFragmentGenerator a generator for the HTML fragment * that will contain the tooltip text (<code>null</code> not permitted * if <code>info</code> contains tooltip information). * @param urlTagFragmentGenerator a generator for the HTML fragment that * will contain the URL reference (<code>null</code> not permitted if * <code>info</code> contains URLs). * * @throws java.io.IOException if there are any I/O errors. */ public static void writeImageMap(PrintWriter writer, String name, ChartRenderingInfo info, ToolTipTagFragmentGenerator toolTipTagFragmentGenerator, URLTagFragmentGenerator urlTagFragmentGenerator) throws IOException { writer.println(ImageMapUtilities.getImageMap(name, info, toolTipTagFragmentGenerator, urlTagFragmentGenerator)); } /** * Creates an image map element that complies with the XHTML 1.0 * specification. * * @param name the map name (<code>null</code> not permitted). * @param info the chart rendering info (<code>null</code> not permitted). * * @return The map element. */ public static String getImageMap(String name, ChartRenderingInfo info) { return ImageMapUtilities.getImageMap(name, info, new StandardToolTipTagFragmentGenerator(), new StandardURLTagFragmentGenerator()); } /** * Creates an image map element that complies with the XHTML 1.0 * specification. * * @param name the map name (<code>null</code> not permitted). * @param info the chart rendering info (<code>null</code> not permitted). * @param toolTipTagFragmentGenerator a generator for the HTML fragment * that will contain the tooltip text (<code>null</code> not permitted * if <code>info</code> contains tooltip information). * @param urlTagFragmentGenerator a generator for the HTML fragment that * will contain the URL reference (<code>null</code> not permitted if * <code>info</code> contains URLs). * * @return The map tag. */ public static String getImageMap(String name, ChartRenderingInfo info, ToolTipTagFragmentGenerator toolTipTagFragmentGenerator, URLTagFragmentGenerator urlTagFragmentGenerator) { StringBuilder sb = new StringBuilder(); sb.append("<map id=\"" + htmlEscape(name) + "\" name=\"" + htmlEscape(name) + "\">"); sb.append(StringUtils.getLineSeparator()); EntityCollection entities = info.getEntityCollection(); if (entities != null) { int count = entities.getEntityCount(); for (int i = count - 1; i >= 0; i--) { ChartEntity entity = entities.getEntity(i); if (entity.getToolTipText() != null || entity.getURLText() != null) { String area = entity.getImageMapAreaTag( toolTipTagFragmentGenerator, urlTagFragmentGenerator); if (area.length() > 0) { sb.append(area); sb.append(StringUtils.getLineSeparator()); } } } } sb.append("</map>"); return sb.toString(); } /** * Returns a string that is equivalent to the input string, but with * special characters converted to HTML escape sequences. * * @param input the string to escape (<code>null</code> not permitted). * * @return A string with characters escaped. * * @since 1.0.9 */ public static String htmlEscape(String input) { if (input == null) { throw new IllegalArgumentException("Null 'input' argument."); } StringBuilder result = new StringBuilder(); int length = input.length(); for (int i = 0; i < length; i++) { char c = input.charAt(i); if (c == '&') { result.append("&"); } else if (c == '\"') { result.append("""); } else if (c == '<') { result.append("<"); } else if (c == '>') { result.append(">"); } else if (c == '\'') { result.append("'"); } else if (c == '\\') { result.append("\"); } else { result.append(c); } } return result.toString(); } /** * Returns a string that is equivalent to the input string, but with * special characters converted to JavaScript escape sequences. * * @param input the string to escape (<code>null</code> not permitted). * * @return A string with characters escaped. * * @since 1.0.13 */ public static String javascriptEscape(String input) { if (input == null) { throw new IllegalArgumentException("Null 'input' argument."); } StringBuilder result = new StringBuilder(); int length = input.length(); for (int i = 0; i < length; i++) { char c = input.charAt(i); if (c == '\"') { result.append("\\\""); } else if (c == '\'') { result.append("\\'"); } else if (c == '\\') { result.append("\\\\"); } else { result.append(c); } } return result.toString(); } }