1 22 23 package de.laures.cewolf.taglib.tags; 24 25 import java.io.IOException ; 26 import java.io.Writer ; 27 import java.util.Iterator ; 28 29 import javax.servlet.http.HttpServletRequest ; 30 import javax.servlet.http.HttpServletResponse ; 31 import javax.servlet.jsp.JspException ; 32 33 import org.apache.commons.logging.Log; 34 import org.apache.commons.logging.LogFactory; 35 import org.jfree.chart.ChartRenderingInfo; 36 import org.jfree.chart.entity.CategoryItemEntity; 37 import org.jfree.chart.entity.ChartEntity; 38 import org.jfree.chart.entity.LegendItemEntity; 39 import org.jfree.chart.entity.PieSectionEntity; 40 import org.jfree.chart.entity.XYItemEntity; 41 import org.jfree.data.category.CategoryDataset; 42 import org.jfree.data.general.Dataset; 43 import org.jfree.data.general.PieDataset; 44 import org.jfree.data.xy.XYDataset; 45 46 import de.laures.cewolf.CewolfException; 47 import de.laures.cewolf.Configuration; 48 import de.laures.cewolf.links.CategoryItemLinkGenerator; 49 import de.laures.cewolf.links.LinkGenerator; 50 import de.laures.cewolf.links.PieSectionLinkGenerator; 51 import de.laures.cewolf.links.XYItemLinkGenerator; 52 import de.laures.cewolf.taglib.util.BrowserDetection; 53 import de.laures.cewolf.taglib.util.PageUtils; 54 import de.laures.cewolf.tooltips.CategoryToolTipGenerator; 55 import de.laures.cewolf.tooltips.PieToolTipGenerator; 56 import de.laures.cewolf.tooltips.ToolTipGenerator; 57 import de.laures.cewolf.tooltips.XYToolTipGenerator; 58 59 64 public class ChartMapTag extends CewolfTag { 65 66 private static final long serialVersionUID = -3742340487378471159L; 67 68 private static final Log LOG = LogFactory.getLog(ChartMapTag.class); 69 70 ToolTipGenerator toolTipGenerator = null; 71 LinkGenerator linkGenerator = null; 72 73 boolean useJFreeChartLinkGenerator = false; 75 boolean useJFreeChartTooltipGenerator = false; 77 78 public int doStartTag() throws JspException { 79 Mapped root = (Mapped) PageUtils.findRoot(this, pageContext); 81 root.enableMapping(); 82 String chartId = ((CewolfRootTag) root).getChartId(); 83 try { 84 Dataset dataset = PageUtils.getDataset(chartId, pageContext); 85 Writer out = pageContext.getOut(); 86 final boolean isIE = BrowserDetection.isIE((HttpServletRequest ) pageContext.getRequest()); 87 if (hasToolTips()) { 88 enableToolTips(out, isIE); 89 } 90 out.write("<MAP name=\"" + chartId + "\">\n"); 91 ChartRenderingInfo info = (ChartRenderingInfo) root.getRenderingInfo(); 92 Iterator entities = info.getEntityCollection().iterator(); 93 while (entities.hasNext()) { 94 ChartEntity ce = (ChartEntity) entities.next(); 95 out.write("\n<AREA shape=\"" + ce.getShapeType() + "\" "); 96 out.write("COORDS=\"" + ce.getShapeCoords() + "\" "); 97 if (ce instanceof XYItemEntity) 98 { 99 dataset = ((XYItemEntity)ce).getDataset(); 100 } 101 if (!(ce instanceof LegendItemEntity)) { 102 if (hasToolTips()) { 103 writeOutToolTip(dataset, out, isIE, ce); 104 } 105 if (hasLinks()) { 106 writeOutLink(linkGenerator, dataset, out, ce); 107 } 108 } 109 out.write(">"); 110 } 111 } catch (IOException ioex) { 112 log.error(ioex); 113 throw new JspException (ioex.getMessage()); 114 } catch (CewolfException cwex) { 115 log.error(cwex); 116 throw new JspException (cwex.getMessage()); 117 } 118 return EVAL_PAGE; 119 } 120 121 public int doEndTag() throws JspException { 122 Writer out = pageContext.getOut(); 124 try { 125 out.write("</MAP>"); 126 } catch (IOException ioex) { 127 log.error(ioex); 128 throw new JspException (ioex.getMessage()); 129 } 130 return doAfterEndTag(EVAL_PAGE); 131 } 132 133 public void reset() { 134 this.toolTipGenerator = null; 135 this.linkGenerator = null; 136 } 137 138 public void writeOutLink(Object linkGen, Dataset dataset, Writer out, ChartEntity ce) throws IOException { 139 final String link = generateLink(dataset, ce); 140 141 if (null != link) { 142 final String href = ((HttpServletResponse ) pageContext.getResponse()).encodeURL(link); 143 out.write("HREF=\"" + href + "\""); 144 } 145 } 146 147 private void writeOutToolTip(Dataset dataset, Writer out, final boolean isIE, ChartEntity ce) throws IOException , JspException { 148 String toolTip = generateToolTip(dataset, ce); 149 if (null != toolTip) { 150 if (!isIE) { 151 out.write("ONMOUSEOVER=\"return overlib('" 152 + toolTip + "', WIDTH, '20');\" ONMOUSEOUT=\"return nd();\" "); 153 } else { 154 out.write("ALT=\"" + toolTip + "\" "); 155 } 156 } 157 } 158 159 public void enableToolTips(Writer out, final boolean isIE) throws IOException { 160 if (!PageUtils.isToolTipsEnabled(pageContext) && !isIE) { 161 Configuration config = Configuration.getInstance(pageContext.getServletContext()); 162 String overLibURL = ChartImgTag.fixAbsolutURL(config.getOverlibURL(), pageContext); 163 out.write("<script language=\"JavaScript\" SRC=\""); 164 out.write(overLibURL + "\"><!-- overLIB (c) Erik Bosrup --></script>\n"); 165 out.write("<div id=\"overDiv\" style=\"position:absolute; visibility:hidden; z-index:1000;\"></div>\n"); 166 PageUtils.setToolTipsEnabled(pageContext); 167 } 168 } 169 170 private String generateLink(Dataset dataset, ChartEntity ce) { 171 String link = null; 172 if (useJFreeChartLinkGenerator) { 173 link = ce.getURLText(); 174 } else if (linkGenerator instanceof CategoryItemLinkGenerator || linkGenerator instanceof XYItemLinkGenerator || linkGenerator instanceof PieSectionLinkGenerator) { 175 if (linkGenerator instanceof CategoryItemLinkGenerator) { 176 if (ce instanceof CategoryItemEntity) { 177 CategoryItemEntity catEnt = (CategoryItemEntity) ce; 178 link = ((CategoryItemLinkGenerator) linkGenerator).generateLink(dataset, catEnt.getSeries(), catEnt.getCategory()); 179 } 180 } 181 if (linkGenerator instanceof XYItemLinkGenerator) { 182 if (ce instanceof XYItemEntity) { 183 XYItemEntity xyEnt = (XYItemEntity) ce; 184 link = ((XYItemLinkGenerator) linkGenerator).generateLink(dataset, xyEnt.getSeriesIndex(), xyEnt.getItem()); 185 } else { 186 LOG.debug("Link entity skipped, not XYItemEntity.class:" + ce); 188 } 189 } 190 if (linkGenerator instanceof PieSectionLinkGenerator) { 191 if (ce instanceof PieSectionEntity) { 192 PieSectionEntity pieEnt = (PieSectionEntity) ce; 193 link = ((PieSectionLinkGenerator) linkGenerator).generateLink(dataset, pieEnt.getSectionKey()); 194 } 195 } 196 } 197 return link; 198 } 199 200 private String generateToolTip(Dataset dataset, ChartEntity ce) throws JspException { 201 String tooltip = null; 202 if (useJFreeChartTooltipGenerator) { 203 tooltip = ce.getToolTipText(); 204 } else if (toolTipGenerator instanceof CategoryToolTipGenerator || toolTipGenerator instanceof XYToolTipGenerator || toolTipGenerator instanceof PieToolTipGenerator) { 205 if (toolTipGenerator instanceof CategoryToolTipGenerator) { 206 if (ce instanceof CategoryItemEntity) { 207 CategoryItemEntity catEnt = (CategoryItemEntity) ce; 208 tooltip = ((CategoryToolTipGenerator) toolTipGenerator).generateToolTip((CategoryDataset) dataset, catEnt.getSeries(), catEnt.getCategoryIndex()); 209 } 210 } 211 212 if (toolTipGenerator instanceof XYToolTipGenerator) { 213 if (ce instanceof XYItemEntity) { 214 XYItemEntity xyEnt = (XYItemEntity) ce; 215 tooltip = ((XYToolTipGenerator) toolTipGenerator).generateToolTip((XYDataset) dataset, xyEnt.getSeriesIndex(), xyEnt.getItem()); 216 } 217 } 218 219 if (toolTipGenerator instanceof PieToolTipGenerator) { 220 if (ce instanceof PieSectionEntity) { 221 PieSectionEntity pieEnt = (PieSectionEntity) ce; 222 PieDataset ds = (PieDataset) dataset; 223 final int index = pieEnt.getSectionIndex(); 224 tooltip = ((PieToolTipGenerator) toolTipGenerator).generateToolTip(ds, ds.getKey(index), index); 225 } 226 } 227 } else { 228 throw new JspException ( 230 "TooltipgGenerator of class " + toolTipGenerator.getClass().getName() + " does not implement the appropriate TooltipGenerator interface for entity type " + ce.getClass().getName()); 231 } 232 return tooltip; 233 } 234 235 private boolean hasToolTips() throws JspException { 236 if (toolTipGenerator!=null && useJFreeChartTooltipGenerator) { 237 throw new JspException ("Can't have both tooltipGenerator and useJFreeChartTooltipGenerator parameters specified!"); 238 } 239 return toolTipGenerator != null || useJFreeChartTooltipGenerator; 240 } 241 242 public void setTooltipgeneratorid(String id) { 243 this.toolTipGenerator = (ToolTipGenerator) pageContext.findAttribute(id); 244 } 245 246 private boolean hasLinks() throws JspException { 247 if (linkGenerator!=null && useJFreeChartLinkGenerator) { 248 throw new JspException ("Can't have both linkGenerator and useJFreeChartLinkGenerator parameters specified!"); 249 } 250 return linkGenerator != null || useJFreeChartLinkGenerator; 251 } 252 253 public void setLinkgeneratorid(String id) { 254 this.linkGenerator = (LinkGenerator) pageContext.findAttribute(id); 255 } 256 257 261 public void setUseJFreeChartLinkGenerator(boolean useJFreeChartLinkGenerator) { 262 this.useJFreeChartLinkGenerator = useJFreeChartLinkGenerator; 263 } 264 268 public void setUseJFreeChartTooltipGenerator(boolean useJFreeChartTooltipGenerator) { 269 this.useJFreeChartTooltipGenerator = useJFreeChartTooltipGenerator; 270 } 271 272 } 273 | Popular Tags |