/**************************************************************************************** * 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 x-axis * */ public class XGrid 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; /** * Constructor for an X-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 XGrid(PlotSheet plotSheet, double ticStart, double tic) { super(); this.plotSheet = plotSheet; this.ticStart = ticStart; this.tic = tic; } /** * Constructor for an X-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 XGrid(ColorWrap color, PlotSheet plotSheet, double ticStart, double tic) { super(); this.color = color; this.plotSheet = plotSheet; this.ticStart = ticStart; this.tic = tic; } /** * Constructor for an X-Grid object * @param plotSheet the sheet the grid will be drawn onto * @param ticStart start point for relative positioning of grid */ public XGrid(PlotSheet plotSheet, double ticStart, int pixelDistance) { super(); this.plotSheet = plotSheet; this.ticStart = ticStart; this.pixelDistance = pixelDistance; isAutoTic = true; } /** * Constructor for an X-Grid object * @param plotSheet the sheet the grid will be drawn onto * @param ticStart start point for relative positioning of grid */ public XGrid(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) { 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])); } ColorWrap oldColor = g.getColor(); RectangleWrap field = g.getClipBounds(); g.setColor(color); if(this.isAutoTic) this.tic = plotSheet.ticsCalcY(pixelDistance, field); int tics = (int)((this.ticStart - (0-this.yLength))/tic); double downStart = this.ticStart - this.tic*tics; if(downStart < 0 ) { if(!this.gridOnDownside) { while(downStart<0) { downStart+=this.tic; } } } double currentY = downStart; while(currentY <= this.yLength && !(currentY > 0 && !this.gridOnUpside)) { drawGridLine(currentY, g, field); currentY+=this.tic; //System.err.println("another loop"); } //System.err.println("out of loop"); g.setColor(oldColor); } /** * Draw a grid line in specified graphics object * @param y 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 y, GraphicsWrap g, RectangleWrap field) { if(this.gridkOnLeft) { g.drawLine(plotSheet.xToGraphic(0, field), plotSheet.yToGraphic(y, field), plotSheet.xToGraphic(-this.xLength, field), plotSheet.yToGraphic(y, field)); } if(this.gridOnRight) { g.drawLine(plotSheet.xToGraphic(0, field), plotSheet.yToGraphic(y, field), plotSheet.xToGraphic(this.xLength, field), plotSheet.yToGraphic(y, field)); } } /** * set if the grid should be drawn onto the left side * @param gridkOnLeft */ public void setGridkOnLeft(boolean gridkOnLeft) { this.gridkOnLeft = gridkOnLeft; } /** * set if the grid should be drawn onto the right side */ public void setGridOnRight(boolean gridOnRight) { this.gridOnRight = gridOnRight; } /** * set if the grid should be drawn onto the downside side */ public void setGridOnDownside(boolean gridOnDownside) { this.gridOnDownside = gridOnDownside; } /** * set if the grid should be drawn onto the upside */ public void setGridOnUpside(boolean gridOnUpside) { this.gridOnUpside = gridOnUpside; } /* * (non-Javadoc) * @see rendering.Drawable#isOnFrame() */ 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; } }