Frames | No Frames |
1: /* ====================================== 2: * JFreeChart : a free Java chart library 3: * ====================================== 4: * 5: * (C) Copyright 2000-2007, by Object Refinery Limited and Contributors. 6: * 7: * Project Info: http://www.jfree.org/jfreechart/index.html 8: * 9: * This library is free software; you can redistribute it and/or modify it 10: * under the terms of the GNU Lesser General Public License as published by 11: * the Free Software Foundation; either version 2.1 of the License, or 12: * (at your option) any later version. 13: * 14: * This library is distributed in the hope that it will be useful, but 15: * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 16: * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public 17: * License for more details. 18: * 19: * You should have received a copy of the GNU Lesser General Public 20: * License along with this library; if not, write to the Free Software 21: * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 22: * USA. 23: * 24: * [Java is a trademark or registered trademark of Sun Microsystems, Inc. 25: * in the United States and other countries.] 26: * 27: * -------------------------- 28: * CustomPieURLGenerator.java 29: * -------------------------- 30: * (C) Copyright 2004-2007, by David Basten and Contributors. 31: * 32: * Original Author: David Basten; 33: * Contributors: -; 34: * 35: * Changes: 36: * -------- 37: * 04-Feb-2004 : Version 1, contributed by David Basten based on 38: * CustomXYURLGenerator by Richard Atkinson (added to main source 39: * tree on 25-May-2004); 40: * 41: */ 42: package org.jfree.chart.urls; 43: 44: import java.io.Serializable; 45: import java.util.ArrayList; 46: import java.util.HashMap; 47: import java.util.Iterator; 48: import java.util.Map; 49: import java.util.Set; 50: 51: import org.jfree.chart.plot.MultiplePiePlot; 52: import org.jfree.data.general.PieDataset; 53: import org.jfree.util.PublicCloneable; 54: 55: /** 56: * A custom URL generator for pie charts. 57: */ 58: public class CustomPieURLGenerator implements PieURLGenerator, 59: Cloneable, 60: PublicCloneable, 61: Serializable { 62: 63: /** For serialization. */ 64: private static final long serialVersionUID = 7100607670144900503L; 65: 66: /** Storage for the URLs. */ 67: private ArrayList urls; 68: 69: /** 70: * Creates a new <code>CustomPieURLGenerator</code> instance, initially 71: * empty. Call {@link #addURLs(Map)} to specify the URL fragments to be 72: * used. 73: */ 74: public CustomPieURLGenerator() { 75: this.urls = new ArrayList(); 76: } 77: 78: /** 79: * Generates a URL fragment. 80: * 81: * @param dataset the dataset (ignored). 82: * @param key the item key. 83: * @param pieIndex the pie index. 84: * 85: * @return A string containing the generated URL. 86: * 87: * @see #getURL(Comparable, int) 88: */ 89: public String generateURL(PieDataset dataset, Comparable key, 90: int pieIndex) { 91: return getURL(key, pieIndex); 92: } 93: 94: /** 95: * Returns the number of URL maps stored by the renderer. 96: * 97: * @return The list count. 98: * 99: * @see #addURLs(Map) 100: */ 101: public int getListCount() { 102: return this.urls.size(); 103: } 104: 105: /** 106: * Returns the number of URLs in a given map (specified by its position 107: * in the map list). 108: * 109: * @param list the list index (zero based). 110: * 111: * @return The URL count. 112: * 113: * @see #getListCount() 114: */ 115: public int getURLCount(int list) { 116: int result = 0; 117: Map urlMap = (Map) this.urls.get(list); 118: if (urlMap != null) { 119: result = urlMap.size(); 120: } 121: return result; 122: } 123: 124: /** 125: * Returns the URL for a section in the specified map. 126: * 127: * @param key the key. 128: * @param mapIndex the map index. 129: * 130: * @return The URL. 131: */ 132: public String getURL(Comparable key, int mapIndex) { 133: String result = null; 134: if (mapIndex < getListCount()) { 135: Map urlMap = (Map) this.urls.get(mapIndex); 136: if (urlMap != null) { 137: result = (String) urlMap.get(key); 138: } 139: } 140: return result; 141: } 142: 143: /** 144: * Adds a map containing <code>(key, URL)</code> mappings where each 145: * <code>key</code> is an instance of <code>Comparable</code> 146: * (corresponding to the key for an item in a pie dataset) and each 147: * <code>URL</code> is a <code>String</code> representing a URL fragment. 148: * <br><br> 149: * The map is appended to an internal list...you can add multiple maps 150: * if you are working with, say, a {@link MultiplePiePlot}. 151: * 152: * @param urlMap the URLs (<code>null</code> permitted). 153: */ 154: public void addURLs(Map urlMap) { 155: this.urls.add(urlMap); 156: } 157: 158: /** 159: * Tests if this object is equal to another. 160: * 161: * @param o the other object. 162: * 163: * @return A boolean. 164: */ 165: public boolean equals(Object o) { 166: 167: if (o == this) { 168: return true; 169: } 170: 171: if (o instanceof CustomPieURLGenerator) { 172: CustomPieURLGenerator generator = (CustomPieURLGenerator) o; 173: if (getListCount() != generator.getListCount()) { 174: return false; 175: } 176: Set keySet; 177: for (int pieItem = 0; pieItem < getListCount(); pieItem++) { 178: if (getURLCount(pieItem) != generator.getURLCount(pieItem)) { 179: return false; 180: } 181: keySet = ((HashMap) this.urls.get(pieItem)).keySet(); 182: String key; 183: for (Iterator i = keySet.iterator(); i.hasNext();) { 184: key = (String) i.next(); 185: if (!getURL(key, pieItem).equals( 186: generator.getURL(key, pieItem))) { 187: return false; 188: } 189: } 190: } 191: return true; 192: } 193: return false; 194: } 195: 196: /** 197: * Returns a clone of the generator. 198: * 199: * @return A clone. 200: * 201: * @throws CloneNotSupportedException if cloning is not supported. 202: */ 203: public Object clone() throws CloneNotSupportedException { 204: CustomPieURLGenerator urlGen = new CustomPieURLGenerator(); 205: Map map; 206: Map newMap; 207: String key; 208: 209: for (Iterator i = this.urls.iterator(); i.hasNext();) { 210: map = (Map) i.next(); 211: 212: newMap = new HashMap(); 213: for (Iterator j = map.keySet().iterator(); j.hasNext();) { 214: key = (String) j.next(); 215: newMap.put(key, map.get(key)); 216: } 217: 218: urlGen.addURLs(newMap); 219: newMap = null; 220: } 221: 222: return urlGen; 223: } 224: 225: }