diff options
| author | Eike Stepper | 2014-10-23 10:38:36 +0000 |
|---|---|---|
| committer | Eike Stepper | 2014-10-23 10:38:36 +0000 |
| commit | 742b88b2821acb1f3de12d9ec17a8fdd592500b6 (patch) | |
| tree | dad67e17b2d72c161058c82619c4d3776ad51d85 | |
| parent | 882b969cbdf181d202381ce132a44c273d9cc403 (diff) | |
| download | org.eclipse.oomph-742b88b2821acb1f3de12d9ec17a8fdd592500b6.tar.gz org.eclipse.oomph-742b88b2821acb1f3de12d9ec17a8fdd592500b6.tar.xz org.eclipse.oomph-742b88b2821acb1f3de12d9ec17a8fdd592500b6.zip | |
[440389] [MacOS] Clicking application menu "About setup-eclipse" has no effect
https://bugs.eclipse.org/bugs/show_bug.cgi?id=440389
3 files changed, 78 insertions, 84 deletions
diff --git a/plugins/org.eclipse.oomph.setup.installer/src/org/eclipse/oomph/setup/internal/installer/CocoaUtil.java b/plugins/org.eclipse.oomph.setup.installer/src/org/eclipse/oomph/setup/internal/installer/CocoaUtil.java index 8635a7425..34739354a 100644 --- a/plugins/org.eclipse.oomph.setup.installer/src/org/eclipse/oomph/setup/internal/installer/CocoaUtil.java +++ b/plugins/org.eclipse.oomph.setup.installer/src/org/eclipse/oomph/setup/internal/installer/CocoaUtil.java @@ -22,9 +22,6 @@ import java.lang.reflect.Method; */ public final class CocoaUtil { - @SuppressWarnings("restriction") - private static final boolean LONG_POINTERS = org.eclipse.swt.internal.C.PTR_SIZEOF == 8; - private static final int ABOUT_ITEM_INDEX = 0; private static final int PREFERENCES_ITEM_INDEX = 2; @@ -38,36 +35,13 @@ public final class CocoaUtil return ReflectUtil.invokeMethod(method, target, arguments); } - private static long pointer(Method method, Object target, Object... arguments) - { - Object pointer = invoke(method, target, arguments); - if (pointer instanceof Long) - { - return (Long)pointer; - } - - if (pointer instanceof Integer) - { - return (Integer)pointer; - } - - return 0; - } - - private static Object adjust(long value) - { - if (LONG_POINTERS) - { - return value; - } - - return (int)value; - } - public static void register(Display display, final Runnable about, final Runnable preferences, final Runnable quit) { try { + final Class<?> NSString = Class.forName("org.eclipse.swt.internal.cocoa.NSString"); + final Method NSString_stringWith = ReflectUtil.getMethod(NSString, "stringWith", String.class); + final Class<?> Callback = Class.forName("org.eclipse.swt.internal.Callback"); final Method Callback_getAddress = ReflectUtil.getMethod(Callback, "getAddress"); final Method Callback_dispose = ReflectUtil.getMethod(Callback, "dispose"); @@ -83,24 +57,21 @@ public final class CocoaUtil final Class<?> NSMenu = Class.forName("org.eclipse.swt.internal.cocoa.NSMenu"); final Method NSMenu_itemAtIndex = ReflectUtil.getMethod(NSMenu, "itemAtIndex", long.class); - final Method NSMenu_submenu = ReflectUtil.getMethod(NSMenu, "submenu"); - - final Class<?> NSString = Class.forName("org.eclipse.swt.internal.cocoa.NSString"); - final Method NSString_stringWith = ReflectUtil.getMethod(NSString, "stringWith", String.class); final Class<?> NSMenuItem = Class.forName("org.eclipse.swt.internal.cocoa.NSMenuItem"); - final Method NSMenuItem_setTitle = ReflectUtil.getMethod(NSMenuItem, "setTitle", String.class); + final Method NSMenuItem_submenu = ReflectUtil.getMethod(NSMenuItem, "submenu"); + final Method NSMenuItem_setTitle = ReflectUtil.getMethod(NSMenuItem, "setTitle", NSString); final Method NSMenuItem_setEnabled = ReflectUtil.getMethod(NSMenuItem, "setEnabled", boolean.class); final Method NSMenuItem_setAction = ReflectUtil.getMethod(NSMenuItem, "setAction", long.class); - final long aboutItemSelected = pointer(OS_sel_registerName, null, "aboutMenuItemSelected:"); - final long preferencesItemSelected = pointer(OS_sel_registerName, null, "preferencesMenuItemSelected:"); - final long quitItemSelected = pointer(OS_sel_registerName, null, "quitMenuItemSelected:"); + final long aboutItemSelected = (Long)invoke(OS_sel_registerName, null, "aboutMenuItemSelected:"); + final long preferencesItemSelected = (Long)invoke(OS_sel_registerName, null, "preferencesMenuItemSelected:"); + final long quitItemSelected = (Long)invoke(OS_sel_registerName, null, "quitMenuItemSelected:"); - Object target = new Object() + Object callbackTarget = new Object() { @SuppressWarnings("unused") - int actionProc(int id, int sel, int arg2) + long actionProc(long id, long sel, long arg2) { if (sel == aboutItemSelected) { @@ -129,26 +100,26 @@ public final class CocoaUtil }; @SuppressWarnings("restriction") - final org.eclipse.swt.internal.Callback callback = new org.eclipse.swt.internal.Callback(target, "actionProc", 3); - final long callbackPointer = pointer(Callback_getAddress, callback); + final org.eclipse.swt.internal.Callback callback = new org.eclipse.swt.internal.Callback(callbackTarget, "actionProc", 3); + final long callbackPointer = (Long)invoke(Callback_getAddress, callback); if (callbackPointer == 0) { throw new SWTException("No more callbacks"); } - final long classPointer = pointer(OS_objc_lookUpClass, null, "SWTApplicationDelegate"); - invoke(OS_class_addMethod, null, adjust(classPointer), adjust(aboutItemSelected), adjust(callbackPointer), TYPES); - invoke(OS_class_addMethod, null, adjust(classPointer), adjust(preferencesItemSelected), adjust(callbackPointer), TYPES); - invoke(OS_class_addMethod, null, adjust(classPointer), adjust(quitItemSelected), adjust(callbackPointer), TYPES); + final long classPointer = (Long)invoke(OS_objc_lookUpClass, null, "SWTApplicationDelegate"); + invoke(OS_class_addMethod, null, classPointer, aboutItemSelected, callbackPointer, TYPES); + invoke(OS_class_addMethod, null, classPointer, preferencesItemSelected, callbackPointer, TYPES); + invoke(OS_class_addMethod, null, classPointer, quitItemSelected, callbackPointer, TYPES); final Object application = invoke(NSApplication_sharedApplication, null); final Object mainMenu = invoke(NSApplication_mainMenu, application); - final Object mainItem = invoke(NSMenu_itemAtIndex, mainMenu, adjust(0)); - final Object appMenu = invoke(NSMenu_submenu, mainItem); + final Object mainItem = invoke(NSMenu_itemAtIndex, mainMenu, (long)0); + final Object appMenu = invoke(NSMenuItem_submenu, mainItem); - final Object aboutItem = invoke(NSMenu_itemAtIndex, appMenu, adjust(ABOUT_ITEM_INDEX)); - final Object preferencesItem = invoke(NSMenu_itemAtIndex, appMenu, adjust(PREFERENCES_ITEM_INDEX)); - final Object quitItem = invoke(NSMenu_itemAtIndex, appMenu, adjust(QUIT_ITEM_INDEX)); + final Object aboutItem = invoke(NSMenu_itemAtIndex, appMenu, (long)ABOUT_ITEM_INDEX); + final Object preferencesItem = invoke(NSMenu_itemAtIndex, appMenu, (long)PREFERENCES_ITEM_INDEX); + final Object quitItem = invoke(NSMenu_itemAtIndex, appMenu, (long)QUIT_ITEM_INDEX); final String appName = Display.getAppName(); if (appName != null) @@ -160,9 +131,9 @@ public final class CocoaUtil invoke(NSMenuItem_setTitle, quitItem, quitLabel); } - invoke(NSMenuItem_setAction, aboutItem, adjust(aboutItemSelected)); - invoke(NSMenuItem_setAction, preferencesItem, adjust(preferencesItemSelected)); - invoke(NSMenuItem_setAction, quitItem, adjust(quitItemSelected)); + invoke(NSMenuItem_setAction, aboutItem, aboutItemSelected); + invoke(NSMenuItem_setAction, preferencesItem, preferencesItemSelected); + invoke(NSMenuItem_setAction, quitItem, quitItemSelected); invoke(NSMenuItem_setEnabled, preferencesItem, true); invoke(NSMenuItem_setEnabled, quitItem, true); diff --git a/plugins/org.eclipse.oomph.setup.installer/src/org/eclipse/oomph/setup/internal/installer/InstallerApplication.java b/plugins/org.eclipse.oomph.setup.installer/src/org/eclipse/oomph/setup/internal/installer/InstallerApplication.java index 0135d03ce..99a1d4f8f 100644 --- a/plugins/org.eclipse.oomph.setup.installer/src/org/eclipse/oomph/setup/internal/installer/InstallerApplication.java +++ b/plugins/org.eclipse.oomph.setup.installer/src/org/eclipse/oomph/setup/internal/installer/InstallerApplication.java @@ -12,10 +12,12 @@ package org.eclipse.oomph.setup.internal.installer; import org.eclipse.oomph.p2.core.P2Util; import org.eclipse.oomph.setup.internal.core.SetupContext; +import org.eclipse.oomph.setup.ui.AbstractSetupDialog; import org.eclipse.oomph.setup.ui.SetupUIPlugin; import org.eclipse.oomph.setup.ui.wizards.SetupWizard; import org.eclipse.oomph.ui.ErrorDialog; +import org.eclipse.core.runtime.Platform; import org.eclipse.equinox.app.IApplication; import org.eclipse.equinox.app.IApplicationContext; import org.eclipse.equinox.p2.core.IProvisioningAgent; @@ -65,33 +67,47 @@ public class InstallerApplication implements IApplication try { final Display display = Display.getDefault(); - Display.setAppName("Oomph-Installer"); - - // if (Platform.WS_COCOA.equals(Platform.getWS())) - // { - // Runnable about = new Runnable() - // { - // public void run() - // { - // } - // }; - // - // Runnable preferences = new Runnable() - // { - // public void run() - // { - // } - // }; - // - // Runnable quit = new Runnable() - // { - // public void run() - // { - // } - // }; - // - // CocoaUtil.register(display, about, preferences, quit); - // } + Display.setAppName(AbstractSetupDialog.SHELL_TEXT); + + final InstallerDialog[] installerDialog = { null }; + if (Platform.WS_COCOA.equals(Platform.getWS())) + { + Runnable about = new Runnable() + { + public void run() + { + if (installerDialog[0] != null) + { + installerDialog[0].showAbout(); + } + } + }; + + Runnable preferences = new Runnable() + { + public void run() + { + if (installerDialog[0] != null) + { + ProxyPreferenceDialog proxyPreferenceDialog = new ProxyPreferenceDialog(installerDialog[0].getShell()); + proxyPreferenceDialog.open(); + } + } + }; + + Runnable quit = new Runnable() + { + public void run() + { + if (installerDialog[0] != null) + { + display.dispose(); + } + } + }; + + CocoaUtil.register(display, about, preferences, quit); + } display.asyncExec(new Runnable() { @@ -111,8 +127,8 @@ public class InstallerApplication implements IApplication org.eclipse.equinox.internal.p2.repository.Activator.getContext(), IProvisioningAgent.SERVICE_NAME); agent.registerService(UIServices.SERVICE_NAME, SetupWizard.Installer.SERVICE_UI); - InstallerDialog dialog = new InstallerDialog(null, restarted); - final int retcode = dialog.open(); + installerDialog[0] = new InstallerDialog(null, restarted); + final int retcode = installerDialog[0].open(); if (retcode == InstallerDialog.RETURN_RESTART) { try diff --git a/plugins/org.eclipse.oomph.setup.installer/src/org/eclipse/oomph/setup/internal/installer/InstallerDialog.java b/plugins/org.eclipse.oomph.setup.installer/src/org/eclipse/oomph/setup/internal/installer/InstallerDialog.java index 08d73f50b..55aa26d30 100644 --- a/plugins/org.eclipse.oomph.setup.installer/src/org/eclipse/oomph/setup/internal/installer/InstallerDialog.java +++ b/plugins/org.eclipse.oomph.setup.installer/src/org/eclipse/oomph/setup/internal/installer/InstallerDialog.java @@ -100,6 +100,8 @@ public final class InstallerDialog extends SetupWizardDialog private IStatus updateError; + private String version; + private Link versionLink; public InstallerDialog(Shell parentShell, boolean restarted) @@ -308,6 +310,11 @@ public final class InstallerDialog extends SetupWizardDialog thread.start(); } + public void showAbout() + { + new AboutDialog(getShell(), version).open(); + } + /** * @author Eike Stepper */ @@ -345,7 +352,7 @@ public final class InstallerDialog extends SetupWizardDialog { try { - final String version = getProductVersion(); + version = getProductVersion(); if (version != null) { if (selfHosting) @@ -369,7 +376,7 @@ public final class InstallerDialog extends SetupWizardDialog @Override public void widgetSelected(SelectionEvent e) { - new AboutDialog(getShell(), version).open(); + showAbout(); } }); |
