java/cewolf-1.0/src/main/java/de/laures/cewolf/taglib/tags/ChartMapTag.java
author František Kučera <franta-hg@frantovo.cz>
Sun, 01 Mar 2009 11:06:49 +0100
changeset 4 249560bcc466
parent 1 639991d0808a
permissions -rw-r--r--
Doplnění serializovatelnosti
     1 /* ================================================================
     2  * Cewolf : Chart enabling Web Objects Framework
     3  * ================================================================
     4  *
     5  * Project Info:  http://cewolf.sourceforge.net
     6  * Project Lead:  Guido Laures (guido@laures.de);
     7  *
     8  * (C) Copyright 2002, by Guido Laures
     9  *
    10  * This library is free software; you can redistribute it and/or modify it under the terms
    11  * of the GNU Lesser General Public License as published by the Free Software Foundation;
    12  * either version 2.1 of the License, or (at your option) any later version.
    13  *
    14  * This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
    15  * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
    16  * See the GNU Lesser General Public License for more details.
    17  *
    18  * You should have received a copy of the GNU Lesser General Public License along with this
    19  * library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
    20  * Boston, MA 02111-1307, USA.
    21  */
    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 /**
    60  * Tag &lt;map&gt; which defines the tooltip and link tags.
    61  * @see DataTag
    62  * @author  Guido Laures
    63  */
    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 	// If the links provided by the JFreeChart renderer should be used.
    74 	boolean useJFreeChartLinkGenerator = false;
    75 	// If the tooltips provided by the JFreeChart renderer should be used.
    76 	boolean useJFreeChartTooltipGenerator = false;
    77 
    78 	public int doStartTag() throws JspException {
    79 		// Object linkGenerator = getLinkGenerator();
    80 		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 		// print out image map end
   123 		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   		        // Note; there is a simple ChartEntity also passed since Jfreechart 1.0rc1, that is ignored
   187   		        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 because category is unknown
   229 		    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 	/**
   258 	 * Setter of the useJFreeChartLinkGenerator field.
   259 	 * @param useJFreeChartLinkGenerator the useJFreeChartLinkGenerator to set.
   260 	 */
   261 	public void setUseJFreeChartLinkGenerator(boolean useJFreeChartLinkGenerator) {
   262 		this.useJFreeChartLinkGenerator = useJFreeChartLinkGenerator;
   263 	}
   264 	/**
   265 	 * Setter of the useJFreeChartTooltipGenerator field.
   266 	 * @param useJFreeChartTooltipGenerator the useJFreeChartTooltipGenerator to set.
   267 	 */
   268 	public void setUseJFreeChartTooltipGenerator(boolean useJFreeChartTooltipGenerator) {
   269 		this.useJFreeChartTooltipGenerator = useJFreeChartTooltipGenerator;
   270 	}
   271 	
   272 }