1 /* Toolkit.java -- AWT Toolkit superclass 2 Copyright (C) 1999, 2000, 2001, 2002, 2003 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., 59 Temple Place, Suite 330, Boston, MA 19 02111-1307 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; 40 41 import java.awt.datatransfer.Clipboard; 42 import java.awt.dnd.DragGestureEvent; 43 import java.awt.dnd.DragGestureListener; 44 import java.awt.dnd.DragGestureRecognizer; 45 import java.awt.dnd.DragSource; 46 import java.awt.dnd.peer.DragSourceContextPeer; 47 import java.awt.event.AWTEventListener; 48 import java.awt.event.KeyEvent; 49 import java.awt.im.InputMethodHighlight; 50 import java.awt.image.ColorModel; 51 import java.awt.image.ImageObserver; 52 import java.awt.image.ImageProducer; 53 import java.awt.peer.ButtonPeer; 54 import java.awt.peer.CanvasPeer; 55 import java.awt.peer.CheckboxPeer; 56 import java.awt.peer.CheckboxMenuItemPeer; 57 import java.awt.peer.ChoicePeer; 58 import java.awt.peer.DialogPeer; 59 import java.awt.peer.FileDialogPeer; 60 import java.awt.peer.FontPeer; 61 import java.awt.peer.FramePeer; 62 import java.awt.peer.LabelPeer; 63 import java.awt.peer.LightweightPeer; 64 import java.awt.peer.ListPeer; 65 import java.awt.peer.MenuPeer; 66 import java.awt.peer.MenuBarPeer; 67 import java.awt.peer.MenuItemPeer; 68 import java.awt.peer.PanelPeer; 69 import java.awt.peer.PopupMenuPeer; 70 import java.awt.peer.ScrollbarPeer; 71 import java.awt.peer.ScrollPanePeer; 72 import java.awt.peer.TextAreaPeer; 73 import java.awt.peer.TextFieldPeer; 74 import java.awt.peer.WindowPeer; 75 import java.beans.PropertyChangeListener; 76 import java.beans.PropertyChangeSupport; 77 import java.net.URL; 78 import java.util.Map; 79 import java.util.Properties; 80 81 /** 82 * The AWT system uses a set of native peer objects to implement its 83 * widgets. These peers are provided by a peer toolkit, that is accessed 84 * via a subclass of this superclass. The system toolkit is retrieved 85 * by the static methods <code>getDefaultToolkit</code>. This method 86 * determines the system toolkit by examining the system property 87 * <code>awt.toolkit</code>. That property is set to the name of the 88 * <code>Toolkit</code> subclass for the specified peer set. If the 89 * <code>awt.toolkit</code> property is not set, then the default 90 * toolkit <code>gnu.java.awt.peer.gtk.GtkToolkit</code> is used. This 91 * toolkit creates its peers using the GTK+ toolkit. 92 * 93 * @author Aaron M. Renn <arenn@urbanophile.com> 94 */ 95 public abstract class Toolkit 96 { 97 /** The default toolkit name. */ 98 private static String default_toolkit_name 99 = gnu.classpath.Configuration.default_awt_peer_toolkit; 100 101 /** 102 * The toolkit in use. Once we load it, we don't ever change it 103 * if the awt.toolkit property is set. 104 */ 105 private static Toolkit toolkit; 106 107 /** The toolkit properties. */ 108 private static Properties props = new Properties(); 109 110 protected final Map desktopProperties = new Properties(); 111 112 protected final PropertyChangeSupport desktopPropsSupport 113 = new PropertyChangeSupport(this); 114 115 /** 116 * Default constructor for subclasses. 117 */ Toolkit()118 public Toolkit() 119 { 120 } 121 122 /** 123 * Creates a peer object for the specified <code>Button</code>. 124 * 125 * @param target The <code>Button</code> to create the peer for. 126 * 127 * @return The peer for the specified <code>Button</code> object. 128 * 129 * @exception HeadlessException If GraphicsEnvironment.isHeadless() is true. 130 */ createButton(Button target)131 protected abstract ButtonPeer createButton(Button target); 132 133 /** 134 * Creates a peer object for the specified <code>TextField</code>. 135 * 136 * @param target The <code>TextField</code> to create the peer for. 137 * 138 * @return The peer for the specified <code>TextField</code> object. 139 * 140 * @exception HeadlessException If GraphicsEnvironment.isHeadless() is true. 141 */ createTextField(TextField target)142 protected abstract TextFieldPeer createTextField(TextField target); 143 144 /** 145 * Creates a peer object for the specified <code>Label</code>. 146 * 147 * @param target The <code>Label</code> to create the peer for. 148 * 149 * @return The peer for the specified <code>Label</code> object. 150 * 151 * @exception HeadlessException If GraphicsEnvironment.isHeadless() is true. 152 */ createLabel(Label target)153 protected abstract LabelPeer createLabel(Label target); 154 155 /** 156 * Creates a peer object for the specified <code>List</code>. 157 * 158 * @param target The <code>List</code> to create the peer for. 159 * 160 * @return The peer for the specified <code>List</code> object. 161 * 162 * @exception HeadlessException If GraphicsEnvironment.isHeadless() is true. 163 */ createList(List target)164 protected abstract ListPeer createList(List target); 165 166 /** 167 * Creates a peer object for the specified <code>Checkbox</code>. 168 * 169 * @param target The <code>Checkbox</code> to create the peer for. 170 * 171 * @return The peer for the specified <code>Checkbox</code> object. 172 * 173 * @exception HeadlessException If GraphicsEnvironment.isHeadless() is true. 174 */ createCheckbox(Checkbox target)175 protected abstract CheckboxPeer createCheckbox(Checkbox target); 176 177 /** 178 * Creates a peer object for the specified <code>Scrollbar</code>. 179 * 180 * @param target The <code>Scrollbar</code> to create the peer for. 181 * 182 * @return The peer for the specified <code>Scrollbar</code> object. 183 * 184 * @exception HeadlessException If GraphicsEnvironment.isHeadless() is true. 185 */ createScrollbar(Scrollbar target)186 protected abstract ScrollbarPeer createScrollbar(Scrollbar target); 187 188 /** 189 * Creates a peer object for the specified <code>ScrollPane</code>. 190 * 191 * @param target The <code>ScrollPane</code> to create the peer for. 192 * 193 * @return The peer for the specified <code>ScrollPane</code> object. 194 * 195 * @exception HeadlessException If GraphicsEnvironment.isHeadless() is true. 196 */ createScrollPane(ScrollPane target)197 protected abstract ScrollPanePeer createScrollPane(ScrollPane target); 198 199 /** 200 * Creates a peer object for the specified <code>TextArea</code>. 201 * 202 * @param target The <code>TextArea</code> to create the peer for. 203 * 204 * @return The peer for the specified <code>TextArea</code> object. 205 * 206 * @exception HeadlessException If GraphicsEnvironment.isHeadless() is true. 207 */ createTextArea(TextArea target)208 protected abstract TextAreaPeer createTextArea(TextArea target); 209 210 /** 211 * Creates a peer object for the specified <code>Choice</code>. 212 * 213 * @param target The <code>Choice</code> to create the peer for. 214 * 215 * @return The peer for the specified <code>Choice</code> object. 216 * 217 * @exception HeadlessException If GraphicsEnvironment.isHeadless() is true. 218 */ createChoice(Choice target)219 protected abstract ChoicePeer createChoice(Choice target); 220 221 /** 222 * Creates a peer object for the specified <code>Frame</code>. 223 * 224 * @param target The <code>Frame</code> to create the peer for. 225 * 226 * @return The peer for the specified <code>Frame</code> object. 227 * 228 * @exception HeadlessException If GraphicsEnvironment.isHeadless() is true. 229 */ createFrame(Frame target)230 protected abstract FramePeer createFrame(Frame target); 231 232 /** 233 * Creates a peer object for the specified <code>Canvas</code>. 234 * 235 * @param target The <code>Canvas</code> to create the peer for. 236 * 237 * @return The peer for the specified <code>Canvas</code> object. 238 */ createCanvas(Canvas target)239 protected abstract CanvasPeer createCanvas(Canvas target); 240 241 /** 242 * Creates a peer object for the specified <code>Panel</code>. 243 * 244 * @param target The <code>Panel</code> to create the peer for. 245 * 246 * @return The peer for the specified <code>Panel</code> object. 247 */ createPanel(Panel target)248 protected abstract PanelPeer createPanel(Panel target); 249 250 /** 251 * Creates a peer object for the specified <code>Window</code>. 252 * 253 * @param target The <code>Window</code> to create the peer for. 254 * 255 * @return The peer for the specified <code>Window</code> object. 256 * 257 * @exception HeadlessException If GraphicsEnvironment.isHeadless() is true. 258 */ createWindow(Window target)259 protected abstract WindowPeer createWindow(Window target); 260 261 /** 262 * Creates a peer object for the specified <code>Dialog</code>. 263 * 264 * @param target The dialog to create the peer for 265 * 266 * @return The peer for the specified font name. 267 * 268 * @exception HeadlessException If GraphicsEnvironment.isHeadless() is true. 269 */ createDialog(Dialog target)270 protected abstract DialogPeer createDialog(Dialog target); 271 272 /** 273 * Creates a peer object for the specified <code>MenuBar</code>. 274 * 275 * @param target The <code>MenuBar</code> to create the peer for. 276 * 277 * @return The peer for the specified <code>MenuBar</code> object. 278 * 279 * @exception HeadlessException If GraphicsEnvironment.isHeadless() is true. 280 */ createMenuBar(MenuBar target)281 protected abstract MenuBarPeer createMenuBar(MenuBar target); 282 283 /** 284 * Creates a peer object for the specified <code>Menu</code>. 285 * 286 * @param target The <code>Menu</code> to create the peer for. 287 * 288 * @return The peer for the specified <code>Menu</code> object. 289 * 290 * @exception HeadlessException If GraphicsEnvironment.isHeadless() is true. 291 */ createMenu(Menu target)292 protected abstract MenuPeer createMenu(Menu target); 293 294 /** 295 * Creates a peer object for the specified <code>PopupMenu</code>. 296 * 297 * @param target The <code>PopupMenu</code> to create the peer for. 298 * 299 * @return The peer for the specified <code>PopupMenu</code> object. 300 * 301 * @exception HeadlessException If GraphicsEnvironment.isHeadless() is true. 302 */ createPopupMenu(PopupMenu target)303 protected abstract PopupMenuPeer createPopupMenu(PopupMenu target); 304 305 /** 306 * Creates a peer object for the specified <code>MenuItem</code>. 307 * 308 * @param target The <code>MenuItem</code> to create the peer for. 309 * 310 * @return The peer for the specified <code>MenuItem</code> object. 311 * 312 * @exception HeadlessException If GraphicsEnvironment.isHeadless() is true. 313 */ createMenuItem(MenuItem target)314 protected abstract MenuItemPeer createMenuItem(MenuItem target); 315 316 /** 317 * Creates a peer object for the specified <code>FileDialog</code>. 318 * 319 * @param target The <code>FileDialog</code> to create the peer for. 320 * 321 * @return The peer for the specified <code>FileDialog</code> object. 322 * 323 * @exception HeadlessException If GraphicsEnvironment.isHeadless() is true. 324 */ createFileDialog(FileDialog target)325 protected abstract FileDialogPeer createFileDialog(FileDialog target); 326 327 /** 328 * Creates a peer object for the specified <code>CheckboxMenuItem</code>. 329 * 330 * @param target The <code>CheckboxMenuItem</code> to create the peer for. 331 * 332 * @return The peer for the specified <code>CheckboxMenuItem</code> object. 333 * 334 * @exception HeadlessException If GraphicsEnvironment.isHeadless() is true. 335 */ 336 protected abstract CheckboxMenuItemPeer createCheckboxMenuItem(CheckboxMenuItem target)337 createCheckboxMenuItem(CheckboxMenuItem target); 338 339 /** 340 * Creates a peer object for the specified <code>Component</code>. The 341 * peer returned by this method is not a native windowing system peer 342 * with its own native window. Instead, this method allows the component 343 * to draw on its parent window as a "lightweight" widget. 344 * 345 * @param target The <code>Component</code> to create the peer for. 346 * 347 * @return The peer for the specified <code>Component</code> object. 348 */ createComponent(Component target)349 protected LightweightPeer createComponent(Component target) 350 { 351 return new gnu.java.awt.peer.GLightweightPeer (target); 352 } 353 354 /** 355 * Creates a peer object for the specified font name. 356 * 357 * @param name The font to create the peer for. 358 * @param style The font style to create the peer for. 359 * 360 * @return The peer for the specified font name. 361 * 362 * @deprecated 363 */ getFontPeer(String name, int style)364 protected abstract FontPeer getFontPeer(String name, int style); 365 366 /** 367 * Copies the current system colors into the specified array. This is 368 * the interface used by the <code>SystemColors</code> class. 369 * 370 * @param colors The array to copy the system colors into. 371 * 372 * @exception HeadlessException If GraphicsEnvironment.isHeadless() is true. 373 */ loadSystemColors(int systemColors[])374 protected void loadSystemColors(int systemColors[]) 375 { 376 // XXX Implement. 377 } 378 379 /** 380 * @since 1.4 381 * 382 * @exception HeadlessException If GraphicsEnvironment.isHeadless() is true. 383 */ setDynamicLayout(boolean dynamic)384 public void setDynamicLayout(boolean dynamic) 385 { 386 } 387 388 /** 389 * @since 1.4 390 * 391 * @exception HeadlessException If GraphicsEnvironment.isHeadless() is true. 392 */ isDynamicLayoutSet()393 protected boolean isDynamicLayoutSet() 394 { 395 return false; 396 } 397 398 /** 399 * @since 1.4 400 * 401 * @exception HeadlessException If GraphicsEnvironment.isHeadless() is true. 402 */ isDynamicLayoutActive()403 public boolean isDynamicLayoutActive() 404 { 405 return false; 406 } 407 408 /** 409 * Returns the dimensions of the screen in pixels. 410 * 411 * @return The dimensions of the screen in pixels. 412 * 413 * @exception HeadlessException If GraphicsEnvironment.isHeadless() is true. 414 */ getScreenSize()415 public abstract Dimension getScreenSize(); 416 417 /** 418 * Returns the screen resolution in dots per square inch. 419 * 420 * @return The screen resolution in dots per square inch. 421 * 422 * @exception HeadlessException If GraphicsEnvironment.isHeadless() is true. 423 */ getScreenResolution()424 public abstract int getScreenResolution(); 425 426 /** 427 * @exception HeadlessException If GraphicsEnvironment.isHeadless() is true. 428 * 429 * @since 1.4 430 */ getScreenInsets(GraphicsConfiguration gc)431 public Insets getScreenInsets(GraphicsConfiguration gc) 432 { 433 return null; 434 } 435 436 /** 437 * Returns the color model of the screen. 438 * 439 * @return The color model of the screen. 440 * 441 * @exception HeadlessException If GraphicsEnvironment.isHeadless() is true. 442 */ getColorModel()443 public abstract ColorModel getColorModel(); 444 445 /** 446 * Returns the names of the available fonts. 447 * 448 * @return The names of the available fonts. 449 * 450 * @deprecated 451 */ getFontList()452 public abstract String[] getFontList(); 453 454 /** 455 * Return the font metrics for the specified font 456 * 457 * @param name The name of the font to return metrics for. 458 * 459 * @return The requested font metrics. 460 * 461 * @deprecated 462 */ getFontMetrics(Font name)463 public abstract FontMetrics getFontMetrics(Font name); 464 465 /** 466 * Flushes any buffered data to the screen so that it is in sync with 467 * what the AWT system has drawn to it. 468 */ sync()469 public abstract void sync(); 470 471 /** 472 * Returns an instance of the default toolkit. The default toolkit is 473 * the subclass of <code>Toolkit</code> specified in the system property 474 * <code>awt.toolkit</code>, or <code>gnu.java.awt.peer.gtk.GtkToolkit</code> 475 * if the property is not set. 476 * 477 * @return An instance of the system default toolkit. 478 * 479 * @throws AWTError If the toolkit cannot be loaded. 480 */ getDefaultToolkit()481 public static Toolkit getDefaultToolkit() 482 { 483 if (toolkit != null) 484 return toolkit; 485 String toolkit_name = System.getProperty("awt.toolkit", 486 default_toolkit_name); 487 try 488 { 489 Class cls = Class.forName(toolkit_name); 490 Object obj = cls.newInstance(); 491 if (!(obj instanceof Toolkit)) 492 throw new AWTError(toolkit_name + " is not a subclass of " + 493 "java.awt.Toolkit"); 494 toolkit = (Toolkit) obj; 495 return toolkit; 496 } 497 catch (Throwable t) 498 { 499 AWTError e = new AWTError("Cannot load AWT toolkit: " + toolkit_name); 500 throw (AWTError) e.initCause(t); 501 } 502 } 503 504 /** 505 * Returns an image from the specified file, which must be in a 506 * recognized format. Supported formats vary from toolkit to toolkit. 507 * 508 * @return name The name of the file to read the image from. 509 */ getImage(String name)510 public abstract Image getImage(String name); 511 512 /** 513 * Returns an image from the specified URL, which must be in a 514 * recognized format. Supported formats vary from toolkit to toolkit. 515 * 516 * @return url The URl to read the image from. 517 */ getImage(URL url)518 public abstract Image getImage(URL url); 519 createImage(String filename)520 public abstract Image createImage(String filename); 521 createImage(URL url)522 public abstract Image createImage(URL url); 523 524 /** 525 * Readies an image to be rendered on the screen. The width and height 526 * values can be set to the default sizes for the image by passing -1 527 * in those parameters. 528 * 529 * @param image The image to prepare for rendering. 530 * @param width The width of the image. 531 * @param height The height of the image. 532 * @param observer The observer to receive events about the preparation 533 * process. 534 * 535 * @return <code>true</code> if the image is already prepared for rendering, 536 * <code>false</code> otherwise. 537 */ prepareImage(Image image, int width, int height, ImageObserver observer)538 public abstract boolean prepareImage(Image image, int width, int height, 539 ImageObserver observer); 540 541 /** 542 * Checks the status of specified image as it is being readied for 543 * rendering. 544 * 545 * @param image The image to prepare for rendering. 546 * @param width The width of the image. 547 * @param height The height of the image. 548 * @param observer The observer to receive events about the preparation 549 * process. 550 * 551 * @return A union of the bitmasks from 552 * <code>java.awt.image.ImageObserver</code> that indicates the current 553 * state of the imaging readying process. 554 */ checkImage(Image image, int width, int height, ImageObserver observer)555 public abstract int checkImage(Image image, int width, int height, 556 ImageObserver observer); 557 558 /** 559 * Creates an image using the specified <code>ImageProducer</code> 560 * 561 * @param producer The <code>ImageProducer</code> to create the image from. 562 * 563 * @return The created image. 564 */ createImage(ImageProducer producer)565 public abstract Image createImage(ImageProducer producer); 566 567 /** 568 * Creates an image from the specified byte array. The array must be in 569 * a recognized format. Supported formats vary from toolkit to toolkit. 570 * 571 * @param data The raw image data. 572 * 573 * @return The created image. 574 */ createImage(byte[] data)575 public Image createImage(byte[] data) 576 { 577 return createImage(data, 0, data.length); 578 } 579 580 /** 581 * Creates an image from the specified portion of the byte array passed. 582 * The array must be in a recognized format. Supported formats vary from 583 * toolkit to toolkit. 584 * 585 * @param data The raw image data. 586 * @param offset The offset into the data where the image data starts. 587 * @param len The length of the image data. 588 * 589 * @return The created image. 590 */ createImage(byte[] data, int offset, int len)591 public abstract Image createImage(byte[] data, int offset, int len); 592 593 /** 594 * Returns a instance of <code>PrintJob</code> for the specified 595 * arguments. 596 * 597 * @param frame The window initiating the print job. 598 * @param title The print job title. 599 * @param props The print job properties. 600 * 601 * @return The requested print job, or <code>null</code> if the job 602 * was cancelled. 603 * 604 * @exception NullPointerException If frame is null, 605 * or GraphicsEnvironment.isHeadless() returns true. 606 * @exception SecurityException If this thread is not allowed to initiate 607 * a print job request. 608 */ getPrintJob(Frame frame, String title, Properties props)609 public abstract PrintJob getPrintJob(Frame frame, String title, 610 Properties props); 611 612 /** 613 * Returns a instance of <code>PrintJob</code> for the specified 614 * arguments. 615 * 616 * @param frame The window initiating the print job. 617 * @param title The print job title. 618 * @param jobAttr A set of job attributes which will control the print job. 619 * @param pageAttr A set of page attributes which will control the print job. 620 * 621 * @exception NullPointerException If frame is null, and either jobAttr is null 622 * or jobAttr.getDialog() returns JobAttributes.DialogType.NATIVE. 623 * @exception IllegalArgumentException If pageAttrspecifies differing cross 624 * feed and feed resolutions, or when GraphicsEnvironment.isHeadless() returns 625 * true. 626 * @exception SecurityException If this thread is not allowed to initiate 627 * a print job request. 628 * 629 * @since 1.3 630 */ getPrintJob(Frame frame, String title, JobAttributes jobAttr, PageAttributes pageAttr)631 public PrintJob getPrintJob(Frame frame, String title, 632 JobAttributes jobAttr, PageAttributes pageAttr) 633 { 634 return null; 635 } 636 637 /** 638 * Causes a "beep" tone to be generated. 639 */ beep()640 public abstract void beep(); 641 642 /** 643 * Returns the system clipboard. 644 * 645 * @return THe system clipboard. 646 * 647 * @exception HeadlessException If GraphicsEnvironment.isHeadless() is true. 648 */ getSystemClipboard()649 public abstract Clipboard getSystemClipboard(); 650 651 /** 652 * Gets the singleton instance of the system selection as a Clipboard object. 653 * 654 * @exception HeadlessException If GraphicsEnvironment.isHeadless() is true. 655 * 656 * @since 1.4 657 */ getSystemSelection()658 public Clipboard getSystemSelection() 659 { 660 return null; 661 } 662 663 /** 664 * Returns the accelerator key mask for menu shortcuts. The default is 665 * <code>Event.CTRL_MASK</code>. A toolkit must override this method 666 * to change the default. 667 * 668 * @return The key mask for the menu accelerator key. 669 * 670 * @exception HeadlessException If GraphicsEnvironment.isHeadless() is true. 671 */ getMenuShortcutKeyMask()672 public int getMenuShortcutKeyMask() 673 { 674 return Event.CTRL_MASK; 675 } 676 677 /** 678 * Returns whether the given locking key on the keyboard is currently in its 679 * "on" state. 680 * 681 * @exception HeadlessException If GraphicsEnvironment.isHeadless() is true. 682 * @exception IllegalArgumentException If keyCode is not one of the valid keys. 683 * @exception UnsupportedOperationException If the host system doesn't allow 684 * getting the state of this key programmatically, or if the keyboard doesn't 685 * have this key. 686 */ getLockingKeyState(int keyCode)687 public boolean getLockingKeyState(int keyCode) 688 { 689 if (keyCode != KeyEvent.VK_CAPS_LOCK 690 && keyCode != KeyEvent.VK_NUM_LOCK 691 && keyCode != KeyEvent.VK_SCROLL_LOCK) 692 throw new IllegalArgumentException(); 693 694 throw new UnsupportedOperationException(); 695 } 696 697 /** 698 * Sets the state of the given locking key on the keyboard. 699 * 700 * @exception HeadlessException If GraphicsEnvironment.isHeadless() is true. 701 * @exception IllegalArgumentException If keyCode is not one of the valid keys. 702 * @exception UnsupportedOperationException If the host system doesn't allow 703 * getting the state of this key programmatically, or if the keyboard doesn't 704 * have this key. 705 */ setLockingKeyState(int keyCode, boolean on)706 public void setLockingKeyState(int keyCode, boolean on) 707 { 708 if (keyCode != KeyEvent.VK_CAPS_LOCK 709 && keyCode != KeyEvent.VK_NUM_LOCK 710 && keyCode != KeyEvent.VK_SCROLL_LOCK) 711 throw new IllegalArgumentException(); 712 713 throw new UnsupportedOperationException(); 714 } 715 716 /** 717 * Returns the native container object of the specified component. This 718 * method is necessary because the parent component might be a lightweight 719 * component. 720 * 721 * @param component The component to fetch the native container for. 722 * 723 * @return The native container object for this component. 724 */ getNativeContainer(Component component)725 protected static Container getNativeContainer(Component component) 726 { 727 component = component.getParent(); 728 while (true) 729 { 730 if (component == null) 731 return null; 732 if (! (component instanceof Container)) 733 { 734 component = component.getParent(); 735 continue; 736 } 737 if (component.getPeer() instanceof LightweightPeer) 738 { 739 component = component.getParent(); 740 continue; 741 } 742 return (Container) component; 743 } 744 } 745 746 /** 747 * Creates a new custom cursor object. 748 * 749 * @exception IndexOutOfBoundsException If the hotSpot values are outside 750 * the bounds of the cursor. 751 * @exception HeadlessException If GraphicsEnvironment.isHeadless() is true. 752 */ createCustomCursor(Image cursor, Point hotSpot, String name)753 public Cursor createCustomCursor(Image cursor, Point hotSpot, String name) 754 { 755 // Presumably the only reason this isn't abstract is for backwards 756 // compatibility? FIXME? 757 return null; 758 } 759 760 /** 761 * Returns the supported cursor dimension which is closest to the 762 * desired sizes. 763 * 764 * @exception HeadlessException If GraphicsEnvironment.isHeadless() is true. 765 */ getBestCursorSize(int preferredWidth, int preferredHeight)766 public Dimension getBestCursorSize(int preferredWidth, int preferredHeight) 767 { 768 return new Dimension (0,0); 769 } 770 771 /** 772 * Returns the maximum number of colors the Toolkit supports in a custom 773 * cursor palette. 774 * 775 * @exception HeadlessException If GraphicsEnvironment.isHeadless() is true. 776 */ getMaximumCursorColors()777 public int getMaximumCursorColors() 778 { 779 return 0; 780 } 781 782 /** 783 * Returns whether Toolkit supports this state for Frames. 784 * 785 * @exception HeadlessException If GraphicsEnvironment.isHeadless() is true. 786 * 787 * @since 1.4 788 */ isFrameStateSupported(int state)789 public boolean isFrameStateSupported(int state) 790 { 791 return false; 792 } 793 794 /** 795 * Returns the value of the property with the specified name, or the 796 * default value if the property does not exist. 797 * 798 * @param key The name of the property to retrieve. 799 * @param def The default value of the property. 800 */ getProperty(String key, String def)801 public static String getProperty(String key, String def) 802 { 803 return props.getProperty(key, def); 804 } 805 806 807 /** 808 * Returns the event queue that is suitable for the calling context. 809 * 810 * <p>Despite the word “System” in the name of this 811 * method, a toolkit may provide different event queues for each 812 * applet. There is no guarantee that the same queue is shared 813 * system-wide. 814 * 815 * <p>The implementation first checks whether a 816 * SecurityManager has been installed. If so, its {@link 817 * java.lang.SecurityManager#checkAwtEventQueueAccess()} method gets 818 * called. The security manager will throw a SecurityException if it 819 * does not grant the permission to access the event queue. 820 * 821 * <p>Next, the call is delegated to {@link 822 * #getSystemEventQueueImpl()}. 823 * 824 * @return The event queue for this applet (or application). 825 * 826 * @throws SecurityException if a security manager has been 827 * installed, and it does not grant the permission to access the 828 * event queue. 829 */ getSystemEventQueue()830 public final EventQueue getSystemEventQueue() 831 { 832 SecurityManager sm; 833 834 sm = System.getSecurityManager(); 835 if (sm != null) 836 sm.checkAwtEventQueueAccess(); 837 838 return getSystemEventQueueImpl(); 839 } 840 841 842 /** 843 * Returns the event queue that is suitable for the calling context. 844 * 845 * <p>Despite the word “System” in the name of this 846 * method, a toolkit may provide different event queues for each 847 * applet. There is no guarantee that the same queue is shared 848 * system-wide. 849 * 850 * <p>No security checks are performed, which is why this method 851 * may only be called by Toolkits. 852 * 853 * @see #getSystemEventQueue() 854 */ getSystemEventQueueImpl()855 protected abstract EventQueue getSystemEventQueueImpl(); 856 857 858 /** 859 * @since 1.3 860 */ 861 public abstract DragSourceContextPeer createDragSourceContextPeer(DragGestureEvent e)862 createDragSourceContextPeer(DragGestureEvent e); 863 864 /** 865 * @since 1.3 866 */ 867 public DragGestureRecognizer createDragGestureRecognizer(Class recognizer, DragSource ds, Component comp, int actions, DragGestureListener l)868 createDragGestureRecognizer(Class recognizer, DragSource ds, 869 Component comp, int actions, 870 DragGestureListener l) 871 { 872 return null; 873 } 874 getDesktopProperty(String propertyName)875 public final Object getDesktopProperty(String propertyName) 876 { 877 return desktopProperties.get(propertyName); 878 } 879 setDesktopProperty(String name, Object newValue)880 protected final void setDesktopProperty(String name, Object newValue) 881 { 882 Object oldValue = getDesktopProperty(name); 883 desktopProperties.put(name, newValue); 884 desktopPropsSupport.firePropertyChange(name, oldValue, newValue); 885 } 886 lazilyLoadDesktopProperty(String name)887 protected Object lazilyLoadDesktopProperty(String name) 888 { 889 // FIXME - what is this?? 890 return null; 891 } 892 initializeDesktopProperties()893 protected void initializeDesktopProperties() 894 { 895 // Overridden by toolkit implementation? 896 } 897 addPropertyChangeListener(String name, PropertyChangeListener pcl)898 public void addPropertyChangeListener(String name, 899 PropertyChangeListener pcl) 900 { 901 desktopPropsSupport.addPropertyChangeListener(name, pcl); 902 } 903 removePropertyChangeListener(String name, PropertyChangeListener pcl)904 public void removePropertyChangeListener(String name, 905 PropertyChangeListener pcl) 906 { 907 desktopPropsSupport.removePropertyChangeListener(name, pcl); 908 } 909 910 /** 911 * @since 1.4 912 */ getPropertyChangeListeners()913 public PropertyChangeListener[] getPropertyChangeListeners() 914 { 915 return desktopPropsSupport.getPropertyChangeListeners(); 916 } 917 918 /** 919 * @since 1.4 920 */ getPropertyChangeListeners(String name)921 public PropertyChangeListener[] getPropertyChangeListeners(String name) 922 { 923 return desktopPropsSupport.getPropertyChangeListeners(name); 924 } 925 addAWTEventListener(AWTEventListener listener, long eventMask)926 public void addAWTEventListener(AWTEventListener listener, long eventMask) 927 { 928 // SecurityManager s = System.getSecurityManager(); 929 // if (s != null) 930 // s.checkPermission(AWTPermission("listenToAllAWTEvents")); 931 // FIXME 932 } 933 removeAWTEventListener(AWTEventListener listener)934 public void removeAWTEventListener(AWTEventListener listener) 935 { 936 // FIXME 937 } 938 939 /** 940 * @since 1.4 941 */ getAWTEventListeners()942 public AWTEventListener[] getAWTEventListeners() 943 { 944 return null; 945 } 946 947 /** 948 * @since 1.4 949 */ getAWTEventListeners(long mask)950 public AWTEventListener[] getAWTEventListeners(long mask) 951 { 952 return null; 953 } 954 955 /** 956 * @since 1.3 957 */ mapInputMethodHighlight(InputMethodHighlight highlight)958 public abstract Map mapInputMethodHighlight(InputMethodHighlight highlight); 959 } // class Toolkit 960