package de.open4me.depot.gui.control; import java.awt.Font; import java.math.BigDecimal; import java.text.AttributedString; import java.util.Date; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Listener; import org.jfree.chart.ChartFactory; import org.jfree.chart.JFreeChart; import org.jfree.chart.labels.PieSectionLabelGenerator; import org.jfree.chart.plot.PiePlot3D; import org.jfree.data.general.DefaultPieDataset; import org.jfree.data.general.PieDataset; import org.jfree.experimental.chart.swt.ChartComposite; import org.jfree.experimental.swt.SWTUtils; import org.jfree.util.Rotation; import de.open4me.depot.gui.DatumsSlider; import de.open4me.depot.sql.GenericObjectSQL; import de.open4me.depot.tools.Bestandsabfragen; import de.willuhn.jameica.gui.AbstractView; import de.willuhn.logging.Logger; import de.willuhn.util.ApplicationException; public class BestandPieChartControl implements Listener { private DatumsSlider datumsSlider; private Date currentdate = new Date(); private DefaultPieDataset dataset; public BestandPieChartControl(AbstractView view, DatumsSlider datumsSlider) { this.datumsSlider = datumsSlider; dataset = new DefaultPieDataset(); datumsSlider.addListener(this); } public ChartComposite getBestandChart(Composite comp) throws ApplicationException { Font font = SWTUtils.toAwtFont(Display.getCurrent(), Display.getCurrent().getSystemFont()); JFreeChart chart = ChartFactory.createPieChart3D("Bestand", dataset, true, true, false); chart.getLegend().setItemFont(font.deriveFont(9.0f)); PiePlot3D plot = (PiePlot3D) chart.getPlot(); plot.setBackgroundAlpha(0); plot.setStartAngle(290); plot.setDirection(Rotation.CLOCKWISE); plot.setForegroundAlpha(0.8f); plot.setOutlineVisible(false); plot.setSectionOutlinesVisible(false); plot.setLabelFont(font.deriveFont(9.0f)); plot.setNoDataMessage("Kein Bestand verfügbar. Wahrscheinlich fehlen die Kursdaten."); plot.setCircular(false); plot.setLabelGap(0.02); plot.setLabelGenerator(new PieSectionLabelGenerator() { @Override public AttributedString generateAttributedSectionLabel( PieDataset arg0, Comparable arg1) { // TODO Auto-generated method stub return null; } public String generateSectionLabel(final PieDataset dataset, final Comparable key) { String result = null; if (dataset != null) { result = key.toString(); } return result; } }); handleEvent(null); return new ChartComposite(comp, SWT.NONE, chart, true); } @Override public void handleEvent(Event event) { if (currentdate != datumsSlider.getDate()) { currentdate = datumsSlider.getDate(); try { dataset.clear(); for (GenericObjectSQL x : Bestandsabfragen.getBestand(currentdate)) { Object anzahl = x.getAttribute("wert"); if (anzahl == null) { Logger.warn("Keine Kursdaten für " + (String) x.getAttribute("wertpapiername")); dataset.clear(); break; } double wert; if (anzahl instanceof BigDecimal) { wert = ((BigDecimal) anzahl).doubleValue(); } else { wert = (Double) anzahl; } dataset.setValue((String) x.getAttribute("wertpapiername"), wert); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }