# HG changeset patch # User yan # Date 1246432622 25200 # Node ID 4c616e2ae07bb9b35f0a5317c98c733dbf2fe0bb # Parent dfd8506f74c3731bb169ce93c72612d78ee0413b# Parent a0ed74718a4b60c8b06a0378fb388192d1b6091c Merge diff -r dfd8506f74c3 -r 4c616e2ae07b jdk/make/sun/xawt/mapfile-vers --- a/jdk/make/sun/xawt/mapfile-vers Wed Jul 05 16:55:26 2017 +0200 +++ b/jdk/make/sun/xawt/mapfile-vers Wed Jul 01 00:17:02 2009 -0700 @@ -125,6 +125,7 @@ Java_sun_awt_X11_XlibWrapper_XFree; Java_sun_awt_X11_XlibWrapper_ServerVendor; Java_sun_awt_X11_XlibWrapper_VendorRelease; + Java_sun_awt_X11_XlibWrapper_IsXsunKPBehavior; Java_sun_awt_X11_XlibWrapper_SetToolkitErrorHandler; Java_sun_awt_X11_XlibWrapper_XSetErrorHandler; Java_sun_awt_X11_XlibWrapper_CallErrorHandler; diff -r dfd8506f74c3 -r 4c616e2ae07b jdk/src/share/classes/java/awt/AWTEvent.java --- a/jdk/src/share/classes/java/awt/AWTEvent.java Wed Jul 05 16:55:26 2017 +0200 +++ b/jdk/src/share/classes/java/awt/AWTEvent.java Wed Jul 01 00:17:02 2009 -0700 @@ -32,6 +32,7 @@ import java.lang.reflect.Field; import java.util.logging.Logger; import java.util.logging.Level; +import sun.awt.AWTAccessor; /** * The root event class for all AWT events. @@ -230,6 +231,12 @@ if (!GraphicsEnvironment.isHeadless()) { initIDs(); } + AWTAccessor.setAWTEventAccessor( + new AWTAccessor.AWTEventAccessor() { + public void setPosted(AWTEvent ev) { + ev.isPosted = true; + } + }); } private static synchronized Field get_InputEvent_CanAccessSystemClipboard() { diff -r dfd8506f74c3 -r 4c616e2ae07b jdk/src/share/classes/java/awt/Component.java --- a/jdk/src/share/classes/java/awt/Component.java Wed Jul 05 16:55:26 2017 +0200 +++ b/jdk/src/share/classes/java/awt/Component.java Wed Jul 01 00:17:02 2009 -0700 @@ -861,6 +861,17 @@ public boolean isVisible_NoClientCode(Component comp) { return comp.isVisible_NoClientCode(); } + public void setRequestFocusController + (RequestFocusController requestController) + { + Component.setRequestFocusController(requestController); + } + public AppContext getAppContext(Component comp) { + return comp.appContext; + } + public void setAppContext(Component comp, AppContext appContext) { + comp.appContext = appContext; + } }); } @@ -9824,31 +9835,6 @@ // ****************** END OF MIXING CODE ******************************** - private static boolean doesClassImplement(Class cls, String interfaceName) { - if (cls == null) return false; - - for (Class c : cls.getInterfaces()) { - if (c.getName().equals(interfaceName)) { - return true; - } - } - return doesClassImplement(cls.getSuperclass(), interfaceName); - } - - /** - * Checks that the given object implements the given interface. - * @param obj Object to be checked - * @param interfaceName The name of the interface. Must be fully-qualified interface name. - * @return true, if this object implements the given interface, - * false, otherwise, or if obj or interfaceName is null - */ - static boolean doesImplement(Object obj, String interfaceName) { - if (obj == null) return false; - if (interfaceName == null) return false; - - return doesClassImplement(obj.getClass(), interfaceName); - } - // Note that the method is overriden in the Window class, // a window doesn't need to be updated in the Z-order. void updateZOrder() { diff -r dfd8506f74c3 -r 4c616e2ae07b jdk/src/share/classes/java/awt/ContainerOrderFocusTraversalPolicy.java --- a/jdk/src/share/classes/java/awt/ContainerOrderFocusTraversalPolicy.java Wed Jul 05 16:55:26 2017 +0200 +++ b/jdk/src/share/classes/java/awt/ContainerOrderFocusTraversalPolicy.java Wed Jul 01 00:17:02 2009 -0700 @@ -425,15 +425,13 @@ } if (log.isLoggable(Level.FINE)) log.fine("### Cycle is " + cycle); - for (int i = 0; i < cycle.size(); i++) { - Component comp = cycle.get(i); + for (Component comp : cycle) { if (accept(comp)) { return comp; - } else if (comp instanceof Container && comp != aContainer) { - Container cont = (Container)comp; - if (cont.isFocusTraversalPolicyProvider()) { - return cont.getFocusTraversalPolicy().getDefaultComponent(cont); - } + } else if (comp != aContainer && + (comp = getComponentDownCycle(comp, FORWARD_TRAVERSAL)) != null) + { + return comp; } } } diff -r dfd8506f74c3 -r 4c616e2ae07b jdk/src/share/classes/java/awt/Dialog.java --- a/jdk/src/share/classes/java/awt/Dialog.java Wed Jul 05 16:55:26 2017 +0200 +++ b/jdk/src/share/classes/java/awt/Dialog.java Wed Jul 01 00:17:02 2009 -0700 @@ -262,12 +262,6 @@ TOOLKIT_EXCLUDE }; - /** - * @since 1.6 - */ - private final static ModalExclusionType DEFAULT_MODAL_EXCLUSION_TYPE = - ModalExclusionType.APPLICATION_EXCLUDE; - /* operations with this list should be synchronized on tree lock*/ transient static IdentityArrayList<Dialog> modalDialogs = new IdentityArrayList<Dialog>(); diff -r dfd8506f74c3 -r 4c616e2ae07b jdk/src/share/classes/java/awt/EventQueue.java --- a/jdk/src/share/classes/java/awt/EventQueue.java Wed Jul 05 16:55:26 2017 +0200 +++ b/jdk/src/share/classes/java/awt/EventQueue.java Wed Jul 01 00:17:02 2009 -0700 @@ -43,6 +43,7 @@ import sun.awt.PeerEvent; import sun.awt.SunToolkit; import sun.awt.EventQueueItem; +import sun.awt.AWTAccessor; /** * <code>EventQueue</code> is a platform-independent class @@ -154,6 +155,18 @@ private static final Logger eventLog = Logger.getLogger("java.awt.event.EventQueue"); + static { + AWTAccessor.setEventQueueAccessor( + new AWTAccessor.EventQueueAccessor() { + public EventQueue getNextQueue(EventQueue eventQueue) { + return eventQueue.nextQueue; + } + public Thread getDispatchThread(EventQueue eventQueue) { + return eventQueue.dispatchThread; + } + }); + } + public EventQueue() { for (int i = 0; i < NUM_PRIORITIES; i++) { queues[i] = new Queue(); diff -r dfd8506f74c3 -r 4c616e2ae07b jdk/src/share/classes/java/awt/MenuComponent.java --- a/jdk/src/share/classes/java/awt/MenuComponent.java Wed Jul 05 16:55:26 2017 +0200 +++ b/jdk/src/share/classes/java/awt/MenuComponent.java Wed Jul 01 00:17:02 2009 -0700 @@ -30,6 +30,7 @@ import java.io.ObjectInputStream; import sun.awt.AppContext; import sun.awt.SunToolkit; +import sun.awt.AWTAccessor; import javax.accessibility.*; /** @@ -109,6 +110,22 @@ */ private static final long serialVersionUID = -4536902356223894379L; + static { + AWTAccessor.setMenuComponentAccessor( + new AWTAccessor.MenuComponentAccessor() { + public AppContext getAppContext(MenuComponent menuComp) { + return menuComp.appContext; + } + public void setAppContext(MenuComponent menuComp, + AppContext appContext) { + menuComp.appContext = appContext; + } + public MenuContainer getParent(MenuComponent menuComp) { + return menuComp.parent; + } + }); + } + /** * Creates a <code>MenuComponent</code>. * @exception HeadlessException if diff -r dfd8506f74c3 -r 4c616e2ae07b jdk/src/share/classes/java/awt/PopupMenu.java --- a/jdk/src/share/classes/java/awt/PopupMenu.java Wed Jul 05 16:55:26 2017 +0200 +++ b/jdk/src/share/classes/java/awt/PopupMenu.java Wed Jul 01 00:17:02 2009 -0700 @@ -28,6 +28,7 @@ import java.awt.peer.PopupMenuPeer; import javax.accessibility.*; +import sun.awt.AWTAccessor; /** * A class that implements a menu which can be dynamically popped up @@ -48,6 +49,15 @@ transient boolean isTrayIconPopup = false; + static { + AWTAccessor.setPopupMenuAccessor( + new AWTAccessor.PopupMenuAccessor() { + public boolean isTrayIconPopup(PopupMenu popupMenu) { + return popupMenu.isTrayIconPopup; + } + }); + } + /* * JDK 1.1 serialVersionUID */ diff -r dfd8506f74c3 -r 4c616e2ae07b jdk/src/share/classes/java/awt/Window.java --- a/jdk/src/share/classes/java/awt/Window.java Wed Jul 05 16:55:26 2017 +0200 +++ b/jdk/src/share/classes/java/awt/Window.java Wed Jul 01 00:17:02 2009 -0700 @@ -3658,7 +3658,7 @@ private static void setLayersOpaque(Component component, boolean isOpaque) { // Shouldn't use instanceof to avoid loading Swing classes // if it's a pure AWT application. - if (Component.doesImplement(component, "javax.swing.RootPaneContainer")) { + if (SunToolkit.isInstanceOf(component, "javax.swing.RootPaneContainer")) { javax.swing.RootPaneContainer rpc = (javax.swing.RootPaneContainer)component; javax.swing.JRootPane root = rpc.getRootPane(); javax.swing.JLayeredPane lp = root.getLayeredPane(); @@ -3797,6 +3797,10 @@ { return window.calculateSecurityWarningPosition(x, y, w, h); } + + public void setLWRequestStatus(Window changed, boolean status) { + changed.syncLWRequests = status; + } }); // WindowAccessor } // static diff -r dfd8506f74c3 -r 4c616e2ae07b jdk/src/share/classes/javax/swing/BufferStrategyPaintManager.java --- a/jdk/src/share/classes/javax/swing/BufferStrategyPaintManager.java Wed Jul 05 16:55:26 2017 +0200 +++ b/jdk/src/share/classes/javax/swing/BufferStrategyPaintManager.java Wed Jul 01 00:17:02 2009 -0700 @@ -36,6 +36,7 @@ import sun.awt.SubRegionShowable; import sun.java2d.SunGraphics2D; import sun.security.action.GetPropertyAction; +import sun.awt.SunToolkit; /** * A PaintManager implementation that uses a BufferStrategy for @@ -579,8 +580,9 @@ rootJ = c; root = c; xOffset = yOffset = 0; - while (root != null && (!(root instanceof Window) && - !(root instanceof Applet))) { + while (root != null && + (!(root instanceof Window) && + !SunToolkit.isInstanceOf(root, "java.applet.Applet"))) { xOffset += root.getX(); yOffset += root.getY(); root = root.getParent(); @@ -853,7 +855,7 @@ new ImageCapabilities(true), type); BufferStrategy bs = null; - if (root instanceof Applet) { + if (SunToolkit.isInstanceOf(root, "java.applet.Applet")) { try { getCreateBufferStrategyMethod().invoke(root, 2, caps); bs = (BufferStrategy)getGetBufferStrategyMethod(). diff -r dfd8506f74c3 -r 4c616e2ae07b jdk/src/share/classes/javax/swing/JLayeredPane.java --- a/jdk/src/share/classes/javax/swing/JLayeredPane.java Wed Jul 05 16:55:26 2017 +0200 +++ b/jdk/src/share/classes/javax/swing/JLayeredPane.java Wed Jul 01 00:17:02 2009 -0700 @@ -30,6 +30,7 @@ import java.awt.Color; import java.awt.Graphics; import java.awt.Rectangle; +import sun.awt.SunToolkit; import javax.accessibility.*; @@ -195,9 +196,12 @@ for (Component c : getComponents()) { layer = null; - if(c instanceof JInternalFrame || (c instanceof JComponent && - (layer = (Integer)((JComponent)c).getClientProperty( - LAYER_PROPERTY)) != null)) { + + if(SunToolkit.isInstanceOf(c, "javax.swing.JInternalFrame") || + (c instanceof JComponent && + (layer = (Integer)((JComponent)c). + getClientProperty(LAYER_PROPERTY)) != null)) + { if(layer != null && layer.equals(FRAME_CONTENT_LAYER)) continue; layeredComponentFound = true; diff -r dfd8506f74c3 -r 4c616e2ae07b jdk/src/share/classes/javax/swing/LayoutFocusTraversalPolicy.java --- a/jdk/src/share/classes/javax/swing/LayoutFocusTraversalPolicy.java Wed Jul 05 16:55:26 2017 +0200 +++ b/jdk/src/share/classes/javax/swing/LayoutFocusTraversalPolicy.java Wed Jul 01 00:17:02 2009 -0700 @@ -29,6 +29,7 @@ import java.awt.ComponentOrientation; import java.util.Comparator; import java.io.*; +import sun.awt.SunToolkit; /** @@ -226,11 +227,11 @@ protected boolean accept(Component aComponent) { if (!super.accept(aComponent)) { return false; - } else if (aComponent instanceof JTable) { + } else if (SunToolkit.isInstanceOf(aComponent, "javax.swing.JTable")) { // JTable only has ancestor focus bindings, we thus force it // to be focusable by returning true here. return true; - } else if (aComponent instanceof JComboBox) { + } else if (SunToolkit.isInstanceOf(aComponent, "javax.swing.JComboBox")) { JComboBox box = (JComboBox)aComponent; return box.getUI().isFocusTraversable(box); } else if (aComponent instanceof JComponent) { diff -r dfd8506f74c3 -r 4c616e2ae07b jdk/src/share/classes/javax/swing/LookAndFeel.java --- a/jdk/src/share/classes/javax/swing/LookAndFeel.java Wed Jul 05 16:55:26 2017 +0200 +++ b/jdk/src/share/classes/javax/swing/LookAndFeel.java Wed Jul 01 00:17:02 2009 -0700 @@ -32,6 +32,7 @@ import java.awt.Component; import java.awt.SystemColor; import java.awt.Toolkit; +import sun.awt.SunToolkit; import javax.swing.text.*; import javax.swing.border.*; @@ -271,7 +272,7 @@ // this is a special case because the JPasswordField's ancestor heirarchy // includes a class outside of javax.swing, thus we cannot call setUIProperty // directly. - if (c instanceof JPasswordField) { + if (SunToolkit.isInstanceOf(c, "javax.swing.JPasswordField")) { if (!((JPasswordField)c).customSetUIProperty(propertyName, propertyValue)) { c.setUIProperty(propertyName, propertyValue); } diff -r dfd8506f74c3 -r 4c616e2ae07b jdk/src/share/classes/javax/swing/SortingFocusTraversalPolicy.java --- a/jdk/src/share/classes/javax/swing/SortingFocusTraversalPolicy.java Wed Jul 05 16:55:26 2017 +0200 +++ b/jdk/src/share/classes/javax/swing/SortingFocusTraversalPolicy.java Wed Jul 01 00:17:02 2009 -0700 @@ -444,11 +444,10 @@ for (Component comp : cycle) { if (accept(comp)) { return comp; - } else if (comp instanceof Container && comp != aContainer) { - Container cont = (Container)comp; - if (cont.isFocusTraversalPolicyProvider()) { - return cont.getFocusTraversalPolicy().getDefaultComponent(cont); - } + } else if (comp != aContainer && + (comp = getComponentDownCycle(comp, FORWARD_TRAVERSAL)) != null) + { + return comp; } } return null; diff -r dfd8506f74c3 -r 4c616e2ae07b jdk/src/share/classes/javax/swing/TransferHandler.java --- a/jdk/src/share/classes/javax/swing/TransferHandler.java Wed Jul 05 16:55:26 2017 +0200 +++ b/jdk/src/share/classes/javax/swing/TransferHandler.java Wed Jul 01 00:17:02 2009 -0700 @@ -40,6 +40,7 @@ import sun.swing.SwingUtilities2; import sun.awt.AppContext; import sun.swing.*; +import sun.awt.SunToolkit; /** * This class is used to handle the transfer of a <code>Transferable</code> @@ -283,19 +284,9 @@ ? ((DropTargetDragEvent)source).getLocation() : ((DropTargetDropEvent)source).getLocation(); - if (component instanceof JTextComponent) { - try { - AccessibleMethod method - = new AccessibleMethod(JTextComponent.class, - "dropLocationForPoint", - Point.class); - - dropLocation = - (DropLocation)method.invokeNoChecked(component, p); - } catch (NoSuchMethodException e) { - throw new AssertionError( - "Couldn't locate method JTextComponent.dropLocationForPoint"); - } + if (SunToolkit.isInstanceOf(component, "javax.swing.text.JTextComponent")) { + dropLocation = SwingAccessor.getJTextComponentAccessor(). + dropLocationForPoint((JTextComponent)component, p); } else if (component instanceof JComponent) { dropLocation = ((JComponent)component).dropLocationForPoint(p); } @@ -1373,22 +1364,9 @@ ? null : support.getDropLocation(); - if (component instanceof JTextComponent) { - try { - AccessibleMethod method = - new AccessibleMethod(JTextComponent.class, - "setDropLocation", - DropLocation.class, - Object.class, - Boolean.TYPE); - - state = - method.invokeNoChecked(component, dropLocation, - state, forDrop); - } catch (NoSuchMethodException e) { - throw new AssertionError( - "Couldn't locate method JTextComponet.setDropLocation"); - } + if (SunToolkit.isInstanceOf(component, "javax.swing.text.JTextComponent")) { + state = SwingAccessor.getJTextComponentAccessor(). + setDropLocation((JTextComponent)component, dropLocation, state, forDrop); } else if (component instanceof JComponent) { state = ((JComponent)component).setDropLocation(dropLocation, state, forDrop); } diff -r dfd8506f74c3 -r 4c616e2ae07b jdk/src/share/classes/javax/swing/UIManager.java --- a/jdk/src/share/classes/javax/swing/UIManager.java Wed Jul 05 16:55:26 2017 +0200 +++ b/jdk/src/share/classes/javax/swing/UIManager.java Wed Jul 01 00:17:02 2009 -0700 @@ -60,6 +60,7 @@ import java.lang.reflect.Method; import java.util.HashMap; import sun.awt.AppContext; +import sun.awt.AWTAccessor; /** @@ -1472,21 +1473,7 @@ return false; } }); - try { - Method setRequestFocusControllerM = java.security.AccessController.doPrivileged( - new java.security.PrivilegedExceptionAction<Method>() { - public Method run() throws Exception { - Method method = - Component.class.getDeclaredMethod("setRequestFocusController", - sun.awt.RequestFocusController.class); - method.setAccessible(true); - return method; - } - }); - setRequestFocusControllerM.invoke(null, JComponent.focusController); - } catch (Exception e) { - // perhaps we should log this - assert false; - } + AWTAccessor.getComponentAccessor(). + setRequestFocusController(JComponent.focusController); } } diff -r dfd8506f74c3 -r 4c616e2ae07b jdk/src/share/classes/javax/swing/text/JTextComponent.java --- a/jdk/src/share/classes/javax/swing/text/JTextComponent.java Wed Jul 05 16:55:26 2017 +0200 +++ b/jdk/src/share/classes/javax/swing/text/JTextComponent.java Wed Jul 01 00:17:02 2009 -0700 @@ -76,6 +76,7 @@ import sun.swing.PrintingStatus; import sun.swing.SwingUtilities2; import sun.swing.text.TextComponentPrintable; +import sun.swing.SwingAccessor; /** * <code>JTextComponent</code> is the base class for swing text @@ -761,6 +762,23 @@ return dropMode; } + static { + SwingAccessor.setJTextComponentAccessor( + new SwingAccessor.JTextComponentAccessor() { + public TransferHandler.DropLocation dropLocationForPoint(JTextComponent textComp, + Point p) + { + return textComp.dropLocationForPoint(p); + } + public Object setDropLocation(JTextComponent textComp, + TransferHandler.DropLocation location, + Object state, boolean forDrop) + { + return textComp.setDropLocation(location, state, forDrop); + } + }); + } + /** * Calculates a drop location in this component, representing where a diff -r dfd8506f74c3 -r 4c616e2ae07b jdk/src/share/classes/sun/awt/AWTAccessor.java --- a/jdk/src/share/classes/sun/awt/AWTAccessor.java Wed Jul 05 16:55:26 2017 +0200 +++ b/jdk/src/share/classes/sun/awt/AWTAccessor.java Wed Jul 01 00:17:02 2009 -0700 @@ -30,6 +30,7 @@ import java.awt.image.BufferedImage; import sun.misc.Unsafe; +import java.awt.peer.ComponentPeer; /** * The AWTAccessor utility class. @@ -98,6 +99,21 @@ * any client code. */ boolean isVisible_NoClientCode(Component comp); + + /** + * Sets the RequestFocusController. + */ + void setRequestFocusController(RequestFocusController requestController); + + /** + * Returns the appContext of the component. + */ + AppContext getAppContext(Component comp); + + /** + * Sets the appContext of the component. + */ + void setAppContext(Component comp, AppContext appContext); } /* @@ -153,23 +169,21 @@ */ Point2D calculateSecurityWarningPosition(Window window, double x, double y, double w, double h); + + /** Sets the synchronous status of focus requests on lightweight + * components in the specified window to the specified value. + */ + void setLWRequestStatus(Window changed, boolean status); } /* * An accessor for the AWTEvent class. */ public interface AWTEventAccessor { - /* - * - * Sets the flag on this AWTEvent indicating that it was - * generated by the system. + /** + * Marks the event as posted. */ - void setSystemGenerated(AWTEvent ev); - /* - * - * Indicates whether this AWTEvent was generated by the system. - */ - boolean isSystemGenerated(AWTEvent ev); + void setPosted(AWTEvent ev); } /* @@ -216,6 +230,51 @@ } /* + * An accessor for the MenuComponent class. + */ + public interface MenuComponentAccessor { + /** + * Returns the appContext of the menu component. + */ + AppContext getAppContext(MenuComponent menuComp); + + /** + * Sets the appContext of the menu component. + */ + void setAppContext(MenuComponent menuComp, AppContext appContext); + + /** + * Returns the menu container of the menu component + */ + MenuContainer getParent(MenuComponent menuComp); + } + + /* + * An accessor for the EventQueue class + */ + public interface EventQueueAccessor { + /* + * Gets the next event queue. + */ + EventQueue getNextQueue(EventQueue eventQueue); + /* + * Gets the event dispatch thread. + */ + Thread getDispatchThread(EventQueue eventQueue); + } + + /* + * An accessor for the PopupMenu class + */ + public interface PopupMenuAccessor { + /* + * Returns whether the popup menu is attached to a tray + */ + boolean isTrayIconPopup(PopupMenu popupMenu); + } + + + /* * The java.awt.Component class accessor object. */ private static ComponentAccessor componentAccessor; @@ -241,6 +300,21 @@ private static KeyboardFocusManagerAccessor kfmAccessor; /* + * The java.awt.MenuComponent class accessor object. + */ + private static MenuComponentAccessor menuComponentAccessor; + + /* + * The java.awt.EventQueue class accessor object. + */ + private static EventQueueAccessor eventQueueAccessor; + + /* + * The java.awt.PopupMenu class accessor object. + */ + private static PopupMenuAccessor popupMenuAccessor; + + /* * Set an accessor object for the java.awt.Component class. */ public static void setComponentAccessor(ComponentAccessor ca) { @@ -286,6 +360,9 @@ * Retrieve the accessor object for the java.awt.AWTEvent class. */ public static AWTEventAccessor getAWTEventAccessor() { + if (awtEventAccessor == null) { + unsafe.ensureClassInitialized(AWTEvent.class); + } return awtEventAccessor; } @@ -322,4 +399,55 @@ } return kfmAccessor; } + + /* + * Set an accessor object for the java.awt.MenuComponent class. + */ + public static void setMenuComponentAccessor(MenuComponentAccessor mca) { + menuComponentAccessor = mca; + } + + /* + * Retrieve the accessor object for the java.awt.MenuComponent class. + */ + public static MenuComponentAccessor getMenuComponentAccessor() { + if (menuComponentAccessor == null) { + unsafe.ensureClassInitialized(MenuComponent.class); + } + return menuComponentAccessor; + } + + /* + * Set an accessor object for the java.awt.EventQueue class. + */ + public static void setEventQueueAccessor(EventQueueAccessor eqa) { + eventQueueAccessor = eqa; + } + + /* + * Retrieve the accessor object for the java.awt.EventQueue class. + */ + public static EventQueueAccessor getEventQueueAccessor() { + if (eventQueueAccessor == null) { + unsafe.ensureClassInitialized(EventQueue.class); + } + return eventQueueAccessor; + } + + /* + * Set an accessor object for the java.awt.PopupMenu class. + */ + public static void setPopupMenuAccessor(PopupMenuAccessor pma) { + popupMenuAccessor = pma; + } + + /* + * Retrieve the accessor object for the java.awt.PopupMenu class. + */ + public static PopupMenuAccessor getPopupMenuAccessor() { + if (popupMenuAccessor == null) { + unsafe.ensureClassInitialized(PopupMenu.class); + } + return popupMenuAccessor; + } } diff -r dfd8506f74c3 -r 4c616e2ae07b jdk/src/share/classes/sun/awt/SunToolkit.java --- a/jdk/src/share/classes/sun/awt/SunToolkit.java Wed Jul 05 16:55:26 2017 +0200 +++ b/jdk/src/share/classes/sun/awt/SunToolkit.java Wed Jul 01 00:17:02 2009 -0700 @@ -77,14 +77,7 @@ */ public static final int GRAB_EVENT_MASK = 0x80000000; - private static Field syncLWRequestsField; private static Method wakeupMethod; - private static Field componentKeyField; - private static Field menuComponentKeyField; - private static Field trayIconKeyField; - private static Field componentAppContextField; - private static Field menuComponentAppContextField; - private static Field isPostedField; /* The key to put()/get() the PostEventQueue into/from the AppContext. */ private static final String POST_EVENT_QUEUE_KEY = "PostEventQueue"; @@ -422,32 +415,21 @@ private static final Map appContextMap = Collections.synchronizedMap(new WeakHashMap()); - /** * Sets the appContext field of target. If target is not a Component or * MenuComponent, this returns false. */ - private static boolean setAppContext(Object target, AppContext context) - { - if (!(target instanceof Component) && !(target instanceof MenuComponent)) { + private static boolean setAppContext(Object target, + AppContext context) { + if (target instanceof Component) { + AWTAccessor.getComponentAccessor(). + setAppContext((Component)target, context); + } else if (target instanceof MenuComponent) { + AWTAccessor.getMenuComponentAccessor(). + setAppContext((MenuComponent)target, context); + } else { return false; } - try{ - if (target instanceof Component){ - if (componentAppContextField == null) { - componentAppContextField = getField(Component.class, "appContext"); - } - componentAppContextField.set(target, context); - } else if (target instanceof MenuComponent) { - if (menuComponentAppContextField == null) { - menuComponentAppContextField = getField(MenuComponent.class, "appContext"); - } - menuComponentAppContextField.set(target, context); - } - } catch( IllegalAccessException e){ - assert false; - } - return true; } @@ -456,23 +438,15 @@ * Component or MenuComponent this returns null. */ private static AppContext getAppContext(Object target) { - AppContext retObj = null; - try{ - if (target instanceof Component){ - if (componentAppContextField == null) { - componentAppContextField = getField(Component.class, "appContext"); - } - retObj = (AppContext) componentAppContextField.get(target); - } else if (target instanceof MenuComponent) { - if (menuComponentAppContextField == null) { - menuComponentAppContextField = getField(MenuComponent.class, "appContext"); - } - retObj = (AppContext) menuComponentAppContextField.get(target); - } - } catch( IllegalAccessException e){ - assert false; + if (target instanceof Component) { + return AWTAccessor.getComponentAccessor(). + getAppContext((Component)target); + } else if (target instanceof MenuComponent) { + return AWTAccessor.getMenuComponentAccessor(). + getAppContext((MenuComponent)target); + } else { + return null; } - return retObj; } /* @@ -520,16 +494,7 @@ */ public static void setLWRequestStatus(Window changed,boolean status){ - if (syncLWRequestsField == null){ - syncLWRequestsField = getField(Window.class, "syncLWRequests"); - } - try{ - if (syncLWRequestsField != null){ - syncLWRequestsField.setBoolean(changed, status); - } - } catch( IllegalAccessException e){ - assert false; - } + AWTAccessor.getWindowAccessor().setLWRequestStatus(changed, status); }; public static void checkAndSetPolicy(Container cont, boolean isSwingCont) @@ -637,18 +602,9 @@ * Post AWTEvent of high priority. */ public static void postPriorityEvent(final AWTEvent e) { - if (isPostedField == null) { - isPostedField = getField(AWTEvent.class, "isPosted"); - } PeerEvent pe = new PeerEvent(Toolkit.getDefaultToolkit(), new Runnable() { public void run() { - try { - isPostedField.setBoolean(e, true); - } catch (IllegalArgumentException e) { - assert(false); - } catch (IllegalAccessException e) { - assert(false); - } + AWTAccessor.getAWTEventAccessor().setPosted(e); ((Component)e.getSource()).dispatchEvent(e); } }, PeerEvent.ULTIMATE_PRIORITY_EVENT); @@ -757,36 +713,6 @@ } /* - * Returns next queue for the given EventQueue which has private access - */ - private static EventQueue getNextQueue(final Object o) { - EventQueue result = null; - try{ - Field nextQueueField = getField(EventQueue.class, - "nextQueue"); - result = (EventQueue)nextQueueField.get(o); - } catch( IllegalAccessException e){ - assert false; - } - return result; - } - - /* - * Returns dispatch thread for the given EventQueue which has private access - */ - private static Thread getDispatchThread(final Object o) { - Thread result = null; - try{ - Field dispatchThreadField = getField(EventQueue.class, - "dispatchThread"); - result = (Thread)dispatchThreadField.get(o); - } catch( IllegalAccessException e){ - assert false; - } - return result; - } - - /* * Returns true if the calling thread is the event dispatch thread * contained within AppContext which associated with the given target. * Use this call to ensure that a given task is being executed @@ -796,13 +722,14 @@ AppContext appContext = targetToAppContext(target); EventQueue eq = (EventQueue)appContext.get(AppContext.EVENT_QUEUE_KEY); - EventQueue next = getNextQueue(eq); + AWTAccessor.EventQueueAccessor accessor = AWTAccessor.getEventQueueAccessor(); + EventQueue next = accessor.getNextQueue(eq); while (next != null) { eq = next; - next = getNextQueue(eq); + next = accessor.getNextQueue(eq); } - return (Thread.currentThread() == getDispatchThread(eq)); + return (Thread.currentThread() == accessor.getDispatchThread(eq)); } public Dimension getScreenSize() { @@ -1356,22 +1283,7 @@ return false; } - private static Dialog.ModalExclusionType DEFAULT_MODAL_EXCLUSION_TYPE; - - static { - DEFAULT_MODAL_EXCLUSION_TYPE = (Dialog.ModalExclusionType)AccessController.doPrivileged(new PrivilegedAction() { - public Object run() { - Dialog.ModalExclusionType defaultType = Dialog.ModalExclusionType.NO_EXCLUDE; - try { - java.lang.reflect.Field f = Dialog.class.getDeclaredField("DEFAULT_MODAL_EXCLUSION_TYPE"); - f.setAccessible(true); - defaultType = (Dialog.ModalExclusionType)f.get(null); - } catch (Exception e) { - } - return defaultType; - } - }); - } + private static Dialog.ModalExclusionType DEFAULT_MODAL_EXCLUSION_TYPE = null; /** * Returns whether the XEmbed server feature is requested by @@ -1430,6 +1342,9 @@ */ public static void setModalExcluded(Window window) { + if (DEFAULT_MODAL_EXCLUSION_TYPE == null) { + DEFAULT_MODAL_EXCLUSION_TYPE = Dialog.ModalExclusionType.APPLICATION_EXCLUDE; + } window.setModalExclusionType(DEFAULT_MODAL_EXCLUSION_TYPE); } @@ -1451,6 +1366,9 @@ */ public static boolean isModalExcluded(Window window) { + if (DEFAULT_MODAL_EXCLUSION_TYPE == null) { + DEFAULT_MODAL_EXCLUSION_TYPE = Dialog.ModalExclusionType.APPLICATION_EXCLUDE; + } return window.getModalExclusionType().compareTo(DEFAULT_MODAL_EXCLUSION_TYPE) >= 0; } @@ -2104,6 +2022,42 @@ public int getNumberOfButtons(){ return 3; } + + /** + * Checks that the given object implements/extends the given + * interface/class. + * + * Note that using the instanceof operator causes a class to be loaded. + * Using this method doesn't load a class and it can be used instead of + * the instanceof operator for performance reasons. + * + * @param obj Object to be checked + * @param type The name of the interface/class. Must be + * fully-qualified interface/class name. + * @return true, if this object implements/extends the given + * interface/class, false, otherwise, or if obj or type is null + */ + public static boolean isInstanceOf(Object obj, String type) { + if (obj == null) return false; + if (type == null) return false; + + return isInstanceOf(obj.getClass(), type); + } + + private static boolean isInstanceOf(Class cls, String type) { + if (cls == null) return false; + + if (cls.getName().equals(type)) { + return true; + } + + for (Class c : cls.getInterfaces()) { + if (c.getName().equals(type)) { + return true; + } + } + return isInstanceOf(cls.getSuperclass(), type); + } } // class SunToolkit diff -r dfd8506f74c3 -r 4c616e2ae07b jdk/src/share/classes/sun/awt/shell/ShellFolder.java --- a/jdk/src/share/classes/sun/awt/shell/ShellFolder.java Wed Jul 05 16:55:26 2017 +0200 +++ b/jdk/src/share/classes/sun/awt/shell/ShellFolder.java Wed Jul 01 00:17:02 2009 -0700 @@ -202,8 +202,16 @@ private static ShellFolderManager shellFolderManager; static { - Class managerClass = (Class)Toolkit.getDefaultToolkit(). - getDesktopProperty("Shell.shellFolderManager"); + String managerClassName = (String)Toolkit.getDefaultToolkit(). + getDesktopProperty("Shell.shellFolderManager"); + Class managerClass = null; + try { + managerClass = Class.forName(managerClassName); + // swallow the exceptions below and use default shell folder + } catch(ClassNotFoundException e) { + } catch(NullPointerException e) { + } + if (managerClass == null) { managerClass = ShellFolderManager.class; } diff -r dfd8506f74c3 -r 4c616e2ae07b jdk/src/share/classes/sun/swing/AccessibleMethod.java --- a/jdk/src/share/classes/sun/swing/AccessibleMethod.java Wed Jul 05 16:55:26 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,136 +0,0 @@ -/* - * Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Sun designates this - * particular file as subject to the "Classpath" exception as provided - * by Sun in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, - * CA 95054 USA or visit www.sun.com if you need additional information or - * have any questions. - */ -package sun.swing; - -import java.security.*; -import java.lang.reflect.*; - -/** - * A utility for accessing and invoking methods, via reflection, - * that would otherwise be unaccessible. - * - * @author Shannon Hickey - */ -public class AccessibleMethod { - - private final Method method; - - /** - * Construct an instance for the given params. - * - * @param klass the class to which the method belongs - * @param methodName the name of the method - * @param paramTypes the paramater type array - * @throws NullPointerException if <code>klass</code> - * or <code>name</code> is <code>null</code> - * @throws NoSuchMethodException if the method can't be found - */ - public AccessibleMethod(Class klass, - String methodName, - Class ... paramTypes) throws NoSuchMethodException { - try { - method = AccessController.doPrivileged( - new AccessMethodAction(klass, methodName, paramTypes)); - } catch (PrivilegedActionException e) { - throw (NoSuchMethodException)e.getCause(); - } - } - - /** - * Invoke the method that this object represents. - * Has the same behavior and throws the same exceptions as - * <code>java.lang.reflect.Method.invoke</code> with one - * exception: This method does not throw - * <code>IllegalAccessException</code> since the target - * method has already been made accessible. - * - * @param obj the object the underlying method is invoked from - * @param args the arguments used for the method call - * @return the result of dispatching the method represented by - * this object on <code>obj</code> with parameters - * <code>args</code> - * @see java.lang.reflect.Method#invoke - */ - public Object invoke(Object obj, Object ... args) - throws IllegalArgumentException, InvocationTargetException { - - try { - return method.invoke(obj, args); - } catch (IllegalAccessException e) { - // should never happen since we've made it accessible - throw new AssertionError("accessible method inaccessible"); - } - } - - /** - * Invoke the method that this object represents, with the - * expectation that the method being called throws no - * checked exceptions. - * <p> - * Simply calls <code>this.invoke(obj, args)</code> - * but catches any <code>InvocationTargetException</code> - * and returns the cause wrapped in a runtime exception. - * - * @param obj the object the underlying method is invoked from - * @param args the arguments used for the method call - * @return the result of dispatching the method represented by - * this object on <code>obj</code> with parameters - * <code>args</code> - * @see #invoke - */ - public Object invokeNoChecked(Object obj, Object ... args) { - try { - return invoke(obj, args); - } catch (InvocationTargetException ex) { - if (ex.getCause() instanceof RuntimeException) { - throw (RuntimeException)ex.getCause(); - } else { - throw new RuntimeException(ex.getCause()); - } - } - } - - /** The action used to fetch the method and make it accessible */ - private static class AccessMethodAction implements PrivilegedExceptionAction<Method> { - private final Class<?> klass; - private final String methodName; - private final Class[] paramTypes; - - public AccessMethodAction(Class klass, - String methodName, - Class ... paramTypes) { - - this.klass = klass; - this.methodName = methodName; - this.paramTypes = paramTypes; - } - - public Method run() throws NoSuchMethodException { - Method method = klass.getDeclaredMethod(methodName, paramTypes); - method.setAccessible(true); - return method; - } - } -} diff -r dfd8506f74c3 -r 4c616e2ae07b jdk/src/share/classes/sun/swing/SwingAccessor.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/sun/swing/SwingAccessor.java Wed Jul 01 00:17:02 2009 -0700 @@ -0,0 +1,96 @@ +/* + * Copyright 2009 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +package sun.swing; + +import sun.misc.Unsafe; + +import java.awt.Point; + +import javax.swing.text.JTextComponent; +import javax.swing.TransferHandler; + +/** + * The SwingAccessor utility class. + * The main purpose of this class is to enable accessing + * private and package-private fields of classes from + * different classes/packages. See sun.misc.SharedSecretes + * for another example. + */ +public final class SwingAccessor { + private static final Unsafe unsafe = Unsafe.getUnsafe(); + + /** + * We don't need any objects of this class. + * It's rather a collection of static methods + * and interfaces. + */ + private SwingAccessor() { + } + + /** + * An accessor for the JTextComponent class. + * Note that we intentionally introduce the JTextComponentAccessor, + * and not the JComponentAccessor because the needed methods + * aren't override methods. + */ + public interface JTextComponentAccessor { + + /** + * Calculates a custom drop location for the text component, + * representing where a drop at the given point should insert data. + */ + TransferHandler.DropLocation dropLocationForPoint(JTextComponent textComp, Point p); + + /** + * Called to set or clear the drop location during a DnD operation. + */ + Object setDropLocation(JTextComponent textComp, TransferHandler.DropLocation location, + Object state, boolean forDrop); + } + + /** + * The javax.swing.text.JTextComponent class accessor object. + */ + private static JTextComponentAccessor jtextComponentAccessor; + + /** + * Set an accessor object for the javax.swing.text.JTextComponent class. + */ + public static void setJTextComponentAccessor(JTextComponentAccessor jtca) { + jtextComponentAccessor = jtca; + } + + /** + * Retrieve the accessor object for the javax.swing.text.JTextComponent class. + */ + public static JTextComponentAccessor getJTextComponentAccessor() { + if (jtextComponentAccessor == null) { + unsafe.ensureClassInitialized(JTextComponent.class); + } + + return jtextComponentAccessor; + } +} diff -r dfd8506f74c3 -r 4c616e2ae07b jdk/src/solaris/classes/sun/awt/X11/XKeysym.java --- a/jdk/src/solaris/classes/sun/awt/X11/XKeysym.java Wed Jul 05 16:55:26 2017 +0200 +++ b/jdk/src/solaris/classes/sun/awt/X11/XKeysym.java Wed Jul 01 00:17:02 2009 -0700 @@ -145,7 +145,7 @@ { // Xsun without XKB uses keysymarray[2] keysym to determine if it is KP event. // Otherwise, it is [1]. - int ndx = XToolkit.isXsunServer() && + int ndx = XToolkit.isXsunKPBehavior() && ! XToolkit.isXKBenabled() ? 2 : 1; // Even if XKB is enabled, we have another problem: some symbol tables (e.g. cz) force // a regular comma instead of KP_comma for a decimal separator. Result is, @@ -193,7 +193,7 @@ private static long getKeypadKeysym( XKeyEvent ev ) { int ndx = 0; long keysym = XConstants.NoSymbol; - if( XToolkit.isXsunServer() && + if( XToolkit.isXsunKPBehavior() && ! XToolkit.isXKBenabled() ) { if( (ev.get_state() & XConstants.ShiftMask) != 0 ) { // shift modifier is on ndx = 3; diff -r dfd8506f74c3 -r 4c616e2ae07b jdk/src/solaris/classes/sun/awt/X11/XToolkit.java --- a/jdk/src/solaris/classes/sun/awt/X11/XToolkit.java Wed Jul 05 16:55:26 2017 +0200 +++ b/jdk/src/solaris/classes/sun/awt/X11/XToolkit.java Wed Jul 01 00:17:02 2009 -0700 @@ -1177,6 +1177,7 @@ awtLock(); try { XlibWrapper.XBell(getDisplay(), 0); + XlibWrapper.XFlush(getDisplay()); } finally { awtUnlock(); } @@ -1435,9 +1436,14 @@ return timeStamp; } protected void initializeDesktopProperties() { - desktopProperties.put("DnD.Autoscroll.initialDelay", Integer.valueOf(50)); - desktopProperties.put("DnD.Autoscroll.interval", Integer.valueOf(50)); - desktopProperties.put("DnD.Autoscroll.cursorHysteresis", Integer.valueOf(5)); + desktopProperties.put("DnD.Autoscroll.initialDelay", + Integer.valueOf(50)); + desktopProperties.put("DnD.Autoscroll.interval", + Integer.valueOf(50)); + desktopProperties.put("DnD.Autoscroll.cursorHysteresis", + Integer.valueOf(5)); + desktopProperties.put("Shell.shellFolderManager", + "sun.awt.shell.ShellFolderManager"); // Don't want to call getMultiClickTime() if we are headless if (!GraphicsEnvironment.isHeadless()) { desktopProperties.put("awt.multiClickInterval", @@ -2124,39 +2130,33 @@ */ private static int backingStoreType; - static boolean awt_ServerInquired = false; - static boolean awt_IsXsunServer = false; + static final int XSUN_KP_BEHAVIOR = 1; + static final int XORG_KP_BEHAVIOR = 2; + + static int awt_IsXsunKPBehavior = 0; static boolean awt_UseXKB = false; static boolean awt_UseXKB_Calls = false; static int awt_XKBBaseEventCode = 0; static int awt_XKBEffectiveGroup = 0; // so far, I don't use it leaving all calculations // to XkbTranslateKeyCode static long awt_XKBDescPtr = 0; + /** - Try to understand if it is Xsun server. - By now (2005) Sun is vendor of Xsun and Xorg servers; we only return true if Xsun is running. - */ - static boolean isXsunServer() { + * Check for Xsun convention regarding numpad keys. + * Xsun and some other servers (i.e. derived from Xsun) + * under certain conditions process numpad keys unlike Xorg. + */ + static boolean isXsunKPBehavior() { awtLock(); try { - if( awt_ServerInquired ) { - return awt_IsXsunServer; - } - if( ! XlibWrapper.ServerVendor(getDisplay()).startsWith("Sun Microsystems") ) { - awt_ServerInquired = true; - awt_IsXsunServer = false; - return false; + if( awt_IsXsunKPBehavior == 0 ) { + if( XlibWrapper.IsXsunKPBehavior(getDisplay()) ) { + awt_IsXsunKPBehavior = XSUN_KP_BEHAVIOR; + }else{ + awt_IsXsunKPBehavior = XORG_KP_BEHAVIOR; + } } - // Now, it's Sun. It still may be Xorg though, eg on Solaris 10, x86. - // Today (2005), VendorRelease of Xorg is a Big Number unlike Xsun. - if( XlibWrapper.VendorRelease(getDisplay()) > 10000 ) { - awt_ServerInquired = true; - awt_IsXsunServer = false; - return false; - } - awt_ServerInquired = true; - awt_IsXsunServer = true; - return true; + return awt_IsXsunKPBehavior == XSUN_KP_BEHAVIOR ? true : false; } finally { awtUnlock(); } diff -r dfd8506f74c3 -r 4c616e2ae07b jdk/src/solaris/classes/sun/awt/X11/XlibWrapper.java --- a/jdk/src/solaris/classes/sun/awt/X11/XlibWrapper.java Wed Jul 05 16:55:26 2017 +0200 +++ b/jdk/src/solaris/classes/sun/awt/X11/XlibWrapper.java Wed Jul 01 00:17:02 2009 -0700 @@ -352,6 +352,7 @@ static native int XIconifyWindow(long display, long window, long screenNumber); static native String ServerVendor(long display); static native int VendorRelease(long display); + static native boolean IsXsunKPBehavior(long display); static native void XBell(long display, int percent); diff -r dfd8506f74c3 -r 4c616e2ae07b jdk/src/solaris/classes/sun/awt/X11/keysym2ucs.h --- a/jdk/src/solaris/classes/sun/awt/X11/keysym2ucs.h Wed Jul 05 16:55:26 2017 +0200 +++ b/jdk/src/solaris/classes/sun/awt/X11/keysym2ucs.h Wed Jul 01 00:17:02 2009 -0700 @@ -183,7 +183,7 @@ tojava { tojava // Xsun without XKB uses keysymarray[2] keysym to determine if it is KP event. tojava // Otherwise, it is [1]. -tojava int ndx = XToolkit.isXsunServer() && +tojava int ndx = XToolkit.isXsunKPBehavior() && tojava ! XToolkit.isXKBenabled() ? 2 : 1; tojava // Even if XKB is enabled, we have another problem: some symbol tables (e.g. cz) force tojava // a regular comma instead of KP_comma for a decimal separator. Result is, @@ -231,7 +231,7 @@ tojava private static long getKeypadKeysym( XKeyEvent ev ) { tojava int ndx = 0; tojava long keysym = XConstants.NoSymbol; -tojava if( XToolkit.isXsunServer() && +tojava if( XToolkit.isXsunKPBehavior() && tojava ! XToolkit.isXKBenabled() ) { tojava if( (ev.get_state() & XConstants.ShiftMask) != 0 ) { // shift modifier is on tojava ndx = 3; diff -r dfd8506f74c3 -r 4c616e2ae07b jdk/src/solaris/native/sun/xawt/XlibWrapper.c --- a/jdk/src/solaris/native/sun/xawt/XlibWrapper.c Wed Jul 05 16:55:26 2017 +0200 +++ b/jdk/src/solaris/native/sun/xawt/XlibWrapper.c Wed Jul 01 00:17:02 2009 -0700 @@ -1181,6 +1181,38 @@ AWT_CHECK_HAVE_LOCK(); return VendorRelease((Display*)jlong_to_ptr(display)); } +/* + * Class: sun_awt_X11_XlibWrapper + * Method: IsXsunKPBehavior + * Signature: (J)Z; + */ +JNIEXPORT jboolean JNICALL Java_sun_awt_X11_XlibWrapper_IsXsunKPBehavior +(JNIEnv *env, jclass clazz, jlong display) +{ + // Xsun without XKB uses keysymarray[2] keysym to determine if it is KP event. + // Otherwise, it is [1] or sometimes [0]. + // This sniffer first tries to determine what is a keycode for XK_KP_7 + // using XKeysymToKeycode; + // second, in which place in the keysymarray is XK_KP_7 + // using XKeycodeToKeysym. + int kc7; + AWT_CHECK_HAVE_LOCK(); + kc7 = XKeysymToKeycode((Display*)jlong_to_ptr(display), XK_KP_7); + if( !kc7 ) { + // keycode is not defined. Why, it's a reduced keyboard perhaps: + // report arbitrarily false. + return JNI_FALSE; + } else { + long ks2 = XKeycodeToKeysym((Display*)jlong_to_ptr(display), kc7, 2); + if( ks2 == XK_KP_7 ) { + //XXX If some Xorg server would put XK_KP_7 in keysymarray[2] as well, + //XXX for yet unknown to me reason, the sniffer would lie. + return JNI_TRUE; + }else{ + return JNI_FALSE; + } + } +} JavaVM* jvm = NULL; static int ToolkitErrorHandler(Display * dpy, XErrorEvent * event) { diff -r dfd8506f74c3 -r 4c616e2ae07b jdk/src/windows/classes/sun/awt/windows/WComponentPeer.java --- a/jdk/src/windows/classes/sun/awt/windows/WComponentPeer.java Wed Jul 05 16:55:26 2017 +0200 +++ b/jdk/src/windows/classes/sun/awt/windows/WComponentPeer.java Wed Jul 01 00:17:02 2009 -0700 @@ -417,6 +417,15 @@ replaceSurfaceData(this.numBackBuffers, this.backBufferCaps); } + public void createScreenSurface(boolean isResize) + { + Win32GraphicsConfig gc = (Win32GraphicsConfig)getGraphicsConfiguration(); + ScreenUpdateManager mgr = ScreenUpdateManager.getInstance(); + + surfaceData = mgr.createScreenSurface(gc, this, numBackBuffers, isResize); + } + + /** * Multi-buffer version of replaceSurfaceData. This version is called * by createBuffers(), which needs to acquire the same locks in the same @@ -434,13 +443,10 @@ return; } numBackBuffers = newNumBackBuffers; - Win32GraphicsConfig gc = - (Win32GraphicsConfig)getGraphicsConfiguration(); ScreenUpdateManager mgr = ScreenUpdateManager.getInstance(); oldData = surfaceData; mgr.dropScreenSurface(oldData); - surfaceData = - mgr.createScreenSurface(gc, this, numBackBuffers, true); + createScreenSurface(true); if (oldData != null) { oldData.invalidate(); } @@ -449,6 +455,8 @@ if (numBackBuffers > 0) { // set the caps first, they're used when creating the bb backBufferCaps = caps; + Win32GraphicsConfig gc = + (Win32GraphicsConfig)getGraphicsConfiguration(); backBuffer = gc.createBackBuffer(this); } else if (backBuffer != null) { backBufferCaps = null; @@ -711,11 +719,8 @@ create(parentPeer); // fix for 5088782: check if window object is created successfully checkCreation(); - this.winGraphicsConfig = - (Win32GraphicsConfig)getGraphicsConfiguration(); - ScreenUpdateManager mgr = ScreenUpdateManager.getInstance(); - this.surfaceData = mgr.createScreenSurface(winGraphicsConfig, this, - numBackBuffers, false); + + createScreenSurface(false); initialize(); start(); // Initialize enable/disable state, turn on callbacks } diff -r dfd8506f74c3 -r 4c616e2ae07b jdk/src/windows/classes/sun/awt/windows/WEmbeddedFrame.java --- a/jdk/src/windows/classes/sun/awt/windows/WEmbeddedFrame.java Wed Jul 05 16:55:26 2017 +0200 +++ b/jdk/src/windows/classes/sun/awt/windows/WEmbeddedFrame.java Wed Jul 01 00:17:02 2009 -0700 @@ -211,9 +211,10 @@ */ public void notifyModalBlocked(Dialog blocker, boolean blocked) { try { - notifyModalBlockedImpl((WEmbeddedFramePeer)ComponentAccessor.getPeer(this), - (WWindowPeer)ComponentAccessor.getPeer(blocker), - blocked); + ComponentPeer thisPeer = (ComponentPeer)WToolkit.targetToPeer(this); + ComponentPeer blockerPeer = (ComponentPeer)WToolkit.targetToPeer(blocker); + notifyModalBlockedImpl((WEmbeddedFramePeer)thisPeer, + (WWindowPeer)blockerPeer, blocked); } catch (Exception z) { z.printStackTrace(System.err); } diff -r dfd8506f74c3 -r 4c616e2ae07b jdk/src/windows/classes/sun/awt/windows/WFileDialogPeer.java --- a/jdk/src/windows/classes/sun/awt/windows/WFileDialogPeer.java Wed Jul 05 16:55:26 2017 +0200 +++ b/jdk/src/windows/classes/sun/awt/windows/WFileDialogPeer.java Wed Jul 01 00:17:02 2009 -0700 @@ -237,4 +237,11 @@ public void setOpacity(float opacity) {} public void setOpaque(boolean isOpaque) {} public void updateWindow(java.awt.image.BufferedImage backBuffer) {} + + // the file/print dialogs are native dialogs and + // the native system does their own rendering + @Override + public void createScreenSurface(boolean isResize) {} + @Override + public void replaceSurfaceData() {} } diff -r dfd8506f74c3 -r 4c616e2ae07b jdk/src/windows/classes/sun/awt/windows/WPopupMenuPeer.java --- a/jdk/src/windows/classes/sun/awt/windows/WPopupMenuPeer.java Wed Jul 05 16:55:26 2017 +0200 +++ b/jdk/src/windows/classes/sun/awt/windows/WPopupMenuPeer.java Wed Jul 01 00:17:02 2009 -0700 @@ -29,33 +29,25 @@ import java.lang.reflect.Field; import sun.awt.SunToolkit; +import sun.awt.AWTAccessor; public class WPopupMenuPeer extends WMenuPeer implements PopupMenuPeer { // We can't use target.getParent() for TrayIcon popup // because this method should return null for the TrayIcon // popup regardless of that whether it has parent or not. - private static Field f_parent; - private static Field f_isTrayIconPopup; - - static { - f_parent = SunToolkit.getField(MenuComponent.class, "parent"); - f_isTrayIconPopup = SunToolkit.getField(PopupMenu.class, "isTrayIconPopup"); - } public WPopupMenuPeer(PopupMenu target) { this.target = target; MenuContainer parent = null; - boolean isTrayIconPopup = false; - try { - isTrayIconPopup = ((Boolean)f_isTrayIconPopup.get(target)).booleanValue(); - if (isTrayIconPopup) { - parent = (MenuContainer)f_parent.get(target); - } else { - parent = target.getParent(); - } - } catch (IllegalAccessException iae) { - iae.printStackTrace(); - return; + + // We can't use target.getParent() for TrayIcon popup + // because this method should return null for the TrayIcon + // popup regardless of that whether it has parent or not. + boolean isTrayIconPopup = AWTAccessor.getPopupMenuAccessor().isTrayIconPopup(target); + if (isTrayIconPopup) { + parent = AWTAccessor.getMenuComponentAccessor().getParent(target); + } else { + parent = target.getParent(); } if (parent instanceof Component) { diff -r dfd8506f74c3 -r 4c616e2ae07b jdk/src/windows/classes/sun/awt/windows/WPrintDialogPeer.java --- a/jdk/src/windows/classes/sun/awt/windows/WPrintDialogPeer.java Wed Jul 05 16:55:26 2017 +0200 +++ b/jdk/src/windows/classes/sun/awt/windows/WPrintDialogPeer.java Wed Jul 01 00:17:02 2009 -0700 @@ -150,4 +150,11 @@ public void setOpacity(float opacity) {} public void setOpaque(boolean isOpaque) {} public void updateWindow(java.awt.image.BufferedImage backBuffer) {} + + // the file/print dialogs are native dialogs and + // the native system does their own rendering + @Override + public void createScreenSurface(boolean isResize) {} + @Override + public void replaceSurfaceData() {} } diff -r dfd8506f74c3 -r 4c616e2ae07b jdk/src/windows/classes/sun/java2d/windows/GDIWindowSurfaceData.java --- a/jdk/src/windows/classes/sun/java2d/windows/GDIWindowSurfaceData.java Wed Jul 05 16:55:26 2017 +0200 +++ b/jdk/src/windows/classes/sun/java2d/windows/GDIWindowSurfaceData.java Wed Jul 01 00:17:02 2009 -0700 @@ -38,8 +38,6 @@ import sun.awt.Win32GraphicsConfig; import sun.awt.Win32GraphicsDevice; import sun.awt.windows.WComponentPeer; -import sun.awt.windows.WFileDialogPeer; -import sun.awt.windows.WPrintDialogPeer; import sun.java2d.ScreenUpdateManager; import sun.java2d.SunGraphics2D; import sun.java2d.SurfaceData; @@ -264,17 +262,7 @@ this.graphicsConfig = (Win32GraphicsConfig) peer.getGraphicsConfiguration(); this.solidloops = graphicsConfig.getSolidLoops(sType); - if (peer instanceof WFileDialogPeer || - peer instanceof WPrintDialogPeer ) - { - // REMIND: Awful hack. The right fix for this problem - // would be for these type of Peers to not even use a - // GDIWindowSurfaceData object since they never do any - // rendering. Or they could actually implement the - // functionality needed in initOps. But this seems - // to work for now. See bug 4391928 for more info. - return; - } + Win32GraphicsDevice gd = (Win32GraphicsDevice)graphicsConfig.getDevice(); initOps(peer, depth, rMask, gMask, bMask, gd.getScreen()); diff -r dfd8506f74c3 -r 4c616e2ae07b jdk/src/windows/native/sun/windows/awt_Component.cpp --- a/jdk/src/windows/native/sun/windows/awt_Component.cpp Wed Jul 05 16:55:26 2017 +0200 +++ b/jdk/src/windows/native/sun/windows/awt_Component.cpp Wed Jul 01 00:17:02 2009 -0700 @@ -5975,17 +5975,7 @@ env->DeleteGlobalRef(self); delete cpps; - - if (result != NULL) - { - jintArray resultGlobalRef = (jintArray)env->NewGlobalRef(result); - env->DeleteLocalRef(result); - return resultGlobalRef; - } - else - { - return NULL; - } + return result; // this reference is global } jboolean AwtComponent::_IsObscured(void *param) diff -r dfd8506f74c3 -r 4c616e2ae07b jdk/src/windows/native/sun/windows/awt_Frame.cpp --- a/jdk/src/windows/native/sun/windows/awt_Frame.cpp Wed Jul 05 16:55:26 2017 +0200 +++ b/jdk/src/windows/native/sun/windows/awt_Frame.cpp Wed Jul 01 00:17:02 2009 -0700 @@ -381,19 +381,29 @@ void AwtFrame::CreateProxyFocusOwner() { - DASSERT(m_proxyFocusOwner == NULL); - DASSERT(AwtToolkit::MainThread() == ::GetCurrentThreadId()); + if (AwtToolkit::IsMainThread()) { + AwtFrame::_CreateProxyFocusOwner((void *)this); + } else { + AwtToolkit::GetInstance().InvokeFunction(AwtFrame::_CreateProxyFocusOwner, (void *)this); + } +} + +void AwtFrame::_CreateProxyFocusOwner(void *param) +{ + DASSERT(AwtToolkit::IsMainThread()); - m_proxyFocusOwner = ::CreateWindow(TEXT("STATIC"), - TEXT("ProxyFocusOwner"), - WS_CHILD, - 0, 0, 0, 0, GetHWnd(), NULL, - AwtToolkit::GetInstance(). - GetModuleHandle(), - NULL); + AwtFrame *f = (AwtFrame *)param; + DASSERT(f->m_proxyFocusOwner == NULL); - m_proxyDefWindowProc = ComCtl32Util::GetInstance().SubclassHWND(m_proxyFocusOwner, ProxyWindowProc); + f->m_proxyFocusOwner = ::CreateWindow(TEXT("STATIC"), + TEXT("ProxyFocusOwner"), + WS_CHILD, + 0, 0, 0, 0, f->GetHWnd(), NULL, + AwtToolkit::GetInstance(). + GetModuleHandle(), + NULL); + f->m_proxyDefWindowProc = ComCtl32Util::GetInstance().SubclassHWND(f->m_proxyFocusOwner, ProxyWindowProc); } void AwtFrame::DestroyProxyFocusOwner() diff -r dfd8506f74c3 -r 4c616e2ae07b jdk/src/windows/native/sun/windows/awt_Frame.h --- a/jdk/src/windows/native/sun/windows/awt_Frame.h Wed Jul 05 16:55:26 2017 +0200 +++ b/jdk/src/windows/native/sun/windows/awt_Frame.h Wed Jul 01 00:17:02 2009 -0700 @@ -117,7 +117,6 @@ INLINE BOOL IsUndecorated() { return m_isUndecorated; } INLINE HWND GetProxyFocusOwner() { - DASSERT(AwtToolkit::MainThread() == ::GetCurrentThreadId()); if (m_proxyFocusOwner == NULL) { CreateProxyFocusOwner(); } @@ -165,6 +164,8 @@ void CreateProxyFocusOwner(); void DestroyProxyFocusOwner(); + /* creates proxy focus owner, called on Toolkit thread */ + static void _CreateProxyFocusOwner(void *param); /* destroys proxy focus owner, called on Toolkit thread */ static void _DestroyProxyFocusOwner(void *param); diff -r dfd8506f74c3 -r 4c616e2ae07b jdk/test/java/awt/Component/PrintAllXcheckJNI/PrintAllXcheckJNI.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/awt/Component/PrintAllXcheckJNI/PrintAllXcheckJNI.java Wed Jul 01 00:17:02 2009 -0700 @@ -0,0 +1,52 @@ +/* + * Copyright 2009 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + @test + @bug 6736247 + @summary Component.printAll Invalid local JNI handle + @author Dmitry Cherepanov: area=awt.component + @run main/othervm -Xcheck:jni PrintAllXcheckJNI +*/ + +import java.awt.*; +import java.awt.image.BufferedImage; + +public class PrintAllXcheckJNI +{ + public static void main(String []s) + { + Frame frame = new Frame(); + frame.setVisible(true); + + BufferedImage img = new BufferedImage(frame.getWidth(), + frame.getHeight(), + BufferedImage.TYPE_INT_RGB); + Graphics2D g = img.createGraphics(); + + frame.printAll(g); + + g.dispose(); + img.flush(); + } +} diff -r dfd8506f74c3 -r 4c616e2ae07b jdk/test/java/awt/Focus/FocusTraversalPolicy/DefaultFTPTest.java --- a/jdk/test/java/awt/Focus/FocusTraversalPolicy/DefaultFTPTest.java Wed Jul 05 16:55:26 2017 +0200 +++ b/jdk/test/java/awt/Focus/FocusTraversalPolicy/DefaultFTPTest.java Wed Jul 01 00:17:02 2009 -0700 @@ -104,7 +104,7 @@ */ public class DefaultFTPTest { - final int TESTS_NUMBER = 10; + final int TESTS_NUMBER = 11; public static void main(String[] args) { DefaultFTPTest app = new DefaultFTPTest(); @@ -928,3 +928,63 @@ } } } + +/* + * frame [ container(root) [...] comp ] + * - getDefaultComponent(<frame>) should implicitly down-cycle into the <container>. + * - getFirstComponent(<frame>) should implicitly down-cycle into the <container>. + */ +class PolicyTest11 extends AbstractPolicyTest { + protected Frame createFrame() { + Frame frame = (Frame) registerComponent("frame", new Frame("Test Frame")); + frame.setLayout(new FlowLayout()); + + Container cont = (Container)registerComponent("panel", new Panel()); + cont.add(registerComponent("btn-1", new Button("button"))); + cont.add(registerComponent("btn-2", new Button("button"))); + + frame.add(cont); + frame.add(registerComponent("btn-3", new Button("button"))); + + return frame; + } + + protected void customizeHierarchy() { + ((Container)getComponent("frame")).setFocusTraversalPolicy(new DefaultFocusTraversalPolicy()); + ((Container)getComponent("panel")).setFocusCycleRoot(true); + } + + protected Map<String, String> getForwardOrder() { + Map<String, String> order = new HashMap<String, String>(); + order.put("frame", "btn-1"); + order.put("btn-1", "btn-2"); + order.put("btn-2", "btn-1"); + order.put("btn-3", "btn-1"); + return order; + } + + protected Map<String, String> getBackwardOrder() { + Map<String, String> order = new HashMap<String, String>(); + order.put("btn-3", "btn-1"); + order.put("btn-2", "btn-1"); + order.put("btn-1", "btn-2"); + order.put("frame", "btn-3"); + return order; + } + + protected String[] getContainersToTest() { + return new String[] {"frame"}; + } + + protected String getDefaultComp(String focusCycleRoot_id) { + return "btn-1"; + } + + protected String getFirstComp(String focusCycleRoot_id) { + return "btn-1"; + } + + protected String getLastComp(String focusCycleRoot_id) { + return "btn-3"; + } +} diff -r dfd8506f74c3 -r 4c616e2ae07b jdk/test/java/awt/Focus/FocusTraversalPolicy/LayoutFTPTest.java --- a/jdk/test/java/awt/Focus/FocusTraversalPolicy/LayoutFTPTest.java Wed Jul 05 16:55:26 2017 +0200 +++ b/jdk/test/java/awt/Focus/FocusTraversalPolicy/LayoutFTPTest.java Wed Jul 01 00:17:02 2009 -0700 @@ -105,7 +105,7 @@ */ public class LayoutFTPTest { - final int TESTS_NUMBER = 10; + final int TESTS_NUMBER = 11; public static void main(String[] args) { LayoutFTPTest app = new LayoutFTPTest(); @@ -929,3 +929,63 @@ } } } + +/* + * frame [ container(root) [...] comp ] + * - getDefaultComponent(<frame>) should implicitly down-cycle into the <container>. + * - getFirstComponent(<frame>) should implicitly down-cycle into the <container>. + */ +class PolicyTest11 extends AbstractPolicyTest { + protected Frame createFrame() { + JFrame jframe = (JFrame) registerComponent("jframe", new JFrame("Test Frame")); + jframe.setLayout(new FlowLayout()); + + Container cont = (Container)registerComponent("jpanel", new JPanel()); + cont.add(registerComponent("btn-1", new JButton("jbutton"))); + cont.add(registerComponent("btn-2", new JButton("jbutton"))); + + jframe.add(cont); + jframe.add(registerComponent("btn-3", new JButton("jbutton"))); + + return jframe; + } + + protected void customizeHierarchy() { + ((Container)getComponent("jframe")).setFocusTraversalPolicy(new LayoutFocusTraversalPolicy()); + ((Container)getComponent("jpanel")).setFocusCycleRoot(true); + } + + protected Map<String, String> getForwardOrder() { + Map<String, String> order = new HashMap<String, String>(); + order.put("jframe", "btn-1"); + order.put("btn-1", "btn-2"); + order.put("btn-2", "btn-1"); + order.put("btn-3", "btn-1"); + return order; + } + + protected Map<String, String> getBackwardOrder() { + Map<String, String> order = new HashMap<String, String>(); + order.put("btn-3", "btn-1"); + order.put("btn-2", "btn-1"); + order.put("btn-1", "btn-2"); + order.put("jframe", "btn-3"); + return order; + } + + protected String[] getContainersToTest() { + return new String[] {"jframe"}; + } + + protected String getDefaultComp(String focusCycleRoot_id) { + return "btn-1"; + } + + protected String getFirstComp(String focusCycleRoot_id) { + return "btn-1"; + } + + protected String getLastComp(String focusCycleRoot_id) { + return "btn-3"; + } +} diff -r dfd8506f74c3 -r 4c616e2ae07b jdk/test/java/awt/GridBagLayout/GridBagLayoutIpadXYTest/GridBagLayoutIpadXYTest.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/awt/GridBagLayout/GridBagLayoutIpadXYTest/GridBagLayoutIpadXYTest.html Wed Jul 01 00:17:02 2009 -0700 @@ -0,0 +1,43 @@ +<html> +<!-- + + Copyright 2009 Sun Microsystems, Inc. All Rights Reserved. + DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + + This code is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License version 2 only, as + published by the Free Software Foundation. + + This code is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + version 2 for more details (a copy is included in the LICENSE file that + accompanied this code). + + You should have received a copy of the GNU General Public License version + 2 along with this work; if not, write to the Free Software Foundation, + Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + + Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + CA 95054 USA or visit www.sun.com if you need additional information or + have any questions. + + @test + @bug 5004032 + @summary GridBagConstraints.ipad(x|y) defined in a new way + @author dav@sparc.spb.su area= + @run applet GridBagLayoutIpadXYTest.html + --> +<head> +<title> </title> +</head> +<body> + +<h1>GridBagLayoutIpadXYTest<br>Bug ID: 5004032 </h1> + +<p> This is an AUTOMATIC test, simply wait for completion </p> + +<APPLET CODE="GridBagLayoutIpadXYTest.class" WIDTH=200 HEIGHT=200></APPLET> +</body> +</html> + diff -r dfd8506f74c3 -r 4c616e2ae07b jdk/test/java/awt/GridBagLayout/GridBagLayoutIpadXYTest/GridBagLayoutIpadXYTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/awt/GridBagLayout/GridBagLayoutIpadXYTest/GridBagLayoutIpadXYTest.java Wed Jul 01 00:17:02 2009 -0700 @@ -0,0 +1,89 @@ +/* + * Copyright 2009 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + test + @bug 5004032 + @summary GridBagConstraints.ipad(x|y) defined in a new way + @author dav@sparc.spb.su area= + @run applet GridBagLayoutIpadXYTest.html +*/ + +import java.applet.Applet; +import java.awt.*; + +public class GridBagLayoutIpadXYTest extends Applet +{ + Frame frame = new Frame(); + TextField jtf = null; + final int customIpadx = 300; + final int customIpady = 40; + + public void init() + { + this.setLayout (new BorderLayout ()); + + String[] instructions = + { + "This is an AUTOMATIC test", + "simply wait until it is done" + }; + }//End init() + + public void start () + { + validate(); + frame.setLayout(new GridBagLayout()); + GridBagConstraints gc = new GridBagConstraints(); + Insets fieldInsets = new Insets(0,5,5,0); + + gc.anchor = gc.NORTH; + gc.fill = gc.HORIZONTAL; + gc.gridx = 1; + gc.gridy = 0; + gc.weightx = 1; + gc.ipadx = customIpadx; + gc.ipady = customIpady; + gc.insets = fieldInsets; + jtf = new TextField(); + frame.add(jtf, gc); + + frame.pack(); + frame.setVisible(true); + + ((sun.awt.SunToolkit)Toolkit.getDefaultToolkit()).realSync(); + + Dimension minSize = jtf.getMinimumSize(); + if ( minSize.width + customIpadx != jtf.getSize().width || + minSize.height + customIpady != jtf.getSize().height ){ + System.out.println("TextField originally has min size = " + jtf.getMinimumSize()); + System.out.println("TextField supplied with ipadx = 300, ipady =40"); + System.out.println("Frame size: " + frame.getSize()); + System.out.println(" Fields's size is "+jtf.getSize()); + + throw new RuntimeException("Test Failed. TextField has incorrect width. "); + } + System.out.println("Test Passed."); + + }// start() +} diff -r dfd8506f74c3 -r 4c616e2ae07b jdk/test/java/awt/GridLayout/LayoutExtraGaps/LayoutExtraGaps.java --- a/jdk/test/java/awt/GridLayout/LayoutExtraGaps/LayoutExtraGaps.java Wed Jul 05 16:55:26 2017 +0200 +++ b/jdk/test/java/awt/GridLayout/LayoutExtraGaps/LayoutExtraGaps.java Wed Jul 01 00:17:02 2009 -0700 @@ -24,7 +24,8 @@ /* @test @bug 4370316 - @summary GridLayout does not fill its Container + @summary GridLayout does not centre its component properly + (summary was GridLayout does not fill its Container) @library ../../regtesthelpers @build Util @author Andrei Dmitriev : area=awt.layout @@ -90,25 +91,97 @@ setVisible(true); Util.waitForIdle(Util.createRobot()); - Rectangle r1 = yellowPanel.getComponent(0).getBounds(); - Rectangle r2 = bluePanel.getComponent(0).getBounds(); - Rectangle r3 = blackPanel.getComponent(0).getBounds(); - Rectangle r4 = redPanel.getComponent(0).getBounds(); + + if (isComponentCentredLTR(yellowPanel) && isComponentCentredLTR(bluePanel) + && isComponentCentredLTR(blackPanel) && isComponentCentredRTL(redPanel)) + { + System.out.println("Test passed."); + } else { + throw new RuntimeException("Test failed. GridLayout doesn't center component."); + } + } + + /** + * Checks if the components under Panel p are properly centred (i.e. + * opposite borders between the Panel and component are equal). Panel p + * must not be affect by RTL orientation (RTL only affects horizontal + * positioning and components lay out from top right corner). + * + * @param p the panel where the components exist and is not affected + * by right to left orientation + * @return true if components of panel p are properly centre, false + * otherwise + */ + public static boolean isComponentCentredLTR(Panel p) { + double borderLeft; + double borderRight; + double borderTop; + double borderBottom; + + //The first component(rectangle) in panel p. + Rectangle firstRec = p.getComponent(0).getBounds(); + + //The last component(rectangle) in panel p. + Rectangle lastRec = p.getComponent(compCount - 1).getBounds(); + + System.out.println("bounds of the first rectangle in "+ p.getName() + " = " + firstRec); + System.out.println("bounds of the last rectangle in "+ p.getName() + " = " + lastRec); + + borderLeft = firstRec.getX(); + borderRight = p.getWidth() - lastRec.getWidth() - lastRec.getX(); + borderTop = firstRec.getY(); + borderBottom = p.getHeight() - lastRec.getHeight() - lastRec.getY(); + + return areBordersEqual(borderLeft, borderRight) && + areBordersEqual(borderTop, borderBottom); + } - System.out.println("firstHorizLabel bounds ="+r1); - System.out.println("firstVertLabel bounds ="+r2); - System.out.println("firstHorizLabel_RTL bounds ="+r3); - System.out.println("firstVertLabel_RTL bounds ="+r4); - if ((r1.getX() == 0 && r1.getY() == 0) || - (r2.getX() == 0 && r2.getY() == 0) || - (r3.getX() == 0 && r3.getY() == 0) || - // RTL only affects horizontal positioning and components lays out from top right corner - (r4.getX() == blackPanel.getWidth() && r4.getY() == 0)) - { - throw new RuntimeException("Test failed. GridLayout doesn't center component."); - } else { - System.out.println("Test passed."); - } + /** + * Checks if the components under Panel p are properly centred (i.e. + * opposite borders between the Panel and component are equal). Panel p + * must be affect by RTL orientation (RTL only affects horizontal positioning + * and components lay out from top right corner). + * + * @param p the panel where the components exist and is affected by + * right to left orientation + * @return true if components of panel p are properly centre, false + * otherwise + */ + public static boolean isComponentCentredRTL(Panel p) { + double borderLeft; + double borderRight; + double borderTop; + double borderBottom; + + //The first component(rectangle) in panel p. + Rectangle firstRec = p.getComponent(0).getBounds(); + + //The last component(rectangle) in panel p. + Rectangle lastRec = p.getComponent(compCount - 1).getBounds(); + + System.out.println("bounds of the first rectangle in "+ p.getName() + " = " + firstRec); + System.out.println("bounds of the last rectangle in "+ p.getName() + " = " + lastRec); + + borderLeft = lastRec.getX(); + borderRight = p.getWidth() - firstRec.getWidth() - firstRec.getX(); + borderTop = lastRec.getY(); + borderBottom = p.getHeight() - firstRec.getHeight() - firstRec.getY(); + + return areBordersEqual(borderLeft, borderRight) && + areBordersEqual(borderTop, borderBottom); + } + + /** + * Given two borders border1 and border2 check if they are equal. + * + * @param border1 one of the borders being compared + * @param border2 the other border being compared + * @return true if border1 and border2 are equal to each other (i.e. + * their width/height difference is at most 1, assuming the + * smallest pixel is of size 1), false otherwise + */ + public static boolean areBordersEqual(double border1, double border2) { + return Math.abs(border1 - border2) <= 1; } public static void main(String[] args) {