/***************************************************************************** * Limpet - the Lightweight InforMation ProcEssing Toolkit * http://limpet.info * * (C) 2015-2016, Deep Blue C Technologies Ltd * * This library is free software; you can redistribute it and/or * modify it under the terms of the Eclipse Public License v1.0 * (http://www.eclipse.org/legal/epl-v10.html) * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *****************************************************************************/ package info.limpet.ui.time_frequency; import info.limpet.IBaseTemporalCollection; import info.limpet.ICollection; import info.limpet.IStoreItem; import info.limpet.analysis.TimeFrequencyBins; import info.limpet.analysis.TimeFrequencyBins.Bin; import info.limpet.data.operations.CollectionComplianceTests; import info.limpet.ui.PlottingHelpers; import info.limpet.ui.core_view.CoreAnalysisView; import java.util.Date; import java.util.Iterator; import java.util.List; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Composite; import org.swtchart.Chart; import org.swtchart.IAxis; import org.swtchart.ILineSeries; import org.swtchart.ILineSeries.PlotSymbolType; import org.swtchart.ISeries; import org.swtchart.ISeries.SeriesType; import org.swtchart.ext.InteractiveChart; import org.swtchart.Range; /** * display analysis overview of selection * * @author ian * */ public class TimeFrequencyView extends CoreAnalysisView { private static final int MAX_SIZE = 2000; /** * The ID of the view as specified by the extension. */ public static final String ID = "info.limpet.ui.TimeFrequencyView"; private Chart chart; /** * The constructor. */ public TimeFrequencyView() { super(ID, "Time frequency"); } /** * This is a callback that will allow us to create the viewer and initialize it. */ public void createPartControl(Composite parent) { makeActions(); contributeToActionBars(); // create a chart chart = new InteractiveChart(parent, SWT.NONE); // set titles chart.getAxisSet().getXAxis(0).getTitle().setText("Time"); chart.getAxisSet().getYAxis(0).getTitle().setText("Frequency"); chart.getTitle().setVisible(false); // adjust the axis range chart.getAxisSet().adjustRange(); // register as selection listener setupListener(); } @Override public void display(List<IStoreItem> res) { if (getATests().allTemporal(res)) { // sort out what type of data this is. showData(res); chart.setVisible(true); } else { chart.setVisible(false); } } private void showData(List<IStoreItem> res) { Iterator<IStoreItem> iter = res.iterator(); // clear the graph ISeries[] coll = chart.getSeriesSet().getSeries(); for (int i = 0; i < coll.length; i++) { ISeries iSeries = coll[i]; chart.getSeriesSet().deleteSeries(iSeries.getId()); } while (iter.hasNext()) { ICollection iCollection = (ICollection) iter.next(); TimeFrequencyBins.BinnedData bins = null; if (iCollection.isTemporal() && iCollection.getValuesCount() > 1 && iCollection.getValuesCount() <= MAX_SIZE) { IBaseTemporalCollection thisQ = (IBaseTemporalCollection) iCollection; bins = TimeFrequencyBins.doBins(iCollection, thisQ); String seriesName = iCollection.getName(); ILineSeries newSeries = (ILineSeries) chart.getSeriesSet().createSeries(SeriesType.LINE, seriesName); newSeries.setSymbolType(PlotSymbolType.NONE); newSeries.enableArea(true); newSeries.setLineColor(PlottingHelpers.colorFor(seriesName)); Date[] xData = new Date[bins.size() * 2]; double[] yData = new double[bins.size() * 2]; // put the data into series int ctr = 0; Iterator<Bin> iter2 = bins.iterator(); while (iter2.hasNext()) { Bin bin = (TimeFrequencyBins.Bin) iter2.next(); xData[ctr] = new Date(bin.getLowerVal()); yData[ctr++] = bin.getFreqVal(); xData[ctr] = new Date(bin.getUpperVal()); yData[ctr++] = bin.getFreqVal(); } newSeries.setXDateSeries(xData); newSeries.setYSeries(yData); newSeries.enableStack(true); newSeries.enableArea(true); // adjust the axis range chart.getAxisSet().adjustRange(); IAxis xAxis = chart.getAxisSet().getXAxis(0); xAxis.enableCategory(false); // set the y axis min to be zero Range yRange = chart.getAxisSet().getYAxis(0).getRange(); chart.getAxisSet().getYAxis(0).setRange(new Range(0, yRange.upper)); chart.redraw(); } } } @Override public void setFocus() { chart.setFocus(); } @Override protected boolean appliesToMe(List<IStoreItem> selection, CollectionComplianceTests tests) { final boolean res; if (tests.allQuantity(selection)) { // ok, all quantities - that's easy res = true; } else if (tests.allNonQuantity(selection)) { if (tests.allNonLocation(selection)) { // none of them are locations - that's ok res = true; } else { // hmm, locations - scary. say no res = false; } } else { // mixed sorts, let's not bother res = false; } chart.setVisible(res); return res; } @Override protected String getTextForClipboard() { return "Pending"; } }