From: Anjo K. <an...@us...> - 2004-12-21 14:44:07
|
Update of /cvsroot/wonder/Wonder/Common/Frameworks/ERPlot/Sources/er/plot In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv19004/Common/Frameworks/ERPlot/Sources/er/plot Modified Files: ERPCategoryChart.java ERPChart.java ERPPieChart.java Log Message: JavaDoc, configuration options, refactoring Index: ERPCategoryChart.java =================================================================== RCS file: /cvsroot/wonder/Wonder/Common/Frameworks/ERPlot/Sources/er/plot/ERPCategoryChart.java,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** ERPCategoryChart.java 21 Dec 2004 13:37:44 -0000 1.4 --- ERPCategoryChart.java 21 Dec 2004 14:43:48 -0000 1.5 *************** *** 17,26 **** /** ! * Class for Chart Component ERPCategoryChart. ! * ! * @binding sample sample binding explanation ! * ! * @created ak on 17.12.04 ! * @project ERPlot */ --- 17,44 ---- /** ! * Display a category chart - a chart where you have 2 or 3 dimensions. The most important binding is <code>items</code> which ! * should contain an array of objects from which the values <code>xNameKey</code>, <code>yNameKey</code>, <code>categoryKey</code> and <code> ! * valueKey</code> are retrieved. For example, you might have an array of line items, ! * with a valueKey <code>amount</code>, an <code>xNameKey</code> with <code>invoice.datePurchased</code>, <code>yNameKey</code>, <code>categoryKey</code>and a nameKey <code>product.name</code>. ! * @binding name the name of the chart ! * @binding chartType the type of the chart (possible values depend on the concrete subclass) ! * @binding imageType the type of the image to show: <code>png</code> (default) or <code>jpeg</code> ! * @binding width the width of the chart (400 pixel if not specified) ! * @binding height the height of the chart (400 pixel if not specified) ! * @binding dataset Dataset to use. If this is given, then items, nameKey, valueKey and categoryKey are not considered. ! * @binding items array of values to display the chart for ! * @binding nameKey the key for the name (must return Comparable) ! * @binding valueKey the key for the value (must return Number) ! * @binding categoryKey the key for the categories (optional, must return Comparable) ! * @binding xName the name for the x axis (String) ! * @binding yName the name for the y axis (String) ! * @binding showLegends true, if legends should be shown ! * @binding showToolTips true, if tool tips should be shown ! * @binding showLegends true, if legends should be shown ! * @binding orientation either "horizontal" (default) or "vertical" ! * @binding chart Chart to use instead of the created one. If this binding is setable, then it will be set to the actually used chart ! * @binding configuration NSDictionary that will be applied to the chart via key-value-coding prior to rendering. Contains ! * entries like <code>antiAlias=true</code> or <code>categoryPlot.dataAreaRatio = 0.8</code>. ! * @author ak */ *************** *** 46,49 **** --- 64,68 ---- _yName = null; _categoryKey = null; + _orientation = null; } *************** *** 77,129 **** } - public Dataset dataset() { - if(_dataset == null) { - _dataset = super.dataset(); - if(_dataset == null) { - DefaultCategoryDataset dataset = new DefaultCategoryDataset(); - - for(Enumeration items = items().objectEnumerator(); items.hasMoreElements(); ) { - Object item = items.nextElement(); - Comparable name = (Comparable)NSKeyValueCodingAdditions.Utility.valueForKeyPath(item, nameKey()); - Number value = (Number)NSKeyValueCodingAdditions.Utility.valueForKeyPath(item, valueKey()); - Comparable category = null; - if(categoryKey() != null) { - category = (Comparable)NSKeyValueCodingAdditions.Utility.valueForKeyPath(item, categoryKey()); - } - dataset.setValue(value, name, category); - } - _dataset = dataset; - } - } - return _dataset; - } - protected NSArray supportedTypes() { return SUPPORTED_TYPES; } ! public JFreeChart chart() { ! if(_chart == null) { ! JFreeChart chart = null; ! CategoryDataset dataset = (CategoryDataset)dataset(); ! String name = stringValueForBinding("name", ""); ! Class clazz = ChartFactory.class; ! try { ! Method method = clazz.getDeclaredMethod("create" + chartType(), new Class[] { ! String.class, String.class, String.class, CategoryDataset.class, PlotOrientation.class, ! boolean.class, boolean.class, boolean.class ! }); ! chart = (JFreeChart) method.invoke(clazz, new Object[] {name, xName(), yName(), dataset(), orientation(), ! (showLegends() ? Boolean.TRUE : Boolean.FALSE), ! (showToolTips() ? Boolean.TRUE : Boolean.FALSE), ! (showUrls() ? Boolean.TRUE : Boolean.FALSE ) ! }); ! } catch(Throwable t) { ! log.error(t.getMessage(), t); ! throw NSForwardException._runtimeExceptionForThrowable(t); } ! _chart = chart; } ! return _chart; } } --- 96,139 ---- } protected NSArray supportedTypes() { return SUPPORTED_TYPES; } ! protected JFreeChart createChart() { ! JFreeChart chart = null; ! CategoryDataset dataset = (CategoryDataset)dataset(); ! String name = stringValueForBinding("name", ""); ! Class clazz = ChartFactory.class; ! try { ! Method method = clazz.getDeclaredMethod("create" + chartType(), new Class[] { ! String.class, String.class, String.class, CategoryDataset.class, PlotOrientation.class, ! boolean.class, boolean.class, boolean.class ! }); ! chart = (JFreeChart) method.invoke(clazz, new Object[] {name, xName(), yName(), dataset(), orientation(), ! (showLegends() ? Boolean.TRUE : Boolean.FALSE), ! (showToolTips() ? Boolean.TRUE : Boolean.FALSE), ! (showUrls() ? Boolean.TRUE : Boolean.FALSE ) ! }); ! } catch(Throwable t) { ! log.error(t.getMessage(), t); ! throw NSForwardException._runtimeExceptionForThrowable(t); ! } ! return chart; ! } ! ! protected Dataset createDataset() { ! DefaultCategoryDataset dataset = new DefaultCategoryDataset(); ! ! for(Enumeration items = items().objectEnumerator(); items.hasMoreElements(); ) { ! Object item = items.nextElement(); ! Comparable name = (Comparable)NSKeyValueCodingAdditions.Utility.valueForKeyPath(item, nameKey()); ! Number value = (Number)NSKeyValueCodingAdditions.Utility.valueForKeyPath(item, valueKey()); ! Comparable category = null; ! if(categoryKey() != null) { ! category = (Comparable)NSKeyValueCodingAdditions.Utility.valueForKeyPath(item, categoryKey()); } ! dataset.setValue(value, name, category); } ! return dataset; } } Index: ERPChart.java =================================================================== RCS file: /cvsroot/wonder/Wonder/Common/Frameworks/ERPlot/Sources/er/plot/ERPChart.java,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** ERPChart.java 21 Dec 2004 13:37:44 -0000 1.6 --- ERPChart.java 21 Dec 2004 14:43:48 -0000 1.7 *************** *** 1,4 **** --- 1,5 ---- package er.plot; import java.io.ByteArrayOutputStream; + import java.util.Enumeration; import org.jfree.chart.ChartRenderingInfo; *************** *** 9,12 **** --- 10,14 ---- import org.jfree.chart.imagemap.ToolTipTagFragmentGenerator; import org.jfree.chart.imagemap.URLTagFragmentGenerator; + import org.jfree.data.category.DefaultCategoryDataset; import org.jfree.data.general.Dataset; *************** *** 14,18 **** --- 16,22 ---- import com.webobjects.foundation.NSArray; import com.webobjects.foundation.NSData; + import com.webobjects.foundation.NSDictionary; import com.webobjects.foundation.NSForwardException; + import com.webobjects.foundation.NSKeyValueCodingAdditions; import er.extensions.ERXAssert; *************** *** 32,41 **** * @binding dataset Dataset to use. If this is given, then items, nameKey, valueKey and categoryKey are not considered. * @binding items array of values to display the chart for ! * @binding nameKey the key for the name (must return String) * @binding valueKey the key for the value (must return Number) * @binding showLegends true, if legends should be shown * @binding showToolTips true, if tool tips should be shown * @binding showLegends true, if legends should be shown ! * * @author ak */ --- 36,47 ---- * @binding dataset Dataset to use. If this is given, then items, nameKey, valueKey and categoryKey are not considered. * @binding items array of values to display the chart for ! * @binding nameKey the key for the name (must return Comparable) * @binding valueKey the key for the value (must return Number) * @binding showLegends true, if legends should be shown * @binding showToolTips true, if tool tips should be shown * @binding showLegends true, if legends should be shown ! * @binding chart Chart to use instead of the created one. If this binding is setable, then it will be set to the actually used chart ! * @binding configuration NSDictionary that will be applied to the chart via key-value-coding prior to rendering. Contains ! * entries like <code>antiAlias=true</code> or <code>categoryPlot.dataAreaRatio = 0.8</code>. * @author ak */ *************** *** 61,64 **** --- 67,71 ---- protected Dataset _dataset; protected JFreeChart _chart; + protected NSDictionary _configuration; /** *************** *** 78,81 **** --- 85,104 ---- } + public String nameKey() { + if(_nameKey == null) { + _nameKey = (String)valueForBinding("nameKey"); + ERXAssert.DURING.notNull("nameKey", _nameKey); + } + return _nameKey; + } + + public String valueKey() { + if(_valueKey == null) { + _valueKey = (String)valueForBinding("valueKey"); + ERXAssert.DURING.notNull("valueKey", _valueKey); + } + return _valueKey; + } + public int width() { if(_width == 0) { *************** *** 92,103 **** } - public String nameKey() { - if(_nameKey == null) { - _nameKey = (String)valueForBinding("nameKey"); - ERXAssert.DURING.notNull("nameKey", _nameKey); - } - return _nameKey; - } - public String chartType() { if(_chartType == null) { --- 115,118 ---- *************** *** 129,138 **** } ! public String valueKey() { ! if(_valueKey == null) { ! _valueKey = (String)valueForBinding("valueKey"); ! ERXAssert.DURING.notNull("valueKey", _valueKey); } ! return _valueKey; } --- 144,155 ---- } ! public NSDictionary configuration() { ! if(_configuration == null) { ! _configuration = (NSDictionary)valueForBinding("configuration"); ! if(_configuration == null) { ! _configuration = NSDictionary.EmptyDictionary; ! } } ! return _configuration; } *************** *** 151,157 **** _dataset = null; _chart = null; } ! public abstract JFreeChart chart(); protected abstract NSArray supportedTypes(); --- 168,176 ---- _dataset = null; _chart = null; + _configuration = null; } ! protected abstract JFreeChart createChart(); ! protected abstract Dataset createDataset(); protected abstract NSArray supportedTypes(); *************** *** 160,167 **** --- 179,211 ---- if(_dataset == null) { _dataset = (Dataset)valueForBinding("dataset"); + if(_dataset == null) { + _dataset = (DefaultCategoryDataset) createDataset(); + if(canSetValueForBinding("dataset")) { + setValueForBinding(_dataset, "dataset"); + } + } } return _dataset; } + public JFreeChart chart() { + if(_chart == null) { + _chart = (JFreeChart)valueForBinding("chart"); + if(_chart == null) { + _chart = createChart(); + log.info(bindingKeys()); + if(hasBinding("chart") && canSetValueForBinding("chart")) { + setValueForBinding(_chart, "chart"); + } + for (Enumeration keys = configuration().keyEnumerator(); keys.hasMoreElements();) { + String keypath = (String) keys.nextElement(); + Object value = configuration().objectForKey(keypath); + NSKeyValueCodingAdditions.Utility.takeValueForKeyPath(_chart, value, keypath); + } + } + } + return _chart; + } + public NSData imageData() { if(_imageData == null) { Index: ERPPieChart.java =================================================================== RCS file: /cvsroot/wonder/Wonder/Common/Frameworks/ERPlot/Sources/er/plot/ERPPieChart.java,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** ERPPieChart.java 21 Dec 2004 12:08:47 -0000 1.5 --- ERPPieChart.java 21 Dec 2004 14:43:48 -0000 1.6 *************** *** 13,23 **** import com.webobjects.foundation.NSKeyValueCodingAdditions; /** ! * PieChart. ! * ! * @binding sample sample binding explanation ! * ! * @created ak on Thu Sep 25 2003 ! * @project ERPlot */ --- 13,40 ---- import com.webobjects.foundation.NSKeyValueCodingAdditions; + import er.extensions.ERXAssert; + /** ! * Displays a Pie chart with an optional map. The most important binding is <code>items</code> which ! * should contain an array of objects from which the values <code>nameKey</code> and <code> ! * valueKey</code> are retrieved. For example, you might have an array of line items, ! * with a valueKey <code>amount</code> and a nameKey <code>product.name</code>. If you supply a ! * PieDataset instead, this will get used instead of the other bindings. ! * @binding name the name of the chart ! * @binding chartType the type of the chart (possible values depend on the concrete subclass) ! * @binding imageType the type of the image to show: <code>png</code> (default) or <code>jpeg</code> ! * @binding width the width of the chart (400 pixel if not specified) ! * @binding height the height of the chart (400 pixel if not specified) ! * @binding dataset Dataset to use. If this is given, then items, nameKey, valueKey and categoryKey are not considered. ! * @binding items array of values to display the chart for ! * @binding nameKey the key for the name (must return String) ! * @binding valueKey the key for the value (must return Number) ! * @binding showLegends true, if legends should be shown ! * @binding showToolTips true, if tool tips should be shown ! * @binding showLegends true, if legends should be shown ! * @binding chart Chart to use instead of the created one. If this binding is setable, then it will be set to the actually used chart ! * @binding configuration NSDictionary that will be applied to the chart via key-value-coding prior to rendering. Contains ! * entries like <code>antiAlias=true</code> or <code>categoryPlot.dataAreaRatio = 0.8</code>. ! * @author ak */ *************** *** 35,69 **** } ! public Dataset dataset() { ! if(_dataset == null) { ! _dataset = super.dataset(); ! if(_dataset == null) { ! DefaultPieDataset dataset = new DefaultPieDataset(); ! for(Enumeration items = items().objectEnumerator(); items.hasMoreElements(); ) { ! Object item = items.nextElement(); ! Comparable name = (Comparable)NSKeyValueCodingAdditions.Utility.valueForKeyPath(item, nameKey()); ! Number value = (Number)NSKeyValueCodingAdditions.Utility.valueForKeyPath(item, valueKey()); ! dataset.setValue(name, value); ! } ! _dataset = dataset; ! } } ! return _dataset; } ! public JFreeChart chart() { ! if(_chart == null) { ! JFreeChart chart = null; ! PieDataset dataset = (PieDataset)dataset(); ! String name = stringValueForBinding("name", null); ! if("PieChart3D".equals(chartType())) { ! chart = ChartFactory.createPieChart3D(name,dataset,true,false,false); ! } else { ! chart = ChartFactory.createPieChart(name,dataset,showLegends(),showToolTips(),showUrls()); ! } ! _chart = chart; } ! return _chart; } --- 52,93 ---- } ! public String nameKey() { ! if(_nameKey == null) { ! _nameKey = (String)valueForBinding("nameKey"); ! ERXAssert.DURING.notNull("nameKey", _nameKey); } ! return _nameKey; } ! public String valueKey() { ! if(_valueKey == null) { ! _valueKey = (String)valueForBinding("valueKey"); ! ERXAssert.DURING.notNull("valueKey", _valueKey); ! } ! return _valueKey; ! } ! protected Dataset createDataset() { ! DefaultPieDataset dataset = new DefaultPieDataset(); ! for(Enumeration items = items().objectEnumerator(); items.hasMoreElements(); ) { ! Object item = items.nextElement(); ! Comparable name = (Comparable)NSKeyValueCodingAdditions.Utility.valueForKeyPath(item, nameKey()); ! Number value = (Number)NSKeyValueCodingAdditions.Utility.valueForKeyPath(item, valueKey()); ! dataset.setValue(name, value); } ! return dataset; ! } ! ! public JFreeChart createChart() { ! JFreeChart chart = null; ! PieDataset dataset = (PieDataset)dataset(); ! String name = stringValueForBinding("name", null); ! ! if("PieChart3D".equals(chartType())) { ! chart = ChartFactory.createPieChart3D(name,dataset,showLegends(),showToolTips(),showUrls()); ! } else { ! chart = ChartFactory.createPieChart(name,dataset,showLegends(),showToolTips(),showUrls()); ! } ! return chart; } |