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.3 2007/10/15 10:03:35 taqua Exp $ 035 * 036 * Changes 037 * ------- 038 * 039 * 040 */ 041 package org.jfree.ui; 042 043 import java.awt.Dimension; 044 import java.awt.Graphics; 045 import java.awt.Graphics2D; 046 import java.awt.geom.Rectangle2D; 047 import javax.swing.JPanel; 048 049 /** 050 * A component, that accepts a drawable and which draws that drawable. 051 * 052 * @author Thomas Morgner 053 */ 054 public class DrawablePanel extends JPanel 055 { 056 private Drawable drawable; 057 058 public DrawablePanel() 059 { 060 setOpaque(false); 061 } 062 063 public Drawable getDrawable() 064 { 065 return drawable; 066 } 067 068 public void setDrawable(final Drawable drawable) 069 { 070 this.drawable = drawable; 071 revalidate(); 072 repaint(); 073 } 074 075 /** 076 * If the <code>preferredSize</code> has been set to a non-<code>null</code> 077 * value just returns it. If the UI delegate's <code>getPreferredSize</code> 078 * method returns a non <code>null</code> value then return that; otherwise 079 * defer to the component's layout manager. 080 * 081 * @return the value of the <code>preferredSize</code> property 082 * @see #setPreferredSize 083 * @see javax.swing.plaf.ComponentUI 084 */ 085 public Dimension getPreferredSize() 086 { 087 if (drawable instanceof ExtendedDrawable) 088 { 089 final ExtendedDrawable ed = (ExtendedDrawable) drawable; 090 return ed.getPreferredSize(); 091 } 092 return super.getPreferredSize(); 093 } 094 095 /** 096 * If the minimum size has been set to a non-<code>null</code> value just 097 * returns it. If the UI delegate's <code>getMinimumSize</code> method 098 * returns a non-<code>null</code> value then return that; otherwise defer to 099 * the component's layout manager. 100 * 101 * @return the value of the <code>minimumSize</code> property 102 * @see #setMinimumSize 103 * @see javax.swing.plaf.ComponentUI 104 */ 105 public Dimension getMinimumSize() 106 { 107 if (drawable instanceof ExtendedDrawable) 108 { 109 final ExtendedDrawable ed = (ExtendedDrawable) drawable; 110 return ed.getPreferredSize(); 111 } 112 return super.getMinimumSize(); 113 } 114 115 /** 116 * Returns true if this component is completely opaque. 117 * <p/> 118 * An opaque component paints every pixel within its rectangular bounds. A 119 * non-opaque component paints only a subset of its pixels or none at all, 120 * allowing the pixels underneath it to "show through". Therefore, a 121 * component that does not fully paint its pixels provides a degree of 122 * transparency. 123 * <p/> 124 * Subclasses that guarantee to always completely paint their contents should 125 * override this method and return true. 126 * 127 * @return true if this component is completely opaque 128 * @see #setOpaque 129 */ 130 public boolean isOpaque() 131 { 132 if (drawable == null) 133 { 134 return false; 135 } 136 return super.isOpaque(); 137 } 138 139 /** 140 * Calls the UI delegate's paint method, if the UI delegate is 141 * non-<code>null</code>. We pass the delegate a copy of the 142 * <code>Graphics</code> object to protect the rest of the paint code from 143 * irrevocable changes (for example, <code>Graphics.translate</code>). 144 * <p/> 145 * If you override this in a subclass you should not make permanent changes to 146 * the passed in <code>Graphics</code>. For example, you should not alter the 147 * clip <code>Rectangle</code> or modify the transform. If you need to do 148 * these operations you may find it easier to create a new 149 * <code>Graphics</code> from the passed in <code>Graphics</code> and 150 * manipulate it. Further, if you do not invoker super's implementation you 151 * must honor the opaque property, that is if this component is opaque, you 152 * must completely fill in the background in a non-opaque color. If you do not 153 * honor the opaque property you will likely see visual artifacts. 154 * <p/> 155 * The passed in <code>Graphics</code> object might have a transform other 156 * than the identify transform installed on it. In this case, you might get 157 * unexpected results if you cumulatively apply another transform. 158 * 159 * @param g the <code>Graphics</code> object to protect 160 * @see #paint 161 * @see javax.swing.plaf.ComponentUI 162 */ 163 protected void paintComponent(Graphics g) 164 { 165 super.paintComponent(g); 166 if (drawable == null) 167 { 168 return; 169 } 170 171 final Graphics2D g2 = (Graphics2D) g.create 172 (0, 0, getWidth(), getHeight()); 173 174 drawable.draw(g2, new Rectangle2D.Double(0, 0, getWidth(), getHeight())); 175 g2.dispose(); 176 } 177 178 }