/**************************************************************************************** * Copyright (c) 2014 Michael Goldbach <michael@wildplot.com> * * * * This program is free software; you can redistribute it and/or modify it under * * the terms of the GNU General Public License as published by the Free Software * * Foundation; either version 3 of the License, or (at your option) any later * * version. * * * * This program 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. See the GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along with * * this program. If not, see <http://www.gnu.org/licenses/>. * ****************************************************************************************/ package com.wildplot.android.rendering; import com.wildplot.android.rendering.graphics.wrapper.ColorWrap; import com.wildplot.android.rendering.graphics.wrapper.GraphicsWrap; import com.wildplot.android.rendering.graphics.wrapper.RectangleWrap; import com.wildplot.android.rendering.interfaces.Drawable; /** * This class represents grid lines parallel to the y-axis * */ public class YGrid implements Drawable { public boolean hasVariableLimits = true; private boolean isAutoTic = false; private int pixelDistance = 25; /** * the color of the grid lines */ private ColorWrap color = ColorWrap.LIGHT_GRAY; /** * the Sheet the grid lines will be drawn onto */ private PlotSheet plotSheet; /** * start point for relative positioning of grid */ private double ticStart = 0; /** * the space between two grid lines */ private double tic = 1; /** * maximal distance from x axis the grid will be drawn */ private double xLength = 10; /** * maximal distance from y axis the grid will be drawn */ private double yLength = 2; /** * true if the grid should be drawn into the direction left to the axis */ private boolean gridkOnLeft = true; /** * true if the grid should be drawn into the direction right to the axis */ private boolean gridOnRight = true; /** * true if the grid should be drawn under the x-axis */ private boolean gridOnDownside = true; /** * true if the grid should be drawn above the x-axis */ private boolean gridOnUpside = true; private double[] mTickPositions; /** * Constructor for an Y-Grid object * @param plotSheet the sheet the grid will be drawn onto * @param ticStart start point for relative positioning of grid * @param tic the space between two grid lines */ public YGrid(PlotSheet plotSheet, double ticStart, double tic) { super(); this.plotSheet = plotSheet; this.ticStart = ticStart; this.tic = tic; } /** * Constructor for an Y-Grid object * @param color set color of the grid * @param plotSheet the sheet the grid will be drawn onto * @param ticStart start point for relative positioning of grid * @param tic the space between two grid lines */ public YGrid(ColorWrap color, PlotSheet plotSheet, double ticStart, double tic) { super(); this.color = color; this.plotSheet = plotSheet; this.ticStart = ticStart; this.tic = tic; } /** * Constructor for an Y-Grid object * @param plotSheet the sheet the grid will be drawn onto * @param ticStart start point for relative positioning of grid */ public YGrid(PlotSheet plotSheet, double ticStart, int pixelDistance) { super(); this.plotSheet = plotSheet; this.ticStart = ticStart; this.pixelDistance = pixelDistance; isAutoTic = true; } /** * Constructor for an Y-Grid object * @param color set color of the grid * @param plotSheet the sheet the grid will be drawn onto * @param ticStart start point for relative positioning of grid */ public YGrid(ColorWrap color, PlotSheet plotSheet, double ticStart, int pixelDistance) { super(); this.color = color; this.plotSheet = plotSheet; this.ticStart = ticStart; this.pixelDistance = pixelDistance; isAutoTic = true; } /* (non-Javadoc) * @see rendering.Drawable#paint(java.awt.Graphics) */ @Override public void paint(GraphicsWrap g) { ColorWrap oldColor = g.getColor(); RectangleWrap field = g.getClipBounds(); g.setColor(color); if(this.hasVariableLimits) { this.xLength = Math.max(Math.abs(plotSheet.getxRange()[0]), Math.abs(plotSheet.getxRange()[1])); this.yLength = Math.max(Math.abs(plotSheet.getyRange()[0]), Math.abs(plotSheet.getyRange()[1])); } if(this.isAutoTic) this.tic = plotSheet.ticsCalcX(pixelDistance, field); int tics = (int)((this.ticStart - (0-this.xLength))/tic); double leftStart = this.ticStart - this.tic*tics; if(leftStart < 0 ) { if(!this.gridkOnLeft) { while(leftStart<0) { leftStart+=this.tic; } } } if(mTickPositions == null) drawImplicitLines(g, leftStart); else drawExplicitLines(g); //System.err.println("out of loop"); g.setColor(oldColor); } private void drawImplicitLines(GraphicsWrap g, double leftStart){ RectangleWrap field = g.getClipBounds(); double currentX = leftStart; while(currentX <= this.xLength && !(currentX > 0 && !this.gridOnRight)) { drawGridLine(currentX, g, field); currentX+=this.tic; //System.err.println("another loop"); } } private void drawExplicitLines(GraphicsWrap g){ RectangleWrap field = g.getClipBounds(); for (double currentX : mTickPositions) { drawGridLine(currentX, g, field); } } /** * Draw a grid line in specified graphics object * @param x x-position the vertical line shall be drawn * @param g graphic the line shall be drawn onto * @param field definition of the graphic boundaries */ private void drawGridLine(double x, GraphicsWrap g, RectangleWrap field) { if(this.gridOnUpside) { g.drawLine(plotSheet.xToGraphic(x, field), plotSheet.yToGraphic(0, field), plotSheet.xToGraphic(x, field), plotSheet.yToGraphic(yLength, field)); } if(this.gridOnDownside) { g.drawLine(plotSheet.xToGraphic(x, field), plotSheet.yToGraphic(0, field), plotSheet.xToGraphic(x, field), plotSheet.yToGraphic(-yLength, field)); } } /** * true if the grid should be drawn into the direction left to the axis */ public void setGridkOnLeft(boolean gridkOnLeft) { this.gridkOnLeft = gridkOnLeft; } /** * true if the grid should be drawn into the direction right to the axis */ public void setGridOnRight(boolean gridOnRight) { this.gridOnRight = gridOnRight; } /** * true if the grid should be drawn under the x-axis */ public void setGridOnDownside(boolean gridOnDownside) { this.gridOnDownside = gridOnDownside; } /** * true if the grid should be drawn above the x-axis */ public void setGridOnUpside(boolean gridOnUpside) { this.gridOnUpside = gridOnUpside; } public boolean isOnFrame() { return false; } @Override public void abortAndReset() { // TODO Auto-generated method stub } @Override public boolean isClusterable() { return true; } @Override public boolean isCritical() { return true; } public void setColor(ColorWrap color) { this.color = color; } public void setExplicitTicks(double[] tickPositions){ mTickPositions = tickPositions; } public void unsetExplicitTics(){ mTickPositions = null; } }