1 /*
   2  * Copyright (c) 2008, 2016, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.  Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 
  26 package sun.awt;
  27 
  28 import jdk.internal.misc.Unsafe;
  29 
  30 import javax.accessibility.AccessibleContext;
  31 import java.awt.*;
  32 import java.awt.event.FocusEvent.Cause;
  33 import java.awt.dnd.DragSourceContext;
  34 import java.awt.dnd.DropTargetContext;
  35 import java.awt.dnd.peer.DragSourceContextPeer;
  36 import java.awt.dnd.peer.DropTargetContextPeer;
  37 import java.awt.event.AWTEventListener;
  38 import java.awt.event.InputEvent;
  39 import java.awt.event.InvocationEvent;
  40 import java.awt.event.KeyEvent;
  41 import java.awt.geom.Point2D;
  42 import java.awt.image.BufferStrategy;
  43 import java.awt.peer.ComponentPeer;
  44 
  45 import java.awt.peer.MenuComponentPeer;
  46 import java.lang.reflect.InvocationTargetException;
  47 import java.security.AccessControlContext;
  48 
  49 import java.io.File;
  50 import java.util.ResourceBundle;
  51 import java.util.Vector;
  52 import javax.accessibility.AccessibleBundle;
  53 
  54 /**
  55  * The AWTAccessor utility class.
  56  * The main purpose of this class is to enable accessing
  57  * private and package-private fields of classes from
  58  * different classes/packages. See sun.misc.SharedSecretes
  59  * for another example.
  60  */
  61 public final class AWTAccessor {
  62 
  63     private static final Unsafe unsafe = Unsafe.getUnsafe();
  64 
  65     /*
  66      * We don't need any objects of this class.
  67      * It's rather a collection of static methods
  68      * and interfaces.
  69      */
  70     private AWTAccessor() {
  71     }
  72 
  73     /*
  74      * An interface of accessor for the java.awt.Component class.
  75      */
  76     public interface ComponentAccessor {
  77         /*
  78          * Sets whether the native background erase for a component
  79          * has been disabled via SunToolkit.disableBackgroundErase().
  80          */
  81         void setBackgroundEraseDisabled(Component comp, boolean disabled);
  82         /*
  83          * Indicates whether the native background erase for a
  84          * component has been disabled via
  85          * SunToolkit.disableBackgroundErase().
  86          */
  87         boolean getBackgroundEraseDisabled(Component comp);
  88         /*
  89          *
  90          * Gets the bounds of this component in the form of a
  91          * {@code Rectangle} object. The bounds specify this
  92          * component's width, height, and location relative to
  93          * its parent.
  94          */
  95         Rectangle getBounds(Component comp);
  96 
  97         /**
  98          * Sets GraphicsConfiguration value for the component.
  99          */
 100         void setGraphicsConfiguration(Component comp, GraphicsConfiguration gc);
 101         /*
 102          * Requests focus to the component.
 103          */
 104         void requestFocus(Component comp, Cause cause);
 105         /*
 106          * Determines if the component can gain focus.
 107          */
 108         boolean canBeFocusOwner(Component comp);
 109 
 110         /**
 111          * Returns whether the component is visible without invoking
 112          * any client code.
 113          */
 114         boolean isVisible(Component comp);
 115 
 116         /**
 117          * Sets the RequestFocusController.
 118          */
 119         void setRequestFocusController(RequestFocusController requestController);
 120 
 121         /**
 122          * Returns the appContext of the component.
 123          */
 124         AppContext getAppContext(Component comp);
 125 
 126         /**
 127          * Sets the appContext of the component.
 128          */
 129         void setAppContext(Component comp, AppContext appContext);
 130 
 131         /**
 132          * Returns the parent of the component.
 133          */
 134         Container getParent(Component comp);
 135 
 136         /**
 137          * Sets the parent of the component to the specified parent.
 138          */
 139         void setParent(Component comp, Container parent);
 140 
 141         /**
 142          * Resizes the component to the specified width and height.
 143          */
 144         void setSize(Component comp, int width, int height);
 145 
 146         /**
 147          * Returns the location of the component.
 148          */
 149         Point getLocation(Component comp);
 150 
 151         /**
 152          * Moves the component to the new location.
 153          */
 154         void setLocation(Component comp, int x, int y);
 155 
 156         /**
 157          * Determines whether this component is enabled.
 158          */
 159         boolean isEnabled(Component comp);
 160 
 161         /**
 162          * Determines whether this component is displayable.
 163          */
 164         boolean isDisplayable(Component comp);
 165 
 166         /**
 167          * Gets the cursor set in the component.
 168          */
 169         Cursor getCursor(Component comp);
 170 
 171         /**
 172          * Returns the peer of the component.
 173          */
 174         <T extends ComponentPeer> T getPeer(Component comp);
 175 
 176         /**
 177          * Sets the peer of the component to the specified peer.
 178          */
 179         void setPeer(Component comp, ComponentPeer peer);
 180 
 181         /**
 182          * Determines whether this component is lightweight.
 183          */
 184         boolean isLightweight(Component comp);
 185 
 186         /**
 187          * Returns whether or not paint messages received from
 188          * the operating system should be ignored.
 189          */
 190         boolean getIgnoreRepaint(Component comp);
 191 
 192         /**
 193          * Returns the width of the component.
 194          */
 195         int getWidth(Component comp);
 196 
 197         /**
 198          * Returns the height of the component.
 199          */
 200         int getHeight(Component comp);
 201 
 202         /**
 203          * Returns the x coordinate of the component.
 204          */
 205         int getX(Component comp);
 206 
 207         /**
 208          * Returns the y coordinate of the component.
 209          */
 210         int getY(Component comp);
 211 
 212         /**
 213          * Gets the foreground color of this component.
 214          */
 215         Color getForeground(Component comp);
 216 
 217         /**
 218          * Gets the background color of this component.
 219          */
 220         Color getBackground(Component comp);
 221 
 222         /**
 223          * Sets the background of this component to the specified color.
 224          */
 225         void setBackground(Component comp, Color background);
 226 
 227         /**
 228          * Gets the font of the component.
 229          */
 230         Font getFont(Component comp);
 231 
 232         /**
 233          * Processes events occurring on this component.
 234          */
 235         void processEvent(Component comp, AWTEvent e);
 236 
 237 
 238         /*
 239          * Returns the acc this component was constructed with.
 240          */
 241         AccessControlContext getAccessControlContext(Component comp);
 242 
 243         /**
 244          * Revalidates the component synchronously.
 245          */
 246         void revalidateSynchronously(Component comp);
 247 
 248         /**
 249          * Creates a new strategy for multi-buffering on this component.
 250          */
 251         void createBufferStrategy(Component comp, int numBuffers,
 252                 BufferCapabilities caps) throws AWTException;
 253 
 254         /**
 255          * returns the buffer strategy used by this component.
 256          */
 257         BufferStrategy getBufferStrategy(Component comp);
 258     }
 259 
 260     /*
 261      * An interface of accessor for the java.awt.Container class.
 262      */
 263     public interface ContainerAccessor {
 264         /**
 265          * Validates the container unconditionally.
 266          */
 267         void validateUnconditionally(Container cont);
 268 
 269         /**
 270          *
 271          * Access to the private version of findComponentAt method which has
 272          * a controllable behavior. Setting 'ignoreEnabled' to 'false'
 273          * bypasses disabled Components during the search.
 274          */
 275         Component findComponentAt(Container cont, int x, int y, boolean ignoreEnabled);
 276 
 277         /**
 278          * Starts LW Modal.
 279          */
 280         void startLWModal(Container cont);
 281 
 282         /**
 283          * Starts LW Modal.
 284          */
 285         void stopLWModal(Container cont);
 286     }
 287 
 288     /*
 289      * An interface of accessor for java.awt.Window class.
 290      */
 291     public interface WindowAccessor {
 292         /*
 293          * Get opacity level of the given window.
 294          */
 295         float getOpacity(Window window);
 296         /*
 297          * Set opacity level to the given window.
 298          */
 299         void setOpacity(Window window, float opacity);
 300         /*
 301          * Get a shape assigned to the given window.
 302          */
 303         Shape getShape(Window window);
 304         /*
 305          * Set a shape to the given window.
 306          */
 307         void setShape(Window window, Shape shape);
 308         /*
 309          * Set the opaque preoperty to the given window.
 310          */
 311         void setOpaque(Window window, boolean isOpaque);
 312         /*
 313          * Update the image of a non-opaque (translucent) window.
 314          */
 315         void updateWindow(Window window);
 316 
 317         /** Get the size of the security warning.
 318          */
 319         Dimension getSecurityWarningSize(Window w);
 320 
 321         /**
 322          * Set the size of the security warning.
 323          */
 324         void setSecurityWarningSize(Window w, int width, int height);
 325 
 326         /** Set the position of the security warning.
 327          */
 328         void setSecurityWarningPosition(Window w, Point2D point,
 329                 float alignmentX, float alignmentY);
 330 
 331         /** Request to recalculate the new position of the security warning for
 332          * the given window size/location as reported by the native system.
 333          */
 334         Point2D calculateSecurityWarningPosition(Window window,
 335                 double x, double y, double w, double h);
 336 
 337         /** Sets the synchronous status of focus requests on lightweight
 338          * components in the specified window to the specified value.
 339          */
 340         void setLWRequestStatus(Window changed, boolean status);
 341 
 342         /**
 343          * Indicates whether this window should receive focus on subsequently
 344          * being shown, or being moved to the front.
 345          */
 346         boolean isAutoRequestFocus(Window w);
 347 
 348         /**
 349          * Indicates whether the specified window is an utility window for TrayIcon.
 350          */
 351         boolean isTrayIconWindow(Window w);
 352 
 353         /**
 354          * Marks the specified window as an utility window for TrayIcon.
 355          */
 356         void setTrayIconWindow(Window w, boolean isTrayIconWindow);
 357 
 358         /**
 359          * Return an array containing all the windows this
 360          * window currently owns.
 361          */
 362         Window[] getOwnedWindows(Window w);
 363     }
 364 
 365     /**
 366      * An accessor for the AWTEvent class.
 367      */
 368     public interface AWTEventAccessor {
 369         /**
 370          * Marks the event as posted.
 371          */
 372         void setPosted(AWTEvent ev);
 373 
 374         /**
 375          * Sets the flag on this AWTEvent indicating that it was
 376          * generated by the system.
 377          */
 378         void setSystemGenerated(AWTEvent ev);
 379 
 380         /**
 381          * Indicates whether this AWTEvent was generated by the system.
 382          */
 383         boolean isSystemGenerated(AWTEvent ev);
 384 
 385         /**
 386          * Returns the acc this event was constructed with.
 387          */
 388         AccessControlContext getAccessControlContext(AWTEvent ev);
 389 
 390         /**
 391          * Returns binary data associated with this event;
 392          */
 393         byte[] getBData(AWTEvent ev);
 394 
 395         /**
 396          * Associates binary data with this event;
 397          */
 398         void setBData(AWTEvent ev, byte[] bdata);
 399     }
 400 
 401     public interface InputEventAccessor {
 402         /*
 403          * Accessor for InputEvent.getButtonDownMasks()
 404          */
 405         int[] getButtonDownMasks();
 406 
 407         /*
 408          * Accessor for InputEvent.canAccessSystemClipboard field
 409          */
 410         boolean canAccessSystemClipboard(InputEvent event);
 411         void setCanAccessSystemClipboard(InputEvent event,
 412                 boolean canAccessSystemClipboard);
 413     }
 414 
 415     /*
 416      * An accessor for the java.awt.Frame class.
 417      */
 418     public interface FrameAccessor {
 419         /*
 420          * Sets the state of this frame.
 421          */
 422         void setExtendedState(Frame frame, int state);
 423         /*
 424          * Gets the state of this frame.
 425          */
 426        int getExtendedState(Frame frame);
 427         /*
 428          * Gets the maximized bounds of this frame.
 429          */
 430        Rectangle getMaximizedBounds(Frame frame);
 431     }
 432 
 433     /**
 434      * An interface of accessor for the java.awt.KeyboardFocusManager class.
 435      */
 436     public interface KeyboardFocusManagerAccessor {
 437         /**
 438          * Indicates whether the native implementation should
 439          * proceed with a pending focus request for the heavyweight.
 440          */
 441         int shouldNativelyFocusHeavyweight(Component heavyweight,
 442                                            Component descendant,
 443                                            boolean temporary,
 444                                            boolean focusedWindowChangeAllowed,
 445                                            long time,
 446                                            Cause cause);
 447         /**
 448          * Delivers focus for the lightweight descendant of the heavyweight
 449          * synchronously.
 450          */
 451         boolean processSynchronousLightweightTransfer(Component heavyweight,
 452                                                       Component descendant,
 453                                                       boolean temporary,
 454                                                       boolean focusedWindowChangeAllowed,
 455                                                       long time);
 456         /**
 457          * Removes the last focus request for the heavyweight from the queue.
 458          */
 459         void removeLastFocusRequest(Component heavyweight);
 460 
 461         /**
 462          * Gets the most recent focus owner in the window.
 463          */
 464         Component getMostRecentFocusOwner(Window window);
 465 
 466         /**
 467          * Sets the most recent focus owner in the window.
 468          */
 469         void setMostRecentFocusOwner(Window window, Component component);
 470 
 471         /**
 472          * Returns current KFM of the specified AppContext.
 473          */
 474         KeyboardFocusManager getCurrentKeyboardFocusManager(AppContext ctx);
 475 
 476         /**
 477          * Return the current focus cycle root
 478          */
 479         Container getCurrentFocusCycleRoot();
 480     }
 481 
 482     /**
 483      * An accessor for the MenuComponent class.
 484      */
 485     public interface MenuComponentAccessor {
 486         /**
 487          * Returns the appContext of the menu component.
 488          */
 489         AppContext getAppContext(MenuComponent menuComp);
 490 
 491         /**
 492          * Sets the appContext of the menu component.
 493          */
 494         void setAppContext(MenuComponent menuComp, AppContext appContext);
 495 
 496         /**
 497          * Returns the peer of the menu component.
 498          */
 499         <T extends MenuComponentPeer> T getPeer(MenuComponent menuComp);
 500 
 501         /**
 502          * Returns the menu container of the menu component.
 503          */
 504         MenuContainer getParent(MenuComponent menuComp);
 505 
 506         /**
 507          * Sets the menu container of the menu component.
 508          */
 509         void  setParent(MenuComponent menuComp, MenuContainer menuContainer);
 510 
 511         /**
 512          * Gets the font used for this menu component.
 513          */
 514         Font getFont_NoClientCode(MenuComponent menuComp);
 515     }
 516 
 517     /**
 518      * An accessor for the EventQueue class
 519      */
 520     public interface EventQueueAccessor {
 521         /**
 522          * Gets the event dispatch thread.
 523          */
 524         Thread getDispatchThread(EventQueue eventQueue);
 525 
 526         /**
 527          * Checks if the current thread is EDT for the given EQ.
 528          */
 529         public boolean isDispatchThreadImpl(EventQueue eventQueue);
 530 
 531         /**
 532          * Removes any pending events for the specified source object.
 533          */
 534         void removeSourceEvents(EventQueue eventQueue, Object source, boolean removeAllEvents);
 535 
 536         /**
 537          * Returns whether an event is pending on any of the separate Queues.
 538          */
 539         boolean noEvents(EventQueue eventQueue);
 540 
 541         /**
 542          * Called from PostEventQueue.postEvent to notify that a new event
 543          * appeared.
 544          */
 545         void wakeup(EventQueue eventQueue, boolean isShutdown);
 546 
 547         /**
 548          * Static in EventQueue
 549          */
 550         void invokeAndWait(Object source, Runnable r)
 551             throws InterruptedException, InvocationTargetException;
 552 
 553         /**
 554          * Sets the delegate for the EventQueue used by FX/AWT single threaded mode
 555          */
 556         void setFwDispatcher(EventQueue eventQueue, FwDispatcher dispatcher);
 557 
 558         /**
 559          * Gets most recent event time in the EventQueue
 560          */
 561         long getMostRecentEventTime(EventQueue eventQueue);
 562     }
 563 
 564     /*
 565      * An accessor for the PopupMenu class
 566      */
 567     public interface PopupMenuAccessor {
 568         /*
 569          * Returns whether the popup menu is attached to a tray
 570          */
 571         boolean isTrayIconPopup(PopupMenu popupMenu);
 572     }
 573 
 574     /*
 575      * An accessor for the FileDialog class
 576      */
 577     public interface FileDialogAccessor {
 578         /*
 579          * Sets the files the user selects
 580          */
 581         void setFiles(FileDialog fileDialog, File files[]);
 582 
 583         /*
 584          * Sets the file the user selects
 585          */
 586         void setFile(FileDialog fileDialog, String file);
 587 
 588         /*
 589          * Sets the directory the user selects
 590          */
 591         void setDirectory(FileDialog fileDialog, String directory);
 592 
 593         /*
 594          * Returns whether the file dialog allows the multiple file selection.
 595          */
 596         boolean isMultipleMode(FileDialog fileDialog);
 597     }
 598 
 599     /*
 600      * An accessor for the ScrollPaneAdjustable class.
 601      */
 602     public interface ScrollPaneAdjustableAccessor {
 603         /*
 604          * Sets the value of this scrollbar to the specified value.
 605          */
 606         void setTypedValue(final ScrollPaneAdjustable adj, final int v,
 607                            final int type);
 608     }
 609 
 610     /**
 611      * An accessor for the CheckboxMenuItem class
 612      */
 613     public interface CheckboxMenuItemAccessor {
 614         /**
 615          * Returns whether menu item is checked
 616          */
 617         boolean getState(CheckboxMenuItem cmi);
 618     }
 619 
 620     /**
 621      * An accessor for the Cursor class
 622      */
 623     public interface CursorAccessor {
 624         /**
 625          * Returns pData of the Cursor class
 626          */
 627         long getPData(Cursor cursor);
 628 
 629         /**
 630          * Sets pData to the Cursor class
 631          */
 632         void setPData(Cursor cursor, long pData);
 633 
 634         /**
 635          * Return type of the Cursor class
 636          */
 637         int getType(Cursor cursor);
 638     }
 639 
 640     /**
 641      * An accessor for the MenuBar class
 642      */
 643     public interface MenuBarAccessor {
 644         /**
 645          * Returns help menu
 646          */
 647         Menu getHelpMenu(MenuBar menuBar);
 648 
 649         /**
 650          * Returns menus
 651          */
 652         Vector<Menu> getMenus(MenuBar menuBar);
 653     }
 654 
 655     /**
 656      * An accessor for the MenuItem class
 657      */
 658     public interface MenuItemAccessor {
 659         /**
 660          * Returns whether menu item is enabled
 661          */
 662         boolean isEnabled(MenuItem item);
 663 
 664         /**
 665          * Gets the command name of the action event that is fired
 666          * by this menu item.
 667          */
 668         String getActionCommandImpl(MenuItem item);
 669 
 670         /**
 671          * Returns true if the item and all its ancestors are
 672          * enabled, false otherwise
 673          */
 674         boolean isItemEnabled(MenuItem item);
 675 
 676         /**
 677          * Returns label
 678          */
 679         String getLabel(MenuItem item);
 680 
 681         /**
 682          * Returns shortcut
 683          */
 684         MenuShortcut getShortcut(MenuItem item);
 685     }
 686 
 687     /**
 688      * An accessor for the Menu class
 689      */
 690     public interface MenuAccessor {
 691         /**
 692          * Returns vector of the items that are part of the Menu
 693          */
 694         Vector<MenuItem> getItems(Menu menu);
 695     }
 696 
 697     /**
 698      * An accessor for the KeyEvent class
 699      */
 700     public interface KeyEventAccessor {
 701         /**
 702          * Sets rawCode field for KeyEvent
 703          */
 704         void setRawCode(KeyEvent ev, long rawCode);
 705 
 706         /**
 707          * Sets primaryLevelUnicode field for KeyEvent
 708          */
 709         void setPrimaryLevelUnicode(KeyEvent ev, long primaryLevelUnicode);
 710 
 711         /**
 712          * Sets extendedKeyCode field for KeyEvent
 713          */
 714         void setExtendedKeyCode(KeyEvent ev, long extendedKeyCode);
 715 
 716         /**
 717          * Gets original source for KeyEvent
 718          */
 719         Component getOriginalSource(KeyEvent ev);
 720 
 721         /**
 722          * Gets isProxyActive field for KeyEvent
 723          */
 724         boolean isProxyActive(KeyEvent ev);
 725     }
 726 
 727     /**
 728      * An accessor for the ClientPropertyKey class
 729      */
 730     public interface ClientPropertyKeyAccessor {
 731         /**
 732          * Retrieves JComponent_TRANSFER_HANDLER enum object
 733          */
 734         Object getJComponent_TRANSFER_HANDLER();
 735     }
 736 
 737     /**
 738      * An accessor for the SystemTray class
 739      */
 740     public interface SystemTrayAccessor {
 741         /**
 742          * Support for reporting bound property changes for Object properties.
 743          */
 744         void firePropertyChange(SystemTray tray, String propertyName, Object oldValue, Object newValue);
 745     }
 746 
 747     /**
 748      * An accessor for the TrayIcon class
 749      */
 750     public interface TrayIconAccessor {
 751         void addNotify(TrayIcon trayIcon) throws AWTException;
 752         void removeNotify(TrayIcon trayIcon);
 753     }
 754 
 755     /**
 756      * An accessor for the DefaultKeyboardFocusManager class
 757      */
 758     public interface DefaultKeyboardFocusManagerAccessor {
 759         public void consumeNextKeyTyped(DefaultKeyboardFocusManager dkfm, KeyEvent e);
 760     }
 761 
 762     /*
 763      * An accessor for the SequencedEventAccessor class
 764      */
 765     public interface SequencedEventAccessor {
 766         /*
 767          * Returns the nested event.
 768          */
 769         AWTEvent getNested(AWTEvent sequencedEvent);
 770 
 771         /*
 772          * Returns true if the event is an instances of SequencedEvent.
 773          */
 774         boolean isSequencedEvent(AWTEvent event);
 775 
 776         /*
 777          * Creates SequencedEvent with the given nested event
 778          */
 779         AWTEvent create(AWTEvent event);
 780     }
 781 
 782     /*
 783      * An accessor for the Toolkit class
 784      */
 785     public interface ToolkitAccessor {
 786         void setPlatformResources(ResourceBundle bundle);
 787     }
 788 
 789     /*
 790      * An accessor object for the InvocationEvent class
 791      */
 792     public interface InvocationEventAccessor {
 793         void dispose(InvocationEvent event);
 794     }
 795 
 796     /*
 797      * An accessor object for the SystemColor class
 798      */
 799     public interface SystemColorAccessor {
 800         void updateSystemColors();
 801     }
 802 
 803     /*
 804      * An accessor object for the AccessibleContext class
 805      */
 806     public interface AccessibleContextAccessor {
 807         void setAppContext(AccessibleContext accessibleContext, AppContext appContext);
 808         AppContext getAppContext(AccessibleContext accessibleContext);
 809         Object getNativeAXResource(AccessibleContext accessibleContext);
 810         void setNativeAXResource(AccessibleContext accessibleContext, Object value);
 811     }
 812 
 813     /*
 814      * An accessor object for the AccessibleContext class
 815      */
 816     public interface AccessibleBundleAccessor {
 817         String getKey(AccessibleBundle accessibleBundle);
 818     }
 819 
 820     /*
 821      * An accessor object for the DragSourceContext class
 822      */
 823     public interface DragSourceContextAccessor {
 824         /**
 825          * Returns the peer of the DragSourceContext.
 826          */
 827         DragSourceContextPeer getPeer(DragSourceContext dsc);
 828     }
 829 
 830     /*
 831      * An accessor object for the DropTargetContext class
 832      */
 833     public interface DropTargetContextAccessor {
 834         /**
 835          * Resets the DropTargetContext.
 836          */
 837         void reset(DropTargetContext dtc);
 838         /**
 839          * Sets the {@code DropTargetContextPeer}
 840          */
 841         void setDropTargetContextPeer(DropTargetContext dtc,
 842                                       DropTargetContextPeer dtcp);
 843     }
 844 
 845     /*
 846      * Accessor instances are initialized in the static initializers of
 847      * corresponding AWT classes by using setters defined below.
 848      */
 849     private static ComponentAccessor componentAccessor;
 850     private static ContainerAccessor containerAccessor;
 851     private static WindowAccessor windowAccessor;
 852     private static AWTEventAccessor awtEventAccessor;
 853     private static InputEventAccessor inputEventAccessor;
 854     private static FrameAccessor frameAccessor;
 855     private static KeyboardFocusManagerAccessor kfmAccessor;
 856     private static MenuComponentAccessor menuComponentAccessor;
 857     private static EventQueueAccessor eventQueueAccessor;
 858     private static PopupMenuAccessor popupMenuAccessor;
 859     private static FileDialogAccessor fileDialogAccessor;
 860     private static ScrollPaneAdjustableAccessor scrollPaneAdjustableAccessor;
 861     private static CheckboxMenuItemAccessor checkboxMenuItemAccessor;
 862     private static CursorAccessor cursorAccessor;
 863     private static MenuBarAccessor menuBarAccessor;
 864     private static MenuItemAccessor menuItemAccessor;
 865     private static MenuAccessor menuAccessor;
 866     private static KeyEventAccessor keyEventAccessor;
 867     private static ClientPropertyKeyAccessor clientPropertyKeyAccessor;
 868     private static SystemTrayAccessor systemTrayAccessor;
 869     private static TrayIconAccessor trayIconAccessor;
 870     private static DefaultKeyboardFocusManagerAccessor defaultKeyboardFocusManagerAccessor;
 871     private static SequencedEventAccessor sequencedEventAccessor;
 872     private static ToolkitAccessor toolkitAccessor;
 873     private static InvocationEventAccessor invocationEventAccessor;
 874     private static SystemColorAccessor systemColorAccessor;
 875     private static AccessibleContextAccessor accessibleContextAccessor;
 876     private static AccessibleBundleAccessor accessibleBundleAccessor;
 877     private static DragSourceContextAccessor dragSourceContextAccessor;
 878     private static DropTargetContextAccessor dropTargetContextAccessor;
 879 
 880     /*
 881      * Set an accessor object for the java.awt.Component class.
 882      */
 883     public static void setComponentAccessor(ComponentAccessor ca) {
 884         componentAccessor = ca;
 885     }
 886 
 887     /*
 888      * Retrieve the accessor object for the java.awt.Component class.
 889      */
 890     public static ComponentAccessor getComponentAccessor() {
 891         if (componentAccessor == null) {
 892             unsafe.ensureClassInitialized(Component.class);
 893         }
 894 
 895         return componentAccessor;
 896     }
 897 
 898     /*
 899      * Set an accessor object for the java.awt.Container class.
 900      */
 901     public static void setContainerAccessor(ContainerAccessor ca) {
 902         containerAccessor = ca;
 903     }
 904 
 905     /*
 906      * Retrieve the accessor object for the java.awt.Container class.
 907      */
 908     public static ContainerAccessor getContainerAccessor() {
 909         if (containerAccessor == null) {
 910             unsafe.ensureClassInitialized(Container.class);
 911         }
 912 
 913         return containerAccessor;
 914     }
 915 
 916     /*
 917      * Set an accessor object for the java.awt.Window class.
 918      */
 919     public static void setWindowAccessor(WindowAccessor wa) {
 920         windowAccessor = wa;
 921     }
 922 
 923     /*
 924      * Retrieve the accessor object for the java.awt.Window class.
 925      */
 926     public static WindowAccessor getWindowAccessor() {
 927         if (windowAccessor == null) {
 928             unsafe.ensureClassInitialized(Window.class);
 929         }
 930         return windowAccessor;
 931     }
 932 
 933     /*
 934      * Set an accessor object for the java.awt.AWTEvent class.
 935      */
 936     public static void setAWTEventAccessor(AWTEventAccessor aea) {
 937         awtEventAccessor = aea;
 938     }
 939 
 940     /*
 941      * Retrieve the accessor object for the java.awt.AWTEvent class.
 942      */
 943     public static AWTEventAccessor getAWTEventAccessor() {
 944         if (awtEventAccessor == null) {
 945             unsafe.ensureClassInitialized(AWTEvent.class);
 946         }
 947         return awtEventAccessor;
 948     }
 949 
 950     /*
 951      * Set an accessor object for the java.awt.event.InputEvent class.
 952      */
 953     public static void setInputEventAccessor(InputEventAccessor iea) {
 954         inputEventAccessor = iea;
 955     }
 956 
 957     /*
 958      * Retrieve the accessor object for the java.awt.event.InputEvent class.
 959      */
 960     public static InputEventAccessor getInputEventAccessor() {
 961         if (inputEventAccessor == null) {
 962             unsafe.ensureClassInitialized(InputEvent.class);
 963         }
 964         return inputEventAccessor;
 965     }
 966 
 967     /*
 968      * Set an accessor object for the java.awt.Frame class.
 969      */
 970     public static void setFrameAccessor(FrameAccessor fa) {
 971         frameAccessor = fa;
 972     }
 973 
 974     /*
 975      * Retrieve the accessor object for the java.awt.Frame class.
 976      */
 977     public static FrameAccessor getFrameAccessor() {
 978         if (frameAccessor == null) {
 979             unsafe.ensureClassInitialized(Frame.class);
 980         }
 981         return frameAccessor;
 982     }
 983 
 984     /*
 985      * Set an accessor object for the java.awt.KeyboardFocusManager class.
 986      */
 987     public static void setKeyboardFocusManagerAccessor(KeyboardFocusManagerAccessor kfma) {
 988         kfmAccessor = kfma;
 989     }
 990 
 991     /*
 992      * Retrieve the accessor object for the java.awt.KeyboardFocusManager class.
 993      */
 994     public static KeyboardFocusManagerAccessor getKeyboardFocusManagerAccessor() {
 995         if (kfmAccessor == null) {
 996             unsafe.ensureClassInitialized(KeyboardFocusManager.class);
 997         }
 998         return kfmAccessor;
 999     }
1000 
1001     /*
1002      * Set an accessor object for the java.awt.MenuComponent class.
1003      */
1004     public static void setMenuComponentAccessor(MenuComponentAccessor mca) {
1005         menuComponentAccessor = mca;
1006     }
1007 
1008     /*
1009      * Retrieve the accessor object for the java.awt.MenuComponent class.
1010      */
1011     public static MenuComponentAccessor getMenuComponentAccessor() {
1012         if (menuComponentAccessor == null) {
1013             unsafe.ensureClassInitialized(MenuComponent.class);
1014         }
1015         return menuComponentAccessor;
1016     }
1017 
1018     /*
1019      * Set an accessor object for the java.awt.EventQueue class.
1020      */
1021     public static void setEventQueueAccessor(EventQueueAccessor eqa) {
1022         eventQueueAccessor = eqa;
1023     }
1024 
1025     /*
1026      * Retrieve the accessor object for the java.awt.EventQueue class.
1027      */
1028     public static EventQueueAccessor getEventQueueAccessor() {
1029         if (eventQueueAccessor == null) {
1030             unsafe.ensureClassInitialized(EventQueue.class);
1031         }
1032         return eventQueueAccessor;
1033     }
1034 
1035     /*
1036      * Set an accessor object for the java.awt.PopupMenu class.
1037      */
1038     public static void setPopupMenuAccessor(PopupMenuAccessor pma) {
1039         popupMenuAccessor = pma;
1040     }
1041 
1042     /*
1043      * Retrieve the accessor object for the java.awt.PopupMenu class.
1044      */
1045     public static PopupMenuAccessor getPopupMenuAccessor() {
1046         if (popupMenuAccessor == null) {
1047             unsafe.ensureClassInitialized(PopupMenu.class);
1048         }
1049         return popupMenuAccessor;
1050     }
1051 
1052     /*
1053      * Set an accessor object for the java.awt.FileDialog class.
1054      */
1055     public static void setFileDialogAccessor(FileDialogAccessor fda) {
1056         fileDialogAccessor = fda;
1057     }
1058 
1059     /*
1060      * Retrieve the accessor object for the java.awt.FileDialog class.
1061      */
1062     public static FileDialogAccessor getFileDialogAccessor() {
1063         if (fileDialogAccessor == null) {
1064             unsafe.ensureClassInitialized(FileDialog.class);
1065         }
1066         return fileDialogAccessor;
1067     }
1068 
1069     /*
1070      * Set an accessor object for the java.awt.ScrollPaneAdjustable class.
1071      */
1072     public static void setScrollPaneAdjustableAccessor(ScrollPaneAdjustableAccessor adj) {
1073         scrollPaneAdjustableAccessor = adj;
1074     }
1075 
1076     /*
1077      * Retrieve the accessor object for the java.awt.ScrollPaneAdjustable
1078      * class.
1079      */
1080     public static ScrollPaneAdjustableAccessor getScrollPaneAdjustableAccessor() {
1081         if (scrollPaneAdjustableAccessor == null) {
1082             unsafe.ensureClassInitialized(ScrollPaneAdjustable.class);
1083         }
1084         return scrollPaneAdjustableAccessor;
1085     }
1086 
1087     /**
1088      * Set an accessor object for the java.awt.CheckboxMenuItem class.
1089      */
1090     public static void setCheckboxMenuItemAccessor(CheckboxMenuItemAccessor cmia) {
1091         checkboxMenuItemAccessor = cmia;
1092     }
1093 
1094     /**
1095      * Retrieve the accessor object for the java.awt.CheckboxMenuItem class.
1096      */
1097     public static CheckboxMenuItemAccessor getCheckboxMenuItemAccessor() {
1098         if (checkboxMenuItemAccessor == null) {
1099             unsafe.ensureClassInitialized(CheckboxMenuItemAccessor.class);
1100         }
1101         return checkboxMenuItemAccessor;
1102     }
1103 
1104     /**
1105      * Set an accessor object for the java.awt.Cursor class.
1106      */
1107     public static void setCursorAccessor(CursorAccessor ca) {
1108         cursorAccessor = ca;
1109     }
1110 
1111     /**
1112      * Retrieve the accessor object for the java.awt.Cursor class.
1113      */
1114     public static CursorAccessor getCursorAccessor() {
1115         if (cursorAccessor == null) {
1116             unsafe.ensureClassInitialized(CursorAccessor.class);
1117         }
1118         return cursorAccessor;
1119     }
1120 
1121     /**
1122      * Set an accessor object for the java.awt.MenuBar class.
1123      */
1124     public static void setMenuBarAccessor(MenuBarAccessor mba) {
1125         menuBarAccessor = mba;
1126     }
1127 
1128     /**
1129      * Retrieve the accessor object for the java.awt.MenuBar class.
1130      */
1131     public static MenuBarAccessor getMenuBarAccessor() {
1132         if (menuBarAccessor == null) {
1133             unsafe.ensureClassInitialized(MenuBarAccessor.class);
1134         }
1135         return menuBarAccessor;
1136     }
1137 
1138     /**
1139      * Set an accessor object for the java.awt.MenuItem class.
1140      */
1141     public static void setMenuItemAccessor(MenuItemAccessor mia) {
1142         menuItemAccessor = mia;
1143     }
1144 
1145     /**
1146      * Retrieve the accessor object for the java.awt.MenuItem class.
1147      */
1148     public static MenuItemAccessor getMenuItemAccessor() {
1149         if (menuItemAccessor == null) {
1150             unsafe.ensureClassInitialized(MenuItemAccessor.class);
1151         }
1152         return menuItemAccessor;
1153     }
1154 
1155     /**
1156      * Set an accessor object for the java.awt.Menu class.
1157      */
1158     public static void setMenuAccessor(MenuAccessor ma) {
1159         menuAccessor = ma;
1160     }
1161 
1162     /**
1163      * Retrieve the accessor object for the java.awt.Menu class.
1164      */
1165     public static MenuAccessor getMenuAccessor() {
1166         if (menuAccessor == null) {
1167             unsafe.ensureClassInitialized(MenuAccessor.class);
1168         }
1169         return menuAccessor;
1170     }
1171 
1172     /**
1173      * Set an accessor object for the java.awt.event.KeyEvent class.
1174      */
1175     public static void setKeyEventAccessor(KeyEventAccessor kea) {
1176         keyEventAccessor = kea;
1177     }
1178 
1179     /**
1180      * Retrieve the accessor object for the java.awt.event.KeyEvent class.
1181      */
1182     public static KeyEventAccessor getKeyEventAccessor() {
1183         if (keyEventAccessor == null) {
1184             unsafe.ensureClassInitialized(KeyEventAccessor.class);
1185         }
1186         return keyEventAccessor;
1187     }
1188 
1189     /**
1190      * Set an accessor object for the javax.swing.ClientPropertyKey class.
1191      */
1192     public static void setClientPropertyKeyAccessor(ClientPropertyKeyAccessor cpka) {
1193         clientPropertyKeyAccessor = cpka;
1194     }
1195 
1196     /**
1197      * Retrieve the accessor object for the javax.swing.ClientPropertyKey class.
1198      */
1199     public static ClientPropertyKeyAccessor getClientPropertyKeyAccessor() {
1200         if (clientPropertyKeyAccessor == null) {
1201             unsafe.ensureClassInitialized(ClientPropertyKeyAccessor.class);
1202         }
1203         return clientPropertyKeyAccessor;
1204     }
1205 
1206     /**
1207      * Set an accessor object for the java.awt.SystemTray class.
1208      */
1209     public static void setSystemTrayAccessor(SystemTrayAccessor sta) {
1210         systemTrayAccessor = sta;
1211     }
1212 
1213     /**
1214      * Retrieve the accessor object for the java.awt.SystemTray class.
1215      */
1216     public static SystemTrayAccessor getSystemTrayAccessor() {
1217         if (systemTrayAccessor == null) {
1218             unsafe.ensureClassInitialized(SystemTrayAccessor.class);
1219         }
1220         return systemTrayAccessor;
1221     }
1222 
1223     /**
1224      * Set an accessor object for the java.awt.TrayIcon class.
1225      */
1226     public static void setTrayIconAccessor(TrayIconAccessor tia) {
1227         trayIconAccessor = tia;
1228     }
1229 
1230     /**
1231      * Retrieve the accessor object for the java.awt.TrayIcon class.
1232      */
1233     public static TrayIconAccessor getTrayIconAccessor() {
1234         if (trayIconAccessor == null) {
1235             unsafe.ensureClassInitialized(TrayIconAccessor.class);
1236         }
1237         return trayIconAccessor;
1238     }
1239 
1240     /**
1241      * Set an accessor object for the java.awt.DefaultKeyboardFocusManager class.
1242      */
1243     public static void setDefaultKeyboardFocusManagerAccessor(DefaultKeyboardFocusManagerAccessor dkfma) {
1244         defaultKeyboardFocusManagerAccessor = dkfma;
1245     }
1246 
1247     /**
1248      * Retrieve the accessor object for the java.awt.DefaultKeyboardFocusManager class.
1249      */
1250     public static DefaultKeyboardFocusManagerAccessor getDefaultKeyboardFocusManagerAccessor() {
1251         if (defaultKeyboardFocusManagerAccessor == null) {
1252             unsafe.ensureClassInitialized(DefaultKeyboardFocusManagerAccessor.class);
1253         }
1254         return defaultKeyboardFocusManagerAccessor;
1255     }
1256     /*
1257      * Set an accessor object for the java.awt.SequencedEvent class.
1258      */
1259     public static void setSequencedEventAccessor(SequencedEventAccessor sea) {
1260         sequencedEventAccessor = sea;
1261     }
1262 
1263     /*
1264      * Get the accessor object for the java.awt.SequencedEvent class.
1265      */
1266     public static SequencedEventAccessor getSequencedEventAccessor() {
1267         if (sequencedEventAccessor == null) {
1268             try {
1269                 unsafe.ensureClassInitialized(
1270                         Class.forName("java.awt.SequencedEvent"));
1271             } catch (ClassNotFoundException ignore) {
1272             }
1273         }
1274         return sequencedEventAccessor;
1275     }
1276 
1277     /*
1278      * Set an accessor object for the java.awt.Toolkit class.
1279      */
1280     public static void setToolkitAccessor(ToolkitAccessor ta) {
1281         toolkitAccessor = ta;
1282     }
1283 
1284     /*
1285      * Get the accessor object for the java.awt.Toolkit class.
1286      */
1287     public static ToolkitAccessor getToolkitAccessor() {
1288         if (toolkitAccessor == null) {
1289             unsafe.ensureClassInitialized(Toolkit.class);
1290         }
1291 
1292         return toolkitAccessor;
1293     }
1294 
1295     /*
1296      * Get the accessor object for the java.awt.event.InvocationEvent class.
1297      */
1298     public static void setInvocationEventAccessor(InvocationEventAccessor invocationEventAccessor) {
1299         AWTAccessor.invocationEventAccessor = invocationEventAccessor;
1300     }
1301 
1302     /*
1303      * Set the accessor object for the java.awt.event.InvocationEvent class.
1304      */
1305     public static InvocationEventAccessor getInvocationEventAccessor() {
1306         return invocationEventAccessor;
1307     }
1308 
1309     /*
1310      * Get the accessor object for the java.awt.SystemColor class.
1311      */
1312     public static SystemColorAccessor getSystemColorAccessor() {
1313         if (systemColorAccessor == null) {
1314             unsafe.ensureClassInitialized(SystemColor.class);
1315         }
1316 
1317         return systemColorAccessor;
1318     }
1319 
1320      /*
1321      * Set the accessor object for the java.awt.SystemColor class.
1322      */
1323      public static void setSystemColorAccessor(SystemColorAccessor systemColorAccessor) {
1324          AWTAccessor.systemColorAccessor = systemColorAccessor;
1325      }
1326 
1327     /*
1328      * Get the accessor object for the javax.accessibility.AccessibleContext class.
1329      */
1330     public static AccessibleContextAccessor getAccessibleContextAccessor() {
1331         if (accessibleContextAccessor == null) {
1332             unsafe.ensureClassInitialized(AccessibleContext.class);
1333         }
1334         return accessibleContextAccessor;
1335     }
1336 
1337    /*
1338     * Set the accessor object for the javax.accessibility.AccessibleBundle class.
1339     */
1340     public static void setAccessibleBundleAccessor(AccessibleBundleAccessor accessor) {
1341         AWTAccessor.accessibleBundleAccessor = accessor;
1342     }
1343 
1344     /*
1345      * Get the accessor object for the javax.accessibility.AccessibleBundle class.
1346      */
1347     public static AccessibleBundleAccessor getAccessibleBundleAccessor() {
1348         if (accessibleBundleAccessor == null) {
1349             unsafe.ensureClassInitialized(AccessibleBundle.class);
1350         }
1351         return accessibleBundleAccessor;
1352     }
1353 
1354    /*
1355     * Set the accessor object for the javax.accessibility.AccessibleContext class.
1356     */
1357     public static void setAccessibleContextAccessor(AccessibleContextAccessor accessor) {
1358         AWTAccessor.accessibleContextAccessor = accessor;
1359     }
1360 
1361     /*
1362      * Get the accessor object for the java.awt.dnd.DragSourceContext class.
1363      */
1364     public static DragSourceContextAccessor getDragSourceContextAccessor() {
1365         if (dragSourceContextAccessor == null) {
1366             unsafe.ensureClassInitialized(DragSourceContext.class);
1367         }
1368         return dragSourceContextAccessor;
1369     }
1370 
1371     /*
1372      * Set the accessor object for the java.awt.dnd.DragSourceContext class.
1373      */
1374     public static void setDragSourceContextAccessor(DragSourceContextAccessor accessor) {
1375         AWTAccessor.dragSourceContextAccessor = accessor;
1376     }
1377 
1378     /*
1379      * Get the accessor object for the java.awt.dnd.DropTargetContext class.
1380      */
1381     public static DropTargetContextAccessor getDropTargetContextAccessor() {
1382         if (dropTargetContextAccessor == null) {
1383             unsafe.ensureClassInitialized(DropTargetContext.class);
1384         }
1385         return dropTargetContextAccessor;
1386     }
1387 
1388     /*
1389      * Set the accessor object for the java.awt.dnd.DropTargetContext class.
1390      */
1391     public static void setDropTargetContextAccessor(DropTargetContextAccessor accessor) {
1392         AWTAccessor.dropTargetContextAccessor = accessor;
1393     }
1394 
1395 }