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 * Changes
036 * -------
037 * 02-Aug-2004 : Initial version (RA);
038 * 13-Jan-2005 : Renamed ImageMapUtilities (DG);
039 * 19-Jan-2005 : Reversed order of tags for chart entities to get correct
040 * layering (DG);
041 * ------------- JFREECHART 1.0.x ---------------------------------------------
042 * 06-Feb-2006 : API doc updates (DG);
043 * 04-Dec-2007 : Added htmlEscape() method, and escape 'name' in
044 * getImageMap() (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=\"" + htmlEscape(name) + "\" name=\""
177 + htmlEscape(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,
188 urlTagFragmentGenerator);
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 /**
202 * Returns a string that is equivalent to the input string, but with
203 * special characters converted to HTML escape sequences.
204 *
205 * @param input the string to escape (<code>null</code> not permitted).
206 *
207 * @return A string with characters escaped.
208 *
209 * @since 1.0.9
210 */
211 public static String htmlEscape(String input) {
212 if (input == null) {
213 throw new IllegalArgumentException("Null 'input' argument.");
214 }
215 StringBuffer result = new StringBuffer();
216 int length = input.length();
217 for (int i = 0; i < length; i++) {
218 char c = input.charAt(i);
219 if (c == '&') {
220 result.append("&");
221 }
222 else if (c == '\"') {
223 result.append(""");
224 }
225 else if (c == '<') {
226 result.append("<");
227 }
228 else if (c == '>') {
229 result.append(">");
230 }
231 else if (c == '\'') {
232 result.append("'");
233 }
234 else if (c == '\\') {
235 result.append("\");
236 }
237 else {
238 result.append(c);
239 }
240 }
241 return result.toString();
242 }
243 }