package hu.ppke.itk.itkStock.gui;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.Panel;
import java.sql.SQLException;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Random;
import java.util.SortedMap;
import javax.swing.BoxLayout;
import hu.ppke.itk.itkStock.server.db.historicData.StockData;
import hu.ppke.itk.itkStock.server.db.historicData.StockDate;
import hu.ppke.itk.itkStock.server.db.historicData.StockTime;
import hu.ppke.itk.itkStock.server.db.historicData.Transaction;
import hu.ppke.itk.itkStock.server.id.StockId;
import org.eclipse.swt.SWT;
import org.eclipse.swt.awt.SWT_AWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.DateTime;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.labels.StandardXYToolTipGenerator;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.StandardXYBarPainter;
import org.jfree.chart.renderer.xy.XYBarRenderer;
import org.jfree.chart.renderer.xy.XYItemRenderer;
import org.jfree.data.general.DefaultPieDataset;
import org.jfree.data.time.Day;
import org.jfree.data.time.Second;
import org.jfree.data.time.TimeSeries;
import org.jfree.data.time.TimeSeriesCollection;
import org.jfree.data.xy.IntervalXYDataset;
import org.jfree.data.xy.XYDataset;
import org.jfree.experimental.chart.swt.ChartComposite;
import org.jfree.ui.ApplicationFrame;
import org.eclipse.swt.layout.GridData;
import java.util.ResourceBundle;
public class IntervalDataComposite extends Composite{
private static Map<StockDate, Map<StockTime, Transaction>> fetch;
private JFreeChart localJFreeChart;
private ChartComposite comp1;
public IntervalDataComposite(Composite parent, int style) {
super(parent, style);
// TODO Auto-generated constructor stub
this.setLayout(new org.eclipse.swt.layout.GridLayout(1, false));
Composite comp = new Composite(this, SWT.NONE);
comp1 = new ChartComposite(getComposite(), SWT.NONE);
GridData gd_comp1 = new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1);
gd_comp1.heightHint = 254;
gd_comp1.widthHint = 366;
comp1.setLayoutData(gd_comp1);
comp.setLayout(new org.eclipse.swt.layout.GridLayout(6, false));
final Combo combo = new Combo(comp, SWT.DROP_DOWN);
combo.add("Random adatok");
for(String s : StockId.getStocks()){
combo.add(s);
}
Label from = new Label(comp, SWT.None);
from.setText(ResourceBundle.getBundle("hu.ppke.itk.itkStock.gui.messages").getString("IntervalDataComposite.from.text")); //$NON-NLS-1$ //$NON-NLS-2$
final DateTime calendarFrom = new DateTime (comp, SWT.DROP_DOWN);
Label to = new Label(comp, SWT.None);
to.setText(ResourceBundle.getBundle("hu.ppke.itk.itkStock.gui.messages").getString("IntervalDataComposite.to.text")); //$NON-NLS-1$ //$NON-NLS-2$
final DateTime calendarTo = new DateTime(comp, SWT.DROP_DOWN);
Button requestButton = new Button(comp, SWT.None);
requestButton.setText(ResourceBundle.getBundle("hu.ppke.itk.itkStock.gui.messages").getString("IntervalDataComposite.requestButton.text")); //$NON-NLS-1$ //$NON-NLS-2$
requestButton.addListener(SWT.Selection, new Listener() {
@Override
public void handleEvent(Event arg0) {
/*try {
Map<String, SortedMap<StockDate, SortedMap<StockTime, Transaction>>> fetchData = StockData.fetchData(combo.getText(),
new StockDate(calendarFrom.getYear(), calendarFrom.getMonth(), calendarFrom.getDay()),
new StockDate(calendarTo.getYear(), calendarTo.getMonth(), calendarTo.getDay()));
fetch = (SortedMap<StockDate, SortedMap<StockTime, Transaction>>) fetchData.values();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} */
fetch= new HashMap<>();
for(int i=0;i<100;i++){
Random random = new Random();
Map<StockTime, Transaction> adat = new HashMap<StockTime, Transaction>();
Transaction trans = new Transaction(random.nextDouble(), random.nextInt(500));
adat.put(new StockTime(random.nextInt(23)+1, random.nextInt(58)+1, random.nextInt(99)+1), trans);
fetch.put(new StockDate(2012, random.nextInt(11)+1, random.nextInt(26)+1), adat);
}
localJFreeChart = createChart(combo.getText());
comp1.setChart(localJFreeChart);
comp1.forceRedraw();
}
});
combo.pack();
from.pack();
to.pack();
requestButton.pack();
calendarFrom.pack();
calendarTo.pack();
}
private static JFreeChart createChart(String stockName)
{
XYDataset localXYDataset = createPriceDataset();
JFreeChart localJFreeChart = ChartFactory.createTimeSeriesChart(stockName, "Date", "Price", localXYDataset, true, true, false);
XYPlot localXYPlot = (XYPlot)localJFreeChart.getPlot();
NumberAxis localNumberAxis1 = (NumberAxis)localXYPlot.getRangeAxis();
localNumberAxis1.setLowerMargin(0.4D);
DecimalFormat localDecimalFormat = new DecimalFormat("00.00");
localNumberAxis1.setNumberFormatOverride(localDecimalFormat);
XYItemRenderer localXYItemRenderer = localXYPlot.getRenderer();
localXYItemRenderer.setBaseToolTipGenerator(new StandardXYToolTipGenerator("{0}: ({1}, {2})", new SimpleDateFormat("d-MMM-yyyy"), new DecimalFormat("0.00")));
NumberAxis localNumberAxis2 = new NumberAxis("Volume");
localNumberAxis2.setUpperMargin(1.0D);
localXYPlot.setRangeAxis(1, localNumberAxis2);
localXYPlot.setDataset(1, createVolumeDataset());
localXYPlot.setRangeAxis(1, localNumberAxis2);
localXYPlot.mapDatasetToRangeAxis(1, 1);
XYBarRenderer localXYBarRenderer = new XYBarRenderer(0.2D);
localXYBarRenderer.setBaseToolTipGenerator(new StandardXYToolTipGenerator("{0}: ({1}, {2})", new SimpleDateFormat("d-MMM-yyyy"), new DecimalFormat("0,000.00")));
localXYPlot.setRenderer(1, localXYBarRenderer);
ChartUtilities.applyCurrentTheme(localJFreeChart);
localXYBarRenderer.setBarPainter(new StandardXYBarPainter());
localXYBarRenderer.setShadowVisible(false);
return localJFreeChart;
}
private static XYDataset createPriceDataset()
{
TimeSeries localTimeSeries = new TimeSeries("Price");
Iterator<StockDate> iterator = fetch.keySet().iterator();
Iterator<StockTime> dateIterator;
while(iterator.hasNext()){
Map<StockTime, Transaction> dateStock = fetch.get(iterator.next());
dateIterator = dateStock.keySet().iterator();
StockDate date = iterator.next();
while(dateIterator.hasNext()){
StockTime time = dateIterator.next();
Transaction price = dateStock.get(time);
localTimeSeries.add(new Second(time.getSecond(), time.getMinute(), time.getHour(), date.getDay(), date.getMonth(), date.getYear()),price.getPrice());
}
}
return new TimeSeriesCollection(localTimeSeries);
}
private static IntervalXYDataset createVolumeDataset()
{
TimeSeries localTimeSeries = new TimeSeries("Volume");
Iterator<StockDate> iterator = fetch.keySet().iterator();
Iterator<StockTime> dateIterator;
while(iterator.hasNext()){
Map<StockTime, Transaction> dateStock = fetch.get(iterator.next());
dateIterator = dateStock.keySet().iterator();
StockDate date = iterator.next();
while(dateIterator.hasNext()){
StockTime time = dateIterator.next();
Transaction price = dateStock.get(time);
localTimeSeries.add(new Second(time.getSecond(), time.getMinute(), time.getHour(), date.getDay(), date.getMonth(), date.getYear()),price.getVolume());
}
}
return new TimeSeriesCollection(localTimeSeries);
}
public Composite getComposite(){
return this;
}
}