JAL-3295 Fixed CMD-select of sequences in alignment window
[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.event.MouseEvent;
24
25 /**
26  * System platform information used by Applet and Application
27  * 
28  * @author Jim Procter
29  */
30 public class Platform
31 {
32   private static Boolean isAMac = null, isWindows = null;
33
34   private static Boolean isHeadless = null;
35
36   /**
37    * sorry folks - Macs really are different
38    * 
39    * @return true if we do things in a special way.
40    */
41   public static boolean isAMac()
42   {
43     if (isAMac == null)
44     {
45       isAMac = System.getProperty("os.name").indexOf("Mac") > -1;
46     }
47
48     return isAMac.booleanValue();
49
50   }
51
52   /**
53    * Check if we are on a Microsoft plaform...
54    * 
55    * @return true if we have to cope with another platform variation
56    */
57   public static boolean isWindows()
58   {
59     if (isWindows == null)
60     {
61       isWindows = System.getProperty("os.name").indexOf("Win") > -1;
62     }
63     return isWindows.booleanValue();
64   }
65
66   /**
67    * 
68    * @return true if we are running in non-interactive no UI mode
69    */
70   public static boolean isHeadless()
71   {
72     if (isHeadless == null)
73     {
74       isHeadless = "true".equals(System.getProperty("java.awt.headless"));
75     }
76     return isHeadless;
77   }
78
79   /**
80    * 
81    * @return nominal maximum command line length for this platform
82    */
83   public static int getMaxCommandLineLength()
84   {
85     // TODO: determine nominal limits for most platforms.
86     return 2046; // this is the max length for a windows NT system.
87   }
88
89   /**
90    * Answers the input with every backslash replaced with a double backslash (an
91    * 'escaped' single backslash)
92    * 
93    * @param s
94    * @return
95    */
96   public static String escapeBackslashes(String s)
97   {
98     return s == null ? null : s.replace("\\", "\\\\");
99   }
100
101   /**
102    * Answers true if the mouse event has Meta-down (Command key on Mac) or
103    * Ctrl-down (on other o/s). Note this answers _false_ if the Ctrl key is
104    * pressed instead of the Meta/Cmd key on Mac. To test for Ctrl-click on Mac,
105    * you can use e.isPopupTrigger().
106    * 
107    * @param e
108    * @return
109    */
110   public static boolean isControlDown(MouseEvent e)
111   {
112     boolean aMac = isAMac();
113     return isControlDown(e, aMac);
114   }
115
116   /**
117    * Overloaded version of method (to allow unit testing)
118    * 
119    * @param e
120    * @param aMac
121    * @return
122    */
123   protected static boolean isControlDown(MouseEvent e, boolean aMac)
124   {
125     if (aMac)
126     {
127       /*
128        * answer false for right mouse button
129        */
130       if (e.isPopupTrigger())
131       {
132         return false;
133       }
134       return (jalview.util.ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx() // .getMenuShortcutKeyMaskEx()
135               & jalview.util.ShortcutKeyMaskExWrapper
136                       .getModifiersEx(e)) != 0; // getModifiers()) != 0;
137     }
138     return e.isControlDown();
139   }
140
141   /**
142    * A (case sensitive) file path comparator that ignores the difference between /
143    * and \
144    * 
145    * @param path1
146    * @param path2
147    * @return
148    */
149   public static boolean pathEquals(String path1, String path2)
150   {
151     if (path1 == null)
152     {
153       return path2 == null;
154     }
155     if (path2 == null)
156     {
157       return false;
158     }
159     String p1 = path1.replace('\\', '/');
160     String p2 = path2.replace('\\', '/');
161     return p1.equals(p2);
162   }
163 }