Merge commit '42b2e5ca519766e37ce6941ba4faecc9691cc403' into upstream
[debian/openrocket] / core / src / net / sf / openrocket / startup / OSXStartup.java
diff --git a/core/src/net/sf/openrocket/startup/OSXStartup.java b/core/src/net/sf/openrocket/startup/OSXStartup.java
new file mode 100644 (file)
index 0000000..ad14186
--- /dev/null
@@ -0,0 +1,115 @@
+package net.sf.openrocket.startup;
+
+import java.awt.Image;
+import java.awt.Toolkit;
+
+import net.sf.openrocket.arch.SystemInfo;
+import net.sf.openrocket.arch.SystemInfo.Platform;
+import net.sf.openrocket.gui.dialogs.AboutDialog;
+import net.sf.openrocket.gui.dialogs.preferences.PreferencesDialog;
+import net.sf.openrocket.gui.main.BasicFrame;
+import net.sf.openrocket.logging.LogHelper;
+
+import com.apple.eawt.AboutHandler;
+import com.apple.eawt.PreferencesHandler;
+import com.apple.eawt.QuitHandler;
+import com.apple.eawt.QuitResponse;
+import com.apple.eawt.AppEvent.AboutEvent;
+import com.apple.eawt.AppEvent.PreferencesEvent;
+import com.apple.eawt.AppEvent.QuitEvent;
+
+/**
+ * Static code for initialization of OSX UI Elements: Menu, Icon, Name and
+ * Application menu handlers.
+ * 
+ * @author Bill Kuker <bkuker@billkuker.com>
+ * 
+ */
+final class OSXStartup {
+       private static final LogHelper log = Application.getLogger();
+
+       // The name in the app menu
+       private static final String APP_NAME = "OpenRocket";
+       
+       // The image resource to use for the Dock Icon
+       private static final String ICON_RSRC = "/pix/icon/icon-256.png";
+       
+       /**
+        * The handler for the Quit item in the OSX app menu
+        */
+       private static final QuitHandler qh = new QuitHandler() {
+               @Override
+               public void handleQuitRequestWith(final QuitEvent e, final QuitResponse r) {
+                       BasicFrame.quitAction();
+                       // if we get here the user canceled
+                       r.cancelQuit();
+               }
+       };
+
+       /**
+        * The handler for the About item in the OSX app menu
+        */
+       private static final AboutHandler ah = new AboutHandler() {
+               @Override
+               public void handleAbout(final AboutEvent a) {
+                       new AboutDialog(null).setVisible(true);
+               }
+       };
+
+       /**
+        * The handler for the Preferences item in the OSX app menu
+        */
+       private static final PreferencesHandler ph = new PreferencesHandler() {
+               @Override
+               public void handlePreferences(final PreferencesEvent p) {
+                       PreferencesDialog.showPreferences(null);
+               }
+       };
+
+       /**
+        * Sets up the Application's Icon, Name, Menu and some menu item handlers
+        * for Apple OSX. This method needs to be called before other AWT or Swing
+        * things happen, or parts will fail to work.
+        * 
+        * This function should fail gracefully if the OS is wrong.
+        */
+       static void setupOSX() {
+               if (SystemInfo.getPlatform() != Platform.MAC_OS) {
+                       log.warn("Attempting to set up OSX UI on non-MAC_OS");
+               }
+               log.debug("Setting up OSX UI Elements");
+               try {
+                       // Put the menu bar at the top of the screen
+                       System.setProperty("apple.laf.useScreenMenuBar", "true");
+                       // Set the name in the menu
+                       System.setProperty("com.apple.mrj.application.apple.menu.about.name", APP_NAME);
+
+                       // This line must come AFTER the above properties are set, otherwise
+                       // the name will not appear
+                       final com.apple.eawt.Application osxApp = com.apple.eawt.Application.getApplication();
+
+                       if (osxApp == null) {
+                               // Application is null: Something is wrong, give up on OSX
+                               // setup.
+                               throw new NullPointerException("com.apple.eawt.Application.getApplication() returned NULL. "
+                                               + "Aborting OSX UI Setup.");
+                       }
+                       
+                       // Set handlers
+                       osxApp.setQuitHandler(qh);
+                       osxApp.setAboutHandler(ah);
+                       osxApp.setPreferencesHandler(ph);
+
+                       // Set the dock icon to the largest icon
+                       final Image dockIcon = Toolkit.getDefaultToolkit().getImage(
+                                       Startup2.class.getResource(ICON_RSRC));
+                       osxApp.setDockIconImage(dockIcon);
+
+               } catch (final Throwable t) {
+                       // None of the preceding is critical to the app,
+                       // so at worst case log an error and continue
+                       log.warn("Error setting up OSX UI:", t);
+               }
+       }
+
+}