package studio.ui;
import studio.kdb.K;
import studio.kdb.KTableModel;
import studio.kdb.ToDouble;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.general.SeriesException;
import org.jfree.data.time.*;
import org.jfree.data.xy.XYDataset;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;
import javax.swing.*;
import java.util.TimeZone;
import studio.kdb.Config;
public class LineChart {
public ChartPanel chartPanel;
JFrame frame = null;
public LineChart(KTableModel table) {
JFreeChart chart = createDataset(table);
if (chart != null) {
frame = new JFrame("Studio for kdb+ [chart]");
chartPanel = new ChartPanel(chart);
chartPanel.setPreferredSize(new java.awt.Dimension(500,270));
chartPanel.setMouseZoomable(true,false);
frame.setContentPane(chartPanel);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.setIconImage(Util.getImage(Config.imageBase2 + "chart_24.png").getImage());
frame.pack();
frame.setVisible(true);
frame.requestFocus();
frame.toFront();
}
}
public static JFreeChart createDataset(KTableModel table) {
TimeZone tz = TimeZone.getTimeZone("GMT");
XYDataset ds = null;
if (table.getColumnCount() > 0) {
Class klass = table.getColumnClass(0);
if ((klass == K.KTimestampVector.class) ||(klass == K.KTimespanVector.class) || (klass == K.KDateVector.class) || (klass == K.KTimeVector.class) || (klass == K.KMonthVector.class) || (klass == K.KMinuteVector.class) || (klass == K.KSecondVector.class) || (klass == K.KDatetimeVector.class)) {
TimeSeriesCollection tsc = new TimeSeriesCollection(tz);
for (int col = 1;col < table.getColumnCount();col++) {
TimeSeries series = null;
try {
if (klass == K.KDateVector.class) {
series = new TimeSeries(table.getColumnName(col),Day.class);
K.KDateVector dates = (K.KDateVector) table.getColumn(0);
for (int row = 0;row < dates.getLength();row++) {
K.KDate date = (K.KDate) dates.at(row);
Day day = new Day(date.toDate(),tz);
Object o = table.getValueAt(row,col);
if (o instanceof K.KBase)
if (!((K.KBase) o).isNull())
if (o instanceof ToDouble)
series.addOrUpdate(day,((ToDouble) o).toDouble());
}
}
else if (klass == K.KTimeVector.class) {
series = new TimeSeries(table.getColumnName(col),Millisecond.class);
K.KTimeVector times = (K.KTimeVector) table.getColumn(0);
for (int row = 0;row < table.getRowCount();row++) {
K.KTime time = (K.KTime) times.at(row);
Millisecond ms = new Millisecond(time.toTime(),tz);
Object o = table.getValueAt(row,col);
if (o instanceof K.KBase)
if (!((K.KBase) o).isNull())
if (o instanceof ToDouble)
series.addOrUpdate(ms,((ToDouble) o).toDouble());
}
}
else if (klass == K.KTimestampVector.class) {
series = new TimeSeries(table.getColumnName(col),Day.class);
K.KTimestampVector dates = (K.KTimestampVector) table.getColumn(0);
for (int row = 0;row < dates.getLength();row++) {
K.KTimestamp date = (K.KTimestamp) dates.at(row);
Day day = new Day(new java.util.Date(date.toTimestamp().getTime()),tz);
Object o = table.getValueAt(row,col);
if (o instanceof K.KBase)
if (!((K.KBase) o).isNull())
if (o instanceof ToDouble)
series.addOrUpdate(day,((ToDouble) o).toDouble());
}
}
else if (klass == K.KTimespanVector.class) {
series = new TimeSeries(table.getColumnName(col),Millisecond.class);
K.KTimespanVector times = (K.KTimespanVector) table.getColumn(0);
for (int row = 0;row < table.getRowCount();row++) {
K.KTimespan time = (K.KTimespan) times.at(row);
Millisecond ms = new Millisecond(time.toTime(),tz);
Object o = table.getValueAt(row,col);
if (o instanceof K.KBase)
if (!((K.KBase) o).isNull())
if (o instanceof ToDouble)
series.addOrUpdate(ms,((ToDouble) o).toDouble());
}
}
else if (klass == K.KDatetimeVector.class) {
series = new TimeSeries(table.getColumnName(col),Millisecond.class);
K.KDatetimeVector times = (K.KDatetimeVector) table.getColumn(0);
for (int row = 0;row < table.getRowCount();row++) {
K.KDatetime time = (K.KDatetime) times.at(row);
Millisecond ms = new Millisecond(time.toTimestamp(),tz);
Object o = table.getValueAt(row,col);
if (o instanceof K.KBase)
if (!((K.KBase) o).isNull())
if (o instanceof ToDouble)
series.addOrUpdate(ms,((ToDouble) o).toDouble());
}
}
else if (klass == K.KMonthVector.class) {
series = new TimeSeries(table.getColumnName(col),Month.class);
K.KMonthVector times = (K.KMonthVector) table.getColumn(0);
for (int row = 0;row < table.getRowCount();row++) {
K.Month time = (K.Month) times.at(row);
int m = time.i + 24000;
int y = m / 12;
m = 1 + m % 12;
Month month = new Month(m,y);
Object o = table.getValueAt(row,col);
if (o instanceof K.KBase)
if (!((K.KBase) o).isNull())
if (o instanceof ToDouble)
series.addOrUpdate(month,((ToDouble) o).toDouble());
}
}
else if (klass == K.KSecondVector.class) {
series = new TimeSeries(table.getColumnName(col),Second.class);
K.KSecondVector times = (K.KSecondVector) table.getColumn(0);
for (int row = 0;row < table.getRowCount();row++) {
K.Second time = (K.Second) times.at(row);
Second second = new Second(time.i % 60,time.i / 60,0,1,1,2001);
Object o = table.getValueAt(row,col);
if (o instanceof K.KBase)
if (!((K.KBase) o).isNull())
if (o instanceof ToDouble)
series.addOrUpdate(second,((ToDouble) o).toDouble());
}
}
else if (klass == K.KMinuteVector.class) {
series = new TimeSeries(table.getColumnName(col),Minute.class);
K.KMinuteVector times = (K.KMinuteVector) table.getColumn(0);
for (int row = 0;row < table.getRowCount();row++) {
K.Minute time = (K.Minute) times.at(row);
Minute minute = new Minute(time.i % 60,time.i / 60,1,1,2001);
Object o = table.getValueAt(row,col);
if (o instanceof K.KBase)
if (!((K.KBase) o).isNull())
if (o instanceof ToDouble)
series.addOrUpdate(minute,((ToDouble) o).toDouble());
}
}
}
catch (SeriesException e) {
System.err.println("Error adding to series");
}
if (series.getItemCount() > 0)
tsc.addSeries(series);
}
ds = tsc;
}
else if ((klass == K.KDoubleVector.class) || (klass == K.KFloatVector.class) || (klass == K.KShortVector.class) || (klass == K.KIntVector.class) || (klass == K.KLongVector.class)) {
XYSeriesCollection xysc = new XYSeriesCollection();
for (int col = 1;col < table.getColumnCount();col++) {
XYSeries series = null;
try {
series = new XYSeries(table.getColumnName(col));
for (int row = 0;row < table.getRowCount();row++) {
double x = ((ToDouble) table.getValueAt(row,0)).toDouble();
double y = ((ToDouble) table.getValueAt(row,col)).toDouble();
series.add(x,y);
}
}
catch (SeriesException e) {
System.err.println("Error adding to series");
}
if (series.getItemCount() > 0)
xysc.addSeries(series);
}
ds = xysc;
}
}
if (ds != null) {
boolean legend = false;
if (ds.getSeriesCount() > 1)
legend = true;
if (ds instanceof XYSeriesCollection)
return ChartFactory.createXYLineChart("",
"",
"",
ds,
PlotOrientation.VERTICAL,
legend,
true,
true);
else if (ds instanceof TimeSeriesCollection)
return ChartFactory.createTimeSeriesChart("",
"",
"",
ds,
legend,
true,
true);
}
return null;
}
}