package org.chartsy.zigzag; import java.awt.Color; import java.awt.Graphics2D; import java.awt.Rectangle; import java.text.DecimalFormat; import java.util.LinkedHashMap; import org.chartsy.main.ChartFrame; import org.chartsy.main.chart.Overlay; import org.chartsy.main.data.DataItem; import org.chartsy.main.data.Dataset; import org.chartsy.main.utils.DefaultPainter; import org.chartsy.main.utils.Range; import org.chartsy.main.utils.SerialVersion; import org.openide.nodes.AbstractNode; /** * * @author viorel.gheba */ public class ZigZag extends Overlay { private static final long serialVersionUID = SerialVersion.APPVERSION; public static final String ZZ = "zz"; private OverlayProperties properties; public ZigZag() { super(); properties = new OverlayProperties(); } public String getName() { return "ZigZag"; } public String getLabel() { return properties.getLabel(); } public Overlay newInstance() { return new ZigZag(); } public LinkedHashMap getHTML(ChartFrame cf, int i) { LinkedHashMap ht = new LinkedHashMap(); DecimalFormat df = new DecimalFormat("#,##0.00"); double[] values = getValues(cf, i); ht.put(getLabel(), " "); if (values.length > 0) { Color[] colors = getColors(); for (int j = 0; j < values.length; j++) { ht.put(getFontHTML(colors[j], "ZigZag:"), getFontHTML(colors[j], df.format(values[j]))); } } return ht; } public void paint(Graphics2D g, ChartFrame cf, Rectangle bounds) { Dataset d = visibleDataset(cf, ZZ); if (d != null) { Range range = cf.getSplitPanel().getChartPanel().getRange(); DefaultPainter.line(g, cf, range, bounds, d, properties.getColor(), properties.getStroke()); } } public void calculate() { Dataset initial = getDataset(); if (initial != null && !initial.isEmpty()) { Dataset d = getDataset(initial); addDataset(ZZ, d); } } public Color[] getColors() { return new Color[] {properties.getColor()}; } public double[] getValues(ChartFrame cf) { Dataset d = visibleDataset(cf, ZZ); if (d != null) { return new double[] {d.getLastClose()}; } return new double[] {}; } public double[] getValues(ChartFrame cf, int i) { Dataset d = visibleDataset(cf, ZZ); if (d != null) { return new double[] {d.getCloseAt(i)}; } return new double[] {}; } public boolean getMarkerVisibility() { return properties.getMarker(); } public AbstractNode getNode() { return new OverlayNode(properties); } private Dataset getDataset(final Dataset initial) { int count = initial.getItemsCount(); Dataset result = Dataset.EMPTY(count); boolean switchVar = false; for (int i = 2; i <= count; i++) { if (i < count) { if (switchVar == false) { if (initial.getHighAt(i-1) > initial.getHighAt(i-2) && initial.getHighAt(i-1) > initial.getHighAt(i)) { result.setDataItem(i-1, new DataItem(initial.getTimeAt(i-1), initial.getHighAt(i-1))); switchVar = true; continue; } } if (switchVar == true) { if (initial.getLowAt(i-1) < initial.getLowAt(i-2) && initial.getLowAt(i-1) < initial.getLowAt(i)) { result.setDataItem(i-1, new DataItem(initial.getTimeAt(i-1), initial.getLowAt(i-1))); switchVar = false; continue; } } } } return result; } public String getPrice() { return Dataset.CLOSE; } }