isAMac() -> isAMacAndNotJS(), isWindows() -> isWindowsAndNotJS()
[jalview.git] / src / jalview / util / Platform.java
index 786f5bf..bb3f7fa 100644 (file)
 package jalview.util;
 
 import java.awt.Toolkit;
+import java.awt.event.InputEvent;
 import java.awt.event.MouseEvent;
 
+import javax.swing.SwingUtilities;
+
 /**
  * System platform information used by Applet and Application
  * 
@@ -30,22 +33,87 @@ import java.awt.event.MouseEvent;
  */
 public class Platform
 {
+
+  private static Boolean isNoJSMac = null, isNoJSWindows = null;
+
+  private static Boolean isHeadless = null;
+
   /**
    * sorry folks - Macs really are different
    * 
+   * BH: disabled for SwingJS -- will need to check key-press issues
+   * 
    * @return true if we do things in a special way.
    */
-  public static boolean isAMac()
+  public static boolean isAMacAndNotJS()
   {
-    return java.lang.System.getProperty("os.name").indexOf("Mac") > -1;
+    if (isNoJSMac == null)
+    {
+      isNoJSMac = /** @j2sNative false && */
+              System.getProperty("os.name").indexOf("Mac") > -1;
+    }
+
+    return isNoJSMac.booleanValue();
 
   }
 
-  public static boolean isHeadless()
+  /**
+   * Check if we are on a Microsoft plaform...
+   * 
+   * @return true if we have to cope with another platform variation
+   */
+  public static boolean isWindowsAndNotJS()
   {
-    String hdls = java.lang.System.getProperty("java.awt.headless");
+    if (isNoJSWindows == null)
+    {
+      isNoJSWindows = /** @j2sNative false && */
+              System.getProperty("os.name").indexOf("Win") > -1;
+    }
+    return isNoJSWindows.booleanValue();
+  }
 
-    return hdls != null && hdls.equals("true");
+// BH - preferred:
+//
+//  /**
+//   * @return true if this is a Mac
+//   */
+//  private static boolean isAMac()
+//  {
+//    if (isAMac == null)
+//    {
+//     isAMac = System.getProperty("os.name").indexOf("Mac") > -1;
+//    }
+//
+//    return isAMac.booleanValue();
+//
+//  }
+//
+//  /**
+//   * Check if we are on a Microsoft plaform...
+//   * 
+//   * @return true if we have to cope with another platform variation
+//   */
+//  private static boolean isWindows()
+//  {
+//    if (isWindows == null)
+//    {
+//     isWindows = System.getProperty("os.name").indexOf("Win") > -1;
+//    }
+//    return isWindows.booleanValue();
+//  }
+//
+
+  /**
+   * 
+   * @return true if we are running in non-interactive no UI mode
+   */
+  public static boolean isHeadless()
+  {
+    if (isHeadless == null)
+    {
+      isHeadless = "true".equals(System.getProperty("java.awt.headless"));
+    }
+    return isHeadless;
   }
 
   /**
@@ -78,10 +146,53 @@ public class Platform
     return f.toString();
   }
 
+  /**
+   * Answers true if the mouse event has Meta-down (Command key on Mac) or
+   * Ctrl-down (on other o/s). Note this answers _false_ if the Ctrl key is
+   * pressed instead of the Meta/Cmd key on Mac. To test for Ctrl-pressed on Mac,
+   * you can use e.isPopupTrigger().
+   * 
+   * @param e
+   * @return
+   */
   public static boolean isControlDown(MouseEvent e)
   {
-    return (jalview.util.Platform.isAMac() ? (Toolkit.getDefaultToolkit()
-            .getMenuShortcutKeyMask() & e.getModifiers()) != 0 : e
-            .isControlDown());
+    boolean aMac = isAMacAndNotJS();
+    return isControlDown(e, aMac);
+  }
+
+  /**
+   * Overloaded version of method (to allow unit testing)
+   * 
+   * @param e
+   * @param aMac
+   * @return
+   */
+  protected static boolean isControlDown(MouseEvent e, boolean aMac)
+  {
+    if (aMac)
+    {
+      /*
+       * answer false for right mouse button
+       */
+      if (e.isPopupTrigger())
+      {
+        return false;
+      }
+      return (Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()
+              & e.getModifiers()) != 0;
+      // could we use e.isMetaDown() here?
+    }
+    return e.isControlDown();
+  }
+
+  public static boolean isWinRightButton(MouseEvent e) 
+  {
+       return !isAMacAndNotJS() && SwingUtilities.isRightMouseButton(e);
+  }
+
+  public static boolean isWinMiddleButton(MouseEvent evt) 
+  {
+       return !isAMacAndNotJS() && ((evt.getModifiers() & InputEvent.BUTTON2_MASK) == InputEvent.BUTTON2_MASK);
   }
 }