1 /*
   2  * Copyright (c) 2009, 2017, 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.swing;
  27 
  28 import jdk.internal.misc.Unsafe;
  29 
  30 import java.awt.*;
  31 import javax.swing.*;
  32 
  33 import javax.swing.text.JTextComponent;
  34 
  35 /**
  36  * The SwingAccessor utility class.
  37  * The main purpose of this class is to enable accessing
  38  * private and package-private fields of classes from
  39  * different classes/packages. See sun.misc.SharedSecretes
  40  * for another example.
  41  */
  42 public final class SwingAccessor {
  43     private static final Unsafe unsafe = Unsafe.getUnsafe();
  44 
  45     /**
  46      * We don't need any objects of this class.
  47      * It's rather a collection of static methods
  48      * and interfaces.
  49      */
  50     private SwingAccessor() {
  51     }
  52 
  53     /**
  54      * An accessor for the JComponent class.
  55      */
  56     public interface JComponentAccessor {
  57 
  58         boolean getFlag(JComponent comp, int aFlag);
  59 
  60         void compWriteObjectNotify(JComponent comp);
  61     }
  62 
  63     /**
  64      * An accessor for the JTextComponent class.
  65      * Note that we intentionally introduce the JTextComponentAccessor,
  66      * and not the JComponentAccessor because the needed methods
  67      * aren't override methods.
  68      */
  69     public interface JTextComponentAccessor {
  70 
  71         /**
  72          * Calculates a custom drop location for the text component,
  73          * representing where a drop at the given point should insert data.
  74          */
  75         TransferHandler.DropLocation dropLocationForPoint(JTextComponent textComp, Point p);
  76 
  77         /**
  78          * Called to set or clear the drop location during a DnD operation.
  79          */
  80         Object setDropLocation(JTextComponent textComp, TransferHandler.DropLocation location,
  81                                Object state, boolean forDrop);
  82     }
  83 
  84     /**
  85      * An accessor for the JLightweightFrame class.
  86      */
  87     public interface JLightweightFrameAccessor {
  88         /**
  89          * Notifies the JLightweight frame that it needs to update a cursor
  90          */
  91         void updateCursor(JLightweightFrame frame);
  92     }
  93 
  94     /**
  95      * An accessor for the UIDefaults class.
  96      */
  97     public interface UIDefaultsAccessor {
  98         /**
  99          * Adds a resource bundle to the list of resource bundles.
 100          */
 101         void addInternalBundle(UIDefaults uiDefaults, String bundleName);
 102     }
 103 
 104     /**
 105      * An accessor for the RepaintManager class.
 106      */
 107     public interface RepaintManagerAccessor {
 108         void addRepaintListener(RepaintManager rm, SwingUtilities2.RepaintListener l);
 109         void removeRepaintListener(RepaintManager rm, SwingUtilities2.RepaintListener l);
 110     }
 111 
 112     /**
 113      * An accessor for PopupFactory class.
 114      */
 115     public interface PopupFactoryAccessor {
 116         Popup getHeavyWeightPopup(PopupFactory factory, Component owner, Component contents,
 117                                   int ownerX, int ownerY);
 118     }
 119 
 120     /*
 121      * An accessor for the KeyStroke class
 122      */
 123     public interface KeyStrokeAccessor {
 124 
 125         KeyStroke create();
 126     }
 127 
 128     /**
 129      * The javax.swing.JComponent class accessor object.
 130      */
 131     private static JComponentAccessor jComponentAccessor;
 132 
 133     /**
 134      * Set an accessor object for the javax.swing.JComponent class.
 135      */
 136     public static void setJComponentAccessor(JComponentAccessor jCompAccessor) {
 137         jComponentAccessor = jCompAccessor;
 138     }
 139 
 140     /**
 141      * Retrieve the accessor object for the javax.swing.JComponent class.
 142      */
 143     public static JComponentAccessor getJComponentAccessor() {
 144         if (jComponentAccessor == null) {
 145             unsafe.ensureClassInitialized(JComponent.class);
 146         }
 147 
 148         return jComponentAccessor;
 149     }
 150 
 151     /**
 152      * The javax.swing.text.JTextComponent class accessor object.
 153      */
 154     private static JTextComponentAccessor jtextComponentAccessor;
 155 
 156     /**
 157      * Set an accessor object for the javax.swing.text.JTextComponent class.
 158      */
 159     public static void setJTextComponentAccessor(JTextComponentAccessor jtca) {
 160          jtextComponentAccessor = jtca;
 161     }
 162 
 163     /**
 164      * Retrieve the accessor object for the javax.swing.text.JTextComponent class.
 165      */
 166     public static JTextComponentAccessor getJTextComponentAccessor() {
 167         if (jtextComponentAccessor == null) {
 168             unsafe.ensureClassInitialized(JTextComponent.class);
 169         }
 170 
 171         return jtextComponentAccessor;
 172     }
 173 
 174     /**
 175      * The JLightweightFrame class accessor object
 176      */
 177     private static JLightweightFrameAccessor jLightweightFrameAccessor;
 178 
 179     /**
 180      * Set an accessor object for the JLightweightFrame class.
 181      */
 182     public static void setJLightweightFrameAccessor(JLightweightFrameAccessor accessor) {
 183         jLightweightFrameAccessor = accessor;
 184     }
 185 
 186     /**
 187      * Retrieve the accessor object for the JLightweightFrame class
 188      */
 189     public static JLightweightFrameAccessor getJLightweightFrameAccessor() {
 190         if (jLightweightFrameAccessor == null) {
 191             unsafe.ensureClassInitialized(JLightweightFrame.class);
 192         }
 193         return jLightweightFrameAccessor;
 194     }
 195 
 196     /**
 197      * The UIDefaults class accessor object
 198      */
 199     private static UIDefaultsAccessor uiDefaultsAccessor;
 200 
 201     /**
 202      * Set an accessor object for the UIDefaults class.
 203      */
 204     public static void setUIDefaultsAccessor(UIDefaultsAccessor accessor) {
 205         uiDefaultsAccessor = accessor;
 206     }
 207 
 208     /**
 209      * Retrieve the accessor object for the JLightweightFrame class
 210      */
 211     public static UIDefaultsAccessor getUIDefaultsAccessor() {
 212         if (uiDefaultsAccessor == null) {
 213             unsafe.ensureClassInitialized(UIDefaults.class);
 214         }
 215         return uiDefaultsAccessor;
 216     }
 217 
 218     /**
 219      * The RepaintManager class accessor object.
 220      */
 221     private static RepaintManagerAccessor repaintManagerAccessor;
 222 
 223     /**
 224      * Set an accessor object for the RepaintManager class.
 225      */
 226     public static void setRepaintManagerAccessor(RepaintManagerAccessor accessor) {
 227         repaintManagerAccessor = accessor;
 228     }
 229 
 230     /**
 231      * Retrieve the accessor object for the RepaintManager class.
 232      */
 233     public static RepaintManagerAccessor getRepaintManagerAccessor() {
 234         if (repaintManagerAccessor == null) {
 235             unsafe.ensureClassInitialized(RepaintManager.class);
 236         }
 237         return repaintManagerAccessor;
 238     }
 239 
 240     /**
 241      * The PopupFactory class accessor object.
 242      */
 243     private static PopupFactoryAccessor popupFactoryAccessor;
 244 
 245     /**
 246      * Retrieve the accessor object for the PopupFactory class.
 247      */
 248     public static PopupFactoryAccessor getPopupFactoryAccessor() {
 249         if (popupFactoryAccessor == null) {
 250             unsafe.ensureClassInitialized(PopupFactory.class);
 251         }
 252         return popupFactoryAccessor;
 253     }
 254 
 255     /**
 256      * Set an Accessor object for the PopupFactory class.
 257      */
 258     public static void setPopupFactoryAccessor(PopupFactoryAccessor popupFactoryAccessor) {
 259         SwingAccessor.popupFactoryAccessor = popupFactoryAccessor;
 260     }
 261 
 262     /**
 263      * The KeyStroke class accessor object.
 264      */
 265     private static KeyStrokeAccessor keyStrokeAccessor;
 266 
 267     /**
 268      * Retrieve the accessor object for the KeyStroke class.
 269      */
 270     public static KeyStrokeAccessor getKeyStrokeAccessor() {
 271         if (keyStrokeAccessor == null) {
 272             unsafe.ensureClassInitialized(KeyStroke.class);
 273         }
 274         return keyStrokeAccessor;
 275     }
 276 
 277     /*
 278      * Set the accessor object for the KeyStroke class.
 279      */
 280     public static void setKeyStrokeAccessor(KeyStrokeAccessor accessor) {
 281         SwingAccessor.keyStrokeAccessor = accessor;
 282     }
 283 }