001/* CellRendererPane.java -- 002 Copyright (C) 2002, 2004, 2006, Free Software Foundation, Inc. 003 004This file is part of GNU Classpath. 005 006GNU Classpath is free software; you can redistribute it and/or modify 007it under the terms of the GNU General Public License as published by 008the Free Software Foundation; either version 2, or (at your option) 009any later version. 010 011GNU Classpath is distributed in the hope that it will be useful, but 012WITHOUT ANY WARRANTY; without even the implied warranty of 013MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 014General Public License for more details. 015 016You should have received a copy of the GNU General Public License 017along with GNU Classpath; see the file COPYING. If not, write to the 018Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 01902110-1301 USA. 020 021Linking this library statically or dynamically with other modules is 022making a combined work based on this library. Thus, the terms and 023conditions of the GNU General Public License cover the whole 024combination. 025 026As a special exception, the copyright holders of this library give you 027permission to link this library with independent modules to produce an 028executable, regardless of the license terms of these independent 029modules, and to copy and distribute the resulting executable under 030terms of your choice, provided that you also meet, for each linked 031independent module, the terms and conditions of the license of that 032module. An independent module is a module which is not derived from 033or based on this library. If you modify this library, you may extend 034this exception to your version of the library, but you are not 035obligated to do so. If you do not wish to do so, delete this 036exception statement from your version. */ 037 038 039package javax.swing; 040 041import java.awt.Component; 042import java.awt.Container; 043import java.awt.Graphics; 044import java.awt.Rectangle; 045 046import javax.accessibility.Accessible; 047import javax.accessibility.AccessibleContext; 048import 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 */ 057public 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}