/* * $Id: CapsulePainter.java 3471 2009-08-27 13:10:39Z kleopatra $ * * Copyright 2006 Sun Microsystems, Inc., 4150 Network Circle, * Santa Clara, California 95054, U.S.A. All rights reserved. * * 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 */ package org.hdesktop.swingx.painter; import java.awt.Graphics2D; import java.awt.Shape; import java.awt.geom.RoundRectangle2D; /** * Draws a capsule. This is a rectangle capped by two semi circles. You can draw only a * portion of a capsule using the portion property. * @author joshy */ public class CapsulePainter extends AbstractAreaPainter<Object> { public enum Portion { Top, Full, Bottom, Left, Right } private Portion portion; /** * Create a new CapsulePainter that draws a full capsule. */ public CapsulePainter() { this.setPortion(Portion.Full); } /** * Create a new CapsulePainter that only draws the portion specified. * @param portion the portion to draw */ public CapsulePainter(Portion portion) { this.setPortion(portion); } /** * Returns the current portion property. This property determines * which part of the capsule will be drawn. * @return the current portion */ public Portion getPortion() { return portion; } /** * Sets the current portion property. This property determines * which part of the capsule will be drawn. * @param portion the new portion */ public void setPortion(Portion portion) { Portion old = this.portion; this.portion = portion; setDirty(true); firePropertyChange("portion",old,getPortion()); } /** * {@inheritDoc} */ @Override protected void doPaint(Graphics2D g, Object component, int width, int height) { Shape rect = provideShape(g,component,width,height); if(getStyle() == Style.BOTH || getStyle() == Style.FILLED) { g.setPaint(getFillPaint()); g.fill(rect); } if(getStyle() == Style.BOTH || getStyle() == Style.OUTLINE) { g.setPaint(getBorderPaint()); g.draw(rect); } } /** * {@inheritDoc} */ @Override protected Shape provideShape(Graphics2D g, Object comp, int width, int height) { int round = 10; int rheight = height; int ry = 0; if(getPortion() == Portion.Top) { round = height*2; rheight = height*2; } if(getPortion() == Portion.Bottom) { round = height*2; rheight = height*2; ry = -height; } // need to support left and right! return new RoundRectangle2D.Double(0, ry, width, rheight, round, round); } }