package uk.ac.cam.cstibhotel.otcanalyser.gui;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.editor.ChartEditorManager;
import org.jfree.chart.plot.XYPlot;
import org.jfree.data.time.TimeSeriesCollection;
import uk.ac.cam.cstibhotel.otcanalyser.dataanalysis.PriceTimePair;
public class GraphWindow extends CurrencyToolbarWindow implements ActionListener{
private static final long serialVersionUID = 1L;
private ContentPanel pnl;
private List<TimeSeriesCollection> datasets = new ArrayList<>();
private List<ChartPanel> chartPanels = new ArrayList<>();
private ChartPanel currentChart = null;
public static Color chartColor = new Color(100,100,100);
public static Color plotColor = Color.darkGray;
public GraphWindow() {
pnl = new ContentPanel();
add(pnl, BorderLayout.CENTER);
}
//add trendline points to dataset
public synchronized void addTrendlinePoints(List<List<PriceTimePair>> ptp) {
for (int i = 0; i < ptp.size(); i++) {
LineGraphMaker.addToSeries(ptp.get(i), datasets.get(i), LineGraphMaker.TREND_LINE, false);
}
}
public synchronized void addChartPanel(String currency, boolean byMonth) {
TimeSeriesCollection dataset = LineGraphMaker.makeDataset();
datasets.add(dataset);
String currencyName = currency;
if (currency.isEmpty()) {
currencyName = "Unknown Currency";
}
String timePeriod = "Day";
if (byMonth) {
timePeriod = "Month";
}
JFreeChart chart = LineGraphMaker.makeChart("Prices by " + timePeriod, currencyName, dataset, byMonth);
chart.setBackgroundPaint(chartColor);
XYPlot plot = (XYPlot) chart.getPlot();
plot.setBackgroundPaint(plotColor);
ChartPanel panel = new ChartPanel(chart);
chartPanels.add(panel);
ChartEditorManager.setChartEditorFactory(new NewDefaultChartEditorFactory());
panel.setFillZoomRectangle(true);
panel.setMouseWheelEnabled(true);
currencies.add(currency);
}
//add trades to existing datasets
public synchronized void addTradesToDatasets(List<PriceTimePair> maxes, List<PriceTimePair> mins,
List<PriceTimePair> avgs,List<PriceTimePair> trendLine, String currency, boolean byMonth) {
if (!currencies.contains(currency)) {
addChartPanel(currency, byMonth);
}
int i = currencies.indexOf(currency);
TimeSeriesCollection dataset = datasets.get(i);
LineGraphMaker.addToSeries(maxes, dataset, LineGraphMaker.MAX, byMonth);
LineGraphMaker.addToSeries(mins, dataset, LineGraphMaker.MIN, byMonth);
LineGraphMaker.addToSeries(avgs, dataset, LineGraphMaker.AVG, byMonth);
LineGraphMaker.addToSeries(trendLine, dataset, LineGraphMaker.TREND_LINE, byMonth);
if (currencies.size() > 1) {
makeToolBar();
}
if (pnl.getComponentCount() == 0) {
currentChart = chartPanels.get(0);
pnl.add(currentChart);
}
}
public synchronized void clear() {
currencies = new ArrayList<>();
datasets = new ArrayList<>();
chartPanels = new ArrayList<>();
pnl.removeAll();
if (showToolbar) {
remove(toolbar);
showToolbar = false;
}
}
@Override
public synchronized void actionPerformed(ActionEvent e){
if (currencies.contains(e.getActionCommand())) {
pnl.removeAll();
currentChart = chartPanels.get(currencies.indexOf(e.getActionCommand()));
pnl.add(currentChart);
pnl.repaint();
}
}
}