mirror of
https://github.com/openjdk/jdk.git
synced 2026-02-26 02:00:12 +00:00
Merge
This commit is contained in:
commit
83d6ffcacb
@ -257,7 +257,7 @@ public class AquaInternalFrameUI extends BasicInternalFrameUI implements SwingCo
|
||||
}
|
||||
|
||||
public Dimension getPreferredSize(JComponent x) {
|
||||
Dimension preferredSize = super.getMinimumSize(x);
|
||||
Dimension preferredSize = super.getPreferredSize(x);
|
||||
Dimension minimumSize = frame.getMinimumSize();
|
||||
if (preferredSize.width < minimumSize.width) {
|
||||
preferredSize.width = minimumSize.width;
|
||||
|
||||
@ -60,6 +60,10 @@ public class AquaScrollPaneUI extends javax.swing.plaf.basic.BasicScrollPaneUI {
|
||||
if (wasVisible) {
|
||||
vScrollBar.setVisible(true);
|
||||
}
|
||||
|
||||
// Consume the event even when the scrollBar is invisible
|
||||
// see #7124320
|
||||
e.consume();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2012, Oracle and/or its affiliates. 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
|
||||
@ -29,6 +29,7 @@ import java.awt.GraphicsConfiguration;
|
||||
import java.awt.GraphicsDevice;
|
||||
import java.awt.Window;
|
||||
import java.awt.AWTPermission;
|
||||
import java.awt.DisplayMode;
|
||||
|
||||
import sun.java2d.opengl.CGLGraphicsConfig;
|
||||
|
||||
@ -178,4 +179,33 @@ public class CGraphicsDevice extends GraphicsDevice {
|
||||
peer.exitFullScreenMode();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isDisplayChangeSupported() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setDisplayMode(DisplayMode dm) {
|
||||
nativeSetDisplayMode(displayID, dm.getWidth(), dm.getHeight(), dm.getBitDepth(), dm.getRefreshRate());
|
||||
if (isFullScreenSupported() && getFullScreenWindow() != null) {
|
||||
getFullScreenWindow().setSize(dm.getWidth(), dm.getHeight());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public DisplayMode getDisplayMode() {
|
||||
return nativeGetDisplayMode(displayID);
|
||||
}
|
||||
|
||||
@Override
|
||||
public DisplayMode[] getDisplayModes() {
|
||||
return nativeGetDisplayModes(displayID);
|
||||
}
|
||||
|
||||
private native void nativeSetDisplayMode(int displayID, int w, int h, int bpp, int refrate);
|
||||
|
||||
private native DisplayMode nativeGetDisplayMode(int displayID);
|
||||
|
||||
private native DisplayMode[] nativeGetDisplayModes(int displayID);
|
||||
}
|
||||
|
||||
@ -181,6 +181,10 @@ public class CGraphicsEnvironment extends SunGraphicsEnvironment {
|
||||
return devices.values().toArray(new CGraphicsDevice[devices.values().size()]);
|
||||
}
|
||||
|
||||
public synchronized GraphicsDevice getScreenDevice(int displayID) {
|
||||
return devices.get(displayID);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected synchronized int getNumScreens() {
|
||||
return devices.size();
|
||||
|
||||
@ -245,6 +245,15 @@ final class LWListPeer
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setFont(Font font) {
|
||||
super.setFont(font);
|
||||
if (getView() != null) {
|
||||
getView().setFont(font);
|
||||
LWListPeer.this.revalidate();
|
||||
}
|
||||
}
|
||||
|
||||
private final class JListDelegate extends JList<Object> {
|
||||
|
||||
JListDelegate() {
|
||||
|
||||
@ -68,7 +68,7 @@ public class LWWindowPeer
|
||||
|
||||
private Insets insets = new Insets(0, 0, 0, 0);
|
||||
|
||||
private int screenOn = -1;
|
||||
private GraphicsDevice graphicsDevice;
|
||||
private GraphicsConfiguration graphicsConfig;
|
||||
|
||||
private SurfaceData surfaceData;
|
||||
@ -868,17 +868,6 @@ public class LWWindowPeer
|
||||
return 0;
|
||||
}
|
||||
|
||||
private static GraphicsConfiguration getScreenGraphicsConfig(int screen) {
|
||||
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
|
||||
GraphicsDevice[] gds = ge.getScreenDevices();
|
||||
if (screen >= gds.length) {
|
||||
// This could happen during device addition/removal. Use
|
||||
// the default screen device in this case
|
||||
return ge.getDefaultScreenDevice().getDefaultConfiguration();
|
||||
}
|
||||
return gds[screen].getDefaultConfiguration();
|
||||
}
|
||||
|
||||
/*
|
||||
* This method is called when window's graphics config is changed from
|
||||
* the app code (e.g. when the window is made non-opaque) or when
|
||||
@ -893,7 +882,7 @@ public class LWWindowPeer
|
||||
}
|
||||
// If window's graphics config is changed from the app code, the
|
||||
// config correspond to the same device as before; when the window
|
||||
// is moved by user, screenOn is updated in checkIfOnNewScreen().
|
||||
// is moved by user, graphicsDevice is updated in checkIfOnNewScreen().
|
||||
// In either case, there's nothing to do with screenOn here
|
||||
graphicsConfig = gc;
|
||||
}
|
||||
@ -902,16 +891,17 @@ public class LWWindowPeer
|
||||
}
|
||||
|
||||
private void checkIfOnNewScreen() {
|
||||
int windowScreen = platformWindow.getScreenImOn();
|
||||
GraphicsDevice newGraphicsDevice = platformWindow.getGraphicsDevice();
|
||||
synchronized (getStateLock()) {
|
||||
if (windowScreen == screenOn) {
|
||||
if (graphicsDevice == newGraphicsDevice) {
|
||||
return;
|
||||
}
|
||||
screenOn = windowScreen;
|
||||
graphicsDevice = newGraphicsDevice;
|
||||
}
|
||||
|
||||
// TODO: DisplayChangedListener stuff
|
||||
final GraphicsConfiguration newGC = getScreenGraphicsConfig(windowScreen);
|
||||
final GraphicsConfiguration newGC = newGraphicsDevice.getDefaultConfiguration();
|
||||
|
||||
if (!setGraphicsConfig(newGC)) return;
|
||||
|
||||
SunToolkit.executeOnEventHandlerThread(getTarget(), new Runnable() {
|
||||
|
||||
@ -67,9 +67,9 @@ public interface PlatformWindow {
|
||||
public void setBounds(int x, int y, int w, int h);
|
||||
|
||||
/*
|
||||
* Returns the screen number where the window is.
|
||||
* Returns the graphics device where the window is.
|
||||
*/
|
||||
public int getScreenImOn();
|
||||
public GraphicsDevice getGraphicsDevice();
|
||||
|
||||
/*
|
||||
* Returns the location of the window.
|
||||
|
||||
@ -26,6 +26,7 @@
|
||||
package sun.lwawt.macosx;
|
||||
|
||||
import java.awt.*;
|
||||
import java.awt.image.BufferedImage;
|
||||
|
||||
public class CCustomCursor extends Cursor {
|
||||
static Dimension sMaxCursorSize;
|
||||
@ -36,7 +37,6 @@ public class CCustomCursor extends Cursor {
|
||||
}
|
||||
|
||||
Image fImage;
|
||||
private boolean isImageOk = false;
|
||||
Point fHotspot;
|
||||
|
||||
public CCustomCursor(final Image cursor, final Point hotSpot, final String name) throws IndexOutOfBoundsException, HeadlessException {
|
||||
@ -61,21 +61,19 @@ public class CCustomCursor extends Cursor {
|
||||
// Fix for bug 4212593 The Toolkit.createCustomCursor does not
|
||||
// check absence of the image of cursor
|
||||
// If the image is invalid, the cursor will be hidden (made completely
|
||||
// transparent). In this case, getBestCursorSize() will adjust negative w and h,
|
||||
// but we need to set the hotspot inside the image here.
|
||||
// transparent).
|
||||
if (tracker.isErrorAny() || width < 0 || height < 0) {
|
||||
fHotspot.x = fHotspot.y = 0;
|
||||
isImageOk = false;
|
||||
width = height = 1;
|
||||
fImage = createTransparentImage(width, height);
|
||||
} else {
|
||||
isImageOk = true;
|
||||
}
|
||||
|
||||
// Scale image to nearest supported size
|
||||
final Dimension nativeSize = toolkit.getBestCursorSize(width, height);
|
||||
if (nativeSize.width != width || nativeSize.height != height) {
|
||||
fImage = fImage.getScaledInstance(nativeSize.width, nativeSize.height, Image.SCALE_DEFAULT);
|
||||
width = nativeSize.width;
|
||||
height = nativeSize.height;
|
||||
// Scale image to nearest supported size
|
||||
final Dimension nativeSize = toolkit.getBestCursorSize(width, height);
|
||||
if (nativeSize.width != width || nativeSize.height != height) {
|
||||
fImage = fImage.getScaledInstance(nativeSize.width, nativeSize.height, Image.SCALE_DEFAULT);
|
||||
width = nativeSize.width;
|
||||
height = nativeSize.height;
|
||||
}
|
||||
}
|
||||
|
||||
// NOTE: this was removed for 3169146, but in 1.5 the JCK tests for an exception and fails if one isn't thrown.
|
||||
@ -98,6 +96,21 @@ public class CCustomCursor extends Cursor {
|
||||
}
|
||||
}
|
||||
|
||||
private static BufferedImage createTransparentImage(int w, int h) {
|
||||
GraphicsEnvironment ge =
|
||||
GraphicsEnvironment.getLocalGraphicsEnvironment();
|
||||
GraphicsDevice gs = ge.getDefaultScreenDevice();
|
||||
GraphicsConfiguration gc = gs.getDefaultConfiguration();
|
||||
|
||||
BufferedImage img = gc.createCompatibleImage(w, h, Transparency.BITMASK);
|
||||
Graphics2D g = (Graphics2D)img.getGraphics();
|
||||
g.setBackground(new Color(0, 0, 0, 0));
|
||||
g.clearRect(0, 0, w, h);
|
||||
g.dispose();
|
||||
|
||||
return img;
|
||||
}
|
||||
|
||||
public static Dimension getBestCursorSize(final int preferredWidth, final int preferredHeight) {
|
||||
// With Panther, cursors have no limit on their size. So give the client their
|
||||
// preferred size, but no larger than half the dimensions of the main screen
|
||||
@ -111,31 +124,26 @@ public class CCustomCursor extends Cursor {
|
||||
}
|
||||
|
||||
// Called from native when the cursor is set
|
||||
// Returns long array of [NSImage ptr, x hotspot, y hotspot]
|
||||
CImage fCImage;
|
||||
long getImageData() {
|
||||
if (fCImage != null) {
|
||||
return fCImage.ptr;
|
||||
}
|
||||
|
||||
if (isImageOk) {
|
||||
try {
|
||||
fCImage = CImage.getCreator().createFromImage(fImage);
|
||||
|
||||
if (fCImage == null) {
|
||||
isImageOk = false;
|
||||
return 0L;
|
||||
} else {
|
||||
return fCImage.ptr;
|
||||
}
|
||||
} catch (IllegalArgumentException iae) {
|
||||
// Silently return null - we want to hide cursor by providing an empty
|
||||
// ByteArray or just null
|
||||
try {
|
||||
fCImage = CImage.getCreator().createFromImage(fImage);
|
||||
if (fCImage == null) {
|
||||
// Something unexpected happened: CCustomCursor constructor
|
||||
// takes care of invalid cursor images, yet createFromImage()
|
||||
// failed to do its job. Return null to keep the cursor unchanged.
|
||||
return 0L;
|
||||
} else {
|
||||
return fCImage.ptr;
|
||||
}
|
||||
} catch (IllegalArgumentException iae) {
|
||||
// see comment above
|
||||
return 0L;
|
||||
}
|
||||
|
||||
return 0L;
|
||||
}
|
||||
|
||||
Point getHotSpot() {
|
||||
|
||||
@ -86,11 +86,10 @@ public class CPlatformEmbeddedFrame implements PlatformWindow {
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getScreenImOn() {
|
||||
public GraphicsDevice getGraphicsDevice() {
|
||||
// REMIND: return the main screen for the initial implementation
|
||||
CGraphicsConfig gc = (CGraphicsConfig)peer.getGraphicsConfiguration();
|
||||
CGraphicsDevice device = gc.getDevice();
|
||||
return device.getCoreGraphicsScreen();
|
||||
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
|
||||
return ge.getDefaultScreenDevice();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@ -109,8 +109,14 @@ final class CPlatformResponder {
|
||||
final long when = System.currentTimeMillis();
|
||||
final int scrollType = MouseWheelEvent.WHEEL_UNIT_SCROLL;
|
||||
final int scrollAmount = 1;
|
||||
int wheelRotation = (int) delta;
|
||||
int signum = (int) Math.signum(delta);
|
||||
if (signum * delta < 1) {
|
||||
wheelRotation = signum;
|
||||
}
|
||||
// invert the wheelRotation for the peer
|
||||
peer.dispatchMouseWheelEvent(when, x, y, modifiers, scrollType,
|
||||
scrollAmount, (int) -delta, -delta, null);
|
||||
scrollAmount, -wheelRotation, -delta, null);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@ -64,7 +64,7 @@ public class CPlatformWindow extends CFRetainedResource implements PlatformWindo
|
||||
private static native void nativeSetEnabled(long nsWindowPtr, boolean isEnabled);
|
||||
private static native void nativeSynthesizeMouseEnteredExitedEvents(long nsWindowPtr);
|
||||
|
||||
private static native int nativeGetScreenNSWindowIsOn_AppKitThread(long nsWindowPtr);
|
||||
private static native int nativeGetNSWindowDisplayID_AppKitThread(long nsWindowPtr);
|
||||
|
||||
// Loger to report issues happened during execution but that do not affect functionality
|
||||
private static final PlatformLogger logger = PlatformLogger.getLogger("sun.lwawt.macosx.CPlatformWindow");
|
||||
@ -452,13 +452,18 @@ public class CPlatformWindow extends CFRetainedResource implements PlatformWindo
|
||||
return new Point(nativeBounds.x, nativeBounds.y);
|
||||
}
|
||||
|
||||
@Override // PlatformWindow
|
||||
public int getScreenImOn() {
|
||||
// REMIND: we could also acquire screenID from the
|
||||
// graphicsConfig.getDevice().getCoreGraphicsScreen()
|
||||
// which might look a bit less natural but don't
|
||||
// require new native accessor.
|
||||
return nativeGetScreenNSWindowIsOn_AppKitThread(getNSWindowPtr());
|
||||
@Override
|
||||
public GraphicsDevice getGraphicsDevice() {
|
||||
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
|
||||
CGraphicsEnvironment cge = (CGraphicsEnvironment)ge;
|
||||
int displayID = nativeGetNSWindowDisplayID_AppKitThread(getNSWindowPtr());
|
||||
GraphicsDevice gd = cge.getScreenDevice(displayID);
|
||||
if (gd == null) {
|
||||
// this could possibly happen during device removal
|
||||
// use the default screen device in this case
|
||||
gd = ge.getDefaultScreenDevice();
|
||||
}
|
||||
return gd;
|
||||
}
|
||||
|
||||
@Override // PlatformWindow
|
||||
|
||||
@ -43,6 +43,7 @@
|
||||
NSSize javaMaxSize;
|
||||
jint styleBits;
|
||||
BOOL isEnabled;
|
||||
NSWindow *nsWindow;
|
||||
}
|
||||
|
||||
// An instance of either AWTWindow_Normal or AWTWindow_Panel
|
||||
|
||||
@ -1080,38 +1080,28 @@ JNIEXPORT void JNICALL Java_sun_lwawt_macosx_CPlatformWindow_nativeSynthesizeMou
|
||||
|
||||
/*
|
||||
* Class: sun_lwawt_macosx_CPlatformWindow
|
||||
* Method: nativeGetScreenNSWindowIsOn_AppKitThread
|
||||
* Method: nativeGetDisplayID_AppKitThread
|
||||
* Signature: (J)I
|
||||
*/
|
||||
JNIEXPORT jint JNICALL Java_sun_lwawt_macosx_CPlatformWindow_nativeGetScreenNSWindowIsOn_1AppKitThread
|
||||
JNIEXPORT jint JNICALL
|
||||
Java_sun_lwawt_macosx_CPlatformWindow_nativeGetNSWindowDisplayID_1AppKitThread
|
||||
(JNIEnv *env, jclass clazz, jlong windowPtr)
|
||||
{
|
||||
jint index = -1;
|
||||
jint ret; // CGDirectDisplayID
|
||||
|
||||
JNF_COCOA_ENTER(env);
|
||||
AWT_ASSERT_APPKIT_THREAD;
|
||||
|
||||
NSWindow *nsWindow = OBJC(windowPtr);
|
||||
NSScreen* screen = [nsWindow screen];
|
||||
|
||||
//+++gdb NOTE: This is using a linear search of the screens. If it should
|
||||
// prove to be a bottleneck, this can definitely be improved. However,
|
||||
// many screens should prove to be the exception, rather than the rule.
|
||||
NSArray* screens = [NSScreen screens];
|
||||
NSUInteger i;
|
||||
for (i = 0; i < [screens count]; i++)
|
||||
{
|
||||
if ([[screens objectAtIndex:i] isEqualTo:screen])
|
||||
{
|
||||
index = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
NSWindow *window = OBJC(windowPtr);
|
||||
NSScreen *screen = [window screen];
|
||||
NSDictionary *deviceDescription = [screen deviceDescription];
|
||||
NSNumber *displayID = [deviceDescription objectForKey:@"NSScreenNumber"];
|
||||
ret = (jint)[displayID intValue];
|
||||
|
||||
JNF_COCOA_EXIT(env);
|
||||
return 1;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* Class: sun_lwawt_macosx_CPlatformWindow
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2012, Oracle and/or its affiliates. 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
|
||||
@ -25,6 +25,84 @@
|
||||
|
||||
#include "LWCToolkit.h"
|
||||
|
||||
/*
|
||||
* Convert the mode string to the more convinient bits per pixel value
|
||||
*/
|
||||
static int getBPPFromModeString(CFStringRef mode)
|
||||
{
|
||||
if ((CFStringCompare(mode, CFSTR(kIO30BitDirectPixels), kCFCompareCaseInsensitive) == kCFCompareEqualTo)) {
|
||||
// This is a strange mode, where we using 10 bits per RGB component and pack it into 32 bits
|
||||
// Java is not ready to work with this mode but we have to specify it as supported
|
||||
return 30;
|
||||
}
|
||||
else if (CFStringCompare(mode, CFSTR(IO32BitDirectPixels), kCFCompareCaseInsensitive) == kCFCompareEqualTo) {
|
||||
return 32;
|
||||
}
|
||||
else if (CFStringCompare(mode, CFSTR(IO16BitDirectPixels), kCFCompareCaseInsensitive) == kCFCompareEqualTo) {
|
||||
return 16;
|
||||
}
|
||||
else if (CFStringCompare(mode, CFSTR(IO8BitIndexedPixels), kCFCompareCaseInsensitive) == kCFCompareEqualTo) {
|
||||
return 8;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Find the best possible match in the list of display modes that we can switch to based on
|
||||
* the provided parameters.
|
||||
*/
|
||||
static CGDisplayModeRef getBestModeForParameters(CFArrayRef allModes, int w, int h, int bpp, int refrate) {
|
||||
CGDisplayModeRef bestGuess = NULL;
|
||||
CFIndex numModes = CFArrayGetCount(allModes), n;
|
||||
int thisBpp = 0;
|
||||
for(n = 0; n < numModes; n++ ) {
|
||||
CGDisplayModeRef cRef = (CGDisplayModeRef) CFArrayGetValueAtIndex(allModes, n);
|
||||
if(cRef == NULL) {
|
||||
continue;
|
||||
}
|
||||
CFStringRef modeString = CGDisplayModeCopyPixelEncoding(cRef);
|
||||
thisBpp = getBPPFromModeString(modeString);
|
||||
CFRelease(modeString);
|
||||
if (thisBpp != bpp || (int)CGDisplayModeGetHeight(cRef) != h || (int)CGDisplayModeGetWidth(cRef) != w) {
|
||||
// One of the key parameters does not match
|
||||
continue;
|
||||
}
|
||||
// Refresh rate might be 0 in display mode and we ask for specific display rate
|
||||
// but if we do not find exact match then 0 refresh rate might be just Ok
|
||||
if (CGDisplayModeGetRefreshRate(cRef) == refrate) {
|
||||
// Exact match
|
||||
return cRef;
|
||||
}
|
||||
if (CGDisplayModeGetRefreshRate(cRef) == 0) {
|
||||
// Not exactly what was asked for, but may fit our needs if we don't find an exact match
|
||||
bestGuess = cRef;
|
||||
}
|
||||
}
|
||||
return bestGuess;
|
||||
}
|
||||
|
||||
/*
|
||||
* Create a new java.awt.DisplayMode instance based on provided CGDisplayModeRef
|
||||
*/
|
||||
static jobject createJavaDisplayMode(CGDisplayModeRef mode, JNIEnv *env, jint displayID) {
|
||||
jobject ret = NULL;
|
||||
jint h, w, bpp, refrate;
|
||||
JNF_COCOA_ENTER(env);
|
||||
CFStringRef currentBPP = CGDisplayModeCopyPixelEncoding(mode);
|
||||
bpp = getBPPFromModeString(currentBPP);
|
||||
refrate = CGDisplayModeGetRefreshRate(mode);
|
||||
h = CGDisplayModeGetHeight(mode);
|
||||
w = CGDisplayModeGetWidth(mode);
|
||||
CFRelease(currentBPP);
|
||||
static JNF_CLASS_CACHE(jc_DisplayMode, "java/awt/DisplayMode");
|
||||
static JNF_CTOR_CACHE(jc_DisplayMode_ctor, jc_DisplayMode, "(IIII)V");
|
||||
ret = JNFNewObject(env, jc_DisplayMode_ctor, w, h, bpp, refrate);
|
||||
JNF_COCOA_EXIT(env);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Class: sun_awt_CGraphicsDevice
|
||||
* Method: nativeGetXResolution
|
||||
@ -62,3 +140,89 @@ Java_sun_awt_CGraphicsDevice_nativeGetYResolution
|
||||
jfloat dpi = rect.size.height / inches;
|
||||
return dpi;
|
||||
}
|
||||
|
||||
/*
|
||||
* Class: sun_awt_CGraphicsDevice
|
||||
* Method: nativeSetDisplayMode
|
||||
* Signature: (IIIII)V
|
||||
*/
|
||||
JNIEXPORT void JNICALL
|
||||
Java_sun_awt_CGraphicsDevice_nativeSetDisplayMode
|
||||
(JNIEnv *env, jclass class, jint displayID, jint w, jint h, jint bpp, jint refrate)
|
||||
{
|
||||
JNF_COCOA_ENTER(env);
|
||||
CFArrayRef allModes = CGDisplayCopyAllDisplayModes(displayID, NULL);
|
||||
CGDisplayModeRef closestMatch = getBestModeForParameters(allModes, (int)w, (int)h, (int)bpp, (int)refrate);
|
||||
if (closestMatch != NULL) {
|
||||
[JNFRunLoop performOnMainThreadWaiting:YES withBlock:^(){
|
||||
CGDisplayConfigRef config;
|
||||
CGError retCode = CGBeginDisplayConfiguration(&config);
|
||||
if (retCode == kCGErrorSuccess) {
|
||||
CGConfigureDisplayWithDisplayMode(config, displayID, closestMatch, NULL);
|
||||
CGCompleteDisplayConfiguration(config, kCGConfigureForAppOnly);
|
||||
if (config != NULL) {
|
||||
CFRelease(config);
|
||||
}
|
||||
}
|
||||
}];
|
||||
}
|
||||
CFRelease(allModes);
|
||||
JNF_COCOA_EXIT(env);
|
||||
}
|
||||
|
||||
/*
|
||||
* Class: sun_awt_CGraphicsDevice
|
||||
* Method: nativeGetDisplayMode
|
||||
* Signature: (I)Ljava/awt/DisplayMode
|
||||
*/
|
||||
JNIEXPORT jobject JNICALL
|
||||
Java_sun_awt_CGraphicsDevice_nativeGetDisplayMode
|
||||
(JNIEnv *env, jclass class, jint displayID)
|
||||
{
|
||||
jobject ret = NULL;
|
||||
CGDisplayModeRef currentMode = CGDisplayCopyDisplayMode(displayID);
|
||||
ret = createJavaDisplayMode(currentMode, env, displayID);
|
||||
CGDisplayModeRelease(currentMode);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* Class: sun_awt_CGraphicsDevice
|
||||
* Method: nativeGetDisplayMode
|
||||
* Signature: (I)[Ljava/awt/DisplayModes
|
||||
*/
|
||||
JNIEXPORT jobjectArray JNICALL
|
||||
Java_sun_awt_CGraphicsDevice_nativeGetDisplayModes
|
||||
(JNIEnv *env, jclass class, jint displayID)
|
||||
{
|
||||
jobjectArray jreturnArray = NULL;
|
||||
JNF_COCOA_ENTER(env);
|
||||
CFArrayRef allModes = CGDisplayCopyAllDisplayModes(displayID, NULL);
|
||||
CFIndex numModes = CFArrayGetCount(allModes);
|
||||
static JNF_CLASS_CACHE(jc_DisplayMode, "java/awt/DisplayMode");
|
||||
|
||||
jreturnArray = JNFNewObjectArray(env, &jc_DisplayMode, (jsize) numModes);
|
||||
if (!jreturnArray) {
|
||||
NSLog(@"CGraphicsDevice can't create java array of DisplayMode objects");
|
||||
return nil;
|
||||
}
|
||||
|
||||
CFIndex n;
|
||||
for (n=0; n < numModes; n++) {
|
||||
CGDisplayModeRef cRef = (CGDisplayModeRef) CFArrayGetValueAtIndex(allModes, n);
|
||||
if (cRef != NULL) {
|
||||
jobject oneMode = createJavaDisplayMode(cRef, env, displayID);
|
||||
(*env)->SetObjectArrayElement(env, jreturnArray, n, oneMode);
|
||||
if ((*env)->ExceptionOccurred(env)) {
|
||||
(*env)->ExceptionDescribe(env);
|
||||
(*env)->ExceptionClear(env);
|
||||
continue;
|
||||
}
|
||||
(*env)->DeleteLocalRef(env, oneMode);
|
||||
}
|
||||
}
|
||||
CFRelease(allModes);
|
||||
JNF_COCOA_EXIT(env);
|
||||
|
||||
return jreturnArray;
|
||||
}
|
||||
|
||||
@ -561,7 +561,7 @@ public abstract class KeyboardFocusManager
|
||||
rootAncestor = (Container)focusOwner;
|
||||
}
|
||||
if (rootAncestor != null) {
|
||||
setGlobalCurrentFocusCycleRoot(rootAncestor);
|
||||
setGlobalCurrentFocusCycleRootPriv(rootAncestor);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -826,7 +826,7 @@ public class JPopupMenu extends JComponent implements Accessible,MenuElement {
|
||||
popupFactory.setPopupType(PopupFactory.LIGHT_WEIGHT_POPUP);
|
||||
}
|
||||
else {
|
||||
popupFactory.setPopupType(PopupFactory.MEDIUM_WEIGHT_POPUP);
|
||||
popupFactory.setPopupType(PopupFactory.HEAVY_WEIGHT_POPUP);
|
||||
}
|
||||
|
||||
// adjust the location of the popup
|
||||
@ -853,6 +853,11 @@ public class JPopupMenu extends JComponent implements Accessible,MenuElement {
|
||||
/**
|
||||
* Sets the location of the upper left corner of the
|
||||
* popup menu using x, y coordinates.
|
||||
* <p>
|
||||
* The method changes the geometry-related data. Therefore,
|
||||
* the native windowing system may ignore such requests, or it may modify
|
||||
* the requested data, so that the {@code JPopupMenu} object is placed and sized
|
||||
* in a way that corresponds closely to the desktop settings.
|
||||
*
|
||||
* @param x the x coordinate of the popup's new position
|
||||
* in the screen's coordinate space
|
||||
|
||||
@ -203,12 +203,6 @@ public class PopupFactory {
|
||||
popupType = HEAVY_WEIGHT_POPUP;
|
||||
break;
|
||||
}
|
||||
} else if (c instanceof Window) {
|
||||
Window w = (Window) c;
|
||||
if (!w.isOpaque() || w.getOpacity() < 1 || w.getShape() != null) {
|
||||
popupType = HEAVY_WEIGHT_POPUP;
|
||||
break;
|
||||
}
|
||||
}
|
||||
c = c.getParent();
|
||||
}
|
||||
|
||||
@ -134,6 +134,9 @@ public class Ruler extends JFrame {
|
||||
|
||||
{
|
||||
jPopupMenu.add(new JMenuItem(exitAction));
|
||||
|
||||
// To avoid popup cutting by main window shape forbid light-weight popups
|
||||
jPopupMenu.setLightWeightPopupEnabled(false);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@ -721,15 +721,17 @@ abstract class XDecoratedPeer extends XWindowPeer {
|
||||
// Location, Client size + insets
|
||||
newLocation = new Point(xe.get_x() - currentInsets.left, xe.get_y() - currentInsets.top);
|
||||
} else {
|
||||
// CDE/MWM/Metacity/Sawfish bug: if shell is resized using
|
||||
// top or left border, we don't receive synthetic
|
||||
// ConfigureNotify, only the one from X with zero
|
||||
// coordinates. This is the workaround to get real
|
||||
// location, 6261336
|
||||
// ICCCM 4.1.5 states that a real ConfigureNotify will be sent when
|
||||
// a window is resized but the client can not tell if the window was
|
||||
// moved or not. The client should consider the position as unkown
|
||||
// and use TranslateCoordinates to find the actual position.
|
||||
//
|
||||
// TODO this should be the default for every case.
|
||||
switch (XWM.getWMID()) {
|
||||
case XWM.CDE_WM:
|
||||
case XWM.MOTIF_WM:
|
||||
case XWM.METACITY_WM:
|
||||
case XWM.MUTTER_WM:
|
||||
case XWM.SAWFISH_WM:
|
||||
{
|
||||
Point xlocation = queryXLocation();
|
||||
|
||||
@ -1416,6 +1416,7 @@ public class XKeysym {
|
||||
keysym2JavaKeycodeHash.put( Long.valueOf(XKeySymConstants.XK_Meta_L), new Keysym2JavaKeycode(java.awt.event.KeyEvent.VK_META, java.awt.event.KeyEvent.KEY_LOCATION_LEFT));
|
||||
keysym2JavaKeycodeHash.put( Long.valueOf(XKeySymConstants.XK_Meta_R), new Keysym2JavaKeycode(java.awt.event.KeyEvent.VK_META, java.awt.event.KeyEvent.KEY_LOCATION_RIGHT));
|
||||
keysym2JavaKeycodeHash.put( Long.valueOf(XKeySymConstants.XK_Caps_Lock), new Keysym2JavaKeycode(java.awt.event.KeyEvent.VK_CAPS_LOCK, java.awt.event.KeyEvent.KEY_LOCATION_STANDARD));
|
||||
keysym2JavaKeycodeHash.put( Long.valueOf(XKeySymConstants.XK_Shift_Lock), new Keysym2JavaKeycode(java.awt.event.KeyEvent.VK_CAPS_LOCK, java.awt.event.KeyEvent.KEY_LOCATION_STANDARD));
|
||||
|
||||
/* Misc Functions */
|
||||
keysym2JavaKeycodeHash.put( Long.valueOf(XKeySymConstants.XK_Print), new Keysym2JavaKeycode(java.awt.event.KeyEvent.VK_PRINTSCREEN, java.awt.event.KeyEvent.KEY_LOCATION_STANDARD));
|
||||
@ -1590,6 +1591,21 @@ public class XKeysym {
|
||||
keysym2JavaKeycodeHash.put( Long.valueOf(XKeySymConstants.XK_Kanji), new Keysym2JavaKeycode(java.awt.event.KeyEvent.VK_CONVERT, java.awt.event.KeyEvent.KEY_LOCATION_STANDARD));
|
||||
/* Type 5c Japanese keyboard: nihongo */
|
||||
keysym2JavaKeycodeHash.put( Long.valueOf(XKeySymConstants.XK_Henkan_Mode), new Keysym2JavaKeycode(java.awt.event.KeyEvent.VK_INPUT_METHOD_ON_OFF, java.awt.event.KeyEvent.KEY_LOCATION_STANDARD));
|
||||
keysym2JavaKeycodeHash.put( Long.valueOf(XKeySymConstants.XK_Eisu_Shift ), new Keysym2JavaKeycode(java.awt.event.KeyEvent.VK_ALPHANUMERIC , java.awt.event.KeyEvent.KEY_LOCATION_STANDARD));
|
||||
keysym2JavaKeycodeHash.put( Long.valueOf(XKeySymConstants.XK_Eisu_toggle ), new Keysym2JavaKeycode(java.awt.event.KeyEvent.VK_ALPHANUMERIC , java.awt.event.KeyEvent.KEY_LOCATION_STANDARD));
|
||||
keysym2JavaKeycodeHash.put( Long.valueOf(XKeySymConstants.XK_Zenkaku ), new Keysym2JavaKeycode(java.awt.event.KeyEvent.VK_FULL_WIDTH , java.awt.event.KeyEvent.KEY_LOCATION_STANDARD));
|
||||
keysym2JavaKeycodeHash.put( Long.valueOf(XKeySymConstants.XK_Hankaku ), new Keysym2JavaKeycode(java.awt.event.KeyEvent.VK_HALF_WIDTH , java.awt.event.KeyEvent.KEY_LOCATION_STANDARD));
|
||||
keysym2JavaKeycodeHash.put( Long.valueOf(XKeySymConstants.XK_Hiragana ), new Keysym2JavaKeycode(java.awt.event.KeyEvent.VK_HIRAGANA , java.awt.event.KeyEvent.KEY_LOCATION_STANDARD));
|
||||
keysym2JavaKeycodeHash.put( Long.valueOf(XKeySymConstants.XK_Katakana ), new Keysym2JavaKeycode(java.awt.event.KeyEvent.VK_KATAKANA , java.awt.event.KeyEvent.KEY_LOCATION_STANDARD));
|
||||
keysym2JavaKeycodeHash.put( Long.valueOf(XKeySymConstants.XK_Romaji ), new Keysym2JavaKeycode(java.awt.event.KeyEvent.VK_JAPANESE_ROMAN , java.awt.event.KeyEvent.KEY_LOCATION_STANDARD));
|
||||
keysym2JavaKeycodeHash.put( Long.valueOf(XKeySymConstants.XK_Kana_Shift ), new Keysym2JavaKeycode(java.awt.event.KeyEvent.VK_KANA , java.awt.event.KeyEvent.KEY_LOCATION_STANDARD));
|
||||
keysym2JavaKeycodeHash.put( Long.valueOf(XKeySymConstants.XK_Kana_Lock ), new Keysym2JavaKeycode(java.awt.event.KeyEvent.VK_KANA_LOCK , java.awt.event.KeyEvent.KEY_LOCATION_STANDARD));
|
||||
keysym2JavaKeycodeHash.put( Long.valueOf(XKeySymConstants.XK_Muhenkan ), new Keysym2JavaKeycode(java.awt.event.KeyEvent.VK_NONCONVERT , java.awt.event.KeyEvent.KEY_LOCATION_STANDARD));
|
||||
keysym2JavaKeycodeHash.put( Long.valueOf(XKeySymConstants.XK_Zen_Koho ), new Keysym2JavaKeycode(java.awt.event.KeyEvent.VK_ALL_CANDIDATES , java.awt.event.KeyEvent.KEY_LOCATION_STANDARD));
|
||||
keysym2JavaKeycodeHash.put( Long.valueOf(XKeySymConstants.XK_Kanji_Bangou ), new Keysym2JavaKeycode(java.awt.event.KeyEvent.VK_CODE_INPUT , java.awt.event.KeyEvent.KEY_LOCATION_STANDARD));
|
||||
keysym2JavaKeycodeHash.put( Long.valueOf(XKeySymConstants.XK_Mae_Koho ), new Keysym2JavaKeycode(java.awt.event.KeyEvent.VK_PREVIOUS_CANDIDATE , java.awt.event.KeyEvent.KEY_LOCATION_STANDARD));
|
||||
|
||||
|
||||
/* VK_KANA_LOCK is handled separately because it generates the
|
||||
* same keysym as ALT_GRAPH in spite of its different behavior.
|
||||
*/
|
||||
|
||||
@ -141,7 +141,7 @@ class XLabelPeer extends XComponentPeer implements LabelPeer {
|
||||
}
|
||||
public void setFont(Font f) {
|
||||
super.setFont(f);
|
||||
target.repaint();
|
||||
repaint();
|
||||
}
|
||||
|
||||
public void setAlignment(int align) {
|
||||
|
||||
@ -102,7 +102,8 @@ final class XWM
|
||||
METACITY_WM = 11,
|
||||
COMPIZ_WM = 12,
|
||||
LG3D_WM = 13,
|
||||
CWM_WM = 14;
|
||||
CWM_WM = 14,
|
||||
MUTTER_WM = 15;
|
||||
public String toString() {
|
||||
switch (WMID) {
|
||||
case NO_WM:
|
||||
@ -131,6 +132,8 @@ final class XWM
|
||||
return "LookingGlass";
|
||||
case CWM_WM:
|
||||
return "CWM";
|
||||
case MUTTER_WM:
|
||||
return "Mutter";
|
||||
case UNDETERMINED_WM:
|
||||
default:
|
||||
return "Undetermined WM";
|
||||
@ -573,6 +576,10 @@ final class XWM
|
||||
// getIntProperty(XToolkit.getDefaultRootWindow(), XAtom.XA_CARDINAL)) == 0);
|
||||
}
|
||||
|
||||
static boolean isMutter() {
|
||||
return isNetWMName("Mutter");
|
||||
}
|
||||
|
||||
static boolean isNonReparentingWM() {
|
||||
return (XWM.getWMID() == XWM.COMPIZ_WM || XWM.getWMID() == XWM.LG3D_WM || XWM.getWMID() == XWM.CWM_WM);
|
||||
}
|
||||
@ -742,6 +749,8 @@ final class XWM
|
||||
awt_wmgr = XWM.ENLIGHTEN_WM;
|
||||
} else if (isMetacity()) {
|
||||
awt_wmgr = XWM.METACITY_WM;
|
||||
} else if (isMutter()) {
|
||||
awt_wmgr = XWM.MUTTER_WM;
|
||||
} else if (isSawfish()) {
|
||||
awt_wmgr = XWM.SAWFISH_WM;
|
||||
} else if (isKDE2()) {
|
||||
|
||||
@ -406,7 +406,7 @@ GetJavaProperties(JNIEnv *env)
|
||||
#ifdef MACOSX
|
||||
break;
|
||||
default:
|
||||
sprops.graphics_env = "sun.awt.HeadlessGraphicsEnvironment";
|
||||
sprops.graphics_env = "sun.java2d.HeadlessGraphicsEnvironment";
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -323,9 +323,8 @@ Java_com_sun_java_swing_plaf_gtk_GTKEngine_nativeFinishPainting(
|
||||
JNIEXPORT void JNICALL Java_com_sun_java_swing_plaf_gtk_GTKEngine_native_1switch_1theme(
|
||||
JNIEnv *env, jobject this)
|
||||
{
|
||||
fp_gdk_threads_enter();
|
||||
// Note that flush_gtk_event_loop takes care of locks (7053002)
|
||||
flush_gtk_event_loop();
|
||||
fp_gdk_threads_leave();
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@ -175,6 +175,7 @@ KeymapEntry keymapTable[] =
|
||||
{java_awt_event_KeyEvent_VK_META, XK_Meta_L, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_LEFT},
|
||||
{java_awt_event_KeyEvent_VK_META, XK_Meta_R, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_RIGHT},
|
||||
{java_awt_event_KeyEvent_VK_CAPS_LOCK, XK_Caps_Lock, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
|
||||
{java_awt_event_KeyEvent_VK_CAPS_LOCK, XK_Shift_Lock, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
|
||||
|
||||
/* Misc Functions */
|
||||
{java_awt_event_KeyEvent_VK_PRINTSCREEN, XK_Print, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
|
||||
@ -350,6 +351,24 @@ KeymapEntry keymapTable[] =
|
||||
* same keysym as ALT_GRAPH in spite of its different behavior.
|
||||
*/
|
||||
|
||||
{java_awt_event_KeyEvent_VK_ALL_CANDIDATES, XK_Zen_Koho, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
|
||||
{java_awt_event_KeyEvent_VK_ALPHANUMERIC, XK_Eisu_Shift, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
|
||||
{java_awt_event_KeyEvent_VK_ALPHANUMERIC, XK_Eisu_toggle, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
|
||||
{java_awt_event_KeyEvent_VK_CODE_INPUT, XK_Kanji_Bangou, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
|
||||
{java_awt_event_KeyEvent_VK_FULL_WIDTH, XK_Zenkaku, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
|
||||
{java_awt_event_KeyEvent_VK_HALF_WIDTH, XK_Hankaku, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
|
||||
{java_awt_event_KeyEvent_VK_HIRAGANA, XK_Hiragana, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
|
||||
{java_awt_event_KeyEvent_VK_JAPANESE_HIRAGANA, XK_Hiragana, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
|
||||
{java_awt_event_KeyEvent_VK_KATAKANA, XK_Katakana, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
|
||||
{java_awt_event_KeyEvent_VK_JAPANESE_KATAKANA, XK_Katakana, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
|
||||
{java_awt_event_KeyEvent_VK_JAPANESE_ROMAN, XK_Romaji, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
|
||||
{java_awt_event_KeyEvent_VK_KANA, XK_Kana_Shift, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
|
||||
{java_awt_event_KeyEvent_VK_KANA_LOCK, XK_Kana_Lock, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
|
||||
{java_awt_event_KeyEvent_VK_KANJI, XK_Kanji, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
|
||||
{java_awt_event_KeyEvent_VK_NONCONVERT, XK_Muhenkan, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
|
||||
{java_awt_event_KeyEvent_VK_PREVIOUS_CANDIDATE, XK_Mae_Koho, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
|
||||
{java_awt_event_KeyEvent_VK_ROMAN_CHARACTERS, XK_Romaji, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
|
||||
|
||||
{java_awt_event_KeyEvent_VK_COMPOSE, XK_Multi_key, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
|
||||
{java_awt_event_KeyEvent_VK_ALT_GRAPH, XK_Mode_switch, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
|
||||
|
||||
|
||||
@ -558,6 +558,8 @@ AwtComponent::CreateHWnd(JNIEnv *env, LPCWSTR title,
|
||||
|
||||
m_hwnd = hwnd;
|
||||
|
||||
::ImmAssociateContext(m_hwnd, NULL);
|
||||
|
||||
SetDrawState((jint)JAWT_LOCK_SURFACE_CHANGED |
|
||||
(jint)JAWT_LOCK_BOUNDS_CHANGED |
|
||||
(jint)JAWT_LOCK_CLIP_CHANGED);
|
||||
|
||||
@ -74,135 +74,10 @@ void AwtTextArea::Dispose()
|
||||
AwtTextComponent::Dispose();
|
||||
}
|
||||
|
||||
LPCTSTR AwtTextArea::GetClassName() {
|
||||
static BOOL richedLibraryLoaded = FALSE;
|
||||
if (!richedLibraryLoaded) {
|
||||
JDK_LoadSystemLibrary("RICHED20.DLL");
|
||||
richedLibraryLoaded = TRUE;
|
||||
}
|
||||
return RICHEDIT_CLASS;
|
||||
}
|
||||
|
||||
/* Create a new AwtTextArea object and window. */
|
||||
AwtTextArea* AwtTextArea::Create(jobject peer, jobject parent)
|
||||
{
|
||||
JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
|
||||
|
||||
jobject target = NULL;
|
||||
AwtTextArea* c = NULL;
|
||||
|
||||
try {
|
||||
if (env->EnsureLocalCapacity(1) < 0) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
PDATA pData;
|
||||
AwtCanvas* awtParent;
|
||||
JNI_CHECK_PEER_GOTO(parent, done);
|
||||
|
||||
awtParent = (AwtCanvas*)pData;
|
||||
JNI_CHECK_NULL_GOTO(awtParent, "null awtParent", done);
|
||||
|
||||
target = env->GetObjectField(peer, AwtObject::targetID);
|
||||
JNI_CHECK_NULL_GOTO(target, "null target", done);
|
||||
|
||||
c = new AwtTextArea();
|
||||
|
||||
{
|
||||
/* Adjust style for scrollbar visibility and word wrap */
|
||||
DWORD scroll_style;
|
||||
jint scrollbarVisibility =
|
||||
env->GetIntField(target, AwtTextArea::scrollbarVisibilityID);
|
||||
|
||||
switch (scrollbarVisibility) {
|
||||
case java_awt_TextArea_SCROLLBARS_NONE:
|
||||
scroll_style = ES_AUTOVSCROLL;
|
||||
break;
|
||||
case java_awt_TextArea_SCROLLBARS_VERTICAL_ONLY:
|
||||
scroll_style = WS_VSCROLL | ES_AUTOVSCROLL;
|
||||
break;
|
||||
case java_awt_TextArea_SCROLLBARS_HORIZONTAL_ONLY:
|
||||
scroll_style = WS_HSCROLL | ES_AUTOHSCROLL | ES_AUTOVSCROLL;
|
||||
break;
|
||||
case java_awt_TextArea_SCROLLBARS_BOTH:
|
||||
scroll_style = WS_VSCROLL | WS_HSCROLL |
|
||||
ES_AUTOVSCROLL | ES_AUTOHSCROLL;
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
* Specify ES_DISABLENOSCROLL - RichEdit control style to disable
|
||||
* scrollbars instead of hiding them when not needed.
|
||||
*/
|
||||
DWORD style = WS_CHILD | WS_CLIPSIBLINGS | ES_LEFT | ES_MULTILINE |
|
||||
ES_WANTRETURN | scroll_style | ES_DISABLENOSCROLL;
|
||||
DWORD exStyle = WS_EX_CLIENTEDGE;
|
||||
if (GetRTL()) {
|
||||
exStyle |= WS_EX_RIGHT | WS_EX_LEFTSCROLLBAR;
|
||||
if (GetRTLReadingOrder())
|
||||
exStyle |= WS_EX_RTLREADING;
|
||||
}
|
||||
|
||||
jint x = env->GetIntField(target, AwtComponent::xID);
|
||||
jint y = env->GetIntField(target, AwtComponent::yID);
|
||||
jint width = env->GetIntField(target, AwtComponent::widthID);
|
||||
jint height = env->GetIntField(target, AwtComponent::heightID);
|
||||
|
||||
c->CreateHWnd(env, L"", style, exStyle,
|
||||
x, y, width, height,
|
||||
awtParent->GetHWnd(),
|
||||
reinterpret_cast<HMENU>(static_cast<INT_PTR>(
|
||||
awtParent->CreateControlID())),
|
||||
::GetSysColor(COLOR_WINDOWTEXT),
|
||||
::GetSysColor(COLOR_WINDOW),
|
||||
peer);
|
||||
|
||||
// Fix for 4753116.
|
||||
// If it is not win95 (we are using Richedit 2.0)
|
||||
// we set plain text mode, in which the control is
|
||||
// similar to a standard edit control:
|
||||
// - The text in a plain text control can have only
|
||||
// one format.
|
||||
// - The user cannot paste rich text formats, such as RTF
|
||||
// or embedded objects into a plain text control.
|
||||
// - Rich text mode controls always have a default
|
||||
// end-of-document marker or carriage return,
|
||||
// to format paragraphs.
|
||||
// kdm@sparc.spb.su
|
||||
c->SendMessage(EM_SETTEXTMODE, TM_PLAINTEXT, 0);
|
||||
|
||||
c->m_backgroundColorSet = TRUE;
|
||||
/* suppress inheriting parent's color. */
|
||||
c->UpdateBackground(env, target);
|
||||
c->SendMessage(EM_SETMARGINS, EC_LEFTMARGIN | EC_RIGHTMARGIN,
|
||||
MAKELPARAM(1, 1));
|
||||
/*
|
||||
* Fix for BugTraq Id 4260109.
|
||||
* Set the text limit to the maximum.
|
||||
* Use EM_EXLIMITTEXT for RichEdit controls.
|
||||
* For some reason RichEdit 1.0 becomes read-only if the
|
||||
* specified limit is greater than 0x7FFFFFFD.
|
||||
*/
|
||||
c->SendMessage(EM_EXLIMITTEXT, 0, 0x7FFFFFFD);
|
||||
|
||||
/* Unregister RichEdit built-in drop target. */
|
||||
VERIFY(::RevokeDragDrop(c->GetHWnd()) != DRAGDROP_E_INVALIDHWND);
|
||||
|
||||
/* To enforce CF_TEXT format for paste operations. */
|
||||
VERIFY(c->SendMessage(EM_SETOLECALLBACK, 0,
|
||||
(LPARAM)&GetOleCallback()));
|
||||
|
||||
c->SendMessage(EM_SETEVENTMASK, 0, ENM_CHANGE);
|
||||
}
|
||||
} catch (...) {
|
||||
env->DeleteLocalRef(target);
|
||||
throw;
|
||||
}
|
||||
|
||||
done:
|
||||
env->DeleteLocalRef(target);
|
||||
|
||||
return c;
|
||||
return (AwtTextArea*) AwtTextComponent::Create(peer, parent, true);
|
||||
}
|
||||
|
||||
void AwtTextArea::EditSetSel(CHARRANGE &cr) {
|
||||
@ -220,11 +95,6 @@ void AwtTextArea::EditGetSel(CHARRANGE &cr) {
|
||||
SendMessage(EM_EXGETSEL, 0, reinterpret_cast<LPARAM>(&cr));
|
||||
}
|
||||
|
||||
LONG AwtTextArea::EditGetCharFromPos(POINT& pt) {
|
||||
return static_cast<LONG>(SendMessage(EM_CHARFROMPOS, 0,
|
||||
reinterpret_cast<LPARAM>(&pt)));
|
||||
}
|
||||
|
||||
/* Count how many '\n's are there in jStr */
|
||||
size_t AwtTextArea::CountNewLines(JNIEnv *env, jstring jStr, size_t maxlen)
|
||||
{
|
||||
@ -253,34 +123,6 @@ size_t AwtTextArea::CountNewLines(JNIEnv *env, jstring jStr, size_t maxlen)
|
||||
|
||||
BOOL AwtTextArea::InheritsNativeMouseWheelBehavior() {return true;}
|
||||
|
||||
MsgRouting
|
||||
AwtTextArea::PreProcessMsg(MSG& msg)
|
||||
{
|
||||
MsgRouting mr = mrPassAlong;
|
||||
static BOOL bPassAlongWmLButtonUp = TRUE;
|
||||
|
||||
if (msg.message == WM_LBUTTONDBLCLK) {
|
||||
bPassAlongWmLButtonUp = FALSE;
|
||||
}
|
||||
|
||||
/*
|
||||
* For some reason RichEdit 1.0 filters out WM_LBUTTONUP after
|
||||
* WM_LBUTTONDBLCLK. To work around this "feature" we send WM_LBUTTONUP
|
||||
* directly to the window procedure and consume instead of passing it
|
||||
* to the next hook.
|
||||
*/
|
||||
if (msg.message == WM_LBUTTONUP && bPassAlongWmLButtonUp == FALSE) {
|
||||
SendMessage(WM_LBUTTONUP, msg.wParam, msg.lParam);
|
||||
bPassAlongWmLButtonUp = TRUE;
|
||||
mr = mrConsume;
|
||||
}
|
||||
|
||||
if (mr == mrPassAlong) {
|
||||
mr = AwtComponent::PreProcessMsg(msg);
|
||||
}
|
||||
|
||||
return mr;
|
||||
}
|
||||
|
||||
LRESULT
|
||||
AwtTextArea::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) {
|
||||
@ -800,54 +642,6 @@ AwtTextArea::HandleEvent(MSG *msg, BOOL synthetic)
|
||||
return returnVal;
|
||||
}
|
||||
|
||||
/*
|
||||
* WM_CTLCOLOR is not sent by rich edit controls.
|
||||
* Use EM_SETCHARFORMAT and EM_SETBKGNDCOLOR to set
|
||||
* respectively foreground and background color.
|
||||
*/
|
||||
void AwtTextArea::SetColor(COLORREF c) {
|
||||
AwtComponent::SetColor(c);
|
||||
|
||||
CHARFORMAT cf;
|
||||
memset(&cf, 0, sizeof(cf));
|
||||
cf.cbSize = sizeof(cf);
|
||||
cf.dwMask = CFM_COLOR;
|
||||
|
||||
cf.crTextColor = ::IsWindowEnabled(GetHWnd()) ? GetColor() : ::GetSysColor(COLOR_3DSHADOW);
|
||||
|
||||
/*
|
||||
* The documentation for EM_GETCHARFORMAT is not exactly
|
||||
* correct. It appears that wParam has the same meaning
|
||||
* as for EM_SETCHARFORMAT. Our task is to secure that
|
||||
* all the characters in the control have the required
|
||||
* formatting. That's why we use SCF_ALL.
|
||||
*/
|
||||
VERIFY(SendMessage(EM_SETCHARFORMAT, SCF_ALL, (LPARAM)&cf));
|
||||
VERIFY(SendMessage(EM_SETCHARFORMAT, SCF_DEFAULT, (LPARAM)&cf));
|
||||
}
|
||||
|
||||
/*
|
||||
* In responce to EM_SETBKGNDCOLOR rich edit changes
|
||||
* its bg color and repaints itself so we don't need
|
||||
* to force repaint.
|
||||
*/
|
||||
void AwtTextArea::SetBackgroundColor(COLORREF c) {
|
||||
AwtComponent::SetBackgroundColor(c);
|
||||
SendMessage(EM_SETBKGNDCOLOR, (WPARAM)FALSE, (LPARAM)GetBackgroundColor());
|
||||
}
|
||||
|
||||
/*
|
||||
* Disabled edit control has grayed foreground.
|
||||
* Disabled RichEdit 1.0 control has original foreground.
|
||||
* Thus we have to set grayed foreground manually.
|
||||
*/
|
||||
void AwtTextArea::Enable(BOOL bEnable)
|
||||
{
|
||||
AwtComponent::Enable(bEnable);
|
||||
|
||||
SetColor(GetColor());
|
||||
}
|
||||
|
||||
|
||||
/* Fix for 4776535, 4648702
|
||||
* If width is 0 or 1 Windows hides the horizontal scroll bar even
|
||||
@ -1048,133 +842,3 @@ Java_sun_awt_windows_WTextAreaPeer_insertText(JNIEnv *env, jobject self,
|
||||
} /* extern "C" */
|
||||
|
||||
|
||||
AwtTextArea::OleCallback AwtTextArea::sm_oleCallback;
|
||||
|
||||
/************************************************************************
|
||||
* Inner class OleCallback definition.
|
||||
*/
|
||||
|
||||
AwtTextArea::OleCallback::OleCallback() {
|
||||
m_refs = 0;
|
||||
AddRef();
|
||||
}
|
||||
|
||||
STDMETHODIMP
|
||||
AwtTextArea::OleCallback::QueryInterface(REFIID riid, LPVOID * ppvObj) {
|
||||
|
||||
TRY;
|
||||
|
||||
if (::IsEqualIID(riid, IID_IUnknown)) {
|
||||
*ppvObj = (void __RPC_FAR *__RPC_FAR)(IUnknown*)this;
|
||||
AddRef();
|
||||
return S_OK;
|
||||
} else if (::IsEqualIID(riid, IID_IRichEditOleCallback)) {
|
||||
*ppvObj = (void __RPC_FAR *__RPC_FAR)(IRichEditOleCallback*)this;
|
||||
AddRef();
|
||||
return S_OK;
|
||||
} else {
|
||||
*ppvObj = NULL;
|
||||
return E_NOINTERFACE;
|
||||
}
|
||||
|
||||
CATCH_BAD_ALLOC_RET(E_OUTOFMEMORY);
|
||||
}
|
||||
|
||||
STDMETHODIMP_(ULONG)
|
||||
AwtTextArea::OleCallback::AddRef() {
|
||||
return ++m_refs;
|
||||
}
|
||||
|
||||
STDMETHODIMP_(ULONG)
|
||||
AwtTextArea::OleCallback::Release() {
|
||||
int refs;
|
||||
|
||||
if ((refs = --m_refs) == 0) delete this;
|
||||
|
||||
return (ULONG)refs;
|
||||
}
|
||||
|
||||
STDMETHODIMP
|
||||
AwtTextArea::OleCallback::GetNewStorage(LPSTORAGE FAR * ppstg) {
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
STDMETHODIMP
|
||||
AwtTextArea::OleCallback::GetInPlaceContext(LPOLEINPLACEFRAME FAR * ppipframe,
|
||||
LPOLEINPLACEUIWINDOW FAR* ppipuiDoc,
|
||||
LPOLEINPLACEFRAMEINFO pipfinfo)
|
||||
{
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
STDMETHODIMP
|
||||
AwtTextArea::OleCallback::ShowContainerUI(BOOL fShow) {
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
STDMETHODIMP
|
||||
AwtTextArea::OleCallback::QueryInsertObject(LPCLSID pclsid,
|
||||
LPSTORAGE pstg,
|
||||
LONG cp) {
|
||||
return NOERROR;
|
||||
}
|
||||
|
||||
STDMETHODIMP
|
||||
AwtTextArea::OleCallback::DeleteObject(LPOLEOBJECT poleobj) {
|
||||
return NOERROR;
|
||||
}
|
||||
|
||||
STDMETHODIMP
|
||||
AwtTextArea::OleCallback::QueryAcceptData(LPDATAOBJECT pdataobj,
|
||||
CLIPFORMAT *pcfFormat,
|
||||
DWORD reco,
|
||||
BOOL fReally,
|
||||
HGLOBAL hMetaPict) {
|
||||
if (reco == RECO_PASTE) {
|
||||
// If CF_TEXT format is available edit controls will select it,
|
||||
// otherwise if it is CF_UNICODETEXT is available it will be
|
||||
// selected, otherwise if CF_OEMTEXT is available it will be selected.
|
||||
if (::IsClipboardFormatAvailable(CF_TEXT)) {
|
||||
*pcfFormat = CF_TEXT;
|
||||
} else if (::IsClipboardFormatAvailable(CF_UNICODETEXT)) {
|
||||
*pcfFormat = CF_UNICODETEXT;
|
||||
} else if (::IsClipboardFormatAvailable(CF_OEMTEXT)) {
|
||||
*pcfFormat = CF_OEMTEXT;
|
||||
} else {
|
||||
// Don't allow rich edit to paste clipboard data
|
||||
// in other formats.
|
||||
*pcfFormat = CF_TEXT;
|
||||
}
|
||||
}
|
||||
|
||||
return NOERROR;
|
||||
}
|
||||
|
||||
STDMETHODIMP
|
||||
AwtTextArea::OleCallback::ContextSensitiveHelp(BOOL fEnterMode) {
|
||||
return NOERROR;
|
||||
}
|
||||
|
||||
STDMETHODIMP
|
||||
AwtTextArea::OleCallback::GetClipboardData(CHARRANGE *pchrg,
|
||||
DWORD reco,
|
||||
LPDATAOBJECT *ppdataobj) {
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
STDMETHODIMP
|
||||
AwtTextArea::OleCallback::GetDragDropEffect(BOOL fDrag,
|
||||
DWORD grfKeyState,
|
||||
LPDWORD pdwEffect) {
|
||||
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
|
||||
STDMETHODIMP
|
||||
AwtTextArea::OleCallback::GetContextMenu(WORD seltype,
|
||||
LPOLEOBJECT lpoleobj,
|
||||
CHARRANGE FAR * lpchrg,
|
||||
HMENU FAR * lphmenu) {
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
@ -51,15 +51,11 @@ public:
|
||||
|
||||
virtual void Dispose();
|
||||
|
||||
LPCTSTR GetClassName();
|
||||
|
||||
static AwtTextArea* Create(jobject self, jobject parent);
|
||||
|
||||
static size_t CountNewLines(JNIEnv *env, jstring jStr, size_t maxlen);
|
||||
static size_t GetALength(JNIEnv* env, jstring jStr, size_t maxlen);
|
||||
|
||||
MsgRouting PreProcessMsg(MSG& msg);
|
||||
|
||||
LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam);
|
||||
static LRESULT CALLBACK EditProc(HWND hWnd, UINT message,
|
||||
WPARAM wParam, LPARAM lParam);
|
||||
@ -72,9 +68,6 @@ public:
|
||||
|
||||
INLINE void SetIgnoreEnChange(BOOL b) { m_bIgnoreEnChange = b; }
|
||||
|
||||
virtual void SetColor(COLORREF c);
|
||||
virtual void SetBackgroundColor(COLORREF c);
|
||||
virtual void Enable(BOOL bEnable);
|
||||
virtual BOOL InheritsNativeMouseWheelBehavior();
|
||||
virtual void Reshape(int x, int y, int w, int h);
|
||||
|
||||
@ -87,40 +80,8 @@ public:
|
||||
|
||||
protected:
|
||||
|
||||
/*****************************************************************
|
||||
* Inner class OleCallback declaration.
|
||||
*/
|
||||
class OleCallback : public IRichEditOleCallback {
|
||||
public:
|
||||
OleCallback();
|
||||
|
||||
STDMETHODIMP QueryInterface(REFIID riid, LPVOID * ppvObj);
|
||||
STDMETHODIMP_(ULONG) AddRef();
|
||||
STDMETHODIMP_(ULONG) Release();
|
||||
STDMETHODIMP GetNewStorage(LPSTORAGE FAR * ppstg);
|
||||
STDMETHODIMP GetInPlaceContext(LPOLEINPLACEFRAME FAR * ppipframe,
|
||||
LPOLEINPLACEUIWINDOW FAR* ppipuiDoc,
|
||||
LPOLEINPLACEFRAMEINFO pipfinfo);
|
||||
STDMETHODIMP ShowContainerUI(BOOL fShow);
|
||||
STDMETHODIMP QueryInsertObject(LPCLSID pclsid, LPSTORAGE pstg, LONG cp);
|
||||
STDMETHODIMP DeleteObject(LPOLEOBJECT poleobj);
|
||||
STDMETHODIMP QueryAcceptData(LPDATAOBJECT pdataobj, CLIPFORMAT *pcfFormat,
|
||||
DWORD reco, BOOL fReally, HGLOBAL hMetaPict);
|
||||
STDMETHODIMP ContextSensitiveHelp(BOOL fEnterMode);
|
||||
STDMETHODIMP GetClipboardData(CHARRANGE *pchrg, DWORD reco,
|
||||
LPDATAOBJECT *ppdataobj);
|
||||
STDMETHODIMP GetDragDropEffect(BOOL fDrag, DWORD grfKeyState,
|
||||
LPDWORD pdwEffect);
|
||||
STDMETHODIMP GetContextMenu(WORD seltype, LPOLEOBJECT poleobj,
|
||||
CHARRANGE FAR * pchrg, HMENU FAR * phmenu);
|
||||
private:
|
||||
ULONG m_refs; // Reference count
|
||||
};//OleCallback class
|
||||
|
||||
INLINE static OleCallback& GetOleCallback() { return sm_oleCallback; }
|
||||
void EditSetSel(CHARRANGE &cr);
|
||||
void EditGetSel(CHARRANGE &cr);
|
||||
LONG EditGetCharFromPos(POINT& pt);
|
||||
private:
|
||||
// RichEdit 1.0 control generates EN_CHANGE notifications not only
|
||||
// on text changes, but also on any character formatting change.
|
||||
@ -140,8 +101,6 @@ protected:
|
||||
LONG m_lVDeltaAccum;
|
||||
|
||||
|
||||
static OleCallback sm_oleCallback;
|
||||
|
||||
};
|
||||
|
||||
#endif /* AWT_TEXTAREA_H */
|
||||
|
||||
@ -25,6 +25,8 @@
|
||||
|
||||
#include "awt_Toolkit.h"
|
||||
#include "awt_TextComponent.h"
|
||||
#include "awt_TextArea.h"
|
||||
#include "awt_TextField.h"
|
||||
#include "awt_Canvas.h"
|
||||
|
||||
#include "jni.h"
|
||||
@ -70,7 +72,152 @@ AwtTextComponent::AwtTextComponent() {
|
||||
}
|
||||
|
||||
LPCTSTR AwtTextComponent::GetClassName() {
|
||||
return TEXT("EDIT"); /* System provided edit control class */
|
||||
static BOOL richedLibraryLoaded = FALSE;
|
||||
if (!richedLibraryLoaded) {
|
||||
JDK_LoadSystemLibrary("RICHED20.DLL");
|
||||
richedLibraryLoaded = TRUE;
|
||||
}
|
||||
return RICHEDIT_CLASS;
|
||||
}
|
||||
|
||||
/* Create a new AwtTextArea or AwtTextField object and window. */
|
||||
AwtTextComponent* AwtTextComponent::Create(jobject peer, jobject parent, BOOL isMultiline)
|
||||
{
|
||||
JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
|
||||
|
||||
jobject target = NULL;
|
||||
AwtTextComponent* c = NULL;
|
||||
|
||||
try {
|
||||
if (env->EnsureLocalCapacity(1) < 0) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
PDATA pData;
|
||||
AwtCanvas* awtParent;
|
||||
JNI_CHECK_PEER_GOTO(parent, done);
|
||||
|
||||
awtParent = (AwtCanvas*)pData;
|
||||
JNI_CHECK_NULL_GOTO(awtParent, "null awtParent", done);
|
||||
|
||||
target = env->GetObjectField(peer, AwtObject::targetID);
|
||||
JNI_CHECK_NULL_GOTO(target, "null target", done);
|
||||
|
||||
if(isMultiline){
|
||||
c = new AwtTextArea();
|
||||
}else{
|
||||
c = new AwtTextField();
|
||||
}
|
||||
|
||||
{
|
||||
/* Adjust style for scrollbar visibility and word wrap */
|
||||
DWORD scroll_style;
|
||||
|
||||
if(isMultiline){
|
||||
|
||||
jint scrollbarVisibility =
|
||||
env->GetIntField(target, AwtTextArea::scrollbarVisibilityID);
|
||||
|
||||
switch (scrollbarVisibility) {
|
||||
case java_awt_TextArea_SCROLLBARS_NONE:
|
||||
scroll_style = ES_AUTOVSCROLL;
|
||||
break;
|
||||
case java_awt_TextArea_SCROLLBARS_VERTICAL_ONLY:
|
||||
scroll_style = WS_VSCROLL | ES_AUTOVSCROLL;
|
||||
break;
|
||||
case java_awt_TextArea_SCROLLBARS_HORIZONTAL_ONLY:
|
||||
scroll_style = WS_HSCROLL | ES_AUTOHSCROLL | ES_AUTOVSCROLL;
|
||||
break;
|
||||
case java_awt_TextArea_SCROLLBARS_BOTH:
|
||||
scroll_style = WS_VSCROLL | WS_HSCROLL |
|
||||
ES_AUTOVSCROLL | ES_AUTOHSCROLL;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
DWORD style = WS_CHILD | WS_CLIPSIBLINGS | ES_LEFT;
|
||||
|
||||
/*
|
||||
* Specify ES_DISABLENOSCROLL - RichEdit control style to disable
|
||||
* scrollbars instead of hiding them when not needed.
|
||||
*/
|
||||
style |= isMultiline ? ES_MULTILINE | ES_WANTRETURN | scroll_style
|
||||
| ES_DISABLENOSCROLL : ES_AUTOHSCROLL;
|
||||
|
||||
|
||||
DWORD exStyle = WS_EX_CLIENTEDGE;
|
||||
if (GetRTL()) {
|
||||
exStyle |= WS_EX_RIGHT | WS_EX_LEFTSCROLLBAR;
|
||||
if (GetRTLReadingOrder())
|
||||
exStyle |= WS_EX_RTLREADING;
|
||||
}
|
||||
|
||||
|
||||
jint x = env->GetIntField(target, AwtComponent::xID);
|
||||
jint y = env->GetIntField(target, AwtComponent::yID);
|
||||
jint width = env->GetIntField(target, AwtComponent::widthID);
|
||||
jint height = env->GetIntField(target, AwtComponent::heightID);
|
||||
|
||||
c->CreateHWnd(env, L"", style, exStyle,
|
||||
x, y, width, height,
|
||||
awtParent->GetHWnd(),
|
||||
reinterpret_cast<HMENU>(static_cast<INT_PTR>(
|
||||
awtParent->CreateControlID())),
|
||||
::GetSysColor(COLOR_WINDOWTEXT),
|
||||
::GetSysColor(COLOR_WINDOW),
|
||||
peer);
|
||||
|
||||
// Fix for 4753116.
|
||||
// If it is not win95 (we are using Richedit 2.0)
|
||||
// we set plain text mode, in which the control is
|
||||
// similar to a standard edit control:
|
||||
// - The text in a plain text control can have only
|
||||
// one format.
|
||||
// - The user cannot paste rich text formats, such as RTF
|
||||
// or embedded objects into a plain text control.
|
||||
// - Rich text mode controls always have a default
|
||||
// end-of-document marker or carriage return,
|
||||
// to format paragraphs.
|
||||
// kdm@sparc.spb.su
|
||||
c->SendMessage(EM_SETTEXTMODE, TM_PLAINTEXT, 0);
|
||||
|
||||
c->m_backgroundColorSet = TRUE;
|
||||
/* suppress inheriting parent's color. */
|
||||
c->UpdateBackground(env, target);
|
||||
c->SendMessage(EM_SETMARGINS, EC_LEFTMARGIN | EC_RIGHTMARGIN,
|
||||
MAKELPARAM(1, 1));
|
||||
/*
|
||||
* Fix for BugTraq Id 4260109.
|
||||
* Set the text limit to the maximum.
|
||||
* Use EM_EXLIMITTEXT for RichEdit controls.
|
||||
* For some reason RichEdit 1.0 becomes read-only if the
|
||||
* specified limit is greater than 0x7FFFFFFD.
|
||||
*/
|
||||
c->SendMessage(EM_EXLIMITTEXT, 0, 0x7FFFFFFD);
|
||||
|
||||
/* Unregister RichEdit built-in drop target. */
|
||||
VERIFY(::RevokeDragDrop(c->GetHWnd()) != DRAGDROP_E_INVALIDHWND);
|
||||
|
||||
/* To enforce CF_TEXT format for paste operations. */
|
||||
VERIFY(c->SendMessage(EM_SETOLECALLBACK, 0,
|
||||
(LPARAM)&GetOleCallback()));
|
||||
|
||||
c->SendMessage(EM_SETEVENTMASK, 0, ENM_CHANGE);
|
||||
}
|
||||
} catch (...) {
|
||||
env->DeleteLocalRef(target);
|
||||
throw;
|
||||
}
|
||||
|
||||
done:
|
||||
env->DeleteLocalRef(target);
|
||||
|
||||
return c;
|
||||
}
|
||||
|
||||
LONG AwtTextComponent::EditGetCharFromPos(POINT& pt) {
|
||||
return static_cast<LONG>(SendMessage(EM_CHARFROMPOS, 0,
|
||||
reinterpret_cast<LPARAM>(&pt)));
|
||||
}
|
||||
|
||||
/* Set a suitable font to IME against the component font. */
|
||||
@ -463,6 +610,54 @@ ret:
|
||||
delete ees;
|
||||
}
|
||||
|
||||
/*
|
||||
* Disabled edit control has grayed foreground.
|
||||
* Disabled RichEdit 1.0 control has original foreground.
|
||||
* Thus we have to set grayed foreground manually.
|
||||
*/
|
||||
void AwtTextComponent::Enable(BOOL bEnable)
|
||||
{
|
||||
AwtComponent::Enable(bEnable);
|
||||
SetColor(GetColor());
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* WM_CTLCOLOR is not sent by rich edit controls.
|
||||
* Use EM_SETCHARFORMAT and EM_SETBKGNDCOLOR to set
|
||||
* respectively foreground and background color.
|
||||
*/
|
||||
void AwtTextComponent::SetColor(COLORREF c) {
|
||||
AwtComponent::SetColor(c);
|
||||
|
||||
CHARFORMAT cf;
|
||||
memset(&cf, 0, sizeof(cf));
|
||||
cf.cbSize = sizeof(cf);
|
||||
cf.dwMask = CFM_COLOR;
|
||||
|
||||
cf.crTextColor = ::IsWindowEnabled(GetHWnd()) ? GetColor() : ::GetSysColor(COLOR_3DSHADOW);
|
||||
|
||||
/*
|
||||
* The documentation for EM_GETCHARFORMAT is not exactly
|
||||
* correct. It appears that wParam has the same meaning
|
||||
* as for EM_SETCHARFORMAT. Our task is to secure that
|
||||
* all the characters in the control have the required
|
||||
* formatting. That's why we use SCF_ALL.
|
||||
*/
|
||||
VERIFY(SendMessage(EM_SETCHARFORMAT, SCF_ALL, (LPARAM)&cf));
|
||||
VERIFY(SendMessage(EM_SETCHARFORMAT, SCF_DEFAULT, (LPARAM)&cf));
|
||||
}
|
||||
|
||||
/*
|
||||
* In responce to EM_SETBKGNDCOLOR rich edit changes
|
||||
* its bg color and repaints itself so we don't need
|
||||
* to force repaint.
|
||||
*/
|
||||
void AwtTextComponent::SetBackgroundColor(COLORREF c) {
|
||||
AwtComponent::SetBackgroundColor(c);
|
||||
SendMessage(EM_SETBKGNDCOLOR, (WPARAM)FALSE, (LPARAM)GetBackgroundColor());
|
||||
}
|
||||
|
||||
|
||||
/************************************************************************
|
||||
* WTextComponentPeer native methods
|
||||
@ -623,6 +818,127 @@ Java_sun_awt_windows_WTextComponentPeer_initIDs(JNIEnv *env, jclass cls)
|
||||
CATCH_BAD_ALLOC;
|
||||
}
|
||||
|
||||
|
||||
AwtTextComponent::OleCallback AwtTextComponent::sm_oleCallback;
|
||||
|
||||
/************************************************************************
|
||||
* Inner class OleCallback definition.
|
||||
*/
|
||||
|
||||
AwtTextComponent::OleCallback::OleCallback() {
|
||||
m_refs = 0;
|
||||
AddRef();
|
||||
}
|
||||
|
||||
STDMETHODIMP
|
||||
AwtTextComponent::OleCallback::QueryInterface(REFIID riid, LPVOID * ppvObj) {
|
||||
if (::IsEqualIID(riid, IID_IUnknown) ||::IsEqualIID(riid, IID_IRichEditOleCallback) ) {
|
||||
*ppvObj = static_cast<IRichEditOleCallback*>(this);
|
||||
AddRef();
|
||||
return S_OK;
|
||||
}
|
||||
*ppvObj = NULL;
|
||||
return E_NOINTERFACE;
|
||||
}
|
||||
|
||||
|
||||
STDMETHODIMP_(ULONG)
|
||||
AwtTextComponent::OleCallback::AddRef() {
|
||||
return ++m_refs;
|
||||
}
|
||||
|
||||
STDMETHODIMP_(ULONG)
|
||||
AwtTextComponent::OleCallback::Release() {
|
||||
return (ULONG)--m_refs;
|
||||
}
|
||||
|
||||
STDMETHODIMP
|
||||
AwtTextComponent::OleCallback::GetNewStorage(LPSTORAGE FAR * ppstg) {
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
STDMETHODIMP
|
||||
AwtTextComponent::OleCallback::GetInPlaceContext(LPOLEINPLACEFRAME FAR * ppipframe,
|
||||
LPOLEINPLACEUIWINDOW FAR* ppipuiDoc,
|
||||
LPOLEINPLACEFRAMEINFO pipfinfo)
|
||||
{
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
STDMETHODIMP
|
||||
AwtTextComponent::OleCallback::ShowContainerUI(BOOL fShow) {
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
STDMETHODIMP
|
||||
AwtTextComponent::OleCallback::QueryInsertObject(LPCLSID pclsid,
|
||||
LPSTORAGE pstg,
|
||||
LONG cp) {
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
STDMETHODIMP
|
||||
AwtTextComponent::OleCallback::DeleteObject(LPOLEOBJECT poleobj) {
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
STDMETHODIMP
|
||||
AwtTextComponent::OleCallback::QueryAcceptData(LPDATAOBJECT pdataobj,
|
||||
CLIPFORMAT *pcfFormat,
|
||||
DWORD reco,
|
||||
BOOL fReally,
|
||||
HGLOBAL hMetaPict) {
|
||||
if (reco == RECO_PASTE) {
|
||||
// If CF_TEXT format is available edit controls will select it,
|
||||
// otherwise if it is CF_UNICODETEXT is available it will be
|
||||
// selected, otherwise if CF_OEMTEXT is available it will be selected.
|
||||
if (::IsClipboardFormatAvailable(CF_TEXT)) {
|
||||
*pcfFormat = CF_TEXT;
|
||||
} else if (::IsClipboardFormatAvailable(CF_UNICODETEXT)) {
|
||||
*pcfFormat = CF_UNICODETEXT;
|
||||
} else if (::IsClipboardFormatAvailable(CF_OEMTEXT)) {
|
||||
*pcfFormat = CF_OEMTEXT;
|
||||
} else {
|
||||
// Don't allow rich edit to paste clipboard data
|
||||
// in other formats.
|
||||
*pcfFormat = CF_TEXT;
|
||||
}
|
||||
}
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
STDMETHODIMP
|
||||
AwtTextComponent::OleCallback::ContextSensitiveHelp(BOOL fEnterMode) {
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
STDMETHODIMP
|
||||
AwtTextComponent::OleCallback::GetClipboardData(CHARRANGE *pchrg,
|
||||
DWORD reco,
|
||||
LPDATAOBJECT *ppdataobj) {
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
STDMETHODIMP
|
||||
AwtTextComponent::OleCallback::GetDragDropEffect(BOOL fDrag,
|
||||
DWORD grfKeyState,
|
||||
LPDWORD pdwEffect) {
|
||||
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
|
||||
STDMETHODIMP
|
||||
AwtTextComponent::OleCallback::GetContextMenu(WORD seltype,
|
||||
LPOLEOBJECT lpoleobj,
|
||||
CHARRANGE FAR * lpchrg,
|
||||
HMENU FAR * lphmenu) {
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
|
||||
|
||||
//
|
||||
// Accessibility support
|
||||
//
|
||||
|
||||
@ -47,6 +47,8 @@ public:
|
||||
|
||||
AwtTextComponent();
|
||||
|
||||
static AwtTextComponent* Create(jobject self, jobject parent, BOOL isMultiline);
|
||||
|
||||
virtual LPCTSTR GetClassName();
|
||||
|
||||
int RemoveCR(WCHAR *pStr);
|
||||
@ -71,6 +73,10 @@ public:
|
||||
|
||||
void SetFont(AwtFont* font);
|
||||
|
||||
virtual void Enable(BOOL bEnable);
|
||||
virtual void SetColor(COLORREF c);
|
||||
virtual void SetBackgroundColor(COLORREF c);
|
||||
|
||||
/*
|
||||
* Windows message handler functions
|
||||
*/
|
||||
@ -113,7 +119,40 @@ public:
|
||||
// Used to prevent untrusted code from synthesizing a WM_PASTE message
|
||||
// by posting a <CTRL>-V KeyEvent
|
||||
BOOL m_synthetic;
|
||||
virtual LONG EditGetCharFromPos(POINT& pt) = 0;
|
||||
LONG EditGetCharFromPos(POINT& pt);
|
||||
|
||||
/*****************************************************************
|
||||
* Inner class OleCallback declaration.
|
||||
*/
|
||||
class OleCallback : public IRichEditOleCallback {
|
||||
public:
|
||||
OleCallback();
|
||||
|
||||
STDMETHODIMP QueryInterface(REFIID riid, LPVOID * ppvObj);
|
||||
STDMETHODIMP_(ULONG) AddRef();
|
||||
STDMETHODIMP_(ULONG) Release();
|
||||
STDMETHODIMP GetNewStorage(LPSTORAGE FAR * ppstg);
|
||||
STDMETHODIMP GetInPlaceContext(LPOLEINPLACEFRAME FAR * ppipframe,
|
||||
LPOLEINPLACEUIWINDOW FAR* ppipuiDoc,
|
||||
LPOLEINPLACEFRAMEINFO pipfinfo);
|
||||
STDMETHODIMP ShowContainerUI(BOOL fShow);
|
||||
STDMETHODIMP QueryInsertObject(LPCLSID pclsid, LPSTORAGE pstg, LONG cp);
|
||||
STDMETHODIMP DeleteObject(LPOLEOBJECT poleobj);
|
||||
STDMETHODIMP QueryAcceptData(LPDATAOBJECT pdataobj, CLIPFORMAT *pcfFormat,
|
||||
DWORD reco, BOOL fReally, HGLOBAL hMetaPict);
|
||||
STDMETHODIMP ContextSensitiveHelp(BOOL fEnterMode);
|
||||
STDMETHODIMP GetClipboardData(CHARRANGE *pchrg, DWORD reco,
|
||||
LPDATAOBJECT *ppdataobj);
|
||||
STDMETHODIMP GetDragDropEffect(BOOL fDrag, DWORD grfKeyState,
|
||||
LPDWORD pdwEffect);
|
||||
STDMETHODIMP GetContextMenu(WORD seltype, LPOLEOBJECT poleobj,
|
||||
CHARRANGE FAR * pchrg, HMENU FAR * phmenu);
|
||||
private:
|
||||
ULONG m_refs; // Reference count
|
||||
};//OleCallback class
|
||||
|
||||
INLINE static OleCallback& GetOleCallback() { return sm_oleCallback; }
|
||||
|
||||
|
||||
private:
|
||||
|
||||
@ -126,6 +165,7 @@ private:
|
||||
HFONT m_hFont;
|
||||
//im --- end
|
||||
|
||||
static OleCallback sm_oleCallback;
|
||||
|
||||
//
|
||||
// Accessibility support
|
||||
|
||||
@ -42,84 +42,23 @@ struct SetEchoCharStruct {
|
||||
*/
|
||||
|
||||
AwtTextField::AwtTextField()
|
||||
: m_initialRescrollFlag( true )
|
||||
{
|
||||
}
|
||||
|
||||
/* Create a new AwtTextField object and window. */
|
||||
AwtTextField* AwtTextField::Create(jobject peer, jobject parent)
|
||||
{
|
||||
JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
|
||||
|
||||
jobject target = NULL;
|
||||
AwtTextField* c = NULL;
|
||||
|
||||
try {
|
||||
PDATA pData;
|
||||
AwtCanvas* awtParent;
|
||||
JNI_CHECK_PEER_GOTO(parent, done);
|
||||
awtParent = (AwtCanvas*)pData;
|
||||
|
||||
JNI_CHECK_NULL_GOTO(awtParent, "null awtParent", done);
|
||||
|
||||
target = env->GetObjectField(peer, AwtObject::targetID);
|
||||
JNI_CHECK_NULL_GOTO(target, "null target", done);
|
||||
|
||||
c = new AwtTextField();
|
||||
|
||||
{
|
||||
DWORD style = WS_CHILD | WS_CLIPSIBLINGS |
|
||||
ES_LEFT | ES_AUTOHSCROLL;
|
||||
DWORD exStyle = WS_EX_CLIENTEDGE;
|
||||
if (GetRTL()) {
|
||||
exStyle |= WS_EX_RIGHT | WS_EX_LEFTSCROLLBAR;
|
||||
if (GetRTLReadingOrder())
|
||||
exStyle |= WS_EX_RTLREADING;
|
||||
}
|
||||
|
||||
jint x = env->GetIntField(target, AwtComponent::xID);
|
||||
jint y = env->GetIntField(target, AwtComponent::yID);
|
||||
jint width = env->GetIntField(target, AwtComponent::widthID);
|
||||
jint height = env->GetIntField(target, AwtComponent::heightID);
|
||||
|
||||
c->CreateHWnd(env, L"", style, exStyle,
|
||||
x, y, width, height,
|
||||
awtParent->GetHWnd(),
|
||||
reinterpret_cast<HMENU>(static_cast<INT_PTR>(
|
||||
awtParent->CreateControlID())),
|
||||
::GetSysColor(COLOR_WINDOWTEXT),
|
||||
::GetSysColor(COLOR_WINDOW),
|
||||
peer);
|
||||
|
||||
c->m_backgroundColorSet = TRUE;
|
||||
/* suppress inheriting parent's color. */
|
||||
c->UpdateBackground(env, target);
|
||||
c->SendMessage(EM_SETMARGINS, EC_LEFTMARGIN | EC_RIGHTMARGIN,
|
||||
MAKELPARAM(1, 1));
|
||||
/*
|
||||
* Fix for BugTraq Id 4260109.
|
||||
* Set the text limit to the maximum.
|
||||
*/
|
||||
c->SendMessage(EM_SETLIMITTEXT);
|
||||
|
||||
}
|
||||
} catch (...) {
|
||||
env->DeleteLocalRef(target);
|
||||
throw;
|
||||
}
|
||||
|
||||
done:
|
||||
env->DeleteLocalRef(target);
|
||||
|
||||
return c;
|
||||
return (AwtTextField*) AwtTextComponent::Create(peer, parent, false);
|
||||
}
|
||||
|
||||
void AwtTextField::EditSetSel(CHARRANGE &cr) {
|
||||
SendMessage(EM_SETSEL, cr.cpMin, cr.cpMax);
|
||||
}
|
||||
SendMessage(EM_EXSETSEL, 0, reinterpret_cast<LPARAM>(&cr));
|
||||
|
||||
// 6417581: force expected drawing
|
||||
if (IS_WINVISTA && cr.cpMin == cr.cpMax) {
|
||||
::InvalidateRect(GetHWnd(), NULL, TRUE);
|
||||
}
|
||||
|
||||
LONG AwtTextField::EditGetCharFromPos(POINT& pt) {
|
||||
return static_cast<LONG>(SendMessage(EM_CHARFROMPOS, 0, MAKELPARAM(pt.x, pt.y)));
|
||||
}
|
||||
|
||||
LRESULT AwtTextField::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
|
||||
@ -162,10 +101,18 @@ AwtTextField::HandleEvent(MSG *msg, BOOL synthetic)
|
||||
* to allow dnd of the current selection.
|
||||
*/
|
||||
if (msg->message == WM_LBUTTONDBLCLK) {
|
||||
SetStartSelectionPos(static_cast<LONG>(SendMessage(
|
||||
EM_FINDWORDBREAK, WB_MOVEWORDLEFT, lCurPos)));
|
||||
SetEndSelectionPos(static_cast<LONG>(SendMessage(
|
||||
EM_FINDWORDBREAK, WB_MOVEWORDRIGHT, lCurPos)));
|
||||
jchar echo = SendMessage(EM_GETPASSWORDCHAR);
|
||||
|
||||
if(echo == 0){
|
||||
SetStartSelectionPos(static_cast<LONG>(SendMessage(
|
||||
EM_FINDWORDBREAK, WB_MOVEWORDLEFT, lCurPos)));
|
||||
SetEndSelectionPos(static_cast<LONG>(SendMessage(
|
||||
EM_FINDWORDBREAK, WB_MOVEWORDRIGHT, lCurPos)));
|
||||
}else{
|
||||
SetStartSelectionPos(0);
|
||||
SetEndSelectionPos(GetTextLength());
|
||||
}
|
||||
|
||||
} else {
|
||||
SetStartSelectionPos(lCurPos);
|
||||
SetEndSelectionPos(lCurPos);
|
||||
@ -307,46 +254,6 @@ ret:
|
||||
delete secs;
|
||||
}
|
||||
|
||||
void AwtTextField::Reshape(int x, int y, int w, int h)
|
||||
{
|
||||
AwtTextComponent::Reshape( x, y, w, h );
|
||||
|
||||
// Another option would be to call this
|
||||
// after WM_SIZE notification is handled
|
||||
initialRescroll();
|
||||
}
|
||||
|
||||
|
||||
// Windows' Edit control features:
|
||||
// (i) if text selection is set while control's width or height is 0,
|
||||
// text is scrolled oddly.
|
||||
// (ii) if control's size is changed, text seems never be automatically
|
||||
// rescrolled.
|
||||
//
|
||||
// This method is designed for the following scenario: AWT spawns Edit
|
||||
// control with 0x0 dimensions, then sets text selection, then resizes the
|
||||
// control (couple of times). This might cause text appear undesirably scrolled.
|
||||
// So we reset/set selection again to rescroll text. (see also CR 6480547)
|
||||
void AwtTextField::initialRescroll()
|
||||
{
|
||||
if( ! m_initialRescrollFlag ) {
|
||||
return;
|
||||
}
|
||||
|
||||
::RECT r;
|
||||
BOOL ok = ::GetClientRect( GetHWnd(), &r );
|
||||
if( ! ok || r.right==0 || r.bottom==0 ) {
|
||||
return;
|
||||
}
|
||||
|
||||
m_initialRescrollFlag = false;
|
||||
|
||||
DWORD start, end;
|
||||
SendMessage( EM_GETSEL, (WPARAM)&start, (LPARAM)&end );
|
||||
SendMessage( EM_SETSEL, (WPARAM)0, (LPARAM)0 );
|
||||
SendMessage( EM_SETSEL, (WPARAM)start, (LPARAM)end );
|
||||
}
|
||||
|
||||
|
||||
/************************************************************************
|
||||
* WTextFieldPeer native methods
|
||||
|
||||
@ -54,15 +54,11 @@ public:
|
||||
// invoked on Toolkit thread
|
||||
static void _SetEchoChar(void *param);
|
||||
|
||||
protected:
|
||||
LONG EditGetCharFromPos(POINT& pt);
|
||||
virtual void Reshape(int x, int y, int w, int h);
|
||||
protected:
|
||||
|
||||
private:
|
||||
void EditSetSel(CHARRANGE &cr);
|
||||
void initialRescroll();
|
||||
|
||||
bool m_initialRescrollFlag;
|
||||
};
|
||||
|
||||
#endif /* AWT_TEXTFIELD_H */
|
||||
|
||||
@ -0,0 +1,75 @@
|
||||
/*
|
||||
* Copyright (c) 2012 Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Portions Copyright (c) 2012 IBM Corporation
|
||||
*/
|
||||
|
||||
/*
|
||||
@test
|
||||
@bug 7170655
|
||||
@summary Frame size does not change after changing font
|
||||
@author Jonathan Lu
|
||||
@library ../../regtesthelpers
|
||||
@build Util
|
||||
@run main ResizeAfterSetFont
|
||||
*/
|
||||
|
||||
import java.awt.*;
|
||||
import test.java.awt.regtesthelpers.Util;
|
||||
|
||||
public class ResizeAfterSetFont {
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
Frame frame = new Frame("bug7170655");
|
||||
frame.setLayout(new BorderLayout());
|
||||
frame.setBackground(Color.LIGHT_GRAY);
|
||||
|
||||
Panel panel = new Panel();
|
||||
panel.setLayout(new GridLayout(0, 1, 1, 1));
|
||||
|
||||
Label label = new Label("Test Label");
|
||||
label.setBackground(Color.white);
|
||||
label.setForeground(Color.RED);
|
||||
label.setFont(new Font("Dialog", Font.PLAIN, 12));
|
||||
|
||||
panel.add(label);
|
||||
frame.add(panel, "South");
|
||||
frame.pack();
|
||||
frame.setVisible(true);
|
||||
|
||||
Util.waitForIdle(null);
|
||||
|
||||
Dimension dimBefore = frame.getSize();
|
||||
label.setFont(new Font("Dialog", Font.PLAIN, 24));
|
||||
|
||||
frame.validate();
|
||||
frame.pack();
|
||||
Dimension dimAfter = frame.getSize();
|
||||
|
||||
if (dimBefore.equals(dimAfter)) {
|
||||
throw new Exception(
|
||||
"Frame size does not change after Label.setFont()!");
|
||||
}
|
||||
}
|
||||
}
|
||||
160
jdk/test/java/awt/WMSpecificTests/Mutter/MutterMaximizeTest.java
Normal file
160
jdk/test/java/awt/WMSpecificTests/Mutter/MutterMaximizeTest.java
Normal file
@ -0,0 +1,160 @@
|
||||
/*
|
||||
* Copyright 2012 Red Hat, Inc. All Rights Reserved.
|
||||
* Copyright (c) 2012, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
@test
|
||||
@bug 7043963
|
||||
@summary Tests that the screen location of windows is
|
||||
updated properly after a maximize.
|
||||
@author Denis Lila
|
||||
@library ../../regtesthelpers
|
||||
@build Util
|
||||
@run main MutterMaximizeTest
|
||||
*/
|
||||
|
||||
import java.awt.AWTException;
|
||||
import java.awt.Dimension;
|
||||
import java.awt.Frame;
|
||||
import java.awt.Point;
|
||||
import java.awt.Robot;
|
||||
import java.awt.Window;
|
||||
import java.awt.event.InputEvent;
|
||||
import java.awt.event.WindowAdapter;
|
||||
import java.awt.event.WindowEvent;
|
||||
|
||||
import test.java.awt.regtesthelpers.Util;
|
||||
|
||||
@SuppressWarnings("serial")
|
||||
public class MutterMaximizeTest extends Frame {
|
||||
|
||||
public static void main(String[] args) throws InterruptedException {
|
||||
if (Util.getWMID() != Util.MUTTER_WM) {
|
||||
System.out.println("This test is only useful on Mutter");
|
||||
return;
|
||||
}
|
||||
MutterMaximizeTest frame = new MutterMaximizeTest();
|
||||
frame.addWindowListener(Util.getClosingWindowAdapter());
|
||||
|
||||
//Display the window.
|
||||
frame.setSize(500, 500);
|
||||
Util.showWindowWait(frame);
|
||||
runRobotTest(frame);
|
||||
}
|
||||
|
||||
private static void runRobotTest(Frame frame) {
|
||||
try {
|
||||
Thread robotThread = startRegTest(frame);
|
||||
robotThread.start();
|
||||
waitForThread(robotThread);
|
||||
} finally {
|
||||
frame.dispose();
|
||||
}
|
||||
}
|
||||
|
||||
private static void waitForThread(Thread t) {
|
||||
while (t.isAlive()) {
|
||||
try {
|
||||
t.join();
|
||||
} catch (InterruptedException e) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void sleepFor(long millis) {
|
||||
long dT = 0;
|
||||
long start = System.nanoTime();
|
||||
while (dT < millis) {
|
||||
try {
|
||||
long toSleep = millis - dT/1000000;
|
||||
if (toSleep > 0) {
|
||||
Thread.sleep(toSleep);
|
||||
}
|
||||
// if this ends without an interrupted exception,
|
||||
// that's good enough.
|
||||
break;
|
||||
} catch (InterruptedException e) {
|
||||
long now = System.nanoTime();
|
||||
dT = now - start;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void rmove(Robot robot, Point p) {
|
||||
robot.mouseMove(p.x, p.y);
|
||||
}
|
||||
private static void rdown(Robot robot) {
|
||||
robot.mousePress(InputEvent.BUTTON1_MASK);
|
||||
robot.delay(50);
|
||||
}
|
||||
private static void rup(Robot robot) {
|
||||
robot.mouseRelease(InputEvent.BUTTON1_MASK);
|
||||
robot.delay(50);
|
||||
}
|
||||
|
||||
public static void click(Robot robot) {
|
||||
rdown(robot);
|
||||
rup(robot);
|
||||
}
|
||||
|
||||
public static void doubleClick(Robot robot) {
|
||||
click(robot);
|
||||
click(robot);
|
||||
}
|
||||
|
||||
private static void dragWindow(Window w, int dx, int dy, Robot robot) {
|
||||
Point p = Util.getTitlePoint(w);
|
||||
rmove(robot, p);
|
||||
rdown(robot);
|
||||
p.translate(dx, dy);
|
||||
rmove(robot, p);
|
||||
rup(robot);
|
||||
}
|
||||
|
||||
// f must be visible
|
||||
private static Thread startRegTest(final Frame f) {
|
||||
Thread robot = new Thread(new Runnable() {
|
||||
public void run() {
|
||||
Robot r = Util.createRobot();
|
||||
dragWindow(f, 100, 100, r);
|
||||
// wait for the location to be set.
|
||||
sleepFor(2000);
|
||||
|
||||
final Point l2 = f.getLocationOnScreen();
|
||||
|
||||
// double click should maximize the frame
|
||||
doubleClick(r);
|
||||
|
||||
// wait for location again.
|
||||
sleepFor(2000);
|
||||
final Point l3 = f.getLocationOnScreen();
|
||||
if (l3.equals(l2)) {
|
||||
throw new RuntimeException("Bad location after maximize. Window location has not moved");
|
||||
}
|
||||
}
|
||||
});
|
||||
return robot;
|
||||
}
|
||||
}
|
||||
|
||||
@ -162,16 +162,21 @@ public final class Util {
|
||||
clickOnComp(comp, robot, 50);
|
||||
}
|
||||
|
||||
public static Point getTitlePoint(Window decoratedWindow) {
|
||||
Point p = decoratedWindow.getLocationOnScreen();
|
||||
Dimension d = decoratedWindow.getSize();
|
||||
return new Point(p.x + (int)(d.getWidth()/2),
|
||||
p.y + (int)(decoratedWindow.getInsets().top/2));
|
||||
}
|
||||
|
||||
/*
|
||||
* Clicks on a title of Frame/Dialog.
|
||||
* WARNING: it may fail on some platforms when the window is not wide enough.
|
||||
*/
|
||||
public static void clickOnTitle(final Window decoratedWindow, final Robot robot) {
|
||||
Point p = decoratedWindow.getLocationOnScreen();
|
||||
Dimension d = decoratedWindow.getSize();
|
||||
|
||||
if (decoratedWindow instanceof Frame || decoratedWindow instanceof Dialog) {
|
||||
robot.mouseMove(p.x + (int)(d.getWidth()/2), p.y + (int)decoratedWindow.getInsets().top/2);
|
||||
Point p = getTitlePoint(decoratedWindow);
|
||||
robot.mouseMove(p.x, p.y);
|
||||
robot.delay(50);
|
||||
robot.mousePress(InputEvent.BUTTON1_MASK);
|
||||
robot.delay(50);
|
||||
@ -409,7 +414,9 @@ public final class Util {
|
||||
ICE_WM = 10,
|
||||
METACITY_WM = 11,
|
||||
COMPIZ_WM = 12,
|
||||
LG3D_WM = 13;
|
||||
LG3D_WM = 13,
|
||||
CWM_WM = 14,
|
||||
MUTTER_WM = 15;
|
||||
|
||||
/*
|
||||
* Returns -1 in case of not X Window or any problems.
|
||||
|
||||
@ -33,6 +33,8 @@
|
||||
import javax.swing.*;
|
||||
import java.awt.*;
|
||||
import sun.awt.SunToolkit;
|
||||
import java.security.Permission;
|
||||
import sun.security.util.SecurityConstants;
|
||||
|
||||
public class bug6694823 {
|
||||
private static JFrame frame;
|
||||
@ -48,6 +50,8 @@ public class bug6694823 {
|
||||
}
|
||||
});
|
||||
|
||||
toolkit.realSync();
|
||||
|
||||
// Get screen insets
|
||||
screenInsets = toolkit.getScreenInsets(frame.getGraphicsConfiguration());
|
||||
if (screenInsets.bottom == 0) {
|
||||
@ -55,26 +59,23 @@ public class bug6694823 {
|
||||
return;
|
||||
}
|
||||
|
||||
// Show popup as if from a standalone application
|
||||
// The popup should be able to overlap the task bar
|
||||
showPopup(false);
|
||||
System.setSecurityManager(new SecurityManager(){
|
||||
|
||||
// Emulate applet security restrictions
|
||||
toolkit.realSync();
|
||||
System.setSecurityManager(new SecurityManager());
|
||||
private String allowsAlwaysOnTopPermission = SecurityConstants.AWT.SET_WINDOW_ALWAYS_ON_TOP_PERMISSION.getName();
|
||||
|
||||
@Override
|
||||
public void checkPermission(Permission perm) {
|
||||
if (allowsAlwaysOnTopPermission.equals(perm.getName())) {
|
||||
throw new SecurityException();
|
||||
}
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
// Show popup as if from an applet
|
||||
// The popup shouldn't overlap the task bar. It should be shifted up.
|
||||
showPopup(true);
|
||||
checkPopup();
|
||||
|
||||
toolkit.realSync();
|
||||
System.out.println("Test passed!");
|
||||
|
||||
SwingUtilities.invokeAndWait(new Runnable() {
|
||||
public void run() {
|
||||
frame.dispose();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private static void createGui() {
|
||||
@ -93,7 +94,7 @@ public class bug6694823 {
|
||||
frame.setSize(200, 200);
|
||||
}
|
||||
|
||||
private static void showPopup(final boolean shouldBeShifted) throws Exception {
|
||||
private static void checkPopup() throws Exception {
|
||||
SwingUtilities.invokeAndWait(new Runnable() {
|
||||
public void run() {
|
||||
// Place frame just above the task bar
|
||||
@ -121,20 +122,14 @@ public class bug6694823 {
|
||||
toolkit.realSync();
|
||||
|
||||
SwingUtilities.invokeAndWait(new Runnable() {
|
||||
|
||||
public void run() {
|
||||
Point frameLoc = frame.getLocationOnScreen();
|
||||
if (shouldBeShifted) {
|
||||
if (popup.getLocationOnScreen()
|
||||
.equals(new Point(frameLoc.x, frameLoc.y + point.y))) {
|
||||
throw new RuntimeException("Popup is not shifted");
|
||||
}
|
||||
} else {
|
||||
if (!popup.getLocationOnScreen()
|
||||
.equals(new Point(frameLoc.x, frameLoc.y + point.y))) {
|
||||
throw new RuntimeException("Popup is unexpectedly shifted");
|
||||
}
|
||||
if (popup.getLocationOnScreen().equals(new Point(frameLoc.x, frameLoc.y + point.y))) {
|
||||
throw new RuntimeException("Popup is not shifted");
|
||||
}
|
||||
popup.setVisible(false);
|
||||
frame.dispose();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
147
jdk/test/javax/swing/JPopupMenu/6800513/bug6800513.java
Normal file
147
jdk/test/javax/swing/JPopupMenu/6800513/bug6800513.java
Normal file
@ -0,0 +1,147 @@
|
||||
/*
|
||||
* Copyright 2012 Red Hat, Inc. All Rights Reserved.
|
||||
* Copyright (c) 2012, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
/*
|
||||
* @test
|
||||
* @bug 6800513
|
||||
* @summary GTK-LaF renders menus incompletely
|
||||
* @author Mario Torre
|
||||
* @library ../../regtesthelpers/
|
||||
* @build Util
|
||||
* @run main bug6800513
|
||||
*/
|
||||
|
||||
import sun.awt.SunToolkit;
|
||||
|
||||
import javax.swing.*;
|
||||
import java.awt.*;
|
||||
import java.awt.event.InputEvent;
|
||||
import java.beans.PropertyChangeEvent;
|
||||
import java.beans.PropertyChangeListener;
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.concurrent.Callable;
|
||||
|
||||
public class bug6800513 {
|
||||
|
||||
private static JPopupMenu popupMenu;
|
||||
private static JMenu menu;
|
||||
private static JFrame frame;
|
||||
|
||||
public static void testFrame(final boolean defaultLightWeightPopupEnabled,
|
||||
String expectedPopupClass) throws Exception {
|
||||
SunToolkit toolkit = (SunToolkit) Toolkit.getDefaultToolkit();
|
||||
|
||||
SwingUtilities.invokeAndWait(new Runnable() {
|
||||
public void run() {
|
||||
JPopupMenu.setDefaultLightWeightPopupEnabled(defaultLightWeightPopupEnabled);
|
||||
createAndShowUI();
|
||||
}
|
||||
});
|
||||
|
||||
toolkit.realSync();
|
||||
|
||||
clickOnMenu();
|
||||
|
||||
toolkit.realSync();
|
||||
|
||||
Field getPopup = JPopupMenu.class.getDeclaredField("popup");
|
||||
getPopup.setAccessible(true);
|
||||
Popup popup = (Popup) getPopup.get(popupMenu);
|
||||
|
||||
if (popup == null) {
|
||||
throw new Exception("popup is null!");
|
||||
}
|
||||
|
||||
String className = popup.getClass().getName();
|
||||
if (!className.equals(expectedPopupClass)) {
|
||||
throw new Exception("popup class is: " + className +
|
||||
", expected: " + expectedPopupClass);
|
||||
}
|
||||
|
||||
SwingUtilities.invokeAndWait(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
frame.dispose();
|
||||
popupMenu = null;
|
||||
}
|
||||
});
|
||||
|
||||
toolkit.realSync();
|
||||
}
|
||||
|
||||
|
||||
public static void clickOnMenu() throws Exception {
|
||||
Rectangle bounds = Util.invokeOnEDT(new Callable<Rectangle>() {
|
||||
@Override
|
||||
public Rectangle call() throws Exception {
|
||||
return new Rectangle(menu.getLocationOnScreen(), menu.getSize());
|
||||
}
|
||||
});
|
||||
|
||||
Robot robot = new Robot();
|
||||
robot.setAutoDelay(100);
|
||||
|
||||
robot.mouseMove(bounds.x + bounds.width / 2, bounds.y + bounds.height / 2);
|
||||
|
||||
robot.mousePress(InputEvent.BUTTON1_MASK);
|
||||
robot.mouseRelease(InputEvent.BUTTON1_MASK);
|
||||
}
|
||||
|
||||
private static class PopupListener implements PropertyChangeListener {
|
||||
@Override
|
||||
public void propertyChange(PropertyChangeEvent evt) {
|
||||
if (evt.toString().contains("visible") && ((Boolean) evt.getNewValue() == true)) {
|
||||
popupMenu = (JPopupMenu) evt.getSource();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void createAndShowUI() {
|
||||
frame = new JFrame();
|
||||
|
||||
JMenuBar menuBar = new JMenuBar();
|
||||
menu = new JMenu("Menu");
|
||||
|
||||
menu.add(new JMenuItem("Menu Item #1"));
|
||||
menu.add(new JMenuItem("Menu Item #2"));
|
||||
menu.add(new JMenuItem("Menu Item #3"));
|
||||
|
||||
menuBar.add(menu);
|
||||
|
||||
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
|
||||
frame.setJMenuBar(menuBar);
|
||||
frame.setSize(500, 500);
|
||||
|
||||
PopupListener listener = new PopupListener();
|
||||
menu.getPopupMenu().addPropertyChangeListener(listener);
|
||||
|
||||
frame.setVisible(true);
|
||||
}
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
testFrame(false, "javax.swing.PopupFactory$HeavyWeightPopup");
|
||||
|
||||
testFrame(true, "javax.swing.PopupFactory$LightWeightPopup");
|
||||
}
|
||||
}
|
||||
157
jdk/test/javax/swing/JPopupMenu/7156657/bug7156657.java
Normal file
157
jdk/test/javax/swing/JPopupMenu/7156657/bug7156657.java
Normal file
@ -0,0 +1,157 @@
|
||||
/*
|
||||
* Copyright (c) 2012, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
import com.sun.awt.AWTUtilities;
|
||||
import sun.awt.SunToolkit;
|
||||
|
||||
import javax.swing.*;
|
||||
import java.awt.*;
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.util.concurrent.Callable;
|
||||
|
||||
/* @test
|
||||
@bug 7156657
|
||||
@summary Version 7 doesn't support translucent popup menus against a translucent window
|
||||
@library ../../regtesthelpers
|
||||
@author Pavel Porvatov
|
||||
*/
|
||||
public class bug7156657 {
|
||||
private static JFrame lowerFrame;
|
||||
|
||||
private static JFrame frame;
|
||||
|
||||
private static JPopupMenu popupMenu;
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
final Robot robot = new Robot();
|
||||
final SunToolkit toolkit = ((SunToolkit) Toolkit.getDefaultToolkit());
|
||||
|
||||
Boolean skipTest = Util.invokeOnEDT(new Callable<Boolean>() {
|
||||
@Override
|
||||
public Boolean call() throws Exception {
|
||||
frame = createFrame();
|
||||
|
||||
if (!AWTUtilities.isTranslucencyCapable(frame.getGraphicsConfiguration())) {
|
||||
System.out.println("Translucency is not supported, the test skipped");
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
lowerFrame = createFrame();
|
||||
lowerFrame.getContentPane().setBackground(Color.RED);
|
||||
lowerFrame.setVisible(true);
|
||||
|
||||
popupMenu = new JPopupMenu();
|
||||
popupMenu.setOpaque(false);
|
||||
popupMenu.add(new TransparentMenuItem("1111"));
|
||||
popupMenu.add(new TransparentMenuItem("2222"));
|
||||
popupMenu.add(new TransparentMenuItem("3333"));
|
||||
|
||||
AWTUtilities.setWindowOpaque(frame, false);
|
||||
JPanel pnContent = new JPanel();
|
||||
pnContent.setBackground(new Color(255, 255, 255, 128));
|
||||
frame.add(pnContent);
|
||||
frame.setVisible(true);
|
||||
|
||||
return false;
|
||||
}
|
||||
});
|
||||
|
||||
if (skipTest) {
|
||||
return;
|
||||
}
|
||||
|
||||
toolkit.realSync();
|
||||
|
||||
SwingUtilities.invokeAndWait(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
popupMenu.show(frame, 0, 0);
|
||||
}
|
||||
});
|
||||
|
||||
toolkit.realSync();
|
||||
|
||||
Rectangle popupRectangle = Util.invokeOnEDT(new Callable<Rectangle>() {
|
||||
@Override
|
||||
public Rectangle call() throws Exception {
|
||||
return popupMenu.getBounds();
|
||||
}
|
||||
});
|
||||
|
||||
BufferedImage redBackgroundCapture = robot.createScreenCapture(popupRectangle);
|
||||
|
||||
SwingUtilities.invokeAndWait(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
lowerFrame.getContentPane().setBackground(Color.GREEN);
|
||||
}
|
||||
});
|
||||
|
||||
toolkit.realSync();
|
||||
|
||||
BufferedImage greenBackgroundCapture = robot.createScreenCapture(popupRectangle);
|
||||
|
||||
if (Util.compareBufferedImages(redBackgroundCapture, greenBackgroundCapture)) {
|
||||
throw new RuntimeException("The test failed");
|
||||
}
|
||||
|
||||
SwingUtilities.invokeAndWait(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
popupMenu.setVisible(false);
|
||||
frame.dispose();
|
||||
lowerFrame.dispose();
|
||||
}
|
||||
});
|
||||
|
||||
System.out.println("The test passed");
|
||||
}
|
||||
|
||||
|
||||
private static JFrame createFrame() {
|
||||
JFrame result = new JFrame();
|
||||
|
||||
result.setLocation(0, 0);
|
||||
result.setSize(400, 300);
|
||||
result.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
|
||||
result.setUndecorated(true);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
private static class TransparentMenuItem extends JMenuItem {
|
||||
public TransparentMenuItem(String text) {
|
||||
super(text);
|
||||
setOpaque(false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void paint(Graphics g) {
|
||||
Graphics2D g2 = (Graphics2D) g.create();
|
||||
g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f));
|
||||
super.paint(g2);
|
||||
g2.dispose();
|
||||
}
|
||||
}
|
||||
}
|
||||
64
jdk/test/javax/swing/JSpinner/5012888/bug5012888.java
Normal file
64
jdk/test/javax/swing/JSpinner/5012888/bug5012888.java
Normal file
@ -0,0 +1,64 @@
|
||||
/*
|
||||
* Copyright (c) 2012, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
/* @test 1.0 04/04/23
|
||||
@bug 5012888
|
||||
@summary REGRESSION: Click & hold on arrow of JSpinner only transfers focus
|
||||
@author Konstantin Eremin
|
||||
@run main bug5012888
|
||||
*/
|
||||
import javax.swing.*;
|
||||
import javax.swing.event.*;
|
||||
import java.awt.*;
|
||||
import java.awt.event.*;
|
||||
|
||||
public class bug5012888 extends JFrame {
|
||||
JSpinner spinner1, spinner2;
|
||||
public bug5012888() {
|
||||
spinner1 = new JSpinner(new SpinnerNumberModel(0, -1000, 1000, 1));
|
||||
spinner2 = new JSpinner(new SpinnerNumberModel(1, -1000, 1000, 1));
|
||||
Container pane = getContentPane();
|
||||
pane.setLayout(new BorderLayout());
|
||||
pane.add(spinner1, BorderLayout.NORTH);
|
||||
pane.add(spinner2, BorderLayout.SOUTH);
|
||||
}
|
||||
public void doTest() throws Exception {
|
||||
((sun.awt.SunToolkit)Toolkit.getDefaultToolkit()).realSync();
|
||||
Point p = spinner2.getLocationOnScreen();
|
||||
Rectangle rect = spinner2.getBounds();
|
||||
Robot robot = new Robot();
|
||||
robot.mouseMove(p.x+rect.width-5, p.y+5);
|
||||
robot.mousePress(InputEvent.BUTTON1_MASK);
|
||||
Thread.sleep(1000);
|
||||
robot.mouseRelease(InputEvent.BUTTON1_MASK);
|
||||
if ( ((Integer) spinner2.getValue()).intValue() == 1 ) {
|
||||
throw new Error("Spinner value should be more than 1");
|
||||
}
|
||||
}
|
||||
public static void main(String[] argv) throws Exception {
|
||||
bug5012888 b = new bug5012888();
|
||||
b.setBounds(0, 0, 100, 100);
|
||||
b.setVisible(true);
|
||||
b.doTest();
|
||||
}
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user