001 /* PAVLOV -- Multiple Choice Study System 002 * Copyright (C) 2000 - 2004 T.J. Willis 003 * 004 * This program is free software; you can redistribute it and/or 005 * modify it under the terms of the GNU General Public License 006 * as published by the Free Software Foundation; either version 2 007 * of the License, or (at your option) any later version. 008 * 009 * This program is distributed in the hope that it will be useful, 010 * but WITHOUT ANY WARRANTY; without even the implied warranty of 011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 012 * GNU General Public License for more details. 013 * 014 * You should have received a copy of the GNU General Public License 015 * along with this program; if not, write to the Free Software 016 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. 017 * 018 * $Header: /cvsroot/pavlov/net/sourceforge/pavlov/pluglets/feedback/charts/JChartFeedbackPluglet.java,v 1.3 2004/05/10 15:22:10 tj_willis Exp $ 019 * 020 * 021 * NOTE: This class is an interface between Pavlov and jCharts. 022 * jCharts is a registered trademark of Nathaniel G. Auvil 023 * see: http://jcharts.sourceforge.net 024 * http://sourceforge.net/projects/jcharts 025 * 026 * jCharts includes software developed by the Apache Software Foundation 027 * (http://www.apache.org/), namely the Apache XML Batik Project 028 */ 029 package net.sourceforge.pavlov.pluglets.feedback.charts; 030 import java.util.*; 031 import javax.swing.*; 032 import java.awt.*; 033 import net.sourceforge.pavlov.pluglets.feedback.AbstractFeedbackPluglet; 034 import net.sourceforge.pavlov.swing.HelpSystem; 035 036 import org.jCharts.axisChart.*; 037 import org.jCharts.chartData.*; 038 import org.jCharts.properties.*; 039 import org.jCharts.types.*; 040 041 042 /** 043 * A base class for FeedbackPluglets that use JCharts. 044 * 045 * @author <a href="mailto:"></a> 046 * @version 1.0 047 */ 048 public abstract class JChartFeedbackPluglet 049 extends AbstractFeedbackPluglet 050 { 051 /** 052 * This pluglet's JMenuBar. 053 * 054 */ 055 protected JMenuBar foo; 056 /** 057 * This pluglet's HelpSystem. 058 * 059 */ 060 protected HelpSystem help; 061 private ChartPanel hmm; 062 private AxisChart axisChart; 063 private String[] xAxisLabels; 064 private String xAxisTitle; 065 private String yAxisTitle; 066 private String title; 067 private DataSeries dataSeries; 068 private double[][] data; 069 private String[] legendLabels; 070 private Paint[] paints; 071 private Stroke[] strokes; 072 private Shape[] shapes; 073 private AxisChartDataSet axisChartDataSet; 074 private ChartProperties chartProperties; 075 private AxisProperties axisProperties; 076 private LegendProperties legendProperties; 077 //LineChartProperties lineChartProperties; 078 079 /** 080 * Creates a new <code>JChartFeedbackPluglet</code> instance. 081 * 082 */ 083 public JChartFeedbackPluglet() 084 { 085 super(); 086 setResizable(true); 087 } 088 089 /** 090 * Describe <code>init</code> method here. 091 * 092 */ 093 public void init(){ 094 hmm = new ChartPanel(); 095 Container cp = getContentPane(); 096 cp.setLayout(new BorderLayout()); 097 cp.add(hmm,BorderLayout.CENTER); 098 099 pack(); 100 //setVisible( true ); 101 102 preInitChart(); 103 104 hmm.setText(getDescription()); 105 106 foo = new JMenuBar(); 107 setJMenuBar(foo); 108 pack(); 109 } 110 111 112 /** 113 * Describe <code>getXAxisTitle</code> method here. 114 * 115 * @return a <code>String</code> value 116 */ 117 public abstract String getXAxisTitle(); 118 /** 119 * Describe <code>getYAxisTitle</code> method here. 120 * 121 * @return a <code>String</code> value 122 */ 123 public abstract String getYAxisTitle(); 124 /** 125 * Describe <code>getChartTitle</code> method here. 126 * 127 * @return a <code>String</code> value 128 */ 129 public abstract String getChartTitle(); 130 /** 131 * Describe <code>getLegendLabels</code> method here. 132 * 133 * @return a <code>String[]</code> value 134 */ 135 public abstract String[] getLegendLabels(); 136 137 /** 138 * Describe <code>getStrokes</code> method here. 139 * 140 * @return a <code>Stroke[]</code> value 141 */ 142 public Stroke[] getStrokes() { 143 Stroke[] ret = { LineChartProperties.DEFAULT_LINE_STROKE }; 144 return ret; 145 } 146 /** 147 * Describe <code>getShapes</code> method here. 148 * 149 * @return a <code>Shape[]</code> value 150 */ 151 public Shape[] getShapes() { 152 Shape[] ret ={ null }; 153 return ret; 154 } 155 156 /** 157 * Describe <code>getPaints</code> method here. 158 * 159 * @return a <code>Paint[]</code> value 160 */ 161 public Paint[] getPaints() 162 { 163 Paint [] ret = { Color.black }; 164 return ret; 165 } 166 // public abstract String getLegendLabels(); 167 // public abstract String getStrokes(); 168 // public abstract String getShapes(); 169 // public abstract String getLineChartProperties(); 170 // public abstract String getPaints(); 171 // public abstract String getChartProperties(); 172 // public abstract String getAxisProperties(); 173 // public abstract String getLegendProperties(); 174 175 /** 176 * Describe <code>getChartTypeProperties</code> method here. 177 * 178 * @return a <code>ChartTypeProperties</code> value 179 */ 180 public ChartTypeProperties getChartTypeProperties() 181 { 182 strokes= getStrokes(); 183 shapes= getShapes(); 184 return new LineChartProperties( strokes, shapes ); 185 } 186 187 /** 188 * Describe <code>getChartType</code> method here. 189 * 190 * @return a <code>ChartType</code> value 191 */ 192 public ChartType getChartType() 193 { 194 return ChartType.LINE; 195 } 196 197 private void preInitChart() 198 { 199 xAxisTitle= getXAxisTitle(); //"Questions"; 200 yAxisTitle= getYAxisTitle(); //"Score"; 201 title= getChartTitle(); //"Your Progress This Quiz"; 202 legendLabels= getLegendLabels(); //new String[] { "Percentage Score" }; 203 //lineChartProperties= getLineChartProperties(); 204 paints= getPaints(); 205 chartProperties= new ChartProperties(); 206 axisProperties= new AxisProperties(); 207 legendProperties= new LegendProperties(); 208 } 209 210 private void makeXAxisLabels(int cols) 211 { 212 xAxisLabels= new String[1]; 213 xAxisLabels[0] = new String("."); 214 // TOFIX: what's the deal with null labels...? 215 ArrayList<String> xlabs = new ArrayList<String>(cols); 216 for(int i=0;i<cols;i++) 217 { 218 xlabs.add((String)new String(".")); 219 } 220 xAxisLabels = (String [])xlabs.toArray((String [])xAxisLabels); 221 } 222 223 224 225 226 /** 227 * Describe <code>setData</code> method here. 228 * 229 * @param v an <code>AbstractList</code> value 230 */ 231 protected void setData(AbstractList v) 232 { 233 AbstractListAdaptor ala = new AbstractListAdaptor(v.size(),1); 234 ala.setRow(0,v); 235 setData(ala); 236 } 237 238 /** 239 * Describe <code>setData</code> method here. 240 * 241 * @param ala an <code>AbstractListAdaptor</code> value 242 */ 243 protected void setData(AbstractListAdaptor ala) 244 { 245 makeXAxisLabels(ala.columns()); 246 247 dataSeries = new DataSeries(xAxisLabels, xAxisTitle, yAxisTitle,title ); 248 249 data= ala.getArray(); 250 251 axisChartDataSet=null; 252 try { 253 //axisChartDataSet= new AxisChartDataSet( data, legendLabels, paints, ChartType.LINE, lineChartProperties ); 254 axisChartDataSet= new AxisChartDataSet( data, legendLabels, paints, getChartType(), getChartTypeProperties() ); 255 } catch (Exception e) {e.printStackTrace();} 256 dataSeries.addIAxisPlotDataSet( axisChartDataSet ); 257 258 axisChart= new AxisChart( dataSeries, chartProperties, axisProperties, legendProperties, hmm.getWidth(),hmm.getHeight()); 259 hmm.setChart(axisChart); 260 } 261 262 /** 263 * If the containing component's size has changed, let the chart know 264 * and let it rerender itself. 265 * 266 * @param x an <code>int</code> value 267 * @param y an <code>int</code> value 268 * @param w an <code>int</code> value 269 * @param h an <code>int</code> value 270 */ 271 public void setBounds(int x, int y,int w,int h) 272 { 273 super.setBounds(x,y,w,h); 274 if(axisChart != null && dataSeries !=null) 275 try { 276 axisChart= new AxisChart( dataSeries, chartProperties, axisProperties, legendProperties, hmm.getWidth(),hmm.getHeight()); 277 hmm.setChart(axisChart); 278 } catch (Exception e) { 279 280 } 281 282 } 283 284 /** 285 * Describe <code>getPreferredSize</code> method here. 286 * 287 * @return a <code>java.awt.Dimension</code> value 288 */ 289 public java.awt.Dimension getPreferredSize() 290 { 291 return new java.awt.Dimension(360,250); 292 } 293 294 295 /** 296 * Trick to get the chart to repaint correctly. 297 * 298 * @param g a <code>Graphics2D</code> value 299 */ 300 public void paint(Graphics2D g) 301 { 302 super.paintComponents(g); 303 } 304 305 } 306 307