Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEike Stepper2014-10-23 10:38:36 +0000
committerEike Stepper2014-10-23 10:38:36 +0000
commit742b88b2821acb1f3de12d9ec17a8fdd592500b6 (patch)
treedad67e17b2d72c161058c82619c4d3776ad51d85
parent882b969cbdf181d202381ce132a44c273d9cc403 (diff)
downloadorg.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
-rw-r--r--plugins/org.eclipse.oomph.setup.installer/src/org/eclipse/oomph/setup/internal/installer/CocoaUtil.java77
-rw-r--r--plugins/org.eclipse.oomph.setup.installer/src/org/eclipse/oomph/setup/internal/installer/InstallerApplication.java74
-rw-r--r--plugins/org.eclipse.oomph.setup.installer/src/org/eclipse/oomph/setup/internal/installer/InstallerDialog.java11
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();
}
});

Back to the top