001 /* CellRendererPane.java -- 002 Copyright (C) 2002, 2004, 2006, Free Software Foundation, Inc. 003 004 This file is part of GNU Classpath. 005 006 GNU Classpath is free software; you can redistribute it and/or modify 007 it under the terms of the GNU General Public License as published by 008 the Free Software Foundation; either version 2, or (at your option) 009 any later version. 010 011 GNU Classpath is distributed in the hope that it will be useful, but 012 WITHOUT ANY WARRANTY; without even the implied warranty of 013 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 014 General Public License for more details. 015 016 You should have received a copy of the GNU General Public License 017 along with GNU Classpath; see the file COPYING. If not, write to the 018 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 019 02110-1301 USA. 020 021 Linking this library statically or dynamically with other modules is 022 making a combined work based on this library. Thus, the terms and 023 conditions of the GNU General Public License cover the whole 024 combination. 025 026 As a special exception, the copyright holders of this library give you 027 permission to link this library with independent modules to produce an 028 executable, regardless of the license terms of these independent 029 modules, and to copy and distribute the resulting executable under 030 terms of your choice, provided that you also meet, for each linked 031 independent module, the terms and conditions of the license of that 032 module. An independent module is a module which is not derived from 033 or based on this library. If you modify this library, you may extend 034 this exception to your version of the library, but you are not 035 obligated to do so. If you do not wish to do so, delete this 036 exception statement from your version. */ 037 038 039 package javax.swing; 040 041 import java.awt.Component; 042 import java.awt.Container; 043 import java.awt.Graphics; 044 import java.awt.Rectangle; 045 046 import javax.accessibility.Accessible; 047 import javax.accessibility.AccessibleContext; 048 import javax.accessibility.AccessibleRole; 049 050 /** 051 * Paints the cells of JList, JTable and JTree. 052 * It intercepts the usual paint tree, so that we don't walk up and 053 * repaint everything. 054 * 055 * @author Andrew Selkirk 056 */ 057 public class CellRendererPane extends Container implements Accessible 058 { 059 private static final long serialVersionUID = -7642183829532984273L; 060 061 /** 062 * Provides accessibility support for CellRendererPanes. 063 */ 064 protected class AccessibleCellRendererPane extends AccessibleAWTContainer 065 { 066 private static final long serialVersionUID = -8981090083147391074L; 067 068 /** 069 * Constructor AccessibleCellRendererPane 070 */ 071 protected AccessibleCellRendererPane() 072 { 073 // Nothing to do here. 074 } 075 076 /** 077 * getAccessibleRole 078 * @return AccessibleRole 079 */ 080 public AccessibleRole getAccessibleRole() 081 { 082 return AccessibleRole.PANEL; 083 } 084 } 085 086 /** 087 * accessibleContext 088 */ 089 protected AccessibleContext accessibleContext = null; 090 091 /** 092 * Constructs a new CellRendererPane. 093 */ 094 public CellRendererPane() 095 { 096 setVisible(false); 097 } 098 099 /** 100 * Should not be called. 101 * 102 * @param graphics not used here 103 */ 104 public void update(Graphics graphics) 105 { 106 //Nothing to do here. 107 } 108 109 /** 110 * Despite normal behaviour this does <em>not</em> cause the container 111 * to be invalidated. This prevents propagating up the paint tree. 112 */ 113 public void invalidate() 114 { 115 // Overridden to do nothing. 116 } 117 118 /** 119 * Should not be called. 120 * 121 * @param graphics not used here 122 */ 123 public void paint(Graphics graphics) 124 { 125 // Overridden to do nothing. 126 } 127 128 /** 129 * Overridden to check if a component is already a child of this Container. 130 * If it's already a child, nothing is done. Otherwise we pass this to 131 * <code>super.addImpl()</code>. 132 * 133 * @param c the component to add 134 * @param constraints not used here 135 * @param index not used here 136 */ 137 protected void addImpl(Component c, Object constraints, int index) 138 { 139 if (!isAncestorOf(c)) 140 { 141 super.addImpl(c, constraints, index); 142 } 143 } 144 145 /** 146 * Paints the specified component <code>c</code> on the {@link Graphics} 147 * context <code>graphics</code>. The Graphics context is tranlated to 148 * (x,y) and the components bounds are set to (w,h). If 149 * <code>shouldValidate</code> 150 * is set to true, then the component is validated before painting. 151 * 152 * @param graphics the graphics context to paint on 153 * @param c the component to be painted 154 * @param p the parent of the component 155 * @param x the X coordinate of the upper left corner where c should 156 be painted 157 * @param y the Y coordinate of the upper left corner where c should 158 be painted 159 * @param w the width of the components drawing area 160 * @param h the height of the components drawing area 161 * @param shouldValidate if <code>c</code> should be validated before 162 * painting 163 */ 164 public void paintComponent(Graphics graphics, Component c, 165 Container p, int x, int y, int w, int h, 166 boolean shouldValidate) 167 { 168 // reparent c 169 addImpl(c, null, 0); 170 171 Rectangle oldClip = graphics.getClipBounds(); 172 boolean translated = false; 173 try 174 { 175 // translate to (x,y) 176 graphics.translate(x, y); 177 translated = true; 178 graphics.clipRect(0, 0, w, h); 179 // set bounds of c 180 c.setBounds(0, 0, w, h); 181 182 // validate if necessary 183 if (shouldValidate) 184 { 185 c.validate(); 186 } 187 188 // paint component 189 c.paint(graphics); 190 } 191 finally 192 { 193 // untranslate g 194 if (translated) 195 graphics.translate(-x, -y); 196 graphics.setClip(oldClip); 197 } 198 } 199 200 /** 201 * Paints the specified component <code>c</code> on the {@link Graphics} 202 * context <code>graphics</code>. The Graphics context is tranlated to (x,y) 203 * and the components bounds are set to (w,h). The component is <em>not</em> 204 * validated before painting. 205 * 206 * @param graphics the graphics context to paint on 207 * @param c the component to be painted 208 * @param p the parent of the component 209 * @param x the X coordinate of the upper left corner where c should 210 be painted 211 * @param y the Y coordinate of the upper left corner where c should 212 be painted 213 * @param w the width of the components drawing area 214 * @param h the height of the components drawing area 215 */ 216 public void paintComponent(Graphics graphics, Component c, 217 Container p, int x, int y, int w, int h) 218 { 219 paintComponent(graphics, c, p, x, y, w, h, false); 220 } 221 222 /** 223 * Paints the specified component <code>c</code> on the {@link Graphics} 224 * context <code>g</code>. The Graphics context is tranlated to (r.x,r.y) and 225 * the components bounds are set to (r.width,r.height). 226 * The component is <em>not</em> 227 * validated before painting. 228 * 229 * @param graphics the graphics context to paint on 230 * @param c the component to be painted 231 * @param p the component on which we paint 232 * @param r the bounding rectangle of c 233 */ 234 public void paintComponent(Graphics graphics, Component c, 235 Container p, Rectangle r) 236 { 237 paintComponent(graphics, c, p, r.x, r.y, r.width, r.height); 238 } 239 240 /** 241 * getAccessibleContext <em>TODO</em> 242 * @return AccessibleContext 243 */ 244 public AccessibleContext getAccessibleContext() 245 { 246 if (accessibleContext == null) 247 accessibleContext = new AccessibleCellRendererPane(); 248 249 return accessibleContext; 250 } 251 }