This commit is contained in:
Yuri Nesterenko 2009-07-01 00:17:02 -07:00
commit 130ebaebe5
42 changed files with 952 additions and 471 deletions

View File

@ -125,6 +125,7 @@ SUNWprivate_1.1 {
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;

View File

@ -32,6 +32,7 @@ import java.awt.peer.LightweightPeer;
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 @@ public abstract class AWTEvent extends EventObject {
if (!GraphicsEnvironment.isHeadless()) {
initIDs();
}
AWTAccessor.setAWTEventAccessor(
new AWTAccessor.AWTEventAccessor() {
public void setPosted(AWTEvent ev) {
ev.isPosted = true;
}
});
}
private static synchronized Field get_InputEvent_CanAccessSystemClipboard() {

View File

@ -861,6 +861,17 @@ public abstract class Component implements ImageObserver, MenuContainer,
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 @@ public abstract class Component implements ImageObserver, MenuContainer,
// ****************** 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() {

View File

@ -425,15 +425,13 @@ public class ContainerOrderFocusTraversalPolicy extends FocusTraversalPolicy
}
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;
}
}
}

View File

@ -262,12 +262,6 @@ public class Dialog extends Window {
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>();

View File

@ -43,6 +43,7 @@ import sun.awt.AWTAutoShutdown;
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 @@ public class EventQueue {
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();

View File

@ -30,6 +30,7 @@ import java.io.IOException;
import java.io.ObjectInputStream;
import sun.awt.AppContext;
import sun.awt.SunToolkit;
import sun.awt.AWTAccessor;
import javax.accessibility.*;
/**
@ -109,6 +110,22 @@ public abstract class MenuComponent implements java.io.Serializable {
*/
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

View File

@ -28,6 +28,7 @@ package java.awt;
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 @@ public class PopupMenu extends Menu {
transient boolean isTrayIconPopup = false;
static {
AWTAccessor.setPopupMenuAccessor(
new AWTAccessor.PopupMenuAccessor() {
public boolean isTrayIconPopup(PopupMenu popupMenu) {
return popupMenu.isTrayIconPopup;
}
});
}
/*
* JDK 1.1 serialVersionUID
*/

View File

@ -3658,7 +3658,7 @@ public class Window extends Container implements Accessible {
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 @@ public class Window extends Container implements Accessible {
{
return window.calculateSecurityWarningPosition(x, y, w, h);
}
public void setLWRequestStatus(Window changed, boolean status) {
changed.syncLWRequests = status;
}
}); // WindowAccessor
} // static

View File

@ -36,6 +36,7 @@ import java.util.logging.*;
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 @@ class BufferStrategyPaintManager extends RepaintManager.PaintManager {
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 @@ class BufferStrategyPaintManager extends RepaintManager.PaintManager {
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().

View File

@ -30,6 +30,7 @@ import java.util.Hashtable;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Rectangle;
import sun.awt.SunToolkit;
import javax.accessibility.*;
@ -195,9 +196,12 @@ public class JLayeredPane extends JComponent implements Accessible {
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;

View File

@ -29,6 +29,7 @@ import java.awt.Container;
import java.awt.ComponentOrientation;
import java.util.Comparator;
import java.io.*;
import sun.awt.SunToolkit;
/**
@ -226,11 +227,11 @@ public class LayoutFocusTraversalPolicy extends SortingFocusTraversalPolicy
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) {

View File

@ -32,6 +32,7 @@ import java.awt.Color;
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 @@ public abstract class LookAndFeel
// 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);
}

View File

@ -444,11 +444,10 @@ public class SortingFocusTraversalPolicy
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;

View File

@ -40,6 +40,7 @@ import sun.reflect.misc.MethodUtil;
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 @@ public class TransferHandler implements Serializable {
? ((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 @@ public class TransferHandler implements Serializable {
? 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);
}

View File

@ -60,6 +60,7 @@ import sun.swing.SwingUtilities2;
import java.lang.reflect.Method;
import java.util.HashMap;
import sun.awt.AppContext;
import sun.awt.AWTAccessor;
/**
@ -1472,21 +1473,7 @@ public class UIManager implements Serializable
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);
}
}

View File

@ -76,6 +76,7 @@ import sun.awt.AppContext;
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 @@ public abstract class JTextComponent extends JComponent implements Scrollable, A
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

View File

@ -30,6 +30,7 @@ import java.awt.geom.Point2D;
import java.awt.image.BufferedImage;
import sun.misc.Unsafe;
import java.awt.peer.ComponentPeer;
/**
* The AWTAccessor utility class.
@ -98,6 +99,21 @@ public final class AWTAccessor {
* 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 @@ public final class AWTAccessor {
*/
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);
}
/*
@ -215,6 +229,51 @@ public final class AWTAccessor {
void removeLastFocusRequest(Component heavyweight);
}
/*
* 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.
*/
@ -240,6 +299,21 @@ public final class AWTAccessor {
*/
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.
*/
@ -286,6 +360,9 @@ public final class AWTAccessor {
* 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 @@ public final class AWTAccessor {
}
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;
}
}

View File

@ -77,14 +77,7 @@ public abstract class SunToolkit extends Toolkit
*/
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 @@ public abstract class SunToolkit extends Toolkit
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 @@ public abstract class SunToolkit extends Toolkit
* 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 abstract class SunToolkit extends Toolkit
*/
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 @@ public abstract class SunToolkit extends Toolkit
* 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);
@ -756,36 +712,6 @@ public abstract class SunToolkit extends Toolkit
}
}
/*
* 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.
@ -796,13 +722,14 @@ public abstract class SunToolkit extends Toolkit
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 @@ public abstract class SunToolkit extends Toolkit
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 abstract class SunToolkit extends Toolkit
*/
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 abstract class SunToolkit extends Toolkit
*/
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 abstract class SunToolkit extends Toolkit
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

