comments only
[jalview.git] / src / jalview / util / Platform.java
1 /*
2  * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3  * Copyright (C) $$Year-Rel$$ The Jalview Authors
4  * 
5  * This file is part of Jalview.
6  * 
7  * Jalview is free software: you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License 
9  * as published by the Free Software Foundation, either version 3
10  * of the License, or (at your option) any later version.
11  *  
12  * Jalview is distributed in the hope that it will be useful, but 
13  * WITHOUT ANY WARRANTY; without even the implied warranty 
14  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
15  * PURPOSE.  See the GNU General Public License for more details.
16  * 
17  * You should have received a copy of the GNU General Public License
18  * along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
19  * The Jalview Authors are detailed in the 'AUTHORS' file.
20  */
21 package jalview.util;
22
23 import java.awt.Toolkit;
24 import java.awt.event.MouseEvent;
25
26 /**
27  * System platform information used by Applet and Application
28  * 
29  * @author Jim Procter
30  */
31 public class Platform
32 {
33
34   private static Boolean isAMac = null, isWindows = null;
35
36   private static Boolean isHeadless = null;
37
38   /**
39    * sorry folks - Macs really are different
40    * 
41    * BH: disabled for SwingJS -- will need to check key-press issues
42    * 
43    * @return true if we do things in a special way.
44    */
45   public static boolean isAMac()
46   {
47     if (isAMac == null)
48     {
49       isAMac = /** @j2sNative false && */
50               System.getProperty("os.name").indexOf("Mac") > -1;
51     }
52
53     return isAMac.booleanValue();
54
55   }
56
57   /**
58    * Check if we are on a Microsoft plaform...
59    * 
60    * @return true if we have to cope with another platform variation
61    */
62   public static boolean isWindows()
63   {
64     if (isWindows == null)
65     {
66       isWindows = /** @j2sNative false && */
67               System.getProperty("os.name").indexOf("Win") > -1;
68     }
69     return isWindows.booleanValue();
70   }
71
72 // BH - preferred:
73 //
74 //  /**
75 //   * @return true if this is a Mac
76 //   */
77 //  private static boolean isAMac()
78 //  {
79 //    if (isAMac == null)
80 //    {
81 //      isAMac = System.getProperty("os.name").indexOf("Mac") > -1;
82 //    }
83 //
84 //    return isAMac.booleanValue();
85 //
86 //  }
87 //
88 //  /**
89 //   * Check if we are on a Microsoft plaform...
90 //   * 
91 //   * @return true if we have to cope with another platform variation
92 //   */
93 //  private static boolean isWindows()
94 //  {
95 //    if (isWindows == null)
96 //    {
97 //      isWindows = System.getProperty("os.name").indexOf("Win") > -1;
98 //    }
99 //    return isWindows.booleanValue();
100 //  }
101 //
102
103   /**
104    * 
105    * @return true if we are running in non-interactive no UI mode
106    */
107   public static boolean isHeadless()
108   {
109     if (isHeadless == null)
110     {
111       isHeadless = "true".equals(System.getProperty("java.awt.headless"));
112     }
113     return isHeadless;
114   }
115
116   /**
117    * 
118    * @return nominal maximum command line length for this platform
119    */
120   public static int getMaxCommandLineLength()
121   {
122     // TODO: determine nominal limits for most platforms.
123     return 2046; // this is the max length for a windows NT system.
124   }
125
126   /**
127    * escape a string according to the local platform's escape character
128    * 
129    * @param file
130    * @return escaped file
131    */
132   public static String escapeString(String file)
133   {
134     StringBuffer f = new StringBuffer();
135     int p = 0, lastp = 0;
136     while ((p = file.indexOf('\\', lastp)) > -1)
137     {
138       f.append(file.subSequence(lastp, p));
139       f.append("\\\\");
140       lastp = p + 1;
141     }
142     f.append(file.substring(lastp));
143     return f.toString();
144   }
145
146   /**
147    * Answers true if the mouse event has Meta-down (Command key on Mac) or
148    * Ctrl-down (on other o/s). Note this answers _false_ if the Ctrl key is
149    * pressed instead of the Meta/Cmd key on Mac. To test for Ctrl-click on Mac,
150    * you can use e.isPopupTrigger().
151    * 
152    * @param e
153    * @return
154    */
155   public static boolean isControlDown(MouseEvent e)
156   {
157     boolean aMac = isAMac();
158     return isControlDown(e, aMac);
159   }
160
161   /**
162    * Overloaded version of method (to allow unit testing)
163    * 
164    * @param e
165    * @param aMac
166    * @return
167    */
168   protected static boolean isControlDown(MouseEvent e, boolean aMac)
169   {
170     if (aMac)
171     {
172       /*
173        * answer false for right mouse button
174        */
175       if (e.isPopupTrigger())
176       {
177         return false;
178       }
179       return (Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()
180               & e.getModifiers()) != 0;
181       // could we use e.isMetaDown() here?
182     }
183     return e.isControlDown();
184   }
185 }