001/** 002 * ======================================== 003 * JCommon : a free Java report library 004 * ======================================== 005 * 006 * Project Info: http://www.jfree.org/jcommon/ 007 * Project Lead: Thomas Morgner; 008 * 009 * (C) Copyright 2000-2006, by Object Refinery Limited and Contributors. 010 * 011 * This library is free software; you can redistribute it and/or modify it under the terms 012 * of the GNU Lesser General Public License as published by the Free Software Foundation; 013 * either version 2.1 of the License, or (at your option) any later version. 014 * 015 * This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; 016 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 017 * See the GNU Lesser General Public License for more details. 018 * 019 * You should have received a copy of the GNU Lesser General Public License along with this 020 * library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, 021 * Boston, MA 02111-1307, USA. 022 * 023 * [Java is a trademark or registered trademark of Sun Microsystems, Inc. 024 * in the United States and other countries.] 025 * 026 * ------------ 027 * DrawablePanel.java 028 * ------------ 029 * (C) Copyright 2002-2006, by Object Refinery Limited. 030 * 031 * Original Author: Thomas Morgner; 032 * Contributor(s): -; 033 * 034 * $Id: DrawablePanel.java,v 1.4 2008/09/10 09:25:09 mungady Exp $ 035 * 036 * Changes 037 * ------- 038 * 039 * 040 */ 041package org.jfree.ui; 042 043import java.awt.Dimension; 044import java.awt.Graphics; 045import java.awt.Graphics2D; 046import java.awt.geom.Rectangle2D; 047import javax.swing.JPanel; 048 049/** 050 * A component, that accepts a drawable and which draws that drawable. 051 * 052 * @author Thomas Morgner 053 */ 054public class DrawablePanel extends JPanel 055{ 056 private Drawable drawable; 057 058 /** 059 * Creates a new instance. 060 */ 061 public DrawablePanel() 062 { 063 setOpaque(false); 064 } 065 066 /** 067 * Returns the drawable item. 068 * 069 * @return The drawable item. 070 */ 071 public Drawable getDrawable() 072 { 073 return this.drawable; 074 } 075 076 /** 077 * Sets the drawable item. 078 * 079 * @param drawable the drawable item. 080 */ 081 public void setDrawable(final Drawable drawable) 082 { 083 this.drawable = drawable; 084 revalidate(); 085 repaint(); 086 } 087 088 /** 089 * If the <code>preferredSize</code> has been set to a non-<code>null</code> 090 * value just returns it. If the UI delegate's <code>getPreferredSize</code> 091 * method returns a non <code>null</code> value then return that; otherwise 092 * defer to the component's layout manager. 093 * 094 * @return the value of the <code>preferredSize</code> property 095 * @see #setPreferredSize 096 * @see javax.swing.plaf.ComponentUI 097 */ 098 public Dimension getPreferredSize() 099 { 100 if (this.drawable instanceof ExtendedDrawable) 101 { 102 final ExtendedDrawable ed = (ExtendedDrawable) this.drawable; 103 return ed.getPreferredSize(); 104 } 105 return super.getPreferredSize(); 106 } 107 108 /** 109 * If the minimum size has been set to a non-<code>null</code> value just 110 * returns it. If the UI delegate's <code>getMinimumSize</code> method 111 * returns a non-<code>null</code> value then return that; otherwise defer to 112 * the component's layout manager. 113 * 114 * @return the value of the <code>minimumSize</code> property 115 * @see #setMinimumSize 116 * @see javax.swing.plaf.ComponentUI 117 */ 118 public Dimension getMinimumSize() 119 { 120 if (this.drawable instanceof ExtendedDrawable) 121 { 122 final ExtendedDrawable ed = (ExtendedDrawable) this.drawable; 123 return ed.getPreferredSize(); 124 } 125 return super.getMinimumSize(); 126 } 127 128 /** 129 * Returns true if this component is completely opaque. 130 * <p/> 131 * An opaque component paints every pixel within its rectangular bounds. A 132 * non-opaque component paints only a subset of its pixels or none at all, 133 * allowing the pixels underneath it to "show through". Therefore, a 134 * component that does not fully paint its pixels provides a degree of 135 * transparency. 136 * <p/> 137 * Subclasses that guarantee to always completely paint their contents should 138 * override this method and return true. 139 * 140 * @return true if this component is completely opaque 141 * @see #setOpaque 142 */ 143 public boolean isOpaque() 144 { 145 if (this.drawable == null) 146 { 147 return false; 148 } 149 return super.isOpaque(); 150 } 151 152 /** 153 * Calls the UI delegate's paint method, if the UI delegate is 154 * non-<code>null</code>. We pass the delegate a copy of the 155 * <code>Graphics</code> object to protect the rest of the paint code from 156 * irrevocable changes (for example, <code>Graphics.translate</code>). 157 * <p/> 158 * If you override this in a subclass you should not make permanent changes to 159 * the passed in <code>Graphics</code>. For example, you should not alter the 160 * clip <code>Rectangle</code> or modify the transform. If you need to do 161 * these operations you may find it easier to create a new 162 * <code>Graphics</code> from the passed in <code>Graphics</code> and 163 * manipulate it. Further, if you do not invoker super's implementation you 164 * must honor the opaque property, that is if this component is opaque, you 165 * must completely fill in the background in a non-opaque color. If you do not 166 * honor the opaque property you will likely see visual artifacts. 167 * <p/> 168 * The passed in <code>Graphics</code> object might have a transform other 169 * than the identify transform installed on it. In this case, you might get 170 * unexpected results if you cumulatively apply another transform. 171 * 172 * @param g the <code>Graphics</code> object to protect 173 * @see #paint 174 * @see javax.swing.plaf.ComponentUI 175 */ 176 protected void paintComponent(Graphics g) 177 { 178 super.paintComponent(g); 179 if (this.drawable == null) 180 { 181 return; 182 } 183 184 final Graphics2D g2 = (Graphics2D) g.create 185 (0, 0, getWidth(), getHeight()); 186 187 this.drawable.draw(g2, new Rectangle2D.Double(0, 0, getWidth(), getHeight())); 188 g2.dispose(); 189 } 190 191}