View File

@ -202,8 +202,16 @@ public abstract class ShellFolder extends File {
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;
}

View File

@ -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;
}
}
}

View File

@ -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;
}
}

View File

@ -145,7 +145,7 @@ public class XKeysym {
{
// 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 @@ public class XKeysym {
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;

View File

@ -1177,6 +1177,7 @@ public final class XToolkit extends UNIXToolkit implements Runnable {
awtLock();
try {
XlibWrapper.XBell(getDisplay(), 0);
XlibWrapper.XFlush(getDisplay());
} finally {
awtUnlock();
}
@ -1435,9 +1436,14 @@ public final class XToolkit extends UNIXToolkit implements Runnable {
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 @@ public final class XToolkit extends UNIXToolkit implements Runnable {
*/
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( awt_IsXsunKPBehavior == 0 ) {
if( XlibWrapper.IsXsunKPBehavior(getDisplay()) ) {
awt_IsXsunKPBehavior = XSUN_KP_BEHAVIOR;
}else{
awt_IsXsunKPBehavior = XORG_KP_BEHAVIOR;
}
}
if( ! XlibWrapper.ServerVendor(getDisplay()).startsWith("Sun Microsystems") ) {
awt_ServerInquired = true;
awt_IsXsunServer = false;
return false;
}
// 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();
}

View File

@ -352,6 +352,7 @@ static native String XSetLocaleModifiers(String modifier_list);
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);

View File

@ -183,7 +183,7 @@ tojava public static boolean isKPEvent( XKeyEvent ev )
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 */
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;

View File

@ -1181,6 +1181,38 @@ JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_VendorRelease
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) {

View File

@ -417,6 +417,15 @@ public abstract class WComponentPeer extends WObjectPeer
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 @@ public abstract class WComponentPeer extends WObjectPeer
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 @@ public abstract class WComponentPeer extends WObjectPeer
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 @@ public abstract class WComponentPeer extends WObjectPeer
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
}

View File

@ -211,9 +211,10 @@ public class WEmbeddedFrame extends EmbeddedFrame {
*/
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);
}

View File

@ -237,4 +237,11 @@ public class WFileDialogPeer extends WWindowPeer implements FileDialogPeer {
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() {}
}

View File

@ -29,33 +29,25 @@ import java.awt.peer.*;
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) {

View File

@ -150,4 +150,11 @@ public class WPrintDialogPeer extends WWindowPeer implements DialogPeer {
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() {}
}

View File

@ -38,8 +38,6 @@ import sun.awt.SunHints;
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 @@ public class GDIWindowSurfaceData extends SurfaceData {
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());

View File

@ -5975,17 +5975,7 @@ ret:
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)

View File

@ -381,19 +381,29 @@ LRESULT CALLBACK AwtFrame::ProxyWindowProc(HWND hwnd, UINT message,
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);
}
}
m_proxyFocusOwner = ::CreateWindow(TEXT("STATIC"),
TEXT("ProxyFocusOwner"),
WS_CHILD,
0, 0, 0, 0, GetHWnd(), NULL,
AwtToolkit::GetInstance().
GetModuleHandle(),
NULL);
void AwtFrame::_CreateProxyFocusOwner(void *param)
{
DASSERT(AwtToolkit::IsMainThread());
m_proxyDefWindowProc = ComCtl32Util::GetInstance().SubclassHWND(m_proxyFocusOwner, ProxyWindowProc);
AwtFrame *f = (AwtFrame *)param;
DASSERT(f->m_proxyFocusOwner == NULL);
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()

View File

@ -117,7 +117,6 @@ public:
INLINE BOOL IsUndecorated() { return m_isUndecorated; }
INLINE HWND GetProxyFocusOwner() {
DASSERT(AwtToolkit::MainThread() == ::GetCurrentThreadId());
if (m_proxyFocusOwner == NULL) {
CreateProxyFocusOwner();
}
@ -165,6 +164,8 @@ private:
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);

View File

@ -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();
}
}

View File

@ -104,7 +104,7 @@ comp[unfocusable] - <comp> is set unfocusable.
*/
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 @@ class PolicyTest10 extends AbstractPolicyTest {
}
}
}
/*
* 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";
}
}

View File

@ -105,7 +105,7 @@ comp[unfocusable] - <comp> is set unfocusable.
*/
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 @@ class PolicyTest10 extends AbstractPolicyTest {
}
}
}
/*
* 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";
}
}

View File

@ -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>

View File

@ -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()
}

View File

@ -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,27 +91,99 @@ public class LayoutExtraGaps extends Frame {
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();
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))
if (isComponentCentredLTR(yellowPanel) && isComponentCentredLTR(bluePanel)
&& isComponentCentredLTR(blackPanel) && isComponentCentredRTL(redPanel))
{
throw new RuntimeException("Test failed. GridLayout doesn't center component.");
} else {
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);
}
/**
* 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) {
new LayoutExtraGaps();
}