提交 5ff1da03 编写于 作者: L lana

Merge

......@@ -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();
}
}
}
/*
* 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
......
/*
* 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 */
/*
* 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()!");
}
}
}
/*
* 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();
}
});
}
......
/*
* 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");
}
}
/*
* 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();
}
}
}
/*
* 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();
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册