Bob first commit JAL-3032
[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   /**
73    * 
74    * @return true if we are running in non-interactive no UI mode
75    */
76   public static boolean isHeadless()
77   {
78     if (isHeadless == null)
79     {
80       isHeadless = "true".equals(System.getProperty("java.awt.headless"));
81     }
82     return isHeadless;
83   }
84
85   /**
86    * 
87    * @return nominal maximum command line length for this platform
88    */
89   public static int getMaxCommandLineLength()
90   {
91     // TODO: determine nominal limits for most platforms.
92     return 2046; // this is the max length for a windows NT system.
93   }
94
95   /**
96    * escape a string according to the local platform's escape character
97    * 
98    * @param file
99    * @return escaped file
100    */
101   public static String escapeString(String file)
102   {
103     StringBuffer f = new StringBuffer();
104     int p = 0, lastp = 0;
105     while ((p = file.indexOf('\\', lastp)) > -1)
106     {
107       f.append(file.subSequence(lastp, p));
108       f.append("\\\\");
109       lastp = p + 1;
110     }
111     f.append(file.substring(lastp));
112     return f.toString();
113   }
114
115   /**
116    * Answers true if the mouse event has Meta-down (Command key on Mac) or
117    * Ctrl-down (on other o/s). Note this answers _false_ if the Ctrl key is
118    * pressed instead of the Meta/Cmd key on Mac. To test for Ctrl-click on Mac,
119    * you can use e.isPopupTrigger().
120    * 
121    * @param e
122    * @return
123    */
124   public static boolean isControlDown(MouseEvent e)
125   {
126     boolean aMac = isAMac();
127     return isControlDown(e, aMac);
128   }
129
130   /**
131    * Overloaded version of method (to allow unit testing)
132    * 
133    * @param e
134    * @param aMac
135    * @return
136    */
137   protected static boolean isControlDown(MouseEvent e, boolean aMac)
138   {
139     if (aMac)
140     {
141       /*
142        * answer false for right mouse button
143        */
144       if (e.isPopupTrigger())
145       {
146         return false;
147       }
148       return (Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()
149               & e.getModifiers()) != 0;
150       // could we use e.isMetaDown() here?
151     }
152     return e.isControlDown();
153   }
154 }