This commit is contained in:
Lana Steuck 2012-07-03 20:56:24 -07:00
commit a94b4fa40d
24 changed files with 195 additions and 172 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -216,7 +216,6 @@ public class LWCToolkit extends LWToolkit {
@Override
public SystemTrayPeer createSystemTray(SystemTray target) {
SystemTrayPeer peer = new CSystemTray();
targetCreatedPeer(target, peer);
return peer;
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View 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!");
}
}