package uk.ac.cam.cstibhotel.otcanalyser.gui;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.List;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.DateAxis;
import org.jfree.data.xy.XYDataset;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYItemRenderer;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.data.time.Day;
import org.jfree.data.time.Month;
import org.jfree.data.time.TimeSeries;
import org.jfree.data.time.TimeSeriesCollection;
import uk.ac.cam.cstibhotel.otcanalyser.dataanalysis.PriceTimePair;
public class LineGraphMaker {
public static final int MAX = 0;
public static final int MIN = 1;
public static final int AVG = 2;
public static final int TREND_LINE = 3;
public static JFreeChart makeChart(String name, String currency, XYDataset dataset, boolean isMonth) {
String timePeriod = "Day";
if (isMonth) {
timePeriod = "Month";
}
JFreeChart chart = ChartFactory.createTimeSeriesChart(name, timePeriod, "Price in " + currency, dataset);
XYPlot plot = (XYPlot) chart.getPlot();
DateAxis axis = (DateAxis) plot.getDomainAxis();
if (isMonth) {
axis.setDateFormatOverride(new SimpleDateFormat("MMM-yyyy"));
} else {
axis.setDateFormatOverride(new SimpleDateFormat("dd-MMM-yyyy"));
}
XYItemRenderer r = plot.getRenderer();
if (r instanceof XYLineAndShapeRenderer) {
XYLineAndShapeRenderer renderer = (XYLineAndShapeRenderer) r;
renderer.setDrawSeriesLineAsPath(true);
renderer.setBaseShapesVisible(true);
}
return chart;
}
public static TimeSeriesCollection makeDataset() {
TimeSeries max = new TimeSeries("Maximum");
TimeSeries min = new TimeSeries("Minimum");
TimeSeries avg = new TimeSeries("Average");
TimeSeries trendLine = new TimeSeries("Trend Line");
TimeSeriesCollection dataset = new TimeSeriesCollection();
dataset.addSeries(max);
dataset.addSeries(min);
dataset.addSeries(avg);
dataset.addSeries(trendLine);
return dataset;
}
public static void addToSeries(List<PriceTimePair> item, TimeSeriesCollection dataset, int series, boolean isMonth) {
for (PriceTimePair itm : item) {
Calendar c = Calendar.getInstance();
c.setTime(itm.getTime());
int day = c.get(Calendar.DAY_OF_MONTH);
int month = c.get(Calendar.MONTH);
int year = c.get(Calendar.YEAR);
if (isMonth) {
dataset.getSeries(series).addOrUpdate(new Month(month + 1, year), itm.getPrice());
} else {
dataset.getSeries(series).addOrUpdate(new Day(day, month + 1, year), itm.getPrice());
}
}
}
}