Frames | No Frames |
1: /* ComponentPeer.java -- Toplevel component peer 2: Copyright (C) 1999, 2000, 2002 Free Software Foundation, Inc. 3: 4: This file is part of GNU Classpath. 5: 6: GNU Classpath is free software; you can redistribute it and/or modify 7: it under the terms of the GNU General Public License as published by 8: the Free Software Foundation; either version 2, or (at your option) 9: any later version. 10: 11: GNU Classpath is distributed in the hope that it will be useful, but 12: WITHOUT ANY WARRANTY; without even the implied warranty of 13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14: General Public License for more details. 15: 16: You should have received a copy of the GNU General Public License 17: along with GNU Classpath; see the file COPYING. If not, write to the 18: Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 19: 02110-1301 USA. 20: 21: Linking this library statically or dynamically with other modules is 22: making a combined work based on this library. Thus, the terms and 23: conditions of the GNU General Public License cover the whole 24: combination. 25: 26: As a special exception, the copyright holders of this library give you 27: permission to link this library with independent modules to produce an 28: executable, regardless of the license terms of these independent 29: modules, and to copy and distribute the resulting executable under 30: terms of your choice, provided that you also meet, for each linked 31: independent module, the terms and conditions of the license of that 32: module. An independent module is a module which is not derived from 33: or based on this library. If you modify this library, you may extend 34: this exception to your version of the library, but you are not 35: obligated to do so. If you do not wish to do so, delete this 36: exception statement from your version. */ 37: 38: 39: package java.awt.peer; 40: 41: import java.awt.AWTEvent; 42: import java.awt.AWTException; 43: import java.awt.BufferCapabilities; 44: import java.awt.Color; 45: import java.awt.Component; 46: import java.awt.Cursor; 47: import java.awt.Dimension; 48: import java.awt.Font; 49: import java.awt.FontMetrics; 50: import java.awt.Graphics; 51: import java.awt.GraphicsConfiguration; 52: import java.awt.Image; 53: import java.awt.Point; 54: import java.awt.Rectangle; 55: import java.awt.Toolkit; 56: import java.awt.event.PaintEvent; 57: import java.awt.image.ColorModel; 58: import java.awt.image.ImageObserver; 59: import java.awt.image.ImageProducer; 60: import java.awt.image.VolatileImage; 61: 62: import sun.awt.CausedFocusEvent; 63: 64: /** 65: * Defines the methods that a component peer is required to implement. 66: */ 67: public interface ComponentPeer 68: { 69: /** 70: * Returns the construction status of the specified image. This is called 71: * by {@link Component#checkImage(Image, int, int, ImageObserver)}. 72: * 73: * @param img the image 74: * @param width the width of the image 75: * @param height the height of the image 76: * @param ob the image observer to be notified of updates of the status 77: * 78: * @return a bitwise ORed set of ImageObserver flags 79: */ 80: int checkImage(Image img, int width, int height, 81: ImageObserver ob); 82: 83: /** 84: * Creates an image by starting the specified image producer. This is called 85: * by {@link Component#createImage(ImageProducer)}. 86: * 87: * @param prod the image producer to be used to create the image 88: * 89: * @return the created image 90: */ 91: Image createImage(ImageProducer prod); 92: 93: /** 94: * Creates an empty image with the specified <code>width</code> and 95: * <code>height</code>. 96: * 97: * @param width the width of the image to be created 98: * @param height the height of the image to be created 99: * 100: * @return the created image 101: */ 102: Image createImage(int width, int height); 103: 104: /** 105: * Disables the component. This is called by {@link Component#disable()}. 106: */ 107: void disable(); 108: 109: /** 110: * Disposes the component peer. This should release all resources held by the 111: * peer. This is called when the component is no longer in use. 112: */ 113: void dispose(); 114: 115: /** 116: * Enables the component. This is called by {@link Component#enable()}. 117: */ 118: void enable(); 119: 120: /** 121: * Returns the color model of the component. This is currently not used. 122: * 123: * @return the color model of the component 124: */ 125: ColorModel getColorModel(); 126: 127: /** 128: * Returns the font metrics for the specified font. This is called by 129: * {@link Component#getFontMetrics(Font)}. 130: * 131: * @param f the font for which to query the font metrics 132: * 133: * @return the font metrics for the specified font 134: */ 135: FontMetrics getFontMetrics(Font f); 136: 137: /** 138: * Returns a {@link Graphics} object suitable for drawing on this component. 139: * This is called by {@link Component#getGraphics()}. 140: * 141: * @return a graphics object suitable for drawing on this component 142: */ 143: Graphics getGraphics(); 144: 145: /** 146: * Returns the location of this component in screen coordinates. This is 147: * called by {@link Component#getLocationOnScreen()}. 148: * 149: * @return the location of this component in screen coordinates 150: */ 151: Point getLocationOnScreen(); 152: 153: /** 154: * Returns the minimum size for the component. This is called by 155: * {@link Component#getMinimumSize()}. 156: * 157: * @return the minimum size for the component 158: * 159: * @specnote Presumably this method got added to replace minimumSize(). 160: * However, testing shows that this is never called in the RI 161: * (tested with JDK5), but instead minimumSize() is called 162: * directly. It is advisable to implement this method to delegate 163: * to minimumSize() and put the real implementation in there. 164: */ 165: Dimension getMinimumSize(); 166: 167: /** 168: * Returns the preferred size for the component. This is called by 169: * {@link Component#getPreferredSize()}. 170: * 171: * @return the preferred size for the component 172: * 173: * @specnote Presumably this method got added to replace preferredSize(). 174: * However, testing shows that this is never called in the RI 175: * (tested with JDK5), but instead preferredSize() is called 176: * directly. It is advisable to implement this method to delegate 177: * to preferredSize() and put the real implementation in there. 178: */ 179: Dimension getPreferredSize(); 180: 181: /** 182: * Returns the toolkit that created this peer. 183: * 184: * @return the toolkit that created this peer 185: */ 186: Toolkit getToolkit(); 187: 188: /** 189: * Handles the given event. This is called from 190: * {@link Component#dispatchEvent(AWTEvent)} to give the peer a chance to 191: * react to events for the component. 192: * 193: * @param e the event 194: */ 195: void handleEvent(AWTEvent e); 196: 197: /** 198: * Makes the component invisible. This is called from 199: * {@link Component#hide()}. 200: */ 201: void hide(); 202: 203: /** 204: * Returns <code>true</code> if the component can receive keyboard input 205: * focus. This is called from {@link Component#isFocusTraversable()}. 206: * 207: * @specnote Part of the earlier 1.1 API, replaced by isFocusable(). 208: */ 209: boolean isFocusTraversable(); 210: 211: /** 212: * Returns <code>true</code> if the component can receive keyboard input 213: * focus. This is called from {@link Component#isFocusable()}. 214: */ 215: boolean isFocusable(); 216: 217: /** 218: * Returns the minimum size for the component. This is called by 219: * {@link Component#minimumSize()}. 220: * 221: * @return the minimum size for the component 222: */ 223: Dimension minimumSize(); 224: 225: /** 226: * Returns the preferred size for the component. This is called by 227: * {@link Component#getPreferredSize()}. 228: * 229: * @return the preferred size for the component 230: */ 231: Dimension preferredSize(); 232: 233: void paint(Graphics graphics); 234: 235: /** 236: * Prepares an image for rendering on this component. This is called by 237: * {@link Component#prepareImage(Image, int, int, ImageObserver)}. 238: * 239: * @param img the image to prepare 240: * @param width the desired width of the rendered image 241: * @param height the desired height of the rendered image 242: * @param ob the image observer to be notified of updates in the preparation 243: * process 244: * 245: * @return <code>true</code> if the image has been fully prepared, 246: * <code>false</code> otherwise (in which case the image observer 247: * receives updates) 248: */ 249: boolean prepareImage(Image img, int width, int height, 250: ImageObserver ob); 251: 252: void print(Graphics graphics); 253: 254: /** 255: * Repaints the specified rectangle of this component. This is called from 256: * {@link Component#repaint(long, int, int, int, int)}. 257: * 258: * @param tm number of milliseconds to wait with repainting 259: * @param x the X coordinate of the upper left corner of the damaged rectangle 260: * @param y the Y coordinate of the upper left corner of the damaged rectangle 261: * @param width the width of the damaged rectangle 262: * @param height the height of the damaged rectangle 263: */ 264: void repaint(long tm, int x, int y, int width, int height); 265: 266: /** 267: * Requests that this component receives the focus. This is called from 268: * {@link Component#requestFocus()}. 269: * 270: * @specnote Part of the earlier 1.1 API, apparently replaced by argument 271: * form of the same method. 272: */ 273: void requestFocus(); 274: 275: /** 276: * Requests that this component receives the focus. This is called from 277: * {@link Component#requestFocus()}. 278: * 279: * This method is only called for heavyweight component's peers. Lightweight 280: * components ask their nearest heavyweight component to request focus. 281: * It's up to the heavyweight peer to decide if any of it's lightweight 282: * descendants are allowed to receive keyboard input focus or not. If the 283: * focus request is finally approved, then the peer must post a FOCUS_GAINED 284: * event for the requested component. 285: * 286: * @param request the component for which the focus is requested 287: * @param temporary indicates if the focus change is temporary (true) or 288: * permanent (false) 289: * @param allowWindowFocus indicates if it's allowed to change window focus 290: * @param time the timestamp 291: */ 292: boolean requestFocus(Component request, boolean temporary, 293: boolean allowWindowFocus, long time); 294: 295: /** 296: * Notifies the peer that the bounds of this component have changed. This 297: * is called by {@link Component#reshape(int, int, int, int)}. 298: * 299: * @param x the X coordinate of the upper left corner of the component 300: * @param y the Y coordinate of the upper left corner of the component 301: * @param width the width of the component 302: * @param height the height of the component 303: */ 304: void reshape(int x, int y, int width, int height); 305: 306: /** 307: * Sets the background color of the component. This is called by 308: * {@link Component#setBackground(Color)}. 309: * 310: * @param color the background color to set 311: */ 312: void setBackground(Color color); 313: 314: /** 315: * Notifies the peer that the bounds of this component have changed. This 316: * is called by {@link Component#setBounds(int, int, int, int)}. 317: * 318: * @param x the X coordinate of the upper left corner of the component 319: * @param y the Y coordinate of the upper left corner of the component 320: * @param width the width of the component 321: * @param height the height of the component 322: */ 323: void setBounds(int x, int y, int width, int height); 324: 325: /** 326: * Sets the cursor of the component. This is called by 327: * {@link Component#setCursor(Cursor)}. 328: * 329: * @specnote Part of the earlier 1.1 API, apparently no longer needed. 330: */ 331: void setCursor(Cursor cursor); 332: 333: /** 334: * Sets the enabled/disabled state of this component. This is called by 335: * {@link Component#setEnabled(boolean)}. 336: * 337: * @param enabled <code>true</code> to enable the component, 338: * <code>false</code> to disable it 339: */ 340: void setEnabled(boolean enabled); 341: 342: /** 343: * Sets the font of the component. This is called by 344: * {@link Component#setFont(Font)}. 345: * 346: * @param font the font to set 347: */ 348: void setFont(Font font); 349: 350: /** 351: * Sets the foreground color of the component. This is called by 352: * {@link Component#setForeground(Color)}. 353: * 354: * @param color the foreground color to set 355: */ 356: void setForeground(Color color); 357: 358: /** 359: * Sets the visibility state of the component. This is called by 360: * {@link Component#setVisible(boolean)}. 361: * 362: * @param visible <code>true</code> to make the component visible, 363: * <code>false</code> to make it invisible 364: */ 365: void setVisible(boolean visible); 366: 367: /** 368: * Makes the component visible. This is called by {@link Component#show()}. 369: */ 370: void show(); 371: 372: /** 373: * Get the graphics configuration of the component. The color model 374: * of the component can be derived from the configuration. 375: * 376: * @return the graphics configuration of the component 377: */ 378: GraphicsConfiguration getGraphicsConfiguration(); 379: 380: /** 381: * Part of an older API, no longer needed. 382: */ 383: void setEventMask(long mask); 384: 385: /** 386: * Returns <code>true</code> if this component has been obscured, 387: * <code>false</code> otherwise. This will only work if 388: * {@link #canDetermineObscurity()} also returns <code>true</code>. 389: * 390: * @return <code>true</code> if this component has been obscured, 391: * <code>false</code> otherwise. 392: */ 393: boolean isObscured(); 394: 395: /** 396: * Returns <code>true</code> if this component peer can determine if the 397: * component has been obscured, <code>false</code> otherwise. 398: * 399: * @return <code>true</code> if this component peer can determine if the 400: * component has been obscured, <code>false</code> otherwise 401: */ 402: boolean canDetermineObscurity(); 403: 404: /** 405: * Coalesces the specified paint event. 406: * 407: * @param e the paint event 408: */ 409: void coalescePaintEvent(PaintEvent e); 410: 411: /** 412: * Updates the cursor. 413: */ 414: void updateCursorImmediately(); 415: 416: /** 417: * Returns true, if this component can handle wheel scrolling, 418: * <code>false</code> otherwise. 419: * 420: * @return true, if this component can handle wheel scrolling, 421: * <code>false</code> otherwise 422: */ 423: boolean handlesWheelScrolling(); 424: 425: /** 426: * A convenience method that creates a volatile image. The volatile 427: * image is created on the screen device on which this component is 428: * displayed, in the device's current graphics configuration. 429: * 430: * @param width width of the image 431: * @param height height of the image 432: * 433: * @see VolatileImage 434: * 435: * @since 1.2 436: */ 437: VolatileImage createVolatileImage(int width, int height); 438: 439: /** 440: * Create a number of image buffers that implement a buffering 441: * strategy according to the given capabilities. 442: * 443: * @param numBuffers the number of buffers 444: * @param caps the buffering capabilities 445: * 446: * @throws AWTException if the specified buffering strategy is not 447: * implemented 448: * 449: * @since 1.2 450: */ 451: void createBuffers(int numBuffers, BufferCapabilities caps) 452: throws AWTException; 453: 454: /** 455: * Return the back buffer of this component. 456: * 457: * @return the back buffer of this component. 458: * 459: * @since 1.2 460: */ 461: Image getBackBuffer(); 462: 463: /** 464: * Perform a page flip, leaving the contents of the back buffer in 465: * the specified state. 466: * 467: * @param contents the state in which to leave the back buffer 468: * 469: * @since 1.2 470: */ 471: void flip(BufferCapabilities.FlipContents contents); 472: 473: /** 474: * Destroy the resources created by createBuffers. 475: * 476: * @since 1.2 477: */ 478: void destroyBuffers(); 479: 480: /** 481: * Get the bounds of this component peer. 482: * 483: * @return component peer bounds 484: * @since 1.5 485: */ 486: Rectangle getBounds(); 487: 488: /** 489: * Reparent this component under another container. 490: * 491: * @param parent 492: * @since 1.5 493: */ 494: void reparent(ContainerPeer parent); 495: 496: /** 497: * Set the bounds of this component peer. 498: * 499: * @param x the new x co-ordinate 500: * @param y the new y co-ordinate 501: * @param width the new width 502: * @param height the new height 503: * @param z the new stacking level 504: * @since 1.5 505: */ 506: void setBounds (int x, int y, int width, int height, int z); 507: 508: /** 509: * Check if this component supports being reparented. 510: * 511: * @return true if this component can be reparented, 512: * false otherwise. 513: * @since 1.5 514: */ 515: boolean isReparentSupported(); 516: 517: /** 518: * Layout this component peer. 519: * 520: * @since 1.5 521: */ 522: void layout(); 523: 524: 525: /** 526: * Requests the focus on the component. 527: */ 528: boolean requestFocus(Component lightweightChild, boolean temporary, 529: boolean focusedWindowChangeAllowed, long time, 530: CausedFocusEvent.Cause cause); 531: 532: }