/* * PointPainterDisc.java of project jchart2d, paints round points. * Copyright (c) 2006 - 2011 Achim Westermann, created on 03.09.2006 20:27:06. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA* * If you modify or optimize the code in a useful way please let me know. * Achim.Westermann@gmx.de * */ package info.monitorenter.gui.chart.pointpainters; import info.monitorenter.gui.chart.ITracePoint2D; import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Stroke; /** * Renders points in form of a disc with configurable diameter. * <p> * * @author <a href="mailto:Achim.Westermann@gmx.de">Achim Westermann</a> * * * @version $Revision: 1.22 $ */ public class PointPainterDisc extends APointPainter<PointPainterDisc> { /** Generated <code>serialVersionUID</code>. */ private static final long serialVersionUID = -6317473632026920774L; /** The diameter of the discs to paint. */ private int m_discSize; /** * Cached m_discSize divided by two to save division for each point to render. */ private int m_halfDiscSize; /** * Creates an instance with a default disc size of 4. * <p> */ public PointPainterDisc() { this.setDiscSize(4); } /** * Creates an instance with the given disc diameter. * * @param diameter * the disc size in pixel to use. */ public PointPainterDisc(final int diameter) { this.setDiscSize(diameter); } /** * @see info.monitorenter.gui.chart.pointpainters.APointPainter#equals(java.lang.Object) */ @Override public boolean equals(final Object obj) { if (this == obj) { return true; } if (!super.equals(obj)) { return false; } if (this.getClass() != obj.getClass()) { return false; } final PointPainterDisc other = (PointPainterDisc) obj; if (this.m_discSize != other.m_discSize) { return false; } if (this.m_halfDiscSize != other.m_halfDiscSize) { return false; } return true; } /** * Returns the diameter of the discs to paint in pixel. * <p> * * @return the diameter of the discs to paint in pixel. */ public int getDiscSize() { return this.m_discSize; } /** * @see info.monitorenter.gui.chart.pointpainters.APointPainter#hashCode() */ @Override public int hashCode() { final int prime = 31; int result = super.hashCode(); result = prime * result + this.m_discSize; result = prime * result + this.m_halfDiscSize; return result; } /** * @see info.monitorenter.gui.chart.IPointPainter#paintPoint(int, int, int, * int, java.awt.Graphics, info.monitorenter.gui.chart.ITracePoint2D) */ public void paintPoint(final int absoluteX, final int absoluteY, final int nextX, final int nextY, final Graphics g, final ITracePoint2D original) { final Stroke backupStroke = this.installStroke(g); Color backupColor = null; Color test = this.installColorFill(g); // filling is desired as fill color has been set (if not null): if (test != null) { backupColor = test; // get the width of the stroke: // int strokeWidth = 1; // int halfstrokeWidth = 1; // Stroke stroke = this.getStroke(); // if (stroke != null) { // if (stroke instanceof BasicStroke) { // BasicStroke basicStroke = (BasicStroke) stroke; // strokeWidth = (int) Math.ceil(basicStroke.getLineWidth()); // halfstrokeWidth = (int) Math.ceil(basicStroke.getLineWidth() / 2); // // System.out.println("Strokewidth: " + strokeWidth); // } // } // g.fillOval(absoluteX - this.m_halfDiscSize + halfstrokeWidth, absoluteY // - this.m_halfDiscSize // + halfstrokeWidth, this.m_discSize - strokeWidth, this.m_discSize - // strokeWidth); g.fillOval(absoluteX - this.m_halfDiscSize, absoluteY - this.m_halfDiscSize, this.m_discSize, this.m_discSize); } test = this.installColor(g); if (backupColor == null) { // Only take backup color if it was not already returned from installing // fill color: backupColor = test; } else { // if fill color was installed but no color was specified we have to // revert to backup color here: if (test == null) { g.setColor(backupColor); backupColor = null; } } g.drawOval(absoluteX - this.m_halfDiscSize, absoluteY - this.m_halfDiscSize, this.m_discSize, this.m_discSize); if (backupStroke != null) { // cast is legal as installation would have failed and have returned null // if not possible: ((Graphics2D) g).setStroke(backupStroke); } if (backupColor != null) { g.setColor(backupColor); } } /** * Sets the diameter of the discs to paint in pixel. * <p> * * @param discSize * the diameter of the discs to paint in pixel. */ public void setDiscSize(final int discSize) { this.m_discSize = discSize; this.m_halfDiscSize = this.m_discSize / 2; } }