Source for org.jfree.ui.StrokeSample

   1: /* ========================================================================
   2:  * JCommon : a free general purpose class library for the Java(tm) platform
   3:  * ========================================================================
   4:  *
   5:  * (C) Copyright 2000-2005, by Object Refinery Limited and Contributors.
   6:  * 
   7:  * Project Info:  http://www.jfree.org/jcommon/index.html
   8:  *
   9:  * This library is free software; you can redistribute it and/or modify it 
  10:  * under the terms of the GNU Lesser General Public License as published by 
  11:  * the Free Software Foundation; either version 2.1 of the License, or 
  12:  * (at your option) any later version.
  13:  *
  14:  * This library is distributed in the hope that it will be useful, but 
  15:  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 
  16:  * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public 
  17:  * License for more details.
  18:  *
  19:  * You should have received a copy of the GNU Lesser General Public
  20:  * License along with this library; if not, write to the Free Software
  21:  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, 
  22:  * USA.  
  23:  *
  24:  * [Java is a trademark or registered trademark of Sun Microsystems, Inc. 
  25:  * in the United States and other countries.]
  26:  * 
  27:  * -----------------
  28:  * StrokeSample.java
  29:  * -----------------
  30:  * (C) Copyright 2000-2004, by Object Refinery Limited.
  31:  *
  32:  * Original Author:  David Gilbert (for Object Refinery Limited);
  33:  * Contributor(s):   -;
  34:  *
  35:  * $Id: StrokeSample.java,v 1.3 2005/10/18 13:18:34 mungady Exp $
  36:  *
  37:  * Changes (from 26-Oct-2001)
  38:  * --------------------------
  39:  * 26-Oct-2001 : Changed package to com.jrefinery.ui.*;
  40:  * 14-Oct-2002 : Fixed errors reported by Checkstyle (DG);
  41:  * 21-Mar-2003 : Fixed null pointer exception, bug 705126 (DG);
  42:  *
  43:  */
  44: 
  45: package org.jfree.ui;
  46: 
  47: import java.awt.BasicStroke;
  48: import java.awt.Component;
  49: import java.awt.Dimension;
  50: import java.awt.Graphics;
  51: import java.awt.Graphics2D;
  52: import java.awt.Insets;
  53: import java.awt.RenderingHints;
  54: import java.awt.Stroke;
  55: import java.awt.geom.Ellipse2D;
  56: import java.awt.geom.Line2D;
  57: import java.awt.geom.Point2D;
  58: 
  59: import javax.swing.JComponent;
  60: import javax.swing.JList;
  61: import javax.swing.ListCellRenderer;
  62: 
  63: /**
  64:  * A panel that displays a stroke sample.
  65:  *
  66:  * @author David Gilbert
  67:  */
  68: public class StrokeSample extends JComponent implements ListCellRenderer {
  69: 
  70:     /** The stroke being displayed. */
  71:     private Stroke stroke;
  72: 
  73:     /** The preferred size of the component. */
  74:     private Dimension preferredSize;
  75: 
  76:     /**
  77:      * Creates a StrokeSample for the specified stroke.
  78:      *
  79:      * @param stroke  the sample stroke.
  80:      */
  81:     public StrokeSample(final Stroke stroke) {
  82:         this.stroke = stroke;
  83:         this.preferredSize = new Dimension(80, 18);
  84:     }
  85: 
  86:     /**
  87:      * Returns the current Stroke object being displayed.
  88:      *
  89:      * @return the stroke.
  90:      */
  91:     public Stroke getStroke() {
  92:         return this.stroke;
  93:     }
  94: 
  95:     /**
  96:      * Sets the Stroke object being displayed.
  97:      *
  98:      * @param stroke  the stroke.
  99:      */
 100:     public void setStroke(final Stroke stroke) {
 101:         this.stroke = stroke;
 102:         repaint();
 103:     }
 104: 
 105:     /**
 106:      * Returns the preferred size of the component.
 107:      *
 108:      * @return the preferred size of the component.
 109:      */
 110:     public Dimension getPreferredSize() {
 111:         return this.preferredSize;
 112:     }
 113: 
 114:     /**
 115:      * Draws a line using the sample stroke.
 116:      *
 117:      * @param g  the graphics device.
 118:      */
 119:     public void paintComponent(final Graphics g) {
 120: 
 121:         final Graphics2D g2 = (Graphics2D) g;
 122:         g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
 123:         final Dimension size = getSize();
 124:         final Insets insets = getInsets();
 125:         final double xx = insets.left;
 126:         final double yy = insets.top;
 127:         final double ww = size.getWidth() - insets.left - insets.right;
 128:         final double hh = size.getHeight() - insets.top - insets.bottom;
 129: 
 130:         // calculate point one
 131:         final Point2D one =  new Point2D.Double(xx + 6, yy + hh / 2);
 132:         // calculate point two
 133:         final Point2D two =  new Point2D.Double(xx + ww - 6, yy + hh / 2);
 134:         // draw a circle at point one
 135:         final Ellipse2D circle1 = new Ellipse2D.Double(one.getX() - 5, one.getY() - 5, 10, 10);
 136:         final Ellipse2D circle2 = new Ellipse2D.Double(two.getX() - 6, two.getY() - 5, 10, 10);
 137: 
 138:         // draw a circle at point two
 139:         g2.draw(circle1);
 140:         g2.fill(circle1);
 141:         g2.draw(circle2);
 142:         g2.fill(circle2);
 143: 
 144:         // draw a line connecting the points
 145:         final Line2D line = new Line2D.Double(one, two);
 146:         if (this.stroke != null) {
 147:             g2.setStroke(this.stroke);
 148:         }
 149:         else {
 150:             g2.setStroke(new BasicStroke(0.0f));
 151:         }
 152:         g2.draw(line);
 153: 
 154:     }
 155: 
 156:     /**
 157:      * Returns a list cell renderer for the stroke, so the sample can be displayed in a list or
 158:      * combo.
 159:      *
 160:      * @param list  the list.
 161:      * @param value  the value.
 162:      * @param index  the index.
 163:      * @param isSelected  selected?
 164:      * @param cellHasFocus  focussed?
 165:      *
 166:      * @return the component for rendering.
 167:      */
 168:     public Component getListCellRendererComponent(final JList list, final Object value, final int index,
 169:                                                   final boolean isSelected, final boolean cellHasFocus) {
 170:         if (value instanceof StrokeSample) {
 171:             final StrokeSample in = (StrokeSample) value;
 172:             setStroke(in.getStroke());
 173:         }
 174:         return this;
 175:     }
 176: 
 177: }