mirror of
https://github.com/openjdk/jdk.git
synced 2026-02-25 09:40:10 +00:00
Merge
This commit is contained in:
commit
a94b4fa40d
@ -47,8 +47,8 @@ final class LWButtonPeer extends LWComponentPeer<Button, JButton>
|
||||
}
|
||||
|
||||
@Override
|
||||
public void initialize() {
|
||||
super.initialize();
|
||||
void initializeImpl() {
|
||||
super.initializeImpl();
|
||||
setLabel(getTarget().getLabel());
|
||||
synchronized (getDelegateLock()) {
|
||||
getDelegate().addActionListener(this);
|
||||
|
||||
@ -61,8 +61,8 @@ final class LWCheckboxPeer
|
||||
}
|
||||
|
||||
@Override
|
||||
public void initialize() {
|
||||
super.initialize();
|
||||
void initializeImpl() {
|
||||
super.initializeImpl();
|
||||
setLabel(getTarget().getLabel());
|
||||
setState(getTarget().getState());
|
||||
setCheckboxGroup(getTarget().getCheckboxGroup());
|
||||
|
||||
@ -55,8 +55,8 @@ final class LWChoicePeer extends LWComponentPeer<Choice, JComboBox<String>>
|
||||
}
|
||||
|
||||
@Override
|
||||
public void initialize() {
|
||||
super.initialize();
|
||||
void initializeImpl() {
|
||||
super.initializeImpl();
|
||||
final Choice choice = getTarget();
|
||||
final JComboBox<String> combo = getDelegate();
|
||||
synchronized (getDelegateLock()) {
|
||||
|
||||
@ -81,19 +81,10 @@ public abstract class LWComponentPeer<T extends Component, D extends JComponent>
|
||||
// lock is not used as there are many peers related ops
|
||||
// to be done on the toolkit thread, and we don't want to
|
||||
// depend on a public lock on this thread
|
||||
private final static Object peerTreeLock =
|
||||
private static final Object peerTreeLock =
|
||||
new StringBuilder("LWComponentPeer.peerTreeLock");
|
||||
|
||||
/**
|
||||
* A custom tree-lock used for the hierarchy of the delegate Swing
|
||||
* components.
|
||||
* The lock synchronizes access to the delegate
|
||||
* internal state. Think of it as a 'virtual EDT'.
|
||||
*/
|
||||
// private final Object delegateTreeLock =
|
||||
// new StringBuilder("LWComponentPeer.delegateTreeLock");
|
||||
|
||||
private T target;
|
||||
private final T target;
|
||||
|
||||
// Container peer. It may not be the peer of the target's direct
|
||||
// parent, for example, in the case of hw/lw mixing. However,
|
||||
@ -108,10 +99,10 @@ public abstract class LWComponentPeer<T extends Component, D extends JComponent>
|
||||
// be updated when the component is reparented to another container
|
||||
private LWWindowPeer windowPeer;
|
||||
|
||||
private AtomicBoolean disposed = new AtomicBoolean(false);
|
||||
private final AtomicBoolean disposed = new AtomicBoolean(false);
|
||||
|
||||
// Bounds are relative to parent peer
|
||||
private Rectangle bounds = new Rectangle();
|
||||
private final Rectangle bounds = new Rectangle();
|
||||
private Region region;
|
||||
|
||||
// Component state. Should be accessed under the state lock
|
||||
@ -122,9 +113,11 @@ public abstract class LWComponentPeer<T extends Component, D extends JComponent>
|
||||
private Color foreground;
|
||||
private Font font;
|
||||
|
||||
// Paint area to coalesce all the paint events and store
|
||||
// the target dirty area
|
||||
private RepaintArea targetPaintArea;
|
||||
/**
|
||||
* Paint area to coalesce all the paint events and store the target dirty
|
||||
* area.
|
||||
*/
|
||||
private final RepaintArea targetPaintArea;
|
||||
|
||||
// private volatile boolean paintPending;
|
||||
private volatile boolean isLayouting;
|
||||
@ -137,7 +130,7 @@ public abstract class LWComponentPeer<T extends Component, D extends JComponent>
|
||||
private int fNumDropTargets = 0;
|
||||
private CDropTarget fDropTarget = null;
|
||||
|
||||
private PlatformComponent platformComponent;
|
||||
private final PlatformComponent platformComponent;
|
||||
|
||||
private final class DelegateContainer extends Container {
|
||||
{
|
||||
@ -175,6 +168,7 @@ public abstract class LWComponentPeer<T extends Component, D extends JComponent>
|
||||
}
|
||||
|
||||
public LWComponentPeer(T target, PlatformComponent platformComponent) {
|
||||
targetPaintArea = new LWRepaintArea();
|
||||
this.target = target;
|
||||
this.platformComponent = platformComponent;
|
||||
|
||||
@ -201,10 +195,13 @@ public abstract class LWComponentPeer<T extends Component, D extends JComponent>
|
||||
synchronized (getDelegateLock()) {
|
||||
delegate = createDelegate();
|
||||
if (delegate != null) {
|
||||
delegate.setVisible(false);
|
||||
delegateContainer = new DelegateContainer();
|
||||
delegateContainer.add(delegate);
|
||||
delegateContainer.addNotify();
|
||||
delegate.addNotify();
|
||||
resetColorsAndFont(delegate);
|
||||
delegate.setOpaque(true);
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
@ -278,27 +275,28 @@ public abstract class LWComponentPeer<T extends Component, D extends JComponent>
|
||||
return getDelegate();
|
||||
}
|
||||
|
||||
/*
|
||||
* Initializes this peer by fetching all the properties from the target.
|
||||
* The call to initialize() is not placed to LWComponentPeer ctor to
|
||||
* let the subclass ctor to finish completely first. Instead, it's the
|
||||
* LWToolkit object who is responsible for initialization.
|
||||
/**
|
||||
* Initializes this peer. The call to initialize() is not placed to
|
||||
* LWComponentPeer ctor to let the subclass ctor to finish completely first.
|
||||
* Instead, it's the LWToolkit object who is responsible for initialization.
|
||||
* Note that we call setVisible() at the end of initialization.
|
||||
*/
|
||||
public void initialize() {
|
||||
public final void initialize() {
|
||||
platformComponent.initialize(target, this, getPlatformWindow());
|
||||
targetPaintArea = new LWRepaintArea();
|
||||
if (getDelegate() != null) {
|
||||
synchronized (getDelegateLock()) {
|
||||
resetColorsAndFont(delegate);
|
||||
getDelegate().setOpaque(true);
|
||||
}
|
||||
}
|
||||
initializeImpl();
|
||||
setVisible(target.isVisible());
|
||||
}
|
||||
|
||||
/**
|
||||
* Fetching general properties from the target. Should be overridden in
|
||||
* subclasses to initialize specific peers properties.
|
||||
*/
|
||||
void initializeImpl() {
|
||||
setBackground(target.getBackground());
|
||||
setForeground(target.getForeground());
|
||||
setFont(target.getFont());
|
||||
setBounds(target.getBounds());
|
||||
setEnabled(target.isEnabled());
|
||||
setVisible(target.isVisible());
|
||||
}
|
||||
|
||||
private static void resetColorsAndFont(final Container c) {
|
||||
@ -314,15 +312,18 @@ public abstract class LWComponentPeer<T extends Component, D extends JComponent>
|
||||
return stateLock;
|
||||
}
|
||||
|
||||
// Synchronize all operations with the Swing delegates under
|
||||
// AWT tree lock, using a new separate lock to synchronize
|
||||
// access to delegates may lead deadlocks
|
||||
/**
|
||||
* Synchronize all operations with the Swing delegates under AWT tree lock,
|
||||
* using a new separate lock to synchronize access to delegates may lead
|
||||
* deadlocks. Think of it as a 'virtual EDT'.
|
||||
*
|
||||
* @return DelegateLock
|
||||
*/
|
||||
final Object getDelegateLock() {
|
||||
//return delegateTreeLock;
|
||||
return getTarget().getTreeLock();
|
||||
}
|
||||
|
||||
protected final static Object getPeerTreeLock() {
|
||||
protected static final Object getPeerTreeLock() {
|
||||
return peerTreeLock;
|
||||
}
|
||||
|
||||
@ -758,14 +759,17 @@ public abstract class LWComponentPeer<T extends Component, D extends JComponent>
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setVisible(boolean v) {
|
||||
public void setVisible(final boolean v) {
|
||||
synchronized (getStateLock()) {
|
||||
if (visible == v) {
|
||||
return;
|
||||
}
|
||||
visible = v;
|
||||
}
|
||||
setVisibleImpl(v);
|
||||
}
|
||||
|
||||
protected void setVisibleImpl(final boolean v) {
|
||||
final D delegate = getDelegate();
|
||||
|
||||
if (delegate != null) {
|
||||
@ -1355,7 +1359,7 @@ public abstract class LWComponentPeer<T extends Component, D extends JComponent>
|
||||
*
|
||||
* @see #isVisible()
|
||||
*/
|
||||
protected boolean isShowing() {
|
||||
protected final boolean isShowing() {
|
||||
synchronized (getPeerTreeLock()) {
|
||||
if (isVisible()) {
|
||||
final LWContainerPeer container = getContainerPeer();
|
||||
|
||||
@ -60,8 +60,8 @@ final class LWLabelPeer extends LWComponentPeer<Label, JLabel>
|
||||
}
|
||||
|
||||
@Override
|
||||
public void initialize() {
|
||||
super.initialize();
|
||||
void initializeImpl() {
|
||||
super.initializeImpl();
|
||||
setText(getTarget().getText());
|
||||
setAlignment(getTarget().getAlignment());
|
||||
}
|
||||
|
||||
@ -49,8 +49,8 @@ final class LWListPeer
|
||||
}
|
||||
|
||||
@Override
|
||||
public void initialize() {
|
||||
super.initialize();
|
||||
void initializeImpl() {
|
||||
super.initializeImpl();
|
||||
setMultipleMode(getTarget().isMultipleMode());
|
||||
final int[] selectedIndices = getTarget().getSelectedIndexes();
|
||||
synchronized (getDelegateLock()) {
|
||||
|
||||
@ -54,8 +54,8 @@ final class LWScrollBarPeer extends LWComponentPeer<Scrollbar, JScrollBar>
|
||||
}
|
||||
|
||||
@Override
|
||||
public void initialize() {
|
||||
super.initialize();
|
||||
void initializeImpl() {
|
||||
super.initializeImpl();
|
||||
final Scrollbar target = getTarget();
|
||||
setValues(target.getValue(), target.getVisibleAmount(),
|
||||
target.getMinimum(), target.getMaximum());
|
||||
|
||||
@ -70,8 +70,8 @@ final class LWScrollPanePeer extends LWContainerPeer<ScrollPane, JScrollPane>
|
||||
}
|
||||
|
||||
@Override
|
||||
public void initialize() {
|
||||
super.initialize();
|
||||
void initializeImpl() {
|
||||
super.initializeImpl();
|
||||
final int policy = getTarget().getScrollbarDisplayPolicy();
|
||||
synchronized (getDelegateLock()) {
|
||||
getDelegate().getViewport().setScrollMode(JViewport.SIMPLE_SCROLL_MODE);
|
||||
|
||||
@ -59,8 +59,8 @@ final class LWTextAreaPeer
|
||||
}
|
||||
|
||||
@Override
|
||||
public void initialize() {
|
||||
super.initialize();
|
||||
void initializeImpl() {
|
||||
super.initializeImpl();
|
||||
final int visibility = getTarget().getScrollbarVisibility();
|
||||
synchronized (getDelegateLock()) {
|
||||
setScrollBarVisibility(visibility);
|
||||
|
||||
@ -63,8 +63,8 @@ abstract class LWTextComponentPeer<T extends TextComponent, D extends JComponent
|
||||
}
|
||||
|
||||
@Override
|
||||
public void initialize() {
|
||||
super.initialize();
|
||||
void initializeImpl() {
|
||||
super.initializeImpl();
|
||||
synchronized (getDelegateLock()) {
|
||||
// This listener should be added before setText().
|
||||
getTextComponent().getDocument().addDocumentListener(this);
|
||||
|
||||
@ -58,8 +58,8 @@ final class LWTextFieldPeer
|
||||
}
|
||||
|
||||
@Override
|
||||
public void initialize() {
|
||||
super.initialize();
|
||||
void initializeImpl() {
|
||||
super.initializeImpl();
|
||||
setEchoChar(getTarget().getEchoChar());
|
||||
synchronized (getDelegateLock()) {
|
||||
getDelegate().addActionListener(this);
|
||||
|
||||
@ -145,8 +145,6 @@ public class LWWindowPeer
|
||||
// similar to what Apple's Java do.
|
||||
// Since JDK7 we should rely on setOpacity() only.
|
||||
// this.opacity = c.getAlpha();
|
||||
// System.out.println("Delegate assigns alpha (we ignore setOpacity()):"
|
||||
// +this.opacity);
|
||||
}
|
||||
|
||||
if (!target.isForegroundSet()) {
|
||||
@ -159,23 +157,29 @@ public class LWWindowPeer
|
||||
}
|
||||
|
||||
@Override
|
||||
public void initialize() {
|
||||
void initializeImpl() {
|
||||
super.initializeImpl();
|
||||
if (getTarget() instanceof Frame) {
|
||||
setTitle(((Frame)getTarget()).getTitle());
|
||||
setState(((Frame)getTarget()).getExtendedState());
|
||||
setTitle(((Frame) getTarget()).getTitle());
|
||||
setState(((Frame) getTarget()).getExtendedState());
|
||||
} else if (getTarget() instanceof Dialog) {
|
||||
setTitle(((Dialog)getTarget()).getTitle());
|
||||
setTitle(((Dialog) getTarget()).getTitle());
|
||||
}
|
||||
|
||||
setAlwaysOnTop(getTarget().isAlwaysOnTop());
|
||||
updateMinimumSize();
|
||||
|
||||
setOpacity(getTarget().getOpacity());
|
||||
final float opacity = getTarget().getOpacity();
|
||||
if (opacity < 1.0f) {
|
||||
setOpacity(opacity);
|
||||
}
|
||||
|
||||
setOpaque(getTarget().isOpaque());
|
||||
|
||||
super.initialize();
|
||||
|
||||
updateInsets(platformWindow.getInsets());
|
||||
if (getSurfaceData() == null) {
|
||||
replaceSurfaceData();
|
||||
}
|
||||
}
|
||||
|
||||
// Just a helper method
|
||||
@ -213,50 +217,29 @@ public class LWWindowPeer
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setVisible(final boolean visible) {
|
||||
if (getSurfaceData() == null) {
|
||||
replaceSurfaceData();
|
||||
}
|
||||
|
||||
if (isVisible() == visible) {
|
||||
return;
|
||||
}
|
||||
super.setVisible(visible);
|
||||
|
||||
protected void setVisibleImpl(final boolean visible) {
|
||||
super.setVisibleImpl(visible);
|
||||
// TODO: update graphicsConfig, see 4868278
|
||||
// TODO: don't notify the delegate if our visibility is unchanged
|
||||
platformWindow.setVisible(visible);
|
||||
if (isSimpleWindow()) {
|
||||
LWKeyboardFocusManagerPeer manager = LWKeyboardFocusManagerPeer.
|
||||
getInstance(getAppContext());
|
||||
|
||||
// it is important to call this method on EDT
|
||||
// to prevent the deadlocks during the painting of the lightweight delegates
|
||||
//TODO: WHY? This is a native-system related call. Perhaps NOT calling
|
||||
// the painting procedure right from the setVisible(), but rather relying
|
||||
// on the native Expose event (or, scheduling the repainting asynchronously)
|
||||
// is better?
|
||||
SwingUtilities.invokeLater(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
platformWindow.setVisible(visible);
|
||||
if (isSimpleWindow()) {
|
||||
LWKeyboardFocusManagerPeer manager = LWKeyboardFocusManagerPeer.
|
||||
getInstance(getAppContext());
|
||||
|
||||
if (visible) {
|
||||
if (!getTarget().isAutoRequestFocus()) {
|
||||
return;
|
||||
} else {
|
||||
requestWindowFocus(CausedFocusEvent.Cause.ACTIVATION);
|
||||
}
|
||||
// Focus the owner in case this window is focused.
|
||||
} else if (manager.getCurrentFocusedWindow() == getTarget()) {
|
||||
// Transfer focus to the owner.
|
||||
LWWindowPeer owner = getOwnerFrameDialog(LWWindowPeer.this);
|
||||
if (owner != null) {
|
||||
owner.requestWindowFocus(CausedFocusEvent.Cause.ACTIVATION);
|
||||
}
|
||||
}
|
||||
if (visible) {
|
||||
if (!getTarget().isAutoRequestFocus()) {
|
||||
return;
|
||||
} else {
|
||||
requestWindowFocus(CausedFocusEvent.Cause.ACTIVATION);
|
||||
}
|
||||
// Focus the owner in case this window is focused.
|
||||
} else if (manager.getCurrentFocusedWindow() == getTarget()) {
|
||||
// Transfer focus to the owner.
|
||||
LWWindowPeer owner = getOwnerFrameDialog(LWWindowPeer.this);
|
||||
if (owner != null) {
|
||||
owner.requestWindowFocus(CausedFocusEvent.Cause.ACTIVATION);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -983,6 +966,9 @@ public class LWWindowPeer
|
||||
try {
|
||||
Rectangle r = getBounds();
|
||||
g.setColor(getBackground());
|
||||
if (g instanceof Graphics2D) {
|
||||
((Graphics2D) g).setComposite(AlphaComposite.Src);
|
||||
}
|
||||
g.fillRect(0, 0, r.width, r.height);
|
||||
if (oldBB != null) {
|
||||
// Draw the old back buffer to the new one
|
||||
|
||||
@ -56,7 +56,6 @@ public class CPlatformWindow extends CFRetainedResource implements PlatformWindo
|
||||
private static native void nativePushNSWindowToBack(long nsWindowPtr);
|
||||
private static native void nativePushNSWindowToFront(long nsWindowPtr);
|
||||
private static native void nativeSetNSWindowTitle(long nsWindowPtr, String title);
|
||||
private static native void nativeSetNSWindowAlpha(long nsWindowPtr, float alpha);
|
||||
private static native void nativeRevalidateNSWindowShadow(long nsWindowPtr);
|
||||
private static native void nativeSetNSWindowMinimizedIcon(long nsWindowPtr, long nsImage);
|
||||
private static native void nativeSetNSWindowRepresentedFilename(long nsWindowPtr, String representedFilename);
|
||||
@ -244,17 +243,6 @@ public class CPlatformWindow extends CFRetainedResource implements PlatformWindo
|
||||
// TODO: implement on top of JObjC bridged class
|
||||
// NSWindow window = JObjC.getInstance().AppKit().NSWindow().getInstance(nativeWindowPtr, JObjCRuntime.getInstance());
|
||||
|
||||
// Since JDK7 we have standard way to set opacity, so we should not pick
|
||||
// background's alpha.
|
||||
// TODO: set appropriate opacity value
|
||||
// this.opacity = target.getOpacity();
|
||||
// this.setOpacity(this.opacity);
|
||||
|
||||
final float windowAlpha = target.getOpacity();
|
||||
if (windowAlpha != 1.0f) {
|
||||
nativeSetNSWindowAlpha(nativeWindowPtr, windowAlpha);
|
||||
}
|
||||
|
||||
if (target instanceof javax.swing.RootPaneContainer) {
|
||||
final javax.swing.JRootPane rootpane = ((javax.swing.RootPaneContainer)target).getRootPane();
|
||||
if (rootpane != null) rootpane.addPropertyChangeListener("ancestor", new PropertyChangeListener() {
|
||||
@ -419,15 +407,9 @@ public class CPlatformWindow extends CFRetainedResource implements PlatformWindo
|
||||
if (owner != null) {
|
||||
CWrapper.NSWindow.removeChildWindow(owner.getNSWindowPtr(), getNSWindowPtr());
|
||||
}
|
||||
// Make sure window is ordered out before it is disposed, we could order it out right here or
|
||||
// we could postpone the disposal, I think postponing is probably better.
|
||||
EventQueue.invokeLater(new Runnable() {
|
||||
public void run() {
|
||||
contentView.dispose();
|
||||
nativeDispose(getNSWindowPtr());
|
||||
CPlatformWindow.super.dispose();
|
||||
}
|
||||
});
|
||||
contentView.dispose();
|
||||
nativeDispose(getNSWindowPtr());
|
||||
CPlatformWindow.super.dispose();
|
||||
}
|
||||
|
||||
@Override // PlatformWindow
|
||||
|
||||
@ -216,7 +216,6 @@ public class LWCToolkit extends LWToolkit {
|
||||
@Override
|
||||
public SystemTrayPeer createSystemTray(SystemTray target) {
|
||||
SystemTrayPeer peer = new CSystemTray();
|
||||
targetCreatedPeer(target, peer);
|
||||
return peer;
|
||||
}
|
||||
|
||||
|
||||
@ -932,27 +932,6 @@ AWT_ASSERT_NOT_APPKIT_THREAD;
|
||||
JNF_COCOA_EXIT(env);
|
||||
}
|
||||
|
||||
/*
|
||||
* Class: sun_lwawt_macosx_CPlatformWindow
|
||||
* Method: nativeSetNSWindowAlpha
|
||||
* Signature: (JF)V
|
||||
*/
|
||||
JNIEXPORT void JNICALL Java_sun_lwawt_macosx_CPlatformWindow_nativeSetNSWindowAlpha
|
||||
(JNIEnv *env, jclass clazz, jlong windowPtr, jfloat alpha)
|
||||
{
|
||||
JNF_COCOA_ENTER(env);
|
||||
AWT_ASSERT_NOT_APPKIT_THREAD;
|
||||
|
||||
NSWindow *nsWindow = OBJC(windowPtr);
|
||||
[JNFRunLoop performOnMainThreadWaiting:NO withBlock:^(){
|
||||
AWT_ASSERT_APPKIT_THREAD;
|
||||
|
||||
[nsWindow setAlphaValue:alpha];
|
||||
}];
|
||||
|
||||
JNF_COCOA_EXIT(env);
|
||||
}
|
||||
|
||||
/*
|
||||
* Class: sun_lwawt_macosx_CPlatformWindow
|
||||
* Method: nativeRevalidateNSWindowShadow
|
||||
|
||||
@ -796,9 +796,10 @@ public class GTKLookAndFeel extends SynthLookAndFeel {
|
||||
"Menu.margin", zeroInsets,
|
||||
"Menu.cancelMode", "hideMenuTree",
|
||||
"Menu.alignAcceleratorText", Boolean.FALSE,
|
||||
"Menu.useMenuBarForTopLevelMenus", Boolean.TRUE,
|
||||
|
||||
|
||||
"MenuBar.windowBindings", new Object[] {
|
||||
"MenuBar.windowBindings", new Object[] {
|
||||
"F10", "takeFocus" },
|
||||
"MenuBar.font", new FontLazyValue(Region.MENU_BAR),
|
||||
|
||||
|
||||
@ -92,7 +92,13 @@ class GTKStyleFactory extends SynthStyleFactory {
|
||||
boolean defaultCapable = btn.isDefaultCapable();
|
||||
key = new ComplexKey(wt, toolButton, defaultCapable);
|
||||
}
|
||||
} else if (id == Region.MENU) {
|
||||
if (c instanceof JMenu && ((JMenu) c).isTopLevelMenu() &&
|
||||
UIManager.getBoolean("Menu.useMenuBarForTopLevelMenus")) {
|
||||
wt = WidgetType.MENU_BAR;
|
||||
}
|
||||
}
|
||||
|
||||
if (key == null) {
|
||||
// Otherwise, just use the WidgetType as the key.
|
||||
key = wt;
|
||||
|
||||
@ -299,7 +299,8 @@ public class SynthMenuUI extends BasicMenuUI
|
||||
*/
|
||||
@Override
|
||||
public void propertyChange(PropertyChangeEvent e) {
|
||||
if (SynthLookAndFeel.shouldUpdateStyle(e)) {
|
||||
if (SynthLookAndFeel.shouldUpdateStyle(e) ||
|
||||
(e.getPropertyName().equals("ancestor") && UIManager.getBoolean("Menu.useMenuBarForTopLevelMenus"))) {
|
||||
updateStyle((JMenu)e.getSource());
|
||||
}
|
||||
}
|
||||
|
||||
@ -1474,9 +1474,7 @@ LRESULT AwtComponent::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
|
||||
::GetClientRect( GetHWnd(), &r );
|
||||
mr = WmSize(static_cast<UINT>(wParam), r.right - r.left, r.bottom - r.top);
|
||||
//mr = WmSize(wParam, LOWORD(lParam), HIWORD(lParam));
|
||||
if (ImmGetContext() != NULL) {
|
||||
SetCompositionWindow(r);
|
||||
}
|
||||
SetCompositionWindow(r);
|
||||
break;
|
||||
}
|
||||
case WM_SIZING:
|
||||
@ -1535,7 +1533,10 @@ LRESULT AwtComponent::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
|
||||
// When the window is deactivated, send WM_IME_ENDCOMPOSITION
|
||||
// message to deactivate the composition window so that
|
||||
// it won't receive keyboard input focus.
|
||||
if (ImmGetContext() != NULL) {
|
||||
HIMC hIMC;
|
||||
HWND hwnd = ImmGetHWnd();
|
||||
if ((hIMC = ImmGetContext(hwnd)) != NULL) {
|
||||
ImmReleaseContext(hwnd, hIMC);
|
||||
DefWindowProc(WM_IME_ENDCOMPOSITION, 0, 0);
|
||||
}
|
||||
}
|
||||
@ -1718,11 +1719,9 @@ LRESULT AwtComponent::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
|
||||
case WM_IME_SETCONTEXT:
|
||||
// lParam is passed as pointer and it can be modified.
|
||||
mr = WmImeSetContext(static_cast<BOOL>(wParam), &lParam);
|
||||
CallProxyDefWindowProc(message, wParam, lParam, retValue, mr);
|
||||
break;
|
||||
case WM_IME_NOTIFY:
|
||||
mr = WmImeNotify(wParam, lParam);
|
||||
CallProxyDefWindowProc(message, wParam, lParam, retValue, mr);
|
||||
break;
|
||||
case WM_IME_STARTCOMPOSITION:
|
||||
mr = WmImeStartComposition();
|
||||
@ -3723,12 +3722,14 @@ MsgRouting AwtComponent::WmPaste()
|
||||
// support IME Composition messages
|
||||
void AwtComponent::SetCompositionWindow(RECT& r)
|
||||
{
|
||||
HIMC hIMC = ImmGetContext();
|
||||
HWND hwnd = ImmGetHWnd();
|
||||
HIMC hIMC = ImmGetContext(hwnd);
|
||||
if (hIMC == NULL) {
|
||||
return;
|
||||
}
|
||||
COMPOSITIONFORM cf = {CFS_DEFAULT, {0, 0}, {0, 0, 0, 0}};
|
||||
ImmSetCompositionWindow(hIMC, &cf);
|
||||
ImmReleaseContext(hwnd, hIMC);
|
||||
}
|
||||
|
||||
void AwtComponent::OpenCandidateWindow(int x, int y)
|
||||
@ -3742,16 +3743,16 @@ void AwtComponent::OpenCandidateWindow(int x, int y)
|
||||
SetCandidateWindow(iCandType, x-rc.left, y-rc.top);
|
||||
}
|
||||
if (m_bitsCandType != 0) {
|
||||
HWND proxy = GetProxyFocusOwner();
|
||||
// REMIND: is there any chance GetProxyFocusOwner() returns NULL here?
|
||||
::DefWindowProc((proxy != NULL) ? proxy : GetHWnd(),
|
||||
::DefWindowProc(ImmGetHWnd(),
|
||||
WM_IME_NOTIFY, IMN_OPENCANDIDATE, m_bitsCandType);
|
||||
}
|
||||
}
|
||||
|
||||
void AwtComponent::SetCandidateWindow(int iCandType, int x, int y)
|
||||
{
|
||||
HIMC hIMC = ImmGetContext();
|
||||
HWND hwnd = ImmGetHWnd();
|
||||
HIMC hIMC = ImmGetContext(hwnd);
|
||||
CANDIDATEFORM cf;
|
||||
cf.dwIndex = iCandType;
|
||||
cf.dwStyle = CFS_CANDIDATEPOS;
|
||||
@ -3759,17 +3760,20 @@ void AwtComponent::SetCandidateWindow(int iCandType, int x, int y)
|
||||
cf.ptCurrentPos.y = y;
|
||||
|
||||
ImmSetCandidateWindow(hIMC, &cf);
|
||||
ImmReleaseContext(hwnd, hIMC);
|
||||
}
|
||||
|
||||
MsgRouting AwtComponent::WmImeSetContext(BOOL fSet, LPARAM *lplParam)
|
||||
{
|
||||
// If the Windows input context is disabled, do not let Windows
|
||||
// display any UIs.
|
||||
HIMC hIMC = ImmGetContext();
|
||||
HWND hwnd = ImmGetHWnd();
|
||||
HIMC hIMC = ImmGetContext(hwnd);
|
||||
if (hIMC == NULL) {
|
||||
*lplParam = 0;
|
||||
return mrDoDefault;
|
||||
}
|
||||
ImmReleaseContext(hwnd, hIMC);
|
||||
|
||||
if (fSet) {
|
||||
LPARAM lParam = *lplParam;
|
||||
@ -3824,11 +3828,13 @@ MsgRouting AwtComponent::WmImeComposition(WORD wChar, LPARAM flags)
|
||||
AwtInputTextInfor* textInfor = NULL;
|
||||
|
||||
try {
|
||||
HIMC hIMC = ImmGetContext();
|
||||
HWND hwnd = ImmGetHWnd();
|
||||
HIMC hIMC = ImmGetContext(hwnd);
|
||||
DASSERT(hIMC!=0);
|
||||
|
||||
textInfor = new AwtInputTextInfor;
|
||||
textInfor->GetContextData(hIMC, flags);
|
||||
ImmReleaseContext(hwnd, hIMC);
|
||||
|
||||
jstring jtextString = textInfor->GetText();
|
||||
/* The conditions to send the input method event to AWT EDT are:
|
||||
@ -4012,16 +4018,15 @@ void AwtComponent::InquireCandidatePosition()
|
||||
DASSERT(!safe_ExceptionOccurred(env));
|
||||
}
|
||||
|
||||
HIMC AwtComponent::ImmGetContext()
|
||||
HWND AwtComponent::ImmGetHWnd()
|
||||
{
|
||||
HWND proxy = GetProxyFocusOwner();
|
||||
return ::ImmGetContext((proxy != NULL) ? proxy : GetHWnd());
|
||||
return (proxy != NULL) ? proxy : GetHWnd();
|
||||
}
|
||||
|
||||
HIMC AwtComponent::ImmAssociateContext(HIMC himc)
|
||||
{
|
||||
HWND proxy = GetProxyFocusOwner();
|
||||
return ::ImmAssociateContext((proxy != NULL) ? proxy : GetHWnd(), himc);
|
||||
return ::ImmAssociateContext(ImmGetHWnd(), himc);
|
||||
}
|
||||
|
||||
HWND AwtComponent::GetProxyFocusOwner()
|
||||
|
||||
@ -464,7 +464,7 @@ public:
|
||||
int caretPos, int visiblePos);
|
||||
void InquireCandidatePosition();
|
||||
INLINE LPARAM GetCandidateType() { return m_bitsCandType; }
|
||||
HIMC ImmGetContext();
|
||||
HWND ImmGetHWnd();
|
||||
HIMC ImmAssociateContext(HIMC himc);
|
||||
HWND GetProxyFocusOwner();
|
||||
|
||||
|
||||
@ -156,6 +156,7 @@ FileDialogHookProc(HWND hdlg, UINT uiMsg, WPARAM wParam, LPARAM lParam)
|
||||
HIMC hIMC = ::ImmGetContext(hdlg);
|
||||
if (hIMC != NULL) {
|
||||
::ImmNotifyIME(hIMC, NI_COMPOSITIONSTR, CPS_CANCEL, 0);
|
||||
::ImmReleaseContext(hdlg, hIMC);
|
||||
}
|
||||
|
||||
WNDPROC lpfnWndProc = (WNDPROC)(::GetProp(parent, NativeDialogWndProcProp));
|
||||
|
||||
@ -319,8 +319,6 @@ LRESULT AwtFrame::ProxyWindowProc(UINT message, WPARAM wParam, LPARAM lParam, Ms
|
||||
case WM_IME_STARTCOMPOSITION:
|
||||
case WM_IME_ENDCOMPOSITION:
|
||||
case WM_IME_COMPOSITION:
|
||||
case WM_IME_SETCONTEXT:
|
||||
case WM_IME_NOTIFY:
|
||||
case WM_IME_CONTROL:
|
||||
case WM_IME_COMPOSITIONFULL:
|
||||
case WM_IME_SELECT:
|
||||
|
||||
@ -336,7 +336,8 @@ AwtTextComponent::WmPaste()
|
||||
//im --- override to over the spot composition
|
||||
void AwtTextComponent::SetCompositionWindow(RECT& rc)
|
||||
{
|
||||
HIMC hIMC = ImmGetContext();
|
||||
HWND hwnd = ImmGetHWnd();
|
||||
HIMC hIMC = ImmGetContext(hwnd);
|
||||
// rc is not used for text component.
|
||||
COMPOSITIONFORM cf = { CFS_FORCE_POSITION, {0,0}, {0,0,0,0} };
|
||||
GetCaretPos(&(cf.ptCurrentPos));
|
||||
@ -348,6 +349,7 @@ void AwtTextComponent::SetCompositionWindow(RECT& rc)
|
||||
LOGFONT lf;
|
||||
GetObject(m_hFont, sizeof(LOGFONT), &lf);
|
||||
ImmSetCompositionFont(hIMC, &lf);
|
||||
ImmReleaseContext(hwnd, hIMC);
|
||||
}
|
||||
//im --- end
|
||||
|
||||
|
||||
59
jdk/test/java/awt/Frame/7024749/bug7024749.java
Normal file
59
jdk/test/java/awt/Frame/7024749/bug7024749.java
Normal file
@ -0,0 +1,59 @@
|
||||
/*
|
||||
* 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 7024749
|
||||
* @summary JDK7 b131---a crash in: Java_sun_awt_windows_ThemeReader_isGetThemeTransitionDurationDefined+0x75
|
||||
* @library ../../../regtesthelpers
|
||||
* @build Util
|
||||
* @author Oleg Pekhovskiy: area=awt.toplevel
|
||||
@run main bug7024749
|
||||
*/
|
||||
|
||||
import java.awt.*;
|
||||
import test.java.awt.regtesthelpers.Util;
|
||||
|
||||
public class bug7024749 {
|
||||
public static void main(String[] args) {
|
||||
final Frame f = new Frame("F");
|
||||
f.setBounds(0,0,200,200);
|
||||
f.setEnabled(false); // <- disable the top-level
|
||||
f.setVisible(true);
|
||||
|
||||
Window w = new Window(f);
|
||||
w.setBounds(300,300,300,300);
|
||||
w.add(new TextField(20));
|
||||
w.setVisible(true);
|
||||
|
||||
Robot robot = Util.createRobot();
|
||||
robot.setAutoDelay(1000);
|
||||
Util.waitForIdle(robot);
|
||||
robot.delay(1000);
|
||||
Util.clickOnTitle(f, robot);
|
||||
Util.waitForIdle(robot);
|
||||
|
||||
f.dispose();
|
||||
System.out.println("Test passed!");
|
||||
}
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user