diff options
author | Steve Northover <steve> | 2007-10-25 19:07:54 +0000 |
---|---|---|
committer | Steve Northover <steve> | 2007-10-25 19:07:54 +0000 |
commit | ac1cb622bd117559fce6fef13f61cee1624cd94b (patch) | |
tree | 38e8afbb7be18fcfc294e7bc0aa51e9447ebba9d /bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt | |
parent | f4bf784633a3133897e45a4c20e9dd0f60a6f50f (diff) | |
download | eclipse.platform.swt-ac1cb622bd117559fce6fef13f61cee1624cd94b.tar.gz eclipse.platform.swt-ac1cb622bd117559fce6fef13f61cee1624cd94b.tar.xz eclipse.platform.swt-ac1cb622bd117559fce6fef13f61cee1624cd94b.zip |
207263 - NPE in org.eclipse.swt.widgets.Control.WM_MENUSELECT
Diffstat (limited to 'bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt')
-rwxr-xr-x | bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Menu.java | 9 | ||||
-rwxr-xr-x | bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/MenuItem.java | 14 |
2 files changed, 18 insertions, 5 deletions
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Menu.java b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Menu.java index bd757dc484..2cd3dc7b86 100755 --- a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Menu.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Menu.java @@ -568,12 +568,17 @@ void destroyItem (MenuItem item) { } void destroyWidget () { + MenuItem parentItem = cascade; int /*long*/ hMenu = handle, hCB = hwndCB; releaseHandle (); if (OS.IsWinCE && hCB != 0) { OS.CommandBar_Destroy (hCB); } else { - if (hMenu != 0) OS.DestroyMenu (hMenu); + if (parentItem != null) { + if (!OS.IsSP) parentItem.setMenu (null, true); + } else { + if (hMenu != 0) OS.DestroyMenu (hMenu); + } } } @@ -1098,6 +1103,7 @@ void redraw () { void releaseHandle () { super.releaseHandle (); handle = hwndCB = 0; + cascade = null; } void releaseChildren (boolean destroy) { @@ -1144,7 +1150,6 @@ void releaseWidget () { } if (parent != null) parent.removeMenu (this); parent = null; - cascade = null; } /** diff --git a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/MenuItem.java b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/MenuItem.java index 1cd4494101..01a0e11789 100755 --- a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/MenuItem.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/MenuItem.java @@ -500,7 +500,6 @@ void releaseHandle () { } void releaseMenu () { - if (!OS.IsSP) setMenu (null); menu = null; } @@ -781,6 +780,10 @@ public void setMenu (Menu menu) { error (SWT.ERROR_INVALID_PARENT); } } + setMenu (menu, false); +} + +void setMenu (Menu menu, boolean dispose) { /* Assign the new menu */ Menu oldMenu = this.menu; @@ -848,8 +851,8 @@ public void setMenu (Menu menu) { info.fMask |= OS.MIIM_SUBMENU; info.hSubMenu = menu.handle; } - OS.RemoveMenu (hMenu, index, OS.MF_BYPOSITION); if (OS.IsWinCE) { + OS.RemoveMenu (hMenu, index, OS.MF_BYPOSITION); /* * On WinCE, InsertMenuItem() is not available. The fix is to * use SetMenuItemInfo() but this call does not set the menu item @@ -876,7 +879,12 @@ public void setMenu (Menu menu) { } } } else { - success = OS.InsertMenuItem (hMenu, index, true, info); + if (dispose || oldMenu == null) { + success = OS.SetMenuItemInfo (hMenu, index, true, info); + } else { + OS.RemoveMenu (hMenu, index, OS.MF_BYPOSITION); + success = OS.InsertMenuItem (hMenu, index, true, info); + } /* * Restore the bitmap that was removed to work around a problem * in GetMenuItemInfo() and menu items that have bitmaps set with |