package org.chartsy.main.axis; import java.awt.FontMetrics; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Rectangle; import java.io.Serializable; import javax.swing.JPanel; import org.chartsy.main.ChartFrame; import org.chartsy.main.ChartProperties; import org.chartsy.main.IndicatorPanel; import org.chartsy.main.data.ChartData; import org.chartsy.main.utils.CoordCalc; import org.chartsy.main.utils.GraphicsUtils; import org.chartsy.main.utils.Range; import org.chartsy.main.utils.SerialVersion; /** * * @author viorel.gheba */ public class Grid extends JPanel implements Serializable { private static final long serialVersionUID = SerialVersion.APPVERSION; private ChartFrame chartFrame; public Grid(ChartFrame frame) { chartFrame = frame; setOpaque(false); setDoubleBuffered(true); } @Override public void paint(Graphics g) { Graphics2D g2 = GraphicsUtils.prepareGraphics(g); ChartData cd = chartFrame.getChartData(); ChartProperties cp = chartFrame.getChartProperties(); boolean isLog = cp.getAxisLogarithmicFlag(); if (!cd.isVisibleNull() && !cd.getVisible().isEmpty()) { Rectangle chartBounds = chartFrame.getSplitPanel().getChartPanel().getBounds(); chartBounds.grow(-2, -2); Range chartRange = chartFrame.getSplitPanel().getChartPanel().getRange(); double x, y; // Vertical Grid if (cp.getGridVerticalVisibility()) { g2.setColor(cp.getGridVerticalColor()); g2.setStroke(cp.getGridVerticalStroke()); double[] list = cd.getDateValues(); boolean firstFlag = true; for (int i = 0; i < list.length; i++) { double value = list[i]; if (value != -1) { x = cd.getX(value, chartBounds); if (firstFlag) { int index = (int) value; long time = cd.getVisible().getTimeAt(index); if (cd.isFirstWorkingDayOfMonth(time)) g2.draw(CoordCalc.line(x, 0, x, getHeight())); firstFlag = false; } else { g2.draw(CoordCalc.line(x, 0, x, getHeight())); } } } } // Horizontal Grid if (cp.getGridHorizontalVisibility()) { // paint grid for chart g2.setColor(cp.getGridHorizontalColor()); g2.setStroke(cp.getGridHorizontalStroke()); FontMetrics fm = getFontMetrics(chartFrame.getChartProperties().getFont()); double[] list = cd.getYValues(chartBounds, chartRange, fm.getHeight()); for (int i = 0; i < list.length; i++) { double value = list[i]; y = cd.getY(value, chartBounds, chartRange, isLog); if (chartBounds.contains(2, y)) { g2.draw(CoordCalc.line(0, y, getWidth(), y)); } } chartBounds.grow(2, 2); double hy = chartBounds.getHeight(); // Indicators Horizontal Grid if (chartFrame.getSplitPanel().getIndicatorsPanel().getIndicatorsCount() > 0) { int ind = 0; for (IndicatorPanel panel : chartFrame.getSplitPanel().getIndicatorsPanel().getIndicatorPanels()) { g2.translate(0, hy); g2.setColor(cp.getGridHorizontalColor()); g2.setStroke(cp.getGridHorizontalStroke()); if (panel.isMaximized()) { Rectangle indicatorBounds = panel.getBounds(); indicatorBounds.grow(-2, -2); Range indicatorRange = panel.getIndicator().getRange(chartFrame); if (panel.getIndicator().paintValues()) { Double[] values = panel.getIndicator().getPriceValues(chartFrame); for (Double d : values) { y = cd.getY(d, indicatorBounds, indicatorRange, false); if (indicatorBounds.contains(2, y)) { g2.draw(CoordCalc.line(0, y, getWidth(), y)); } } values = null; if (panel.getIndicator().hasZeroLine()) { if (panel.getIndicator().getZeroLineVisibility()) { y = cd.getY(0, indicatorBounds, indicatorRange, false); g2.setColor(panel.getIndicator().getZeroLineColor()); g2.setStroke(panel.getIndicator().getZeroLineStroke()); g2.draw(CoordCalc.line(0, y, getWidth(), y)); } } if (panel.getIndicator().hasDelimiters()) { if (panel.getIndicator().getDelimitersVisibility()) { for (double d : panel.getIndicator().getDelimitersValues()) { y = cd.getY(d, indicatorBounds, indicatorRange, false); g2.setColor(panel.getIndicator().getDelimitersColor()); g2.setStroke(panel.getIndicator().getDelimitersStroke()); g2.draw(CoordCalc.line(0, y, getWidth(), y)); } } } } indicatorBounds.grow(2, 2); hy = indicatorBounds.getHeight(); } else { hy = panel.getPanelHeight(); } ind++; } } } } } @Override public void update(Graphics g) { paint(g); } }